Fire in da houseTop Tip:Paying $100+ per month for Perplexity, MidJourney, Runway, ChatGPT and other tools is crazy - get all your AI tools in one site starting at $15 per month with Galaxy AI Fire in da houseCheck it out free

openapi-mcp-converter

MCP.Pizza Chef: Serverless-Devs

OpenAPI MCP Converter is a server that automates the transformation of OpenAPI 3.0 specifications into Model Context Protocol (MCP) service instances. It ensures type safety through TypeScript integration and handles request parameter mapping automatically, enabling seamless integration of RESTful APIs into MCP workflows. Designed for Node.js 18+ environments, it simplifies exposing API functionality to LLMs and AI agents via MCP.

Use This MCP server To

Convert OpenAPI 3.0 specs into MCP servers automatically Generate type-safe MCP service instances from API definitions Proxy and map API request parameters for MCP tool calls Integrate REST APIs into LLM workflows via MCP Automate MCP server creation for existing OpenAPI endpoints

README

OpenAPI to MCP Server Converter

Node.js Version TypeScript Version License: MIT

将 OpenAPI 规范自动转换为 Model Context Protocol(MCP)服务实例

功能特性

  • 🚀 自动化转换:自动解析 OpenAPI 3.0 规范
  • 🛠 类型安全:基于 TypeScript 的强类型校验
  • 🔄 请求代理:自动处理工具调用参数映射

快速开始

前置条件

  • Node.js 18+
  • TypeScript 5.x

基础用法

引入依赖:

npm install @serverless-devs/openapi-mcp-converter

创建一个 Server 实例:

import fs from 'fs';
import { OpenApiMCPSeverConverter } from '@serverless-devs/openapi-mcp-converter';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import path from 'path';
import { fileURLToPath } from 'url';

const openApiDoc = JSON.parse(fs.readFileSync(path.join(path.dirname(fileURLToPath(import.meta.url)), 'openapi.json'), 'utf8'));

const converter = new OpenApiMCPSeverConverter(openApiDoc, { timeout: 100000, security: { apiKey: 'my-api-key' } });
const server = converter.getServer();

运行一个本地 Stdio Server:

async function runServer() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.log("GitHub MCP Server running on stdio");
}

runServer().catch((error) => {
  console.error("Fatal error in main():", error);
  process.exit(1);
});

运行一个本地 SSE Server:

const app = express();
let transport = null;

app.get("/sse", async (req, res) => {
  server.onclose = async () => {
    await server.close();
  };
  transport = new SSEServerTransport("/messages", res);
  await server.connect(transport);
  return;
});

app.post("/messages", async (req, res) => {
  const sessionId = req.query.sessionId as string;
  if (!sessionId) {
      throw new Error("sessionId query parameter is required");
  }
  await transport.handlePostMessage(req, res);
  return;
});

app.listen(8080, () => {
  console.log('MCP Server running on port 8080');
});

运行一个本地 Streamable HTTP Server:

const app = express();
app.use(express.json());

const transports: { [sessionId: string]: StreamableHTTPServerTransport } = {};

app.post('/mcp', async (req, res) => {
  const sessionId = req.headers['mcp-session-id'] as string | undefined;
  let transport: StreamableHTTPServerTransport;

  if (sessionId && transports[sessionId]) {
    transport = transports[sessionId];
  } else if (!sessionId && isInitializeRequest(req.body)) {
    transport = new StreamableHTTPServerTransport({
      sessionIdGenerator: () => randomUUID(),
      onsessioninitialized: (sessionId) => {
        transports[sessionId] = transport;
      }
    });
    transport.onclose = () => {
      if (transport.sessionId) {
        delete transports[transport.sessionId];
      }
    };
    await server.connect(transport);
  } else {
    res.status(400).json({
      jsonrpc: '2.0',
      error: {
        code: -32000,
        message: 'Bad Request: No valid session ID provided',
      },
      id: null,
    });
    return;
  }

  await transport.handleRequest(req, res, req.body);
});

const handleSessionRequest = async (req: express.Request, res: express.Response) => {
  const sessionId = req.headers['mcp-session-id'] as string | undefined;
  if (!sessionId || !transports[sessionId]) {
    res.status(400).send('Invalid or missing session ID');
    return;
  }
  
  const transport = transports[sessionId];
  await transport.handleRequest(req, res);
};

app.get('/mcp', handleSessionRequest);

app.delete('/mcp', handleSessionRequest);

app.listen(3000);

运行示例

npm test  # 执行示例测试用例

开发指南

项目结构

/openapi-to-mcp
├── dist/            # 编译输出
├── src/             # 源代码
│   ├── example/     # 示例配置
│   └── index.ts     # 核心实现
├── package.json
└── tsconfig.json

构建命令

npm run build    # 生产环境构建
npm run watch    # 开发模式监听

openapi-mcp-converter FAQ

How do I install the OpenAPI MCP Converter?
Install it via npm using 'npm install @serverless-devs/openapi-mcp-converter' in a Node.js 18+ environment.
What programming language is used for type safety?
The converter uses TypeScript 5.x to provide strong type checking and safety.
Does it support OpenAPI versions other than 3.0?
Currently, it supports OpenAPI 3.0 specifications for conversion into MCP servers.
How does it handle API request parameters?
It automatically maps and proxies request parameters to match MCP tool call requirements.
Can I use this converter with any MCP host?
Yes, it generates standard MCP service instances compatible with any MCP host environment.
Is the converter open source and under what license?
Yes, it is open source under the MIT license.
What Node.js version is required?
Node.js version 18 or higher is required to run the converter.
How do I create a server instance from an OpenAPI spec?
Import the converter, load your OpenAPI JSON, and instantiate the server using provided APIs as shown in the documentation.