openapi-to-mcp
Converts any OpenAPI 3.x spec into a live MCP server, making every endpoint a validated tool that AI agents can call without writing glue code.
README
<div align="center">
🔌 openapi-to-mcp
Turn any OpenAPI 3.x spec into a live MCP server. Point it at a spec (file or URL) and every endpoint becomes a validated tool your AI agent can call — no glue code, no per-API server to write.
Quick start · How it maps · Config · Secure it · Limits · Español
</div>
OpenAPI 3.x spec your AI client
(JSON / YAML, file or URL) (Claude, Cursor)
│ │
▼ │ MCP / JSON-RPC (stdio)
[ openapi-to-mcp ] ◀───────────────────────────┘
│ GET /pets/{id} → tool "get_pet_by_id"
▼ HTTP + your auth header
the underlying REST API
Why
MCP lets an agent call tools, but someone has to write those tools. If the capability you want already exists as a REST API with an OpenAPI spec, writing a bespoke MCP server for it is busywork.
openapi-to-mcp reads the spec and does the mapping for you: each METHOD /path
becomes a tool, each parameter and request body becomes a Zod-validated input,
and every call is turned into an HTTP request with your auth header attached. The
response comes back trimmed for an LLM context window.
Quick start
No install needed — run it straight from npm:
npx @karlangas12/openapi-to-mcp --spec https://api.example.com/openapi.json \
--auth-header "Authorization: Bearer YOUR_TOKEN"
See what tools a spec produces without starting a server:
npx @karlangas12/openapi-to-mcp --spec ./openapi.yaml --list
Claude Desktop — claude_desktop_config.json
{
"mcpServers": {
"petstore": {
"command": "npx",
"args": [
"-y", "@karlangas12/openapi-to-mcp",
"--spec", "https://petstore3.swagger.io/api/v3/openapi.json",
"--auth-header", "Authorization: Bearer YOUR_TOKEN"
]
}
}
}
Cursor — .cursor/mcp.json
{
"mcpServers": {
"my-api": {
"command": "npx",
"args": [
"-y", "@karlangas12/openapi-to-mcp",
"--spec", "./openapi.yaml",
"--base-url", "https://api.internal.company.com"
]
}
}
}
That's the whole integration. Restart the client and the API's endpoints show up as tools.
How it maps
| OpenAPI | Becomes |
|---|---|
operationId, or METHOD /path if absent |
Tool name (get_pets_by_pet_id) |
summary / description |
Tool description |
| Path, query and header parameters | Tool input properties (path params are required) |
requestBody (application/json) |
A body input property |
| Every input schema | A Zod validator + a JSON Schema for tools/list |
Local $ref (#/components/...) |
Resolved inline |
enum, minimum/maximum, required, nullable, oneOf/anyOf/allOf |
Enforced on input |
When the agent calls a tool, arguments are validated before any HTTP request
goes out. Path params are substituted into the URL, query params are appended,
header params and your static --auth-header values are sent, and a JSON body is
serialized. A 4xx/5xx response comes back as an error result the model can
read and react to — not a silent failure.
Configuration
openapi-to-mcp --spec <path|url> [options]
-s, --spec <path|url> OpenAPI 3.x spec (JSON or YAML, local or remote)
--base-url <url> API base URL (when the spec declares no "servers")
-H, --auth-header <h> Header to forward, "Name: value" (repeatable)
--format <mode> Response format: markdown (default) or json
-n, --name <name> MCP server name
--list Print the generated tools and exit
-h, --help / -v, --version
Multiple headers:
npx @karlangas12/openapi-to-mcp --spec ./api.yaml \
--auth-header "Authorization: Bearer XYZ" \
--auth-header "X-Api-Version: 2024-01"
Export a standalone server (codegen)
npx @karlangas12/openapi-to-mcp codegen --spec ./api.yaml -o server.ts
Writes a single self-contained TypeScript file that embeds the spec and boots the server via this package — handy for committing a pinned server to a repo.
Pairing with mcp-shield-proxy
openapi-to-mcp talks to a third-party API on your behalf, with your
credentials. If you want a policy, credential masking and an audit trail around
that, wrap it with mcp-shield-proxy
— they compose with one extra line:
{
"mcpServers": {
"petstore": {
"command": "npx",
"args": [
"-y", "mcp-shield-proxy", "--", // ← inspect, mask, audit
"npx", "-y", "@karlangas12/openapi-to-mcp",
"--spec", "https://api.example.com/openapi.json",
"--auth-header", "Authorization: Bearer YOUR_TOKEN"
]
}
}
}
Now every generated tool call is policy-checked, credentials in the traffic are masked, and the whole session lands in a verifiable audit log.
Use as a library
import { loadSpec, buildTools, createMcpServer, startStdioServer } from '@karlangas12/openapi-to-mcp';
const doc = await loadSpec('./openapi.yaml');
const { tools, baseUrl } = buildTools(doc);
const server = createMcpServer({
tools,
baseUrl: baseUrl ?? 'https://api.example.com',
headers: { Authorization: 'Bearer YOUR_TOKEN' },
fetchFn: (url, init) => fetch(url, init as RequestInit),
});
startStdioServer(server);
The parser, the schema→Zod converter and the tool builder are all exported independently.
Honest limitations
- stdio transport only. The MCP server speaks stdio, which covers Claude Desktop, Cursor and Claude Code. Native HTTP/SSE serving isn't implemented yet.
- Local
$refonly. References inside the document (#/components/...) are resolved. External refs (other files or URLs) are not — they raise a clear error rather than failing quietly. application/jsonbodies. Request bodies are mapped for JSON content.multipart/form-dataandapplication/x-www-form-urlencodedaren't mapped yet.- It's a mapper, not a gateway. It doesn't add retries, caching or rate limiting. Pair it with a proxy if you need those.
Performance
The spec is parsed once at startup; after that, each tool call is a schema validation plus one HTTP request. Parsing and tool generation for a typical spec is sub-millisecond — the latency you feel is the underlying API's, not this.
Testing
npm test # 32 tests
npm run typecheck # strict TypeScript
Coverage includes JSON and YAML parsing, endpoint→tool conversion with Zod
schemas, and a full tools/call round trip over JSON-RPC against a mocked HTTP
backend (asserting the URL, method, headers and body that reach it).
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。