当用户让 AI "查询订单并退款"、"读取仓库后修复测试"时,模型需要的不只是生成一段文字,还需要请求外部系统执行动作。这里会同时出现 Tool Calling 和 MCP,但它们解决的不是同一个问题。

Tool Calling 是模型与宿主应用之间的调用约定:模型选择工具,并生成结构化参数。MCP 是宿主应用与工具服务之间的开放协议:客户端发现、调用并管理这些工具。

先区分两个层次

概念 解决的问题 主要参与者
Tool Calling / Function Calling 模型该选哪个工具,传什么参数 LLM 与宿主应用
MCP 工具如何被发现、描述和远程调用 MCP Client 与 MCP Server

Tool Calling 并不要求 MCP。最简单的做法是:应用把一个本地函数的 JSON Schema 直接传给模型,模型返回函数名和参数,应用在进程内执行这个函数。

MCP 也不等于 Tool Calling。MCP Server 除了 tools,还可以暴露 resourcesprompts。是否把一个 MCP 工具交给模型选择,仍然由宿主应用决定;宿主也可以根据固定业务流程直接调用它。

四个角色与完整链路

一次通过 MCP 使用工具的典型链路如下:

用户
  -> 宿主应用(Agent / IDE / 聊天应用)
       -> MCP Client --MCP--> MCP Server
            发现 tools、resources、prompts
       -> LLM
            获得宿主筛选后的工具定义

LLM --结构化 tool call--> 宿主应用
宿主应用 -> MCP Client --MCP tools/call--> MCP Server
MCP Server --结构化结果--> 宿主应用 -> LLM -> 最终回答

关键点是:模型通常不直接连接 MCP Server。 宿主应用同时承担 MCP Client 和执行编排者的职责:它连接服务端、获取能力、控制权限,并把适合当前任务的工具描述提供给模型。

Tool Calling:模型提出调用请求

Tool Calling 中,工具需要先以可机器读取的 Schema 告诉模型。例如,宿主应用可以向模型提供一个搜索订单的工具:

{
  "name": "find_orders",
  "description": "按用户 ID 和时间范围查询订单,仅返回订单摘要。",
  "parameters": {
    "type": "object",
    "properties": {
      "user_id": { "type": "string" },
      "from": { "type": "string", "description": "ISO 8601 日期" },
      "to": { "type": "string", "description": "ISO 8601 日期" }
    },
    "required": ["user_id"]
  }
}

模型决定需要查询时,返回的是一个待执行请求,而不是执行结果:

{
  "name": "find_orders",
  "arguments": {
    "user_id": "u_123",
    "from": "2026-08-01",
    "to": "2026-08-05"
  }
}

宿主应用必须验证工具名和参数、执行调用,并把结果以 tool result 的形式放回对话。模型再基于真实结果组织答案。模型生成的参数始终是不可信输入,不能直接拿去执行 SQL、Shell 或写操作。

MCP:把工具服务变成可连接的能力

如果 find_orders 来自一个 MCP Server,宿主不需要为每个工具手写私有 SDK 或协议适配。MCP Client 在初始化连接后可以列出该服务公开的工具,得到名称、说明和输入 Schema;随后以协议中的 tools/call 调用选中的工具。

1. MCP Client 连接订单 MCP Server
2. Client 获取工具列表和每个工具的 inputSchema
3. 宿主按用户权限、当前任务和风险策略筛选工具
4. 宿主将筛选后的 Schema 交给支持 Tool Calling 的模型
5. 模型请求 find_orders
6. 宿主经 MCP Client 调用 tools/call(name, arguments)
7. Server 返回结构化内容或错误,宿主再交回模型

因此,MCP 的价值不是让模型“突然会调用工具”,而是让工具提供方和 AI 应用之间有一套可复用的连接方式。一个 Server 可被多个支持 MCP 的宿主连接;一个宿主也可以统一接入文件、数据库、CMS、代码仓库等不同服务。

两者怎样配合

阶段 Tool Calling 的职责 MCP 的职责
工具定义 为模型提供名称、用途与参数约束 Server 对外发布工具及其 Schema
工具选择 模型根据用户意图产生调用请求 不参与模型推理与选择
参数校验 宿主校验模型产生的参数 Server 继续校验请求和业务权限
工具执行 宿主决定是否执行、何时执行 Client 与 Server 完成协议调用
结果处理 宿主将结果回传模型继续生成 Server 返回内容、错误或资源引用

MCP 工具的 Schema 往往可以映射为模型 Tool Calling 的 Schema,但这不是机械地全量透传。一个连接到生产环境的 MCP Server 可能暴露几十个工具,宿主应该只向模型暴露当前任务需要、当前用户有权限使用的那一小部分。

工程上最容易遗漏的边界

不要把工具返回内容当作指令

网页、文档、数据库字段和工具错误信息都属于外部不可信数据。它们可以作为模型分析的材料,但不能改变系统提示、权限策略或确认规则。宿主应明确区分“数据”和“控制指令”。

把读取与副作用操作分级

查询订单和执行退款的风险完全不同。对写数据库、删除文件、发送消息、发布内容等操作,应至少做到:

  • 使用最小权限的服务凭据;
  • 校验参数的类型、范围和目标归属;
  • 在执行前展示清晰的操作摘要并要求用户确认;
  • 保存可追踪的审计记录,并为失败提供安全的重试或补偿策略。

控制结果大小与调用次数

工具结果过大时会挤占模型上下文,也会增加泄露敏感信息的风险。工具接口应支持分页、字段白名单和摘要返回;宿主还应限制单轮及整个任务的调用次数、超时时间和预算。

处理失败,而不是伪造成功

调用超时、参数不合法、权限不足时,返回可供模型理解的结构化错误,并由宿主决定是否重试、改用只读降级路径或请求用户补充信息。不要让模型猜测工具执行结果。

何时需要 MCP,何时只用本地函数

本地函数适合工具数量很少、与单一应用强绑定、无需跨进程或跨产品复用的场景,例如在一个后端服务里调用内部的汇率计算函数。

当工具由独立团队维护,或者希望被 IDE、桌面客户端、Agent 平台等多个宿主复用时,MCP 更合适。它减少的是集成层的重复工作,但不替代模型选择、权限控制、确认交互和业务审计。

总结

Tool Calling 让模型能够提出“请调用这个工具,并传入这些参数”;MCP 让宿主能够以统一方式找到并调用工具服务。安全和最终执行权始终属于宿主应用,而不属于模型。