1. 从 JSON-RPC 报错说起:MCP endpoint 改到统一通道时到底发生了什么
如果你最近在折腾 MCP 客户端,大概率见过这类日志:JSON-RPC error -32601: Method not found,或者更让人头大的local proxy failed、OAuth token exchange failed。这些报错看起来五花八门,但根子上往往指向同一件事——MCP 的 endpoint 配置没对齐。
MCP 全称 Model Context Protocol,你可以把它理解成 AI 世界的 USB-C 接口。它让大模型能通过标准化协议去调用外部工具、读取文件、查询数据库。而 MCP 底层跑的就是 JSON-RPC 2.0,一个用 JSON 做远程调用的轻量协议。请求长这样:
{"jsonrpc": "2.0", "method": "tools/list", "params": {}, "id": 1}响应回来就是result或者error。问题在于,MCP 客户端默认会去连本地 stdio 进程或者某个固定的远程 endpoint。当你想把 endpoint 改到一个统一的 API 通道时,协议版本、认证头、路径拼接、模型 ID 这几样只要有一个对不上,JSON-RPC 层就会直接抛错。
这篇要解决的就是这个场景:本地 MCP 调试时,把 endpoint 指向 TaoToken 的统一 API 通道,让 JSON-RPC 请求能正常走通。适合正在用 Cline、Claude Code、Codex 这类工具接 MCP 的开发者,尤其是遇到 401、OAuth 失败、reading choices报错的人。下面我会给出可复制的配置片段、连通性验证命令,以及真实报错的排查路径。
2. TaoToken 前置准备:Base URL、Key 与 Model ID 三件套
在改 MCP endpoint 之前,先把 TaoToken 这边的三样东西准备好。不管你是接 Cline 的 MCP、Claude Code 的 Anthropic 兼容层,还是 Codex 的 auth.json,都绕不开这三个参数。
第一是 Base URL。TaoToken 的 API 入口是:
https://taotoken.net/api注意这里不要加 UTM 参数,API 调用要的是干净地址。官网入口是https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,但配置里只填 API 域名。
第二是 API Key。去控制台创建:
https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite创建后复制那串sk-开头的 Key,只显示一次,丢了就重新生成。
第三是 Model ID。这个容易被忽略。MCP 客户端在发起 JSON-RPC 请求时,有些实现会把模型名塞进params里,如果 Model ID 写错,服务端会返回-32602 无效参数。你可以在模型对话页确认可用模型:
https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite三件套齐了之后,MCP 的 endpoint 配置才有意义。我试过在没确认 Model ID 的情况下直接改 endpoint,结果 JSON-RPC 请求发出去了,回来的却是参数错误,排查了半天才发现是模型名对不上。
注意:MCP 的 stdio 模式和 HTTP 模式配置位置不同。stdio 模式改的是启动命令的环境变量,HTTP 模式改的是客户端里的 endpoint 字段。下面两种都会给。
3. 可复制配置:把 MCP endpoint 指向统一通道
这一节是核心。不同客户端的配置文件路径和字段名不一样,我按最常见的三种给。
3.1 Cline MCP 的 settings 配置
Cline 的 MCP 配置在 VS Code 的settings.json里,或者项目根目录的.cline/mcp.json。如果你用的是 HTTP 传输的 MCP server,配置长这样:
{ "mcpServers": { "taotoken-bridge": { "url": "https://taotoken.net/api/mcp", "headers": { "Authorization": "Bearer sk-你的Key", "Content-Type": "application/json" }, "transport": "http" } } }关键点:url指向 TaoToken 的 API 域名加/mcp路径,Authorization用 Bearer 格式。如果你的 MCP 客户端走的是 stdio,那就要在启动命令里注入环境变量:
{ "mcpServers": { "taotoken-bridge": { "command": "npx", "args": ["-y", "@your/mcp-server"], "env": { "OPENAI_BASE_URL": "https://taotoken.net/api", "OPENAI_API_KEY": "sk-你的Key", "OPENAI_MODEL": "你的ModelID" } } } }3.2 Claude Code 的 Anthropic 兼容配置
Claude Code 走的是 Anthropic 协议,但 TaoToken 提供了兼容层。配置文件在~/.claude/settings.json或者项目级.claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的Key", "ANTHROPIC_MODEL": "你的ModelID" } }如果你用的是 Claude Code 的 MCP 功能,还要在~/.claude.json里加 MCP server 定义:
{ "mcpServers": { "taotoken": { "type": "http", "url": "https://taotoken.net/api/mcp", "headers": { "Authorization": "Bearer sk-你的Key" } } } }3.3 Codex 的 auth.json 配置
Codex 用auth.json存认证信息,路径通常在~/.codex/auth.json:
{ "OPENAI_API_KEY": "sk-你的Key", "OPENAI_BASE_URL": "https://taotoken.net/api", "model": "你的ModelID" }三件套在这里体现得最明显:Base URL、Key、Model ID 一个都不能少。Codex 启动时会读这个文件,如果OPENAI_BASE_URL没改,它默认会去连官方地址,自然就 401 了。
提示:改完配置后一定要重启客户端。MCP 连接是在启动时建立的,热改配置不生效。
4. 验证请求:用 curl 确认 JSON-RPC 链路走通
配置改完别急着在客户端里点,先用 curl 手动发一个 JSON-RPC 请求,确认链路是通的。这一步能帮你把「配置问题」和「客户端问题」分开。
先测最基础的模型列表接口:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "你的ModelID", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 10 }'如果返回里有choices字段,说明 Base URL 和 Key 都没问题。如果返回 401,检查 Key 有没有复制完整;如果返回model not found,检查 Model ID。
再测 MCP 的 JSON-RPC 端点:
curl -X POST https://taotoken.net/api/mcp \ -H "Authorization: Bearer sk-你的Key" \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "tools/list", "params": {}, "id": 1 }'正常返回应该是:
{ "jsonrpc": "2.0", "result": { "tools": [...] }, "id": 1 }如果返回-32601 Method not found,说明 endpoint 路径不对,检查是不是漏了/mcp。如果返回-32700 解析错误,检查 JSON 格式,尤其是引号和逗号。
实测下来,curl 能通但客户端不通的情况,九成是客户端配置里的字段名写错了,比如把url写成了endpoint,或者Authorization头没带上。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
这一节按真实报错来对。你遇到哪个就查哪个。
401 Unauthorized:最常见。原因就三个——Key 没填、Key 填错、Key 过期。检查配置文件里的Authorization头,确认是Bearer sk-xxx格式,中间有空格。如果用的是环境变量,确认变量名和客户端要求的一致,比如 Cline 要OPENAI_API_KEY,Claude Code 要ANTHROPIC_API_KEY。
local proxy failed:这个报错通常出现在 MCP 客户端尝试连本地 stdio 进程但进程没起来的时候。如果你已经把 endpoint 改成 HTTP 模式,检查transport字段是不是还写着stdio。反过来,如果你确实要用 stdio,检查command和args能不能手动跑通。
reading choices 报错:类似error reading choices或者choices field missing。这说明请求发出去了,但返回结构不对。大概率是 Model ID 写错了,服务端返回了错误对象而不是正常的 completion 响应。去模型对话页确认一下可用模型列表。
OAuth token exchange failed:MCP 的远程模式有些实现会走 OAuth。如果你不需要 OAuth,在配置里把认证方式改成 API Key。如果需要,检查Mcp-Session-Id和回调地址。TaoToken 的 API Key 模式不需要 OAuth,直接 Bearer 就行。
-32602 无效参数:JSON-RPC 层报的。检查params里的字段名和类型。比如tools/call的params需要name和arguments,少一个就报这个。
-32603 内部错误:服务端处理异常。先确认 Base URL 和路径对不对,再确认 Model ID 是否可用。如果都对了还报,把请求体完整打印出来对比文档。
排查顺序建议:先 curl 测 Base URL 和 Key,再 curl 测 MCP 端点,最后才在客户端里试。这样能把问题范围一步步缩小。
6. 接入文档与后续动作
配置和排查都走通之后,建议把接入文档存个书签,后面换客户端或者加新 MCP server 时直接对照:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite如果你主要是长期跑编码任务或者 Agent 工作流,Coding Plan 比按量计费更划算:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite验证模型连通性的时候,模型对话页是最快的入口:
https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite最后说个实际经验:MCP 的 endpoint 配置改完之后,第一次请求可能会慢几秒,因为要建立连接和做工具发现。别急着以为配错了,等响应回来再说。如果超过 30 秒还没动静,再去查日志。另外,JSON-RPC 的id字段在批量请求时一定要唯一,重复的id会导致响应匹配错乱,这个坑我在调试批量工具调用时踩过。