1. 从一次 Agent 失控说起:为什么需要 SKILL.md 与 MCP 协同
如果你正在搭 AI Agent 工作流,大概率遇到过这种场面:给模型塞了三千字提示词,让它按团队规范做代码审查,结果它一会儿漏掉安全校验,一会儿把日志格式改得面目全非。你以为是模型不够聪明,其实问题出在「知识没有结构化」——所有指令都挤在上下文里,模型抓不住重点,也复用不了。
Claude Skills 就是冲着这个痛点来的。它把「一个技能」封装成一个文件夹,核心是SKILL.md文件,里面用 YAML 头写元数据、用 Markdown 写操作指令,再挂上脚本和参考文档。模型启动时只加载每个技能的元数据(约 100 token),匹配到任务才去读正文,需要执行脚本时才调用资源。这套机制叫渐进式披露(Progressive Disclosure),实测下来复杂任务能省 40%–60% 的上下文占用。
而 MCP(Model Context Protocol)解决的是另一件事:让 Agent 能调用外部工具,比如查 Jira、调内部 API、读数据库。Skills 管「怎么做」,MCP 管「用什么做」。两者协同,才是工业级 Agent 的标配。
这篇文章面向正在搭 Agent 工作流的开发者,交付一份可复制的SKILL.md模板、MCP 配置片段,以及本地验证技能加载与工具调用链路的完整步骤。核心检索词先摆出来:Claude Skills 是什么、SKILL.md 怎么写、MCP 怎么配、Agent Skills 怎么落地。适合谁?适合已经跑通基础对话、想让 Agent 稳定执行 SOP 的人。
我试过把团队代码规范拆成 Skill + MCP 的组合,审查准确率从「看运气」变成「可追踪」。下面把踩过的坑和可复制的配置一次讲清。
2. TaoToken 前置:给 Agent 一个稳定的模型入口
在写SKILL.md之前,得先解决模型调用的问题。Skills 和 MCP 都是「能力层」,最终还是要落到一个能稳定调用的模型 API 上。很多开发者在本地调试 Agent 时,卡在模型入口不稳定、Key 管理混乱、切换模型要改一堆配置。
TaoToken 在这里的角色是统一入口:官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址 https://taotoken.net/api 。它把模型对话、Coding Plan、控制台、API Keys 管理集中在一处,你可以在控制台里生成 Key,然后在 Agent 配置里统一填 Base URL + Key + Model ID 三件套。
为什么强调「三件套」?因为 Claude Code、Cline、Codex 这类工具,配置项名字不一样,但本质都是这三个值。少一个就连不上,报错还各不相同。比如 Claude Code 的settings.json、Cline 的 MCP 配置、Codex 的auth.json,路径和字段名都不同,但填的都是同一组信息。
具体入口分流一下,方便你按需取用:
- 需要生成 Key、管理额度:进控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
- 需要看接入文档、字段说明:进文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
- 需要直接拿 API Key:进 API Keys 页 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite
- 想先验证模型能不能通:用模型对话 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite
- 长期跑编码 / Agent 任务:看 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite
这里有个关键点:Skills 本身不绑定模型供应商,它是一套文件系统约定。但 MCP 工具调用需要模型支持 function calling / tool use,所以你的模型入口必须能透传工具调用参数。TaoToken 的 API 兼容主流调用格式,你在SKILL.md里写的指令,最终通过 MCP 暴露的工具,由模型决定调用哪个。
配置顺序建议这样:先在控制台生成 Key,记下 Base URL 和 Model ID;然后在本地 Agent 配置里填好三件套;最后再写SKILL.md和 MCP 配置。顺序反了,你会分不清是技能没加载还是模型没连上。
注意:不要把 Key 硬编码进
SKILL.md。Skills 是会被模型读取的文本,Key 写进去等于泄露。Key 只放在 Agent 的运行时配置或环境变量里。
3. 可复制配置:SKILL.md 模板与 MCP 配置片段
这一节直接给可复制的内容。先看SKILL.md的目录结构,再看文件本体,最后看 MCP 配置。
一个标准的 Skill 文件夹长这样:
my-skills/ └── code-review/ ├── SKILL.md # 必需:元数据 + 指令 ├── scripts/ │ └── lint_check.py # 可选:可执行脚本 ├── references/ │ └── style-guide.md# 可选:参考文档 └── assets/ └── template.txt # 可选:静态资源SKILL.md本体,YAML 头是元数据区,必须包含name和description:
--- name: code-review description: 按团队规范审查代码,检查命名、日志格式、安全校验。当用户提交代码片段或要求 review 时使用。 --- # 代码审查技能 ## 快速入门 1. 读取待审查代码。 2. 对照 `references/style-guide.md` 检查命名规范。 3. 运行 `scripts/lint_check.py` 做静态检查。 4. 输出问题清单,按严重程度排序。 ## 检查项 - 命名:变量用 snake_case,类用 PascalCase。 - 日志:必须包含 trace_id,禁止打印敏感字段。 - 安全:所有外部输入必须校验,SQL 必须参数化。 ## 脚本调用 执行静态检查: ```bash python scripts/lint_check.py --file <target>脚本输出会作为反馈进入上下文,脚本代码本身不占用上下文。
参考
详细规范见 style-guide.md。
注意 `description` 的写法:要写清「做什么」和「什么时候用」。模型靠这段元数据判断是否触发技能,写得太泛(比如「代码相关」)会导致误触发或漏触发。 接下来是 MCP 配置。以 Cline 的 MCP 配置为例,路径通常在 `~/.cline/mcp_settings.json` 或项目内 `.cline/mcp.json`: ```json { "mcpServers": { "taotoken-tools": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "./workspace"], "env": { "BASE_URL": "https://taotoken.net/api", "API_KEY": "${TAOTOKEN_API_KEY}", "MODEL_ID": "your-model-id" } } } }如果你用的是 Claude Code,配置在settings.json,字段名不同但三件套一致:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "${TAOTOKEN_API_KEY}", "ANTHROPIC_MODEL": "your-model-id" } }Codex 的auth.json则是另一种写法:
{ "base_url": "https://taotoken.net/api", "api_key": "${TAOTOKEN_API_KEY}", "model": "your-model-id" }三件套对照表,方便你迁移:
| 工具 | 配置文件 | Base URL 字段 | Key 字段 | Model 字段 |
|---|---|---|---|---|
| Claude Code | settings.json | ANTHROPIC_BASE_URL | ANTHROPIC_API_KEY | ANTHROPIC_MODEL |
| Cline MCP | mcp_settings.json | BASE_URL | API_KEY | MODEL_ID |
| Codex | auth.json | base_url | api_key | model |
提示:
${TAOTOKEN_API_KEY}是环境变量引用写法,实际运行时由 shell 注入。别把真实 Key 写进 JSON 提交到 Git。
配置完成后,Skills 负责「知识」,MCP 负责「工具」,模型负责「决策」。三者通过文件系统和标准协议解耦,这是 Agent Skills 能标准化的根本原因。
4. 验证请求:本地跑通技能加载与工具调用链路
配置写完不算完,得验证。这一节给可执行的验证步骤,从技能加载到工具调用,一步步来。
第一步,确认技能目录被识别。在 Agent 对话里输入:
list skills如果返回了code-review及其 description,说明元数据加载成功。如果没返回,检查三点:目录名是否匹配、SKILL.md是否在技能文件夹根目录、YAML 头是否有语法错误(比如冒号后没空格)。
第二步,触发技能。输入一个明确的代码审查请求:
帮我 review 这段代码: def getUserData(userId): print("fetching", userId) return db.query("SELECT * FROM users WHERE id=" + userId)预期行为:模型读取SKILL.md正文,对照references/style-guide.md,发现命名问题(getUserData应为 snake_case)、日志问题(打印了 userId)、安全问题(SQL 拼接)。如果模型只泛泛而谈,说明技能没触发,检查description是否覆盖了「review」这个场景词。
第三步,验证脚本调用。技能指令里写了运行lint_check.py,模型应该发起 bash 调用:
python scripts/lint_check.py --file target.py脚本输出会进入上下文。如果模型没调用脚本,可能是指令里没写清「必须运行」,或者脚本路径不对。把路径写成相对技能根目录的相对路径,别写绝对路径。
第四步,验证 MCP 工具调用。让模型调用一个 MCP 暴露的工具,比如读文件:
用 MCP 工具读取 workspace 下的 config.yaml如果返回文件内容,说明 MCP 链路通了。如果报错,看下一节的排查表。
第五步,端到端验证。把技能和 MCP 串起来:
用 code-review 技能审查 workspace/src/main.py,并用 MCP 读取同目录的 style-guide.md 作为参考成功的结果是:模型先读SKILL.md,再通过 MCP 读style-guide.md,然后运行脚本,最后输出结构化问题清单。整个过程你能在日志里看到「读文件 → 执行脚本 → 输出结果」的调用链。
实测下来,最容易出问题的是路径和权限。Skills 运行在沙盒环境里,文件系统访问范围有限。如果你的技能要读项目外的文件,得在 MCP 配置里把目录加进允许列表。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
这一节对照真实报错,给排查路径。这些错我都踩过,按顺序查基本能定位。
401 Unauthorized:Key 没填对或没生效。先确认环境变量是否注入成功:
echo $TAOTOKEN_API_KEY如果为空,说明 shell 没加载。再确认配置文件里的字段名是否和工具要求一致,比如 Claude Code 要ANTHROPIC_API_KEY,写成API_KEY就不认。最后确认 Key 有没有过期或在控制台被禁用。
local proxy failed:本地代理启动失败。常见原因是端口被占用或 MCP server 命令路径不对。检查mcp_settings.json里的command和args,npx是否在 PATH 里。可以手动跑一遍:
npx -y @modelcontextprotocol/server-filesystem ./workspace如果手动能跑通,说明配置没问题,是 Agent 启动 MCP 时的环境差异。把env里的变量补全,尤其是PATH。
reading choices 报错:通常是模型返回格式不符合预期,工具调用参数解析失败。检查模型是否支持 function calling。如果用的是兼容层,确认它透传了tools参数。另外,SKILL.md里的指令如果太模糊,模型可能返回自然语言而不是工具调用,也会触发这类错。把指令写具体,明确「调用哪个工具、传什么参数」。
OAuth 相关报错:MCP server 要求 OAuth 授权但没配。有些 MCP server 需要先走授权流程拿 token。检查 server 文档,看是否需要client_id/client_secret。如果只是本地文件系统 server,一般不需要 OAuth,报这个错说明你配错了 server 类型。
排查顺序建议:先看 Key 和环境变量,再看 MCP server 能否手动启动,最后看模型是否支持工具调用。三件套(Base URL + Key + Model ID)任何一项错都会导致链路断,逐项核对。
注意:报错信息里如果出现「proxy」字样,先确认是不是本地网络配置问题,别急着改代码。很多「local proxy failed」其实是端口冲突。
6. 把 Skills 和 MCP 用起来:从验证到长期运行
验证通过后,下一步是让它稳定跑起来。短期调试用模型对话就够,长期跑编码和 Agent 任务建议走 Coding Plan,额度和稳定性更适合持续调用。
回到开头的问题:Agent 失控不是因为模型笨,是因为知识没结构化、工具没标准化。SKILL.md把 SOP 沉淀成可复用文件,MCP 把外部能力标准化暴露,两者协同,Agent 才能从「看运气」变成「可追踪」。
一个实用技巧:把团队规范拆成多个小 Skill,而不是一个大 Skill。比如code-review、commit-message、api-design分开,每个description写清触发场景。这样模型匹配更准,上下文占用也更低。MCP 那边,按功能拆 server,文件系统、数据库、内部 API 各一个,权限好控制。
最后一步,把配置提交到团队仓库前,检查三件事:Key 是否用环境变量引用、SKILL.md里有没有硬编码敏感信息、MCP 配置的目录权限是否最小化。做完这些,你的 Agent 工作流就算真正落地了。