为什么需要自研 MCP Client?
虽然市面上有 Claude Desktop、Cursor 等优秀客户端,但在企业级内部系统(如内部客服平台、自动化运维控制台、专属 IDE 插件)中,我们往往需要直接在自有业务流中驱动现成的海量开源 MCP 工具。
1. 核心流程
MCP 客户端的通信遵循严格的标准状态机:
- 启动子进程(或建立 SSE 连接);
- 初始化握手 (initialize):协商协议版本与双方 capabilities;
- 工具发现 (tools/list):获取可用工具的 JSON Schema;
- 意图决策与工具执行 (tools/call):将模型选择的工具参数传递给服务端并捕获结果。
2. 最小化客户端代码示例
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
async function main() {
const transport = new StdioClientTransport({
command: "npx",
args: ["-y", "@modelcontextprotocol/server-filesystem", "./data"],
});
const client = new Client({ name: "my-custom-app", version: "1.0.0" }, { capabilities: {} });
await client.connect(transport);
// 获取工具
const tools = await client.listTools();
console.log("可用工具数量:", tools.tools.length);
// 执行读取文件
const result = await client.callTool({
name: "read_file",
arguments: { path: "./data/config.json" },
});
console.log("工具执行结果:", result);
await client.close();
}
main().catch(console.error);
掌握了 Client 端编写,你就能将开源社区的数百个现成 MCP Server 自由拼装到自己的任何产品中。