|
|
Here’s why the latest run blew up and what to change so the **Swarms Agent + MCP** combo finally works:
|
|
|
|
|
|
---
|
|
|
|
|
|
### 1 Fix the import that’s blowing up
|
|
|
|
|
|
`mcp` exposes **ClientSession**, not **Client**.
|
|
|
Change the top‑of‑file imports in **swarms/tools/mcp_integration.py**
|
|
|
|
|
|
```diff
|
|
|
- from mcp import Client as ClientSession
|
|
|
- from fastmcp.client.sse import sse_client # (this package doesn’t exist)
|
|
|
+ from mcp import ClientSession # core SDK class
|
|
|
+ from mcp.client.sse import sse_client # SSE transport helper
|
|
|
```
|
|
|
|
|
|
(See MCP quick‑start that shows `from mcp import ClientSession` citeturn3search8)
|
|
|
|
|
|
---
|
|
|
|
|
|
### 2 Use `typing_extensions.NotRequired` on Python ≤ 3.10
|
|
|
|
|
|
Python 3.11 added `typing.NotRequired`; on 3.10 you must pull it from
|
|
|
`typing_extensions`:
|
|
|
|
|
|
```python
|
|
|
from typing_extensions import NotRequired, TypedDict
|
|
|
```
|
|
|
|
|
|
You already have that line – keep it.
|
|
|
|
|
|
---
|
|
|
|
|
|
### 3 Let your `Agent` actually hold the server list
|
|
|
|
|
|
The attribute‑error you saw (`'Agent' object has no attribute 'mcp_servers'`)
|
|
|
happens because the constructor parameter was commented out.
|
|
|
|
|
|
Add the param and stash it:
|
|
|
|
|
|
```diff
|
|
|
-class Agent:
|
|
|
- def __init__(self,
|
|
|
+class Agent:
|
|
|
+ def __init__(self,
|
|
|
...
|
|
|
- # mcp_servers: List[MCPServerSseParams] = [],
|
|
|
+ mcp_servers: Optional[list[MCPServerSseParams]] = None,
|
|
|
*args, **kwargs):
|
|
|
...
|
|
|
- # self.mcp_servers = mcp_servers
|
|
|
+ self.mcp_servers = mcp_servers or []
|
|
|
```
|
|
|
|
|
|
Now `handle_tool_init()` can safely look at `self.mcp_servers`.
|
|
|
|
|
|
---
|
|
|
|
|
|
### 4 Example “smoke test” with the Browserbase MCP server
|
|
|
|
|
|
```python
|
|
|
# examples/mcp_example/mcp_client.py
|
|
|
from swarms.structs.agent import Agent
|
|
|
from swarms.prompts.agent_prompts import MATH_AGENT_PROMPT
|
|
|
from swarms.tools.mcp_integration import MCPServerSseParams
|
|
|
|
|
|
browserbase = MCPServerSseParams(
|
|
|
url="http://127.0.0.1:6274", # running Browserbase MCP server
|
|
|
headers={"Content-Type": "application/json"},
|
|
|
)
|
|
|
|
|
|
math_bot = Agent(
|
|
|
agent_name="Math‑MCP‑Bot",
|
|
|
agent_description="Performs arithmetic via MCP tools",
|
|
|
system_prompt=MATH_AGENT_PROMPT,
|
|
|
max_loops=1,
|
|
|
mcp_servers=[browserbase], # <-- now recognised
|
|
|
output_type="final",
|
|
|
)
|
|
|
|
|
|
print(math_bot.run("Use the add tool to add 2 and 2"))
|
|
|
```
|
|
|
|
|
|
Make sure you’ve installed the SDK:
|
|
|
|
|
|
```bash
|
|
|
pip install "mcp>=0.3.0" typing_extensions
|
|
|
```
|
|
|
|
|
|
and that the Browserbase server from the README snippet is running (or any
|
|
|
other MCP SSE server).
|
|
|
|
|
|
---
|
|
|
|
|
|
### 5 What to do *if* you really want “fastmcp”
|
|
|
|
|
|
There isn’t a published `fastmcp` Python package today (hence the
|
|
|
`ModuleNotFoundError`). Stick with the official `mcp` SDK until/if the
|
|
|
fast‑variant is released. When it lands the only changes you’d make are the
|
|
|
two import lines in **mcp_integration.py**; the rest of the Swarms integration
|
|
|
stays identical.
|
|
|
|
|
|
---
|
|
|
|
|
|
Apply those three code edits, reinstall dependencies, and your smoke test
|
|
|
should run without import errors. If you hit the next snag, drop the new
|
|
|
traceback and we’ll keep tightening the bolts. |