MCP-可跨进程调用的Tool
# MCP:可跨进程调用的 Tool
之前写的 Tool 都是同一个进程里的函数,没法跨进程调用。比如 Python 写的 Agent 想调用 Node.js 写的 Tool 就不行。
MCP(Model Context Protocol)就是解决这个问题 — 让 Tool 可以跨进程调用。
- 本地跨进程 → 用 stdio 通信
- 远程跨进程 → 用 http 通信
MCP 由 Anthropic 发起,2025 年交给 Linux 基金会维护,现在是中立通用的行业标准协议。
# 本质
MCP 还是 Tool,只不过加了一层协议让它能跨进程。在 LangChain 里通过 MCP Client 拿到的也是普通的 Tool 对象,绑定到模型的方式完全一样。
# 写一个 MCP Server
pnpm install @modelcontextprotocol/sdk
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
const server = new McpServer({ name: 'my-server', version: '1.0.0' });
// 注册 Tool(动态操作)
server.registerTool('query_user', {
description: '查询用户信息',
inputSchema: {
userId: z.string().describe('用户 ID'),
},
}, async ({ userId }) => {
return {
content: [{ type: 'text', text: `用户 ${userId} 的信息:...` }],
};
});
// 注册 Resource(静态数据)
server.registerResource('使用指南', 'docs://guide', {
description: 'MCP Server 使用文档',
mimeType: 'text/plain',
}, async () => {
return {
contents: [{ uri: 'docs://guide', mimeType: 'text/plain', text: '文档内容...' }],
};
});
// stdio 方式启动
const transport = new StdioServerTransport();
await server.connect(transport);
结构很清晰:new McpServer → registerTool / registerResource → connect 启动。
- Tool — 做事情(查询、操作)
- Resource — 返回静态数据(文档、配置),可注入到 SystemMessage
# 在 LangChain 里调用 MCP Server
pnpm install @langchain/mcp-adapters
import { MultiServerMCPClient } from '@langchain/mcp-adapters';
// 启动 MCP Server 子进程,用 stdio 通信
const mcpClient = new MultiServerMCPClient({
mcpServers: {
'my-mcp-server': {
command: 'node',
args: ['./src/my-mcp-server.mjs'],
},
},
});
// 拿到的就是普通 Tool,和之前一样绑定到模型
const tools = await mcpClient.getTools();
const modelWithTools = model.bindTools(tools);
// 后面的调用循环和之前完全一样
// ...
// 用完记得关闭
await mcpClient.close();
# 在 Cursor 里配置
Cursor 本身就是 MCP Client,在配置里添加 MCP Server 即可直接使用。
注意:Tool 的启用/禁用状态颜色不明显,没调用时检查下是不是被关掉了。
# 什么时候用 MCP
- 需要跨进程/跨语言 → 用 MCP,比如 Cursor、其他 Agent 想调用你的 Tool
- 同一个进程内 → 直接写普通 Tool,少了进程通信的开销
现在有很多现成的 MCP Server 可以直接用,不用每个都自己写。
编辑 (opens new window)
上次更新: 2026/06/09, 01:51:57