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,110 @@
1
+ /**
2
+ * Flatten path, query, header, and body parameters into a single
3
+ * MCP tool inputSchema. Handles name collisions with prefixing.
4
+ */
5
+ export function buildParams(endpoint) {
6
+ const properties = {};
7
+ const required = [];
8
+ const parameterMap = [];
9
+ const usedNames = new Set();
10
+ // Path params first (highest priority, always required)
11
+ for (const param of endpoint.parameters.filter((p) => p.in === "path")) {
12
+ const name = ensureUnique(param.name, usedNames);
13
+ properties[name] = { ...param.schema, description: param.description ?? param.schema.description };
14
+ required.push(name);
15
+ parameterMap.push({
16
+ toolParamName: name,
17
+ source: "path",
18
+ originalName: param.name,
19
+ required: true,
20
+ });
21
+ }
22
+ // Query params
23
+ for (const param of endpoint.parameters.filter((p) => p.in === "query")) {
24
+ const name = ensureUnique(param.name, usedNames, "query");
25
+ properties[name] = { ...param.schema, description: param.description ?? param.schema.description };
26
+ if (param.required)
27
+ required.push(name);
28
+ parameterMap.push({
29
+ toolParamName: name,
30
+ source: "query",
31
+ originalName: param.name,
32
+ required: param.required,
33
+ });
34
+ }
35
+ // Header params (skip standard headers)
36
+ const skipHeaders = new Set(["content-type", "accept", "authorization"]);
37
+ for (const param of endpoint.parameters.filter((p) => p.in === "header" && !skipHeaders.has(p.name.toLowerCase()))) {
38
+ const name = ensureUnique(param.name, usedNames, "header");
39
+ properties[name] = { ...param.schema, description: param.description ?? param.schema.description };
40
+ if (param.required)
41
+ required.push(name);
42
+ parameterMap.push({
43
+ toolParamName: name,
44
+ source: "header",
45
+ originalName: param.name,
46
+ required: param.required,
47
+ });
48
+ }
49
+ // Request body
50
+ if (endpoint.requestBody?.schema) {
51
+ const bodySchema = endpoint.requestBody.schema;
52
+ // If body has properties, flatten them into the top level
53
+ if (bodySchema.properties && Object.keys(bodySchema.properties).length <= 15) {
54
+ for (const [propName, propSchema] of Object.entries(bodySchema.properties)) {
55
+ const name = ensureUnique(propName, usedNames, "body");
56
+ properties[name] = propSchema;
57
+ parameterMap.push({
58
+ toolParamName: name,
59
+ source: "body",
60
+ originalName: propName,
61
+ required: bodySchema.required?.includes(propName) ?? false,
62
+ });
63
+ if (endpoint.requestBody.required &&
64
+ bodySchema.required?.includes(propName)) {
65
+ required.push(name);
66
+ }
67
+ }
68
+ }
69
+ else {
70
+ // Complex body: nest under "body" property
71
+ const name = ensureUnique("body", usedNames);
72
+ properties[name] = {
73
+ ...bodySchema,
74
+ description: endpoint.requestBody.description ?? bodySchema.description,
75
+ };
76
+ if (endpoint.requestBody.required)
77
+ required.push(name);
78
+ parameterMap.push({
79
+ toolParamName: name,
80
+ source: "body",
81
+ originalName: "body",
82
+ required: endpoint.requestBody.required,
83
+ });
84
+ }
85
+ }
86
+ const inputSchema = {
87
+ type: "object",
88
+ properties,
89
+ };
90
+ if (required.length > 0) {
91
+ inputSchema.required = required;
92
+ }
93
+ return { inputSchema, parameterMap };
94
+ }
95
+ function ensureUnique(name, used, prefixOnCollision) {
96
+ let candidate = name;
97
+ if (used.has(candidate) && prefixOnCollision) {
98
+ candidate = `${prefixOnCollision}_${name}`;
99
+ }
100
+ // Final collision fallback
101
+ let suffix = 2;
102
+ const base = candidate;
103
+ while (used.has(candidate)) {
104
+ candidate = `${base}_${suffix}`;
105
+ suffix++;
106
+ }
107
+ used.add(candidate);
108
+ return candidate;
109
+ }
110
+ //# sourceMappingURL=param-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param-builder.js","sourceRoot":"","sources":["../../../src/generator/param-builder.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAA4B;IACvD,MAAM,UAAU,GAA+B,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,YAAY,GAAuB,EAAE,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,wDAAwD;IACxD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACjD,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACnG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,YAAY,CAAC,IAAI,CAAC;YACjB,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,MAAM;YACd,YAAY,EAAE,KAAK,CAAC,IAAI;YACxB,QAAQ,EAAE,IAAI;SACd,CAAC,CAAC;IACJ,CAAC;IAED,eAAe;IACf,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC1D,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACnG,IAAI,KAAK,CAAC,QAAQ;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,YAAY,CAAC,IAAI,CAAC;YACjB,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,OAAO;YACf,YAAY,EAAE,KAAK,CAAC,IAAI;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACxB,CAAC,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;IACzE,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAClE,EAAE,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC3D,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACnG,IAAI,KAAK,CAAC,QAAQ;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,YAAY,CAAC,IAAI,CAAC;YACjB,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,QAAQ;YAChB,YAAY,EAAE,KAAK,CAAC,IAAI;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACxB,CAAC,CAAC;IACJ,CAAC;IAED,eAAe;IACf,IAAI,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;QAE/C,0DAA0D;QAC1D,IAAI,UAAU,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YAC9E,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5E,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;gBACvD,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;gBAC9B,YAAY,CAAC,IAAI,CAAC;oBACjB,aAAa,EAAE,IAAI;oBACnB,MAAM,EAAE,MAAM;oBACd,YAAY,EAAE,QAAQ;oBACtB,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK;iBAC1D,CAAC,CAAC;gBACH,IACC,QAAQ,CAAC,WAAW,CAAC,QAAQ;oBAC7B,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EACtC,CAAC;oBACF,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrB,CAAC;YACF,CAAC;QACF,CAAC;aAAM,CAAC;YACP,2CAA2C;YAC3C,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC7C,UAAU,CAAC,IAAI,CAAC,GAAG;gBAClB,GAAG,UAAU;gBACb,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW;aACvE,CAAC;YACF,IAAI,QAAQ,CAAC,WAAW,CAAC,QAAQ;gBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,YAAY,CAAC,IAAI,CAAC;gBACjB,aAAa,EAAE,IAAI;gBACnB,MAAM,EAAE,MAAM;gBACd,YAAY,EAAE,MAAM;gBACpB,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,QAAQ;aACvC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,MAAM,WAAW,GAAe;QAC/B,IAAI,EAAE,QAAQ;QACd,UAAU;KACV,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACjC,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,YAAY,CACpB,IAAY,EACZ,IAAiB,EACjB,iBAA0B;IAE1B,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,iBAAiB,EAAE,CAAC;QAC9C,SAAS,GAAG,GAAG,iBAAiB,IAAI,IAAI,EAAE,CAAC;IAC5C,CAAC;IACD,2BAA2B;IAC3B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,IAAI,GAAG,SAAS,CAAC;IACvB,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,SAAS,GAAG,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC;QAChC,MAAM,EAAE,CAAC;IACV,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpB,OAAO,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { JsonSchema, NormalizedSpec } from "../parser/types.js";
2
+ import type { ParameterMapping } from "./param-builder.js";
3
+ export interface GeneratedTool {
4
+ name: string;
5
+ description: string;
6
+ inputSchema: JsonSchema;
7
+ endpointRef: {
8
+ method: string;
9
+ path: string;
10
+ baseUrl: string;
11
+ contentType: string;
12
+ parameterMap: ParameterMapping[];
13
+ };
14
+ }
15
+ export interface GenerateOptions {
16
+ baseUrl?: string;
17
+ prefix?: string;
18
+ include?: string[];
19
+ exclude?: string[];
20
+ }
21
+ export declare function generateTools(spec: NormalizedSpec, options?: GenerateOptions): GeneratedTool[];
22
+ //# sourceMappingURL=tool-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-generator.d.ts","sourceRoot":"","sources":["../../../src/generator/tool-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAsB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAI3D,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,WAAW,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,gBAAgB,EAAE,CAAC;KACjC,CAAC;CACF;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,aAAa,CAC5B,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE,eAAoB,GAC3B,aAAa,EAAE,CAyDjB"}
@@ -0,0 +1,66 @@
1
+ import { logger } from "../utils/logger.js";
2
+ import { buildParams } from "./param-builder.js";
3
+ import { generateToolName, resolveCollisions } from "./tool-namer.js";
4
+ export function generateTools(spec, options = {}) {
5
+ const baseUrl = options.baseUrl ?? spec.servers[0]?.url ?? "http://localhost";
6
+ let endpoints = spec.endpoints;
7
+ // Apply include filter
8
+ if (options.include?.length) {
9
+ const patterns = options.include;
10
+ endpoints = endpoints.filter((ep) => patterns.some((p) => matchPattern(ep.operationId, p)) ||
11
+ patterns.some((p) => matchPattern(ep.path, p)));
12
+ }
13
+ // Apply exclude filter
14
+ if (options.exclude?.length) {
15
+ const patterns = options.exclude;
16
+ endpoints = endpoints.filter((ep) => !patterns.some((p) => matchPattern(ep.operationId, p)) &&
17
+ !patterns.some((p) => matchPattern(ep.path, p)));
18
+ }
19
+ // Generate raw names
20
+ const rawNames = endpoints.map((ep) => generateToolName(ep.operationId, ep.method, ep.path, options.prefix));
21
+ // Resolve collisions
22
+ const names = resolveCollisions(rawNames);
23
+ // Build tools
24
+ const tools = endpoints.map((endpoint, i) => {
25
+ const { inputSchema, parameterMap } = buildParams(endpoint);
26
+ const description = buildDescription(endpoint);
27
+ return {
28
+ name: names[i],
29
+ description,
30
+ inputSchema,
31
+ endpointRef: {
32
+ method: endpoint.method.toUpperCase(),
33
+ path: endpoint.path,
34
+ baseUrl: baseUrl.replace(/\/$/, ""),
35
+ contentType: endpoint.requestBody?.contentType ?? "application/json",
36
+ parameterMap,
37
+ },
38
+ };
39
+ });
40
+ logger.info(`Generated ${tools.length} MCP tools from ${spec.info.title}`);
41
+ return tools;
42
+ }
43
+ function buildDescription(endpoint) {
44
+ const parts = [];
45
+ if (endpoint.summary) {
46
+ parts.push(endpoint.summary);
47
+ }
48
+ else if (endpoint.description) {
49
+ // Use first sentence of description
50
+ const firstSentence = endpoint.description.split(/\.\s/)[0];
51
+ parts.push(firstSentence.length < 200 ? firstSentence : firstSentence.slice(0, 200));
52
+ }
53
+ parts.push(`[${endpoint.method.toUpperCase()} ${endpoint.path}]`);
54
+ if (endpoint.deprecated) {
55
+ parts.push("(DEPRECATED)");
56
+ }
57
+ return parts.join(" ");
58
+ }
59
+ function matchPattern(value, pattern) {
60
+ if (pattern.includes("*")) {
61
+ const regex = new RegExp(`^${pattern.replace(/\*/g, ".*").replace(/\//g, "\\/")}$`);
62
+ return regex.test(value);
63
+ }
64
+ return value === pattern;
65
+ }
66
+ //# sourceMappingURL=tool-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-generator.js","sourceRoot":"","sources":["../../../src/generator/tool-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Generate a deterministic MCP tool name from an endpoint.
3
+ * Priority: operationId → method + path segments
4
+ */
5
+ export declare function generateToolName(operationId: string, method: string, path: string, prefix?: string): string;
6
+ /**
7
+ * Resolve naming collisions by appending _2, _3, etc.
8
+ */
9
+ export declare function resolveCollisions(names: string[]): string[];
10
+ //# sourceMappingURL=tool-namer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-namer.d.ts","sourceRoot":"","sources":["../../../src/generator/tool-namer.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACb,MAAM,CAYR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAQ3D"}
@@ -0,0 +1,44 @@
1
+ const MAX_TOOL_NAME_LENGTH = 64;
2
+ /**
3
+ * Generate a deterministic MCP tool name from an endpoint.
4
+ * Priority: operationId → method + path segments
5
+ */
6
+ export function generateToolName(operationId, method, path, prefix) {
7
+ let name = sanitizeOperationId(operationId);
8
+ if (prefix) {
9
+ name = `${sanitize(prefix)}_${name}`;
10
+ }
11
+ if (name.length > MAX_TOOL_NAME_LENGTH) {
12
+ name = name.slice(0, MAX_TOOL_NAME_LENGTH);
13
+ }
14
+ return name;
15
+ }
16
+ /**
17
+ * Resolve naming collisions by appending _2, _3, etc.
18
+ */
19
+ export function resolveCollisions(names) {
20
+ const seen = new Map();
21
+ return names.map((name) => {
22
+ const count = seen.get(name) ?? 0;
23
+ seen.set(name, count + 1);
24
+ if (count === 0)
25
+ return name;
26
+ return `${name}_${count + 1}`.slice(0, MAX_TOOL_NAME_LENGTH);
27
+ });
28
+ }
29
+ function sanitizeOperationId(id) {
30
+ return id
31
+ .replace(/([a-z])([A-Z])/g, "$1_$2") // camelCase → snake_case
32
+ .replace(/[^a-zA-Z0-9_]/g, "_") // non-alphanumeric → underscore
33
+ .replace(/_+/g, "_") // collapse multiple underscores
34
+ .replace(/^_|_$/g, "") // trim leading/trailing underscores
35
+ .toLowerCase();
36
+ }
37
+ function sanitize(input) {
38
+ return input
39
+ .replace(/[^a-zA-Z0-9_]/g, "_")
40
+ .replace(/_+/g, "_")
41
+ .replace(/^_|_$/g, "")
42
+ .toLowerCase();
43
+ }
44
+ //# sourceMappingURL=tool-namer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-namer.js","sourceRoot":"","sources":["../../../src/generator/tool-namer.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC/B,WAAmB,EACnB,MAAc,EACd,IAAY,EACZ,MAAe;IAEf,IAAI,IAAI,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,MAAM,EAAE,CAAC;QACZ,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;QACxC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAe;IAChD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC1B,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7B,OAAO,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAU;IACtC,OAAO,EAAE;SACP,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,yBAAyB;SAC7D,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,gCAAgC;SAC/D,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,gCAAgC;SACpD,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,oCAAoC;SAC1D,WAAW,EAAE,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC9B,OAAO,KAAK;SACV,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,WAAW,EAAE,CAAC;AACjB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { createServer, startServer } from "./server.js";
2
+ export type { McpOpenApiConfig, AuthConfig } from "./config/types.js";
3
+ export { generateTools } from "./generator/tool-generator.js";
4
+ export type { GeneratedTool } from "./generator/tool-generator.js";
5
+ export { parseSpec } from "./parser/openapi-parser.js";
6
+ export type { NormalizedSpec } from "./parser/types.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createServer, startServer } from "./server.js";
2
+ export { generateTools } from "./generator/tool-generator.js";
3
+ export { parseSpec } from "./parser/openapi-parser.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { parseSpec } from "./openapi-parser.js";
2
+ export { loadSpec } from "./spec-loader.js";
3
+ export { convertToJsonSchema } from "./schema-converter.js";
4
+ export type { NormalizedSpec, NormalizedEndpoint, NormalizedParameter, NormalizedRequestBody, NormalizedResponse, JsonSchema, SecurityScheme, SecurityRequirement, } from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/parser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EACX,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,mBAAmB,GACnB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { parseSpec } from "./openapi-parser.js";
2
+ export { loadSpec } from "./spec-loader.js";
3
+ export { convertToJsonSchema } from "./schema-converter.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { NormalizedSpec } from "./types.js";
2
+ export declare function parseSpec(specInput: string): Promise<NormalizedSpec>;
3
+ //# sourceMappingURL=openapi-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-parser.d.ts","sourceRoot":"","sources":["../../../src/parser/openapi-parser.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAKX,cAAc,EAEd,MAAM,YAAY,CAAC;AAYpB,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAY1E"}
@@ -0,0 +1,287 @@
1
+ import SwaggerParser from "@apidevtools/swagger-parser";
2
+ import { SpecParseError } from "../utils/errors.js";
3
+ import { logger } from "../utils/logger.js";
4
+ import { convertToJsonSchema } from "./schema-converter.js";
5
+ const HTTP_METHODS = [
6
+ "get",
7
+ "post",
8
+ "put",
9
+ "patch",
10
+ "delete",
11
+ "head",
12
+ "options",
13
+ ];
14
+ export async function parseSpec(specInput) {
15
+ try {
16
+ const api = await SwaggerParser.dereference(specInput);
17
+ if (isSwagger2(api)) {
18
+ return normalizeV2(api);
19
+ }
20
+ return normalizeV3(api);
21
+ }
22
+ catch (error) {
23
+ throw new SpecParseError(`Failed to parse OpenAPI spec: ${error instanceof Error ? error.message : String(error)}`);
24
+ }
25
+ }
26
+ function isSwagger2(api) {
27
+ return "swagger" in api && api.swagger === "2.0";
28
+ }
29
+ function normalizeV3(doc) {
30
+ const endpoints = [];
31
+ const paths = doc.paths ?? {};
32
+ for (const [path, pathItem] of Object.entries(paths)) {
33
+ if (!pathItem)
34
+ continue;
35
+ // Path-level parameters
36
+ const pathParams = pathItem.parameters?.map(normalizeV3Parameter) ?? [];
37
+ for (const method of HTTP_METHODS) {
38
+ const operation = pathItem[method];
39
+ if (!operation)
40
+ continue;
41
+ const opParams = operation.parameters?.map(normalizeV3Parameter) ?? [];
42
+ // Merge path-level and operation-level params (operation takes precedence)
43
+ const mergedParams = mergeParameters(pathParams, opParams);
44
+ const endpoint = {
45
+ method,
46
+ path,
47
+ operationId: operation.operationId ?? generateOperationId(method, path),
48
+ summary: operation.summary,
49
+ description: operation.description,
50
+ parameters: mergedParams,
51
+ requestBody: normalizeV3RequestBody(operation.requestBody),
52
+ responses: normalizeV3Responses((operation.responses ?? {})),
53
+ tags: operation.tags,
54
+ deprecated: operation.deprecated,
55
+ };
56
+ endpoints.push(endpoint);
57
+ }
58
+ }
59
+ logger.info(`Parsed ${endpoints.length} endpoints from ${doc.info.title} v${doc.info.version}`);
60
+ return {
61
+ info: {
62
+ title: doc.info.title,
63
+ version: doc.info.version,
64
+ description: doc.info.description,
65
+ },
66
+ servers: doc.servers?.map((s) => ({ url: s.url })) ?? [
67
+ { url: "http://localhost" },
68
+ ],
69
+ endpoints,
70
+ securitySchemes: normalizeV3SecuritySchemes(doc),
71
+ };
72
+ }
73
+ function normalizeV2(doc) {
74
+ const baseUrl = `${doc.schemes?.[0] ?? "https"}://${doc.host ?? "localhost"}${doc.basePath ?? ""}`;
75
+ const endpoints = [];
76
+ const paths = doc.paths ?? {};
77
+ for (const [path, pathItem] of Object.entries(paths)) {
78
+ if (!pathItem)
79
+ continue;
80
+ const pathParams = pathItem.parameters
81
+ ?.map(normalizeV2Parameter) ?? [];
82
+ for (const method of HTTP_METHODS) {
83
+ const operation = pathItem[method];
84
+ if (!operation)
85
+ continue;
86
+ const opParams = operation.parameters
87
+ ?.filter((p) => p.in !== "body")
88
+ .map(normalizeV2Parameter) ?? [];
89
+ const mergedParams = mergeParameters(pathParams, opParams);
90
+ // Extract body parameter (Swagger 2.0 specific)
91
+ const bodyParam = operation.parameters
92
+ ?.find((p) => p.in === "body");
93
+ const endpoint = {
94
+ method,
95
+ path,
96
+ operationId: operation.operationId ?? generateOperationId(method, path),
97
+ summary: operation.summary,
98
+ description: operation.description,
99
+ parameters: mergedParams,
100
+ requestBody: bodyParam
101
+ ? {
102
+ required: bodyParam.required ?? false,
103
+ description: bodyParam.description,
104
+ contentType: operation.consumes?.[0] ?? "application/json",
105
+ schema: convertToJsonSchema(bodyParam.schema),
106
+ }
107
+ : undefined,
108
+ responses: normalizeV2Responses((operation.responses ?? {})),
109
+ tags: operation.tags,
110
+ deprecated: operation.deprecated,
111
+ };
112
+ endpoints.push(endpoint);
113
+ }
114
+ }
115
+ logger.info(`Parsed ${endpoints.length} endpoints from ${doc.info.title} v${doc.info.version} (Swagger 2.0)`);
116
+ return {
117
+ info: {
118
+ title: doc.info.title,
119
+ version: doc.info.version,
120
+ description: doc.info.description,
121
+ },
122
+ servers: [{ url: baseUrl }],
123
+ endpoints,
124
+ securitySchemes: normalizeV2SecuritySchemes(doc),
125
+ };
126
+ }
127
+ function normalizeV3Parameter(param) {
128
+ return {
129
+ name: param.name,
130
+ in: param.in,
131
+ required: param.required ?? param.in === "path",
132
+ description: param.description,
133
+ schema: convertToJsonSchema(param.schema ?? { type: "string" }),
134
+ };
135
+ }
136
+ function normalizeV2Parameter(param) {
137
+ const general = param;
138
+ return {
139
+ name: general.name,
140
+ in: general.in,
141
+ required: general.required ?? general.in === "path",
142
+ description: general.description,
143
+ schema: convertToJsonSchema({
144
+ type: general.type,
145
+ format: general.format,
146
+ enum: general.enum,
147
+ default: general.default,
148
+ description: general.description,
149
+ }),
150
+ };
151
+ }
152
+ function normalizeV3RequestBody(body) {
153
+ if (!body?.content)
154
+ return undefined;
155
+ // Prefer application/json
156
+ const jsonContent = body.content["application/json"];
157
+ if (jsonContent?.schema) {
158
+ return {
159
+ required: body.required ?? false,
160
+ description: body.description,
161
+ contentType: "application/json",
162
+ schema: convertToJsonSchema(jsonContent.schema),
163
+ };
164
+ }
165
+ // Fallback to first content type
166
+ const [contentType, mediaType] = Object.entries(body.content)[0] ?? [];
167
+ if (contentType && mediaType?.schema) {
168
+ return {
169
+ required: body.required ?? false,
170
+ description: body.description,
171
+ contentType,
172
+ schema: convertToJsonSchema(mediaType.schema),
173
+ };
174
+ }
175
+ return undefined;
176
+ }
177
+ function normalizeV3Responses(responses) {
178
+ const result = {};
179
+ for (const [code, response] of Object.entries(responses)) {
180
+ const resp = response;
181
+ const jsonContent = resp.content?.["application/json"];
182
+ result[code] = {
183
+ description: resp.description,
184
+ contentType: jsonContent ? "application/json" : undefined,
185
+ schema: jsonContent?.schema
186
+ ? convertToJsonSchema(jsonContent.schema)
187
+ : undefined,
188
+ };
189
+ }
190
+ return result;
191
+ }
192
+ function normalizeV2Responses(responses) {
193
+ const result = {};
194
+ for (const [code, response] of Object.entries(responses)) {
195
+ result[code] = {
196
+ description: response.description,
197
+ schema: response.schema
198
+ ? convertToJsonSchema(response.schema)
199
+ : undefined,
200
+ };
201
+ }
202
+ return result;
203
+ }
204
+ function normalizeV3SecuritySchemes(doc) {
205
+ const schemes = {};
206
+ const components = doc.components?.securitySchemes ?? {};
207
+ for (const [name, scheme] of Object.entries(components)) {
208
+ const s = scheme;
209
+ if (s.type === "apiKey") {
210
+ schemes[name] = {
211
+ type: "apiKey",
212
+ name: s.name,
213
+ in: s.in,
214
+ };
215
+ }
216
+ else if (s.type === "http") {
217
+ schemes[name] = { type: "http", scheme: s.scheme, bearerFormat: s.bearerFormat };
218
+ }
219
+ else if (s.type === "oauth2") {
220
+ const flows = {};
221
+ if (s.flows) {
222
+ for (const [flowName, flow] of Object.entries(s.flows)) {
223
+ if (flow) {
224
+ flows[flowName] = {
225
+ tokenUrl: flow.tokenUrl,
226
+ scopes: flow.scopes ?? {},
227
+ };
228
+ }
229
+ }
230
+ }
231
+ schemes[name] = { type: "oauth2", flows };
232
+ }
233
+ }
234
+ return schemes;
235
+ }
236
+ function normalizeV2SecuritySchemes(doc) {
237
+ const schemes = {};
238
+ const definitions = doc.securityDefinitions ?? {};
239
+ for (const [name, scheme] of Object.entries(definitions)) {
240
+ if (scheme.type === "apiKey") {
241
+ schemes[name] = {
242
+ type: "apiKey",
243
+ name: scheme.name,
244
+ in: scheme.in,
245
+ };
246
+ }
247
+ else if (scheme.type === "basic") {
248
+ schemes[name] = { type: "http", scheme: "basic" };
249
+ }
250
+ else if (scheme.type === "oauth2") {
251
+ const oauthScheme = scheme;
252
+ schemes[name] = {
253
+ type: "oauth2",
254
+ flows: {
255
+ [oauthScheme.flow]: {
256
+ tokenUrl: "tokenUrl" in oauthScheme ? oauthScheme.tokenUrl : undefined,
257
+ scopes: oauthScheme.scopes ?? {},
258
+ },
259
+ },
260
+ };
261
+ }
262
+ }
263
+ return schemes;
264
+ }
265
+ function mergeParameters(pathLevel, operationLevel) {
266
+ const byKey = new Map();
267
+ for (const p of pathLevel) {
268
+ byKey.set(`${p.in}:${p.name}`, p);
269
+ }
270
+ for (const p of operationLevel) {
271
+ byKey.set(`${p.in}:${p.name}`, p); // operation overrides path
272
+ }
273
+ return [...byKey.values()];
274
+ }
275
+ function generateOperationId(method, path) {
276
+ const segments = path
277
+ .split("/")
278
+ .filter(Boolean)
279
+ .map((s) => {
280
+ if (s.startsWith("{") && s.endsWith("}")) {
281
+ return `by_${s.slice(1, -1)}`;
282
+ }
283
+ return s.replace(/-/g, "_");
284
+ });
285
+ return `${method}_${segments.join("_")}`.toLowerCase();
286
+ }
287
+ //# sourceMappingURL=openapi-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-parser.js","sourceRoot":"","sources":["../../../src/parser/openapi-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { JsonSchema } from "./types.js";
2
+ /**
3
+ * Convert OAS-specific schema extensions into pure JSON Schema
4
+ * that MCP tools can accept.
5
+ */
6
+ export declare function convertToJsonSchema(oasSchema: Record<string, unknown>): JsonSchema;
7
+ //# sourceMappingURL=schema-converter.d.ts.map