【大模型必备】从Function Calling到MCP再到Skills:一文读懂AI三大核心技术,建议收藏

发布时间:2026/10/15 18:13:41
【大模型必备】从Function Calling到MCP再到Skills:一文读懂AI三大核心技术,建议收藏 1. 从一次“工具调用失败”说起Function Calling、MCP、Skills 到底谁管谁如果你正在搭 AI Agent大概率遇到过这种场景模型明明支持 Function Calling你也在请求里塞了 tools 定义可它要么不调用要么参数拼错要么连续调用三个工具后把中间结果丢了。你开始怀疑是不是模型不行换了个更大的模型结果只是错得慢一点。问题往往不在模型本身而在于你把三个不同层次的东西混在一起理解了。Function Calling 是模型的原生能力负责“把自然语言翻译成一次结构化调用”MCP 是协议层负责“让工具以统一方式被描述、被发现、被连接”Skills 是编排层负责“告诉模型先做什么、再做什么、什么条件下停”。三者不是替代关系而是从下到上的三层协作。我试过在一个客服 Agent 里只靠 Function Calling 硬写 12 个工具结果模型在“查订单→判断是否超时→发起退款→通知用户”这条链路上第三步就开始乱序。后来把工具注册收敛到 MCP Server再用一份 Skill 文档约束执行顺序同样的模型任务完成率从 41% 提到 86%。这不是模型变强了是编排层补上了。这篇文章面向正在搭 Agent 的开发者主线就是“工具调用能力如何一步步演进”。你会拿到一份可复制的 MCP 服务端配置、一份 Skills 目录结构模板以及用 curl 验证工具注册与调用链路的完整动作。读完你可以在自己项目里跑通从单次函数调用到多技能编排的完整流程。先给一个最简对照帮你建立坐标层次解决什么问题典型载体谁在消费Function Calling自然语言→结构化调用tools 数组 / JSON Schema模型原生MCP工具如何被统一描述与连接MCP Server 协议Host/ClientSkills多工具按什么顺序执行Markdown 脚本模型编排记住一句话Function Calling 是“会打电话”MCP 是“电话簿和接线标准”Skills 是“通话脚本”。下面逐层拆开每层都给可落地的配置和验证命令。2. TaoToken 前置把模型入口和工具入口分开配在动手写 MCP Server 之前先把模型调用入口固定下来。很多“工具调用失败”的根因其实是模型请求根本没发出去或者发到了一个不支持 tools 参数的端点。你需要一个稳定的、兼容 OpenAI 风格 tools 字段的入口。TaoToken 在这里的角色是模型侧的统一入口。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。注意 API 地址不带 UTM 参数配置时直接用这个基址。你需要准备三件套缺一不可Base URLhttps://taotoken.net/apiAPI Key在控制台创建地址 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewriteModel ID选一个明确支持 Function Calling 的模型比如 claude 系列或 gpt 系列中带 tools 能力的版本如果你用的是 Claude Code 这类编码 Agent接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有 Base URL 和 Key 的填写位置。想先验证模型是否真的会调工具可以直接在模型对话页试 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。这里有个容易踩的坑Base URL 末尾不要多加/v1或/chat/completions很多 SDK 会自己拼路径你多写一层就变成/v1/v1/chat/completions返回 404 而不是 401反而更难排查。正确写法就是https://taotoken.net/api让 SDK 去补全。配好之后先用一个最小请求确认 tools 字段被接受。下面这段 curl 只做一件事让模型在“查天气”和“算加法”两个工具里选一个。如果返回里出现tool_calls说明模型侧 Function Calling 通了。curl -s https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-3-5-sonnet, messages: [{role: user, content: 北京今天天气怎么样}], tools: [{ type: function, function: { name: get_weather, description: 查询指定城市天气, parameters: { type: object, properties: {city: {type: string}}, required: [city] } } }], tool_choice: auto }返回里如果看到finish_reason: tool_calls和name: get_weather模型侧就绪。这一步没过后面 MCP 和 Skills 都无从谈起因为编排层最终还是要模型来决策。3. 可复制配置MCP Server 注册 Skills 目录模板这一节给两份可直接落地的配置。第一份是 MCP Server 的注册配置第二份是 Skills 目录结构模板。两份都按“路径与原文一致”的原则写你复制后改路径即可。先看 MCP Server 配置。不同 Host 的配置文件位置不同这里给一个通用的 JSON 结构Claude Desktop 用claude_desktop_config.jsonCline 用 MCP 设置面板Codex 用auth.json同级的配置。核心字段是command、args、env三件套。{ mcpServers: { order-tools: { command: node, args: [/Users/you/projects/mcp-order-server/dist/index.js], env: { ORDER_API_BASE: https://internal.example.com/api, ORDER_API_KEY: your-service-key } }, refund-tools: { command: python, args: [-m, mcp_refund_server], env: { REFUND_API_BASE: https://internal.example.com/refund, REFUND_API_KEY: your-refund-key } } } }注意command和args必须能被 Host 进程直接执行。如果你用npx或uvx要确认 Host 的环境变量 PATH 里有对应可执行文件否则会报spawn ENOENT。我踩过的坑是终端里node能用但 Host 启动时用的是 GUI 环境PATH 不含 nvm 路径结果 MCP Server 一直起不来。解决办法是在command里写绝对路径比如/Users/you/.nvm/versions/node/v20.11.0/bin/node。再看 Skills 目录模板。Skills 的本质是一份 Markdown 指令加可选脚本放在约定目录下被模型读取。推荐结构如下skills/ ├── refund-flow/ │ ├── SKILL.md │ ├── scripts/ │ │ └── check_timeout.py │ └── references/ │ └── refund-policy.md ├── order-query/ │ ├── SKILL.md │ └── scripts/ │ └── format_order.py └── notify-user/ └── SKILL.mdSKILL.md里写清楚触发条件、执行顺序、每步调用哪个 MCP 工具、失败怎么回退。给一个refund-flow/SKILL.md的片段--- name: refund-flow description: 处理用户退款请求按顺序校验订单、判断超时、发起退款、通知用户 --- ## 触发条件 用户表达退款意图且已提供订单号。 ## 执行顺序 1. 调用 order-tools.query_order 获取订单详情 2. 调用 refund-tools.check_timeout 判断是否在退款窗口内 3. 若超时调用 refund-tools.create_refund 4. 调用 notify-user.send 通知用户结果 ## 约束 - 第 2 步返回 timeouttrue 时禁止执行第 3 步 - 任一步失败跳到 notify-user.send 并说明失败原因这份模板的关键在于“执行顺序”和“约束”两段。Function Calling 和 MCP 都不会替你保证顺序只有 Skills 用自然语言把顺序和边界写死模型才会按流程走。你可以把skills/目录放在项目根目录然后在 Host 配置里指向它。4. 验证请求用 curl 跑通工具注册与调用链路配置写完必须验证否则你永远不知道是 MCP Server 没起来还是工具没注册还是模型没选对工具。验证分三步先确认 MCP Server 进程能独立跑再确认工具列表能被拉取最后确认模型能通过 MCP 调用工具。第一步独立启动 MCP Server确认它不报错。以 Node 版为例node /Users/you/projects/mcp-order-server/dist/index.js如果进程挂起等待 stdin说明启动正常MCP Server 通过 stdio 通信。如果立刻退出并打印堆栈先解决依赖或路径问题。第二步用 curl 直接打模型入口把 MCP 工具以 tools 形式传进去验证模型能否选中正确工具。这一步模拟的是 Host 的行为curl -s https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-3-5-sonnet, messages: [{role: user, content: 订单 A123 我要退款}], tools: [ { type: function, function: { name: query_order, description: 根据订单号查询订单详情, parameters: { type: object, properties: {order_id: {type: string}}, required: [order_id] } } }, { type: function, function: { name: check_timeout, description: 判断订单是否在退款窗口内, parameters: { type: object, properties: {order_id: {type: string}}, required: [order_id] } } } ], tool_choice: auto }预期返回里tool_calls的第一个name应该是query_order参数order_id为A123。如果模型直接返回自然语言而没有tool_calls检查模型是否支持 tools以及tool_choice是否被服务端忽略。第三步把工具执行结果回填验证多轮链路。把上一步的tool_calls结果作为role: tool消息追加再请求一次curl -s https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-3-5-sonnet, messages: [ {role: user, content: 订单 A123 我要退款}, {role: assistant, content: null, tool_calls: [{id: call_1, type: function, function: {name: query_order, arguments: {\order_id\:\A123\}}}]}, {role: tool, tool_call_id: call_1, content: {\order_id\:\A123\,\status\:\paid\,\created_at\:\2025-01-10\}} ], tools: [{type: function, function: {name: check_timeout, description: 判断订单是否在退款窗口内, parameters: {type: object, properties: {order_id: {type: string}}, required: [order_id]}}}], tool_choice: auto }这次预期tool_calls的name是check_timeout。如果模型跳过了这一步直接生成退款话术说明它没有遵守顺序这正是需要 Skills 介入的信号。把refund-flow/SKILL.md的内容作为 system 消息注入再跑一次你会看到模型开始按“查询→校验→退款→通知”的顺序走。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth工具调用链路上有四类报错出现频率最高逐个对照。第一类401 Unauthorized。表现是请求直接返回{error:{message:Invalid API key}}。原因通常是 Key 没带上、带错、或者 Base URL 和 Key 不匹配。检查Authorization: Bearer后面有没有多余空格检查 Key 是否在控制台被禁用。如果你把 Key 写进env但 Host 没读到也会 401。用echo $TAOTOKEN_API_KEY确认环境变量在当前 shell 可见。第二类local proxy failed。表现是 Host 日志里出现MCP server failed to start: local proxy failed或connection refused。这通常不是模型侧问题而是 MCP Server 进程没起来。检查command路径是否绝对路径、args里的文件是否存在、env里的变量是否被 Server 读取。一个快速定位方法把command和args拼成一条命令在终端手动执行看是否报错。终端能跑通、Host 跑不通基本是 PATH 或工作目录差异。第三类reading choices。表现是返回Cannot read properties of undefined (reading choices)。这是客户端代码在解析响应时响应体里没有choices字段。常见原因是请求打到了错误端点比如把 Base URL 写成了https://taotoken.net/api/v1SDK 又拼了一层实际请求路径不对返回的是 HTML 错误页而不是 JSON。解决方法是把 Base URL 改回https://taotoken.net/api并打印原始响应体确认。第四类OAuth 相关报错。表现是OAuth token expired或invalid_grant。如果你用的是 Claude Code 或 Codex 这类带 OAuth 的客户端注意区分“模型 API Key”和“客户端 OAuth 凭证”。模型调用用 API Key客户端登录用 OAuth两者不要混。Codex 的auth.json里存的是 OAuth 凭证而 MCP Server 的env里应该放服务自身的 Key。把两者写反就会出现“OAuth 能登录但工具调用 401”的怪象。排查顺序建议固定为先看 HTTP 状态码再看响应体原始内容再看 Host 日志里 MCP Server 的启动输出最后看模型返回的finish_reason。四步走完90% 的问题能定位。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 对照路径和字段。如果你想先验证模型是否真的会按 Skills 顺序调用工具去模型对话页手动试一轮 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。把refund-flow/SKILL.md的内容贴进 system 提示看模型是否按“查询→校验→退款→通知”走。如果你要做长期编码 Agent 或多技能编排直接看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。Claude Code 的接入细节在 https://taotoken.net/doc/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode_anthropicutm_campaignrewrite 里面有 Base URL、Key、Model ID 三件套的填写位置。最后留一个实用技巧把skills/目录纳入 Git 管理每次调整SKILL.md的执行顺序都提交一次。当模型行为回退时你能快速 diff 出是哪条约束被改动了。工具调用链路的稳定性靠的不是更大的模型而是可版本化的编排指令。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询