此文假设你对 function call 有一定理解。不理解请先看下 openAI 官网的 platform.openai.com/docs/guides... 解释。
简单来说,function call 就是一个描述函数 function 的 JSON 结构化数据,规定输入结构,从而使得模型输出符合预期
3个月前 mcp 很火,之前一直没想到写 mcp。但我最近发现很多人感觉 mcp 就是 function call。其实不是的。mcp 包含 function call
为了避免大家看得一脸懵,我还是先讲些基础概念。
什么是mcp
下面是官网的介绍,mcp 是 anthropic 公司提出的一个协议,anthropic 开发的 claude 模型
其实官网说得有点抽象,只说了它是个协议,但没有说这个协议能干嘛。
mcp 架构图
我想大家在网络上搜 mcp 博客时都会搜到这张图,因为这是 anthropic 官网的架构图,采用的是 C/S 架构

但实际上其实很多人看了架构图也不能理解图中的这些是什么 ?比如说 mcp Host,mcp Client, mcp Server
mcp 组成
mcp是三层架构,Host-Client-Server

-
mcp Host:大模型应用,类似 Claude 桌面客户端、Cursor 编辑器这种应用。可以在主机内调度客户端进程,发起到服务器的连接。
-
mcp client:主机(如 cursor)内的一个业务进程,可以与服务器进程进行连接
-
mcp Server:提供 Tools、Resources、Prompt 三种服务(你可以把 mcp Host 想象成杯子,mcp Server就是杯子里的水)
- tools:mcp 服务器提供的工具列表
- Resources:mcp客户端可读取的文件数据
- Prompt:提示词
案例
我用一个案例来解释 mcp 的组成之间是如何互相协作的。比如说用户问cursor:"查询北京天气",那么会发生如下图的事情:

- mcp客户端 → mcp 服务器:
- 请求 mcp 服务器 Tools 列表
mcp客户端发请求,请求、响应结构如下:
json
// 和 mcp 服务器打交道遵循 JSON-RPC 结构
// 请求
{
"jsonrpc": "2.0",
"id": "1",
"method": "tools/list"
}
// 响应
{
"jsonrpc": "2.0",
"id": "1",
"result": {
"tools": [{
"name": "get_weather",
"description": "查询城市天气",
"inputSchema": {
"type": "object",
"properties": {
"city": {"type": "string"}
}
}
}]
}
}
- mcp客户端 → LLM(发送用户请求 + 工具)
告诉 LLM 我有哪些工具
json
// 和 LLM 打交道用 function call(tools接受一个数组,意味着可以有多个工具)
// 请求
{
"messages": [{
"role": "user",
"content": "北京今天多少度?"
}],
"tools": [{
"name": "get_weather",
"description": "查询城市天气",
"inputSchema": {
"type": "object",
"properties": {"city": {"type": "string"}}
}
}]
}
// LLM 响应
{
"tool_calls": [{
"name": "get_weather",
"arguments": {"city": "北京"}
}]
}
- mcp 客户端 → mcp 服务器
swift
// 和 mcp 服务器打交道遵循 JSON-RPC 结构
// 请求
{
"jsonrpc": "2.0",
"id": "2",
"method": "tools/call",
"params": {
"name": "get_weather",
"arguments": {"city": "北京"}
}
}
// 响应(MCP Server返回第三方API数据)
{
"jsonrpc": "2.0",
"id": "2",
"result": {
"content": [{
"type": "text",
"text": "{\"temp\": 25, \"condition\": \"晴\"}"
}]
}
}
- mcp 客户端 → LLM
告诉 AI 模型:用户提问是什么 + 工具返回的数据 → AI
swift
// mcp 客户端请求
{
"messages": [
{"role": "user", "content": "北京今天多少度?"},
{"role": "tool", "content": "{\"temp\": 25, \"condition\": \"晴\"}"}
]
}
// LLM 响应
{
"role": "assistant",
"content": "北京今天晴,气温25°C"
}
mcp流程总结
mcp 看上去流程很绕,简单来说
- 就是第一轮和LLM对话时告诉LLM模型,我们有这些工具,看你要哪个 ?AI 说我要工具 A
- mcp 服务器调用工具 A 的 tools/call,调用接口得到实时的北京天气数据
- 第二轮对话:用户的提问 + 工具 A 返回的北京天气 ⇒ 一起发给 AI ⇒ AI 总结后再返回给用户
- 大白话
你把你的问题,你有什么工具,工具有什么能力,工具返回的结果 一并告诉 给AI。AI 根据(提问 + 答案)总结后发给你
mcp和function call区别
mcp | function call | |
---|---|---|
和LLM对话轮数 | 多轮 | 一轮 |
控制权 | 用户/应用(cursor)控制 | 模型控制 |
谁写 | 服务器mcp server 提供 tools/list;市面上会有很多工具提供给你用 | 客户端开发者自己写;你要实现多个不同的需求就得自己写多个不同的function call |
范围 | mcp 包含了 function call。因为mcp是在function call基础上加了层 JSON-RPC 构成的一套上层协议 | |
通用性 | mcp运行不同LLM通过同一套协议接入工具 | open AI的私有实现 |
层面 | 协议层 | 模型层 |
总结
- mcp服务器和mcp客户端
mcp服务器就像是公司里的后端,mcp客户端就像是公司里的前端
- mcp服务器:建立 tools 工具列表接口,提供给前端使用
- mcp客户端:调后端的接口数据,拿到工具列表
mcp客户端和mcp服务器之间有套类似 restful 的接口规范,这个就是JSON-RPC,格式如下:
- 请求格式
csharp
{
jsonrpc: "2.0",
id: number | string,
method: string,
params?: object
}
- 响应格式
typescript
{
jsonrpc: "2.0",
id: number | string,
result?: object
}
- JSON-RPC 和 function call
可见在mcp流程中,mcp客户端是个中间人,和mcp服务器打交道时走的是 JSON-RPC 规范。和 LLM 模型打交道时走的是 function call 规范
- 为什么说mcp包含function call?
其实准确来说是,mcp的 Tools 机制和function call相似。
原因:MCP Client 将MCP服务器返回的工具描述转换为 Function Calling 格式 发送给 LLM
所以转成function call这个过程发生在mcp客户端
- mcp 一句话表述
mcp 就是把模型和数据连接起来。将 function call tools 写在了 mcp 服务器,从而给 agent 提供了各种工具
从结果来看,mcp就是 RAG ++;从协作流程来看,mcp 服务器其实就是 function call 的 tools
mcp之前,我们是把 function call 的 tools 维护在了客户端;现在是把这个能力从客户端挪到了 mcp 服务器
- mcp作用类比
就是给大模型装插件,mcp 下的模型会非常强大。类似于装在 vscode 里的各种插件(模型不具备请求能力, mcp 服务器去给模型请求第三方API数据,从而实现模型能力增强的效果)