Claude学院

MCP 是什么?一篇讲清 Claude 模型上下文协议

MCP(Model Context Protocol,模型上下文协议)是 Anthropic 主导的开放标准,目的是让 Claude 这类大模型用一套统一的协议连接外部数据源、工具和服务,而不必为每个数据库、API 或文件系统单独写一套对接代码。你可以把它理解成「AI 应用的 USB-C 接口」:MCP 服务器(Server)暴露能力,MCP 客户端(Client,比如 Claude 桌面版、Claude Code)负责连接和调用,两端遵守同一协议就能互通。

为什么需要 MCP

在 MCP 出现之前,给模型接外部能力主要靠 Tool Use(工具调用):你在每次 Messages API 请求里手写工具的 JSON Schema,模型返回 tool_use 块,你的代码执行后把结果塞回去。这条路完全可行,但有个现实问题——集成是「M×N」的。有 M 个 AI 应用、N 个数据源,理论上要写 M×N 套对接逻辑。每换一个客户端,所有工具都得重写一遍。

MCP 把它压缩成「M+N」:数据源方只需实现一个 MCP Server,应用方只需实现一个 MCP Client,任何 Client 都能复用任何 Server。GitHub、文件系统、数据库、Slack 等常见服务已经有现成的 MCP Server,拿来即用。这就是 MCP 的核心价值:标准化、可复用、生态共享。

MCP 的架构:Host、Client、Server

MCP 采用经典的客户端—服务器模型,但区分了三个角色:

  • Host(宿主):运行模型的应用本身,比如 Claude 桌面版、Claude Code、或你自研的 Agent。它负责管理一个或多个 Client 连接。
  • Client(客户端):Host 内部为每个 Server 维护的连接器,一对一地和某个 Server 通信。
  • Server(服务器):真正提供能力的进程,对外暴露工具、资源和提示词。

传输层目前主要有两种:本地服务器走 stdio(标准输入输出,进程间直接通信),远程服务器走 Streamable HTTP(基于 HTTP 的流式传输,支持 SSE)。消息格式统一用 JSON-RPC 2.0。本地工具(读本地文件、跑脚本)用 stdio 最省事;要连云端服务、做团队共享,就用 HTTP 形式。

三类核心原语

一个 MCP Server 可以向模型暴露三种能力,理解它们的区别能帮你判断该用哪个:

原语由谁控制典型用途
Tools(工具)模型决定调用查数据库、发消息、调用 API 等有副作用的操作
Resources(资源)应用/用户提供把文件、数据库记录等只读上下文喂给模型
Prompts(提示词模板)用户主动触发预设的工作流模板,常以斜杠命令形式出现

简单说:Tools 是「模型可以做的动作」,Resources 是「模型可以读的内容」,Prompts 是「用户可以套用的模板」。三者可以在同一个 Server 里共存。

MCP 和 Tool Use 是什么关系

很多人会混淆这两个概念。准确地说,MCP 的 Tools 最终仍然是通过模型的工具调用机制落地的——当 Claude 决定调用某个 MCP 工具时,本质上和它返回一个 tool_use 块没有区别。区别在于「谁来维护工具定义」:

  • 原生 Tool Use:工具的 schema 和执行逻辑都写在你的应用代码里,每个项目各自维护。可以参考 Claude 函数调用示例 了解这套机制。
  • MCP:工具定义封装在独立的 Server 里,通过协议自动暴露给任何兼容的 Client,跨应用复用。

所以 MCP 不是要取代 Tool Use,而是在它之上加了一层标准化的分发和复用机制。如果你只是在自己的脚本里加一两个工具,直接用 Tool Use 更轻;如果你想做一个能被多个客户端复用、能被别人安装的能力包,就做成 MCP Server。

在 Claude 桌面版里配置 MCP

Claude 桌面版是最容易上手的 MCP Client。配置文件名为 claude_desktop_config.json,Windows 在 %APPDATA%\Claude\ 目录下,macOS 在 ~/Library/Application Support/Claude/ 下。一个连接本地文件系统 Server 的配置示例如下:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "C:\\Users\\you\\Documents"
      ]
    }
  }
}

保存后完全退出并重启 Claude 桌面版,在输入框旁就能看到 MCP 工具图标。更详细的图文步骤可以看 Claude MCP 桌面版连接器设置教程。如果要连 GitHub、数据库这类需要鉴权的服务,参考 连接 GitHub 的 MCP 配置实战用 MCP 实现数据库自然语言查询

在 Claude Code 里用 MCP

Claude Code 作为 Anthropic 官方命令行工具,同样是一等的 MCP Client,而且支持用命令行直接添加 Server,不必手改 JSON。最常用的是 claude mcp add 命令:

# 添加一个本地 stdio 类型的 Server
claude mcp add filesystem -- npx -y @modelcontextprotocol/server-filesystem ./

# 添加一个远程 HTTP 类型的 Server
claude mcp add --transport http my-server https://example.com/mcp

# 查看已配置的 Server 列表
claude mcp list

添加后在会话里输入 /mcp 可以查看连接状态和可用工具。配置作用域分 local(仅当前项目)、project(随仓库共享,写入 .mcp.json)、user(全局生效)三种,团队协作时把常用 Server 放进 project 作用域最方便。完整的步骤排错见 Claude Code 配置 MCP 服务器完整步骤

想自己写一个 MCP Server

MCP 提供了 Python、TypeScript 等多种语言的官方 SDK,写一个 Server 比想象中简单——定义几个工具函数,声明输入参数,剩下的协议握手由 SDK 处理。如果你想从零跑通一个,可以照着 Python 从零开发 MCP 服务器 一步步来。开发时建议先用 stdio 传输在本地调通,再考虑切到 HTTP 对外提供服务。

常见问题

MCP 和 Claude 的 API 函数调用有冲突吗?

没有冲突,二者是互补关系。在 Messages API 层面,无论工具来自你手写的定义还是 MCP Server,模型看到的都是工具列表,决策机制完全一致。MCP 只是把工具的来源标准化了,并不改变 Messages API 的请求结构本身。你完全可以在一个应用里同时使用原生工具和 MCP 工具。

配置好 MCP 后 Claude 不调用工具怎么办?

先确认 Server 是否真的连上了:桌面版看工具图标,Claude Code 用 /mcp 检查状态。如果状态正常但模型不主动调用,多半是提问没有触发工具的使用场景,或工具描述写得太模糊。另外注意完全重启客户端让配置生效。模型决定是否调用工具受提示词影响,必要时在请求里更明确地说明需求。

MCP 是 Anthropic 独家的吗?其他模型能用吗?

MCP 是开放标准而非 Claude 专属。协议规范和 SDK 都公开发布,任何应用都可以实现 MCP Client 或 Server。这意味着你为某个数据源写的 MCP Server,理论上可以被任何支持 MCP 的 AI 应用复用,这也正是这套标准设计的初衷。具体的功能边界、配额等以 Anthropic 官网为准。

Projects 与 MCP