在一小时内把内部 REST API 暴露为 MCP
何时使用: 你有一个公司内部的 API,希望 agent 能调用它,又不想从头写 client spec。
前置条件
- Python 3.10+ —
python --version - 已安装 uv —
curl -LsSf https://astral.sh/uv/install.sh | sh
步骤
-
初始化项目基于 FastMCP 搭建一个名为 'acme-api-mcp' 的服务器项目,带一个示例工具。用 uv 管理依赖。✓ 已复制→ pyproject.toml + 带有可运行 @mcp.tool 示例的 server.py
-
为 3 个价值最高的端点编写包装我的内部 API 有 /orders/{id}、/customers/search、/invoices/{id}/pdf 这些端点。用 httpx.AsyncClient 为每一个写一个 FastMCP 工具,从环境变量读取 AUTH_TOKEN。✓ 已复制→ 3 个有类型提示和文档字符串的装饰函数,这些字符串会变成工具描述
-
用 MCP Inspector 在本地测试用
uv run mcp dev server.py运行服务器。打开 Inspector,用真实的输入调用每个工具。✓ 已复制→ 工具返回预期的 JSON,没有栈跟踪
结果: 一个可用的 MCP 服务器,你可以把 Claude Desktop 或任何 MCP 客户端指向它。
注意事项
- 因为在文档字符串中打印了凭据,导致泄露到工具描述中 — 用文档字符串描述行为,不要包含真实 token 的示例。通过
os.environ加载凭据,在错误信息中永远不要输出它们 - 混合使用异步和同步,导致事件循环错误 — 二选一——如果你的 HTTP 客户端是异步的,那么整个工具都要是异步的;不要在工具内部调用
asyncio.run