openapi-to-mcp
openapi-to-mcp 插件将现有 HTTP API 暴露给 MCP(Model Context Protocol)客户端。它根据 API 的 OpenAPI 文档生成工具,通过网关提供 MCP 端点,并代表客户端调用相应的 API 操作。插件支持自定义上游请求头,以及 Streamable HTTP 和服务器发送事件(SSE)两种传输方式。
openapi-to-mcp 插件在 APISIX 和 API7 企业版中均可用。在 APISIX 中,它直接在网关内生成工具并调用 API;在 API7 企业版中,网关插件会把 MCP 请求转发到独立的 OpenAPI-to-MCP 服务。两种实现共享基本路由配置,但在部署、缓存、请求头转发和支持的选项方面有所不同。
示例
第一个示例使用原生 APISIX,其余示例使用 API7 网关,并且需要部署 OpenAPI-to-MCP 服务。
使用 APISIX 暴露 API
以下示例通过无状态 MCP 端点暴露公共 Petstore API。网关必须能够访问规范 URL 和 Petstore API。
创建一条不包含上游资源的路由。插件会直接调用 base_url 指定的 API:
curl "http://127.0.0.1:9180/apisix/admin/routes/petstore-mcp" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"uri": "/petstore-mcp",
"plugins": {
"openapi-to-mcp": {
"transport": "streamable_http",
"openapi_url": "https://petstore3.swagger.io/api/v3/openapi.json",
"base_url": "https://petstore3.swagger.io/api/v3"
}
}
}'
❶ transport 选择无状态的 Streamable HTTP。默认传输方式为 SSE,在部署多个网关实例时需要会话亲和性。
❷ openapi_url 指定用于生成 MCP 工具的文档。
❸ base_url 指定处理工具调用的 API。该路由不需要单独的上游资源。
列出生成的工具。该传输方式要求客户端同时接受 JSON 和事件流响应:
curl -N "http://127.0.0.1:9080/petstore-mcp" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}'
响应包含工具列表,其中包括 getPetById。在 MCP 客户端中配置相同的网关 URL,即可发现和调用这些工具。在生产环境中,请使用 key-auth 等身份认证插件保护 MCP 路由,并且只暴露允许客户端调用 的 API 操作。
有关文档兼容性、缓存、请求头转发、SSE 会话行为、目标限制和全部插件字段,请参阅配置参考。
启用对 Petstore API 的 MCP 访问
以下示例演示了如何通过 MCP 协议暴露 Petstore API,允许 AI 模型和客户端与 Petstore 服务进行交互。
- Admin API
- ADC
- Ingress Controller
创建一个使用 openapi-to-mcp 插件的路由:
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "openapi-to-mcp-route",
"uri": "/mcp",
"methods": ["GET", "POST"],
"plugins": {
"openapi-to-mcp": {
"transport": "streamable_http",
"base_url": "https://petstore3.swagger.io/api/v3",
"headers": {
"Authorization": "special-key"
},
"openapi_url": "https://petstore3.swagger.io/api/v3/openapi.json"
}
}
}'
❶ 配置路由允许 GET 和 POST 方法。GET 方法用于工具发现和响应流式传输(SSE),POST 方法用于执行和操作能力(messages)。
❷ 将传输方式配置为 streamable_http