{"id":28102268,"url":"https://github.com/serverless-devs/openapi-mcp-converter","last_synced_at":"2025-09-07T20:33:24.009Z","repository":{"id":292684133,"uuid":"981618285","full_name":"Serverless-Devs/openapi-mcp-converter","owner":"Serverless-Devs","description":"Automatically convert OpenAPI specifications into Model Context Protocol (MCP) service instances","archived":false,"fork":false,"pushed_at":"2025-05-11T14:43:22.000Z","size":19,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-05-11T15:32:43.395Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Serverless-Devs.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-11T14:16:52.000Z","updated_at":"2025-05-11T14:43:25.000Z","dependencies_parsed_at":"2025-05-11T15:43:11.507Z","dependency_job_id":null,"html_url":"https://github.com/Serverless-Devs/openapi-mcp-converter","commit_stats":null,"previous_names":["serverless-devs/openapi-mcp-converter"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Serverless-Devs%2Fopenapi-mcp-converter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Serverless-Devs%2Fopenapi-mcp-converter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Serverless-Devs%2Fopenapi-mcp-converter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Serverless-Devs%2Fopenapi-mcp-converter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Serverless-Devs","download_url":"https://codeload.github.com/Serverless-Devs/openapi-mcp-converter/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254015933,"owners_count":21999960,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-13T19:48:56.113Z","updated_at":"2025-09-07T20:33:23.999Z","avatar_url":"https://github.com/Serverless-Devs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpenAPI to MCP Server Converter\n\n[![Node.js Version](https://img.shields.io/badge/node-%3E%3D18.x-brightgreen)](https://nodejs.org/)\n[![TypeScript Version](https://img.shields.io/badge/typescript-5.x-blue)](https://www.typescriptlang.org/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n将 OpenAPI 规范自动转换为 Model Context Protocol（MCP）服务实例\n\n## 功能特性\n\n- 🚀 **自动化转换**：自动解析 OpenAPI 3.0 规范\n- 🛠 **类型安全**：基于 TypeScript 的强类型校验\n- 🔄 **请求代理**：自动处理工具调用参数映射\n\n## 快速开始\n\n### 前置条件\n\n- Node.js 18+\n- TypeScript 5.x\n\n### 基础用法\n\n引入依赖：\n\n```bash\nnpm install @serverless-devs/openapi-mcp-converter\n```\n\n创建一个 Server 实例:\n\n```typescript\nimport fs from 'fs';\nimport { OpenApiMCPSeverConverter } from '@serverless-devs/openapi-mcp-converter';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst openApiDoc = JSON.parse(fs.readFileSync(path.join(path.dirname(fileURLToPath(import.meta.url)), 'openapi.json'), 'utf8'));\n\nconst converter = new OpenApiMCPSeverConverter(openApiDoc, { timeout: 100000, security: { apiKey: 'my-api-key' } });\nconst server = converter.getServer();\n```\n\n运行一个本地 Stdio Server:\n\n```typescript\nasync function runServer() {\n  const transport = new StdioServerTransport();\n  await server.connect(transport);\n  console.log(\"GitHub MCP Server running on stdio\");\n}\n\nrunServer().catch((error) =\u003e {\n  console.error(\"Fatal error in main():\", error);\n  process.exit(1);\n});\n```\n\n运行一个本地 SSE Server:\n\n```typescript\nimport fs from 'fs';\nimport { OpenApiMCPSeverConverter } from '../index.js';\nimport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport express from 'express';\n\nconst openApiDoc = JSON.parse(fs.readFileSync(path.join(path.dirname(fileURLToPath(import.meta.url)), 'openapi.json'), 'utf8'));\n\nconst converter = new OpenApiMCPSeverConverter(openApiDoc, { timeout: 100000 });\nconst server = converter.getServer();\nconsole.log(JSON.stringify(converter.getMcpTools(), null, 2));\nconsole.log(JSON.stringify(converter.getTools(), null, 2));\nconst app = express();\nlet transport: SSEServerTransport;\n\napp.get(\"/sse\", async (req, res) =\u003e {\n  server.onclose = async () =\u003e {\n    await server.close();\n  };\n  transport = new SSEServerTransport(\"/messages\", res);\n  await server.connect(transport);\n  return;\n});\n\napp.post(\"/messages\", async (req, res) =\u003e {\n  const sessionId = req.query.sessionId as string;\n  if (!sessionId) {\n      throw new Error(\"sessionId query parameter is required\");\n  }\n  await transport.handlePostMessage(req, res);\n  return;\n});\n\napp.listen(8080, () =\u003e {\n  console.log('MCP Server running on port 8080');\n});\n```\n\n运行一个本地 Streamable HTTP Server:\n\n```typescript\nconst app = express();\napp.use(express.json());\n\nconst transports: { [sessionId: string]: StreamableHTTPServerTransport } = {};\n\napp.post('/mcp', async (req, res) =\u003e {\n  const sessionId = req.headers['mcp-session-id'] as string | undefined;\n  let transport: StreamableHTTPServerTransport;\n\n  if (sessionId \u0026\u0026 transports[sessionId]) {\n    transport = transports[sessionId];\n  } else if (!sessionId \u0026\u0026 isInitializeRequest(req.body)) {\n    transport = new StreamableHTTPServerTransport({\n      sessionIdGenerator: () =\u003e randomUUID(),\n      onsessioninitialized: (sessionId) =\u003e {\n        transports[sessionId] = transport;\n      }\n    });\n    transport.onclose = () =\u003e {\n      if (transport.sessionId) {\n        delete transports[transport.sessionId];\n      }\n    };\n    await server.connect(transport);\n  } else {\n    res.status(400).json({\n      jsonrpc: '2.0',\n      error: {\n        code: -32000,\n        message: 'Bad Request: No valid session ID provided',\n      },\n      id: null,\n    });\n    return;\n  }\n\n  await transport.handleRequest(req, res, req.body);\n});\n\nconst handleSessionRequest = async (req: express.Request, res: express.Response) =\u003e {\n  const sessionId = req.headers['mcp-session-id'] as string | undefined;\n  if (!sessionId || !transports[sessionId]) {\n    res.status(400).send('Invalid or missing session ID');\n    return;\n  }\n  \n  const transport = transports[sessionId];\n  await transport.handleRequest(req, res);\n};\n\napp.get('/mcp', handleSessionRequest);\n\napp.delete('/mcp', handleSessionRequest);\n\napp.listen(3000);\n```\n\n## 开发指南\n\n### 项目结构\n\n```\n/openapi-to-mcp\n├── dist/            # 编译输出\n├── src/             # 源代码\n│   ├── example/     # 示例配置\n│   └── index.ts     # 核心实现\n├── package.json\n└── tsconfig.json\n```\n\n### 构建命令\n\n```bash\nnpm run build    # 生产环境构建\nnpm run watch    # 开发模式监听\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserverless-devs%2Fopenapi-mcp-converter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fserverless-devs%2Fopenapi-mcp-converter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserverless-devs%2Fopenapi-mcp-converter/lists"}