
1. 从一次配置翻车说起Skill 和 MCP 到底谁管谁刚接触 AI 工具链的开发者十有八九会在同一个地方卡住明明照着文档配了工具模型却像没看见一样要么不调用要么报一堆看不懂的错。我见过最常见的场景是——有人把 Skill 的配置写进了 MCP 的配置文件里或者反过来把 MCP server 的启动命令塞进了 Skill 的触发条件里。结果就是两边都不生效排查半天以为是 Key 的问题。这个混淆不是偶然的。Skill 和 MCP 在中文语境里经常被混着叫「插件」「工具」「能力」但它们其实是两个层次的东西。Skill 是「做什么」——它封装一个具体任务比如搜索、计算、读写文件MCP 是「怎么做」——它是一套标准化协议规定模型怎么发现工具、怎么传参、怎么拿结果。你可以把 Skill 理解成一道菜MCP 理解成厨房里统一的传菜窗口和点单规则。菜可以自己炒也可以走窗口但窗口本身不炒菜。这篇就围绕这个边界来写。我会用 TaoToken 作为统一的 Key 和 API 通道把 Skill 和 MCP 两种配置各跑一遍给出可复制的settings.json和config.toml骨架最后分别调用一次确认各自生效。适合刚上手 AI 工具链、想搞清楚选型逻辑的开发者。全程不需要你有多深的协议背景跟着配、跟着验就行。2. 前置准备用 TaoToken 统一 Key 打通两种机制在讲配置之前先把「钥匙」的问题解决掉。Skill 和 MCP 虽然机制不同但它们最终都要调用模型或外部 API如果每个工具都单独配一套 Key管理成本会很高排查问题时也容易搞混是哪个 Key 失效了。TaoToken 在这里的作用就是提供一个统一的 API 通道你只需要维护一份 KeySkill 和 MCP 都走这个通道。具体来说TaoToken 提供兼容主流接口规范的 API 地址你可以在官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 了解整体能力实际调用时用 API 地址 https://taotoken.net/api 即可。Key 的创建在控制台的 API Keys 页面完成拿到之后先别急着往配置里塞建议先用一次模型对话验证 Key 本身是通的这样后面出问题就能快速定位是 Key 的问题还是配置的问题。提示统一 Key 的好处不只是省事。当 Skill 和 MCP 共用同一个通道时你在日志里看到的请求来源是一致的排查「到底是谁没生效」会快很多。这里有个我踩过的坑一开始我把 Skill 和 MCP 分别配了不同的 Key结果 MCP 那边报 401我以为是协议配置错了折腾半天才发现是 Key 复制时多了个空格。统一通道之后这类低级问题基本绝迹。3. 可复制配置settings.json 与 config.toml 骨架下面进入实操。我会给出两份配置骨架一份对应 Skill 风格的settings.json一份对应 MCP 风格的config.toml。注意这两份配置的定位不同settings.json更偏向「声明这个 Skill 能做什么、什么时候触发」config.toml更偏向「声明这个 MCP server 怎么启动、暴露哪些工具」。3.1 Skill 侧settings.json 配置骨架Skill 的配置核心是「触发条件 执行逻辑 输出」。在settings.json里你通常需要声明 Skill 的名称、描述、触发关键词以及它调用模型时用的 API 通道。下面是一个最小可用的骨架{ skills: [ { name: web_search, description: 当用户需要查询实时信息时触发, trigger_keywords: [搜索, 查一下, 最新], api_base: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, model: claude-sonnet, input_schema: { type: object, properties: { query: { type: string, description: 搜索关键词 } }, required: [query] } } ] }这里几个字段值得说明。api_base指向 TaoToken 的 API 地址api_key_env表示从环境变量读取 Key避免把 Key 硬编码进文件。input_schema定义了 Skill 接受什么参数模型会根据这个 schema 决定怎么传参。trigger_keywords是给模型看的提示不是硬性拦截实际触发还是靠模型判断。3.2 MCP 侧config.toml 配置骨架MCP 的配置核心是「server 怎么起、暴露什么工具」。在config.toml里你声明的是 MCP server 的启动命令和它连接的外部资源。下面是一个本地 MCP server 的骨架[mcp_servers.filesystem] command npx args [-y, modelcontextprotocol/server-filesystem, /path/to/your/project] env { TAOTOKEN_API_KEY ${TAOTOKEN_API_KEY} } [mcp_servers.search] command npx args [-y, mcp-server-search] env { TAOTOKEN_API_KEY ${TAOTOKEN_API_KEY}, API_BASE https://taotoken.net/api }注意env里同样引用了TAOTOKEN_API_KEY这就是统一 Key 的体现——MCP server 启动时从环境变量拿 Key走同一个通道。command和args是 MCP server 的启动方式不同 server 不一样但结构一致。3.3 两者配置的对照维度settings.jsonSkillconfig.tomlMCP声明对象能力单元通信 server核心字段trigger、input_schemacommand、args、envKey 引用api_key_envenv 中的环境变量生效方式模型按描述判断触发启动 server 后动态发现粒度粗一个 Skill 可含多步细每个工具独立暴露把这两份配置放在一起看边界就清楚了Skill 是「我有什么能力」MCP 是「我怎么把能力接进来」。4. 验证请求分别调用一次确认各自生效配置写完不算完必须分别验证。很多人配完就直接上复杂任务结果出错时分不清是 Skill 没触发还是 MCP 没连上。正确的做法是各跑一个最小请求。4.1 验证 Skill 生效先验证 Skill。用一个明确会触发web_search的请求观察返回里有没有调用痕迹。如果你用的是支持 Skill 的客户端可以在对话里直接问「帮我搜索一下今天的天气」然后看日志或返回结构里是否出现web_search的调用记录。curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-sonnet, messages: [{role: user, content: 搜索一下 TaoToken 的 API 地址}], tools: [{type: function, function: {name: web_search}}] }如果返回里出现tool_calls字段且name是web_search说明 Skill 侧的声明被模型识别了。这一步验证的是「能力声明」是否生效。4.2 验证 MCP 生效再验证 MCP。MCP 的验证重点是「server 是否启动、工具是否被发现」。启动你的客户端后查看 MCP server 的连接状态通常客户端会列出已发现的工具列表。如果filesystem和search出现在工具列表里说明 MCP server 启动成功且工具被发现。# 手动启动 MCP server 观察输出 TAOTOKEN_API_KEY$TAOTOKEN_API_KEY npx -y modelcontextprotocol/server-filesystem /path/to/your/project正常启动后server 会输出监听信息或工具注册日志。如果卡住不动或报错多半是command或args写错了。这一步验证的是「协议连接」是否生效。两次验证都通过你就能明确区分Skill 生效看的是模型有没有按描述调用MCP 生效看的是 server 有没有把工具暴露出来。这两个信号完全不同排查时不会互相干扰。5. 本篇常见错排查配置和验证过程中有几个错误反复出现这里集中列一下。错误一把 MCP server 的启动命令写进 Skill 配置。这是最常见的混淆。Skill 的settings.json里不该出现command和args那是 MCP 的字段。反过来config.toml里也不该出现trigger_keywords。看到字段放错位置先检查是不是把两个文件搞混了。错误二Key 没通过环境变量传入。无论是api_key_env还是env里的引用都依赖环境变量存在。如果启动前没export TAOTOKEN_API_KEYxxx两边都会报 401。建议在启动脚本里统一 export而不是每个工具单独设。错误三MCP server 路径写错导致启动失败。args里的路径如果是相对路径会以启动目录为基准容易找不到。统一用绝对路径能省很多事。错误四Skill 描述太模糊导致不触发。description写「处理搜索相关任务」不如写「当用户需要查询实时信息、最新新闻或网络数据时触发」。模型靠描述判断描述越具体触发越准。错误五验证时用了复杂任务分不清是谁的功劳。验证阶段一定用最小请求Skill 就测单次工具调用MCP 就测工具列表发现。混在一起测出错时定位成本翻倍。注意如果 Skill 和 MCP 都配了但只有一个生效先看日志里请求走的是哪条路径。统一 Key 的好处在这里体现得最明显——两条路径的请求来源一致对比日志就能看出差异。6. 选型与后续什么时候用 Skill什么时候用 MCP搞清楚区别之后选型其实有比较清晰的判断标准。如果你要封装的是「一个具体任务」比如「总结这篇文章」「翻译这段文字」用 Skill 更直接配置轻、触发快。如果你要接入的是「一个外部系统」比如文件系统、数据库、第三方 API用 MCP 更合适因为它是协议级的跨框架通用工具发现和权限管理都是标准化的。实际项目里两者经常一起用。一个 Skill 内部可以通过 MCP 去调外部工具Skill 负责业务逻辑封装MCP 负责协议通信。这种组合既保留了灵活性又不用为每个外部系统单独写适配。如果你打算长期做编码类或 Agent 类的工作建议把 Key 和通道统一到 TaoToken 的 Coding Plan 上这样 Skill 和 MCP 共用一套配额和日志管理成本最低。接入细节可以参考接入文档模型验证用模型对话页面快速试。先把这篇的两份配置跑通再往真实项目里迁移会顺很多。