mcp-openapi 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +351 -0
  2. package/dist/bin/mcp-openapi.d.ts +3 -0
  3. package/dist/bin/mcp-openapi.d.ts.map +1 -0
  4. package/dist/bin/mcp-openapi.js +26 -0
  5. package/dist/bin/mcp-openapi.js.map +1 -0
  6. package/dist/src/auth/api-key.d.ts +10 -0
  7. package/dist/src/auth/api-key.d.ts.map +1 -0
  8. package/dist/src/auth/api-key.js +23 -0
  9. package/dist/src/auth/api-key.js.map +1 -0
  10. package/dist/src/auth/auth-manager.d.ts +4 -0
  11. package/dist/src/auth/auth-manager.d.ts.map +1 -0
  12. package/dist/src/auth/auth-manager.js +36 -0
  13. package/dist/src/auth/auth-manager.js.map +1 -0
  14. package/dist/src/auth/bearer.d.ts +8 -0
  15. package/dist/src/auth/bearer.d.ts.map +1 -0
  16. package/dist/src/auth/bearer.js +16 -0
  17. package/dist/src/auth/bearer.js.map +1 -0
  18. package/dist/src/auth/index.d.ts +3 -0
  19. package/dist/src/auth/index.d.ts.map +1 -0
  20. package/dist/src/auth/index.js +2 -0
  21. package/dist/src/auth/index.js.map +1 -0
  22. package/dist/src/auth/oauth2.d.ts +14 -0
  23. package/dist/src/auth/oauth2.d.ts.map +1 -0
  24. package/dist/src/auth/oauth2.js +59 -0
  25. package/dist/src/auth/oauth2.js.map +1 -0
  26. package/dist/src/auth/types.d.ts +5 -0
  27. package/dist/src/auth/types.d.ts.map +1 -0
  28. package/dist/src/auth/types.js +2 -0
  29. package/dist/src/auth/types.js.map +1 -0
  30. package/dist/src/config/cli-args.d.ts +5 -0
  31. package/dist/src/config/cli-args.d.ts.map +1 -0
  32. package/dist/src/config/cli-args.js +154 -0
  33. package/dist/src/config/cli-args.js.map +1 -0
  34. package/dist/src/config/index.d.ts +4 -0
  35. package/dist/src/config/index.d.ts.map +1 -0
  36. package/dist/src/config/index.js +3 -0
  37. package/dist/src/config/index.js.map +1 -0
  38. package/dist/src/config/types.d.ts +46 -0
  39. package/dist/src/config/types.d.ts.map +1 -0
  40. package/dist/src/config/types.js +7 -0
  41. package/dist/src/config/types.js.map +1 -0
  42. package/dist/src/executor/http-client.d.ts +14 -0
  43. package/dist/src/executor/http-client.d.ts.map +1 -0
  44. package/dist/src/executor/http-client.js +59 -0
  45. package/dist/src/executor/http-client.js.map +1 -0
  46. package/dist/src/executor/index.d.ts +7 -0
  47. package/dist/src/executor/index.d.ts.map +1 -0
  48. package/dist/src/executor/index.js +4 -0
  49. package/dist/src/executor/index.js.map +1 -0
  50. package/dist/src/executor/request-builder.d.ts +15 -0
  51. package/dist/src/executor/request-builder.d.ts.map +1 -0
  52. package/dist/src/executor/request-builder.js +60 -0
  53. package/dist/src/executor/request-builder.js.map +1 -0
  54. package/dist/src/executor/response-mapper.d.ts +10 -0
  55. package/dist/src/executor/response-mapper.d.ts.map +1 -0
  56. package/dist/src/executor/response-mapper.js +54 -0
  57. package/dist/src/executor/response-mapper.js.map +1 -0
  58. package/dist/src/executor/types.d.ts +8 -0
  59. package/dist/src/executor/types.d.ts.map +1 -0
  60. package/dist/src/executor/types.js +2 -0
  61. package/dist/src/executor/types.js.map +1 -0
  62. package/dist/src/generator/index.d.ts +6 -0
  63. package/dist/src/generator/index.d.ts.map +1 -0
  64. package/dist/src/generator/index.js +4 -0
  65. package/dist/src/generator/index.js.map +1 -0
  66. package/dist/src/generator/param-builder.d.ts +17 -0
  67. package/dist/src/generator/param-builder.d.ts.map +1 -0
  68. package/dist/src/generator/param-builder.js +110 -0
  69. package/dist/src/generator/param-builder.js.map +1 -0
  70. package/dist/src/generator/tool-generator.d.ts +22 -0
  71. package/dist/src/generator/tool-generator.d.ts.map +1 -0
  72. package/dist/src/generator/tool-generator.js +66 -0
  73. package/dist/src/generator/tool-generator.js.map +1 -0
  74. package/dist/src/generator/tool-namer.d.ts +10 -0
  75. package/dist/src/generator/tool-namer.d.ts.map +1 -0
  76. package/dist/src/generator/tool-namer.js +44 -0
  77. package/dist/src/generator/tool-namer.js.map +1 -0
  78. package/dist/src/index.d.ts +7 -0
  79. package/dist/src/index.d.ts.map +1 -0
  80. package/dist/src/index.js +4 -0
  81. package/dist/src/index.js.map +1 -0
  82. package/dist/src/parser/index.d.ts +5 -0
  83. package/dist/src/parser/index.d.ts.map +1 -0
  84. package/dist/src/parser/index.js +4 -0
  85. package/dist/src/parser/index.js.map +1 -0
  86. package/dist/src/parser/openapi-parser.d.ts +3 -0
  87. package/dist/src/parser/openapi-parser.d.ts.map +1 -0
  88. package/dist/src/parser/openapi-parser.js +287 -0
  89. package/dist/src/parser/openapi-parser.js.map +1 -0
  90. package/dist/src/parser/schema-converter.d.ts +7 -0
  91. package/dist/src/parser/schema-converter.d.ts.map +1 -0
  92. package/dist/src/parser/schema-converter.js +86 -0
  93. package/dist/src/parser/schema-converter.js.map +1 -0
  94. package/dist/src/parser/spec-loader.d.ts +6 -0
  95. package/dist/src/parser/spec-loader.d.ts.map +1 -0
  96. package/dist/src/parser/spec-loader.js +53 -0
  97. package/dist/src/parser/spec-loader.js.map +1 -0
  98. package/dist/src/parser/types.d.ts +72 -0
  99. package/dist/src/parser/types.d.ts.map +1 -0
  100. package/dist/src/parser/types.js +2 -0
  101. package/dist/src/parser/types.js.map +1 -0
  102. package/dist/src/server.d.ts +9 -0
  103. package/dist/src/server.d.ts.map +1 -0
  104. package/dist/src/server.js +61 -0
  105. package/dist/src/server.js.map +1 -0
  106. package/dist/src/utils/errors.d.ts +19 -0
  107. package/dist/src/utils/errors.d.ts.map +1 -0
  108. package/dist/src/utils/errors.js +37 -0
  109. package/dist/src/utils/errors.js.map +1 -0
  110. package/dist/src/utils/logger.d.ts +8 -0
  111. package/dist/src/utils/logger.d.ts.map +1 -0
  112. package/dist/src/utils/logger.js +12 -0
  113. package/dist/src/utils/logger.js.map +1 -0
  114. package/package.json +54 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-converter.d.ts","sourceRoot":"","sources":["../../../src/parser/schema-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAoElF"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Convert OAS-specific schema extensions into pure JSON Schema
3
+ * that MCP tools can accept.
4
+ */
5
+ export function convertToJsonSchema(oasSchema) {
6
+ if (!oasSchema || typeof oasSchema !== "object") {
7
+ return { type: "string" };
8
+ }
9
+ const schema = {};
10
+ // Copy basic properties
11
+ if (oasSchema.type)
12
+ schema.type = String(oasSchema.type);
13
+ if (oasSchema.description)
14
+ schema.description = String(oasSchema.description);
15
+ if (oasSchema.format)
16
+ schema.format = String(oasSchema.format);
17
+ if (oasSchema.default !== undefined)
18
+ schema.default = oasSchema.default;
19
+ if (Array.isArray(oasSchema.enum))
20
+ schema.enum = oasSchema.enum;
21
+ // Handle nullable (OAS 3.0 extension)
22
+ if (oasSchema.nullable === true && schema.type) {
23
+ // JSON Schema doesn't have nullable, express as type array or leave as-is for MCP
24
+ }
25
+ // Handle properties (object type)
26
+ if (oasSchema.properties && typeof oasSchema.properties === "object") {
27
+ schema.type = "object";
28
+ schema.properties = {};
29
+ for (const [key, value] of Object.entries(oasSchema.properties)) {
30
+ if (value && typeof value === "object") {
31
+ schema.properties[key] = convertToJsonSchema(value);
32
+ }
33
+ }
34
+ }
35
+ // Handle required
36
+ if (Array.isArray(oasSchema.required)) {
37
+ schema.required = oasSchema.required.filter((r) => typeof r === "string");
38
+ }
39
+ // Handle items (array type)
40
+ if (oasSchema.items && typeof oasSchema.items === "object") {
41
+ schema.type = "array";
42
+ schema.items = convertToJsonSchema(oasSchema.items);
43
+ }
44
+ // Handle allOf — merge into single schema
45
+ if (Array.isArray(oasSchema.allOf)) {
46
+ return mergeAllOf(oasSchema.allOf);
47
+ }
48
+ // Handle oneOf/anyOf — pick first as best effort
49
+ if (Array.isArray(oasSchema.oneOf) && oasSchema.oneOf.length > 0) {
50
+ const first = oasSchema.oneOf[0];
51
+ if (first && typeof first === "object") {
52
+ return convertToJsonSchema(first);
53
+ }
54
+ }
55
+ if (Array.isArray(oasSchema.anyOf) && oasSchema.anyOf.length > 0) {
56
+ const first = oasSchema.anyOf[0];
57
+ if (first && typeof first === "object") {
58
+ return convertToJsonSchema(first);
59
+ }
60
+ }
61
+ // Default to string if no type detected
62
+ if (!schema.type && !schema.properties && !schema.items) {
63
+ schema.type = "string";
64
+ }
65
+ return schema;
66
+ }
67
+ function mergeAllOf(schemas) {
68
+ const merged = { type: "object", properties: {}, required: [] };
69
+ for (const sub of schemas) {
70
+ const converted = convertToJsonSchema(sub);
71
+ if (converted.properties) {
72
+ Object.assign(merged.properties, converted.properties);
73
+ }
74
+ if (converted.required) {
75
+ merged.required.push(...converted.required);
76
+ }
77
+ if (converted.description && !merged.description) {
78
+ merged.description = converted.description;
79
+ }
80
+ }
81
+ if (merged.required.length === 0) {
82
+ delete merged.required;
83
+ }
84
+ return merged;
85
+ }
86
+ //# sourceMappingURL=schema-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-converter.js","sourceRoot":"","sources":["../../../src/parser/schema-converter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface LoadedSpec {
2
+ content: string;
3
+ format: "json" | "yaml";
4
+ }
5
+ export declare function loadSpec(input: string): Promise<LoadedSpec>;
6
+ //# sourceMappingURL=spec-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-loader.d.ts","sourceRoot":"","sources":["../../../src/parser/spec-loader.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAeD,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAKjE"}
@@ -0,0 +1,53 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { SpecLoadError } from "../utils/errors.js";
3
+ import { logger } from "../utils/logger.js";
4
+ function isUrl(input) {
5
+ return input.startsWith("http://") || input.startsWith("https://");
6
+ }
7
+ function detectFormat(input, content) {
8
+ if (input.endsWith(".json"))
9
+ return "json";
10
+ if (input.endsWith(".yaml") || input.endsWith(".yml"))
11
+ return "yaml";
12
+ // Try to detect from content
13
+ const trimmed = content.trimStart();
14
+ if (trimmed.startsWith("{") || trimmed.startsWith("["))
15
+ return "json";
16
+ return "yaml";
17
+ }
18
+ export async function loadSpec(input) {
19
+ if (isUrl(input)) {
20
+ return loadFromUrl(input);
21
+ }
22
+ return loadFromFile(input);
23
+ }
24
+ async function loadFromUrl(url) {
25
+ logger.info(`Fetching spec from ${url}`);
26
+ try {
27
+ const response = await fetch(url, {
28
+ headers: { Accept: "application/json, application/yaml, text/yaml, */*" },
29
+ signal: AbortSignal.timeout(30_000),
30
+ });
31
+ if (!response.ok) {
32
+ throw new SpecLoadError(`Failed to fetch spec: ${response.status} ${response.statusText}`);
33
+ }
34
+ const content = await response.text();
35
+ return { content, format: detectFormat(url, content) };
36
+ }
37
+ catch (error) {
38
+ if (error instanceof SpecLoadError)
39
+ throw error;
40
+ throw new SpecLoadError(`Failed to fetch spec from ${url}: ${error instanceof Error ? error.message : String(error)}`);
41
+ }
42
+ }
43
+ async function loadFromFile(filePath) {
44
+ logger.info(`Reading spec from ${filePath}`);
45
+ try {
46
+ const content = await readFile(filePath, "utf-8");
47
+ return { content, format: detectFormat(filePath, content) };
48
+ }
49
+ catch (error) {
50
+ throw new SpecLoadError(`Failed to read spec file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
51
+ }
52
+ }
53
+ //# sourceMappingURL=spec-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-loader.js","sourceRoot":"","sources":["../../../src/parser/spec-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAO5C,SAAS,KAAK,CAAC,KAAa;IAC3B,OAAO,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,OAAe;IACnD,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3C,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACrE,6BAA6B;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACtE,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAa;IAC3C,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,CAAC,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACjC,OAAO,EAAE,EAAE,MAAM,EAAE,oDAAoD,EAAE;YACzE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,aAAa,CACtB,yBAAyB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CACjE,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,aAAa;YAAE,MAAM,KAAK,CAAC;QAChD,MAAM,IAAI,aAAa,CACtB,6BAA6B,GAAG,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC7F,CAAC;IACH,CAAC;AACF,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,CAAC,IAAI,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,aAAa,CACtB,4BAA4B,QAAQ,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACjG,CAAC;IACH,CAAC;AACF,CAAC"}
@@ -0,0 +1,72 @@
1
+ /** JSON Schema subset that MCP tools accept */
2
+ export type JsonSchema = {
3
+ type?: string;
4
+ properties?: Record<string, JsonSchema>;
5
+ required?: string[];
6
+ items?: JsonSchema;
7
+ description?: string;
8
+ enum?: unknown[];
9
+ default?: unknown;
10
+ format?: string;
11
+ [key: string]: unknown;
12
+ };
13
+ export interface NormalizedSpec {
14
+ info: {
15
+ title: string;
16
+ version: string;
17
+ description?: string;
18
+ };
19
+ servers: Array<{
20
+ url: string;
21
+ }>;
22
+ endpoints: NormalizedEndpoint[];
23
+ securitySchemes: Record<string, SecurityScheme>;
24
+ }
25
+ export interface NormalizedEndpoint {
26
+ method: "get" | "post" | "put" | "patch" | "delete" | "head" | "options";
27
+ path: string;
28
+ operationId: string;
29
+ summary?: string;
30
+ description?: string;
31
+ parameters: NormalizedParameter[];
32
+ requestBody?: NormalizedRequestBody;
33
+ responses: Record<string, NormalizedResponse>;
34
+ security?: SecurityRequirement[];
35
+ tags?: string[];
36
+ deprecated?: boolean;
37
+ }
38
+ export interface NormalizedParameter {
39
+ name: string;
40
+ in: "path" | "query" | "header" | "cookie";
41
+ required: boolean;
42
+ description?: string;
43
+ schema: JsonSchema;
44
+ }
45
+ export interface NormalizedRequestBody {
46
+ required: boolean;
47
+ description?: string;
48
+ contentType: string;
49
+ schema: JsonSchema;
50
+ }
51
+ export interface NormalizedResponse {
52
+ description?: string;
53
+ contentType?: string;
54
+ schema?: JsonSchema;
55
+ }
56
+ export type SecurityScheme = {
57
+ type: "apiKey";
58
+ name: string;
59
+ in: "header" | "query" | "cookie";
60
+ } | {
61
+ type: "http";
62
+ scheme: string;
63
+ bearerFormat?: string;
64
+ } | {
65
+ type: "oauth2";
66
+ flows: Record<string, {
67
+ tokenUrl?: string;
68
+ scopes: Record<string, string>;
69
+ }>;
70
+ };
71
+ export type SecurityRequirement = Record<string, string[]>;
72
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/parser/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/parser/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { McpOpenApiConfig } from "./config/types.js";
3
+ export declare function createServer(config: McpOpenApiConfig): Promise<{
4
+ server: McpServer;
5
+ tools: import("./index.js").GeneratedTool[];
6
+ spec: import("./index.js").NormalizedSpec;
7
+ }>;
8
+ export declare function startServer(config: McpOpenApiConfig): Promise<void>;
9
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAS1D,wBAAsB,YAAY,CAAC,MAAM,EAAE,gBAAgB;;;;GAiE1D;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,gBAAgB,iBAOzD"}
@@ -0,0 +1,61 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { createAuthProvider } from "./auth/index.js";
4
+ import { DEFAULT_CONFIG } from "./config/types.js";
5
+ import { buildRequest } from "./executor/request-builder.js";
6
+ import { executeRequest } from "./executor/http-client.js";
7
+ import { mapResponse } from "./executor/response-mapper.js";
8
+ import { generateTools } from "./generator/tool-generator.js";
9
+ import { parseSpec } from "./parser/openapi-parser.js";
10
+ import { logger } from "./utils/logger.js";
11
+ export async function createServer(config) {
12
+ const mergedConfig = { ...DEFAULT_CONFIG, ...config };
13
+ // Parse the OpenAPI spec
14
+ const spec = await parseSpec(config.spec);
15
+ // Generate MCP tools
16
+ const tools = generateTools(spec, {
17
+ baseUrl: mergedConfig.baseUrl,
18
+ prefix: mergedConfig.prefix,
19
+ include: mergedConfig.include,
20
+ exclude: mergedConfig.exclude,
21
+ });
22
+ if (tools.length === 0) {
23
+ logger.warn("No tools generated from the spec. Check your include/exclude filters.");
24
+ }
25
+ // Create auth provider
26
+ const authProvider = createAuthProvider(mergedConfig.auth);
27
+ // Create MCP server
28
+ const server = new McpServer({
29
+ name: `mcp-openapi: ${spec.info.title}`,
30
+ version: spec.info.version,
31
+ });
32
+ // Register each tool
33
+ for (const tool of tools) {
34
+ server.tool(tool.name, tool.description, tool.inputSchema.properties
35
+ ? tool.inputSchema
36
+ : { properties: {} }, async (args) => {
37
+ // Build HTTP request from tool call args
38
+ let request = buildRequest(args, tool.endpointRef, mergedConfig.headers);
39
+ // Apply auth
40
+ if (authProvider) {
41
+ request = await authProvider.apply(request);
42
+ }
43
+ // Execute HTTP request
44
+ const response = await executeRequest(request, {
45
+ timeout: mergedConfig.timeout,
46
+ maxRetries: mergedConfig.maxRetries,
47
+ });
48
+ // Map to MCP result
49
+ return mapResponse(response);
50
+ });
51
+ }
52
+ logger.info(`Registered ${tools.length} tools from ${spec.info.title} v${spec.info.version}`);
53
+ return { server, tools, spec };
54
+ }
55
+ export async function startServer(config) {
56
+ const { server } = await createServer(config);
57
+ const transport = new StdioServerTransport();
58
+ await server.connect(transport);
59
+ logger.info("MCP server running on stdio");
60
+ }
61
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export declare class McpOpenApiError extends Error {
2
+ readonly code: string;
3
+ constructor(message: string, code: string);
4
+ }
5
+ export declare class SpecLoadError extends McpOpenApiError {
6
+ constructor(message: string);
7
+ }
8
+ export declare class SpecParseError extends McpOpenApiError {
9
+ constructor(message: string);
10
+ }
11
+ export declare class AuthError extends McpOpenApiError {
12
+ constructor(message: string);
13
+ }
14
+ export declare class HttpRequestError extends McpOpenApiError {
15
+ readonly statusCode?: number | undefined;
16
+ readonly responseBody?: string | undefined;
17
+ constructor(message: string, statusCode?: number | undefined, responseBody?: string | undefined);
18
+ }
19
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;aAGxB,IAAI,EAAE,MAAM;gBAD5B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM;CAK7B;AAED,qBAAa,aAAc,SAAQ,eAAe;gBACrC,OAAO,EAAE,MAAM;CAI3B;AAED,qBAAa,cAAe,SAAQ,eAAe;gBACtC,OAAO,EAAE,MAAM;CAI3B;AAED,qBAAa,SAAU,SAAQ,eAAe;gBACjC,OAAO,EAAE,MAAM;CAI3B;AAED,qBAAa,gBAAiB,SAAQ,eAAe;aAGnC,UAAU,CAAC,EAAE,MAAM;aACnB,YAAY,CAAC,EAAE,MAAM;gBAFrC,OAAO,EAAE,MAAM,EACC,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,YAAY,CAAC,EAAE,MAAM,YAAA;CAKtC"}
@@ -0,0 +1,37 @@
1
+ export class McpOpenApiError extends Error {
2
+ code;
3
+ constructor(message, code) {
4
+ super(message);
5
+ this.code = code;
6
+ this.name = "McpOpenApiError";
7
+ }
8
+ }
9
+ export class SpecLoadError extends McpOpenApiError {
10
+ constructor(message) {
11
+ super(message, "SPEC_LOAD_ERROR");
12
+ this.name = "SpecLoadError";
13
+ }
14
+ }
15
+ export class SpecParseError extends McpOpenApiError {
16
+ constructor(message) {
17
+ super(message, "SPEC_PARSE_ERROR");
18
+ this.name = "SpecParseError";
19
+ }
20
+ }
21
+ export class AuthError extends McpOpenApiError {
22
+ constructor(message) {
23
+ super(message, "AUTH_ERROR");
24
+ this.name = "AuthError";
25
+ }
26
+ }
27
+ export class HttpRequestError extends McpOpenApiError {
28
+ statusCode;
29
+ responseBody;
30
+ constructor(message, statusCode, responseBody) {
31
+ super(message, "HTTP_REQUEST_ERROR");
32
+ this.statusCode = statusCode;
33
+ this.responseBody = responseBody;
34
+ this.name = "HttpRequestError";
35
+ }
36
+ }
37
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAGxB;IAFjB,YACC,OAAe,EACC,IAAY;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,SAAI,GAAJ,IAAI,CAAQ;QAG5B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAC/B,CAAC;CACD;AAED,MAAM,OAAO,aAAc,SAAQ,eAAe;IACjD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC7B,CAAC;CACD;AAED,MAAM,OAAO,cAAe,SAAQ,eAAe;IAClD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC9B,CAAC;CACD;AAED,MAAM,OAAO,SAAU,SAAQ,eAAe;IAC7C,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IACzB,CAAC;CACD;AAED,MAAM,OAAO,gBAAiB,SAAQ,eAAe;IAGnC;IACA;IAHjB,YACC,OAAe,EACC,UAAmB,EACnB,YAAqB;QAErC,KAAK,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QAHrB,eAAU,GAAV,UAAU,CAAS;QACnB,iBAAY,GAAZ,YAAY,CAAS;QAGrC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IAChC,CAAC;CACD"}
@@ -0,0 +1,8 @@
1
+ /** Logs to stderr only — stdout is reserved for MCP stdio transport */
2
+ export declare const logger: {
3
+ info: (msg: string, ...args: unknown[]) => void;
4
+ warn: (msg: string, ...args: unknown[]) => void;
5
+ error: (msg: string, ...args: unknown[]) => void;
6
+ debug: (msg: string, ...args: unknown[]) => void;
7
+ };
8
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,MAAM;gBACN,MAAM,WAAW,OAAO,EAAE;gBAE1B,MAAM,WAAW,OAAO,EAAE;iBAEzB,MAAM,WAAW,OAAO,EAAE;iBAE1B,MAAM,WAAW,OAAO,EAAE;CAKvC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /** Logs to stderr only — stdout is reserved for MCP stdio transport */
2
+ export const logger = {
3
+ info: (msg, ...args) => console.error(`[mcp-openapi] ${msg}`, ...args),
4
+ warn: (msg, ...args) => console.error(`[mcp-openapi] WARN: ${msg}`, ...args),
5
+ error: (msg, ...args) => console.error(`[mcp-openapi] ERROR: ${msg}`, ...args),
6
+ debug: (msg, ...args) => {
7
+ if (process.env.DEBUG) {
8
+ console.error(`[mcp-openapi] DEBUG: ${msg}`, ...args);
9
+ }
10
+ },
11
+ };
12
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,IAAI,EAAE,CAAC,GAAW,EAAE,GAAG,IAAe,EAAE,EAAE,CACzC,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;IAC/C,IAAI,EAAE,CAAC,GAAW,EAAE,GAAG,IAAe,EAAE,EAAE,CACzC,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;IACrD,KAAK,EAAE,CAAC,GAAW,EAAE,GAAG,IAAe,EAAE,EAAE,CAC1C,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;IACtD,KAAK,EAAE,CAAC,GAAW,EAAE,GAAG,IAAe,EAAE,EAAE;QAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;CACD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "mcp-openapi",
3
+ "version": "0.1.0",
4
+ "description": "LLM-aware OpenAPI/Swagger to MCP tools converter. Point at any API spec, get instant MCP tools.",
5
+ "type": "module",
6
+ "bin": {
7
+ "mcp-openapi": "./dist/bin/mcp-openapi.js"
8
+ },
9
+ "exports": {
10
+ ".": "./dist/src/index.js"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "README.md"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "dev": "tsc --watch",
19
+ "test": "vitest run",
20
+ "test:watch": "vitest",
21
+ "lint": "biome check .",
22
+ "prepublishOnly": "pnpm build"
23
+ },
24
+ "dependencies": {
25
+ "@modelcontextprotocol/sdk": "^1.12.0",
26
+ "@apidevtools/swagger-parser": "^10.1.0",
27
+ "yaml": "^2.6.0",
28
+ "openapi-types": "^12.1.3"
29
+ },
30
+ "devDependencies": {
31
+ "typescript": "^5.7.0",
32
+ "vitest": "^3.0.0",
33
+ "@types/node": "^22.0.0"
34
+ },
35
+ "engines": {
36
+ "node": ">=18.0.0"
37
+ },
38
+ "keywords": [
39
+ "mcp",
40
+ "openapi",
41
+ "swagger",
42
+ "model-context-protocol",
43
+ "ai",
44
+ "llm",
45
+ "api",
46
+ "tools"
47
+ ],
48
+ "license": "MIT",
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "https://github.com/Docat0209/auto-revenue",
52
+ "directory": "packages/mcp-servers/openapi"
53
+ }
54
+ }