mcp-openapi-proxy is a Python package that implements a Model Context Protocol (MCP) server, designed to dynamically expose REST APIs—defined by OpenAPI specifications—as MCP tools. This facilitates seamless integration of OpenAPI-described APIs into MCP-based workflows.
Works with every modern MCP-enabled client we tested. Strict MCP clients can now discover and call tools — the low-level server advertises correct capabilities and no longer crashes during resource/prompt discovery, and a slow spec download no longer crash-loops short-timeout clients. Verified live against the full list of mainstream agent CLIs:
- ✅ Codex, Gemini, Qwen, Kilocode, opencode — native tool calls over stdio
- ✅ Vibe — native discovery and read calls (writes were CLI-flaky, not a proxy issue)
- ✅ Letta — Cloud (via a remote streamable-HTTP MCP URL) and self-hosted (via stdio)
See the client matrix for attach mechanisms, models, and exact results.
📄 Full write-up:
Verification case study — what the proxy is, the API + client matrices, and every defect found & fixed.
Prompts and resources are real now — including custom resources. Both MCP surfaces are functional and tested: the summarize_spec / whimsical_blog prompts and the spec_file resource, plus a new ADDITIONAL_RESOURCES env var that serves your own use-case documents (e.g. a NetBox naming policy or an Asana project-layout guide) as MCP resources — see examples/resources/.
Bug fixes (every one live-verified):
- MCP client discovery: empty capability set + a crash in resource discovery left strict clients seeing zero tools (#23) — fixed, with a full stdio-handshake test harness.
IGNORE_SSL_TOOLSwas ignored by the low-level dispatcher (#14) — fixed (original patch by @robbycochran, #15).- Server crash-loop when a slow spec fetch outran a client's connect timeout (#28) — handshake now answers immediately, spec loads lazily, closed streams exit cleanly.
API_AUTH_TYPEcustom schemes (e.g. NetBoxToken) sent no auth header at all (#24) — fixed.TOOL_WHITELISTnever matched Slack-style dot paths like/users.list(#27) — fixed.TOOL_NAME_MAX_LENGTHwas not respected, and name-truncation collisions silently dropped tools (#11) — fixed.- Array parameters were emitted without
items, which the OpenAI API rejects (#16) — fixed. EXTRA_HEADERSnow accepts a JSON array and literal\nseparators, not just real newlines (#17).- Dead Render spec URL (#26) and incomplete ElevenLabs example (#29) — fixed; the GetZep example is documented for self-hosted Zep CE since the hosted endpoint now 401s (#38).
- Added a
Dockerfile+glama.jsonfor the Glama listing (#13); collapsible README examples + a verified-client/API matrix (#35).
Full environment-variable reference is in Environment Variables.
- Overview
- Features
- Installation
- Modes of Operation
- Environment Variables
- Verified Clients & Live Results (2026-06-12)
- Examples — Glama, Fly.io, Render, Slack, GetZep, Virustotal, Notion, Asana, APIs.guru, NetBox, Box, WolframAlpha, WordPress (collapsed)
- Troubleshooting
- License