MCP 入门完全指南:模型上下文协议详解与实战

更新日期 :2026 年 2 月
适用读者 :AI 开发者、LLM 应用构建者、技术决策者
前置知识:了解大语言模型(LLM)、API 调用、JSON 格式


一、什么是 MCP?

MCP (Model Context Protocol,模型上下文协议)是由 Anthropic 于 2024 年底提出并开源的一种标准化协议 ,旨在让大语言模型(如 Claude、GPT、Llama 等)能够安全、高效、结构化地访问外部工具和数据源

一句话定义
MCP 是 LLM 与外部世界通信的"通用语言" ,就像 HTTP 之于 Web。


二、为什么需要 MCP?------解决 LLM 的三大痛点

问题 传统方案 MCP 方案
工具碎片化 每个工具需定制集成(如 LangChain 工具) 统一接口,一次接入,多模型可用
上下文污染 工具结果以文本拼接,易混乱 结构化 JSON 响应,模型精准理解
安全性风险 直接暴露 API 密钥或系统命令 通过 MCP Server 隔离,权限可控

🌰 举个例子:

你想让 AI 帮你查天气 + 发邮件 + 查数据库。

  • 无 MCP:需为每个模型写三套工具调用逻辑
  • 有 MCP:只需部署一个 MCP Server,所有支持 MCP 的模型自动获得能力

三、MCP 核心架构

scss 复制代码
[ LLM (Claude/GPT/Llama) ]
          ↓ (MCP over HTTP/WS)
[ MCP Client (内置在 AI 应用中) ]
          ↓
[ MCP Server (你的后端服务) ]
          ↓
[ 外部工具:数据库 / API / 文件系统 / 自定义函数 ]

关键组件说明:

组件 作用 示例
MCP Server 实现 MCP 协议的服务端 用 Python/Node.js 编写的微服务
MCP Client 模型侧的协议解析器 Anthropic 官方提供,集成在 Claude 中
Tool Definition 工具的元数据描述 JSON Schema 定义输入/输出
Resource 可被模型读取的数据源 如日历事件、文件列表

四、MCP 支持的操作类型

MCP 定义了三种核心操作:

1. Tools(工具) → 执行动作

  • 模型可调用的函数
  • 例如:send_email(), query_database(), create_jira_ticket()

2. Resources(资源) → 读取数据

  • 模型可列出/读取的静态数据
  • 例如:list_files(), get_calendar_events(), read_config()

3. Prompts(提示模板) → 复用指令

  • 预定义的提示词模板
  • 例如:summarize_text, translate_to_chinese

💡 注意 :截至 2026 年初,Tools 和 Resources 是主流用法,Prompts 尚在实验阶段。


五、动手实践:用 Python 实现一个 MCP Server

我们将创建一个简单的 MCP Server,提供两个功能:

  1. 获取当前时间(Tool)
  2. 列出项目文件(Resource)

步骤 1:安装依赖

复制代码
pip install fastapi uvicorn pydantic

步骤 2:创建 mcp_server.py

python 复制代码
# mcp_server.py
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import os
from datetime import datetime
import json

app = FastAPI()

# === MCP 协议核心:处理 LLM 的请求 ===
@app.post("/mcp")
async def handle_mcp_request(request: Request):
    body = await request.json()
    
    # 获取操作类型
    method = body.get("method")
    params = body.get("params", {})
    
    if method == "initialize":
        # 返回服务器支持的能力
        return JSONResponse({
            "jsonrpc": "2.0",
            "id": body.get("id"),
            "result": {
                "protocolVersion": "2024-10-07",
                "capabilities": {
                    "tools": {},
                    "resources": {}
                }
            }
        })
    
    elif method == "list_tools":
        # 声明可用工具
        return JSONResponse({
            "jsonrpc": "2.0",
            "id": body.get("id"),
            "result": [
                {
                    "name": "get_current_time",
                    "description": "获取服务器当前时间",
                    "inputSchema": {
                        "type": "object",
                        "properties": {},
                        "required": []
                    }
                }
            ]
        })
    
    elif method == "call_tool":
        tool_name = params.get("name")
        if tool_name == "get_current_time":
            current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            return JSONResponse({
                "jsonrpc": "2.0",
                "id": body.get("id"),
                "result": {
                    "content": [{"type": "text", "text": f"当前时间是: {current_time}"}],
                    "isError": False
                }
            })
    
    elif method == "list_resources":
        return JSONResponse({
            "jsonrpc": "2.0",
            "id": body.get("id"),
            "result": [
                {"uri": "file://project_files", "name": "项目文件列表"}
            ]
        })
    
    elif method == "read_resource":
        uri = params.get("uri")
        if uri == "file://project_files":
            files = os.listdir(".")
            file_list = "\n".join(files)
            return JSONResponse({
                "jsonrpc": "2.0",
                "id": body.get("id"),
                "result": {
                    "contents": [{"type": "text", "text": file_list}]
                }
            })
    
    # 未知方法
    return JSONResponse({
        "jsonrpc": "2.0",
        "id": body.get("id"),
        "error": {"code": -32601, "message": "Method not found"}
    })

步骤 3:启动服务器

lua 复制代码
uvicorn mcp_server:app --host 0.0.0.0 --port 8000

现在你的 MCP Server 运行在 http://localhost:8000/mcp


六、如何让 Claude 使用你的 MCP Server?

方法 1:通过 Claude.ai 官网(需企业版)

  1. 登录 claude.ai
  2. 进入 Settings → Developer Settings
  3. 添加 MCP Server URL:http://your-server.com/mcp
  4. Claude 在聊天中会自动发现并使用你的工具!

📌 限制 :目前仅 Claude Pro/Enterprise 用户 可配置自定义 MCP。

方法 2:通过 API 调用(推荐开发者)

ini 复制代码
# client_example.py
from anthropic import Anthropic
import requests

client = Anthropic(api_key="your_api_key")

# 构造带 MCP 上下文的消息
response = client.messages.create(
    model="claude-3-5-sonnet-20260201",
    max_tokens=1024,
    system="你是一个助手,可以使用工具获取信息。",
    messages=[
        {
            "role": "user",
            "content": "请告诉我现在的时间,并列出当前目录的文件。"
        }
    ],
    # 关键:附加 MCP 上下文(模拟 MCP Client 行为)
    extra_headers={
        "anthropic-beta": "mcp-2024-10-07"
    },
    # 实际生产中,此步骤由 MCP Client 自动完成
)

⚠️ 注意 :截至 2026 年 2 月,官方 MCP Client SDK 尚未完全开放 ,但 Anthropic 提供了 mcp 开源库用于构建自己的客户端。


七、MCP 消息格式详解(JSON-RPC 2.0)

MCP 基于 JSON-RPC 2.0 协议,典型请求/响应如下:

请求示例:调用工具

json 复制代码
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "call_tool",
  "params": {
    "name": "get_current_time",
    "arguments": {}
  }
}

响应示例:

json 复制代码
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "当前时间是: 2026-02-08 10:30:45"
      }
    ],
    "isError": false
  }
}

错误响应:

css 复制代码
{
  "jsonrpc": "2.0",
  "id": 2,
  "error": {
    "code": -32602,
    "message": "Invalid arguments"
  }
}

八、安全最佳实践

1. 认证与授权

  • 为 MCP Server 添加 API Key 验证
  • 使用 JWT 或 OAuth 2.0 控制访问权限
python 复制代码
# 在 FastAPI 中添加中间件
@app.middleware("http")
async def verify_api_key(request: Request, call_next):
    key = request.headers.get("x-api-key")
    if key != "your-secret-key":
        return JSONResponse({"error": "Unauthorized"}, status_code=401)
    return await call_next(request)

2. 输入验证

  • 严格校验 call_tool 的参数
  • 防止路径遍历、SQL 注入等攻击

3. 沙箱执行

  • 工具函数在隔离环境中运行
  • 限制文件系统/网络访问权限

九、MCP vs 其他工具调用方案

方案 优点 缺点
MCP 标准化、多模型兼容、安全隔离 生态较新,文档较少
LangChain Tools 生态成熟、插件丰富 绑定 LangChain,迁移成本高
Function Calling (OpenAI) 原生支持、简单易用 仅限 OpenAI 模型
Custom API 完全可控 需为每个模型重复开发

MCP 的最大优势一次开发,多模型复用


十、真实应用场景

场景 1:企业内部知识库

  • MCP Server 连接 Confluence/Notion
  • 员工问:"Q4 营销计划是什么?" → 模型自动检索并总结

场景 2:开发助手

  • MCP Server 集成 Git/GitHub
  • 开发者说:"创建一个修复登录 bug 的 PR" → 自动执行 git 命令

场景 3:数据分析

  • MCP Server 连接数据库
  • "上月销售额最高的产品?" → 执行 SQL 并返回图表

十一、学习资源


十二、常见问题(FAQ)

Q1:MCP 支持哪些模型?

  • 官方支持:Claude 3.5+(Sonnet/Opus)
  • 社区适配:通过 MCP Client,理论上可支持任何 LLM

Q2:MCP 是开源的吗?

  • 是! 协议和参考实现均在 GitHub 开源(Apache 2.0 许可证)

Q3:和 LangChain 冲突吗?

  • 不冲突!可将 MCP Server 作为 LangChain 的 Tool 使用

Q4:性能如何?

  • 单次工具调用延迟 ≈ 网络 RTT + 工具执行时间
  • 建议对高频工具做缓存

十三、总结

MCP 是 LLM 应用开发的"游戏规则改变者"

它通过标准化协议,解决了工具集成的碎片化问题,让开发者能一次构建,多处运行

关键要点回顾:

  1. MCP = LLM 与外部世界的通用接口
  2. 三大能力:Tools(执行)、Resources(读取)、Prompts(模板)
  3. 基于 JSON-RPC 2.0,易于实现
  4. 安全第一:务必做好认证和输入验证
  5. 未来已来:2026 年,MCP 将成为 AI 应用标配

作者 :AI 架构师
版权声明 :本文可自由转载,但请保留出处。
GitHub 示例代码github.com/yourname/mc...(虚构)

相关推荐
SunnyRivers8 小时前
吴恩达讲Agent Skills
agent·tools·mcp·skills·agent skills
zhangshuang-peta9 小时前
人工智能代理团队在软件开发中的协同机制
人工智能·ai agent·mcp·peta
依米阳光0819 小时前
Playwright MCP AI实现自动化UI测试
ui·自动化·playwright·mcp
csdn_life181 天前
openclaw mcporter 操作 chome 在 window10/linux chrome-devtools-mcp
chrome·mcp·openclaw
斯普信专业组1 天前
构建基于MCP的MySQL智能运维平台:从开源服务端到交互式AI助手
运维·mysql·开源·mcp
组合缺一1 天前
Solon AI (Java) v3.9 正式发布:全能 Skill 爆发,Agent 协作更专业!仍然支持 java8!
java·人工智能·ai·llm·agent·solon·mcp
带刺的坐椅2 天前
用 10 行 Java8 代码,开发一个自己的 ClaudeCodeCLI?你信吗?
java·ai·llm·agent·solon·mcp·claudecode·skills
zhangshuang-peta2 天前
Kong MCP注册表与Peta:在人工智能系统中连接服务发现与运行时安全
人工智能·ai agent·mcp·peta
zhangshuang-peta3 天前
适用于MCP的Nginx类代理:为何AI工具集成需要网关层
人工智能·ai agent·mcp·peta