mcp vs function call区别

此文假设你对 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

  1. mcp Host:大模型应用,类似 Claude 桌面客户端、Cursor 编辑器这种应用。可以在主机内调度客户端进程,发起到服务器的连接。

  2. mcp client:主机(如 cursor)内的一个业务进程,可以与服务器进程进行连接

  3. mcp Server:提供 Tools、Resources、Prompt 三种服务(你可以把 mcp Host 想象成杯子,mcp Server就是杯子里的水)

    • tools:mcp 服务器提供的工具列表
    • Resources:mcp客户端可读取的文件数据
    • Prompt:提示词

案例

我用一个案例来解释 mcp 的组成之间是如何互相协作的。比如说用户问cursor:"查询北京天气",那么会发生如下图的事情:

  1. 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"}
        }
      }
    }]
  }
}
  1. 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": "北京"}
  }]
}
  1. 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\": \"晴\"}"
    }]
  }
}
  1. mcp 客户端 → LLM

告诉 AI 模型:用户提问是什么 + 工具返回的数据 → AI

swift 复制代码
// mcp 客户端请求
{
  "messages": [
    {"role": "user", "content": "北京今天多少度?"},
    {"role": "tool", "content": "{\"temp\": 25, \"condition\": \"晴\"}"}
  ]
}

// LLM 响应
{
  "role": "assistant",
  "content": "北京今天晴,气温25°C"
}

mcp流程总结

mcp 看上去流程很绕,简单来说

  1. 就是第一轮和LLM对话时告诉LLM模型,我们有这些工具,看你要哪个 ?AI 说我要工具 A
  2. mcp 服务器调用工具 A 的 tools/call,调用接口得到实时的北京天气数据
  3. 第二轮对话:用户的提问 + 工具 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的私有实现
层面 协议层 模型层

总结

  1. 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
}
  1. JSON-RPC 和 function call

可见在mcp流程中,mcp客户端是个中间人,和mcp服务器打交道时走的是 JSON-RPC 规范。和 LLM 模型打交道时走的是 function call 规范

  1. 为什么说mcp包含function call?

其实准确来说是,mcp的 Tools 机制和function call相似。

原因:MCP Client 将MCP服务器返回的工具描述转换为 Function Calling 格式 发送给 LLM

所以转成function call这个过程发生在mcp客户端

  1. mcp 一句话表述

mcp 就是把模型和数据连接起来。将 function call tools 写在了 mcp 服务器,从而给 agent 提供了各种工具

从结果来看,mcp就是 RAG ++;从协作流程来看,mcp 服务器其实就是 function call 的 tools

mcp之前,我们是把 function call 的 tools 维护在了客户端;现在是把这个能力从客户端挪到了 mcp 服务器

  1. mcp作用类比

就是给大模型装插件,mcp 下的模型会非常强大。类似于装在 vscode 里的各种插件(模型不具备请求能力, mcp 服务器去给模型请求第三方API数据,从而实现模型能力增强的效果)

相关推荐
z-robot几秒前
Nginx 配置代理
前端
用户47949283569158 分钟前
Safari 中文输入法的诡异 Bug:为什么输入 @ 会变成 @@? ## 开头 做 @ 提及功能的时候,测试同学用 Safari 测出了个奇怪的问题
前端·javascript·浏览器
没有故事、有酒20 分钟前
Ajax介绍
前端·ajax·okhttp
朝新_23 分钟前
【SpringMVC】详解用户登录前后端交互流程:AJAX 异步通信与 Session 机制实战
前端·笔记·spring·ajax·交互·javaee
裴嘉靖26 分钟前
Vue 生成 PDF 完整教程
前端·vue.js·pdf
毕设小屋vx ylw28242628 分钟前
Java开发、Java Web应用、前端技术及Vue项目
java·前端·vue.js
冴羽1 小时前
今日苹果 App Store 前端源码泄露,赶紧 fork 一份看看
前端·javascript·typescript
蒜香拿铁1 小时前
Angular【router路由】
前端·javascript·angular.js
Wang's Blog2 小时前
Nestjs框架: 微服务事件驱动通信与超时处理机制优化基于Event-Based 通信及异常捕获实践
微服务·云原生·架构·nestjs
brzhang2 小时前
读懂 MiniMax Agent 的设计逻辑,然后我复刻了一个MiniMax Agent
前端·后端·架构