
1. 从 Function Call 到 MCP 再到 SKILLSAI Agent 能力扩展三阶段到底在解决什么问题AI Agent 能力扩展这件事很多人第一次接触时会被 Function Call、MCP、SKILLS 这三个词绕晕。它们不是三个平行的新概念而是同一条演进路线上的三个阶段Function Call 解决“单次工具调用”MCP 解决“工具接入标准化”SKILLS 解决“能力复用与按需加载”。如果你正在用 Claude Code、Cline、Codex CLI 这类工具写代码或搭 Agent理解这条脉络能帮你少走很多弯路。我先把结论摆出来Function Call 是让模型学会“伸手拿工具”MCP 是给所有工具装一个统一插座SKILLS 是把常用操作打包成可复用的技能包。三者层层递进但底层都依赖一个稳定的模型 API 通道。这篇教程会以 TaoToken 统一 Key/API 通道为底座带你从注册工具走到封装 Skill每一步都给可复制的配置和验证动作。适合谁看如果你已经能跑通一次大模型对话请求但还没搞明白 MCP 服务端怎么配、SKILL.md 怎么写、调用返回结构怎么核对那这篇就是为你准备的。全程不需要你懂底层协议实现跟着复制粘贴就能跑。先澄清一个常见误解Agent 不是模型本身。模型负责模糊语义的理解与决策Agent 负责调用那些确定性的能力比如把 Word 转 PDF、编译运行代码、调推送接口。Function Call、MCP、SKILLS 都是让这个“调用”过程更顺滑的基础设施。2. TaoToken 前置准备统一 Key 与 API 通道配置在动手写 Function Call 和 MCP 之前得先有一个能稳定调用的模型通道。TaoToken 在这里扮演的角色是统一 Key 和 API 入口让你不用为每个模型单独维护一套鉴权。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。第一步拿到你的 API Key。进入控制台后创建 Key建议按用途分多个 Key比如一个给本地开发、一个给 CI。创建入口在 API Keys 页面地址是 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。拿到形如sk-xxxx的字符串后不要直接写进代码先放到环境变量里。export TAOTOKEN_API_KEYsk-你的实际Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api第二步确认你要用的模型 ID。不同模型对 Function Call 的支持程度不一样建议先用支持工具调用的模型做验证。你可以在模型对话页面先做一次纯文本请求确认 Key 和通道没问题地址是 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。第三步如果你打算长期跑编码类 Agent建议了解 Coding Plan它更适合高频调用场景地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到参数不确定时优先查这里。这里有个关键点无论你后面用 Function Call、MCP 还是 SKILLS最终都是通过这个 Base URL 发请求。所以先把通道跑通后面三个阶段才能顺利验证。我建议你现在就用 curl 发一条最小请求确认返回里有正常的choices字段再继续往下。3. 可复制配置Function Call、MCP 服务端与 SKILL.md 模板这一节是全文的核心给你三份可以直接复制的配置。先看 Function Call 的工具定义。下面是一个标准的工具 schema放在请求的tools字段里{ model: 你的模型ID, messages: [ {role: user, content: 北京今天天气怎么样} ], tools: [ { type: function, function: { name: get_weather, description: 查询指定城市的当前天气, parameters: { type: object, properties: { location: {type: string, description: 城市名如北京}, unit: {type: string, enum: [celsius, fahrenheit]} }, required: [location] } } } ] }模型返回的tool_calls里会带name和arguments你本地执行完再把结果以role: tool的消息回传。这就是 Function Call 的完整闭环。接下来是 MCP 服务端配置。以 Claude Code 为例配置文件通常在~/.claude/settings.json或项目内的.mcp.json。下面是一个接入 TaoToken 通道的 MCP 服务端配置片段{ mcpServers: { taotoken-tools: { command: npx, args: [-y, your-scope/mcp-server], env: { OPENAI_BASE_URL: https://taotoken.net/api, OPENAI_API_KEY: sk-你的实际Key, MODEL_ID: 你的模型ID } } } }注意三件套必须齐全Base URL、Key、Model ID。少任何一个MCP 服务端启动后调用都会失败。如果你用的是 Cline 的 MCP 配置字段名可能略有差异但核心三件套不变。最后是 SKILL.md 模板。SKILLS 的本质是带 frontmatter 的提示词文件放在~/.claude/skills/目录下。下面是一个“文章配图”技能的模板--- name: blog-cover description: 为博客文章生成封面图并上传图床返回可粘贴的图片链接 disable-model-invocation: false --- # 博客配图技能 当用户要求为某篇 Markdown 文章配图时按以下步骤执行 1. 读取文章内容总结出一个不超过 20 字的标题 2. 根据标题生成一张封面图的描述词 3. 调用图片生成工具产出图片 4. 将图片上传到图床拿到外链 5. 把外链以 Markdown 图片语法插入文章顶部 输出格式要求只返回插入后的文章片段不要额外解释。name和description是启动时加载的元数据正文是匹配后才注入的完整内容。这个两阶段加载机制就是 SKILLS 省 token 的关键。4. 逐阶段验证请求与返回结构核对配置写完必须验证否则你不知道问题出在哪一层。先验证 Function Call。用 curl 发请求重点看返回里有没有tool_callscurl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: 你的模型ID, messages: [{role:user,content:北京天气}], tools: [{type:function,function:{name:get_weather,description:查天气,parameters:{type:object,properties:{location:{type:string}},required:[location]}}}] }成功时你会看到choices[0].message.tool_calls[0].function.name等于get_weatherarguments里是{location:北京}。如果finish_reason是tool_calls说明模型正确触发了工具。再验证 MCP。启动 Claude Code 后输入/mcp查看服务端状态正常会列出你配置的taotoken-tools及其工具列表。如果显示 connected 且工具数量大于 0说明 MCP 通道打通。此时你可以直接说“用 taotoken-tools 查一下天气”观察它是否发起call_tool。最后验证 SKILLS。把 SKILL.md 放到~/.claude/skills/blog-cover/目录下重启 Claude Code。输入/skills应该能看到blog-cover出现在列表里。然后说“给这篇文章配图”观察它是否加载了完整技能内容并执行步骤。如果没自动触发用/blog-cover强制调用。三个阶段验证的共同点是都要核对返回结构。Function Call 看tool_callsMCP 看工具列表和call_tool记录SKILLS 看元数据是否加载、正文是否注入。任何一层返回结构不对就往上一层排查。5. 本篇常见错误排查401、local proxy failed、reading choices、OAuth这一节列几个真实会撞上的报错对照着改。第一个401 Unauthorized。九成是 Key 没传对。检查Authorization头是不是Bearer sk-xxx中间有没有多余空格。如果你把 Key 写在 MCP 配置的env里确认 JSON 没有语法错误导致环境变量没注入。还有一种情况是 Key 被禁用或额度耗尽去控制台确认状态。第二个local proxy failed。这个通常出现在 MCP 服务端启动阶段说明本地进程没起来或者端口被占。先单独在终端跑一遍command和args指定的命令看它能不能正常启动。如果是 npx 拉包失败检查网络和包名是否正确。Base URL 写错也会导致启动后首次调用就失败确认是https://taotoken.net/api而不是别的路径。第三个reading choices 相关报错比如cannot read property choices of undefined。这说明返回体结构和你预期的不一样多半是请求根本没成功返回的是错误对象。打印完整响应体看error.message是什么。常见原因是模型 ID 写错或者请求体 JSON 格式不合法。第四个OAuth 相关报错。如果你用的是 Codex CLI鉴权文件在~/.codex/auth.json。这个文件里的字段要和你的通道匹配Base URL、Key、Model ID 三件套缺一不可。OAuth 报错时先删掉 auth.json 重新生成确认写入的字段完整。如果同时装了多个 Agent 工具注意它们的配置文件不要互相覆盖。排查顺序建议先确认 Key 和 Base URL再确认模型 ID最后看请求体结构。大部分问题都出在前两项。6. 语义一致 CTA把三阶段能力接到你的工作流跑通验证之后下一步就是把它接到你日常的工作流里。如果你主要做排障和接入建议先把 API Keys 和接入文档过一遍Key 管理在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 接入细节在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。如果你想先验证模型对 Function Call 的支持程度直接去模型对话页面发几条带工具的请求地址是 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。长期跑编码类 Agent 或需要高频调用的话Coding Plan 更合适地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。Claude Code 用户如果要做 Anthropic 风格接入参考 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite 。把三件套配好之后Function Call、MCP、SKILLS 三个阶段就能在同一条通道上跑通不用来回切换鉴权。最后给一个实用建议把你最常重复的那套操作写成 SKILL.md先手动调用几次确认流程稳定再打开自动匹配。SKILLS 的匹配完全由模型判断存在概率性不触发的情况关键规则可以同时写进 CLAUDE.md 兜底。这样你的 Agent 能力扩展就从“能用”走到“好用”了。