实战案例
三个由浅入深的案例:本地笔记 Resource、把公开 HTTP API 包成 Tool、同一 Server 接到 Cursor 与 Claude Code。依赖仍是官方 mcp 包;第二个案例只用 Python 标准库,无需额外 HTTP 客户端。
案例 1:本地笔记 Resource
目标: 让 Host 按 URI 读取 notes/ 下的 Markdown,而不是把整棵主目录交给 filesystem Server。
notes/inbox.md:
notes_server.py:
验证: mcp dev .\notes_server.py,读取 notes://inbox,再读模板 notes://file/{name}(name=inbox)。路径检查拒绝 ../secrets 这类名字。
案例 2:把公开 API 包成 Tool
目标: 用 Open-Meteo(无需 API Key)查当前气温,演示「Tool = 受控的 HTTP 调用」。
weather_server.py:
上海附近可试 latitude=31.23、longitude=121.47。
验证: Inspector 调用 Tool;再在对话里说「用 current_temperature 查该坐标」。不要把任意用户 URL 拼进 urlopen——本例主机名写死。需要鉴权的内部 API 把 Token 放环境变量,只返回业务字段。
案例 3:同一 Server,两个 Host
把案例 1 与案例 2 合成 workshop.py(或继续用 Python 服务器 的文件)。一份代码,两份配置。
Cursor — .cursor/mcp.json:
Claude Code — 项目根 .mcp.json 或:
Unix 把 command 换成 .venv/bin/python。
验证:
- 两个 Host 都重启后能列出相同的 Tools / Resources
- 在 Cursor 问 inbox 里的一条笔记;在 Claude Code 用同一 Resource
- 两边都调用
current_temperature,数字应一致(同一公共 API)
这就是 USB-C 隐喻的实践:协议稳定,Host 只负责启动命令与审批。