LangChain开箱即用MCP服务器适配器测试
本项目演示了 @langchain/mcp-adapters 倾倒充电器 自动 工具来自 serveur MCP开箱即用 (mcp_weather_server)无需在langchain中手动声明。
🎯 目标
创建一个LangChain代理,使用开箱即用的天气MCP服务器回答有关不同城市天气和空气质量的问题 自动数据优化 以减少响应时间。
🏗️ 建筑
┌─────────────────┐
│ User Query │
└────────┬────────┘
│
▼
┌─────────────────────────────────────┐
│ LangChain Agent (GPT-4) │
│ - createAgent() API v1.0.0 │
│ - Orchestre les outils │
│ - Sélection intelligente │
└────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Tool Wrapper (Optimisation) │
│ - Extrait données essentielles │
│ - Réduit taille des réponses │
│ - ~90% de réduction │
└────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ @langchain/mcp-adapters v1.0.0 │
│ MultiServerMCPClient │
│ - Charge automatiquement │
│ tous les outils MCP │
│ - getTools() discovery │
└────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ MCP Server (out-of-the-box) │
│ - uvx mcp_weather_server │
│ - Expose les outils météo │
│ - Qualité de l'air, météo │
└─────────────────────────────────────┘📊 序列图
sequenceDiagram
participant User as 👤 Utilisateur
participant Client as 📱 Client LangChain
participant Agent as 🤖 Agent LangChain
(ReactAgent)
participant Wrapper as 🔧 Tool Wrapper
(Optimisation)
participant MCPClient as 📦 MCP Client
(MultiServerMCPClient)
participant MCPServer as 🌐 MCP Server
(mcp_weather_server)
participant LLM as 🧠 LLM
(OpenAI GPT-4)
participant API as 🌍 APIs Externes
(Open-Meteo)
Note over Client,MCPServer: Phase 1: Initialisation
Client->>MCPClient: initialize()
MCPClient->>MCPServer: ListTools request (stdio)
MCPServer-->>MCPClient: Tools list (8 outils)
MCPClient-->>Client: getTools() → [get_air_quality, ...]
Client->>Wrapper: wrapToolWithDataOptimization()
pour chaque outil
Wrapper-->>Client: Outils wrappés avec proxy
Client->>Agent: createAgent(model, tools, systemPrompt)
Agent-->>Client: Agent initialisé
Note over User,API: Phase 2: Traitement d'une question
User->>Client: "Quelle est la qualité de l'air à Paris ?"
Client->>Agent: agent.invoke({messages: [HumanMessage]})
Note over Agent,LLM: Étape 1: Décision d'utiliser un outil
Agent->>LLM: Appel 1: Analyser la question
(~1193 tokens input)
LLM-->>Agent: ToolCall: get_air_quality(city="Paris")
(~17 tokens output, ~1.4s)
Note over Agent,API: Étape 2: Appel de l'outil MCP
Agent->>Wrapper: invoke("get_air_quality", {city: "Paris"})
Wrapper->>MCPClient: Appel outil original
MCPClient->>MCPServer: CallTool request (stdio)
get_air_quality
MCPServer->>API: GET /geo/1.0/direct?name=Paris
API-->>MCPServer: Coordonnées (lat, lon)
MCPServer->>API: GET /air-quality?lat=X&lon=Y&hourly=...
API-->>MCPServer: Données qualité de l'air
(~17868 caractères)
MCPServer-->>MCPClient: Réponse complète avec full_data
MCPClient-->>Wrapper: Réponse brute (~17868 caractères)
Note over Wrapper: Étape 3: Optimisation des données
Wrapper->>Wrapper: extractEssentialData()
Parse JSON, extrait current_air_quality
Supprime full_data (données horaires)
Wrapper-->>Agent: Réponse optimisée (~1850 caractères)
Réduction: -89.6% (~500ms)
Note over Agent,LLM: Étape 4: Génération de la réponse finale
Agent->>LLM: Appel 2: Générer réponse
(~1200 tokens input au lieu de ~7631)
Prompt optimisé grâce au wrapper
LLM-->>Agent: Réponse finale formatée
(~436 tokens output, ~2-3s au lieu de ~17s)
Agent-->>Client: Messages complets avec réponse
Client-->>User: "La qualité de l'air à Paris est bonne..."
Note over Client: Phase 3: Analyse des performances
Client->>Client: Analyse des timings
Estimation LLM améliorée
Logs détaillés avec timestamps✨ 主要特点
🚀 自动数据优化
该项目包括 工具包装器 在将MCP响应传递给LLM之前自动优化MCP响应:
- 减少约90% 响应大小(从约16k到约2k个字符)
- 基本数据的提取 :仅限警卫
current_air_quality,删除full_data(小时数据) - 减少LLM时间 :第二次LLM呼叫约17s至约2-3s
- 透明 :自动适用于所有MCP工具
📊 使用时间戳进行详细日志记录
该项目包括一个完整的日志系统,带有ISO时间戳,用于跟踪每个步骤:
- 精确时间戳 :ISO格式(
2025-11-10T12:32:44.406Z) - 每阶段日志 :初始化、LLM调用、MCP调用、优化
- 性能指标 :执行时间、数据大小、减少
- 改进的估计 :基于提示大小的LLM时间的精确计算
⏱️ 改进的LLM时间估计
该项目使用 高级估算公式 基于GPT-4的实际性能:
- 提示小(\10000个代币) :~20s+1.5ms/额外令牌
这允许有一个 精确分布 在每个阶段花费的时间。
📋 先决条件
- Node.js 18+
- Python与
uv已安装(用于uvx) - CléAPI OpenAI(GPT-4)
- MCP天气服务器已安装并可通过
uvx mcp_weather_server
🚀 安装
- 克隆或创建项目:
cd langchain-out-of-the-box-mcp-server-adapters-test- 安装依赖项:
npm install- 创建文件
.env从env.example:
cp env.example .env- 编辑文件
.env并添加OpenAI API密钥:
OPENAI_API_KEY=votre_cle_openai
OPENAI_MODEL=gpt-4- 检查是否安装了MCP天气服务器:
uvx mcp_weather_server --help如果没有,请根据MCP天气服务器文档进行安装。
💻 使用
开发模式(带自动加载)
npm run dev直接启动客户端(无需编译)
npm run client备注 :Ce脚本使用 tsx 直接运行TypeScript文件,无需编译,开发速度更快。编译项目
npm run build运行编译的项目
npm start启动后,您可以在终端中提问。打字 exit 哦 quit 倒酒。
📁 项目结构
langchain-out-of-the-box-mcp-server-adapters-test/
├── src/
│ ├── index.ts # Point d'entrée principal (CLI interactive)
│ ├── client.ts # Client LangChain avec optimisation des données
│ │ # - Wrapper d'outils pour optimisation
│ │ # - Logging détaillé avec timestamps
│ │ # - Estimation améliorée des temps LLM
│ └── 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
└── README.md🔧 它是如何工作的
1.伺服MCP开箱即用
本项目使用MCP天气服务器 开箱即用 (mcp_weather_server) :
- 通过安装
uvx mcp_weather_server - 通过stdio自动作为子进程启动
- 展示天气和空气质量工具
- 无需额外配置
2.客户端MCP配置
MCP服务器配置在 client.ts :
const mcpServerConfig = {
weatherServer: {
transport: "stdio" as const,
command: "uvx",
args: ["mcp_weather_server"],
},
};
const mcpClient = new MultiServerMCPClient(mcpServerConfig);3.自动加载和工具优化
工具自动加载并包装以进行优化:
// Charger les outils depuis le serveur MCP
const rawTools = await this.mcpClient.getTools();
// Wrapper chaque outil pour optimiser les réponses
const tools = rawTools.map(tool => wrapToolWithDataOptimization(tool));包装器拦截响应 并且在将基本数据传递给LLM之前仅提取基本数据。
4.数据优化
功能 extractEssentialData() :
- 检测空气质量工具 (
get_air_quality,get_air_quality_details) - 解析JSON 在答复中
- 仅提取
current_air_quality并删除full_data(完整的小时数据) - 缩小尺寸 约90%(从约16k到约2k个字符)
转换示例:
// Avant optimisation (~17868 caractères)
{
"city": "Paris",
"current_air_quality": {...},
"full_data": {
"hourly": {
"time": ["2025-11-10T00:00", ...120 heures...],
"pm10": [15.8, 14.5, ...120 valeurs...],
"pm2_5": [12.4, 11.2, ...120 valeurs...],
...
}
}
}
// Après optimisation (~1850 caractères)
{
"city": "Paris",
"current_air_quality": {...},
"summary": {
"timezone": "GMT",
"elevation": 44.0
}
}5.与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 et optimisés
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
📊 详细日志
该项目包括一个完整的日志记录系统,带有ISO时间戳,用于跟踪所有调用:
日志前缀
[MCP-CLIENT]:MCP客户端(工具加载)[TOOL-WRAPPER]:工具包装器(调用、优化)[DATA-OPTIMIZATION]:数据优化(提取、减少)[LANGCHAIN-AGENT]:Langchain代理(调用、响应)[LLM-ESTIMATION]:LLM时间估计[TIMINGS-DETAIL]:详细阶段分析[TOTAL]:最终时间分配[USER]:用户输入[ERROR]:错误
日志示例
[2025-11-10T12:32:44.406Z] [TOOL-WRAPPER] 🔧 Appel de l'outil "get_air_quality"
[2025-11-10T12:32:44.406Z] [TOOL-WRAPPER] 📤 Arguments: {"city":"Paris"}
[2025-11-10T12:32:44.407Z] [TOOL-WRAPPER] 📡 Envoi de la requête au serveur MCP...
[2025-11-10T12:32:44.902Z] [TOOL-WRAPPER] ✅ Réponse MCP reçue en 495ms (17868 caractères)
[2025-11-10T12:32:44.902Z] [TOOL-WRAPPER] 🔄 Début de l'optimisation des données...
[2025-11-10T12:32:44.903Z] [DATA-OPTIMIZATION] 🔍 Analyse de la réponse pour get_air_quality (17868 caractères)
[2025-11-10T12:32:44.903Z] [DATA-OPTIMIZATION] 🎯 Détection d'un outil de qualité de l'air...
[2025-11-11T12:32:44.904Z] [DATA-OPTIMIZATION] 📦 JSON trouvé: 17800 caractères
[2025-11-10T12:32:44.905Z] [DATA-OPTIMIZATION] ✅ JSON parsé avec succès
[2025-11-10T12:32:44.906Z] [DATA-OPTIMIZATION] ✂️ Réponse optimisée: 17868 → 1850 caractères (-89.6%) en 3ms
[2025-11-10T12:32:44.906Z] [TOOL-WRAPPER] ⚡ Optimisation terminée en 4ms
[2025-11-10T12:32:44.906Z] [TOOL-WRAPPER] 📊 Réduction: 17868 → 1850 caractères (-89.6%)
[2025-11-10T12:32:44.906Z] [TOOL-WRAPPER] ⏱️ Temps total outil: 500ms (MCP: 495ms, Optimisation: 4ms)
[2025-11-10T12:32:45.000Z] [LLM-ESTIMATION] 📊 Appel LLM 1: 1193 prompt + 17 completion tokens → ~1860ms estimé
[2025-11-10T12:32:47.000Z] [LLM-ESTIMATION] 📊 Appel LLM 2: 1200 prompt + 436 completion tokens → ~2150ms estimé
[2025-11-10T12:32:47.500Z] [TOTAL] ⏱️ Temps total pour la question: 5650ms
[2025-11-10T12:32:47.500Z] [TOTAL] 📊 Répartition détaillée (estimations améliorées):
[2025-11-10T12:32:47.500Z] [TOTAL] - Appels LLM (OpenAI): ~4010ms (71%)
[2025-11-10T12:32:47.500Z] [TOTAL] • LLM Call 1: 1193 prompt + 17 completion tokens → ~1860ms
[2025-11-10T12:32:47.500Z] [TOTAL] • LLM Call 2: 1200 prompt + 436 completion tokens → ~2150ms
[2025-11-10T12:32:47.500Z] [TOTAL] - Appels MCP (outils): ~500ms (9%)
[2025-11-10T12:32:47.500Z] [TOTAL] - Overhead (sérialisation, etc.): ~1140ms (20%)日志内容
每个日志包括:
- 时间戳ISO :格式
2025-11-10T12:32:44.406Z为了精确的可追溯性 - 请求有效载荷 :发送完整数据(JSON格式)
- 响应有效载荷 :接收到的完整数据(JSON格式)
- 性能指标 :执行时间、数据大小、减少
- 温度估算 :基于提示大小的精确计算
🎯 功能
空气质量
代理人可以获得城市的空气质量:
- “巴黎的空气质量怎么样?”
- “给我切尔斯的空气质量”
- “伦敦的空气质量”
天气
代理人可以获得天气信息:
- “巴黎的天气”
- “里昂的天气怎么样?”
复杂请求
代理可以使用适当的工具回答复杂问题:
- “比较巴黎和里昂的空气质量”
- “巴黎的天气和空气质量”
⚡ 性能优化
减少响应时间
通过自动数据优化:
- 前卫优化 约19-23秒(约7631个代币的大提示)
- 优化后 约4-6秒(提示减少至约1200个代币)
- 改进 :总时间减少约75%
减少提词器的大小
- MCP的原始响应 :约17868个字符(~7631个代币)
- 优化响应 :约1850个字符(约1200个代币)
- 减少 :尺寸减少约89.6%
精确的时间估计
系统使用高级估计公式精确计算每个阶段花费的时间:
- 估计LLM :基于提示的实际大小(步骤公式)
- MCP估算 :基于工具调用次数(每次调用约500ms)
- 开销 :按其余部分计算(序列化、反序列化等)
🐛 故障排除
错误“缺少必需的环境变量”
检查您的文件 .env 包含所需的OpenAI API密钥。
错误“找不到模型”
确保您的OpenAI密钥可以访问GPT-4。你可以使用 gpt-4-turbo-preview 哦 gpt-3.5-turbo 作为替代方案。
TypeScript编译错误
确保已安装所有依赖项 npm install.
MCP服务器未启动
确保 uvx 可用,并且 mcp_weather_server 已安装。您可以使用以下方法进行测试:
uvx mcp_weather_server --help错误“未定义包子路径'./agents'”
此错误表示您使用的是旧版本的LangChain。确保将LangChain 1.0.0与新API一起使用 createAgent().
日志显示优化不起作用
检查日志 [DATA-OPTIMIZATION] 查看JSON是否正确解析。如果您看到“响应中未找到JSON”,则MCP响应的格式可能已更改。
📚 文件和资源
资源
🔍 与MCP自定义服务器的差异
本项目使用 serveur MCP开箱即用 而不是自定义服务器:
开箱即用MCP服务器(本项目)
✅ 优势 :
- 无需开发/维护MCP服务器
- 安装简单,通过
uvx - 可能的自动更新
- 功能齐全(天气、空气质量)
- 自动优化 减少响应时间的数据
MCP自定义服务器
如果您需要特定的功能,您可以创建自己的MCP服务器,但本项目的重点是使用优化的现有服务器。
🎓 学习和优化
本项目展示了几种重要技术:
- MCP工具的自动加载 :无需手动声明的动态发现
- 数据优化 :在进入LLM之前,回复大小减少约90%
- 详细日志记录 :使用时间戳进行完全可追溯性,以识别瓶颈
- 精确估计 :基于GPT-4实际性能的实际运行时间计算
- 包装模式 :使用代理JavaScript拦截和转换响应
📄 许可证
国际协调委员会
🤝 贡献
欢迎捐款!不要犹豫:
- 分叉项目
- 为您的功能创建分支
- 提交您的更改
- 向分支推
- 打开拉取请求
