Skip to content

02-03 · MCP 详解(Model Context Protocol)

MCP 是 AI 的 USB-C。 它解决了"每接一个新数据源/新工具就得重新对接一遍"的问题,让任何 LLM 客户端(Claude、Codex、Cursor、Windsurf)都能用一套标准协议接入任何工具/数据。

来源:Anthropic 于 2024 年 11 月开源、并于 2025 年起被 OpenAI、Google、Microsoft 等普遍采纳,目前是 AI Agent 工具接入的事实标准。


一、MCP 是什么(一图秒懂)

        ┌─────────────────────────────┐
        │      MCP Host(Claude /     │
        │      Windsurf / Codex …)   │
        └────────────┬────────────────┘
                     │ JSON-RPC over stdio / HTTP
        ┌────────────┴────────────────┐
        │       MCP Client(内嵌)      │
        └────────────┬────────────────┘

        ┌────────────┴────────────────┐
        │         MCP Server          │   (由你或社区写)
        │ - Tools(模型可调用的函数)   │
        │ - Resources(应用级数据)    │
        │ - Prompts(用户级模板)      │
        └────────────┬────────────────┘

        ┌────────────┴────────────────┐
        │  真实世界(GitHub API、本地  │
        │  文件、数据库、Slack、Notion) │
        └─────────────────────────────┘

三个原语必须分清楚(这是面试常考的):

原语谁控制例子
Tools模型自主决定调用"读取这个文件"、"调用 GitHub API"、"跑这个 SQL"
Resources应用决定提供一个项目的代码索引、一个数据库的 schema
Prompts用户主动选择"用户说『总结这次会议』时,触发会议总结模板"

常见误区:很多人以为"MCP = Tool 调用"。错了,那只是 MCP 的三个原语之一。


二、为什么 MCP 比"自己写函数调用"好

Before MCP

  • 每个产品自己定义 function calling schema
  • 接 GitHub 要写一遍,接 Slack 又要写一遍
  • 换个 LLM(从 OpenAI 到 Claude)所有 Tool 重写

After MCP

  • 一个 MCP server 写完,所有 LLM 客户端通用
  • 社区里已经有 200+ 个开源 MCP servers(GitHub、Slack、Notion、Postgres、文件系统、浏览器、Figma…)
  • 你自己写的 MCP server 可以直接被 Claude Code、Windsurf、Codex 同时用

三、最小实战:在 Claude Code 里挂一个 MCP

3.1 装一个现成的(文件系统)

bash
# Claude Code 提供了 mcp 子命令
claude mcp add filesystem -s user -- npx -y @modelcontextprotocol/server-filesystem ~/projects

进入 Claude Code 后:

> /mcp
# 应该看到 filesystem 这一项
> 帮我列出 ~/projects 目录下所有的 README.md 文件
# 它会通过 MCP 工具去读

3.2 公司常用 MCP 清单

MCP server用途安装命令
filesystem读写本地文件claude mcp add filesystem -s user -- npx -y @modelcontextprotocol/server-filesystem ~/
github读 issue / PR / commitclaude mcp add github -s user -- npx -y @modelcontextprotocol/server-github
postgres读数据库(只读)claude mcp add postgres -s user -- npx -y @modelcontextprotocol/server-postgres "$DATABASE_URL"
chrome-devtools浏览器调试(截图、网络)见 chrome-devtools-mcp 仓库
codex双 AI 协同claude mcp add codex -s user -- codex -m gpt-5-codex -c model_reasoning_effort="high" mcp

3.3 Windsurf 里挂 MCP

Windsurf 设置 → MCP servers → Edit mcp_config.json,参考:

json
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/your/projects"]
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxx" }
    }
  }
}

API Key 安全:永远用环境变量或本地 keychain,不要把 Key 写进 git 仓库


四、写一个最小的自己的 MCP server

任何能"读环境/调 API/算东西"的能力都可以包成 MCP。下面是 Python 版最小骨架:

bash
mkdir my-mcp && cd my-mcp
python -m venv .venv && source .venv/bin/activate
pip install "mcp[cli]"
python
# server.py
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("hello")

@mcp.tool()
def add(a: int, b: int) -> int:
    """把两个整数相加。"""
    return a + b

@mcp.tool()
def now() -> str:
    """返回当前时间。"""
    from datetime import datetime
    return datetime.now().isoformat()

if __name__ == "__main__":
    mcp.run()

注册到 Claude Code:

bash
claude mcp add hello -s user -- python /absolute/path/to/server.py

进入 Claude Code 后:

> 用 hello 工具帮我算 17 + 25,再告诉我现在几点

恭喜,你已经造出了一个属于公司的 MCP server


五、MCP vs Function Calling vs Plugin

维度OpenAI Plugin(已弃)Function CallingMCP
谁定义OpenAI 单独各家自己开放协议
跨 LLM
工具发现OpenAPI 描述调用方拼 schema服务自描述
资源/Prompt 概念有(三原语)

结论:在 Agent 工程里,优先使用 MCP。Function Calling 只在你做"某个特定 LLM 的产品壳子"时才用。


六、MCP vs Skills(最容易混淆的对比)

维度MCPSkills
形态运行时服务(独立进程)静态文件夹
调用方式模型主动调用 Tool模型读 SKILL.md 后按指令做
主要解决"怎么接外部世界""怎么把方法论沉淀给 Agent"
是否常驻否(按需加载)
例子github、postgres、slack写 SOP、做品牌设计、做客户调研

黄金组合:用 Skill 描述"做一件事的步骤和判断标准",用 MCP 提供"做这件事所需的具体能力"。

详见 → 04 · Skills 详解


七、参考资料


继续 → 04 · Skills 详解

以股东之心学习 · 以工程师之手交付 · 以 AI 集群之力放大。持之以恒,勇敢探索。