PAGE 10 · PHASE 4

🔌 MCP 协议

Model Context Protocol — AI 应用的"USB 接口",标准化 LLM 与外部工具、数据源的连接方式

进阶 2024 新
01

🌐什么是 MCP?

Model Context Protocol 概述

MCP(Model Context Protocol)是由 Anthropic 于 2024 年 11 月发布的开放标准协议,旨在为 AI 模型与外部数据源、工具之间提供统一的连接方式。可以把它理解为 AI 世界的"USB-C 接口"——一个标准,让所有工具和所有模型都能即插即用。

在 MCP 之前,每个 AI 应用都需要为每个工具编写定制集成代码,形成 M×N 的集成难题。MCP 将其简化为 M+N:工具提供者实现 MCP Server,AI 应用实现 MCP Client,双方通过标准协议对话。

为什么需要 MCP?

🔌

统一接口

一次实现,所有 AI 应用都能使用。告别重复集成

🔒

安全可控

数据不离开本地,用户确认后才执行敏感操作

🌍

开放生态

开源协议,任何人都可以构建 MCP Server/Client

实时双向

支持双向通信、订阅变更、流式传输

📊
截至 2026 年初,MCP 协议已获得超过 9700 万次下载,被 Claude Desktop、VS Code、Cursor、Windsurf、各大 IDE 和众多 AI 应用支持。
02

🏗️架构设计

Client-Server 架构

MCP 采用经典的 Client-Server 架构,其中 Host 应用(如 Claude Desktop)内嵌 MCP Client,通过标准化协议与一个或多个 MCP Server 通信。

MCP 架构全景
Host 应用
Claude / IDE / 自定义
MCP Client
协议连接管理
↕ JSON-RPC 2.0
MCP Server A
GitHub
MCP Server B
数据库
MCP Server C
文件系统
GitHub API
PostgreSQL
本地文件

关键角色

角色职责示例
Host承载 AI 交互的应用程序Claude Desktop, VS Code, 自定义 App
Client管理与 Server 的连接,协议翻译嵌入在 Host 中的 SDK
Server暴露 Tools/Resources/Prompts 给 ClientGitHub MCP Server, FS Server
03

🧱三大原语(Primitives)

Tools — 可执行操作

Tools 让 LLM 能够通过 Server 执行操作。模型发现并调用 Tool,但需要用户确认(人在回路)。

# MCP Server 定义 Tool
@server.tool()
async def create_issue(
    title: str,
    body: str,
    repo: str
) -> str:
    """在 GitHub 仓库创建 Issue。
    
    Args:
        title: Issue 标题
        body: Issue 正文描述
        repo: 仓库名称(格式:owner/repo)
    """
    result = await github.create_issue(repo, title, body)
    return f"Issue #{result.number} 创建成功"

Resources — 结构化数据

Resources 让 Server 向 Client 暴露结构化数据,类似 REST API 的 GET 端点。Client(而非模型)控制何时读取。

@server.resource("config://app-settings")
async def get_settings() -> str:
    """获取应用配置信息"""
    return json.dumps(load_config())

# 带 URI 模板的动态 Resource
@server.resource("db://users/{user_id}/profile")
async def get_user_profile(user_id: str) -> str:
    """获取用户档案"""
    user = await db.get_user(user_id)
    return json.dumps(user.to_dict())

Prompts — 提示词模板

Prompts 让 Server 提供可复用的提示词模板,帮助用户更好地与 AI 交互。

@server.prompt()
async def code_review(code: str, language: str) -> list:
    """代码审查提示词模板"""
    return [
        {
            "role": "user",
            "content": f"""请审查以下 {language} 代码:
```{language}
{code}
```
关注:安全性、性能、可读性、最佳实践。"""
        }
    ]

三大原语对比

原语控制方类比用途
Tools模型调用,人确认POST API执行操作(创建、修改、删除)
Resources应用/用户控制GET API读取数据(文件、配置、数据库)
Prompts用户选择模板标准化交互方式
04

🚀传输协议

两种传输方式

传输协议适用场景特点
stdio 标准输入/输出 本地进程(CLI 工具、IDE 插件) 简单、低延迟、无需网络
Streamable HTTP HTTP + SSE 远程服务、云端部署 支持网络传输、可扩展

通信协议:JSON-RPC 2.0

MCP 使用 JSON-RPC 2.0 作为消息格式,支持三种消息类型:

// Request(请求)
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "create_issue",
    "arguments": { "title": "Bug fix", "repo": "org/repo" }
  }
}

// Response(响应)
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [{ "type": "text", "text": "Issue #42 created" }]
  }
}

// Notification(通知,无需响应)
{
  "jsonrpc": "2.0",
  "method": "notifications/resources/updated",
  "params": { "uri": "config://app-settings" }
}
05

🛠️构建 MCP Server

Python SDK 快速开始

# pip install mcp
from mcp.server.fastmcp import FastMCP

# 创建 Server 实例
mcp = FastMCP("my-weather-server")

# 定义 Tool
@mcp.tool()
async def get_weather(city: str) -> str:
    """获取指定城市的天气信息。
    
    Args:
        city: 城市名称,例如"北京"、"上海"
    """
    data = await weather_api.fetch(city)
    return f"{city}: {data.temp}°C, {data.desc}"

# 定义 Resource
@mcp.resource("weather://forecast/{city}")
async def get_forecast(city: str) -> str:
    """获取 7 天天气预报"""
    return json.dumps(await weather_api.forecast(city))

# 定义 Prompt
@mcp.prompt()
async def travel_advice(destination: str) -> str:
    """旅行建议提示词"""
    weather = await get_weather(destination)
    return f"我计划去{destination}旅行,当前天气:{weather},请给出穿衣和行程建议。"

# 运行
if __name__ == "__main__":
    mcp.run()

TypeScript SDK

// npm install @modelcontextprotocol/sdk
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from
  "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

const server = new McpServer({ name: "weather", version: "1.0.0" });

server.tool(
  "get_weather",
  "Get weather for a city",
  { city: z.string().describe("City name") },
  async ({ city }) => ({
    content: [{ type: "text", text: `${city}: 25°C, Sunny` }]
  })
);

const transport = new StdioServerTransport();
await server.connect(transport);
06

🖥️构建 MCP Client

Python Client 示例

from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

# 连接到 MCP Server
params = StdioServerParameters(
    command="python",
    args=["weather_server.py"]
)

async with stdio_client(params) as (read, write):
    async with ClientSession(read, write) as session:
        # 初始化连接
        await session.initialize()
        
        # 列出可用工具
        tools = await session.list_tools()
        print("可用工具:", [t.name for t in tools.tools])
        
        # 调用工具
        result = await session.call_tool(
            "get_weather",
            arguments={"city": "北京"}
        )
        print(result.content[0].text)
        # → "北京: 15°C, 晴"

与 LangChain 集成

from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent

# 连接多个 MCP Server
async with MultiServerMCPClient({
    "weather": {"command": "python", "args": ["weather_server.py"]},
    "github": {"command": "npx", "args": ["@modelcontextprotocol/server-github"]},
}) as client:
    tools = client.get_tools()
    agent = create_react_agent(llm, tools)
    
    result = await agent.ainvoke({
        "messages": [("human", "北京天气怎么样?")]
    })
07

🌍生态与集成

主要 MCP Server 生态

📁

Filesystem

安全的本地文件读写操作

🐙

GitHub

仓库、Issue、PR、代码搜索

🗄️

PostgreSQL

数据库查询与模式浏览

🌐

Brave Search

网络搜索与本地搜索

💬

Slack

频道消息、用户查询

📊

Google Drive

文档搜索与内容读取

🐳

Docker

容器管理与部署

🤖

Puppeteer

浏览器自动化与截图

支持 MCP 的 Host 应用

应用类型支持情况
Claude DesktopAI 助手完整支持 Tools + Resources + Prompts
VS Code (Copilot)IDEAgent Mode 支持 MCP Tools
CursorAI IDE支持 MCP Server 配置
WindsurfAI IDE支持 MCP Server 配置
OpenClawAI 平台深度集成 MCP 生态
08

最佳实践

Server 开发指南

  • 工具描述清晰:用自然语言详细描述每个 Tool 的功能、参数含义和返回值,这直接影响 LLM 的调用准确率
  • 参数校验严格:使用 Pydantic/Zod 定义参数 Schema,避免注入和异常输入
  • 错误处理优雅:返回结构化错误信息,帮助 LLM 理解失败原因并重试
  • 最小权限原则:Server 只暴露必要的功能,避免过度授权
  • 幂等性:写操作尽量保证幂等,防止重复调用导致数据异常

安全考量

🔒
关键安全原则:
1. 人在回路(Human-in-the-loop):敏感操作(写入、删除、发送)必须经用户确认
2. 输入消毒:防止 Prompt Injection 通过工具参数注入恶意指令
3. 速率限制:防止 LLM 循环调用导致 API 配额耗尽
4. 审计日志:记录所有工具调用历史,便于排查和合规
💡
快速上手建议:先从 Anthropic 官方的 MCP Quickstart 开始,用 FastMCP 框架可以在 10 行代码内创建一个可用的 MCP Server。

📚 参考资料与出处

  1. Anthropic MCP 官方文档 — modelcontextprotocol.io
  2. MCP Specification — spec.modelcontextprotocol.io
  3. MCP GitHub — github.com/modelcontextprotocol
  4. Anthropic Blog: "Introducing the Model Context Protocol" (2024.11) — anthropic.com
  5. MCP Python SDK — github.com/modelcontextprotocol/python-sdk
  6. MCP TypeScript SDK — github.com/modelcontextprotocol/typescript-sdk
  7. LangChain MCP Adapters — github.com/langchain-ai/langchain-mcp-adapters