mcp跟大模型的function call有什么区别?
function call(图一)大体上是大模型的一个特性,通过协商特定格式的语法或约定,实现大模型向应用发送指令、从而“用自然语言调用函数”。过程中会给LLM喂函数配置,而且还是一次性的
mcp是管理上下文的协议(图二),建立了三层架构。“主机”其实类似于“应用代码”,而mcp没规定“主机”要怎么跟LLM沟通,甚至没有规定用什么大模型。如果应用实现了mcp,可以用function call(如claude的客户端),也可以用某些指令直接触发(如zed的pgsql插件)
简单说就是没什么联系,不知道为啥有人拉到一起讲
sequenceDiagram
participant App as 应用代码
participant LLM as 大模型 (API)
Note over App,LLM: 1. 应用携带提示与函数定义调用LLM API
App->>LLM: 发送提示(prompt)与函数定义
Note over App,LLM: 2. 模型决定直接回答用户或调用函数
LLM->>LLM: 分析用户意图
alt 模型需要调用函数
Note over App,LLM: 3. LLM返回要调用的函数及参数
LLM->>App: 函数调用指令(JSON)
Note over App,LLM: 4. 应用执行对应函数
App->>App: 调用后端函数并获得结果
Note over App,LLM: 5. 应用将函数结果再次发给LLM
App->>LLM: 提供函数执行结果与上下文
LLM->>App: 返回最终回答给用户
else 模型直接回答用户
LLM->>App: 返回最终回答给用户
endmcp
建立连接
sequenceDiagram
participant Client as 客户端
participant Server as 本地服务
Note over Client,Server: 初始化阶段
activate Client
Client->>+Server: 初始化请求
Server-->>Client: 初始化响应
Client--)Server: 初始化完成通知
Note over Client,Server: 运行阶段
rect rgb(200, 220, 250)
note over Client,Server: 正常的协议操作
end
Note over Client,Server: 关闭阶段
Client--)-Server: 断开连接
deactivate Server
Note over Client,Server: 连接已关闭sequenceDiagram
participant Host as 主机
participant Client as 客户端
participant Server as 服务器
Host->>+Client: 初始化客户端
Client->>+Server: 携带能力信息初始化会话
Server-->>Client: 返回支持的功能和能力
Note over Host,Server: 活跃会话(已协商的特性)
loop 客户端请求阶段
Host->>Client: 用户或模型发起的操作
Client->>Server: 请求(工具/资源)
Server-->>Client: 响应
Client-->>Host: 更新界面或向模型返回结果
end
loop 服务器请求阶段
Server->>Client: 请求(抽样)
Client->>Host: 转发给AI
Host-->>Client: 处理AI响应
Client-->>Server: 处理结果
end
loop 通知阶段
Server--)Client: 资源更新通知
Client--)Server: 状态变更通知
end
Host->>Client: 终止
Client->>-Server: 结束会话
deactivate Serverflowchart LR
subgraph "你的电脑"
Host["MCP 主机\n(Claude, IDE 或其他工具)"]
S1["MCP 服务 A"]
S2["MCP 服务 B"]
S3["MCP 服务 C"]
Host <-->|"MCP 协议"| S1
Host <-->|"MCP 协议"| S2
Host <-->|"MCP 协议"| S3
S1 <--> R1[("本地\n资源 A")]
S2 <--> R2[("本地\n资源 B")]
end
subgraph "互联网"
S3 <-->|"Web API"| R3[("远程\n资源 C")]
end