OpenAPI Client Generator MCP

by orhanveli
Verified
  • src
#!/usr/bin/env node import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from "@modelcontextprotocol/sdk/types.js"; import { generate } from "openapi-typescript-codegen"; import fs from "fs/promises"; interface GenerateClientArgs { input: string; output: string; httpClient: "fetch" | "axios"; } class OpenApiClientGenerator { private server: Server; constructor() { this.server = new Server( { name: "openapi-client-generator", version: "0.1.1", }, { capabilities: { tools: {}, }, } ); this.setupToolHandlers(); this.server.onerror = (error) => console.error("[MCP Error]", error); process.on("SIGINT", async () => { await this.server.close(); process.exit(0); }); } private setupToolHandlers() { this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [ { name: "generate_client", description: "Generate TypeScript API client from OpenAPI specification", inputSchema: { type: "object", properties: { input: { type: "string", description: "URL or file path to OpenAPI specification", }, output: { type: "string", description: "Output directory for generated client", }, httpClient: { type: "string", enum: ["fetch", "axios"], description: "HTTP client to use (fetch or axios)", }, }, required: ["input", "output", "httpClient"], additionalProperties: false, }, }, ], })); this.server.setRequestHandler(CallToolRequestSchema, async (request) => { if (request.params.name !== "generate_client") { throw new McpError( ErrorCode.MethodNotFound, `Unknown tool: ${request.params.name}` ); } const args = request.params.arguments as unknown as GenerateClientArgs; try { // Ensure output directory exists await fs.mkdir(args.output, { recursive: true }); // Generate client await generate({ input: args.input, output: args.output, httpClient: args.httpClient, useOptions: true, useUnionTypes: true, exportSchemas: true, exportServices: true, exportCore: true, indent: "2", }); // Get list of generated files const files = await fs.readdir(args.output); return { content: [ { type: "text", text: `Successfully generated TypeScript API client in ${ args.output }\n\nGenerated files:\n${files.join("\n")}`, }, ], }; } catch (error) { return { content: [ { type: "text", text: `Error generating client: ${ error instanceof Error ? error.message : String(error) }`, }, ], isError: true, }; } }); } async run() { const transport = new StdioServerTransport(); await this.server.connect(transport); console.error("OpenAPI Client Generator MCP server running on stdio"); } } const server = new OpenApiClientGenerator(); server.run().catch(console.error);