简介:Function Calling 与 MCP 是大模型调用外部工具的两条主流路径:前者由开发者为每个工具硬编码定义与执行逻辑,后者通过开放协议实现工具的动态发现与即插即用。本文从架构、接入方式、生态复用、安全、运维成本等维度系统对比两者差异,结合天气查询等典型场景给出流程拆解、选型建议与迁移注意事项,帮助开发者按业务规模与团队能力做出合适的技术决策。
大模型应用要从“能聊天”走向“能干活”,核心在于工具调用能力:让模型去查天气、检索数据库、调用内部业务接口。目前业界主流的两条路径是:
把两者放在一起比较,主要基于三个现实动因:一是行业趋势,主流桌面 AI 助手、AI 编程编辑器等应用已逐步接入 MCP,工具调用正朝协议化方向演进;二是工程落地的实际痛点,团队手中已有的天气查询、景点推荐、美食检索等工具,究竟继续硬编码在提示词和应用代码里,还是封装成标准服务对外暴露;三是技术选型与能力评估的需要,理解两者的演进关系,有助于判断当前项目该停在哪个阶段、何时升级。
需要强调的是,“MCP 比 FC 更先进”这一说法并不完整。两者不是简单的替代关系,而是不同规模、不同阶段下的两种工程形态,下面逐层展开。
FC 的本质是一个由模型接口约定好的四步循环:
tool_calls;它的特点是:能力内嵌在模型接口里,工具清单完全由应用侧硬编码维护。每新增一个工具,都要同步修改工具定义、参数说明和执行分发逻辑。
MCP 是一个开放协议标准,类比来说,它更像“统一的物理接口标准”:任何工具只要按协议实现为服务器,AI 就能即插即用。其架构由四部分组成:
链路可以概括为:AI 助手(Host)↔ MCP 客户端 ↔ MCP 协议 ↔ MCP 服务器 ↔ 具体工具/数据源。工具的“有哪些、怎么调”由服务器通过协议动态告知,应用侧不再硬编码。
在讨论差异之前,先明确两者的共同基础,这决定了它们不是互斥关系:
FC 是应用内嵌模式:工具定义、执行循环、结果回填全部写在一个应用里,应用与模型接口点对点耦合。MCP 是三层解耦模式:工具以独立服务进程存在,Host 通过客户端经统一协议访问,应用不关心工具的实现细节和数量。
这是原文最核心的判断,值得展开:FC 下每新增一个工具,意味着改代码、改配置、重新测试发布,成本随工具数量线性增长;MCP 下“注册一个工具”等价于“启动一个符合协议的服务器”,Host 自动获取工具列表与调用规范,接入动作从“开发行为”变成了“部署行为”。
FC 的工具逻辑沉淀在各应用代码库中,跨应用复用靠抽公共库或复制粘贴;MCP 的一个天气服务器可以同时被桌面助手、IDE 插件、自研 Agent 等多个 Host 复用,这才是“工具生态”的真正含义——工具供给方与 AI 应用消费方解耦。
FC 上手成本极低,一个函数加一段 Schema 即可运行,适合快速验证;但工具规模扩大后,维护点分散在每处业务代码里。MCP 前期需要理解协议、部署并运维独立服务进程,存在学习曲线;可一旦基础设施就位,新增工具的边际成本很低,长期维护更集中。
FC 的执行代码就在自己应用内,密钥不外泄、边界清晰,但权限控制散落在业务逻辑中。MCP 引入了独立(甚至第三方提供)的服务器进程,必须额外评估:工具来源是否可信、是否遵循最小权限、传输是否加密、调用是否可审计。协议本身不等于安全,安全水平取决于服务器实现与 Host 侧治理。
按通用工程规律:FC 链路短(一次模型请求 + 一次进程内函数执行),延迟构成简单;MCP 多一层协议通信(本地进程间通信或远程调用),链路更长,但换来解耦与扩展性。采用 MCP 需要额外关注服务器进程的可用性、超时与重试策略。
不同模型服务的 FC 接口细节存在差异,跨模型迁移需要写适配层;MCP 在协议层做了统一,只要 Host 支持协议客户端、服务器符合协议规范,底层模型更换时工具侧的改动量更小。
| 对比维度 | Function Calling | MCP |
|---|---|---|
| 定位 | 模型接口的原生能力 | 开放协议 / 交互标准 |
| 架构形态 | 应用内嵌、点对点 | Host-Client-Server 分层解耦 |
| 工具注册 | 开发者硬编码 Schema | 服务器动态暴露、自动发现 |
| 新增工具成本 | 改代码、改配置、重新发布 | 启动/接入新的 MCP 服务器 |
| 工具复用范围 | 单应用内部 | 跨应用、跨 Host 复用 |
| 运维对象 | 应用本身 | 额外的服务器进程与协议链路 |
| 安全边界 | 应用内控制,边界清晰 | 需治理服务器来源、权限与审计 |
| 调用链路 | 短,进程内执行 | 多一层协议通信开销 |
| 跨模型迁移 | 需适配各接口差异 | 协议统一,迁移成本较低 |
| 适用阶段 | 原型验证、少量工具、单应用 | 工具生态化、多端接入、团队协作 |
FC 路径(示意伪代码):
# 1. 在请求中定义工具 schematools = [{"name": "get_weather","description": "查询指定城市的天气","parameters": {"city": "string"}}]# 2. 发起模型请求,模型返回 tool_callsresponse = llm.chat(messages, tools=tools)# 3. 应用捕获 tool_calls,手动执行本地函数for call in response.tool_calls:result = get_weather(call.arguments["city"]) # 每一步都要自己写# 4. 将结果回填给模型,得到最终自然语言回答messages.append({"role": "tool", "content": result})
开发者负责定义、捕获、执行、回填的每一段代码,工具与业务逻辑强绑定。
MCP 路径(示意伪代码):
# 1. 启动一个 MCP 天气服务器,声明暴露的工具@server.tool(name="get_weather", description="查询指定城市的天气")def get_weather(city: str) -> str:return query_weather_api(city)# 2. Host 通过 MCP 客户端连接服务器,自动发现工具列表与调用规范# 3. 模型决定调用 → 协议层路由到服务器 → 执行 → 结果沿协议返回# 应用侧无需编写调用分发与结果回填代码
开发者只需把工具实现为符合协议的服务器;发现、调用、回填由协议链路自动完成。进一步地,可以把景点推荐、美食检索等工具各自封装为独立 MCP 服务器,同一套 Host 即可自由组合调用,无需在提示词里硬编码工具说明。
不给绝对结论,只给条件化判断:
从 FC 迁移到 MCP 的关键点:
日常上手路径:准备通用的服务端运行时环境 → 编写并启动 MCP 服务器 → 借助协议生态提供的调试检查工具确认暴露的工具列表与返回结果 → 接入 Host 验证端到端链路。常见问题包括:服务器进程意外退出导致工具“消失”、工具描述含糊导致模型选错工具、跨网络部署时的传输安全与延迟控制。
一句话概括两者的本质区别:FC 是“模型给出调用意图,代码由你来写”;MCP 是“工具以标准服务形式存在,协议负责发现与调用”。FC 胜在轻量直接,适合小规模、单应用的快速验证;MCP 胜在解耦与生态复用,代表工具调用从“点对点集成”走向“标准化生态”的演进方向,值得纳入技术雷达持续关注。但选型的第一原则始终是业务规模、团队能力与合规要求——规模小求快用 FC,规模大求生态用 MCP,而安全与运维责任,在任何一种机制下都不容缺席。