现在位置: 首页 > Vibe Coding 教程 > 正文

MCP 入门教程

MCP 英文全称 Model Context Protocol(模型上下文协议),是一个开放标准协议,用于标准化 AI 应用与外部工具、数据源之间的连接方式。

MCP 就像 USB-C 一样,可以让不同设备能够通过相同的接口连接在一起。

在 MCP 出现之前,每接入一个新工具(如 GitHub、Slack、数据库),每个 AI 应用都要单独写一套集成代码,形成 N × M 集成难题(N 个 AI 应用 × M 个工具 = N×M 套代码)。

有了 MCP 之后,工具方只需按标准做一个 MCP Server,任何支持 MCP 的 AI 应用都能直接使用,变成 1 套 Server + 兼容所有 Host

下图直观展示了传统 N×M 集成与 MCP 标准化集成的区别:

传统 N×M 集成 vs MCP 标准化集成对比图

MCP 已于 2025 年 12 月由 Anthropic 捐赠给 Linux Foundation 下的 Agentic AI Foundation(AAIF),成为行业共有的开放标准。OpenAI、Block 等厂商共同参与治理。

发展时间线

时间里程碑
2023 年前OpenAI 推出 function calling、ChatGPT 插件框架,但均为厂商私有格式,绑定单一平台
2024 年 11 月Anthropic 发布 MCP,模型无关、厂商中立,任何模型都能用同一个 Server
2025 年 3 月OpenAI 官方宣布支持 MCP
2025 年中新增 Streamable HTTP 传输、OAuth 2.1 授权、Elicitation(信息征询)等能力,MCP 走向生产级远程服务
2025 年 12 月协议治理权移交 AAIF(Linux Foundation),进入多厂商共治阶段
2026 年核心朝无状态化演进,新增 Tasks(长任务)、MCP Apps(交互式 UI)等扩展能力

核心架构:Host / Client / Server

MCP 借鉴了 LSP(Language Server Protocol,编辑器统一支持编程语言的协议)的设计思路,定义了三种角色:

角色说明例子
Host(主机) 用户直接使用的 AI 应用,负责协调多个 Client、管理对话 Claude Code、Claude Desktop、Cursor、ChatGPT
Client(客户端) Host 内部组件,与某一个 Server 保持一对一连接,负责将模型的工具调用请求翻译为标准协议消息 Host 每连接一个 Server 就会创建一个 Client
Server(服务器) 包一层标准协议,暴露某个具体工具或数据源的能力,不直接与大模型对话 GitHub API Server、数据库 Server、文件系统 Server

三层架构关系如下图所示:

MCP 三层架构图:Host / Client / Server

底层通信统一使用 JSON-RPC 2.0 消息格式,保证了不同角色之间交互的标准化。


MCP 通信流程详解

以"用户让 AI 查天气"为例,一次完整的工具调用过程如下:

MCP 通信流程时序图:用户提问到获取结果的完整链路

流程分为七个步骤:

  1. 用户提问:用户在 Host(如 Claude Code)中输入"帮我查一下北京天气"。
  2. 模型判断:Host 内置的大模型分析问题,判断需要调用天气查询工具,将调用意图发送给 Client。
  3. 协议翻译:Client 将工具调用请求转换为 JSON-RPC 2.0 格式消息,发送给对应的 Server。
  4. Server 执行:Server 收到请求后执行实际操作(如调用天气 API、查询数据库)。
  5. 返回结果:Server 将结果以 JSON-RPC 格式返回给 Client。
  6. 交回模型:Client 将结果传回 Host,供模型整合到回答中。
  7. 回答用户:模型将工具返回的数据与自然语言整合,输出最终回答。

在整个流程中,Server 完全不知道大模型的存在——它只处理 JSON-RPC 消息,这是 MCP 实现模型无关的关键设计。


三大核心原语

一个 MCP Server 可以对外暴露三类能力,称为"原语"(Primitive):

原语定义典型场景
Tools(工具) 可执行的动作,模型可主动调用,会产生副作用(如写数据、发消息) 发送邮件、创建工单、执行数据库查询、操作文件
Resources(资源) 只读数据,供模型读取上下文,不涉及执行 日志文件内容、数据库表快照、API 文档
Prompts(提示词模板) 预先写好的可复用提示词模板,用户或应用可以直接调用 "帮我总结这份合同的关键条款"、"分析这段代码的性能问题"

此外还有两个进阶机制:

  • Sampling(采样):Server 反过来可以请求 Host 的模型帮它生成内容,实现角色互换。
  • Elicitation(信息征询):Server 执行中途发现信息不足,可以主动向用户追问,例如"要按哪个日期筛选?"

刚开始可以先重点关注 Tools 和 Resources 即可,Prompts、Sampling、Elicitation 在后期使用时再了解也不迟。


传输方式

MCP 支持两种传输方式,适用于不同场景:

传输方式适用场景特点
stdio(标准输入输出) 本地工具,Host 以子进程方式启动 Server 最简单,无需网络配置,适合个人电脑上的本地工具
Streamable HTTP 远程生产环境,Server 作为 HTTPS 服务部署 支持并发连接、水平扩展,搭配 OAuth 2.1 做身份验证

个人学习和本地开发使用 stdio 即可。

企业级、需要多人共享的场景则使用 Streamable HTTP

本教程的演示案例均采用 stdio 方式。


安全须知

MCP 赋予了 AI 执行代码、访问真实系统的能力,因此安全规范尤为重要:

  • 工具描述本身不可信:除非来自可信 Server,功能说明可能被恶意篡改(提示词注入风险),Host 应对工具描述保持警惕。
  • 必须显式获得用户同意:不能静默执行敏感操作,每次工具调用都应经过用户确认。
  • 生产环境加强防护:Server 应作为 OAuth 资源服务器部署,配合 TLS 加密、访问控制、日志审计。
  • 第三方 Server 需审核:使用前确认来源可信,必要时做沙箱隔离。

实战演示:用 Claude Code 接入 MCP Server

下面通过两个完整案例,展示如何编写 MCP Server 并接入 Claude Code 使用。

第一个案例使用 Python 编写天气查询服务,第二个案例使用 Node.js/TypeScript 编写待办事项管理。

案例一:Python 天气查询 Server

目标:编写一个提供天气查询工具的 MCP Server,通过 Claude Code 调用。

环境准备

pip install mcp httpx

需要安装两个 Python 包:mcp 是 MCP 官方 Python SDK,httpx 用于发起 HTTP 请求调用天气 API。

编写 Server 代码

创建文件 weather_server.py

实例

# 文件路径:weather_server.py
from mcp.server.fastmcp import FastMCP
import httpx

# 创建一个名为 "weather" 的 MCP Server 实例
# FastMCP 提供了高层次的 API,简化 Server 开发
mcp = FastMCP("weather")


@mcp.tool()
async def get_weather(city: str) -> str:
    """查询指定城市的当前天气。

    Args:
        city: 城市名称,支持中文或英文,例如 "Beijing" 或 "上海"
    """

    # 使用 wttr.in 免费天气 API,无需注册 API Key
    # format 参数指定返回格式:%C=天气状况, %t=温度
    url = f"https://wttr.in/{city}?format=%C+%t"
    async with httpx.AsyncClient() as client:
        resp = await client.get(url, timeout=10)
        resp.raise_for_status()
        return f"{city} 当前天气:{resp.text.strip()}"


@mcp.resource("weather://cities/supported")
def supported_cities() -> str:
    """返回当前支持查询的城市列表(只读资源示例)。"""
    return "Beijing, Shanghai, Guangzhou, Shenzhen, Hangzhou, Chengdu, runoob"


if __name__ == "__main__":
    # 使用 stdio 传输,供 Claude Code 以子进程方式调用
    mcp.run(transport="stdio")

代码说明:

  • @mcp.tool():将函数注册为 Tool,模型的 docstring 会自动作为工具说明提供给大模型,帮助模型判断何时该调用。
  • @mcp.resource():将函数注册为 Resource,供模型按需读取,不涉及"执行",只是"查阅"。
  • mcp.run(transport="stdio"):通过标准输入输出与 Host 通信,是本地工具最常用的方式。

本地调试(可选但推荐)

在接入 Claude Code 之前,先用 MCP 官方 Inspector 工具调试 Server,确认它正常工作:

npx @modelcontextprotocol/inspector python weather_server.py

运行后会自动打开一个网页调试界面,可以看到 Server 暴露了哪些 Tool 和 Resource,并手动调用测试。

建议每次都先走一遍 Inspector 调试流程,在接入真实的 AI 助手之前排查代码问题,能节省大量排查时间。

在 Claude Code 中配置 MCP Server

方式一:直接让 AI 添加

我们可以直接启动 Claude:

claude

输入以下信息,让 Claude 自己帮我配置添加:

添加 @weather_server.py 这个 MCP 服务

这种最简单,输入提示信息,配置依赖都能自动完成。

可以看到在当前目录的 .mcp.json 文件中自动生成了配置信息:

配置完成后,在 Claude Code 中直接提问:

帮我查一下北京现在的天气

如果喜欢自己折腾,也可以使用命令式添加和文件配置。

方式二:命令行添加

注意命令与文件的路径,要自己修改:

claude mcp add weather python /Users/runoob/runoob-test/weather_server.py

这条命令的含义:

  • claude mcp add:Claude Code 的 MCP 管理子命令。
  • weather:给这个 MCP Server 起一个名字,后续用 claude mcp list 可以看到。
  • python:启动 Server 的命令。
  • /Users/.../weather_server.py:Server 脚本的绝对路径。

添加成功后,可以用以下命令查看已连接的 MCP Server:

claude mcp list

输出示例:

NAME      STATUS   COMMAND
weather   active   python /Users/runoob/runoob-test/weather_server.py

如需移除某个 Server:

$ claude mcp remove weather

方式三:配置文件(适合团队共享)

在项目根目录创建 .mcp.json 文件:

{
  "mcpServers": {
    "weather": {
      "command": "python",
      "args": ["/Users/runoob/runoob-test/weather_server.py"]
    }
  }
}

保存后重启 Claude Code(或重新打开项目),配置即生效。

配置文件方式的好处是可以提交到 Git 仓库,团队成员 clone 项目后自动获得相同的 MCP Server 配置。

如果配置了用户级别的 MCP Server(存储在 ~/.claude/mcp.json 中),则对所有项目生效。项目级别的 .mcp.json 仅对当前项目生效。

实际使用

配置完成后,在 Claude Code 中直接提问:

> 帮我查一下北京现在的天气

Claude Code 会自动:

  1. 识别出需要调用 weather Server 的 get_weather 工具。
  2. 弹出授权确认对话框,询问是否允许调用。
  3. 你点击同意后,调用 Server 获取天气数据。
  4. 将结果整合为自然语言回答。

这就是从模型到真实世界数据的完整闭环。

案例二:Node.js/TypeScript 待办事项 Server

如果你更熟悉 JavaScript/TypeScript 生态,以下是 Node.js 版本的 MCP Server 示例。

环境准备

npm install @modelcontextprotocol/sdk zod

编写 Server 代码

创建文件 todo_server.ts

实例

// 文件路径:todo_server.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

// 创建 MCP Server 实例,设置名称和版本号
const server = new McpServer({
  name: "todo-list",
  version: "1.0.0"
});

// 用数组模拟待办事项存储(实际项目可替换为数据库)
const todos: string[] = [];

// 注册第一个 Tool:添加待办事项
server.tool(
  "add_todo",                         // Tool 名称
  "添加一条待办事项",                   // Tool 描述(模型据此判断何时调用)
  {
    // 参数 schema,使用 Zod 定义,自动生成 JSON Schema
    item: z.string().describe("待办内容")
  },
  async ({ item }) => {
    todos.push(item);
    return {
      content: [{
        type: "text",
        text: `已添加:"${item}",当前共 ${todos.length} 条待办`
      }]
    };
  }
);

// 注册第二个 Tool:列出所有待办
server.tool(
  "list_todos",
  "列出所有待办事项",
  {},                                 // 无参数
  async () => {
    const text = todos.length
      ? todos.map((t, i) => `${i + 1}. ${t}`).join("\n")
      : "暂无待办事项";
    return {
      content: [{ type: "text", text }]
    };
  }
);

// 使用 stdio 传输启动 Server
const transport = new StdioServerTransport();
await server.connect(transport);

接入 Claude Code 的方式与 Python 版本完全一致。

我们可以直接启动 Claude:

claude

输入以下信息,让 Claude 自己帮我配置添加:

添加 @todo_server.ts 这个 MCP 服务

然后在对话中说 "帮我添加一条待办:购买 runoob 教程",Claude Code 就会调用 add_todo 工具。


现有生态:不必什么都自己写

MCP 发布以来,社区已发布超过 500 个公开 Server,覆盖了绝大多数常见场景:

类别现成 MCP Server 示例
代码托管GitHub、GitLab、Bitbucket
即时通讯Slack、Discord
云存储Google Drive、OneDrive
数据库PostgreSQL、MySQL、SQLite、MongoDB
网页自动化Puppeteer、Playwright
知识管理Notion、Obsidian
文件系统Filesystem(本地文件读写)

官方 SDK 覆盖以下编程语言:TypeScript、Python、C#、Java、Swift。

实际开发中,大部分场景直接找现成 Server 使用即可。只有在连接公司内部系统或私有数据库时,才需要自己编写 MCP Server。


常见问题

问题回答
MCP 会取代 Function Calling 吗? 不会。Function Calling 是模型调用工具的底层机制,MCP 在这层机制外面包了一套标准化协议,让不同厂商的模型都使用同一套工具定义。两者是"标准化"而非"替代"的关系。
一个 Server 能同时给多个 AI 应用用吗? 可以,这正是 MCP 的核心价值——写一次 Server,任何兼容 MCP 的 Host(Claude Code、Claude Desktop、Cursor、ChatGPT 等)都能用。
使用 MCP 需要写代码吗? 如果只是使用别人做好的 MCP Server,完全不需要写代码——在 Claude Code 中用 claude mcp add 命令配置即可。只有开发自己的 Server 才需要写代码。
stdio 和 Streamable HTTP 怎么选? 个人使用、本地工具选 stdio(零配置);团队共享、生产部署选 Streamable HTTP(需配置 HTTPS 和 OAuth)。

参考资料