openapi-to-mcp
openapi-to-mcp 插件使网关 能够充当 OpenAPI 规范与模型上下文协议(MCP)服务器之间的桥梁。通过此插件,你可以通过 MCP 接口暴露现有的基于 OpenAPI 的服务,使其可供 AI 模型和客户端访问。
该插件会将 OpenAPI 规范转换为 MCP 格式,并通过 MCP 服务器接口提供服务。随后,来自 AI 客户端的请求会被代理到上游服务。插件支持自定义请求头,并支持两种用于流式响应的传输方式:Streamable HTTP 和服务器发送事件(SSE),从而实现灵活、可靠的实时通信。
下图展示了 MCP 客户端、API7 网关与上游 OpenAPI 服务之间的交互。图中的路径和数据仅为演示示例。
演示
以下示例演示如何启用对 Petstore API 的 MCP 访问,使 AI 模型和客户端能够与 Petstore 服务交互。正确配置后,AI 客户端应立即显示可用的 Petstore 工具;如果工具未显示,请确认 OpenAPI 规范 URL 可访问,且 AI 客户端环境能够连接网关地址。
部署与兼容性
部署前置条件
从 API7 企业版 3.9.10 起,OpenAPI-to-MCP 服务不再内置于网关镜像中,必须与网关一起部署在同一网络命名空间中。
- Kubernetes(Helm):在网关 Chart values 中设置
openapiToMcp.enabled: true,以边车方式运行该服务。 - Docker / 裸机:将
api7/openapi-to-mcp镜像作为独立容器运行,并与网关共享网络命名空间(例如使用--network=container:<gateway>或主机网络),使插件可以通过127.0.0.1:<port>(默认端口为3000)访问该服务。插件将127.0.0.1硬编码为目标地址,因此两个容器必须共享网络命名空间;仅共享 Docker bridge 网络并不足够。
如果无法访问该服务,插件将返回 503 错误。mcp-tools-acl 插件同样如此。若要让服务在其他端口运行,请参阅静态配置。
边车镜像标签与网关版本兼容性
插件与 OpenAPI-to-MCP 服务通过很少变更的稳定内部契约进行通信,因此一个边车镜像标签可兼容多个网关版本。下表列出了各网关版本范围应使用的边车标签。仅当两者之间的协议发生变化(即下表新增一行)时,才需要更新边车。
此指南适用于需要自行选择边车镜像标签的 Docker 和裸机部署。Helm Chart 已为配套的网关版本固定经过验证的边车标签,因此 Helm 用户无需参考此表。
| 网关版本 | 边车镜像标签(api7/openapi-to-mcp) |
|---|---|
3.9.10 及更高版本 | 1.0.2 或更高版本 |
自 API7 企业版 3.9.21 起可用的插件参数 cache_enabled 和 cache_ttl 需要边车镜像标签 1.0.5 或更高版本。更早版本的边车会忽略这两个参数。
OpenAPI 文档缓存
在 api7/openapi-to-mcp:1.0.2 中,服务会缓存解析后的 OpenAPI 文档及据此生成的工具定义。缓存键根据 openapi_url、base_url、三个鉴权请求头(Authorization、X-API-Key、X-Auth-Token)值的摘要,以及 flatten_parameters 设置生成。缓存默认开启,条目自写入起保留 3600 秒,命中缓存不会延长有效期。服务会在条目过期后下一次需要加载规范时重新下载并解析文档;文档内容或 HTTP 缓存头的变化不会主动使缓存失效。缓存过期不会自动更新已有 SSE 或有状态 HTTP 会话中注册的工具。
如需跳过旧缓存,请修改 openapi_url(例如添加或更新查询参数 ?v=2),确保新 URL 仍能返回所需规范,并保存插件。服务下一次加载规范时会使用新 URL 对应的缓存键;若该键尚无缓存,则重新拉取文档。已有会话需要重新建立连接并加载工具。
自 API7 企业版 3.9.21 起,每个路由可以通过插件参数 cache_enabled 和 cache_ttl 设置各自的缓存行为,默认值分别为 true 和 3600 秒。使用 1.0.5 或更高版本的边车镜像时,插件会在每个请求中将这些值传递给服务,因此它们优先于下方的容器环境变量。对于仍在变化的文档,可在对应路由上将 cache_enabled 设置为 false,使服务每次加载工具时都重新读取文档。
Docker 和裸机部署可以通过 api7/openapi-to-mcp 容器的环境变量调整缓存:
| 变量 | 默认值 | 说明 |
|---|---|---|
CACHE_ENABLED | true | 设为小写 false 可关闭缓存。关闭后,每次需要加载 OpenAPI 规范时都会重新下载并解析文档,延迟会上升;已有会话中的工具请求不会因此重新加载规范。 |
CACHE_TTL | 3600 | 缓存条目的保留秒数,建议使用正整数。 |
Helm Chart 目前未为边车暴露这些变量,Helm 部署使用默认值或上文所述的插件参数。
使用 Docker Compose 部署
以下 docker-compose.yaml 会同时运行 API7 企业版网关和 OpenAPI-to-MCP 服务。MCP 服务会加入网关的网络命名空间,使插件可以通过 127.0.0.1:3000 访问它。
在控制台中添加网关实例时,系统会自动生成可直接使用的 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.6
network_mode: "service:gateway"
restart: always
❶ DP Manager 端点,请替换为控制台中提供的地址。
❷ 网关组短 ID,请替换为控制台中显示的值。
❸ TLS 客户端证书、私钥和 CA 证书。从控制台复制生成的 Compose 文件时,系统会自动填充这些值。
❹ network_mode: "service:gateway" 让 MCP 容器共享网关的网络栈,使插件可以通过 127.0.0.1:3000 访问 MCP 服务。仅共享 Docker bridge 网络并不足够,因为插件将 127.0.0.1 硬编码为目标地址。
启动服务:
docker compose up -d
示例
以下示例演示了如何在不同场景下配置 openapi-to-mcp 插件。
启用对 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(建议用于生产环境)。
❸ 配置 Petstore API 地址。
❹ 配置 Petstore API 凭证。
❺ 配置 Petstore OpenAPI 文档 URL。
创建一个路由,并按如下方式配置 openapi-to-mcp 插件:
services:
- name: openapi-to-mcp-service
upstream:
type: roundrobin
scheme: https
pass_host: node
nodes:
- host: petstore3.swagger.io
port: 443
weight: 1
routes:
- name: openapi-to-mcp-route
uris:
- /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"
将配置同步到网关:
adc sync -f adc.yaml
❶ 配置路由允许 GET 和 POST 方法。GET 方法用于工具发现和响应流式传输(SSE),POST 方法用于执行和操作能力(messages)。
❷ 将传输方式配置为 streamable_http(建议用于生产环境)。
❸ 配置 Petstore API 地址。
❹ 配置 Petstore API 凭证。
❺ 配置 Petstore OpenAPI 文档 URL。
- Gateway API
- APISIX CRD
创建一个路由,并按如下方式配置 openapi-to-mcp 插件:
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: openapi-to-mcp-plugin-config
spec:
plugins:
- name: openapi-to-mcp
config:
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"
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: openapi-to-mcp-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /mcp
method: GET
- path:
type: Exact
value: /mcp
method: POST
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: openapi-to-mcp-plugin-config
backendRefs:
- name: petstore-external-domain
port: 443
---
apiVersion: v1
kind: Service
metadata:
namespace: aic
name: petstore-external-domain
spec:
type: ExternalName
externalName: petstore3.swagger.io
---
apiVersion: apisix.apache.org/v1alpha1
kind: BackendTrafficPolicy
metadata:
namespace: aic
name: petstore-external-domain
spec:
targetRefs:
- group: ""
kind: Service
name: petstore-external-domain
passHost: node
scheme: https
将配置应用到集群:
kubectl apply -f openapi-to-mcp-ic.yaml
❶ 将传输方式配置为 streamable_http(推荐用于生产环境)。
❷ 配置 Petstore API 地址。
❸ 配置 Petstore API 凭证。
❹ 配置 Petstore OpenAPI 文档 URL。
❺ 配置路由以允许 GET 和 POST 方法。GET 方法用于工具发现和响应流式传输(SSE),POST 方法用于执行操作(消息)。
创建一个路由,并按如下方式配置 openapi-to-mcp 插件:
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: openapi-to-mcp-route
spec:
ingressClassName: apisix
http:
- name: openapi-to-mcp-route
match:
paths:
- /mcp
methods:
- GET
- POST
plugins:
- name: openapi-to-mcp
enable: true
config:
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"
将配置应用到集群:
kubectl apply -f openapi-to-mcp-ic.yaml
❶ 配置路由允许 GET 和 POST 方法。GET 方法用于工具发现和响应流式传输(SSE),POST 方法用于执行和操作能力(messages)。
❷ 将传输方式配置为 streamable_http(建议用于生产环境)。
❸ 配置 Petstore API 地址。
❹ 配置 Petstore API 凭证。
❺ 配置 Petstore OpenAPI 文档 URL。
应用 Admin API、ADC 或 APISIX CRD 配置后,在 MCP 设置中填写 API7 网关地址,并追加之前创建的路由路径。例如:
{
"mcpServers": {
"api7-petstore-mcp": {
"url": "http://123.123.123.123:9080/mcp"
}
}
}
如果配置成功,你应该会看到可用工具,即通过 MCP 向 AI 客户端公开的外部函数或服务。
现在,你可以直接在 AI 客户端的聊天窗口中与 Petstore 服务交互。例如,可以尝试询问:“显示 Petstore 中编号为 1 的宠物。”

为 MCP 路由配置身份验证
以下示例演示了当路由受到身份验证方法(如 key-auth)保护时,如何通过 MCP 协议暴露 Petstore API。
- Admin API
- ADC
- Ingress Controller
创建一个消费者 johndoe:
curl "http://127.0.0.1:9180/apisix/admin/consumers" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"username": "johndoe"
}'
为 johndoe 配置 key-auth 凭证:
curl "http://127.0.0.1:9180/apisix/admin/consumers/johndoe/credentials" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "cred-john-key-auth",
"plugins": {
"key-auth": {
"key": "john-key"
}
}
}'
创建一个包含 openapi-to-mcp 和 key-auth 插件的路由:
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"
},
"key-auth": {
"header": "apikey"
}
}
}'
创建一个消费者和一条路由,并按如下方式配置 openapi-to-mcp 和 key-auth 插件:
consumers:
- username: johndoe
credentials:
- name: primary-key
type: key-auth
config:
key: john-key
services:
- name: openapi-to-mcp-service
upstream:
type: roundrobin
scheme: https
pass_host: node
nodes:
- host: petstore3.swagger.io
port: 443
weight: 1
routes:
- name: openapi-to-mcp-route
uris:
- /mcp
methods:
- GET
- POST
plugins:
key-auth:
header: apikey
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"
将配置同步到网关:
adc sync -f adc.yaml
- Gateway API
- APISIX CRD
创建一个消费者和一条路由,并按如下方式配置 openapi-to-mcp 和 key-auth 插件:
apiVersion: apisix.apache.org/v1alpha1
kind: Consumer
metadata:
namespace: aic
name: johndoe
spec:
gatewayRef:
name: apisix
credentials:
- type: key-auth
name: primary-key
config:
key: john-key
---
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: openapi-to-mcp-plugin-config
spec:
plugins:
- name: key-auth
config:
header: apikey
- name: openapi-to-mcp
config:
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"
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: openapi-to-mcp-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /mcp
method: GET
- path:
type: Exact
value: /mcp
method: POST
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: openapi-to-mcp-plugin-config
backendRefs:
- name: petstore-external-domain
port: 443
---
apiVersion: v1
kind: Service
metadata:
namespace: aic
name: petstore-external-domain
spec:
type: ExternalName
externalName: petstore3.swagger.io
---
apiVersion: apisix.apache.org/v1alpha1
kind: BackendTrafficPolicy
metadata:
namespace: aic
name: petstore-external-domain
spec:
targetRefs:
- group: ""
kind: Service
name: petstore-external-domain
passHost: node
scheme: https
创建一个 ApisixConsumer 和一条路由,并按 如下方式配置 openapi-to-mcp 和 key-auth 插件:
apiVersion: apisix.apache.org/v2
kind: ApisixConsumer
metadata:
namespace: aic
name: johndoe
spec:
ingressClassName: apisix
authParameter:
keyAuth:
value:
key: john-key
---
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
namespace: aic
name: petstore-external-domain
spec:
ingressClassName: apisix
scheme: https
passHost: node
externalNodes:
- type: Domain
name: petstore3.swagger.io
port: 443
---
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: openapi-to-mcp-route
spec:
ingressClassName: apisix
http:
- name: openapi-to-mcp-route
match:
paths:
- /mcp
methods:
- GET
- POST
upstreams:
- name: petstore-external-domain
plugins:
- name: key-auth
enable: true
config:
header: apikey
- name: openapi-to-mcp
enable: true
config:
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"
将配置应用到集群:
kubectl apply -f openapi-to-mcp-ic.yaml
当 MCP 服务器需要身份验证时,你可以在 mcp.json 配置中指定请求头。请参阅你的 AI 客户端文档以确认是否支持请求头。
如果支持请求头
例如,在应用 Admin API、ADC 或 APISIX CRD 配置后,可以在 Cursor 的 MCP 设置中填写 API7 网关地址、追加之前创建的路由路径,并添加 key-auth 所需的请求头:
{
"mcpServers": {
"api7-petstore-mcp": {
"url": "http://123.123.123.123:9080/mcp",
"headers": {
"apikey": "john-key"
}
}
}
}
配置的请求头将被添加到 GET 和 POST 请求中。
如果配置成功,你应该会看到可用工具,即通过 MCP 向 AI 客户端公开的外部函数或服务。随后便可直接在 AI 客户端的聊天窗口中与 Petstore 交互。
如果未在 mcp.json 中配置身份验证头,AI 客户端将无法从 MCP 服务器加载工具。