全栈开发知识库

MCP

Model Context Protocol(MCP,模型上下文协议)是一个开源协议,它标准化了大语言模型与外部工具和数据源通信的方式,允许开发者和工具提供商只需集成一次,就能与任何兼容 MCP 的系统交互。MCP 就像 USB-C 标准:不需要为每个设备使用不同的连接器,而是使用一个端口来处理多种类型的连接。

MCP 架构

MCP 遵循客户端-服务器架构,架构中包括: - MCP 主机 协调和管理一个或多个 MCP 客户端的 AI 应用 - MCP 客户端 一个保持与 MCP 服务器连接的组件,通过 MCP 定义的消息处理通信,从服务器查找并请求资源和工具,并管理与服务器的连接生命周期 - MCP 服务器 一个向 MCP 客户端提供服务的程序,通过协议暴露工具、资源和提示模板功能

MCP 分为两个层级:

  • 数据层

数据层实现了一个基于 JSON-RPC 2.0 的交换协议,该协议定义了消息结构和语义。 数据层包括生命周期管理(连接初始化、能力协商、连接终止)、服务器功能(提供工具、资源和提示模板)、客户端功能(调用LLM、获取输入、记录消息)、其他功能(实时更新通知、长时运行操作跟踪)。 - 传输层 传输层定义了客户端与服务器之间数据交换的通信机制和通道,包括特定传输方式的连接建立、消息帧定界和授权。 MCP 支持多种传输机制,包括 Stdio、Streamable HTTP、SSE。

MCP 工作流程

  • 初始化 在初始化过程中,AI 应用程序的 MCP 客户端管理器连接到配置的服务器,并将它们的能力存储起来以供后续使用。应用程序使用这些信息来确定哪些服务器可以提供特定类型的功能(工具、资源、提示),以及它们是否支持实时更新。 初始化有几个重要的作用:
    • 协议版本协商 确保客户端和服务器使用兼容的协议版本,避免因版本不一致导致的通信问题
    • 能力发现 声明各自支持的功能,包括他们能够处理的基元类型(工具、资源、提示)以及是否支持通知等特性
    • 身份交换 交换客户端与服务器的身份及版本信息,便于后续的调试与兼容性管理
  • 工具发现

AI 应用程序从所有连接的 MCP 服务器中获取可用工具,并将它们组合成一个语言模型可以访问的统一工具注册表。这使得 LLM 能够理解它可以执行哪些操作,并在对话期间自动生成相应的工具调用。

连接建立之后,客户端可以通过发送 tools/list 请求来发现可用的工具。这个请求是 MCP 工具发现机制的基础—它允许客户端在尝试使用工具之前了解服务器上有哪些可用的工具。响应包含一个 tools 数组,该数组提供了关于每个可用工具的全面元数据。这种基于数组的结构允许服务器同时展示多个工具,同时保持不同功能之间的清晰界限。响应中的每个工具包括几个关键字段: - name 工具标识符 - title 工具的易读显示名称 - description 工具描述 - inputSchema 一个定义预期输入参数的 JSON Schema,支持类型验证并提供关于必需和可选参数的清晰文档

  • 工具执行

当语言模型在对话中决定使用工具时,AI 应用程序会拦截工具调用,将其路由到合适的 MCP 服务器,执行该工具,并将结果作为对话流程的一部分返回给 LLM。这使 LLM 能够访问实时数据并在外部世界中执行操作。

客户端使用 tools/call 方法执行一个工具。tools/call 请求遵循结构化格式,确保客户端和服务器之间的类型安全和清晰通信。请求结构包括几个重要组件: - name 工具标识符 - arguments 包含工具的 inputSchema 定义的输入参数 响应返回一个内容对象数组,允许进行丰富、多格式的响应(文本、图片、资源等)。每个内容对象都有一个 type 字段。 - 实时更新

MCP 支持实时通知,使服务器能够在未经明确请求的情况下通知客户端有关变更。当 AI 应用程序收到关于工具变更的通知时,它会立即刷新其工具注册表并更新 LLM 的可用功能。这确保了正在进行的对话始终能够访问最新的一组工具,并且 LLM 可以随着新功能的可用而动态适应。