openapi-to-mcp
openapi-to-mcp 插件使网关能够充当 OpenAPI 规范与 MCP (Model Context Protocol) 服务器之间的桥梁。通过此插件,你可以通过 MCP 接口暴露现有的基于 OpenAPI 的服务,使其可供 AI 模型和客户端访问。
该插件的工作原理是将你的 OpenAPI 规范转换为 MCP 格式,并通过 MCP 服务器接口提供服务。来自 AI 客户端的请求随后会被代理到你的上游服务,支持自定义请求头以及两种用于流式响应的传输方法:streamable HTTP 和 Server-Sent Events (SSE),从而实现灵活且可靠的实时通信。
自 API7 EE 3.9.10 起,OpenAPI-to-MCP 服务不再内置于网关镜像,需要与网关部署在同一网络命名空间下。
- Kubernetes (Helm):在网关 chart values 中设置
openapiToMcp.enabled: true,以 sidecar 方式运行该服务。 - Docker / 裸机:运行
api7/openapi-to-mcp独立容器,并让网关与该容器共享网络命名空间(例如--network=container:<gateway>或使用 host 网络),使插件可通过127.0.0.1:<port>(默认3000)访问。插件访问目标为硬编码的127.0.0.1,必须让两者处于同一网络命名空间。
若服务不可达,插件将返回 503。mcp-tools-acl 插件同样受此限制。如需修改服务端口,请参考 静态配置。
Sidecar 镜像 tag 与网关版本对应关系
插件与 OpenAPI-to-MCP 服务之间的内部交互协议较为稳定,很少变动,因此同一个 sidecar 镜像 tag 通常可与较大范围的网关版本兼容。下表记录了各网关版本对应的推荐 sidecar tag——只有当二者之间的交互协议发生变化(即下表新增一行)时才需要升级 sidecar。
本表主要面向 Docker / 裸机 部署场景,需要使用者自行选择 sidecar 镜像 tag。Helm chart 已经为对应版本的网关固定了经过验证的 sidecar tag,因此 Helm 用户无需参考此表。
| 网关版本 | Sidecar 镜像 tag (api7/openapi-to-mcp) |
|---|---|
3.9.10 及之后版本 | 1.0.1 |
使用 Docker Compose 部署
以下 docker-compose.yaml 将 API7 EE 网关与 OpenAPI-to-MCP 服务一起运行。MCP 服务 加入网关的网络命名空间,使插件可通过 127.0.0.1:3000 访问。
在 Dashboard 中添加网关实例时,会自动生成一份可直接使用的 docker-compose.yaml。要启用 openapi-to-mcp 插件,将下方所示的 openapi-to-mcp 服务添加到该生成的文件中:
services:
gateway:
image: api7/api7-ee-3-gateway:3.9.12
container_name: gateway
hostname: gateway
restart: always
ports:
- "9080:9080"
- "9443:9443"
environment:
API7_DP_MANAGER_ENDPOINTS: '["https://<DP_MANAGER_HOST>:7943"]'
API7_GATEWAY_GROUP_SHORT_ID: "<GATEWAY_GROUP_SHORT_ID>"
API7_DP_MANAGER_CERT: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
API7_DP_MANAGER_KEY: |
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
API7_CONTROL_PLANE_CA: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
openapi-to-mcp:
image: api7/openapi-to-mcp:1.0.1
network_mode: "service:gateway"
restart: always
❶ DP Manager 端点地址——替换为 Dashboard 中提供的地址。
❷ 网关组 short ID——替换为 Dashboard 中显示的值。
❸ TLS 客户端证书、私钥和 CA 证书。从 Dashboard 复制生成的 compose 文件时,这些字段会自动填充。
❹ network_mode: "service:gateway" 让 MCP 容器共享网关的网络栈,使插件可通过 127.0.0.1:3000 访问 MCP 服务。共享 Docker 桥接网络不能满足要求——插件硬编码 127.0.0.1 作为目标地址。
启动服务:
docker compose up -d
网关启动后,你可以通过 Dashboard 或 ADC 配置带有 openapi-to-mcp 插件的路由。
下图展示了 MCP 客户端、API7 网关和上游 OpenAPI 服务之间的交互。路径和数据仅为演示用的示例值。
静态配置
插件会从网关的 plugin_attr 配置块中读取以下属性(config.yaml,或 helm chart 的 pluginAttrs):
| 名称 | 类型 | 必选 | 默认值 | 描述 |
|---|---|---|---|---|
| port | integer | 否 | 3000 | OpenAPI-to-MCP 服务在 127.0.0.1 上监听的端口,插件会将所有 MCP 流量代理到该端口。该值必须与 OpenAPI-to-MCP 容器实际监听的端口一致。 |
示例:
plugin_attr:
openapi-to-mcp:
port: 4000
修改该值时,必须同步将 OpenAPI-to-MCP 容器的 PORT 环境变量设置为相同端口,否则插件将返回 503。helm chart 在你设置 openapiToMcp.port 时会自动联动容器 PORT,并在模板渲染阶段拒绝两个值不一致的配置。
重载网关以使静态配置变更生效。
示例
以下示例演示了如何在不同场景下配置 openapi-to-mcp 插件。
启用对 Petstore API 的 MCP 访问
以下示例演示了如何通过 MCP 协议暴露 Petstore API,允许 AI 模型和客户端与 Petstore 服务进行交互。
使用 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"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org": 1
}
}
}'
❶ 配置路由允许 GET 和 POST 方法。GET 方法用于工具发现和响应流式传输 (SSE),而 POST 方法用于执行和操作功能 (messages)。
❷ 配置传输方法为 streamable_http(生产环境推荐)。
❸ 配置 Petstore API 地址。
❹ 配置 Petstore API 凭证。
❺ 配置 Petstore OpenAPI 文档 URL。
❻ 为上游节点配置任意值。上游地址不会用于实际的请求转发。
在你的 AI 客户端(如 Cursor)中,使用你的 API7 网关地址更新 MCP 设置,并附加之前创建的路由路径。例如:
{
"mcpServers": {
"api7-petstore-mcp": {
"url": "http://123.123.123.123:9080/mcp"
}
}
}
如果配置成功,你应该能看到可用的工具(通过 MCP 暴露给 AI 客户端的外部函数或服务)。
现在,你可以直接从 AI 客户端的聊天窗口与 API7 企业版 进行交互。例如,试着问:“How many pets are there in the petstore?”
