一、基础概念

二、核心功能

三、实战教程

四、进阶指南

五、总结


什么是MCP?

MCP(Model Context Protocol)是Anthropic在2024年推出的模型上下文协议。它是一个开放标准,让AI模型能够安全、标准化地连接外部数据源和工具。

简单理解:MCP是AI世界的USB-C接口——一个协议,连接万物。

为什么需要MCP?

痛点:AI的"信息孤岛"

大模型很强大,但有两个致命弱点:

  1. 知识有截止日期 - 不知道今天发生了什么

  2. 无法执行操作 - 只能说,不能做

想让AI查实时天气?读你的文件?操作数据库?以前每接一个功能,都要写一堆定制代码。

解决:标准化连接

MCP的出现,让这件事变得简单:

以前:AI → 定制代码A → 工具A
     AI → 定制代码B → 工具B
     AI → 定制代码C → 工具C
     (每个都要单独开发)
​
现在:AI → MCP协议 → 任意MCP服务器
     (一次开发,到处可用)

核心架构

MCP采用客户端-服务器架构:

┌─────────────────────────────────────────────────────────┐
│                      AI应用(宿主)                      │
│  ┌─────────────────────────────────────────────────┐   │
│  │                MCP客户端                         │   │
│  │   ┌─────────┐ ┌─────────┐ ┌─────────┐         │   │
│  │   │ 客户端A │ │ 客户端B │ │ 客户端C │  ...     │   │
│  │   └────┬────┘ └────┬────┘ └────┬────┘         │   │
│  └────────┼───────────┼───────────┼───────────────┘   │
└───────────┼───────────┼───────────┼─────────────────────┘
            │           │           │
            ▼           ▼           ▼
      ┌──────────┐ ┌──────────┐ ┌──────────┐
      │MCP服务器A│ │MCP服务器B│ │MCP服务器C│
      │ (数据库) │ │ (文件系统)│ │ (API服务)│
      └──────────┘ └──────────┘ └──────────┘

三个核心角色

角色 职责 举例
宿主(Host) 运行AI的应用 Claude Desktop、Cursor、你的AI应用
客户端(Client) 处理协议通信 内嵌在宿主中,管理与服务器的连接
服务器(Server) 提供具体能力 天气服务、数据库服务、文件服务

三大核心功能

1. 工具(Tools)—— 让AI"能做"

工具让AI可以执行操作,比如:

from mcp.server.fastmcp import FastMCP
​
mcp = FastMCP("my-tools")
​
@mcp.tool()
async def send_email(to: str, subject: str, body: str) -> str:
    """发送邮件"""
    # 实际发送逻辑...
    return f"邮件已发送至 {to}"
​
@mcp.tool()
async def query_database(sql: str) -> list:
    """执行SQL查询"""
    # 实际查询逻辑...
    return [{"name": "张三", "age": 28}]

典型场景:

  • 发送消息/邮件

  • 操作数据库

  • 调用第三方API

  • 文件增删改

2. 资源(Resources)—— 让AI"能看"

资源让AI可以读取数据,比如:

@mcp.resource("file:///{path}")
async def read_file(path: str) -> str:
    """读取文件内容"""
    with open(path, 'r') as f:
        return f.read()
​
@mcp.resource("db://users/{user_id}")
async def get_user(user_id: str) -> dict:
    """获取用户信息"""
    return {"id": user_id, "name": "张三"}

典型场景:

  • 读取本地文件

  • 查询数据库记录

  • 获取API数据

  • 访问云存储

3. 提示(Prompts)—— 让AI"更专业"

提示模板让AI在特定场景下表现更好:

@mcp.prompt()
async def code_review(code: str, language: str) -> str:
    """代码审查提示"""
    return f"""请审查以下{language}代码,关注:
1. 安全漏洞
2. 性能问题
3. 代码规范
​
代码:
```{language}
{code}
```"""
​
@mcp.prompt()
async def translate(text: str, target_lang: str) -> str:
    """翻译提示"""
    return f"将以下文本翻译成{target_lang},保持原意和语气:\n\n{text}"

典型场景:

  • 代码审查模板

  • 翻译优化模板

  • 数据分析模板

  • 内容创作模板

实战:5分钟搭建MCP服务器

根据你的技术栈选择对应语言:

Python版本(推荐使用FastMCP)

第一步:安装依赖
pip install mcp
第二步:编写服务器
# weather_server.py
from mcp.server.fastmcp import FastMCP
​
# 创建FastMCP服务器实例
mcp = FastMCP("weather-server")
​
@mcp.tool()
async def get_weather(city: str) -> str:
    """获取指定城市的天气信息"""
    # 这里用模拟数据,实际可调用天气API
    weather_data = {
        "北京": "晴,25°C,湿度40%",
        "上海": "多云,22°C,湿度65%",
        "广州": "阵雨,28°C,湿度80%",
    }
    return weather_data.get(city, f"暂无{city}的天气数据")
​
@mcp.tool()
async def get_weather_forecast(city: str, days: int = 3) -> str:
    """获取未来几天的天气预报"""
    return f"{city}未来{days}天天气预报:晴转多云,气温20-28°C"
​
if __name__ == "__main__":
    mcp.run()
第三步:配置客户端

在Claude Desktop的配置文件中添加:

{
  "mcpServers": {
    "weather": {
      "command": "python",
      "args": ["weather_server.py"]
    }
  }
}

TypeScript + Node.js版本

第一步:初始化项目
# 创建项目文件夹
mkdir weather-mcp && cd weather-mcp
​
# 初始化项目
npm init -y
​
# 安装MCP SDK
npm install @modelcontextprotocol/sdk
第二步:编写服务器
// weather_server.js
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { ListToolsRequestSchema, CallToolRequestSchema } from "@modelcontextprotocol/sdk/types.js";
​
const server = new Server({
  name: "weather-server",
  version: "1.0.0"
}, {
  capabilities: { tools: {} }
});
​
// 定义可用工具
server.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [
    {
      name: "get_weather",
      description: "获取指定城市的天气信息",
      inputSchema: {
        type: "object",
        properties: {
          city: { type: "string", description: "城市名称" }
        },
        required: ["city"]
      }
    }
  ]
}));
​
// 处理工具调用
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === "get_weather") {
    const city = request.params.arguments.city;
    const weatherData = {
      "北京": "晴,25°C,湿度40%",
      "上海": "多云,22°C,湿度65%",
      "广州": "阵雨,28°C,湿度80%"
    };
    return {
      content: [{
        type: "text",
        text: weatherData[city] || `暂无${city}的天气数据`
      }]
    };
  }
});
​
// 启动服务器
const transport = new StdioServerTransport();
await server.connect(transport);
第三步:配置package.json

确保你的 package.json 包含:

{
  "name": "weather-mcp",
  "version": "1.0.0",
  "type": "module",
  "main": "weather_server.js"
}
第四步:配置客户端

在Claude Desktop的配置文件中添加:

{
  "mcpServers": {
    "weather": {
      "command": "node",
      "args": ["weather_server.js"]
    }
  }
}

测试使用

重启Claude Desktop,然后问:

"北京今天天气怎么样?"

AI会自动调用你的天气服务器,返回实时数据。

传输方式

MCP支持多种通信方式:

传输方式 特点 适用场景
stdio 标准输入输出,简单直接 本地工具、CLI集成
SSE Server-Sent Events,HTTP长连接 Web应用、远程服务
Streamable HTTP 新一代HTTP传输,更灵活 生产环境、高并发

安全最佳实践

MCP设计时就把安全放在首位:

1. 最小权限原则

# 只暴露必要的工具
@mcp.tool()
def read_file(path: str) -> str:
    """只读权限,不能写入"""
    # 检查路径是否在允许范围内
    if not is_allowed_path(path):
        raise PermissionError("无权访问该路径")
    ...

2. 用户确认机制

  • 敏感操作(删除、发送)需要用户确认

  • 可配置自动批准的工具列表

  • 所有操作可审计追溯

3. 输入验证

@mcp.tool()
def query_database(sql: str) -> list:
    """执行查询,但禁止危险操作"""
    # 禁止删除、更新等操作
    if any(keyword in sql.upper() for keyword in ["DROP", "DELETE", "UPDATE"]):
        raise ValueError("只允许SELECT查询")
    ...

生态系统

MCP正在快速发展,已有的服务器包括:

官方示例:

  • 文件系统访问

  • PostgreSQL/SQLite数据库

  • Git操作

  • Google Maps

  • Brave搜索

社区贡献:

  • Slack/Discord集成

  • GitHub操作

  • 云服务(AWS/GCP/Azure)

  • 各类SaaS工具

常见问题

MCP vs OpenAI Function Calling 详细对比

对比维度 MCP OpenAI Function Calling
协议标准 开放标准,Anthropic主导 OpenAI私有协议
跨平台 ✅ 支持所有AI模型 ❌ 仅限OpenAI模型
功能范围 工具 + 资源 + 提示 仅工具调用
状态管理 支持有状态会话 无状态,每次调用独立
传输方式 stdio / SSE / HTTP HTTP API调用
生态建设 统一生态,一次开发多处可用 碎片化,各平台各搞各的
学习成本 需学习协议规范 简单,定义JSON Schema即可
适用场景 复杂工具链、跨AI平台 简单单次工具调用

选择建议:

  • 用Claude → 优先MCP

  • 只用OpenAI → Function Calling够用

  • 需要跨平台 → 必须MCP


什么时候不用MCP?

MCP很强大,但不是所有场景都需要:

场景 是否需要MCP 替代方案
简单API调用 ❌ 不需要 直接用Function Calling
单模型单工具 ❌ 不需要 内置工具调用
纯文本生成 ❌ 不需要 纯Prompt工程
实时流式处理 ⚠️ 谨慎 WebSocket更合适
高性能计算 ❌ 不需要 专用微服务
多工具协作 ✅ 推荐MCP -
跨AI平台 ✅ 推荐MCP -
复杂工作流 ✅ 推荐MCP -

简单判断标准:

  • 只调用1-2个简单工具 → 不用MCP

  • 需要多个工具协作、跨平台复用 → 用MCP


版本兼容性说明

MCP协议版本
版本 发布时间 主要特性 状态
2024-11-05 2024年11月 首个正式版,基础功能 ✅ 稳定
2025-03-26 2025年3月 OAuth 2.1认证、Streamable HTTP ✅ 推荐
2025-06-18 2025年6月 结构化工具输出、资源链接 ✅ 最新
SDK版本要求
SDK 最低版本 推荐版本 备注
Python >=1.0.0 最新 支持async/await
TypeScript >=1.0.0 最新 需要Node.js 18+
Java(社区) >=0.2.0 最新 非官方维护
客户端兼容性
客户端 MCP版本支持 备注
Claude Desktop 2024-11-05+ 原生支持
Cursor 2024-11-05+ 内置支持
Windsurf 2024-11-05+ 内置支持
自建应用 取决于SDK版本 使用对应语言SDK
常见兼容性问题
  1. SDK版本过低

    错误:Method not found
    解决:升级SDK到最新版本
  2. Node.js版本过低

    错误:SyntaxError: Unexpected token
    解决:升级Node.js到18+
  3. Python版本过低

    错误:ModuleNotFoundError
    解决:使用Python 3.10+

💡 建议: 始终使用最新稳定版SDK,避免版本兼容问题。


支持哪些编程语言?

语言 SDK来源 安装命令 适合人群
Python 官方 pip install mcp Python开发者、数据科学
TypeScript/Node.js 官方 npm install @modelcontextprotocol/sdk 前端/全栈开发者
Java 社区 Maven/Gradle引入 Java后端开发者
Go 社区 go get Go开发者
Rust 社区 Cargo引入 系统级开发

💡 选择建议: 用你最熟悉的语言就行,功能都一样。

总结

MCP解决了AI连接外部世界的关键问题:

标准化 - 一套协议,连接所有工具 ✅ 可组合 - 像乐高一样拼装能力 ✅ 安全可控 - 权限明确,操作可审计 ✅ 生态共建 - 开发一次,所有AI可用

一句话:MCP让AI从"聊天机器人"进化成"智能助手"。


相关资源


Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐