ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

一文带大家理解 1 个 MCP Client 可以取代 100 个适配器:从 Function Calling 到 JSON-RPC 的配置骨架

一文带大家理解 1 个 MCP Client 可以取代 100 个适配器:从 Function Calling 到 JSON-RPC 的配置骨架 1. 从 100 个适配器到 1 个 MCP Client我踩过的真实坑如果你正在给 AI Agent 接入外部工具大概率听过这句话在 MCP 出现之前给 AI 接入 100 个工具需要写 100 个适配器有了 MCP你只需要写 1 个 MCP Client就能接入所有 MCP Server。这句话不是营销口号而是我实际重构过两轮工具接入层之后最深的体会。MCPModel Context Protocol本质上是一套基于 JSON-RPC 2.0 的通信协议它规定了 AI 客户端和工具服务端之间“怎么握手、怎么列工具、怎么调工具、怎么回结果”。适合谁适合那些手里已经有 5 个以上工具、每次加新工具都要复制粘贴一堆胶水代码的开发者。传统 Function Calling 模式下每个工具的入参结构、返回结构、错误码都不一样。查天气要location发邮件要to_address和email_body查数据库要sql_command。你写 100 个适配器函数就有 100 套参数映射逻辑、100 套错误处理分支。新增第 101 个工具你还得从头写一遍。这就是典型的 N×M 复杂度N 个模型 × M 个工具组合爆炸。MCP 把这个复杂度压成了 NM。模型侧只需要一个 MCP Client工具侧只需要各自实现一个 MCP Server。Client 不关心工具是查天气还是发邮件它只做三件事建立连接、发送 JSON-RPC 请求、拿回结果。工具名和参数由上层传进来Client 本身是通用的。下面我从配置骨架开始带你走一遍端到端调用测试。2. TaoToken 前置拿到统一接入的 Key 和端点在写 MCP Client 配置之前你需要一个能同时承载模型对话和工具调用的接入点。TaoToken 在这里的角色是提供统一的 API 入口让你不用为每个模型单独维护一套鉴权逻辑。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 注意 API 地址不带 UTM 参数。你需要先去控制台创建一个 API Key。打开 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 登录后在 API Keys 页面点击创建。Key 的格式通常是sk-开头的一串字符复制后先存到环境变量里不要硬编码进配置文件。我试过把 Key 直接写进settings.json然后提交到 Git结果被扫描工具告警这个坑你可以直接跳过。创建完 Key 之后建议先到模型对话页面做一次最小验证确认 Key 和端点都能通。打开 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 选一个你常用的模型发一句“你好”看是否正常返回。这一步能排除掉 80% 的鉴权问题。如果你后续要做长期编码或 Agent 场景可以了解 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合高频调用。拿到 Key 之后把它写进环境变量export TAOTOKEN_API_KEYsk-你的实际Key export TAOTOKEN_BASE_URLhttps://taotoken.net/apiWindows 下用 PowerShell$env:TAOTOKEN_API_KEYsk-你的实际Key $env:TAOTOKEN_BASE_URLhttps://taotoken.net/api环境变量配好之后后面的 MCP Client 配置里就可以用${TAOTOKEN_API_KEY}这种占位符引用避免明文泄露。3. 可复制的 MCP Client 配置骨架MCP Client 的配置核心是两件事一是声明 MCP Server 的启动方式stdio 还是 HTTP二是声明模型侧的接入参数。下面给两份骨架一份是settings.json适合 Claude Desktop、Cline 这类客户端一份是config.toml适合 Codex 风格的工具链。3.1 settings.json 骨架{ mcpServers: { local-tools: { command: python, args: [-m, my_mcp_server], env: { TAOTOKEN_API_KEY: ${TAOTOKEN_API_KEY}, TAOTOKEN_BASE_URL: https://taotoken.net/api } }, remote-tools: { url: https://taotoken.net/api/mcp, headers: { Authorization: Bearer ${TAOTOKEN_API_KEY} } } }, model: { provider: taotoken, base_url: https://taotoken.net/api, api_key: ${TAOTOKEN_API_KEY}, model_name: your-model-name } }这里mcpServers下每个键就是一个 MCP Server 实例。local-tools用 stdio 方式启动本地进程remote-tools用 HTTP 方式连接远程端点。注意env里的占位符会在启动时被替换成真实环境变量值这样 Key 不会出现在配置文件里。3.2 config.toml 骨架[model] provider taotoken base_url https://taotoken.net/api api_key ${TAOTOKEN_API_KEY} model_name your-model-name [mcp_servers.local_tools] command python args [-m, my_mcp_server] [mcp_servers.local_tools.env] TAOTOKEN_API_KEY ${TAOTOKEN_API_KEY} TAOTOKEN_BASE_URL https://taotoken.net/api [mcp_servers.remote_tools] url https://taotoken.net/api/mcp [mcp_servers.remote_tools.headers] Authorization Bearer ${TAOTOKEN_API_KEY}TOML 版本更适合命令行工具链结构更清晰。两份配置的语义完全一致你按自己用的客户端选一份即可。3.3 MCP Client 通用调用逻辑配置只是声明真正干活的是 Client 的调用逻辑。下面这段 Python 骨架展示了 JSON-RPC 请求的构造方式你可以直接嵌进自己的 Agent 循环里import json import subprocess class MCPClient: def __init__(self, command, args): self.proc subprocess.Popen( [command] args, stdinsubprocess.PIPE, stdoutsubprocess.PIPE, textTrue ) self._id 0 def _next_id(self): self._id 1 return self._id def list_tools(self): req { jsonrpc: 2.0, id: self._next_id(), method: tools/list, params: {} } return self._send(req) def call_tool(self, name, arguments): req { jsonrpc: 2.0, id: self._next_id(), method: tools/call, params: { name: name, arguments: arguments } } return self._send(req) def _send(self, req): self.proc.stdin.write(json.dumps(req) \n) self.proc.stdin.flush() line self.proc.stdout.readline() return json.loads(line)关键点tools/list和tools/call是两个固定方法名参数结构也是固定的。不管工具叫get_weather还是tool_100Client 的代码一行都不用改。这就是“1 个 Client 取代 100 个适配器”的工程含义。4. 验证请求从 tools/list 到 tools/call 的端到端测试配置写完之后必须做一次端到端验证。分两步先列工具再调工具。4.1 验证 tools/list启动你的 MCP Client发送tools/list请求。预期返回结构如下{ jsonrpc: 2.0, id: 1, result: { tools: [ { name: get_weather, description: 查询指定城市天气, inputSchema: { type: object, properties: { location: {type: string} }, required: [location] } }, { name: send_email, description: 发送邮件, inputSchema: { type: object, properties: { to: {type: string}, body: {type: string} }, required: [to, body] } } ] } }如果你看到tools数组里有你注册的工具说明 Server 侧握手成功。如果返回空数组检查 Server 是否正确实现了tools/list方法。4.2 验证 tools/call拿到工具名之后发一次实际调用{ jsonrpc: 2.0, id: 2, method: tools/call, params: { name: get_weather, arguments: { location: Beijing } } }预期返回{ jsonrpc: 2.0, id: 2, result: { content: [ { type: text, text: 北京今天晴气温 24 摄氏度 } ] } }看到result.content里有文本返回就说明整条链路通了。你可以把name换成send_email或tool_100Client 代码不需要任何改动。这就是统一 JSON-RPC 通道的价值。4.3 与 Function Calling 的对接MCP Client 拿到tools/list的结果后可以把它转换成模型侧的 Function Calling 声明。以 OpenAI 风格为例def mcp_tools_to_functions(mcp_tools): functions [] for tool in mcp_tools: functions.append({ type: function, function: { name: tool[name], description: tool[description], parameters: tool[inputSchema] } }) return functions模型返回tool_calls时你解析出name和arguments直接丢给MCPClient.call_tool()。整个适配层就这一处转换新增工具时零改动。5. 本篇常见错排查5.1 JSON-RPC 版本号写错报错Invalid Request: missing jsonrpc field。检查你的请求体里是否有jsonrpc: 2.0。这个字段是必须的且值必须是字符串2.0不能是数字2.0。5.2 id 字段重复或缺失报错Duplicate id或响应无法匹配请求。每次请求的id必须唯一建议用自增计数器。如果你并发发送多个请求id 冲突会导致响应错位。5.3 stdio 模式下进程未启动报错BrokenPipeError或FileNotFoundError。检查command和args是否正确Python 模块是否已安装。可以在终端手动执行python -m my_mcp_server看是否能启动。5.4 环境变量未替换报错401 Unauthorized。检查${TAOTOKEN_API_KEY}是否被正确替换。有些客户端不支持占位符语法需要你手动填入真实 Key。建议先用echo $TAOTOKEN_API_KEY确认环境变量存在。5.5 tools/call 参数结构错误报错Invalid params。检查params里是否同时有name和arguments两个字段。arguments必须是对象不能是字符串。如果你的工具需要数组参数确保 JSON Schema 里声明正确。5.6 返回结果解析失败报错KeyError: result。检查响应里是否有error字段。JSON-RPC 错误响应格式是{jsonrpc:2.0,id:x,error:{code:-32601,message:Method not found}}。先判断error是否存在再取result。6. 下一步把 MCP Client 接进你的工作流配置骨架和验证动作都跑通之后你可以把 MCP Client 接进日常开发流。如果你主要做模型对话和工具调用验证直接到模型对话页面测试 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。如果你要长期跑编码 Agent建议用 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite API Keys 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。最后分享一个实用技巧把 MCP Server 的tools/list结果缓存到本地 JSON 文件启动时先读缓存再异步刷新。这样即使某个 Server 启动慢也不会阻塞整个 Agent 的初始化。新增工具时只需要在 Server 侧注册Client 侧下次刷新自动感知真正做到“加工具不改代码”。
返回列表