Commit
·
ac752cb
1
Parent(s):
d11732b
fix(deps): Sync requirements.txt with pyproject.toml (P0 MCP fix)
Browse filesROOT CAUSE: HuggingFace Spaces crashed with:
"module 'mcp.types' has no attribute 'ToolUseContent'"
requirements.txt was missing mcp>=1.23.0 pin. Gradio's [mcp] extra
pulled an older MCP version lacking ToolUseContent (added in 2025-11-25 spec).
Changes:
- Add mcp>=1.23.0 to requirements.txt (fixes crash)
- Sync ALL deps with pyproject.toml:
- Add beautifulsoup4>=4.12 (was missing)
- Fix huggingface-hub>=0.24.0 (was 0.20.0)
- Add upper bound to agent-framework-core
- Add sync header with date to requirements.txt
- Document P0 bug in docs/bugs/P0_MCP_TOOLUSECONTENT_MISSING.md
- Update ACTIVE_BUGS.md with resolution
- Update system_registry.md (mark removed tools from PR #130)
- docs/architecture/system_registry.md +5 -5
- docs/bugs/ACTIVE_BUGS.md +1 -0
- docs/bugs/P0_MCP_TOOLUSECONTENT_MISSING.md +88 -0
- requirements.txt +28 -18
docs/architecture/system_registry.md
CHANGED
|
@@ -60,8 +60,8 @@ These are the `@ai_function` decorated functions that agents can invoke. The fra
|
|
| 60 |
| `search_clinical_trials` | `src/agents/tools.py:81` | Searches ClinicalTrials.gov for clinical studies |
|
| 61 |
| `search_preprints` | `src/agents/tools.py:121` | Searches Europe PMC for preprints and papers |
|
| 62 |
| `get_bibliography` | `src/agents/tools.py:161` | Returns collected references for final report |
|
| 63 |
-
|
|
| 64 |
-
|
|
| 65 |
|
| 66 |
### 3.2 Tool Classes (Internal Wrappers)
|
| 67 |
|
|
@@ -72,10 +72,10 @@ These are **internal implementation wrappers** used by the AI Functions. They ar
|
|
| 72 |
| `PubMedTool` | `src/tools/pubmed.py` | `search_pubmed` |
|
| 73 |
| `ClinicalTrialsTool` | `src/tools/clinicaltrials.py` | `search_clinical_trials` |
|
| 74 |
| `EuropePMCTool` | `src/tools/europepmc.py` | `search_preprints` |
|
| 75 |
-
| `
|
| 76 |
-
| `OpenAlexTool` | `src/tools/openalex.py` | (Reserved for future use) |
|
| 77 |
-
| `WebSearchTool` | `src/tools/web_search.py` | `search_web` |
|
| 78 |
| `SearchHandler` | `src/tools/search_handler.py` | Orchestrates parallel searches |
|
|
|
|
|
|
|
| 79 |
|
| 80 |
---
|
| 81 |
|
|
|
|
| 60 |
| `search_clinical_trials` | `src/agents/tools.py:81` | Searches ClinicalTrials.gov for clinical studies |
|
| 61 |
| `search_preprints` | `src/agents/tools.py:121` | Searches Europe PMC for preprints and papers |
|
| 62 |
| `get_bibliography` | `src/agents/tools.py:161` | Returns collected references for final report |
|
| 63 |
+
| ~~`execute_python_code`~~ | ~~`src/agents/code_executor_agent.py`~~ | REMOVED in PR #130 (Modal deleted) |
|
| 64 |
+
| ~~`search_web`~~ | ~~`src/agents/retrieval_agent.py`~~ | REMOVED in PR #130 (unused) |
|
| 65 |
|
| 66 |
### 3.2 Tool Classes (Internal Wrappers)
|
| 67 |
|
|
|
|
| 72 |
| `PubMedTool` | `src/tools/pubmed.py` | `search_pubmed` |
|
| 73 |
| `ClinicalTrialsTool` | `src/tools/clinicaltrials.py` | `search_clinical_trials` |
|
| 74 |
| `EuropePMCTool` | `src/tools/europepmc.py` | `search_preprints` |
|
| 75 |
+
| `OpenAlexTool` | `src/tools/openalex.py` | OpenAlex search (used in SearchHandler) |
|
|
|
|
|
|
|
| 76 |
| `SearchHandler` | `src/tools/search_handler.py` | Orchestrates parallel searches |
|
| 77 |
+
| ~~`ModalCodeExecutor`~~ | ~~`src/tools/code_execution.py`~~ | REMOVED in PR #130 |
|
| 78 |
+
| ~~`WebSearchTool`~~ | ~~`src/tools/web_search.py`~~ | REMOVED in PR #130 |
|
| 79 |
|
| 80 |
---
|
| 81 |
|
docs/bugs/ACTIVE_BUGS.md
CHANGED
|
@@ -25,6 +25,7 @@
|
|
| 25 |
All resolved bugs have been moved to `docs/bugs/archive/`. Summary:
|
| 26 |
|
| 27 |
### P0 Bugs (All FIXED)
|
|
|
|
| 28 |
- **P0 Repr Bug** - FIXED in PR #117 via Accumulator Pattern
|
| 29 |
- **P0 AIFunction Not JSON Serializable** - FIXED, full tool support for HuggingFace
|
| 30 |
- **P0 HuggingFace Tool Calling Broken** - FIXED, history serialization + Accumulator Pattern
|
|
|
|
| 25 |
All resolved bugs have been moved to `docs/bugs/archive/`. Summary:
|
| 26 |
|
| 27 |
### P0 Bugs (All FIXED)
|
| 28 |
+
- **P0 MCP ToolUseContent Missing** - FIXED, requirements.txt missing `mcp>=1.23.0` pin (HF Spaces crashed)
|
| 29 |
- **P0 Repr Bug** - FIXED in PR #117 via Accumulator Pattern
|
| 30 |
- **P0 AIFunction Not JSON Serializable** - FIXED, full tool support for HuggingFace
|
| 31 |
- **P0 HuggingFace Tool Calling Broken** - FIXED, history serialization + Accumulator Pattern
|
docs/bugs/P0_MCP_TOOLUSECONTENT_MISSING.md
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# P0 Bug: mcp.types.ToolUseContent AttributeError on HuggingFace Spaces
|
| 2 |
+
|
| 3 |
+
**Status**: FIXED
|
| 4 |
+
**Severity**: P0 (App completely broken)
|
| 5 |
+
**Discovered**: 2025-12-04
|
| 6 |
+
**Fixed**: 2025-12-04 (PR TBD)
|
| 7 |
+
|
| 8 |
+
---
|
| 9 |
+
|
| 10 |
+
## Symptom
|
| 11 |
+
|
| 12 |
+
HuggingFace Spaces deployment crashes with:
|
| 13 |
+
|
| 14 |
+
```
|
| 15 |
+
module 'mcp.types' has no attribute 'ToolUseContent'
|
| 16 |
+
```
|
| 17 |
+
|
| 18 |
+
The app fails to start entirely. No functionality works.
|
| 19 |
+
|
| 20 |
+
---
|
| 21 |
+
|
| 22 |
+
## Root Cause
|
| 23 |
+
|
| 24 |
+
**Dependency version mismatch between `pyproject.toml` and `requirements.txt`.**
|
| 25 |
+
|
| 26 |
+
| File | MCP Pin | Result |
|
| 27 |
+
|------|---------|--------|
|
| 28 |
+
| `pyproject.toml` | `mcp>=1.23.0` | Correct - has `ToolUseContent` |
|
| 29 |
+
| `requirements.txt` | (missing) | Pulls old MCP via `gradio[mcp]` transitive dep |
|
| 30 |
+
|
| 31 |
+
**Background:**
|
| 32 |
+
- `ToolUseContent` was added in MCP spec **2025-11-25** via **SEP-1577 (Sampling With Tools)**
|
| 33 |
+
- Our pyproject.toml correctly pins `mcp>=1.23.0` (for security fix GHSA-9h52-p55h-vw2f)
|
| 34 |
+
- HuggingFace Spaces uses `requirements.txt`, NOT `pyproject.toml`
|
| 35 |
+
- `gradio[mcp]>=6.0.0` pulls in MCP as transitive dependency
|
| 36 |
+
- Without explicit pin, Gradio was pulling an older MCP version lacking `ToolUseContent`
|
| 37 |
+
|
| 38 |
+
---
|
| 39 |
+
|
| 40 |
+
## Fix
|
| 41 |
+
|
| 42 |
+
Added explicit MCP pin to `requirements.txt`:
|
| 43 |
+
|
| 44 |
+
```diff
|
| 45 |
+
# UI (Gradio with MCP server support - 6.0 required for css in launch())
|
| 46 |
+
gradio[mcp]>=6.0.0
|
| 47 |
+
+
|
| 48 |
+
+# Security: Pin mcp to fix GHSA-9h52-p55h-vw2f and ensure ToolUseContent exists
|
| 49 |
+
+mcp>=1.23.0
|
| 50 |
+
```
|
| 51 |
+
|
| 52 |
+
Also synced ALL dependencies between `pyproject.toml` and `requirements.txt` to prevent future drift.
|
| 53 |
+
|
| 54 |
+
---
|
| 55 |
+
|
| 56 |
+
## Changes Made
|
| 57 |
+
|
| 58 |
+
**Files modified:**
|
| 59 |
+
- `requirements.txt` - Full sync with `pyproject.toml`:
|
| 60 |
+
- Added `mcp>=1.23.0` (root cause fix)
|
| 61 |
+
- Added `beautifulsoup4>=4.12` (was missing)
|
| 62 |
+
- Fixed `huggingface-hub>=0.24.0` (was 0.20.0)
|
| 63 |
+
- Added upper bound to `agent-framework-core>=1.0.0b251120,<2.0.0`
|
| 64 |
+
- Added sync header comment with date
|
| 65 |
+
|
| 66 |
+
---
|
| 67 |
+
|
| 68 |
+
## Prevention
|
| 69 |
+
|
| 70 |
+
1. **Sync header**: `requirements.txt` now has "Last synced: YYYY-MM-DD" comment
|
| 71 |
+
2. **CI check**: Consider adding a pre-commit hook to validate requirements.txt matches pyproject.toml
|
| 72 |
+
|
| 73 |
+
---
|
| 74 |
+
|
| 75 |
+
## References
|
| 76 |
+
|
| 77 |
+
- [MCP Python SDK Releases](https://github.com/modelcontextprotocol/python-sdk/releases)
|
| 78 |
+
- [MCP Spec 2025-11-25 - Sampling With Tools](https://modelcontextprotocol.io/specification/2025-11-25/client/sampling)
|
| 79 |
+
- [GHSA-9h52-p55h-vw2f](https://github.com/advisories/GHSA-9h52-p55h-vw2f) - MCP security advisory
|
| 80 |
+
|
| 81 |
+
---
|
| 82 |
+
|
| 83 |
+
## Verification
|
| 84 |
+
|
| 85 |
+
After fix:
|
| 86 |
+
1. Deploy to HuggingFace Spaces
|
| 87 |
+
2. Verify app starts without errors
|
| 88 |
+
3. Verify MCP server responds at `/gradio_api/mcp/`
|
requirements.txt
CHANGED
|
@@ -1,4 +1,11 @@
|
|
| 1 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
pydantic>=2.7
|
| 3 |
pydantic-settings>=2.2
|
| 4 |
pydantic-ai>=0.0.16
|
|
@@ -7,38 +14,41 @@ pydantic-ai>=0.0.16
|
|
| 7 |
openai>=1.0.0
|
| 8 |
chromadb>=0.4.22
|
| 9 |
sentence-transformers>=2.2.2
|
| 10 |
-
huggingface-hub>=0.20.0
|
| 11 |
-
|
| 12 |
-
# Multi-agent orchestration (Advanced mode)
|
| 13 |
-
agent-framework-core>=1.0.0b251120
|
| 14 |
-
|
| 15 |
-
# LangGraph dependencies (SPEC-07/08)
|
| 16 |
-
langgraph>=0.2.50,<1.0
|
| 17 |
-
langchain>=0.3.9,<1.0
|
| 18 |
-
langchain-core>=0.3.21,<1.0
|
| 19 |
-
langchain-huggingface>=0.1.2,<1.0
|
| 20 |
-
langgraph-checkpoint-sqlite>=3.0.0,<4.0
|
| 21 |
-
|
| 22 |
-
# Web search
|
| 23 |
-
duckduckgo-search>=5.0
|
| 24 |
|
| 25 |
# HTTP & Parsing
|
| 26 |
httpx>=0.27
|
| 27 |
beautifulsoup4>=4.12
|
| 28 |
xmltodict>=0.13
|
|
|
|
| 29 |
|
| 30 |
-
# UI (Gradio with MCP server support)
|
| 31 |
gradio[mcp]>=6.0.0
|
| 32 |
|
|
|
|
|
|
|
|
|
|
| 33 |
# Utils
|
| 34 |
python-dotenv>=1.0
|
| 35 |
tenacity>=8.2
|
| 36 |
structlog>=24.1
|
| 37 |
requests>=2.32.5
|
| 38 |
limits>=3.0
|
| 39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
|
| 41 |
-
#
|
| 42 |
llama-index>=0.11.0
|
| 43 |
llama-index-llms-openai
|
| 44 |
llama-index-embeddings-openai
|
|
|
|
| 1 |
+
# ============================================================
|
| 2 |
+
# requirements.txt - HuggingFace Spaces Dependencies
|
| 3 |
+
# ============================================================
|
| 4 |
+
# This file MUST stay in sync with pyproject.toml dependencies.
|
| 5 |
+
# Last synced: 2025-12-04
|
| 6 |
+
# ============================================================
|
| 7 |
+
|
| 8 |
+
# Core
|
| 9 |
pydantic>=2.7
|
| 10 |
pydantic-settings>=2.2
|
| 11 |
pydantic-ai>=0.0.16
|
|
|
|
| 14 |
openai>=1.0.0
|
| 15 |
chromadb>=0.4.22
|
| 16 |
sentence-transformers>=2.2.2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
# HTTP & Parsing
|
| 19 |
httpx>=0.27
|
| 20 |
beautifulsoup4>=4.12
|
| 21 |
xmltodict>=0.13
|
| 22 |
+
huggingface-hub>=0.24.0
|
| 23 |
|
| 24 |
+
# UI (Gradio with MCP server support - 6.0 required for css in launch())
|
| 25 |
gradio[mcp]>=6.0.0
|
| 26 |
|
| 27 |
+
# Security: Pin mcp to fix GHSA-9h52-p55h-vw2f and ensure ToolUseContent exists
|
| 28 |
+
mcp>=1.23.0
|
| 29 |
+
|
| 30 |
# Utils
|
| 31 |
python-dotenv>=1.0
|
| 32 |
tenacity>=8.2
|
| 33 |
structlog>=24.1
|
| 34 |
requests>=2.32.5
|
| 35 |
limits>=3.0
|
| 36 |
+
duckduckgo-search>=5.0
|
| 37 |
+
|
| 38 |
+
# LangGraph deps - upper bounds prevent breaking changes from major versions
|
| 39 |
+
langgraph>=0.2.50,<1.0
|
| 40 |
+
langchain>=0.3.9,<1.0
|
| 41 |
+
langchain-core>=0.3.21,<1.0
|
| 42 |
+
langchain-huggingface>=0.1.2,<1.0
|
| 43 |
+
langgraph-checkpoint-sqlite>=3.0.0,<4.0
|
| 44 |
+
|
| 45 |
+
# Security: Pin urllib3 to fix GHSA-48p4-8xcf-vxj5 and GHSA-pq67-6m6q-mj2v
|
| 46 |
+
urllib3>=2.5.0
|
| 47 |
+
|
| 48 |
+
# Multi-agent orchestration (Advanced mode) - from [magentic] optional
|
| 49 |
+
agent-framework-core>=1.0.0b251120,<2.0.0
|
| 50 |
|
| 51 |
+
# LlamaIndex RAG support - from [rag] optional
|
| 52 |
llama-index>=0.11.0
|
| 53 |
llama-index-llms-openai
|
| 54 |
llama-index-embeddings-openai
|