Generate production-ready MCP servers from any OpenAPI specification using the highly-used and convenient mcp-use framework (8k+ GitHub stars).
OpenAPI specs are easy to write and organize your code and have 100s of tools available such as the OpenAPI Builder web UI.
- π Modern Framework - Uses mcp-use for clean, maintainable code
- π Built-in Inspector - Test tools immediately at
/inspector - π‘ Multiple Transports - HTTP, SSE, and Streamable HTTP support
- π¨ UI Widgets - Compatible with ChatGPT Apps SDK and MCP-UI
- π Auth Support - Bearer tokens, API keys, custom headers
- β¨ Zod Schemas - Type-safe parameter validation
- π³ Production Ready - Docker, PM2, and Kubernetes ready
# Generate a server from the Petstore API
npx api2ai \
https://petstore3.swagger.io/api/v3/openapi.json \
./petstore-mcp \
--name petstore-api
# Install and run
cd petstore-mcp
npm install
npm startOpen http://localhost:3000/inspector to test your tools!
node generate-mcp-use-server.js <openapi-spec> [output-folder] [options]
Options:
--name <name> Server name (default: api-mcp-server)
--base-url <url> Override API base URL
--port <port> Server port (default: 3000)
--help Show help# From remote URL
node generate-mcp-use-server.js \
https://api.example.com/openapi.json \
./my-server \
--name my-api
# From local file
node generate-mcp-use-server.js \
./specs/my-api.yaml \
./my-mcp-server \
--port 8080
# With custom base URL
node generate-mcp-use-server.js \
./petstore.json \
./petstore \
--base-url https://petstore.example.com/v3import { generateMcpServer, extractTools, loadOpenApiSpec } from './generate-mcp-use-server.js';
// Generate complete server
const result = await generateMcpServer(
'https://api.example.com/openapi.json',
'./output-folder',
{
serverName: 'my-api',
baseUrl: 'https://api.example.com/v1',
port: 3000,
}
);
console.log(`Generated ${result.toolCount} tools`);
// Or just extract tools for custom processing
const spec = await loadOpenApiSpec('./my-spec.json');
const tools = extractTools(spec, {
filterFn: (tool) => tool.method === 'get', // Only GET endpoints
excludeOperationIds: ['deleteUser'], // Exclude specific operations
});my-mcp-server/
βββ .env # Environment config (gitignored)
βββ .env.example # Example environment file
βββ .gitignore
βββ package.json
βββ README.md # Generated documentation
βββ src/
βββ index.js # Main server with tool registrations
βββ http-client.js # HTTP utilities
βββ tools-config.js # Tool configurations
| Endpoint | Description |
|---|---|
GET /inspector |
Interactive tool testing UI |
POST /mcp |
MCP protocol endpoint |
GET /sse |
Server-Sent Events endpoint |
GET /health |
Health check |
| Variable | Description |
|---|---|
PORT |
Server port |
NODE_ENV |
development/production |
API_BASE_URL |
Base URL for API calls |
API_KEY |
Bearer token auth |
API_AUTH_HEADER |
Custom header (Name:value) |
MCP_URL |
Public URL for widgets |
ALLOWED_ORIGINS |
CORS origins (production) |
The generated server supports the OpenAI Apps SDK out of the box.
const result = await generateMcpServer(specUrl, outputDir, {
filterFn: (tool) => ['get', 'post'].includes(tool.method),
});const result = await generateMcpServer(specUrl, outputDir, {
excludeOperationIds: [
'deleteUser',
'deleteAllData',
'adminReset',
],
});const result = await generateMcpServer(specUrl, outputDir, {
filterFn: (tool) => tool.pathTemplate.startsWith('/api/v2/'),
});const result = await generateMcpServer(specUrl, outputDir, {
excludeOperationIds: ['deleteUser'],
filterFn: (tool) =>
tool.method === 'get' &&
tool.pathTemplate.includes('/public/'),
});| Feature | This Generator | Raw SDK |
|---|---|---|
| Code needed | ~50 lines | ~200+ lines |
| Inspector | β Built-in | β Manual |
| UI Widgets | β Supported | β Manual |
| Zod validation | β Generated | β Manual |
| Authentication | β Configured | β Manual |
| Production ready | β Yes |
