MCP-规范AI连接到外部的协议

47 阅读9分钟

2024年11月,人工智能公司 Anthropic推出了MCP,而Claude大语言模型就是这家公司的产物。现在学习AI的路径会看到MCP和A2A,这篇文章会介绍MCP的含义、通信方式、安装环境、有哪些MCP Sever和MCP Client,以及实践过程:在Cursor和Cherry Studio、Dify中使用和创建MCP Server。

一、MCP是什么

MCP(Model Context Protocol),模型上下文协议,一个为大模型更方便的利用外部资源(主要是工具)而设计的标准化接口,旨在打破模型与外部数据、工具之间的壁垒。 举例:如果我要让一个 Agent 同时具备“网络搜索”“数据库查询”“文本翻译”三种能力,通常要写三套适配器:

  • 搜索工具:手动拼 HTTP 请求,处理 OAuth 鉴权,解析 HTML 或 JSON,捕获请求超时。
  • 数据库查询:配置 JDBC/ODBC 连接,管理连接池,拼装 SQL,逐行读取 ResultSet。
  • 翻译服务:对接 Google Translate 或腾讯翻译 API,关注签名算法、流量限速、错误码处理。 而MCP则把这些繁琐细节都“藏”到服务器端:
    1. 服务端只需注册好 Search、QueryDB、Translate 三个工具能力;
    2. 然后 Agent 发起同一套 JSON-RPC 调用:
    {
      "method": "callTool",
      "params": {
        "tool": "Translate",
        "input": "Hello, world!",
        "target_lang": "zh"
      }
    }
    
    3.MCP 服务器负责底层的 HTTP 请求、鉴权、连接管理和结果解析,最后把翻译结果一并返回给模型。

因此,它是一个客户端 - 服务器的架构,其核心理念是“模型主控、客户端驱动、服务器调用”——模型负责推理和决策,客户端则动态提供上下文、工具和资源,而这些工具和资源则由外部服务器来提供。

二、MCP的C/S架构

上文讲到了,MCP遵循客户端-服务器架构(client-server),其中核心概念:

  • MCP主机(MCP Hosts)
  • MCP客户端(MCP Clients)
  • MCP服务器(MCP Servers)
  • 本地资源(Local Resources)
  • 远程资源(Remote Resources)
image.png

MCP主机(MCP Hosts)

作为运行MCP的主应用程序,例如Cursor、Cline或AI工具。为用户提供与LLM(大语言模型)交互的接口,同时集成MCP Client以连接MCP Server。

image.png

MCP客户端(MCP Clients)

MCP Client充当LLM和MCP Server之间的桥梁,嵌入在主机程序中,主要负责:

  • 接收来自LLM的请求;
  • 将请求转发到响应的MCP Server;
  • 将MCP Server的结果返回给LLM。 image.png

常见的Clients:Cursor、Cline、CHerry Studio、Claude,更多的Client参考:www.pulsemcp.com/clients、htt…

MCP Server

每个MCP服务器都提供了一组特定的工具,负责从本地数据或远程服务中检索信息。是MCP架构中的关键组件。与传统的远程API服务不同,MCP 服务器支持两种部署模式:本地模式(基于 stdio 标准输入输出)和远程模式(基于 SSE 服务器推送事件)。

image.png

三、MCP的工作流程

image.png

其中,涉及API:

  • 请求可用工具列表——tools/list:列出Server支持的所有工具;
  • 执行工具调用——tools/call:Client请求Server去执行某个工具,并将结果返回。
  • 当 Server 调用失败时,MCP Client 会将错误信息封装为标准格式返回给 LLM,支持重试或异常处理

四、MCP和其他协议的区别

image.png image.png
  • 与传统 API 的区别:传统 API(应用程序编程接口)是一种允许不同软件应用程序进行交互的规范。它通常针对特定的软件系统或服务,为开发者提供访问其功能和数据的途径。而 MCP 专注于大模型与外部资源的交互。传统 API 在调用时,开发者需深入了解每个 API 的细节,包括接口参数、返回格式、认证方式等,像调用百度地图 API 获取路线规划,要熟悉其特定的请求参数和数据结构。而 MCP 将这些复杂细节在服务器端进行统一处理,模型端只需通过简单的 JSON - RPC 调用,就能使用多种工具,大大降低了模型利用外部资源的难度,提升了开发效率。
  • 与 gRPC 的区别:gRPC 是一个高性能、开源和通用的 RPC 框架,基于 HTTP/2 协议标准设计,能在多种环境中实现高效的服务通信。但 gRPC 主要聚焦于构建分布式系统中服务间的通信,强调性能和强类型定义。MCP 则围绕大模型展开,重点在于为模型提供便捷访问外部资源的方式,更注重上下文信息的传递和工具调用的便利性。例如在一个微服务架构中,不同服务间使用 gRPC 进行通信以实现高效的数据交互;而 MCP 则用于让大模型轻松调用数据库查询工具、翻译服务等外部资源,两者应用场景和设计目标不同。
  • 与 RESTful API 的区别:RESTful API 是一种基于 HTTP 协议的软件架构风格,它通过 URL 定位资源,使用 HTTP 方法(如 GET、POST、PUT、DELETE)对资源进行操作,具有简洁、易理解、可缓存等优点,在 Web 开发中广泛应用。然而,RESTful API 在处理大模型与外部资源交互时存在不足。它通常针对特定业务功能设计,不同的 RESTful API 在接口设计、认证机制等方面差异较大。MCP 旨在解决这些问题,它为大模型提供了统一的接口规范,隐藏了底层资源调用的复杂性。如使用 RESTful API 进行数据库操作,可能需要编写不同的代码来处理不同数据库的接口;而 MCP 通过标准化的接口,让大模型能够以一致的方式调用各种数据库查询工具。
  • 与 WebSocket 的区别:与 MCP 不同,WebSocket 主要解决的是实时通信问题,它本身并不关注大模型与外部资源的整合。比如在一个在线聊天应用中,WebSocket 用于实现用户间实时消息传递;而 MCP 则用于帮助大模型在处理用户问题时,调用搜索引擎获取最新信息,或调用翻译工具进行语言转换。

五、有哪些MCP Server

六、有哪些MCP Client

七、MCP通信方式

根据MCP的规范,当前支持两种通信机制(传输方式):

  1. stdio(标准输入输出,MCP默认通信方式):本地服务,操作你本地的软件或本地的文件。比如文件系统、Blender。它的特点如下:

    • stdio模式适用于客户端和服务器在同一台机器上运行的场景,简单。
    • stdio模式无需外部网络依赖,通信速度快,适合快速响应的本地应用。
    • 可靠性高,且易于调试。
    • stdio模式为单进程通信,无法并行处理多个客户端请求,同时由于进程资源开销较大,不适合在本地运行大量服务。(限制了其在更复杂分布式场景中的使用)
    • stdio配置比较复杂,参考Cherry Studio中stdio模式的MCP配置,如下:image.png
  2. SSE(Server-Sent Events):远程服务,这个服务本身就有在线API,比如高德地图、github。它的特点如下:

    • 配置简单,基本只要一个链接;
    • SSE方式适用于客户端和服务器位于不同物理位置的场景;
    • 适用于实时数据更新、消息推送、轻量级监控和实时日志流等场景;
    • 对于分布式或远程部署的场景,基于HTTP和SSE的传世方式则更为合适。

八、Stdio本地环境安装

stdio的本地环境有两种:一种是Python编写的服务,一种用TypeScript编写的服务。分别对应uvx和npx两种命令。

  • npx需要去nodejs官网下载node,安装后npx则自动安装。检查是否安装npx:npx -v
  • uvx安装有两种方式,如果本地已安装python,则执行pip install uv。检查是否安装uvx:uv --versionuvx --help
image.png

九、Cursor使用MCP服务

举个简单的例子,我们需要实现从高德地图获取南京热门景点,并将返回结果写入一个txt文件中。

第一步,引入高德地图文件的MCP

image.png

第二步,设置Cursor自动执行MCP工具调用:

image.png

第三步,选择agent和大模型:

image.png

第四步,调用MCP:输入“根据高德地图MCP,获取南京市内的主要热门旅游景点信息”,从下图可以看到调用了高德地图的maps_text_search完成了任务:

image.png

最后,继续输入“使用/21的MCP,在D:\Work\AI目录下创建一个新的文件夹,命令为nanjing,其中新建一个txt文件,将上述景点信息写入。”。可以看到下图已经调用fs的read-file-21完成了任务: image.png

十、Cherry Studio引入MCP服务

首先,准备工作:下载最新版本的Cherry Studio,点击查看是否安装好uv、bun。

image.png

在设置中增加MCP Server:

image.png

添加成功后显示如下:

image.png

在对话框下选择高德地图的MCP Server

image.png

然后输入“告诉我南京雨花台区的热门景点”,大模型就会和高德地图的MCP Server中maps_text_search工具交互并回答我们的问题:

image.png

十一、本地Dify创建和使用MCP服务

dify市场也有很多支持MCP的插件,使用MCP Server插件可以让你的工作流变成一个MCP Server;使用MCP SSE插件让dify使用不同的MCP Server。

image.png

如果本地Dify没有我们想要的插件,直接从Dify云平台下载插件然后安装到本地,操作步骤如下: image.png image.png

自己做一个agent之后需要发布在自己的dify平台上应该怎么弄?首先,在插件库点击mcp server插件,右边弹窗选择自己的agent,即可生成mcp server。

image.png image.png

应用输入 schema:

{
    "name": "poem",
    "description": "模仿输入的作者风格写诗歌",
    "inputSchema": {
      "title": "poem",
      "type": "object",
      "properties": {
        "author": {
          "title": "author",
          "description": "作者",
          "type": "string"
        }
      },
      "required": [
        "author"
      ]
    }
  }

再点击mcp sse插件,把刚刚的mcp server的get url写入即可调用。

image.png image.png

MCP服务配置:

 {
    "server_name": {
      "url": "MCP Server的url",
      "headers": {},
      "timeout": 50,
      "sse_read_timeout": 50
    }
  }

需要使用时,在工具中选择:

image.png

虽然目前配置 App Input Schema 的 JSON 格式还需要一些手动操作,可能略显繁琐,但相比于从零开始搭建服务接口,已经简化了许多。 期待未来 Dify 不需要这么稍显麻烦的配置就能发布了。

参考:豆包、极客时间课程《MCP&A2A前沿实战》、bilibili课程《MCP实战指南,一口气搞定mcp与A2A竞争力翻倍(百度阿里全面拥抱mcp)》