Daimon's Blog
主页 归档 关于 RSS 探针 常用工具
主页
归档
关于
RSS
探针
常用工具

MCP 入门到自建:协议原理 + MCPHub 管理 + 自己写一个

daimon daimon 2025-08-11 #MCP#AI#Claude#工具调用

MCP(Model Context Protocol)从 2024 年下半年开始火,到现在 Claude / Cursor / VSCode / Cherry Studio 几乎全都接入。但很多人对它的理解还停留在”装个 MCP 就能让 AI 用工具”——其实它的设计非常有意思。

这篇把 MCP 的角色、协议、部署方式讲透,再演示用 MCPHub 管理多 MCP + 用 Python 写一个最小的 MCP server。

一、MCP 是什么#

MCP (Model Context Protocol):模型上下文协议。不是软件,是一套规则——定义 AI 模型如何与外部工具、服务、数据安全高效地交互。

类比:

  • MCP 之于 AI = USB 接口之于硬件
  • MCP server = 不同的 USB 设备(鼠标、键盘、U 盘)
  • MCP client = 主板上的 USB 控制器
  • AI 模型 = 用户

核心思想:把”AI 模型”和”工具/数据/提示”解耦,让 AI 能随意接任何工具。

二、角色 + 概念#

graph LR H[MCP Host
Claude Desktop / Cursor / IDE] --> C[MCP Client
负责通信] C <-->|JSON-RPC| S1[MCP Server 1
文件系统] C <-->|JSON-RPC| S2[MCP Server 2
GitHub API] C <-->|JSON-RPC| S3[MCP Server 3
数据库] S1 --> D1[本地文件] S2 --> R1[github.com] S3 --> D2[Postgres]
角色说明
MCP Host跑 AI 模型 + MCP Client 的应用:Claude Desktop / Cursor / Cherry Studio / VS Code
MCP Client集成在 Host 里,负责连接和调用 MCP Server
MCP Server提供具体功能的程序,可以访问本地数据 / 远程服务 / 自定义逻辑
Local Data SourceMCP Server 能访问的本地数据(文件 / 数据库)
Remote ServiceMCP Server 通过网络调用的服务(Web API 等)

MCP Server 暴露三类东西给 AI:

类型含义例子
Tool(工具)可以让 AI 调用执行的功能”查询天气”、“发送邮件”、“创建文件”
Resource(资源)AI 可以读取的数据”歌曲列表”、“传感器数据”、“配置文件”
Prompt(提示)预设提示模板”代码审查模板”、“翻译模板”

三、三种传输协议#

MCP 支持三种传输方式:

传输全称部署位置能访问本地?
STDIO标准输入/输出本地✅ 能
SSEServer-Sent Events远程 HTTP❌ 不能
streamableHttpHTTP 流式远程 HTTP❌ 不能

3.1 STDIO(本地)#

  • 通过进程的标准输入/输出通信
  • 跑在你电脑上,能访问文件 / 数据库 / shell
  • 适合:文件系统操作、本地 git 操作、本地数据库

3.2 SSE(远程)#

  • 通过 HTTP Server-Sent Events
  • 跑在远程服务器
  • 适合:公开 API 包装、共享工具

3.3 streamableHttp(远程,新)#

  • 更灵活的 HTTP 流,支持双向 / 二进制
  • 适合复杂远程交互、专业开发场景

四、装第一个 MCP Server#

最常用的几个官方 MCP:

MCP用途
@modelcontextprotocol/server-filesystem文件操作
@modelcontextprotocol/server-githubGitHub API
@modelcontextprotocol/server-postgresPostgres 查询
@modelcontextprotocol/server-fetchHTTP 请求
@modelcontextprotocol/server-memory长期记忆

4.1 在 Claude Desktop 装 filesystem MCP#

编辑 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows):

1
{
2
"mcpServers": {
3
"filesystem": {
4
"command": "npx",
5
"args": [
6
"-y",
7
"@modelcontextprotocol/server-filesystem",
8
"/path/to/allowed/directory"
9
]
10
}
11
}
12
}

重启 Claude Desktop。在对话里输入 “帮我列出 /path 下的所有文件”——AI 会调用 filesystem MCP。

4.2 在 Cursor 装#

Settings → MCP → Add new MCP Server,填同样的配置。

五、多 MCP 的管理:MCPHub#

装多了 MCP 之后,每个客户端都要重复配置 + 切换主题 + 维护 token,非常烦。MCPHub 解决这个问题——一个中心化的 MCP 网关,所有 MCP 注册一次,所有客户端共用。

5.1 它能干什么#

graph LR C1[Claude Desktop] --> H[MCPHub] C2[Cursor] --> H C3[Cherry Studio] --> H H --> M1[filesystem MCP] H --> M2[github MCP] H --> M3[tavily search MCP] H --> M4[playwright MCP]
  • 集中管理:所有 MCP 在 Hub 注册一次
  • 多客户端共享:Hub 给所有客户端提供统一入口
  • 权限控制:按 token 分组限制
  • 日志统计:每个 MCP 的调用情况
  • 远程 MCP 本地化:Hub 跑远程 MCP,本地客户端通过 stdio 连 Hub

5.2 部署#

Docker Compose:

1
services:
2
mcphub:
3
image: mcphub/mcphub:latest
4
container_name: mcphub
5
restart: always
6
ports:
7
- "127.0.0.1:3000:3000"
8
volumes:
9
- /opt/mcphub/data:/data
10
environment:
11
- TZ=Asia/Shanghai

打开 http://127.0.0.1:3000,UI 里添加 MCP:

  1. 从 npm:填包名 + 参数
  2. 远程 SSE:填 URL
  3. 本地命令:填 command + args

5.3 客户端接入#

Claude Desktop 配置改成连 MCPHub:

1
{
2
"mcpServers": {
3
"mcphub": {
4
"command": "npx",
5
"args": ["-y", "mcphub-client", "http://127.0.0.1:3000"]
6
}
7
}
8
}

所有原本要单独配的 MCP 都通过 Hub 暴露出来。

六、自己写一个 MCP Server#

用 Python 写一个”查询今日天气”的 MCP。

6.1 装 SDK#

Terminal window
1
pip install mcp

6.2 写 server.py#

1
from mcp.server.fastmcp import FastMCP
2
import httpx
3
4
mcp = FastMCP("weather")
5
6
@mcp.tool()
7
async def get_weather(city: str) -> str:
8
"""查询指定城市今日天气。
9
10
Args:
11
city: 城市名(中文或英文)
12
"""
13
# 示意:替换成真实天气 API
14
async with httpx.AsyncClient() as client:
15
r = await client.get(
16
f"https://wttr.in/{city}",
17
params={"format": "3"},
18
timeout=10,
19
)
20
return r.text
21
22
@mcp.resource("weather://cities")
23
def list_cities() -> str:
24
"""支持查询的城市列表。"""
25
return "Beijing, Shanghai, Shenzhen, Tokyo, New York, London"
26
27
@mcp.prompt()
28
def weather_check(city: str) -> str:
29
"""生成查天气的标准 prompt。"""
30
return f"请帮我查 {city} 今天的天气,并建议穿衣。"
31
32
if __name__ == "__main__":
33
mcp.run(transport="stdio")

6.3 在 Claude Desktop 注册#

1
{
2
"mcpServers": {
3
"weather": {
4
"command": "python",
5
"args": ["/absolute/path/to/server.py"]
6
}
7
}
8
}

重启 Claude,问”今天北京天气怎么样”——它会调你的 get_weather 工具。

七、写远程 MCP(SSE / streamableHttp)#

1
from mcp.server.fastmcp import FastMCP
2
3
mcp = FastMCP("weather")
4
5
# 工具定义同上
6
7
if __name__ == "__main__":
8
# 注意:transport 改成 sse
9
mcp.run(transport="sse", host="0.0.0.0", port=8080)

部署到 VPS 之后,客户端连这个 URL:

1
{
2
"mcpServers": {
3
"weather-remote": {
4
"url": "https://mcp.your-domain.com/sse"
5
}
6
}
7
}

⚠️ 远程 MCP 必须加认证(API key / OAuth),否则等于把工具公开给所有人。

八、Tavily / Playwright 等好用的 MCP#

我自己常用的 MCP 推荐:

MCP用途
tavilyAI 友好的搜索 API
playwright浏览器自动化 + 截图
chrome-devtoolsChrome 调试协议
githubissue / PR / 仓库操作
postgres数据库查询
filesystem本地文件读写
memoryAI 长期记忆
fetch网页抓取
augment-context-engine代码库语义检索

每个的配置方式都差不多,找官方 README 即可。

九、踩坑清单#

现象原因解决
Claude Desktop 看不到工具配置文件 JSON 语法错用 JSON 校验工具检查
MCP 启动失败npx 包不存在 / 网络问题手动 npx -y xxx 跑一次看错误
工具调用一次就报错API key 没传检查 env 字段是否传了
远程 MCP 访问 401没配认证加 Bearer token
上下文中工具太多 AI 选错工具命名重复 / description 不清改 tool description 更具体
Windows 上 npx 找不到Node 路径问题用绝对路径或装 Volta

十、几条实用经验#

  • 本地 MCP 优先 STDIO,远程优先 streamableHttp(SSE 是过渡方案)。
  • MCPHub 是省心利器:多客户端共享 MCP 池,token 管理一次配。
  • 写自己的 MCP 用 FastMCP:30 行代码就能搞定一个工具。
  • 工具 description 要写好:AI 是看 description 决定调不调用的,写得越具体调用越准。
  • 不要装太多 MCP:每个工具都进 system prompt,太多反而干扰模型判断。10-15 个工具是个上限。
  • 远程 MCP 一定加认证:暴露在公网就是被滥用。
  • MCP server 跑在 Docker 里:隔离 + 易部署,别裸跑在宿主机。

MCP 这个生态目前还在快速演化,但核心思想很稳——让 AI 用工具像人插 USB 一样自然。把它的角色和协议理清楚,之后任何新 MCP 都是几分钟接入的事。

New-API 自部署:搭建你自己的 AI 网关
Claude Code / Codex / Gemini CLI 三件套:装、配、用
本博客所有文章除特别声明外,均遵循 CC BY-NC-SA 4.0 协议,转载请注明出处。
博客框架 Astro & Fuwari
冀ICP备20260167号
1
一、MCP 是什么
2
二、角色 + 概念
3
三、三种传输协议
3.1 STDIO(本地)
3.2 SSE(远程)
3.3 streamableHttp(远程,新)
4
四、装第一个 MCP Server
4.1 在 Claude Desktop 装 filesystem MCP
4.2 在 Cursor 装
5
五、多 MCP 的管理:MCPHub
5.1 它能干什么
5.2 部署
5.3 客户端接入
6
六、自己写一个 MCP Server
6.1 装 SDK
6.2 写 server.py
6.3 在 Claude Desktop 注册
7
七、写远程 MCP(SSE / streamableHttp)
8
八、Tavily / Playwright 等好用的 MCP
9
九、踩坑清单
10
十、几条实用经验