Skip to content

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

bash
pnpm install @modelcontextprotocol/sdk
js
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 McpServerregisterTool / registerResourceconnect 启动。

  • Tool — 做事情(查询、操作)
  • Resource — 返回静态数据(文档、配置),可注入到 SystemMessage

在 LangChain 里调用 MCP Server

bash
pnpm install @langchain/mcp-adapters
js
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 可以直接用,不用每个都自己写。