1. 先把四个概念放进同一个任务里看
Tool、Skill、MCP、Plugin 这四个词经常被混着用,原因很简单:它们都出现在“让 AI 干活”这条链路上,但负责的环节完全不同。我习惯用一个具体任务把它们串起来——整理今天收到的邮件:找出重要邮件、把广告归档、最后给一份总结。这个任务足够日常,又能覆盖“读信息、做判断、改状态、出结果”四类动作。
先给一句最短的定义,方便你建立坐标:
- Tool 是 Agent 能直接调用的一个动作,比如
search_email(query)、read_email(id)、archive_email(id)。 - Skill 是一套可复用的做事方法,通常是一个包含
SKILL.md的文件夹,告诉 Agent 先做什么、什么条件下归档、输出成什么样。 - MCP 是 Model Context Protocol,一套连接 AI Client 和外部工具/数据的开放协议;按协议提供能力的程序叫 MCP Server。
- Plugin 是把相关能力打包成一个可安装、可分发的整体,里面可以只放 Skill,也可以带 MCP 连接,或者两者都有。
关键区别在于:Tool 和 Skill 属于“任务运行时”这一侧,MCP 是“能力怎么接进来”的协议层,Plugin 属于“能力怎么装进来”的安装时。把它们画在同一条线上,就会越看越乱;拆成运行时和安装时两棵树,立刻清楚。
这篇要做的不是背定义,而是一组可复现的对照实验:用同一个邮件整理任务,分别走 Tool、Skill、MCP、Plugin 四条路径,观察调用链路和配置差异。所有请求统一走 TaoToken 的 Key 和 API 通道,这样你只需要维护一份凭证,就能把四类扩展的差异看清楚。适合谁看:正在给 Agent 接工具、被 MCP 和 Plugin 的边界绕晕、想用一套 Key 跑通多种扩展形态的开发者。
2. 用 TaoToken 统一 Key 作为接入底座
做对照实验最怕变量太多。如果四条路径各自用不同的账号、不同的 endpoint、不同的鉴权方式,最后观察到的差异可能来自凭证而不是扩展本身。所以这一步先把底座固定下来:所有模型请求都走 TaoToken 的 API 通道,用同一个 Key。
TaoToken 在这里的角色是统一的模型接入层。你拿到一个 Key,配好 Base URL,就能在 Tool、Skill、MCP、Plugin 四种形态里复用同一套凭证。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api (这个不加 UTM)。注意 API 地址后面通常要补/v1之类的版本路径,具体以你所用客户端的文档为准。
拿 Key 的流程不复杂,但有几个坑值得提前说。第一,Key 只在创建时完整显示一次,复制后立刻存进环境变量,别写死在代码里。第二,不同客户端对 Base URL 的写法要求不一样,有的要带/v1,有的只填到域名,配错了会直接 404 或 401。第三,模型 ID 要和你实际开通的通道对上,写错模型名会报model not found。
我建议统一用环境变量管理,这样四类扩展共享同一份配置:
export TAOTOKEN_API_KEY="sk-你的Key" export TAOTOKEN_BASE_URL="https://taotoken.net/api/v1" export TAOTOKEN_MODEL="你的模型ID"把这三个变量固定下来之后,后面无论写 Tool 的调用、Skill 的脚本、MCP Server 的配置,还是 Plugin 的清单,都引用同一组值。这样对照实验里唯一的变量就只剩“扩展形态”本身。
如果你更习惯在图形界面里操作,模型对话入口可以快速验证 Key 是否可用:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 。先在对话里发一句简单请求,确认通道通了,再去折腾扩展配置,能省掉很多“到底是 Key 错还是配置错”的排查时间。
需要长期跑编码或 Agent 任务的话,Coding Plan 入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite ,适合把这类对照实验做成常态化脚本。Key 管理在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite ,接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。先把这几个地址记下来,后面每一步都会用到。
3. 四类扩展的最小可复制配置
这一节是全文的核心,给出四类扩展各自的最小配置片段。路径和字段名尽量贴近真实客户端的写法,你复制后改 Key 和模型 ID 就能跑。统一前提:Base URL 用https://taotoken.net/api/v1,Key 用环境变量TAOTOKEN_API_KEY。
3.1 Tool:最小函数定义
Tool 的本质是给 Agent 一个可调用的动作。最小形态就是一个带 schema 的函数声明。以邮件整理为例,定义一个搜索工具:
{ "name": "search_email", "description": "按关键词搜索邮箱,返回匹配的邮件列表", "parameters": { "type": "object", "properties": { "query": { "type": "string", "description": "搜索关键词" }, "limit": { "type": "integer", "default": 20 } }, "required": ["query"] } }Agent 决定调用哪个 Tool、传什么参数,Tool 负责执行并返回结果。搜索和读取只获取信息,归档、发送、删除会改变外部状态,真实产品要检查权限,必要时等用户确认。Tool 可以直接注册给 Agent,不一定经过 MCP。
3.2 Skill:SKILL.md 最小结构
Skill 保存的是“这件事应该怎么做”。在 OpenAI 和 Codex 当前的实现里,它通常是一个包含SKILL.md的文件夹,还可以附带脚本、参考资料和模板。最小结构:
--- name: organize-inbox description: 整理收件箱,找出重要邮件,归档广告,输出总结 --- ## 工作流 1. 调用 search_email 搜索最近 24 小时邮件 2. 逐封 read_email,判断重要程度 3. 广告类调用 archive_email 归档 4. 重要邮件汇总成摘要,标注发件人和待办 ## 完成标准 - 广告已归档 - 重要邮件列表非空时给出摘要 - 摘要包含发件人、主题、建议动作Skill 会告诉 Agent 先搜索、再阅读、何时归档、最后怎样总结,但真正调用 Tool 的还是 Agent。一份 Skill 可以指导多个 Tool,也可以只靠说明和模板完成任务。
3.3 MCP:Server 配置片段
MCP 是协议,MCP Server 是能力提供者。一个 Server 可以一次提供多个 Tool。以接入一个邮件类 MCP Server 为例,客户端配置通常长这样:
{ "mcpServers": { "mail-server": { "command": "npx", "args": ["-y", "your-mail-mcp-server"], "env": { "API_KEY": "${TAOTOKEN_API_KEY}", "BASE_URL": "https://taotoken.net/api/v1", "MODEL_ID": "${TAOTOKEN_MODEL}" } } } }这里三件套要写全:Base URL、Key、Model ID。少任何一个,Server 启动后调用模型都会失败。MCP Server 还可以暴露 Resource、Prompt 和 Instructions,本文只讨论最常见的 Tool。
3.4 Plugin:plugin.json 清单
Plugin 把相关能力组织成一个可安装、可分发的包。以 OpenAI 当前体系为例,每个 Plugin 有.codex-plugin/plugin.json,Skill、MCP 连接、Hooks 和素材按需加入:
{ "name": "inbox-organizer", "version": "0.1.0", "description": "邮件整理插件,含 Skill 与 MCP 连接", "skills": ["skills/organize-inbox"], "mcpServers": ["mcp/mail-server.json"], "hooks": [] }Plugin 可以只带 Skill,也可以带 MCP Server,或者同时包含两者,官方架构没有规定固定组合。Plugin 负责把能力装进来;任务开始后,Agent 直接使用已经可见的 Skill 和 Tool,不需要先“调用 Plugin”。
四类配置放在一起对照,差异一目了然:Tool 是单个动作声明,Skill 是方法文档,MCP 是连接配置,Plugin 是打包清单。它们不是互斥选项,同一个项目里可以同时出现。
4. 逐项验证请求与结果对照
配置写完必须验证,否则你不知道是通道问题还是扩展问题。这一节给出四类扩展各自的验证动作和预期结果,全部走同一个 TaoToken Key。
先做一次基础连通性验证,确认 Key 和 Base URL 没问题:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "'"$TAOTOKEN_MODEL"'", "messages": [{"role": "user", "content": "回复 ok"}] }'返回里能看到choices数组且内容正常,说明通道通了。这一步过了再往下走。
Tool 验证:把search_email的 schema 注册给 Agent,发一句“搜索最近邮件”,观察返回里是否出现tool_calls字段,且function.name是search_email。出现即说明 Agent 正确选择了 Tool。
Skill 验证:把organize-inbox放进 skills 目录,发同一句邮件整理指令,观察 Agent 是否按 SKILL.md 里的步骤先搜索、再阅读、再归档。如果它跳步或输出格式不符,说明 Skill 没被加载或描述不够明确。
MCP 验证:启动 MCP Server 后,在客户端里查看工具列表,确认search_email、read_email、archive_email都出现在 MCP 提供的工具里。然后发指令,观察请求是否经过 MCP Server 转发。换成本地 Tool 时,请求不会经过 MCP Server,这是最直观的差异。
Plugin 验证:安装 Plugin 后,检查 Skill 和 MCP 连接是否都已就位。Plugin 不在调用链里,因为它的工作已经在安装阶段完成。如果安装后工具列表为空,多半是plugin.json里的路径写错了。
结果对照表:
| 扩展类型 | 验证动作 | 预期结果 | 调用链位置 |
|---|---|---|---|
| Tool | 注册 schema 后发指令 | 返回 tool_calls | 运行时,Agent 直接调用 |
| Skill | 放入 skills 目录后发指令 | 按步骤执行 | 运行时,指导 Agent |
| MCP | 启动 Server 后查工具列表 | 工具出现在列表中 | 运行时,经协议转发 |
| Plugin | 安装后检查能力 | Skill 与 MCP 就位 | 安装时,不参与调用 |
实测下来,最容易出问题的是 MCP 和 Plugin 的路径配置。MCP 的command和args写错,Server 根本起不来;Plugin 的skills和mcpServers路径写错,安装后能力为空。这两处建议先用绝对路径验证,跑通再改相对路径。
5. 常见报错逐项排查
这一节按真实报错来,遇到哪个查哪个。
401 Unauthorized:Key 无效或没带上。检查Authorization头是不是Bearer加 Key,中间有空格。环境变量没导出也会导致空 Key。用echo $TAOTOKEN_API_KEY确认变量有值。
local proxy failed / connection refused:客户端把请求发到了本地代理地址,但代理没启动。检查 Base URL 是不是被写成了http://localhost:xxxx。统一改成https://taotoken.net/api/v1再试。
reading choices 报错 / choices 为空:响应结构和你解析的字段对不上。先打印完整响应体,确认choices[0].message.content存在。如果返回的是错误对象,里面通常有error.message,按提示改模型 ID 或参数。
OAuth 相关报错:某些 MCP Server 或客户端走 OAuth 流程,回调地址或 token 过期会报错。检查客户端里的 OAuth 配置,重新授权一次。如果 Server 支持 API Key 模式,优先用 Key 模式绕开 OAuth。
model not found:模型 ID 写错,或该模型没在你开通的通道里。对照 TaoToken 文档里的模型列表,确认 ID 拼写。Base URL 少了/v1也可能导致路由不到。
MCP Server 启动失败:command不存在或args里的包名写错。先在终端手动执行一遍command + args,看能否启动。npx类命令首次运行要下载包,网络慢会超时,可以加长超时或预装。
Plugin 安装后能力为空:plugin.json里的skills和mcpServers路径是相对路径,基准目录不对。改成绝对路径验证,或确认相对路径是相对于plugin.json所在目录。
CC Switch / Cline MCP / Codex auth.json 三件套缺失:这三类客户端都要求写全 Base URL、Key、Model ID。以 Codex 的auth.json为例:
{ "base_url": "https://taotoken.net/api/v1", "api_key": "sk-你的Key", "model": "你的模型ID" }少任何一项都会在启动或首次请求时报错。Cline 的 MCP 配置同理,env里三个变量都要有。CC Switch 切换配置时,确认切换后的 profile 里三件套完整。
排查顺序建议:先验通道(curl 基础请求),再验扩展(Tool/Skill/MCP/Plugin 各自的最小验证),最后验组合(Plugin 装完后整体跑一遍)。这样能把问题定位到具体环节,而不是在四类扩展之间来回猜。
6. 把四类扩展用对地方
回到最开始的邮件任务:Tool 负责搜索、读取和归档;Skill 保存整理方法;MCP Server 把邮件能力接进来;Plugin 把相关能力整套安装;Host / Runtime 让它们跑起来。四者是分工,不是互斥选项。
判断一个新东西属于哪类,先问它的主要职责:能直接执行动作的是 Tool,保存做事方法的是 Skill,提供连接协议的是 MCP,负责打包分发的是 Plugin。同一个项目里可以同时出现四种,Plugin 里放着 Skill 和 MCP 连接,MCP Server 再提供多个 Tool。
如果你只想快速验证模型通道,用模型对话入口发一句请求就行:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model_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 。Key 管理和接入文档分别在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 和 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。
最后留一个实用技巧:做这类对照实验时,把四类扩展的配置放在同一个仓库的不同目录里,共用一份.env。这样切换实验对象只需要改一行加载路径,Key 和 Base URL 始终一致,观察到的差异才真正来自扩展形态本身。