8.4 模型上下文协议与工具标准化

8.4.1 协议简介

Model Context Protocol(MCP)是一种开放协议规范,旨在标准化 AI 模型与外部工具、资源的交互方式。

MCP 解决的核心问题:

  • 缺乏统一的工具交互标准

  • 不同模型/应用的工具集成方式各异

  • 工具能力难以复用

8.4.2 协议架构

spinner

图 8-6:MCP 架构图

主要组件

  • MCP 客户端:集成到 AI 应用中,发起请求

  • MCP 服务端:提供工具和资源的接口

  • 传输层:支持多种传输方式(stdio、HTTP)

MCP 传输与 JSON-RPC 2.0 详解

MCP 基于 JSON-RPC 2.0 作为消息传输标准,在客户端和服务端之间进行结构化的远程过程调用。JSON-RPC 2.0 定义了请求、响应、通知三种消息类型,每个消息包含必要的版本、方法名、参数和ID信息。

传输层演进

最新的 MCP 规范支持两类传输:

  • stdio:经典的标准输入输出流,适合本地进程通信和容器化部署

  • Streamable HTTP:新一代的 HTTP 传输方案,替代了早期的 HTTP+SSE 组合,支持更高效的双向流式通信,特别是对长连接和大型响应流有更好的支持

OAuth 2.1 与安全认证

在生产环境中,MCP 服务端通常需要进行身份认证和授权。新版 MCP 协议集成了 OAuth 2.1 标准,用于安全地获取和验证访问令牌:

  • Authorization Endpoint:用户授权端点,获取授权码

  • Token Exchange:通过授权码交换访问令牌

  • Token Validation:服务端验证令牌有效性和权限范围

  • Scope Control:细粒度权限控制,限制客户端的访问范围

这确保了即使客户端与服务端通过不安全的网络通信,也能保护敏感操作(如数据修改、删除)。

Origin 验证与本地绑定

为防止恶意来源的请求,MCP 协议引入了:

  • Origin Validation:验证请求来自合法的客户端源

  • Localhost Binding:对本地部署的服务端,可以限制只接受本机(127.0.0.1)的连接,防止网络攻击

这些机制构成了 MCP 协议在分布式系统中的安全基础。

8.4.3 核心概念

MCP 的早期介绍通常聚焦三类最常见的基础构件:工具(Tools)资源(Resources)提示模板(Prompts)。在当前规范与社区设计原则中,MCP 还进一步引入了面向长时任务的 Tasks 能力,用于跟踪状态、轮询进度和延迟获取结果。这种标准化使得不同实现之间能够互操作——任何符合规范的客户端都能调用任何符合规范的服务端。

工具

可执行的函数,类似于函数调用。格式包含 name(工具名称)、description(描述)和 inputSchema(参数定义,遵循 JSON Schema 格式):

资源

可读取的数据源,如文件、数据库、API 端点等。格式包含 uri(资源唯一标识符)、name(显示名称),以及可选的 mimeType(内容类型)和 description

提示模板

预定义的提示词模板,便于复用常见的交互模式。格式包含 name(模板名称)、description(描述),以及可选的 arguments(参数列表):

任务

用于表示可能持续较长时间的工作单元,例如批量索引、长时爬取或异步分析。相比“一次请求立即返回”的工具调用,任务更强调状态跟踪、进度查询和结果延迟获取:

8.4.4 协议优势

  1. 标准化:统一的协议减少集成成本

  2. 可组合:不同 MCP 服务可以组合使用

  3. 跨平台:同一服务可被不同客户端使用

  4. 生态系统:日益丰富的预构建服务

8.4.5 服务示例

文件系统服务

提供文件读写能力:

  • read_file:读取文件

  • write_file:写入文件

  • list_directory:列出目录

数据库服务

提供数据库访问:

  • query:执行查询

  • describe_schema:获取表结构

网页服务

提供网页访问:

  • fetch_url:获取网页内容

  • search:搜索网页

8.4.6 实现服务

简单的 MCP 服务实现框架:

8.4.7 MCP与上下文工程的深度融合

MCP 不仅仅是工具调用的标准化协议,更是上下文工程的关键基础设施。理解 MCP 如何影响上下文工程的各个环节至关重要。

MCP Resources 作为上下文源

传统方法的限制

问题:

  • 向量库中的信息可能陈旧

  • 对高频实时数据的支持通常依赖增量索引、缓存刷新或直连数据源,工程复杂度更高

  • 多个数据源的集成复杂

基于MCP的上下文获取

实现示例

关键优势

  • 动态性:资源可以是实时数据,无需预构建向量库

  • 多源融合:天然支持来自不同系统的数据整合

  • 可扩展性:新增数据源仅需接入新的MCP服务器

  • 信息溯源:资源URI明确指示数据来源

MCP Tools 扩展上下文操作

上下文不仅是输入,也可能需要在推理过程中动态变换。MCP Tools 提供了这种能力:

使用场景

  1. 即时压缩:当上下文超过限制时,动态调用压缩工具

  2. 关键词过滤:提取与查询相关的上下文片段

  3. 跨语言支持:自动翻译外语上下文

  4. 知识增强:在推理中动态调用知识库

MCP Prompts 标准化提示词模式

MCP Prompts 规范化了上下文的呈现方式,使得提示词设计可复用和版本管理:

标准化的好处

  • 版本控制:提示词可以版本管理,方便回滚和A/B测试

  • 可复用性:团队可共享优化过的提示词模板

  • 一致性:相同类型的任务使用相同的提示结构

  • 可维护性:改进某个模板自动应用到所有相关系统

实战:MCP服务器配置文件示例

上下文工程的三层架构

这个架构使得上下文工程从静态的向量检索演进到 动态、可组合、可扩展 的系统。

8.4.8 未来展望

MCP 协议正在快速发展。不同客户端、IDE 与模型平台对 MCP 的支持程度可能不同,且会随版本迭代变化;在做技术选型时建议以对应项目与产品的最新文档为准。

8.4.9 实战案例:构建 GitHub 协议服务

以下是一个 GitHub MCP Server 的 示意性 实现,用于展示如何同时提供 Tools、Resources 和 Prompts。

完整代码实现

配置和使用

1. 安装依赖

2. 在 Claude Desktop 中配置claude_desktop_config.json):

3. 使用示例

踩坑经验

  • Token 权限要最小化,只授予必需的 scope

  • 异步 HTTP 客户端比同步更适合 MCP Server

  • 复杂操作应拆分为多个小工具,而非一个大工具

最后更新于