在现代 LLM 工具生态里,function call 提供了模型“触手可及”的即时工具,而 MCP(Model Context Protocol)则把大量分散的工具与数据源整合成一张可寻址的网络。前者专注于让模型正确地产生“调用意图”,后者专注于把这些意图可靠地路由到正确的服务端点。当两者结合,开发者能够用极小的提示成本为 GPT-4o 或 Claude-3 等模型接入数百个外部能力,并在权限、缓存、并发、版本管理等维度获得工程级别的治理能力。(platform.openai.com, github.com)

背景:function call 机制的定位

function call 由 OpenAI 在 2023 年夏天首先提出,它让模型输出一段结构化 JSON,以声明需要哪个工具、哪些参数。模型本身不会直接执行业务逻辑;真正的 I/O 或状态修改由“外层编排器”按 JSON 描述执行。(platform.openai.com, help.openai.com)
这种设计有三个直接好处:

  • 避免让模型暴露密钥或执行危险指令。

  • 让工具 Schema 用 JSON-Schema 描述,可静态检查。

  • 保留“对话”连续性——模型看到工具返回值后可继续推理。

然而 function call 本质是单次、“模型→调用者”单向的接口规范。它并没有定义工具如何远程部署、如何被发现、如何分布式复用,也没有事务、权限、版本等企业级需求的解决方案。(medium.com)

MCP:面向工具网络的开放协议

Anthropic 在 2024 年底正式开源 MCP,声明目标是“为 AI 工具提供像 HTTP 一样通用的互操作层”。协议拆分为三块:工具注册(tools endpoint)、上下文流(context endpoints,包括 SSE 和 Streaming JSON)、传输抽象(支持 HTTP、WebSocket、stdio 等)。(anthropic.com, modelcontextprotocol.io)
几个核心设计值得注意:

  • 服务发现:每个 MCP 服务器都公开 /tools 路径,返回其拥有的全部工具元数据,客户端可按类型、标签、版本过滤。

  • 传输层松耦合:标准文档直接把 stdio 作为“零依赖传输”,适合把老 CLI 工具瞬间升级为 AI 可调用的 Tool。(github.com)

  • 多路复用:官方 proxy 组件允许把若干 MCP 服务器聚合成单一入口,并提供权限隔离、缓存与负载均衡。(github.com)

社区也快速出现了周边生态:LangChain 发布 mcp-adapters,可把任意 MCP tool 当成 LangGraph/AgentGraph 的 ToolNode;Cursor 与 VSCode 插件把 IDE 指令透过 MCP 送入 Claude。(changelog.langchain.com, github.com)

二者的互补关系

  • function call 关注意图表达:模型产出一个 JSON 对象告诉你“我要调用 echo(text=‘hello’)”。

  • MCP 关注意图执行:给出 echo 的端点、鉴权、并发控制、回调格式,甚至链式编排。
    将两者放在一起,你就得到模型决定要做什么 → MCP 决定这件事去哪做的分工模式。Medium 与 DailyDose of DataScience 的多篇文章都把这种关系比作“助理 vs 运营经理”。(medium.com, dailydoseofds.com)

对开发者的直接收益

  • 零拷贝的工具扩容:不必改提示,直接把新 MCP 服务器接入代理即可暴露新工具。

  • 跨进程/跨语言复用:Python 写的爬虫、Go 写的 PDF 解析,只要包一层 MCP shim,GPT-4o 在一次对话里就能同时使用。

  • 权限与成本控制:MCP Proxy 能注入 rate‐limit、计费、审计中间件;LLM 只面向抽象的 schema,不暴露后端细节。(venturebeat.com)

实战示例:一条请求如何从 GPT-4o 走到 MCP 工具

下面给出完整可运行 Demo,演示模型通过 function call 把参数路由到本地 MCP Echo 工具,再把结果回流给模型或用户界面。代码刻意避开双引号,用单引号/模板字面量确保满足格式要求。

1. 用 @modelcontextprotocol/sdk 编写 Echo 工具服务器

// echo-server.js  (Node ≥ 20)
import { createToolsServer } from '@modelcontextprotocol/sdk';

const port = 8000;

createToolsServer({
  tools: {
    echo: {
      description: 'Return the same text',
      parameters: {
        type: 'object',
        properties: { text: { type: 'string' } },
        required: ['text']
      },
      handler: async ({ text }) => ({ text })
    }
  },
  port
}).then(() => console.log(`MCP 工具服务器已在端口 ${port} 运行`));

2. Python 脚本触发 function call 并通过 HTTP 调用 MCP

# call_echo.py  (Python ≥ 3.10)
import openai, requests

openai.api_key = 'YOUR_API_KEY'

tools_schema = [
    {
        'type': 'function',
        'function': {
            'name': 'echo',
            'description': 'Return the same text',
            'parameters': {
                'type': 'object',
                'properties': { 'text': { 'type': 'string' } },
                'required': ['text']
            }
        }
    }
]

def call_llm(msg: str):
    rsp = openai.ChatCompletion.create(
        model='gpt-4o-mini',
        messages=[{ 'role': 'user', 'content': msg }],
        tools=tools_schema,
        tool_choice='auto'
    )
    return rsp

if __name__ == '__main__':
    answer = call_llm('请复读:Hello MCP')
    call = answer.choices[0].message.tool_calls[0]
    payload = { 'text': eval(call.function.arguments)['text'] }
    echo_rsp = requests.post('http://localhost:8000/tools/echo', json=payload, timeout=5).json()
    print('MCP echo result:', echo_rsp)

启动流程:

  1. node echo-server.js

  2. python call_echo.py
    终端会看到 MCP echo result: {'text': 'Hello MCP'},表明 function call → MCP → Echo 闭环完成。(github.com, github.com)

3. 扩展:把多台 Echo 服务器挂在 MCP Proxy 下

若再运行 npx mcp-proxy --port 9000 --shell node echo-server.js 即可把多个工具聚合到 localhost:9000/mcp,而模型侧代码无需改动。(github.com)

深度比较

维度 function call MCP
关注点 意图格式 & JSON 架构 传输、发现、治理
执行时机 由外层 Orchestrator 立即执行 可流式、可事务、支持重试
多工具协同 手动在提示中列出 /tools 动态发现
权限/计费 需自行实现 Proxy 官方支持插件化
并发 & 队列 无定义 SSE/WS 流可天然并发
社区生态 OpenAI, Azure AI, Google PaLM Anthropic, LangChain, Plugged.in

真实案例

  • IDE 集成:Cursor 通过 MCP 把本地 Git 历史、Stack Trace 分析器暴露给模型,实现 Explain my diff 一键命令。(github.com)

  • 企业知识库:某保险公司把多达 120 个内部 REST 服务映射为 MCP 工具,模型先用 function call 检索相关服务,再让 MCP 进行统一鉴权与缓存。

  • RAG 管道:LangGraph 的 AgentNode 在拿到搜索意图后,让 MCP Proxy 在不同向量库之间做路由,完成自动降级与热备。(changelog.langchain.com)

调优建议

  1. Schema 先行:让参数和返回值遵循 JSON-Schema 7.0,减少模型在大文档里“找不到字段”的幻觉概率。

  2. 版本打标签:MCP 工具的 biome 字段可存储 SemVer,配合 Proxy 的路由规则实现灰度发布。(modelcontextprotocol.io)

  3. 对齐成本:在提示层,用“你可以调用 echo 来…”为模型提供示例,可显著提高正确调用率。(help.openai.com)

  4. 错误复写:让 MCP Proxy 在 5xx 时自动回退到备用服务器,同时把错误作为 ToolResult 让模型复盘,而不是直接返回给最终用户。(github.com)

趋势与展望

Business Insider 指出,AI 领域未来会像 TCP/IP 一样涌现众多协议,MCP 只是生态中的第一波。Google 已经在实验 Agent2Agent,而 GitHub 试图用 Code-LLM-API 承载 IDE 与 Copilot 的对话状态。(businessinsider.com, businessinsider.com)
与此同时,OpenAI 把 function call 拓展为多模型协作的“ToolChoice”,允许模型推荐其他模型来处理图像或语音,这预示一个标准意图层 × 传输层叠加的未来。(langfuse.com, arize.com)

收束观点

function call 让语言模型“说人话”地描述自己要做什么;MCP 让这些需求以统一、安全、可扩展的方式“落地执行”。把两者串在一起,就像把 TCP 流量塞进 HTTP,再通过 Kubernetes 管理 —— 简单、清晰、可拔插,也为 AI 代理走向企业级生产奠定了基础。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐