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 分钟前
17.thinkphp的分页功能
前端·数据库
huohuopro1 小时前
Vue3快速入门/Vue3基础速通
前端·javascript·vue.js·前端框架
草巾冒小子1 小时前
vue3中解决 return‘ inside ‘finally‘ block报错的问题
前端·javascript·vue.js
互联网搬砖老肖1 小时前
Web 架构之高可用基础
前端·架构
zfyljx1 小时前
五子棋html
前端·css·html
蓑笠翁0013 小时前
Python异步编程入门:从同步到异步的思维转变
linux·前端·python
程序员小杰@4 小时前
✨WordToCard使用分享✨
前端·人工智能·开源·云计算
larntin20024 小时前
vue2开发者sass预处理注意
前端·css·sass
Enti7c5 小时前
利用jQuery 实现多选标签下拉框,提升表单交互体验
前端·交互·jquery
电报号dapp1195 小时前
DeFi开发系统软件开发:技术架构与生态重构
重构·架构·web3·去中心化·区块链·智能合约