一、什么是 MCP?

MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 在 2024 年底提出的开放标准协议。它被广泛称为**“AI 时代的 USB-C 端口”** ——正如 USB-C 统一了各种外设的接口标准,MCP 统一了 AI Agent 与外部工具、数据源和服务之间的交互方式。

核心价值

在 MCP 出现之前,AI Agent 接入一个新工具往往需要单独编写适配代码,每增加一个工具或数据源都意味着新的集成工作——这就是所谓的 “M×N 问题” 。MCP 通过标准化协议将这一问题转化为 “M+N 问题” :模型侧只需理解任务语义,工具侧只需遵循 MCP 规范,两者通过协议自动对接。

面试金句:“MCP 解决了 Agent 的‘插件碎片化’问题。有了 MCP,工具可以像 USB 设备一样即插即用,无需为每个新数据源单独写适配代码。”

二、MCP 的核心组成

MCP 采用客户端-服务器架构,由以下核心部分组成:

1. MCP Host(宿主)

运行 AI 模型的宿主环境,如 Claude Desktop、Cursor、Cherry Studio 等 AI 应用。

2. MCP Client(客户端)

集成在 Host 内部的客户端,负责与 MCP Server 通信。Agent 通过 MCP Client 以统一方式发现和调用外部能力。

3. MCP Server(服务端)

轻量级服务端程序,对外提供三类核心功能:

能力类型 说明 示例
Tools(工具) 可执行函数,LLM 可直接调用 数据库查询、API 调用、文件操作
Resources(资源) 只读数据源 文件内容、数据库 Schema、日志
Prompts(提示词模板) 预定义的结构化任务模板 代码审查模板、SQL 生成模板

4. 传输层(Transport)

MCP 客户端与服务器之间的通信通道,支持多种传输方式:

  • stdio:通过标准输入输出通信,适合本地进程

  • Streamable HTTP:基于 HTTP 的远程通信,支持流式返回

早期版本还支持独立的 SSE(Server-Sent Events)传输方式,但在 2025 年 6 月 18 日的协议版本中已被 Streamable HTTP 取代。Streamable HTTP 在保留 SSE 流式能力的同时,提供了更统一的 HTTP 语义。

补充说明:文档中提及的 SSE 地址 https://mcp.example.com/sse 为示例地址,该网页解析失败(提示:网页解析失败,可能是不支持的网页类型,请检查网页或稍后重试),属于协议废弃类型的无效端点,生产环境请勿沿用。

三、MCP 的消息格式

MCP 中的所有消息必须遵循 JSON-RPC 2.0 规范。协议定义了三种类型的消息:

1. 请求(Request)

请求从客户端发送到服务器(或相反),用于发起操作:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/list",
  "params": {}
}

关键规则

  • 必须包含字符串或整数类型的 id

  • id 不得为 null(与基础 JSON-RPC 不同)

  • id 不得在同一会话中重复使用

2. 响应(Response)

响应作为对请求的回复发送:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "tools": [
      { "name": "add_note", "description": "添加新备忘录" }
    ]
  }
}

关键规则

  • 必须包含与请求相同的 id

  • 必须设置 resulterror,但不得同时设置两者

3. 通知(Notification)

通知从客户端发送到服务器或相反,接收者不得发送响应

{
  "jsonrpc": "2.0",
  "method": "notifications/tools/list_changed"
}

关键规则:通知不得包含id

四、传输方式详解

1. stdio(标准输入输出)

stdio 是最常见的本地通信方式,适用于 IDE 插件、本地文件系统等场景。

工作原理

  • 客户端将 MCP Server 作为子进程启动

  • Server 从标准输入(stdin)读取 JSON-RPC 消息

  • Server 通过标准输出(stdout)发送消息

  • 消息以换行符分隔,不得包含内嵌换行符

特点

  • 配置简单,适合本地开发

  • 无需网络,延迟低

  • Server 可通过 stderr 输出日志

2. Streamable HTTP(流式 HTTP)

Streamable HTTP 是现代远程通信方式,Server 作为独立进程运行,可处理多个客户端连接。

工作原理

  • Server 提供统一的 HTTP 端点(如 /mcp

  • 客户端通过 HTTP POST 发送 JSON-RPC 消息

  • 支持 Server-Sent Events(SSE)实现流式返回

  • 支持双向通信(服务器到客户端的通知和请求)

安全警告

  • Server 必须验证 Origin 头,防止 DNS 重绑定攻击

  • 本地运行时建议只绑定 localhost(127.0.0.1)

  • 应实现适当的认证机制

五、MCP Server 开发实战

1. 环境准备

Python

# 创建项目
mkdir my-mcp-server && cd my-mcp-server
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 安装 MCP SDK
pip install mcp

TypeScript/JavaScript

mkdir my-mcp-server && cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk

2. 实现一个简单的 MCP Server

以下是一个备忘录管理 MCP Server 的核心实现:

from mcp.server.fastmcp import FastMCP
from datetime import datetime
import json
from pathlib import Path

# 创建 MCP 服务实例
mcp_server = FastMCP(
    name="NoteManager",
    version="1.0",
    log_level="INFO"
)

NOTES_FILE = Path("notes.json")

def load_notes():
    if NOTES_FILE.exists():
        with open(NOTES_FILE, 'r', encoding='utf-8') as f:
            return json.load(f)
    return []

def save_notes(notes):
    with open(NOTES_FILE, 'w', encoding='utf-8') as f:
        json.dump(notes, f, ensure_ascii=False, indent=2)

# 注册工具
@mcp_server.tool(
    name="add_note",
    description="添加新备忘录",
    params_schema={
        "type": "object",
        "properties": {
            "content": {"type": "string"},
            "tags": {"type": "array", "items": {"type": "string"}}
        },
        "required": ["content"]
    }
)
def add_note(params):
    notes = load_notes()
    new_note = {
        "id": len(notes) + 1,
        "content": params["content"],
        "tags": params.get("tags", []),
        "create_time": datetime.now().isoformat()
    }
    notes.append(new_note)
    save_notes(notes)
    return {"status": "success", "note_id": new_note["id"]}

# 启动服务(stdio 模式)
if __name__ == "__main__":
    mcp_server.run()

3. 工具描述的最佳实践

工具的描述(description)至关重要——AI 模型会根据描述判断何时调用该工具。好的工具描述应:

  • 清晰说明工具的功能

  • 说明输入参数的含义

  • 说明输出结果的格式

  • 说明适用的场景和限制

六、MCP Client 集成与配置

1. 配置文件方式(推荐)

大多数 MCP 客户端支持通过配置文件声明 MCP Server,实现 “配置即集成”

mcp.json 配置示例

stdio 本地进程

{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "${env:GITHUB_TOKEN}"
      }
    }
  }
}

stdio 文件系统服务

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "./data"]
    }
  }
}

老旧远程 SSE 服务(已废弃,不推荐使用)

{
  "mcpServers": {
    "remote-knowledge": {
      "url": "https://mcp.example.com/sse",
      "headers": {
        "Authorization": "Bearer ${env:MCP_TOKEN}"
      }
    }
  }
}

配置提示:上述 SSE 配置项为协议旧版本规范,目标地址存在网页解析失败问题,现已全面废弃。远程服务请替换为 Streamable HTTP 端点(如 https://mcp.example.com/mcp)。

2. 代码方式集成

以 Python 为例,构建一个连接 MCP Server 的客户端:

import asyncio
from contextlib import AsyncExitStack
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

class MCPClient:
    def __init__(self):
        self.session = None
        self.exit_stack = AsyncExitStack()
    
    async def connect_to_server(self, server_script_path: str):
        """连接到 MCP 服务器"""
        is_python = server_script_path.endswith('.py')
        command = "python" if is_python else "node"
        
        server_params = StdioServerParameters(
            command=command,
            args=[server_script_path],
            env=None
        )
        
        stdio_transport = await self.exit_stack.enter_async_context(
            stdio_client(server_params)
        )
        self.stdio, self.write = stdio_transport
        self.session = await self.exit_stack.enter_async_context(
            ClientSession(self.stdio, self.write)
        )
        await self.session.initialize()
        
        # 列出可用工具(动态发现)
        response = await self.session.list_tools()
        tools = response.tools
        print("Connected with tools:", [tool.name for tool in tools])

3. 主流平台集成示例

Cursor 编辑器

  1. 导航到 文件 > 首选项 > 游标设置

  2. 从左侧选择 “工具和集成”

  3. 在 “MCP 工具” 部分选择 “新建 MCP 服务器”

  4. 编辑 mcp.json 文件

Spring AI Alibaba(Java)

# application.yml
spring:
  ai:
    mcp:
      client:
        enabled: true
        name: my-agent-mcp
        type: SYNC
        request-timeout: 30s
        toolcallback:
          enabled: true
        stdio:
          servers-configuration: classpath:mcp-servers.json

AgentScope 2.0(Java) :在 workspace/tools.json 中声明 MCP Server,Agent 启动时自动发现并注册工具。

七、安全最佳实践

随着 MCP 生态的快速发展,安全问题日益重要。以下是关键的安全实践:

1. 认证与授权

截至 2026 年初,生态中仅有 8.5% 的 MCP Server 使用 OAuth,91.5% 依赖静态 API Key、共享 Token 或根本没有认证。

建议

  • 对暴露敏感数据或业务逻辑的 MCP Server 实施 OAuth 认证

  • 使用 JWT 令牌、RBAC 权限模型等企业级安全方案

2. 隔离运行

最重要的一条建议:将每个 MCP Server 放在独立的隔离容器中运行,并赋予最小权限。

3. 网络暴露控制

  • Streamable HTTP 模式下,验证 Origin 头防止 DNS 重绑定攻击

  • 本地运行时绑定 127.0.0.1 而非 0.0.0.0

4. 操作确认

高风险操作(如删除文件)应要求用户手动授权。

八、总结

MCP 通过标准化协议彻底改变了 AI Agent 与外部世界的交互方式:

  1. 统一接入:一个协议覆盖工具调用、资源读取、提示词模板三大能力

  2. 动态发现:Client 可实时获取 Server 提供的所有工具列表

  3. 多 Server 聚合:一个 Agent 可连接多个 MCP Server,组合不同能力

  4. 配置即集成:通过配置文件声明 MCP Server,无需编写适配代码

MCP 让 AI 从 “只会说” 进化为 “能做事” 。无论你是 AI 应用开发者、工具提供方还是企业架构师,掌握 MCP 都已成为 2026 年 AI 技术栈的必修课。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐