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数据,从而实现模型能力增强的效果)

相关推荐
天天扭码30 分钟前
零基础 | 入门前端必备技巧——使用 DOM 操作插入 HTML 元素
前端·javascript·dom
somdip1 小时前
若伊微服务版本教程(自参)
微服务·云原生·架构
咖啡虫1 小时前
css中的3d使用:深入理解 CSS Perspective 与 Transform-Style
前端·css·3d
拉不动的猪1 小时前
设计模式之------策略模式
前端·javascript·面试
旭久1 小时前
react+Tesseract.js实现前端拍照获取/选择文件等文字识别OCR
前端·javascript·react.js
独行soc1 小时前
2025年常见渗透测试面试题-红队面试宝典下(题目+回答)
linux·运维·服务器·前端·面试·职场和发展·csrf
掘金-我是哪吒2 小时前
分布式微服务系统架构第102集:JVM调优支撑高并发、低延迟、高稳定性场景
jvm·分布式·微服务·架构·系统架构
uhakadotcom2 小时前
Google Earth Engine 机器学习入门:基础知识与实用示例详解
前端·javascript·面试
麓殇⊙2 小时前
Vue--组件练习案例
前端·javascript·vue.js
outstanding木槿2 小时前
React中 点击事件写法 的注意(this、箭头函数)
前端·javascript·react.js