从零开始,手把手教你用Python将现有HTTP API改造为MCP Server,让Claude/Cline/Cursor等AI-Agent直接调用你的API。附精选MCP开源项目清单与企业级升级方案。
MCP(Model Context Protocol)是Anthropic发布的开放协议,让AI Agent与外部工具、数据源建立标准化双向实时通信
| 对比维度 | 传统HTTP API | MCP(Model Context Protocol) |
|---|---|---|
| 通信方向 | 单向(Client → Server) | 双向(Agent ↔ Server) |
| 工具发现 | 手动查阅文档 | 自动发现(tools/list) |
| 调用方式 | 固定请求路径 | AI按需调用任意工具 |
| 状态管理 | 无状态 | 支持会话上下文 |
| 认证方式 | API Key / OAuth | 标准化Token机制 |
| 典型客户端 | 人类开发者 + 程序 | AI-Agent(Claude/Cline/Cursor等) |
MCP采用JSON-RPC 2.0通信,支持stdio(进程通信)和HTTP+SSE(网络通信)两种传输方式
┌─────────────────────────────────────────────────────┐
│ MCP Host │
│ (Claude Desktop / Cursor / 自定义Agent) │
├──────────────────┬──────────────────┬────────────────┤
│ MCP Client │ MCP Client │ MCP Client │
│ (内置) │ (内置) │ (内置) │
└────────┬─────────┴────────┬─────────┴────────┬────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────┐
│ MCP Server │
│ │
│ 🔧 tools/list → 返回可用工具列表 │
│ 🔧 tools/call → AI调用具体工具 │
│ 📄 resources/list → 返回可用数据资源 │
│ 📄 prompts/list → 返回预定义提示模板 │
│ │
│ ✅ initialize → 协议握手 & 能力协商 │
│ 🔄 notifications → 服务端主动推送事件 │
└─────────────────────────────────────────────────────┘
| 方法名 | 方向 | 说明 |
|---|---|---|
initialize | Client → Server | 初始化握手,交换协议版本和功能 |
initialized | Server → Client | 握手完成确认 |
tools/list | Client → Server | 查询可用工具列表(AI自动发现) |
tools/call | Client → Server | 调用指定工具(AI执行动作) |
tools/list_changed | Server → Client | 通知工具列表变更 |
resources/list | Client → Server | 查询可用资源 |
resources/read | Client → Server | 读取指定资源内容 |
prompts/list | Client → Server | 查询预定义提示模板 |
根据团队规模、技术能力和商业化需求,选择最适合你的升级方案
使用Python MCP SDK,最快1小时完成现有API的MCP封装
# Python(推荐)
pip install "mcp[cli]" httpx
# Node.js
npm install @modelcontextprotocol/sdk
| 语言 | SDK | 特点 |
|---|---|---|
| Python | mcp[cli] | 上手最快,推荐首选 |
| TypeScript/Node.js | @modelcontextprotocol/sdk | 与前端生态融合好 |
| Java | mcp-java | 企业遗留系统首选 |
按综合评分排序,涵盖MCP Server开发框架、工具库、平台和生态项目
Anthropic官方维护的Python MCP SDK,是目前最完善、文档最详细的MCP开发框架。支持stdio和HTTP+SSE两种传输模式,内置工具定义、资源暴露、提示模板等完整MCP能力。配套有完整的CLI工具,可快速生成MCP Server脚手架。
Anthropic官方TypeScript MCP SDK,适合前端/全栈团队将现有Node.js API快速封装为MCP Server。与Express/Fastify等框架集成良好,支持在现有Web服务中嵌入MCP端点。
开箱即用的聚合型MCP Server,内置100+常用工具:文件系统读写、SQLite/PostgreSQL数据库操作、邮件发送、浏览器自动化、系统命令执行等。适合快速搭建本地AI-Agent的工具箱,无需逐个开发MCP工具。
将ASGI应用(Starlette/FastAPI)一键转换为MCP Server。核心能力:自动将FastAPI路由转换为MCP工具,自动生成tools/list和tools/call实现。适合已有FastAPI项目的团队,零代码改造接入MCP。
专注于数据库的MCP Server,支持PostgreSQL、MySQL、SQLite和Redis。提供:执行SQL查询、表结构查看、索引分析、慢查询诊断等工具。AI-Agent可通过自然语言驱动数据库操作,适合数据分析场景。
流行的API调试客户端,最新版本已支持MCP协议调试。可以在Insomnia中直接测试MCP Server的tools/list和tools/call,无需写代码。是开发MCP Server时的最佳调试工具。
VS Code最强AI编程插件,内置MCP支持。可在VS Code内直接配置MCP Server,让AI在编码时调用你的API工具。是MCP生态中用户量最大的AI-Agent客户端之一。
YesApi Pro是国内领先的API开放平台解决方案,提供低代码API开发、API文档自动生成、开发者门户、计费系统、多租户管理等完整能力。MCP导出功能目前仍在规划中,敬请期待。现阶段推荐通过路径一(手动开发MCP Server)或路径二(低代码MCP平台)完成API→MCP升级。
以图书查询API为例,完整演示如何将HTTP API封装为MCP Server
# 原有图书API(FastAPI)
GET /books → 获取图书列表
GET /books/{id} → 获取单本图书详情
POST /books → 新增图书
DELETE /books/{id} → 删除图书
"""
mcp_book_server.py
将现有图书API快速升级为MCP Server
"""
import json
import httpx
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
# ========== 配置区 ==========
BOOK_API_BASE = "http://localhost:8000" # 现有图书API地址
API_KEY = "your-api-key-here" # 现有API认证密钥
# ========== MCP Server初始化 ==========
server = Server("book-mcp-server")
# ========== 工具定义(AI自动发现) ==========
TOOLS = [
Tool(
name="list_books",
description="获取图书列表,支持分页和关键词搜索",
inputSchema={
"type": "object",
"properties": {
"page": {"type": "integer", "description": "页码", "default": 1},
"page_size": {"type": "integer", "description": "每页数量", "default": 20},
"keyword": {"type": "string", "description": "搜索关键词(书名/作者)"},
},
},
),
Tool(
name="get_book",
description="根据ID获取单本图书详情",
inputSchema={
"type": "object",
"properties": {
"book_id": {"type": "string", "description": "图书唯一标识"},
},
"required": ["book_id"],
},
),
Tool(
name="add_book",
description="新增一本图书",
inputSchema={
"type": "object",
"properties": {
"title": {"type": "string", "description": "书名"},
"author": {"type": "string", "description": "作者"},
"isbn": {"type": "string", "description": "ISBN"},
"price": {"type": "number", "description": "价格(元)"},
},
"required": ["title", "author"],
},
),
Tool(
name="delete_book",
description="根据ID删除图书",
inputSchema={
"type": "object",
"properties": {
"book_id": {"type": "string", "description": "图书唯一标识"},
},
"required": ["book_id"],
},
),
]
# ========== 工具执行器(HTTP → MCP桥接) ==========
async def call_tool(name: str, arguments: dict):
headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
async with httpx.AsyncClient(timeout=30.0) as client:
if name == "list_books":
params = {"page": arguments.get("page", 1), "page_size": arguments.get("page_size", 20)}
if arguments.get("keyword"):
params["keyword"] = arguments["keyword"]
resp = await client.get(f"{BOOK_API_BASE}/books", headers=headers, params=params)
return TextContent(type="text", text=json.dumps(resp.json(), ensure_ascii=False, indent=2))
elif name == "get_book":
resp = await client.get(f"{BOOK_API_BASE}/books/{arguments['book_id']}", headers=headers)
return TextContent(type="text", text=json.dumps(resp.json(), ensure_ascii=False, indent=2))
elif name == "add_book":
resp = await client.post(f"{BOOK_API_BASE}/books", headers=headers, json={
"title": arguments["title"], "author": arguments["author"],
"isbn": arguments.get("isbn"), "price": arguments.get("price"),
})
return TextContent(type="text", text=json.dumps(resp.json(), ensure_ascii=False, indent=2))
elif name == "delete_book":
resp = await client.delete(f"{BOOK_API_BASE}/books/{arguments['book_id']}", headers=headers)
return TextContent(type="text", text=f"删除成功,状态码: {resp.status_code}")
else:
return TextContent(type="text", text=f"未知工具: {name}")
# ========== MCP协议处理 ==========
@server.list_tools()
async def list_tools():
return TOOLS
@server.call_tool()
async def handle_call_tool(name: str, arguments: dict):
result = await call_tool(name, arguments)
return [result]
# ========== 启动MCP Server(stdio模式) ==========
async def main():
async with stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream, server.create_initialization_options())
if __name__ == "__main__":
import asyncio
asyncio.run(main())
在 ~/Library/Application Support/Claude/claude_desktop_config.json 中添加:
{
"mcpServers": {
"book-mcp-server": {
"command": "python3",
"args": ["/path/to/mcp_book_server.py"],
"env": {}
}
}
}
重启Claude Desktop后,即可在对话中直接说:"帮我查询《Python编程》这本书的详细信息" —— AI会自动调用对应的MCP工具。
# 将MCP Server部署为HTTP+SSE模式,多个Agent可并发接入
from mcp.server.sse import sse_server
async def main_sse():
"""HTTP+SSE模式,监听8080端口"""
async with sse_server(app, port=8080) as streams:
await server.run(streams[0], streams[1], server.create_initialization_options())
# Claude Desktop配置改为:
# {
# "mcpServers": {
# "book-mcp-server": {
# "url": "http://localhost:8080/sse"
# }
# }
# }
将API升级为MCP并非只是"加一个协议层",而是涉及全生命周期管理、安全合规、多租户隔离和商业化运营
使用Python MCP SDK手动开发,1小时上线。
含完整Python代码示例、Claude Desktop配置、HTTP+SSE多Agent共享方案。
答:两者定位不同,但可以共存。OpenAPI是人与人(开发者)之间的API文档标准;MCP是人与机器(AI Agent)之间的工具调用协议。推荐做法:用OpenAPI文档驱动MCP工具生成自动化,节省手工配置时间。
答:大部分情况下不需要。MCP Server是独立进程,只要它能调用现有HTTP API,就能桥接到MCP。如果使用低代码MCP平台,通常只需配置,无需代码改造。
答:建议从以下维度加固(详细参见API安全防护指南2026):使用Authorization: Bearer <token>认证;MCP Server部署在内网或VPC,避免暴露公网;限制AI可调用的工具范围(tools/list返回最小集);开启审计日志,记录所有工具调用;使用HTTPS传输,禁止明文通信。
答:将MCP Server部署为HTTP+SSE模式(而非stdio模式),多个Agent通过HTTP URL接入。参考本文"实战示例"章节的SSE模式代码,监听指定端口,多个Agent可并发接入。
答:MCP在2024年底正式发布,目前处于快速成长期:✅ Anthropic官方SDK已稳定(Python/TypeScript);✅ Claude Desktop原生支持;✅ VS Code(Cline)、Cursor等主流IDE已接入;✅ 社区开源MCP Server已有500+。建议:内部工具快速用开源方案;商业化运营建议持续关注企业级MCP平台进展。
答:YesApi Pro 目前(2026年6月)尚未内置 MCP 导出能力,相关功能正在规划中。现阶段可通过以下方式将 YesApi Pro 管理的 API 接入 AI-Agent:① 使用路径一(手动开发 MCP Server 桥接层);② 使用路径二(低代码 MCP 平台)导入 YesApi Pro 的 OpenAPI 文档自动生成 MCP 工具。YesApi Pro 团队将在 MCP 功能上线后第一时间发布公告。