MCP

MCP和Agent Skills、Function Calling混在一起用,三者的职责边界到底怎么划才不打架?

👤 为我痴狂 👁 31 阅读 ❤ 0 点赞 ➦ 0 分享 📅 2026-11-03
首页› AI› MCP› 正文
MCP和Agent Skills、Function Calling混在一起用,三者的职责边界到底怎么划才不打架?

协议契约 · 能力封装 · 模型调用:三层分工模型与工程落地路径

摘要:MCP(Model Context Protocol)、Agent Skills 与 Function Calling 常被混为一谈,导致工具清单膨胀、上下文污染与调用链失控。本文提出一条贯穿全文的分析主线:三者不是替代关系,而是“契约层—编排层—执行层”的分层协作关系。契约层由 MCP 承担,负责跨进程、跨组织的资源与工具暴露;编排层由 Agent Skills 承担,负责把领域知识、流程与策略固化为可复用的能力包;执行层由 Function Calling 承担,负责把模型意图转成结构化参数并触发具体调用。文章给出可操作的边界判据、组合模式、延迟与安全边界条件,并附评测数据与治理清单,供工程团队直接对照落地。

目录

一、导语:一个真实的生产事故引出的边界问题

某中型 SaaS 团队在 2024 年底上线了一个客服工单 Agent。架构上,他们把内部 CRM 的查询接口同时注册成了 MCP Server 的 tool、Agent Skill 里的“客户画像”步骤,以及模型侧 Function Calling 的 schema。上线第三周,一次“查询客户近三个月订单”的请求触发了 17 次工具调用,其中 9 次是同一数据的重复拉取,上下文窗口在第二轮就被撑满,模型开始丢参数、编造订单号。事后复盘,根因不是模型能力不足,而是同一能力被三个抽象层同时声明,系统没有唯一的事实来源。

这个案例并非孤例。随着 MCP 在 2024 年 11 月由 Anthropic 开源并迅速被主流 IDE 与 Agent 框架采纳,Agent Skills 作为“可复用能力包”的工程实践在 2025 年快速铺开,而 Function Calling 自 2023 年 OpenAI 推出 tools 参数以来已是事实标准,三套机制在同一代码库里并存几乎成为默认状态。问题在于,三者都涉及“让模型调用外部能力”,表面语义高度重叠,工程上却处在完全不同的抽象层级。笔者认为,边界不清的本质,是把“协议”“封装”“调用”三个正交维度压缩成了一个维度来讨论。本文要做的,就是把这个压缩解开。

需要先说明本文的分析立场:不追求给三者排一个“谁更先进”的座次,而是回答一个工程问题——在给定团队规模、部署形态与合规约束下,某个具体能力应该被放在哪一层声明、由谁维护、以什么粒度暴露。这个问题的答案直接决定了系统的可维护性、延迟预算与安全攻击面。

二、背景与问题定义:三个概念为何总被混用

2.1 三个概念的准确定义

先给出本文采用的严格定义,后续所有论证以此为准。

Function Calling:指大语言模型在推理时输出结构化的函数调用意图(函数名 + JSON 参数),由宿主程序解析并执行,再将结果回填到对话上下文。它的本质是模型输出格式的一种约束机制,规范载体是各家 API 的 tools / function schema,典型如 OpenAI 的 tools 参数、Anthropic 的 tool_use 内容块、Google Gemini 的 functionDeclarations。它不规定工具如何被发现、如何被托管,只规定“模型如何表达要调用什么”。

MCP(Model Context Protocol):一个基于 JSON-RPC 2.0 的开放协议,用于在 LLM 应用(Host)与外部能力提供方(Server)之间标准化地暴露 resources、prompts 与 tools。它定义了传输层(stdio、Streamable HTTP)、能力协商(initialize 握手)、以及工具发现(tools/list)与调用(tools/call)的消息格式。其官方规范由 Anthropic 维护并开源,2025 年已推进到多轮修订版本,社区 SDK 覆盖 Python、TypeScript、Java、Go 等语言。

Agent Skills:一类把“领域知识 + 操作流程 + 工具组合 + 触发条件”打包为可复用单元的工程范式。不同厂商叫法不同(如技能包、能力插件、子 Agent 定义),但共同特征是面向任务而非面向接口:一个 Skill 通常对应“处理退款申请”“生成周报”这类完整任务,内部可能编排多个工具调用,并携带提示词、示例、校验规则与失败回退策略。

2.2 混用的四个典型症状

在梳理了公开技术讨论与工程实践后,可以归纳出四类高频混用症状,它们构成了本文的问题清单。

症状 表现 直接后果
重复声明同一接口在 MCP tool、Skill 步骤、Function schema 中各写一遍参数漂移、版本不一致
粒度错配把“下单+支付+通知”塞进单个 Function模型无法局部重试,失败即全链路回滚
上下文污染把 80 个工具的完整 schema 全量注入 system prompttoken 成本上升、选择准确率下降
安全越权Skill 内部绕过 MCP 的鉴权直接调内部 API审计断链、权限模型失效

本文评述:这四类症状的共同根源在于缺少一个显式的分层契约。工程团队往往先写代码再补架构,能力一旦被声明两次,后续任何一次接口变更都会引发连锁修改。因此边界的划分必须在能力注册阶段完成,而不是在故障复盘时补救。

2.3 为什么现在必须解决

三个趋势让边界问题从“设计洁癖”变成“工程刚需”。其一,MCP 的跨组织复用特性意味着一个 Server 可能同时服务多个 Host,接口契约的稳定性要求显著高于单体内调用。其二,Agent Skills 的复用诉求要求能力包可以跨模型、跨框架迁移,这倒逼 Skill 层与具体模型的 Function Calling 格式解耦。其三,2025 年以来主流模型普遍支持并行工具调用与结构化输出,工具数量与调用扇出同步上升,上下文预算成为硬约束。三者叠加,使得“在哪一层声明”直接决定系统能否规模化。

三、原理与技术路线:三层分工模型的提出

3.1 核心命题:三个正交维度

本文的独创性分析主线可以概括为一句话:MCP 解决“能力如何被跨边界发现与托管”,Agent Skills 解决“任务如何被组织与复用”,Function Calling 解决“意图如何被结构化表达与执行”。三者分别对应契约维度、编排维度、执行维度,彼此正交,不存在谁取代谁的问题。

用一个类比帮助理解(类比仅用于建立直觉,不作为论证依据):MCP 像 USB 协议,规定设备如何被枚举、如何传输数据;Agent Skills 像一台整机的功能面板,把若干外设组合成“打印一份文档”这样的完整操作;Function Calling 则像操作系统发出的具体系统调用,携带精确参数。拔掉任何一层,系统都能勉强运转,但会以可维护性或效率为代价。

判据一句话版:需要跨进程/跨组织暴露、且要被多个 Host 复用的能力,放 MCP;需要携带领域流程、示例与回退策略的完整任务,放 Skill;只是把模型意图转成参数并立即执行的原子操作,放 Function Calling。

3.2 三层模型的职责矩阵

下表给出三层在关键工程属性上的分工,这是后续所有落地决策的对照表。

属性 MCP(契约层) Agent Skills(编排层) Function Calling(执行层)
抽象对象资源与工具任务与流程单次调用意图
生命周期长(服务级)中(版本级)短(请求级)
状态管理连接级会话任务级上下文无状态
鉴权位置Server 侧强制策略声明通常透传
变更影响面所有 Host引用该 Skill 的流程当前会话
典型载体JSON-RPC Server技能描述文件 + 提示词 + 脚本tools schema

本文评述:这张矩阵最有价值的列是“变更影响面”。工程实践中,绝大多数架构事故源于把高影响面的能力放在了低影响面的层里声明——例如把内部数据库直连写成 Function,一旦表结构变更,所有会话的 schema 都要同步,而模型侧的 schema 缓存往往滞后。把这类能力上移到 MCP Server,变更就被收敛在服务端。

3.3 数据流:一次请求如何穿过三层

为了把抽象模型落到可观测的链路上,下面用一段伪代码描述一次“处理退款申请”请求在三层之间的流转。注意各层的输入输出边界。

# 第 1 层:Host 通过 MCP 发现能力(契约层)
mcp_client.initialize()
tools = mcp_client.list_tools(server="crm-server")   # 返回 tools/list 结果
skills = skill_registry.match(task="refund_request")  # 编排层匹配

# 第 2 层:Skill 把任务展开为步骤计划(编排层)
plan = skills["refund"].expand(context=session)
# plan = [verify_order, check_policy, submit_refund, notify_user]

# 第 3 层:每一步由模型产生 Function Calling 意图(执行层)
for step in plan:
    intent = llm.invoke(
        messages=session.messages,
        tools=[t for t in tools if t.name in step.allowed_tools]
    )
    if intent.type == "tool_use":
        result = mcp_client.call_tool(intent.name, intent.arguments)  # 回到契约层执行
        session.append(result)

这段伪代码揭示了一个容易被忽略的事实:Function Calling 并不直接执行工具,它只产生意图;真正的执行发生在 MCP 的 tools/call 上。许多团队把“模型输出 tool_use”误认为“工具已执行”,在日志里留下断链,排障时无法区分“模型没选对工具”与“工具执行失败”。把执行统一收敛到 MCP 客户端,是获得完整调用链的最低成本手段。

3.4 为什么不是“一个层包打天下”

有读者会问:既然 MCP 已经能暴露工具,为什么还需要 Skill?既然 Skill 能编排,为什么还需要 Function Calling?这两个问题的答案分别对应两类边界条件。

第一,MCP 的协议定位是能力暴露而非任务编排。它的 tools/list 返回的是原子能力清单,不携带“何时该用、按什么顺序用、失败怎么办”的领域知识。把这些知识塞进 Server 的 description 字段,会让协议承载它不擅长的语义,且无法被不同 Host 以不同策略复用。本文评述:协议应保持“薄”,领域知识应保持“可替换”,这是分层的第一性理由。

第二,Skill 的复用前提是与具体模型的调用格式解耦。如果 Skill 内部直接写死某家模型的 function schema,迁移模型时整个 Skill 都要重写。正确做法是 Skill 只声明“需要哪些能力、按什么约束调用”,由执行层在运行时适配为当前模型的 tools 格式。这一解耦在 2025 年多模型并存的环境下尤为关键。

四、关键数据与工程案例:边界判据的量化验证

4.1 工具数量与选择准确率的关系

边界划分的一个直接收益是控制注入模型的工具数量。业界已有若干公开评测支持“工具越多、选择越难”的判断。Berkeley Function Calling Leaderboard(BFCL)自 2024 年起持续跟踪多轮、多工具场景下的函数调用准确率,其公开结果显示:在单轮简单场景中,主流模型准确率普遍较高;但在多工具、需要区分相似工具名的场景下,准确率出现明显下滑。另一项常被引用的工作来自工具检索方向的研究(如 ToolLLM 及其后续的工具检索增强方法),其结论是在工具库规模超过数十个后,引入检索式工具筛选可以显著降低误选率。

需要说明的是,上述评测的具体数值随模型版本与评测集版本变化较大,本文不引用单一具体百分比作为定论,而采用其稳定的定性结论:工具数量与选择准确率呈负相关,且相似语义工具之间的干扰效应强于数量本身的线性影响。本文评述:这意味着边界划分的目标不应只是“减少工具数”,更要“减少语义重叠的工具同层暴露”。把同一业务域的多个原子操作收敛为一个 Skill,让模型面对的是任务级选项而非接口级选项,是更有效的降干扰手段。

4.2 上下文成本的结构化测算

下面给出一个可复现的测算框架(数据为按公开 schema 规模估算的模拟数据,用于说明量级关系,非实测基准)。假设每个工具的 schema 平均 120 token,系统提示与示例占 800 token,上下文窗口 128k。

方案 暴露工具数 schema token 占窗口比例
全量注入80约 9600约 7.5%
Skill 收敛后12约 1440约 1.1%
检索式动态注入5–8约 600–960约 0.5%–0.75%

这张表的价值不在于精确数字,而在于揭示一个工程事实:工具 schema 的 token 开销在长会话中会被反复计入每一轮请求,全量注入的边际成本随轮次线性累积。把工具按 Skill 收敛、再按任务动态注入,是把这部分成本从“每轮固定支出”变为“按需支出”的关键手段。笔者认为,在 128k 窗口普及的当下,7.5% 看似可接受,但在需要保留长文档、多轮工具结果的实际场景中,这部分预算往往正是压垮上下文的最后一根稻草。

4.3 案例:把 17 次调用压到 5 次

回到导语中的客服工单案例。重构方案按三层模型执行:第一步,把 CRM 的 9 个查询接口收敛为一个 MCP Server,统一鉴权与分页,对外只暴露 4 个 tool;第二步,把“客户画像”“订单核验”“退款政策匹配”写成三个 Skill,每个 Skill 声明其允许调用的 tool 子集与失败回退;第三步,执行层只注入当前 Skill 声明的 tool 子集,模型不再看到全量接口。

重构后,同一请求的调用次数从 17 次降至 5 次,重复拉取消失,上下文在第三轮仍有充足余量。需要说明,这是该团队内部复盘数据,非公开基准,本文引用仅用于说明机制,不作为普适性能承诺。本文评述:这个案例的可迁移经验是“收敛接口 + 声明子集 + 运行时注入”三步,它与具体模型无关,换任何支持 Function Calling 的模型都能复现。

4.4 延迟分解:三层各自的预算

边界划分还影响延迟预算的分配。一次完整的工具调用链路通常包含:模型推理(产生意图)、协议往返(MCP 传输)、工具执行(后端服务)、结果回填(再次推理)。其中协议往返在 stdio 传输下通常为亚毫秒级,在 Streamable HTTP 下受网络 RTT 支配;工具执行取决于后端。本文评述:把能力放在 MCP 层,等于显式承认了一次协议往返的成本;把它放在进程内 Function 直调,则省去该往返但牺牲了跨 Host 复用。这个权衡应在架构评审时以数字形式记录,而非凭直觉决定。

五、对比与局限:组合模式、反模式与边界条件

5.1 四种组合模式

三层模型在落地时并非只有一种组合方式。根据团队规模与部署形态,可以归纳出四种模式。

模式 适用场景 代价
纯 Function单进程、工具少、快速验证难以复用,工具增多后失控
MCP + Function多 Host 共享后端能力缺少任务级编排,模型负担重
Skill + Function单组织内、流程固定能力无法跨组织复用
三层完整多团队、多模型、需审计初期建设成本最高

本文评述:模式选择应遵循“按需上移”原则——先以纯 Function 起步,当出现第二个 Host 需要复用同一能力时上移到 MCP,当同一任务被反复编排且需要携带领域知识时上移到 Skill。过早引入完整三层,会让小团队陷入协议维护的泥潭;过晚则会在工具膨胀后付出更高的重构成本。

5.2 五个必须警惕的反模式

反模式一:Skill 内直连数据库。绕过 MCP 的鉴权与审计,权限模型失效。正确做法是 Skill 只声明需要的能力,执行仍走 MCP。

反模式二:把 MCP Server 当业务逻辑层。在 Server 里实现复杂编排,导致协议层承载领域语义,无法被不同 Host 以不同策略复用。

反模式三:Function schema 与 MCP tool schema 手工双写。必然漂移。应由构建流程从 MCP 的 tools/list 自动生成 Function schema。

反模式四:Skill 粒度过细。把每个接口都包成 Skill,等于没有编排,反而增加匹配开销。Skill 应面向任务,一个 Skill 通常对应 3–8 个步骤。

反模式五:忽略失败回退。Skill 只声明成功路径,执行层遇到工具失败时模型反复重试。Skill 必须显式声明重试上限与降级路径。

5.3 边界条件:三层模型何时不适用

任何模型都有适用边界。以下三类场景中,强行套用三层模型会得不偿失。其一,极低延迟场景:如实时语音交互中的工具调用,协议往返与多次推理的叠加可能超出预算,此时进程内直调更合适。其二,强合规封闭环境:MCP 的跨进程特性在某些内网隔离要求下难以部署,需退化为进程内注册。其三,工具数极少且稳定:少于 5 个工具、半年不变更的系统,引入三层带来的维护成本高于收益。

本文评述:边界条件的明确,恰恰是模型可信的标志。工程文章若只讲“应该怎么做”而不讲“什么时候不该这么做”,其结论就无法被证伪,也就失去了工程价值。

六、落地路径:从清单到代码的六步法

6.1 六步操作路径

下面给出可直接执行的六步法,每一步都有明确的产出物与验收标准。

第一步:能力盘点。列出当前所有外部调用,标注调用方数量、变更频率、是否跨组织。产出物是一张能力清单表。验收标准:每个能力都有唯一标识与负责人。

第二步:按判据分层。对每个能力依次回答三个问题:是否被两个以上 Host 复用?是否携带领域流程?是否只是原子操作?据此归入 MCP、Skill 或 Function。验收标准:无能力被重复声明。

第三步:定义契约。为 MCP 层编写 tools/list 的 schema,明确参数类型、必填项、错误码。验收标准:schema 通过 JSON Schema 校验,且与后端接口一一对应。

第四步:编写 Skill。每个 Skill 声明触发条件、允许调用的 tool 子集、步骤顺序、重试与降级策略。验收标准:Skill 可在不修改代码的情况下调整步骤顺序。

第五步:生成执行层 schema。从 MCP 的 tools/list 自动生成当前模型的 Function schema,按 Skill 声明的子集动态注入。验收标准:schema 生成可复现,无手工双写。

第六步:埋点与回归。在协议往返、工具执行、模型推理三处埋点,建立调用链追踪;用固定评测集做回归。验收标准:任一失败可定位到具体层。

6.2 一个最小可运行的 Skill 声明示例

下面给出一个与模型无关的 Skill 声明示例,注意它不包含任何厂商特定的 function schema,只声明能力需求与约束。

name: refund_request
trigger: "用户要求退款或查询退款进度"
allowed_tools: [verify_order, check_policy, submit_refund]
steps:
  - id: verify
    tool: verify_order
    on_fail: {retry: 1, fallback: ask_user_for_order_id}
  - id: policy
    tool: check_policy
    depends_on: verify
  - id: submit
    tool: submit_refund
    depends_on: policy
    guard: "policy.refundable == true"
    on_fail: {retry: 0, fallback: escalate_to_human}
output: "退款单号与预计到账时间"

本文评述:这份声明的关键设计在于 allowed_tools 与 guard 两个字段。前者把工具子集收敛到执行层,直接降低模型的选择空间;后者把业务规则前置为可执行断言,避免模型在“是否可退款”上自由发挥。这两点是 Skill 区别于“提示词模板”的实质所在。

6.3 治理清单

落地之后,需要一套持续治理机制防止边界再次模糊。建议纳入日常评审的检查项包括:新增能力是否已登记到能力清单;是否存在同一能力的多层声明;Skill 的 allowed_tools 是否随 MCP 变更同步更新;执行层 schema 是否仍由自动生成而非手工维护;调用链埋点是否覆盖三层。本文评述:治理清单的价值在于把架构约束变成可检查的条目,而不是停留在文档里的原则。

6.4 拓展学习资源

以下链接供进一步查阅,均在新窗口打开:

七、结论与展望

回到标题的问题:三者混在一起用会不会打架?答案是,只要不把它们放在同一抽象层声明,就不会打架。本文提出的三层分工模型——MCP 管契约、Skill 管编排、Function Calling 管执行——提供了一条可操作、可验证的边界判据。它的核心不是技术选型,而是把“能力在哪一层被声明、由谁维护、变更影响谁”这三个问题显式化。

展望未来,有三个方向值得关注。其一,MCP 生态正在向注册中心与能力发现演进,若出现标准化的能力目录,Skill 的匹配可以从静态声明走向动态检索。其二,多模型并存推动 Skill 描述格式的标准化,业界已有将技能声明与具体模型解耦的尝试,这会让“一次编写、多模型执行”成为常态。其三,工具调用的可观测性正在从应用侧埋点走向协议内建,若 MCP 在规范层引入调用链追踪字段,三层之间的排障成本将显著下降。

笔者认为,无论协议如何演进,分层思维本身不会过时。工具会变、模型会换,但“契约与编排分离、编排与执行分离”这条原则,是应对复杂度的稳定锚点。工程团队真正需要沉淀的,不是某套具体实现,而是这套判断能力。

主要参考文献

  1. Anthropic. Model Context Protocol Specification. 2024–2025. https://modelcontextprotocol.io/
  2. OpenAI. Function Calling Guide: tools and structured outputs. 2023–2025. https://platform.openai.com/docs/guides/function-calling
  3. Patil S G, Zhang T, Wang X, et al. The Berkeley Function Calling Leaderboard (BFCL): From Tool Use to Agentic Evaluation of Large Language Models. 2024–2025. https://gorilla.cs.berkeley.edu/leaderboard.html
  4. Qin Y, Liang S, Ye Y, et al. ToolLLM: Facilitating Large Language Models to Master 16000+ Real-world APIs. ICLR 2024.
  5. Schick T, Dwivedi-Yu J, Dessì R, et al. Toolformer: Language Models Can Teach Themselves to Use Tools. NeurIPS 2023.
  6. Yao S, Zhao J, Yu D, et al. ReAct: Synergizing Reasoning and Acting in Language Models. ICLR 2023.
  7. Anthropic. Building Effective Agents. 2024. https://www.anthropic.com/engineering
  8. Lewis P, Perez E, Piktus A, et al. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. NeurIPS 2020.

说明:本文参考文献与资料累计查阅逾 60 篇(含协议规范、官方文档、评测榜单、学术论文与工程博客),其中近三年(2023–2025)文献占比超过 50%。上文仅列出 8 篇主要参考文献。文中涉及的上下文成本测算为按公开 schema 规模估算的模拟数据,已在正文标注;案例数据来自团队内部复盘,非公开基准。

文章声明:本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。
内容仅供学习参考。如需引用,请以原始文献为准。  全文约 6800 字  |  参考文献 60+ 篇(主要 8 篇)
🔒 复制本站文章内容需登录并达到 L3。当前:未登录

分享到

💬
微信
📷
朋友圈
🐧
QQ好友
🌐
QQ空间
👁
微博
📌
钉钉
🔗
复制链接
📑
复制图文

微信扫一扫分享

打开微信「扫一扫」,扫描二维码后在微信中分享给好友或朋友圈。

💬 评论 (0)

评论功能已关闭

⏸️ 本站暂未开放评论功能,不能进行评论,此为规划的后续开发预留
首页| 关于本网| 网站声明| 联系我们| 网站纠错| 服务| 网站地图
黔ICP备19010680号-1  |  邮箱:six528528@163.com
贵公网安备 52010302001819号
Copyright 2019-2026 http://www.databrush.com/ All rights reserved.
QQ
QQ扫一扫
Logo
DBN数据刷