🤖 DeepMCPAgent
Model-agnostic LangChain/LangGraph agents powered entirely by MCP tools over HTTP/SSE.
Discover MCP tools dynamically. Bring your own LangChain model. Build production-ready agents—fast.
📚 Documentation • 🛠 Issues
✨ 为什么选择DeepMCPAgent?
- 🔌 零手动工具接线 --从MCP服务器(HTTP/SSE)动态发现工具
- 🌐 欢迎外部API --连接到远程MCP服务器(使用headers/auth)
- 🧠 模型无关 --传递任何LangChain聊天模型实例(OpenAI、Anthropic、Ollama、Groq、local等)
- ⚡ DeepAgent(可选) --如果安装了,您将获得一个深度代理循环;否则,LangGraph ReAct回退将十分稳健
- 🛠️ 键入工具参数 --JSON模式→ 派丹蒂克→ LangChain
BaseTool(键入、验证的呼叫) - 🧪 优质酒吧 --mypy(严格)、ruff、pytest、GitHub操作、文档
首先是MCP。 代理不应该硬编码工具——他们应该 发现 和 呼叫 他们。DeepMCPAgent构建了这座桥。
______________________________________________________________________
🚀 安装
从以下位置安装 PyPI:
pip install "deepmcpagent[deep]"这将安装DeepMCPAgent DeepAgent支持(推荐) 以获得最佳代理循环。 其他可选附加功能:
dev→ 打字、测试docs→ MkDocs+材料+mkdocstringexamples→ 捆绑示例使用的依赖关系
# install with deepagents + dev tooling
pip install "deepmcpagent[deep,dev]"⚠️ 如果你正在使用 Z shell,记得引用额外内容:
pip install "deepmcpagent[deep,dev]"______________________________________________________________________
🚀 快速启动
1) 启动示例MCP服务器(HTTP)
python examples/servers/math_server.py这为MCP端点提供服务: http://127.0.0.1:8000/mcp
2) 运行示例代理(带有花哨的控制台输出)
python examples/use_agent.py您将看到:
______________________________________________________________________
🧑💻 自带模型(BYOM)
DeepMCPAgent允许您通过 任何LangChain聊天模型实例 (或者,如果您愿意,可以提供提供商id字符串 init_chat_model):
import asyncio
from deepmcpagent import HTTPServerSpec, build_deep_agent
# choose your model:
# from langchain_openai import ChatOpenAI
# model = ChatOpenAI(model="gpt-4.1")
# from langchain_anthropic import ChatAnthropic
# model = ChatAnthropic(model="claude-3-5-sonnet-latest")
# from langchain_community.chat_models import ChatOllama
# model = ChatOllama(model="llama3.1")
async def main():
servers = {
"math": HTTPServerSpec(
url="http://127.0.0.1:8000/mcp",
transport="http", # or "sse"
# headers={"Authorization": "Bearer "},
),
}
graph, _ = await build_deep_agent(
servers=servers,
model=model,
instructions="Use MCP tools precisely."
)
out = await graph.ainvoke({"messages":[{"role":"user","content":"add 21 and 21 with tools"}]})
print(out)
asyncio.run(main())提示:如果你通过了 字符串 喜欢"openai:gpt-4.1",我们会打电话给LangChain的init_chat_model()为您(它将读取env-vars,如OPENAI_API_KEY).通过a 模型实例 让你完全控制。
______________________________________________________________________
🖥️ CLI(不需要Python)
# list tools from one or more HTTP servers
deepmcpagent list-tools \
--http name=math url=http://127.0.0.1:8000/mcp transport=http \
--model-id "openai:gpt-4.1"
# interactive agent chat (HTTP/SSE servers only)
deepmcpagent run \
--http name=math url=http://127.0.0.1:8000/mcp transport=http \
--model-id "openai:gpt-4.1"CLI接受 重复的--http阻碍;添加header.X=Y身份验证配对: ``--http name=ext url=https://api.example.com/mcp transport=http header.Authorization="Bearer TOKEN"``
______________________________________________________________________
🧩 建筑(一览)
┌────────────────┐ list_tools / call_tool ┌─────────────────────────┐
│ LangChain/LLM │ ──────────────────────────────────▶ │ FastMCP Client (HTTP/SSE)│
│ (your model) │ └───────────┬──────────────┘
└──────┬─────────┘ tools (LC BaseTool) │
│ │
▼ ▼
LangGraph Agent One or many MCP servers (remote APIs)
(or DeepAgents) e.g., math, github, search, ...HTTPServerSpec(...)→ FastMCP客户端 (单客户端,多服务器)- 工具发现 → JSON模式→ 派丹蒂克→ LangChain
BaseTool - 代理循环 → DeepAgent(如果已安装)或LangGraph ReAct回退
______________________________________________________________________
完整架构和代理流
1) 高层架构(模块和数据流)
flowchart LR
%% Groupings
subgraph User["👤 User / App"]
Q["Prompt / Task"]
CLI["CLI (Typer)"]
PY["Python API"]
end
subgraph Agent["🤖 Agent Runtime"]
DIR["build_deep_agent()"]
PROMPT["prompt.py\n(DEFAULT_SYSTEM_PROMPT)"]
subgraph AGRT["Agent Graph"]
DA["DeepAgents loop\n(if installed)"]
REACT["LangGraph ReAct\n(fallback)"]
end
LLM["LangChain Model\n(instance or init_chat_model(provider-id))"]
TOOLS["LangChain Tools\n(BaseTool[])"]
end
subgraph MCP["🧰 Tooling Layer (MCP)"]
LOADER["MCPToolLoader\n(JSON-Schema ➜ Pydantic ➜ BaseTool)"]
TOOLWRAP["_FastMCPTool\n(async _arun → client.call_tool)"]
end
subgraph FMCP["🌐 FastMCP Client"]
CFG["servers_to_mcp_config()\n(mcpServers dict)"]
MULTI["FastMCPMulti\n(fastmcp.Client)"]
end
subgraph SRV["🛠 MCP Servers (HTTP/SSE)"]
S1["Server A\n(e.g., math)"]
S2["Server B\n(e.g., search)"]
S3["Server C\n(e.g., github)"]
end
%% Edges
Q -->|query| CLI
Q -->|query| PY
CLI --> DIR
PY --> DIR
DIR --> PROMPT
DIR --> LLM
DIR --> LOADER
DIR --> AGRT
LOADER --> MULTI
CFG --> MULTI
MULTI -->|list_tools| SRV
LOADER --> TOOLS
TOOLS --> AGRT
AGRT |messages| LLM
AGRT -->|tool calls| TOOLWRAP
TOOLWRAP --> MULTI
MULTI -->|call_tool| SRV
SRV -->|tool result| MULTI --> TOOLWRAP --> AGRT -->|final answer| CLI
AGRT -->|final answer| PY______________________________________________________________________
2) 运行时序列(端到端工具调用)
sequenceDiagram
autonumber
participant U as User
participant CLI as CLI/Python
participant Builder as build_deep_agent()
participant Loader as MCPToolLoader
participant Graph as Agent Graph (DeepAgents or ReAct)
participant LLM as LangChain Model
participant Tool as _FastMCPTool
participant FMCP as FastMCP Client
participant S as MCP Server (HTTP/SSE)
U->>CLI: Enter prompt
CLI->>Builder: build_deep_agent(servers, model, instructions?)
Builder->>Loader: get_all_tools()
Loader->>FMCP: list_tools()
FMCP->>S: HTTP(S)/SSE list_tools
S-->>FMCP: tools + JSON-Schema
FMCP-->>Loader: tool specs
Loader-->>Builder: BaseTool[]
Builder-->>CLI: (Graph, Loader)
U->>Graph: ainvoke({messages:[user prompt]})
Graph->>LLM: Reason over system + messages + tool descriptions
LLM-->>Graph: Tool call (e.g., add(a=3,b=5))
Graph->>Tool: _arun(a=3,b=5)
Tool->>FMCP: call_tool("add", {a:3,b:5})
FMCP->>S: POST /mcp tools.call("add", {...})
S-->>FMCP: result { data: 8 }
FMCP-->>Tool: result
Tool-->>Graph: ToolMessage(content=8)
Graph->>LLM: Continue with observations
LLM-->>Graph: Final response "(3 + 5) * 7 = 56"
Graph-->>CLI: messages (incl. final LLM answer)______________________________________________________________________
3) 代理控制循环(规划和行动)
stateDiagram-v2
[*] --> AcquireTools
AcquireTools: Discover MCP tools via FastMCP\n(JSON-Schema ➜ Pydantic ➜ BaseTool)
AcquireTools --> Plan
Plan: LLM plans next step\n(uses system prompt + tool descriptions)
Plan --> CallTool: if tool needed
Plan --> Respond: if direct answer sufficient
CallTool: _FastMCPTool._arun\n→ client.call_tool(name, args)
CallTool --> Observe: receive tool result
Observe: Parse result payload (data/text/content)
Observe --> Decide
Decide: More tools needed?
Decide --> Plan: yes
Decide --> Respond: no
Respond: LLM crafts final message
Respond --> [*]______________________________________________________________________
4) 代码结构(类型和关系)
classDiagram
class StdioServerSpec {
+command: str
+args: List[str]
+env: Dict[str,str]
+cwd: Optional[str]
+keep_alive: bool
}
class HTTPServerSpec {
+url: str
+transport: Literal["http","streamable-http","sse"]
+headers: Dict[str,str]
+auth: Optional[str]
}
class FastMCPMulti {
-_client: fastmcp.Client
+client(): Client
}
class MCPToolLoader {
-_multi: FastMCPMulti
+get_all_tools(): List[BaseTool]
+list_tool_info(): List[ToolInfo]
}
class _FastMCPTool {
+name: str
+description: str
+args_schema: Type[BaseModel]
-_tool_name: str
-_client: Any
+_arun(**kwargs) async
}
class ToolInfo {
+server_guess: str
+name: str
+description: str
+input_schema: Dict[str,Any]
}
class build_deep_agent {
+servers: Mapping[str,ServerSpec]
+model: ModelLike
+instructions?: str
+returns: (graph, loader)
}
StdioServerSpec ServerSpec : uses servers_to_mcp_config()
MCPToolLoader o--> FastMCPMulti
MCPToolLoader --> _FastMCPTool : creates
_FastMCPTool ..> BaseTool
build_deep_agent --> MCPToolLoader : discovery
build_deep_agent --> _FastMCPTool : tools for agent______________________________________________________________________
5) 部署/集成视图(集群和边界)
flowchart TD
subgraph App["Your App / Service"]
UI["CLI / API / Notebook"]
Code["deepmcpagent (Python pkg)\n- config.py\n- clients.py\n- tools.py\n- agent.py\n- prompt.py"]
UI --> Code
end
subgraph Cloud["LLM Provider(s)"]
P1["OpenAI / Anthropic / Groq / Ollama..."]
end
subgraph Net["Network"]
direction LR
FMCP["FastMCP Client\n(HTTP/SSE)"]
FMCP ---|mcpServers| Code
end
subgraph Servers["MCP Servers"]
direction LR
A["Service A (HTTP)\n/path: /mcp"]
B["Service B (SSE)\n/path: /mcp"]
C["Service C (HTTP)\n/path: /mcp"]
end
Code -->|init_chat_model or model instance| P1
Code --> FMCP
FMCP --> A
FMCP --> B
FMCP --> C______________________________________________________________________
6) 错误处理和可观察性(工具错误和重试)
flowchart TD
Start([Tool Call]) --> Try{"client.call_tool(name,args)"}
Try -- ok --> Parse["Extract data/text/content/result"]
Parse --> Return[Return ToolMessage to Agent]
Try -- raises --> Err["Tool/Transport Error"]
Err --> Wrap["ToolMessage(status=error, content=trace)"]
Wrap --> Agent["Agent observes error\nand may retry / alternate tool"]______________________________________________________________________
这些图表反映了当前的实施情况: - 型号为必填项 (字符串提供程序id或LangChain模型实例)。 - 仅限MCP工具,在运行时通过以下方式发现 FastMCP (HTTP://SSE)。 - 代理循环偏好 DeepAgent 如果已安装;否则 LangGraph重新激活. - 工具通过以下方式键入 JSON模式➜ 派丹蒂克➜ LangChain基础工具. - 花哨的控制台输出显示 发现的工具, 电话, 结果,以及 最终答案.
______________________________________________________________________
🧪 发展
# install dev tooling
pip install -e ".[dev]"
# lint & type-check
ruff check .
mypy
# run tests
pytest -q______________________________________________________________________
🛡️ 安全与隐私
- 你的钥匙,你的模型 --我们不强制供应商;传递任何LangChain模型。
- 使用 http头 在……里面
HTTPServerSpec将承载/Autho令牌传递到服务器。
______________________________________________________________________
🧯 故障排除
- PEP 668:外部管理环境(macOS+Homebrew)
使用virtualenv:
python3 -m venv .venv
source .venv/bin/activate- 404连接时未找到
确保您的服务器使用路径(例如。, /mcp)您的客户端URL包含它。
- 工具调用失败/属性错误
确保您使用的是最新版本;我们的工具包装器使用 PrivateAttr 对于客户端状态。
- 代币数量高
对于工具调用模型来说,这很正常。使用较小的模型进行开发。
______________________________________________________________________
📄 许可证
Apache-2.0--参见 LICENSE.
______________________________________________________________________
