LangChain自定义MCP服务器适配器测试
本项目演示了 @langchain/mcp-adapters 倾倒充电器 自动 工具来自 自定义MCP服务器 无需在LangChain中手动声明。
🎯 与先前方法的差异
❌ 以前的方法(手动声明)
- 为每个MCP工具手动创建LangChain包装器
- LangChain代码中每个工具的显式声明
- 添加新工具时需要维护
- 每个工具的单独文件(
mcpSearchTool.ts,mcpWeatherTool.ts)
✅ 新方法(自动加载)
- 自动加载 来自MCP服务器的所有工具
- 无需手动声明
- 工具通过MCP协议动态发现
- 添加新工具=无需更改langchain代码
- 利用率
@langchain/mcp-adaptersv1.0.0与langchain v1.0.0
🏗️ 建筑
概述
┌─────────────────┐
│ User Query │
└────────┬────────┘
│
▼
┌─────────────────────────────────────┐
│ LangChain Agent (GPT-4) │
│ - createAgent() API v1.0.0 │
│ - Orchestre les outils │
│ - Sélection intelligente │
└────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ @langchain/mcp-adapters v1.0.0 │
│ MultiServerMCPClient │
│ - Charge automatiquement │
│ tous les outils MCP │
│ - getTools() discovery │
└────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ MCP Server (custom, stdio) │
│ - Serveur MCP personnalisé │
│ - Expose les outils │
│ - search, weather │
└────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ External APIs │
│ - Brave Search │
│ - OpenWeatherMap │
└─────────────────────────────────────┘序列图
sequenceDiagram
participant User as 👤 User
participant Agent as 🤖 LangChain Agent
participant MCPClient as 📦 MCP Client
(@langchain/mcp-adapters)
participant MCPServer as 🔧 MCP Server
(Custom)
participant LLM as 🧠 LLM
(OpenAI GPT-4)
participant API as 🌐 External APIs
(Brave, OpenWeather)
Note over Agent,MCPClient: Initialisation
Agent->>MCPClient: initialize()
MCPClient->>MCPServer: ListTools request
MCPServer-->>MCPClient: Tools list (search, weather)
MCPClient->>Agent: getTools() → [search, weather]
Agent->>LLM: createAgent(model, tools, systemPrompt)
LLM-->>Agent: Agent ready
Note over User,API: Exécution d'une requête
User->>Agent: Question: "Météo à Paris"
Agent->>LLM: invoke({messages: [HumanMessage]})
Note over LLM: Analyse la question et décide d'utiliser l'outil weather
LLM-->>Agent: ToolCall: weather(city="Paris")
Agent->>MCPClient: Call tool: weather
MCPClient->>MCPServer: CallTool request (weather, {city: "Paris"})
Note over MCPServer,API: Exécution de l'outil weather
MCPServer->>API: GET /geo/1.0/direct?q=Paris
API-->>MCPServer: Coordinates (lat, lon)
MCPServer->>API: GET /data/2.5/forecast?lat=X&lon=Y
API-->>MCPServer: Weather data
MCPServer-->>MCPClient: Response: Weather text
MCPClient-->>Agent: Tool result
Note over Agent,LLM: L'agent traite le résultat et génère la réponse finale
Agent->>LLM: invoke({messages: [HumanMessage, ToolMessage, ...]})
LLM-->>Agent: Final response message
Agent-->>User: Réponse: "Météo actuelle à Paris..."带日志的详细流
sequenceDiagram
participant User as 👤 User
participant Client as 📱 LangChain Client
participant MCPClient as 📦 MCP Client
participant MCPServer as 🔧 MCP Server
participant LLM as 🧠 LLM
participant API as 🌐 External APIs
User->>Client: ask("Météo à Paris")
Note right of Client: [USER] 📥 Question reçue
[LANGCHAIN-AGENT] 📤 Request payload
Client->>LLM: agent.invoke({messages})
Note right of LLM: Analyse et décide d'utiliser weather
LLM-->>Client: ToolCall: weather(city="Paris")
Note left of Client: [LANGCHAIN-AGENT] 🔧 Appel d'outil
Client->>MCPClient: Call tool: weather
Note right of MCPClient: [MCP-CLIENT] 📤 Tool call
MCPClient->>MCPServer: CallTool request
Note right of MCPServer: [MCP-SERVER] 📥 Appel d'outil reçu
[MCP-SERVER] 📤 Request payload
[TOOL:weather] 🌤️ Recherche météo
MCPServer->>API: GET /geo/1.0/direct?q=Paris
Note right of API: [TOOL:weather] 📤 API Request payload (geo)
API-->>MCPServer: Coordinates
Note left of API: [TOOL:weather] 📥 API Response payload (geo)
MCPServer->>API: GET /data/2.5/forecast?lat=X&lon=Y
Note right of API: [TOOL:weather] 📤 API Request payload (weather)
API-->>MCPServer: Weather data
Note left of API: [TOOL:weather] 📥 API Response payload (weather)
MCPServer-->>MCPClient: Response with weather text
Note left of MCPServer: [MCP-SERVER] 📥 Response payload
[TOOL:weather] ⏱️ Temps d'exécution
MCPClient-->>Client: Tool result
Note left of MCPClient: [MCP-CLIENT] 📥 Tool response
Client->>LLM: invoke({messages: [..., ToolMessage]})
Note right of LLM: Génère la réponse finale
LLM-->>Client: Final response
Note left of LLM: [LANGCHAIN-AGENT] ✅ Agent terminé
[LANGCHAIN-AGENT] 📥 Response payload
Client-->>User: Réponse finale
Note left of Client: [LANGCHAIN-AGENT] 📤 Réponse finale extraite📋 先决条件
- Node.js 18+
- API密钥:
- OpenAI(GPT-4) - 勇敢的搜索 - 开放天气地图
🚀 安装
- Cloner le存储库:
git clone
cd langchain-custom-mcp-server-adapters-test- 安装依赖项:
npm install- 创建文件
.env从env.example:
cp env.example .env- 编辑文件
.env并添加API密钥:
OPENAI_API_KEY=votre_cle_openai
BRAVE_API_KEY=votre_cle_brave
OPENWEATHER_API_KEY=votre_cle_openweather
OPENAI_MODEL=gpt-4💻 使用
开发模式(带自动加载)
npm run dev直接启动客户端(无需编译)
npm run client备注 :Ce脚本使用 tsx 直接运行TypeScript文件,无需编译,开发速度更快。单独启动MCP服务器(用于测试)
npm run mcp-server编译项目
npm run build运行编译的项目
npm start启动后,您可以在终端中提问。打字 exit 哦 quit 倒酒。
📁 项目结构
langchain-custom-mcp-server-adapters-test/
├── src/
│ ├── index.ts # Point d'entrée principal
│ ├── client.ts # Client LangChain avec chargement automatique des outils MCP
│ ├── mcpServer.ts # Serveur MCP custom (expose les outils search et weather)
│ ├── mcpServerRunner.ts # Runner pour le serveur MCP en mode stdio
│ └── config.ts # Gestion de la configuration
├── dist/ # Fichiers compilés
├── .env # Variables d'environnement (à créer)
├── env.example # Exemple de configuration
├── package.json
├── tsconfig.json
├── ADAPTATION.md # Documentation de l'adaptation avec Context7
└── README.md🔧 它是如何工作的
1.自定义MCP服务器
本项目使用 自定义MCP服务器 (不是开箱即用的服务器):
- 实施于
src/mcpServer.ts使用SDK@modelcontextprotocol/sdk - 手动设置工具
search和weather - 实现业务逻辑(外部API调用)
- 本地启动VIA
mcpServerRunner.tsSTDIO模式
Pourquoi习俗?
- 完全控制工具及其逻辑
- 与您的特定API直接集成
- 响应和格式的个性化
- 调试的详细日志
2.客户端MCP配置
MCP服务器配置在 client.ts :
const mcpServerConfig = {
searchWeatherServer: {
transport: "stdio" as const,
command: "npx",
args: ["-y", "tsx", join(__dirname, "mcpServerRunner.ts")],
},
};
const mcpClient = new MultiServerMCPClient(mcpServerConfig);3.自动工具加载
工具通过自动加载 getTools() :
// Charge TOUS les outils de TOUS les serveurs MCP configurés
const tools = await this.mcpClient.getTools();无需手动声明! 工具通过MCP协议动态发现。
4.与LangChain 1.0.0一起使用
该项目使用新的LangChain API 1.0.0 createAgent() :
import { createAgent, ReactAgent } from "langchain";
// Créer l'agent avec la nouvelle API
this.agent = createAgent({
model: this.model,
tools, // Outils chargés automatiquement
systemPrompt,
});
// Utiliser l'agent
const result = await this.agent.invoke({
messages: [new HumanMessage(question)],
});备注 :LangChain 1.0.0使用 createAgent() 而不是 createOpenAIFunctionsAgent() 和 AgentExecutor de la版本0.x。
📦 使用的版本
本项目使用langchain软件包的1.0.0版本进行兼容性:
@langchain/core:^1.0.0@langchain/mcp-adapters:^1.0.0@langchain/openai:^1.0.0langchain:^1.0.0@modelcontextprotocol/sdk:^1.0.0
📊 详细日志
该项目包括跟踪所有调用的完整日志:
日志前缀
[MCP-CLIENT]:MCP客户端(工具加载)[MCP-SERVER]MCP服务器(请求/响应)[TOOL:nom]:个人工具(搜索、天气)[LANGCHAIN-AGENT]:LangChain代理商[USER]:用户输入[ERROR]:错误
日志内容
每个日志包括:
- 请求有效载荷 :发送完整数据(JSON格式)
- 响应有效载荷 :接收到的完整数据(JSON格式)
- 性能指标 :执行时间、数据大小
- API调用的详细信息 :来自外部API的请求/响应
日志示例
[MCP-CLIENT] 🔄 Chargement des outils depuis le serveur MCP...
[MCP-CLIENT] 📤 Request payload: getTools()
[MCP-SERVER] 📥 Requête ListTools reçue
[MCP-SERVER] 📤 Request payload: {"method":"tools/list",...}
[MCP-SERVER] 📥 Response payload: {"tools":[...]}
[MCP-CLIENT] ✅ 2 outils chargés depuis le serveur MCP
[LANGCHAIN-AGENT] 🔄 Invocation de l'agent avec le message utilisateur...
[LANGCHAIN-AGENT] 📤 Request payload (invoke): {"messages":[...]}
[TOOL:search] 🔍 Recherche Brave Search pour: "TypeScript"
[TOOL:search] 📤 API Request payload: {"url":"...","params":{...}}
[TOOL:search] 📥 API Response payload: {"resultsCount":5,...}
[LANGCHAIN-AGENT] ✅ Agent a terminé en 1234ms🎯 功能
搜索网络(勇敢搜索)
代理可以在web上搜索信息:
- “你知道TypeScript吗?”
- “2024年人工智能新闻研究”
天气
代理可以获得当前天气和预测:
- “巴黎的天气”
- “里昂的天气怎么样?”
- “天气75001”
复杂请求
代理可以组合多种工具来回答复杂问题:
- “2024年比较React和Vue.js”(将使用搜索)
- “巴黎天气和本周天气事件搜索”(使用天气+搜索)
🔄 添加新工具
要向MCP服务器添加新工具:
- 将工具添加到
mcpServer.ts:
- 将定义添加到 ListToolsRequestSchema - 将处理程序添加到 CallToolRequestSchema
- 这是吹牛! 该工具将自动加载并在LangChain中可用,无需更改客户端代码。
📝 使用示例
> Météo à Paris
🤔 Traitement en cours...
────────────────────────────────────────────────────────────
[USER] 📥 Question reçue: "Météo à Paris"
[LANGCHAIN-AGENT] 🔄 Invocation de l'agent avec le message utilisateur...
[TOOL:weather] 🌤️ Recherche météo pour: "Paris"
[TOOL:weather] 📤 API Request payload (geo): {...}
[TOOL:weather] 📥 API Response payload (geo): {...}
[LANGCHAIN-AGENT] ✅ Agent a terminé en 1234ms
────────────────────────────────────────────────────────────
💬 Réponse:
**Météo actuelle à Paris**
🌡️ Température: 15°C (ressentie: 14°C)
☁️ Conditions: nuageux
💧 Humidité: 65%
📊 Pression: 1013 hPa
💨 Vent: 12.5 km/h NE
**Prévisions (prochaines 24h):**
- lun. 14:00: 16°C, nuageux
- lun. 17:00: 17°C, partiellement nuageux
...🐛 故障排除
错误“缺少必需的环境变量”
检查您的文件 .env 包含所有必需的API密钥。
错误“找不到模型”
确保您的OpenAI密钥可以访问GPT-4。你可以使用 gpt-4-turbo-preview 哦 gpt-3.5-turbo 作为替代方案。
TypeScript编译错误
确保已安装所有依赖项 npm install.
MCP服务器未启动
确保 tsx 可用。该项目使用 npx -y tsx 启动服务器,它应该自动工作。
错误“未定义包子路径'./agents'”
此错误表示您使用的是旧版本的LangChain。确保将LangChain 1.0.0与新API一起使用 createAgent().
📚 文件和资源
情境利用7
本项目使用Context7 MCP开发,以获取以下文档: @langchain/mcp-adapters :
- 库ID的解析 :
mcp_context7_resolve-library-id("langchain-mcp-adapters")结果: /langchain-ai/langchain-mcp-adapters
- 恢复文档 :
mcp_context7_get-library-docs(
"/langchain-ai/langchain-mcp-adapters",
"MultiServerMCPClient getTools usage examples"
)看 ADAPTATION.md 有关项目调整的更多详细信息。
资源
🔍 与开箱即用MCP服务器的区别
本项目使用 MCP自定义服务器 而不是预先存在的服务器。原因如下:
MCP自定义服务器(本项目)
✅ 优势 :
- 完全控制工具及其逻辑
- 与您的特定API直接集成
- 响应和格式的个性化
- 调试的详细日志
- 易于使用新工具扩展
伺服MCP开箱即用
您还可以使用预先存在的MCP服务器:
const mcpServerConfig = {
// Serveur MCP pré-existant (exemple)
math: {
transport: "stdio" as const,
command: "npx",
args: ["-y", "@modelcontextprotocol/server-math"],
},
// Votre serveur custom
searchWeatherServer: {
transport: "stdio" as const,
command: "npx",
args: ["-y", "tsx", mcpServerPath],
},
};📄 许可证
国际协调委员会
🤝 贡献
欢迎捐款!不要犹豫:
- 分叉项目
- 为您的功能创建分支
- 提交您的更改
- 向分支推
- 打开拉取请求
