什么是MCP?为什么大模型选择MCP?

244 阅读7分钟

为什么选择MCP

MCP 是一个帮助开发者构建基于 LLM (大语言模型) 的智能代理和复杂工作流的框架。旨在解决目前大模型的信息孤岛问题。

  1. 预构建集成能力

    • MCP 提供了大量现成的集成组件

    • 这些组件可以直接被 LLM 调用和使用

    • 这意味着开发者不需要从零开始构建各种集成,可以快速实现功能

  2. LLM 供应商的灵活性

    • 可以在不同的 LLM 提供商之间自由切换

    • 比如可以从 OpenAI 切换到 Anthropic 或其他提供商

    • 这种灵活性让开发者能够根据需求选择最适合的 LLM 服务

  3. 数据安全最佳实践

    • 提供了在基础设施中保护数据安全的最佳实践方案

    • 确保敏感数据得到妥善保护

    • 帮助开发者在构建应用时遵循安全标准

总的来说,MCP 是一个旨在简化 LLM 应用开发的框架,它通过提供现成的组件、灵活的供应商选择以及安全实践,帮助开发者更高效地构建基于 LLM 的应用。这对于需要将 LLM 与各种数据源和工具集成的项目特别有用。

MCP架构

MCP 采用客户端-服务器(Client-Server)架构

这里有个误区,图中MCP server都在本地电脑中,实际中的Server可以是非本地部署的。

关键组件:

  1. MCP Hosts(主机)
    • 使用 MCP 协议的程序或应用,也就是发起请求的 LLM 应用程序(例如 Claude Desktop、IDE 或 AI 工具)。
    • 例如:
      • Claude Desktop 客户端
      • 集成 AI 功能的 IDE
      • 其他需要访问数据的 AI 工具
    • 这些主机程序通过 MCP 协议来获取所需的数据和服务
  2. MCP Clients(客户端)
    • 是协议的具体实现者
    • 每个客户端与服务器之间保持一对一的连接(我的理解是建立连接的过程是一对一)
    • 负责处理与服务器的通信
    • 确保数据传输的可靠性和安全性
  3. MCP Servers(服务器)
    • 轻量级的程序组件
    • 每个服务器都通过标准化的 Model Context Protocol 暴露特定的功能
    • 可以理解为各种能力的提供者
    • 负责实际的数据访问和处理
  4. Local Data Sources(本地数据源)
    • 位于用户计算机上的数据资源
    • 包括:
      • 本地文件系统
      • 本地数据库
      • 本地运行的服务
    • MCP 服务器可以安全地访问这些本地资源
  5. Remote Services(远程服务)
    • 通过互联网访问的外部系统
    • 例如:
      • 各种 API 服务
      • 云服务
      • 远程数据库
    • MCP 服务器可以连接到这些远程服务

这种架构设计的优势:

  • 模块化:每个组件都有明确的职责
  • 安全性:通过标准化的协议确保数据访问的安全
  • 灵活性:可以方便地添加新的数据源和服务
  • 可扩展性:支持本地和远程资源的统一访问

这种设计使得 AI 应用能够安全(因为可以使用本地数据源)、高效地访问各种数据源,同时保持了系统的扩展性和可维护性。

MCP Protocal核心组件

协议层 Protocol layer

协议层负责处理消息的封装、请求/响应关联,以及高级通信模式

Typescript定义

class Protocol<Request, Notification, Result> {
    // Handle incoming requests
    setRequestHandler<T>(schema: T, handler: (request: T, extra: RequestHandlerExtra) => Promise<Result>): void

    // Handle incoming notifications
    setNotificationHandler<T>(schema: T, handler: (notification: T) => Promise<void>): void

    // Send requests and await responses
    request<T>(request: Request, schema: T, options?: RequestOptions): Promise<T>

    // Send one-way notifications
    notification(notification: Notification): Promise<void>
}
传输层 Transport layer

传输层是整个MCP最重要的组件,传输层负责在客户端(Mcp client)和服务器(Mcp server)之间进行实际的数据通信。

传输层的三种方式:

  1. 通过 stdio 传输数据,适用于在同一台机器上运行的客户端和服务器之间的通信。例如以下通过npx直接启动,代码端也需要做适配
{
  "mcpServers": {
    "mcp-server-chart": {
      "command": "npx",
      "args": [
        "-y",
        "@antv/mcp-server-chart"
      ]
    }
  }
}
  1. stream http的形式

Streamable HTTP 是 MCP 协议的一次重要升级,改进解决了原有 HTTP + SSE 传输方式的多个关键问题:

  • 统一端点:移除了专门建立连接的 /sse 端点,将所有通信整合到统一的端点。
  • 按需流式传输:服务器可以灵活选择返回标准 HTTP 响应或通过 SSE 流式返回。
  • 状态管理:引入session机制

所有传输都使用 JSON-RPC 2.0 来交换消息。详细的 Model Context Protocol 消息格式请参阅规范

JSON-RPC是一个无状态且轻量级的远程过程调用(RPC)协议。 本规范主要定义了一些数据结构及其相关的处理规则。它允许运行在基于socket,http等诸多不同消息传输环境的同一进程中。其使用JSONRFC 4627)作为数据格式。

我的理解就是约定了一种数据结构,通过http、socket等去传输,实现两端的通信。

MCP client工作流程

建立连接

image.png

  1. 客户端通过 <font style="color:rgb(25, 27, 31);background-color:rgb(248, 248, 250);">initialize</font> 请求发送协议版本和功能列表
  2. 服务器返回协议版本和功能列表
  3. 客户端通过 <font style="color:rgb(25, 27, 31);background-color:rgb(248, 248, 250);">initialized</font> 通知进行确认
  4. 可以开始正常消息交换

开始交互

  • MCP client 首先从 MCP server 获取可用的工具列表(tools)
  • 将用户的查询连同工具描述(tools description)通过 function calling 一起发送给 LLM
  • LLM 决定是否需要使用工具以及使用哪些工具
  • 如果需要使用工具,MCP client 会通过 MCP server 执行相应的工具调用
  • 工具调用的结果会被发送回 LLM
  • LLM 基于返回信息做整理和归纳
  • 返回处理后的信息给用户

消息交换模式

  1. Request-Response(请求-响应):客户端或服务器发起请求,对方返回响应
  2. Notifications(通知):任意一方可以发送单向消息

消息类型

消息类型基于 JSON RPC 2.0

  1. 请求
interface Request {
  method: string;
  params?: { ... };
}
  1. 结果
interface Result {
  [key: string]: unknown;
}
  1. 错误返回
interface Error {
  code: number;
  message: string;
  data?: unknown;
}
  1. 建立通信的Notification
interface Notification {
  method: string;
  params?: { ... };
}

终止(Terminate)会话

  1. 通过 close() 进行正常关闭
  2. 传输层断开连接
  3. 遇到错误导致关闭(错误返回值遵循<font style="color:rgb(25, 27, 31);">JSON RPC 2.0</font>的规定)

官方文档定义

enum ErrorCode {
  // Standard JSON-RPC error codes
  ParseError = -32700,
  InvalidRequest = -32600,
  MethodNotFound = -32601,
  InvalidParams = -32602,
  InternalError = -32603
}

JSON PRC定义

codemessagemeaning
-32700Parse error语法解析错误服务端接收到无效的json。该错误发送于服务器尝试解析json文本
-32600Invalid Request无效请求发送的json不是一个有效的请求对象。
-32601Method not found找不到方法该方法不存在或无效
-32602Invalid params无效的参数无效的方法参数。
-32603Internal error内部错误JSON-RPC内部错误。
-32000 to -32099Server error服务端错误预留用于自定义的服务器错误。

总结

MCP(Model Context Protocol)是一个旨在简化基于LLM的智能代理和复杂工作流开发的框架,致力于解决大模型信息孤岛问题。它通过提供预构建集成、LLM供应商灵活性和数据安全实践,提升开发效率。大模型离开了MCP就是一座信息的孤岛,MCP给大模型带来了各种天马行空的可能性。希望我们每个身处这个AI时代的coder永不失业。其实,为什么选择MCP我也不懂,还得再学一学哈。🐕