没有理想的人不伤心

MCP 技术入门

2025/08/13
4
0

MCP 介绍与实践

介绍

痛点

传统交互下,大模型面临着如下问题:

  • 模型幻觉:大模型基于概率生成文本的机制会导致“一本正经的胡说八道”,即生成看似合理但实际错误或虚构的内容。
  • 时效性问题:大模型的训练数据通常存在时间滞后性,无法获取最新的动态数据,在一些对于实时性要求比较高的场景下,传统大模型可能出现过时的信息。
  • 功能局限性:传统交互下,大模型仅具有对话、文本生成的能力,无法实现诸如写文件、发起 http 请求、网络爬虫等一系列额外的工作。

Function Calling

Function Calling 允许模型在生成文本回复的同时,输出结构化的 JSON 对象,声明可以被外部工具或 API 调用的函数,可以通过这些函数,来扩展大模型的能力。

各个大模型厂商的 function calling 标准和功能可能都不太一样。

什么是 MCP(Model Context Protocol)

MCP(Model Context Protocol,模型上下文协议)是在 2024 年 11 月底由 Anthropic 发布,旨在构建一个开放的标准,让大型语言模型(LLM)与外部数据源和工具之间的交互更加统一和高效。面对当前 AI 模型因数据孤岛问题而无法充分发挥潜力的挑战,MCP 的推出为解决这一问题提供了新的思路。通过 MCP,AI 应用能够安全地访问和操作本地及远程的数据,从而搭建起 AI 应用与各种资源之间的桥梁。可以把 MCP 想像为一个 USB 接口,让 AI 应用能够更高效地利用各种数据资源,进一步释放其潜力。

MCP 解决了什么问题

  • **统一标准:**提供开放、通用、标准的协议,让 AI 模型能更智能、统一、安全地与各种外部数据源、工具和服务交互,实现无缝集成。目前各家模型的 Function Calling 接口可能不太一样,兼容起来非常麻烦,mcp 可以提供统一标准,不依赖特定 AI 模型,支持灵活切换,更好地处理多轮对话和复杂需求。
  • 增强自主执行任务能力: 保持不同应用/服务之间的上下文,使 AI 系统能处理复杂、多步任务,并且可以使用额外的能力,如利用 Google 进行网络搜索、利用 slack 发送消息、搜索本地文件、GitHub 搜索等等。
  • 一定程度上保障数据安全: 允许开发者自定义接口和数据传输,敏感数据可保留本地。

架构

MCP 协议采用 B/S 架构,主要由 MCP Client 和 MCP Server 构成,二者之间保持 1:1 连接的关系,通过 MCP 规定的请求和返回的 JSON 结构进行通信。

图中指的是一个需要借助 MCP 的主机上面可能存在多个 MCP Client - MCP Server 的连接。

其中,MCP Server 根据数据源的位置不同,分为本地的 MCP Server 以及远程的 MCP Server,二者在 MCP 中分别规定使用标准 IO 以及使用 HTTP SSE 来进行通信。

MCP 与 Function Calling 的区别

MCP 实际上就是将 Function Calling 的过程标准化了,因为之前的 Function Calling,各家模型可能都不太相同,有的可能只是一个简单的调用然后返回结果后喂给 AI,有的可能也会将调用哪些 tools 的决策交给大模型,以及各种交互的数据结构、接口的规范都不太相同,所以,需要一个标准化的协议将大模型与数据、tools 能力之间的行为进行一个标准化,避免重复造轮子。

重要概念

架构

graph LR
    subgraph"MCP Host"
        H[Host]
        C1[Client 1]
        C2[Client 2]
        C3[Client 3]
        H --> C1
        H --> C2
        H --> C3
    end

    subgraph"Servers"
        S1[Server 1]
        S2[Server 2]
        S3[Server 3]
        C1 --> S1
        C2 --> S2
        C3 --> S3
    end

MCP Host

MCP Host 是运行 LLM 应用的宿主进程,负责:

  • 创建和管理多个 MCP Client 实例:MCP Host 可以创建和调度多个 MCP Client,具体怎么调度,MCP 协议没有作约束,可以自由发挥。
  • 执行安全策略和用户授权决策:在涉及一些比较敏感的操作如删除文件时,客户端一般需要实现询问用户的意见的功能,让用户确认可以执行才能执行。
  • 负责与大模型交互**:负责与大模型进行交互,获取大模型的回答**

每个 MCP Host 可以运行多个 MCP Client 实例,形成 1:N 的关系。

MCP Client

MCP Client 负责与 MCP Server 进行通信,以获取 MCP Server 提供的所有 Tools 并告知大模型,同时当大模型产生决策后,由 MCP Client 来告诉 MCP Server 应该调用哪些 tools,同时拿到 MCP Server 调用 tools 的返回键结果。

MCP Server

MCP Server 是实际负责资源整合、tools 调用的角色,在收到 MCP Client 需要调用 tools 或者获取某项资源的时候,MCP 会去执行对应的函数或者功能或者 api。

MCP Server 有两种类型,本地的 MCP Server,以及远程的 MCP Server,其中,MCP 协议规定本地的 MCP Server 与 MCP Client 之间采用标准 IO 通信,而远程的 MCP Server 与 MCP Client 之间采用 HTTP 进行通信。

传输

MCP 规定了传输 MCP Client 与 MCP Server 之间传输的消息格式(JSON)、具体方式,并默认给出了两种标准传输实现:

  • 标准输入输出(适用于本地)
  • HTTP SSE(适用于远程)

工具

MCP 中的工具允许服务器公开可执行函数,这些函数可由客户端调用,并由 LLM 用于执行,工具的关键包括:

  • 发现:客户端可以通过 tools/list 端点列出可用工具。
  • 调用:使用 tools/call 端点调用工具,其中服务器执行请求的作并返回结果
  • 灵活性:工具范围从简单的计算到复杂的 API 交互。

资源

资源表示 MCP 服务器希望提供给客户端的任何类型的数据,例如:

  • 文件内容
  • 数据库记录
  • API 响应
  • 实时系统数据
  • 屏幕截图和图像
  • 日志文件

提示

提示(Prompt)使服务器能够定义可重用的提示模板和工作流,客户端可以轻松地向用户和 LLM 显示这些模板和工作流。它们提供了一种强大的方法来标准化和共享常见的 LLM 交互,如:

你是一位精通多语言的专业翻译专家,具备以下能力:
1. 精确理解源语言的文化背景、习语、专业术语和上下文。
2. 在保留原文含义的同时,用地道的目标语言表达,而不是逐字翻译。
3. 维持原文的语气、风格和专业术语。
4. 特别关注技术文档、法律文本和文学作品的专业术语和行业表达方式。
5. 尊重不同语言的语法结构差异,采用最自然的目标语言表达方式。
6. 能够自动识别输入文本的语言。

请按照以下步骤完成任务:
1. 自动识别输入文本的源语言。
2. 根据源语言和目标语言,精确翻译文本内容,确保保留原文的含义、语气和风格。
3. 特别关注技术术语、法律条款或文学表达,确保翻译结果符合目标语言的行业标准。
4. 避免逐字翻译,采用最自然的目标语言表达方式。
5. 输出翻译结果时,不要包含任何额外的解释或 XML 标签

现在,目标语言为{language}

这就是一个典型的翻译 Prompt,其中的 language 变量,是动态拼接后再给 LLM 的。

采样

简单来说采样就是在服务器需要使用 LLM 能力的时候,允许服务器向客户端发起请求,在客户端审核、甚至是修改过后,得到 LLM 的响应。

根(Roots)

Roots 实际上就是通过规定一些列的 URI,当客户端连接到服务端的时候,会声明服务器应该使用哪些资源,如:

{
  "roots": [
    {
      "uri": "file:///home/user/projects/frontend",
      "name": "Frontend Repository"
    },
    {
      "uri": "https://api.example.com/v1",
      "name": "API Endpoint"
    }
  ]
}

实践

使用 MCP

目前市面上的 MCP Host 有很多:

  • VsCode 的 Cline 插件
  • Cursor
  • Claude Desktop

拿 Cline 举例,具体步骤为:

  1. 在 vscode 中找到 Cline 插件并安装
  2. 点击前往 MCP Server 市场安装 MCP
  3. 随便找一个安装,接下来 Cline 会自动一步一步安装好 MCP Server
  4. 安装好后就可以前往对话了

MCP demo 实现

目前主流的实现 MCP 主要有两种方式:

  • 基于 System Prompt
  • 基于 Function Calling

基于 System Prompt,其实就是告诉大模型什么是 MCP、MCP 的相关概念以及整个 MCP 协议的内容,然后再告诉大模型现在连接的 MCP Server 有哪些 tools,这些 tools 分别有什么功能,哪些入参,返回值是什么,然后让大模型决定一下调用哪些 tools。

看的出来,System Prompt 的方式很烧 Token!

而基于 Function Calling,相当于直接借助有 Function Calling 的能力的大模型,做了个对于 MCP 协议的适配,直接用大模型的 Function Calling 机制。

接下来,我们基于 Function Calling 的方式简单实现一个 demo:

这里附上这个简单的 demo:

fastmcp
openai-agents
openai
pydantic
pydantic-settings
googlesearch-python
beautifulsoup4

未来

平台化

MCP 的出现,促进了 AI 生态的统一,未来,应该会陆续看到各大公司的 MCP 平台,如阿里最近出的百炼,以及市面上各种 mcp server 提供方如 mcp.sosmithery.ai 等等。

A2A

Google 在 Anthropic 提出 MCP 后,又提出了 AI 界的一大协议,A2A 协议,这个协议关注于各个 Agent 之间发现、协作,可以与 MCP 协议互补,如借助 MCP 构建垂直业务的细分领域的 Agent,然后通过 A2A 协议来协同各个细分领域的 Agent,从而实现垂直领域的通用 Agent。

应用

目前,MCP 已经有了一系列的应用案例,如 AI 几句话操作 blender 实现 3D 建模:

未来,MCP 将会促进在各个场景下的 AI 落地应用。