Function Call 与 MCP 的深度融合之道
在现代 LLM 工具生态里,提供了模型“触手可及”的即时工具,而MCP(Model Context Protocol)则把大量分散的工具与数据源整合成一张可寻址的网络。前者专注于让模型正确地产生“调用意图”,后者专注于把这些意图可靠地路由到正确的服务端点。当两者结合,开发者能够用极小的提示成本为 GPT-4o 或 Claude-3 等模型接入数百个外部能力,并在权限、缓存、并发、版本管理等维度获得
在现代 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)
启动流程:
-
node echo-server.js
-
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)
调优建议
-
Schema 先行:让参数和返回值遵循 JSON-Schema 7.0,减少模型在大文档里“找不到字段”的幻觉概率。
-
版本打标签:MCP 工具的
biome
字段可存储 SemVer,配合 Proxy 的路由规则实现灰度发布。(modelcontextprotocol.io) -
对齐成本:在提示层,用“你可以调用 echo 来…”为模型提供示例,可显著提高正确调用率。(help.openai.com)
-
错误复写:让 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 代理走向企业级生产奠定了基础。
更多推荐
所有评论(0)