1. 先搞清楚 MCP 和 Skill 到底谁管什么
很多人第一次接触 AI Agent 开发,会把 MCP 和 Skill 当成一回事,或者觉得装了 MCP 就万事大吉。我一开始也这么想,直到本地调试时发现工具明明连上了,Agent 却把一堆原始 JSON 直接甩给我,才意识到这两个东西根本不在一个层面上。
MCP,全称 Model Context Protocol,模型上下文协议,解决的是「连不连得上」的问题。你可以把它理解成 AI 世界的 USB-C 接口:以前每接一个外部工具就要写一套对接代码,接十个工具写十套,接一百个写一百套;有了 MCP,只要工具侧实现了这个协议,Agent 侧零改动就能发现并调用。它管的是管道,是数据能不能从外部流进 Agent 的上下文。
Skill 解决的是「用得好不好」的问题。管道通了,水能流过来,但 Agent 不知道怎么用水。Skill 就是那本说明书,把领域知识、调用顺序、参数约束、结果处理方式打包成可复用的模块。比如你问「帮我找西湖附近含早餐的酒店」,只有 MCP 的 Agent 可能把几千条原始数据全扔给你;装了对应 Skill 的 Agent 才知道要先确认城市和日期,再调搜索接口,拿到结果后按距离和价格排序,最后挑出三四条真正能用的。
这两个东西的协作关系,用一句话概括:MCP 负责把外部能力接进来,Skill 负责告诉 Agent 什么时候、按什么顺序、用什么参数去调这些能力。缺了 MCP,Agent 够不着外部数据;缺了 Skill,数据够着了但不会用。
对开发者来说,本地调试场景下最需要搞明白的是三件事:MCP 服务端怎么配、Skill 怎么注册、怎么通过日志和调用链确认两者真的串起来了。这篇就围绕这三件事展开,每一步都给可复制的配置和验证动作,你跟着做就能在自己机器上跑通一条完整的 Agent 管道。
适合谁看:正在做 Agent 本地调试的后端或全栈开发者,已经用过 Claude Code、Cursor、Cline 这类工具,想搞清楚 MCP 和 Skill 底层怎么协作的人。如果你还没配过任何 MCP 服务端,也没关系,下面的步骤从零开始。
2. 前置准备:TaoToken 接入与本地环境确认
在配 MCP 和 Skill 之前,得先有一个能跑 Agent 的模型入口。本地调试最怕的就是模型侧不稳定,一会儿 401 一会儿超时,根本分不清是 MCP 配错了还是模型没连上。我实测下来,用 TaoToken 做统一入口比较省事,它兼容 OpenAI 和 Anthropic 两套协议,MCP 客户端和 Skill 运行时都能直接对接。
先拿 Key。打开 https://taotoken.net/api-keys ,登录后创建一个 API Key,复制出来存到环境变量里,别硬编码进配置文件。我习惯用.env或者 shell 的 export,这样切换环境的时候不用改代码。
export TAOTOKEN_API_KEY="sk-你的key" export TAOTOKEN_BASE_URL="https://taotoken.net/api"注意 Base URL 这里不要带 UTM 参数,API 调用路径就是纯https://taotoken.net/api。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册和文档都在那边,但代码里配置的 endpoint 用上面那个。
环境确认这一步别跳过。先确认本地 Node 版本,MCP 服务端大多数是 Node 写的,低于 18 会出各种奇怪问题:
node -v # 期望输出 v18.x 或更高 npm -v然后确认你要用的 MCP 客户端版本。Claude Code、Cline、Cursor 对 MCP 的支持程度不一样,Claude Code 原生支持 stdio 和 SSE 两种传输,Cline 通过 MCP 配置文件加载,Cursor 在 settings 里配。这篇以 Claude Code 和 Cline 为主,因为这两个本地调试最方便,日志也好看。
如果你用的是 Claude Code,先确认版本:
claude --version低于 1.0 的建议升级,早期版本对 MCP 的日志输出不完整,排查问题很痛苦。升级命令按官方文档走,这里不展开。
模型侧先单独验证一次,确保 Key 和 Base URL 没问题:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 16 }'返回里有choices字段就说明模型侧通了。这一步很重要,后面 MCP 报错的时候你能快速排除是不是模型入口的问题。如果这里就 401,先检查 Key 有没有复制全、有没有多余空格,再检查 Base URL 是不是写成了带路径的版本。
环境变量配好后,建议写进~/.zshrc或~/.bashrc,不然每开一个新终端都要重新 export。我踩过的坑就是调试到一半换了个终端窗口,Key 没了,MCP 一直报认证失败,查了半小时才发现是环境变量没继承。
3. 可复制的 MCP 服务端配置与 Skill 注册
这一节是核心,给两份可直接复制的配置:一份 MCP 服务端配置,一份 Skill 注册示例。两份都配好,Agent 才能既连得上又用得好。
3.1 MCP 服务端配置
MCP 服务端有两种常见传输方式:stdio 和 SSE。本地调试优先用 stdio,进程直接由客户端拉起,日志好抓,不用管端口占用。下面是一个标准的 MCP 服务端配置,放在 Claude Code 的配置文件里。
Claude Code 的 MCP 配置路径是~/.claude/mcp.json,如果目录不存在就手动建:
{ "mcpServers": { "local-tools": { "command": "npx", "args": [ "-y", "@modelcontextprotocol/server-filesystem", "/Users/yourname/workspace" ], "env": { "TAOTOKEN_API_KEY": "sk-你的key", "TAOTOKEN_BASE_URL": "https://taotoken.net/api" } } } }这个配置的意思是:客户端启动时用npx拉起一个 filesystem MCP 服务端,把/Users/yourname/workspace这个目录暴露给 Agent。env里把 TaoToken 的 Key 和 Base URL 传进去,服务端如果需要调模型就能直接用。
如果你用的是 Cline,配置路径在 VS Code 的 settings 里,格式类似:
{ "mcpServers": { "local-tools": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/yourname/workspace"], "env": { "TAOTOKEN_API_KEY": "sk-你的key", "TAOTOKEN_BASE_URL": "https://taotoken.net/api" } } } }注意三个关键字段:command是启动命令,args是参数数组,env是环境变量。这三个缺一不可,尤其是env,很多人配 MCP 的时候忘了传 Key,服务端启动就报认证失败。
如果你要接的是远程 MCP 服务端,用 SSE 传输,配置长这样:
{ "mcpServers": { "remote-tools": { "url": "https://your-mcp-server.example.com/sse", "headers": { "Authorization": "Bearer sk-你的key" } } } }本地调试阶段建议先用 stdio,等管道跑通了再换 SSE。stdio 的好处是进程生命周期由客户端管理,你关掉客户端服务端就退出,不会留僵尸进程。
3.2 Skill 注册示例
Skill 的注册方式和 MCP 不一样,它不是一个独立进程,而是一组指令文件,放在 Agent 能读到的目录里。Claude Code 的 Skill 目录是~/.claude/skills/,每个 Skill 一个子目录,里面至少有一个SKILL.md。
下面是一个最小可用的 Skill 示例,功能是「读取工作区文件并总结」:
--- name: workspace-summarizer description: 当用户要求总结工作区某个文件的内容时使用。先确认文件路径,再读取内容,最后输出结构化摘要。 --- # 工作区文件总结 ## 触发条件 用户说「总结一下 xxx 文件」「帮我看看 xxx 里写了什么」时触发。 ## 执行步骤 1. 从用户输入中提取文件路径,如果没给路径,先问清楚。 2. 调用 filesystem MCP 的 read_file 工具读取文件内容。 3. 如果文件超过 5000 字,分段读取,每段单独总结后再合并。 4. 输出格式:先一句话概括,再列 3 到 5 个要点,最后给一句结论。 ## 注意事项 - 不要编造文件里没有的内容。 - 如果读取失败,把原始错误信息返回给用户,不要自己猜原因。把这个文件放到~/.claude/skills/workspace-summarizer/SKILL.md,重启 Claude Code,Skill 就注册好了。Agent 在运行时只会看到name和description这两个字段(大概 100 个 token),判断当前任务需要这个 Skill 时才会加载完整指令。这就是渐进式加载,避免几百个 Skill 把上下文窗口撑爆。
Skill 和 MCP 的关联点在执行步骤里:Skill 告诉 Agent 去调filesystem MCP 的 read_file 工具,MCP 提供这个工具的实际实现。两者通过工具名对上号,管道就串起来了。
3.3 两者如何协作
把上面的配置串起来看:MCP 服务端local-tools提供了read_file、write_file、list_directory这些工具;Skillworkspace-summarizer定义了「什么时候调 read_file、调完怎么处理结果」。Agent 收到「总结一下 README.md」这个请求时,先匹配到 Skill,按 Skill 的步骤去调 MCP 工具,拿到内容后按 Skill 定义的格式输出。
如果你用的是 Codex CLI,认证信息放在~/.codex/auth.json,格式如下:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的key", "model": "claude-sonnet-4-20250514" }Base URL、Key、Model ID 三件套齐全,Codex 才能正常拉起 MCP 和 Skill。少任何一个都会在启动阶段报错。
4. 验证请求:通过日志与调用链确认管道连通
配置写完不代表管道通了,必须实际发一次请求,看日志和调用链。这一节给具体的验证动作和期望输出。
4.1 启动客户端并观察 MCP 加载日志
以 Claude Code 为例,启动时加--verbose参数,能看到 MCP 服务端的加载过程:
claude --verbose期望输出里会有类似这样的行:
[mcp] loading server: local-tools [mcp] server local-tools started, pid=12345 [mcp] discovered tools: read_file, write_file, list_directory [mcp] server local-tools ready如果卡在loading server不动,多半是npx拉包超时,检查网络或者换成本地已安装的包路径。如果discovered tools是空的,说明服务端启动了但没注册工具,检查服务端代码里的工具注册逻辑。
4.2 发一次真实请求,看调用链
在 Claude Code 里输入:
总结一下 /Users/yourname/workspace/README.md期望看到的调用链:
[skill] matched: workspace-summarizer [skill] loading full instructions [mcp] calling tool: read_file, args={"path": "/Users/yourname/workspace/README.md"} [mcp] tool result: 2048 bytes [skill] summarizing... [output] 一句话概括 + 要点列表这条链路上有三个关键节点:Skill 匹配、MCP 工具调用、结果处理。任何一个节点断了,日志里都能看出来。Skill 没匹配上,说明description写得不够准,Agent 判断不出该用这个 Skill;MCP 工具没调用,说明 Skill 里的步骤描述和实际工具名对不上;结果处理没输出,说明 Skill 的格式定义有问题。
4.3 用 curl 直接验证 MCP 服务端
如果你想绕过客户端单独验证 MCP 服务端,可以用 stdio 方式手动发一条 JSON-RPC 请求:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | npx -y @modelcontextprotocol/server-filesystem /Users/yourname/workspace期望返回:
{ "jsonrpc": "2.0", "id": 1, "result": { "tools": [ {"name": "read_file", "description": "Read a file", "inputSchema": {...}}, {"name": "write_file", "description": "Write a file", "inputSchema": {...}} ] } }能返回工具列表,说明 MCP 服务端本身没问题,问题在客户端配置或者 Skill 注册。这一步是分界线,帮你快速定位故障在哪一层。
4.4 验证 Skill 是否被正确加载
Claude Code 里有个命令可以列出当前加载的所有 Skill:
/skills期望输出里能看到workspace-summarizer,并且状态是active。如果没看到,检查目录结构是不是~/.claude/skills/workspace-summarizer/SKILL.md,文件名大小写敏感,SKILL.md不能写成skill.md。
5. 本篇常见错误排查
本地调试 MCP 和 Skill,报错集中在几个地方。下面按真实报错信息对照排查。
5.1 401 Unauthorized
[mcp] server local-tools error: 401 Unauthorized原因:MCP 服务端调模型时没拿到有效 Key。检查mcp.json的env字段里TAOTOKEN_API_KEY有没有传进去,值有没有多余空格。如果 Key 是从环境变量读的,确认启动客户端的终端里echo $TAOTOKEN_API_KEY有输出。
5.2 local proxy failed
[mcp] local proxy failed: connect ECONNREFUSED 127.0.0.1:8080原因:配置里写了本地代理端口,但代理没启动。本地调试阶段建议先去掉代理配置,直连https://taotoken.net/api。如果确实需要代理,确认端口和进程状态。
5.3 reading choices 报错
error: reading choices: unexpected end of JSON input原因:模型返回的响应体不完整,多半是max_tokens设得太小,或者网络中断。把max_tokens调到 1024 以上再试。如果还报,用第 2 节的 curl 命令单独验证模型侧。
5.4 OAuth 相关报错
error: OAuth token expired原因:如果你用的是需要 OAuth 的 MCP 服务端,token 过期了。本地调试建议先用不需要 OAuth 的服务端,比如 filesystem、fetch 这些。等管道跑通了再接需要认证的服务端。
5.5 Skill 不生效
Agent 完全没匹配到 Skill,日志里没有[skill] matched这一行。检查三件事:SKILL.md的 frontmatter 格式对不对(---包裹,name和description必填);description里有没有写清楚触发条件;Skill 目录有没有放在客户端能读到的路径下。
5.6 MCP 工具调用参数错误
[mcp] tool call failed: invalid arguments, missing required field "path"原因:Skill 里定义的调用步骤没把参数说清楚,Agent 调用时漏了必填字段。在 Skill 的执行步骤里明确写出每个参数怎么来,比如「从用户输入提取文件路径,作为 path 参数传入」。
5.7 三件套检查清单
如果你用的是 CC Switch、Cline MCP 或者 Codex auth.json,出现任何连接问题,先对照这三件套:
| 配置项 | 正确值 | 常见错误 |
|---|---|---|
| Base URL | https://taotoken.net/api | 带了 UTM 参数或多余路径 |
| API Key | sk-开头完整字符串 | 复制时漏字符或有空格 |
| Model ID | claude-sonnet-4-20250514 | 写成了不存在的模型名 |
三件套任何一个不对,都会在启动阶段或首次调用时报错。排查顺序:先 curl 验证模型侧,再验证 MCP 服务端,最后验证 Skill 注册。
6. 把管道跑通之后能做什么
管道跑通之后,你可以开始往上面加东西了。MCP 侧可以接更多服务端,比如数据库查询、HTTP 请求、Git 操作;Skill 侧可以写更多领域指令,比如代码审查流程、日志分析步骤、部署检查清单。每加一个,都按第 4 节的方法验证一次调用链,确保新加的没把旧的搞坏。
长期做 Agent 开发的话,建议把 MCP 配置和 Skill 目录都纳入版本管理,团队里每个人拉下来就能用。模型入口用 TaoToken 统一,Base URL 和 Key 走环境变量,不写死在配置文件里。这样切换环境或者轮换 Key 的时候,改一个地方就行。
如果你要跑长期的编码任务或者多步 Agent 流程,可以看下 Coding Plan,https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,按用量计费比单次调用划算。只是想验证模型对话的话,https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 可以直接在网页上试。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,MCP 和 Skill 的对接细节里面写得更全。
最后留一个实用技巧:每次改完 MCP 或 Skill 配置,别急着重启整个客户端,先用第 4.3 节的 curl 命令单独验证服务端,再用/skills命令确认 Skill 加载状态,两个都过了再发真实请求。这样能把排查范围缩小到最小,省掉大量重启等待时间。