MCP协议基础

Model Context Protocol(MCP)是由Anthropic推出的开放协议, 旨在标准化AI应用与外部数据源和工具的连接方式。 本文将深入探讨MCP的设计理念、核心概念和实现原理。

预计阅读时间:50分钟·难度:中级·更新时间:2024年4月

MCP协议概述

什么是MCP

Model Context Protocol(模型上下文协议)是一个开放标准, 用于连接AI助手与系统中的数据源、工具和资源。 它提供了一种统一的方式让AI模型安全地访问和操作外部系统。

MCP的核心价值

  • 标准化:提供统一的接口规范,避免为每个AI应用单独开发集成
  • 安全性:通过明确的权限控制,安全地访问敏感数据
  • 可扩展:支持各种类型的资源、工具和提示模板
  • 互操作性:不同AI应用可以共享同一套MCP服务器

为什么需要MCP

在MCP出现之前,AI应用与外部系统的集成面临诸多问题:

传统集成方式的痛点

  • 每个AI应用需要单独开发与各数据源的连接
  • 缺乏统一的安全模型,权限管理混乱
  • 数据源变更需要修改多个AI应用
  • 工具和资源的定义不统一,难以复用
  • 调试和监控困难

MCP解决的问题

  • ✅ 一次开发,多处使用:MCP服务器可以被多个AI客户端使用
  • ✅ 统一的安全模型:客户端控制访问权限
  • ✅ 松耦合架构:数据源变更不影响客户端
  • ✅ 标准化接口:易于理解、调试和维护
  • ✅ 丰富的生态:社区贡献大量现成的MCP服务器

核心概念

MCP定义了三个核心概念:资源(Resources)、提示模板(Prompts)和工具(Tools)。 这三个概念构成了AI与外部系统交互的完整能力体系。

资源(Resources)

资源是MCP中最基本的概念,代表AI可以读取的数据。 资源可以是文件、数据库记录、API响应等任何结构化或非结构化数据。

资源示例

// 资源定义示例
{
  "uri": "file:///path/to/document.md",
  "name": "项目文档",
  "description": "项目的README文档",
  "mimeType": "text/markdown"
}

// 资源类型
- 文件资源:本地或远程文件
- 数据库资源:查询结果、表记录
- API资源:REST/GraphQL接口返回的数据
- 实时资源:日志流、传感器数据

提示模板(Prompts)

提示模板是预定义的提示词模板,可以帮助用户快速完成常见任务。 模板支持参数化,可以根据上下文动态生成提示。

提示模板示例

// 提示模板定义
{
  "name": "code_review",
  "description": "代码审查模板",
  "arguments": [
    {
      "name": "language",
      "description": "编程语言",
      "required": true
    },
    {
      "name": "focus",
      "description": "审查重点",
      "required": false
    }
  ]
}

// 使用时生成提示
"请审查以下{language}代码,重点关注{focus}方面..."
→ "请审查以下Python代码,重点关注安全性方面..."

工具(Tools)

工具是AI可以调用的函数,用于执行操作或获取动态数据。 工具的定义与OpenAI Function Calling类似。

工具定义示例

// 工具定义
{
  "name": "execute_query",
  "description": "执行SQL查询",
  "inputSchema": {
    "type": "object",
    "properties": {
      "sql": {
        "type": "string",
        "description": "SQL查询语句"
      }
    },
    "required": ["sql"]
  }
}

// 工具特点
- 可执行操作(写入文件、发送消息等)
- 可返回动态数据
- 支持参数验证
- 可控制执行权限

架构设计

客户端-服务器模型

MCP采用客户端-服务器架构。MCP服务器提供资源、提示和工具, MCP客户端(AI应用)连接服务器并使用这些能力。

MCP架构图

┌─────────────────────────────────────────────────────────────┐
│                        AI 应用(MCP Client)                   │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │   Claude    │  │   Cursor    │  │  其他AI应用  │          │
│  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘          │
└─────────┼────────────────┼────────────────┼──────────────────┘
          │                │                │
          └────────────────┼────────────────┘
                           │ MCP Protocol
          ┌────────────────┼────────────────┐
          │                │                │
    ┌─────┴─────┐    ┌─────┴─────┐    ┌─────┴─────┐
    │ 文件系统   │    │ 数据库     │    │ API服务   │
    │ MCP Server│    │ MCP Server │    │ MCP Server│
    └───────────┘    └───────────┘    └───────────┘

传输层

MCP支持多种传输方式:

传输方式

  • stdio:标准输入输出,适合本地进程通信
  • HTTP with SSE:HTTP + Server-Sent Events,适合远程服务
  • 自定义传输:可根据需要实现自定义传输层

协议流程

能力协商

连接建立后,客户端和服务器会交换能力信息,确定双方支持的功能。

能力协商流程

1. 客户端 → 服务器:initialize
   {
     "protocolVersion": "2024-11-05",
     "capabilities": {
       "resources": { "subscribe": true },
       "tools": {}
     }
   }

2. 服务器 → 客户端:initialize响应
   {
     "protocolVersion": "2024-11-05",
     "capabilities": {
       "resources": { "list": true, "read": true },
       "tools": { "list": true, "execute": true },
       "prompts": { "list": true, "get": true }
     },
     "serverInfo": {
       "name": "filesystem-server",
       "version": "1.0.0"
     }
   }

3. 客户端 → 服务器:initialized通知
   连接正式建立

消息流程

典型消息流程

# 获取资源列表
Client → Server: resources/list
Server → Client: { resources: [...] }

# 读取资源
Client → Server: resources/read { uri: "file:///..." }
Server → Client: { contents: [...] }

# 调用工具
Client → Server: tools/call { 
  name: "execute_query", 
  arguments: { sql: "SELECT..." }
}
Server → Client: { content: [...], isError: false }

生态现状

官方MCP服务器

  • Filesystem:文件系统访问
  • PostgreSQL:数据库操作
  • GitHub:GitHub API集成
  • Google Drive:Google Drive集成
  • Slack:Slack消息集成
  • Puppeteer:浏览器自动化

支持MCP的客户端

  • Claude Desktop:Anthropic官方客户端
  • Cursor:AI代码编辑器
  • Zed:高性能编辑器
  • Continue:VS Code扩展

最佳实践

1. 合理划分服务器

按功能域划分MCP服务器,避免单个服务器过于复杂。

2. 安全优先

严格控制资源访问权限,敏感操作需要用户确认。

3. 提供清晰的描述

资源和工具的描述应该清晰明确,帮助AI理解其用途。

4. 错误处理

提供有意义的错误信息,帮助AI理解失败原因并调整策略。

----