@emcy/openapi-to-mcp 0.2.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 (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +207 -0
  3. package/dist/__tests__/generator.test.d.ts +5 -0
  4. package/dist/__tests__/generator.test.d.ts.map +1 -0
  5. package/dist/__tests__/generator.test.js +236 -0
  6. package/dist/__tests__/generator.test.js.map +1 -0
  7. package/dist/__tests__/integration.test.d.ts +5 -0
  8. package/dist/__tests__/integration.test.d.ts.map +1 -0
  9. package/dist/__tests__/integration.test.js +184 -0
  10. package/dist/__tests__/integration.test.js.map +1 -0
  11. package/dist/__tests__/mapper.test.d.ts +5 -0
  12. package/dist/__tests__/mapper.test.d.ts.map +1 -0
  13. package/dist/__tests__/mapper.test.js +250 -0
  14. package/dist/__tests__/mapper.test.js.map +1 -0
  15. package/dist/__tests__/parser.test.d.ts +5 -0
  16. package/dist/__tests__/parser.test.d.ts.map +1 -0
  17. package/dist/__tests__/parser.test.js +260 -0
  18. package/dist/__tests__/parser.test.js.map +1 -0
  19. package/dist/cli.d.ts +12 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +235 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/generator.d.ts +9 -0
  24. package/dist/generator.d.ts.map +1 -0
  25. package/dist/generator.js +595 -0
  26. package/dist/generator.js.map +1 -0
  27. package/dist/index.d.ts +10 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +9 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/mapper.d.ts +17 -0
  32. package/dist/mapper.d.ts.map +1 -0
  33. package/dist/mapper.js +79 -0
  34. package/dist/mapper.js.map +1 -0
  35. package/dist/parser.d.ts +31 -0
  36. package/dist/parser.d.ts.map +1 -0
  37. package/dist/parser.js +183 -0
  38. package/dist/parser.js.map +1 -0
  39. package/dist/types.d.ts +97 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +5 -0
  42. package/dist/types.js.map +1 -0
  43. package/package.json +72 -0
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Integration tests - end-to-end generation flow
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { parseOpenAPI, generateOperationId } from '../parser.js';
6
+ import { mapToMcpTools } from '../mapper.js';
7
+ import { generateMcpServer } from '../generator.js';
8
+ /**
9
+ * Sample OpenAPI spec similar to what the SampleApi produces
10
+ * Note: No operationIds defined - they should be generated consistently
11
+ */
12
+ const sampleApiSpec = {
13
+ openapi: '3.0.1',
14
+ info: {
15
+ title: 'Sample API',
16
+ description: 'A sample API for products and orders',
17
+ version: 'v1',
18
+ },
19
+ paths: {
20
+ '/Orders': {
21
+ get: {
22
+ tags: ['Orders'],
23
+ responses: { '200': { description: 'OK' } },
24
+ },
25
+ post: {
26
+ tags: ['Orders'],
27
+ requestBody: {
28
+ content: {
29
+ 'application/json': {
30
+ schema: {
31
+ type: 'object',
32
+ properties: {
33
+ productId: { type: 'integer' },
34
+ customerName: { type: 'string' },
35
+ quantity: { type: 'integer' },
36
+ },
37
+ },
38
+ },
39
+ },
40
+ },
41
+ responses: { '200': { description: 'OK' } },
42
+ },
43
+ },
44
+ '/Orders/{id}': {
45
+ get: {
46
+ tags: ['Orders'],
47
+ parameters: [
48
+ { name: 'id', in: 'path', required: true, schema: { type: 'integer' } },
49
+ ],
50
+ responses: { '200': { description: 'OK' } },
51
+ },
52
+ delete: {
53
+ tags: ['Orders'],
54
+ parameters: [
55
+ { name: 'id', in: 'path', required: true, schema: { type: 'integer' } },
56
+ ],
57
+ responses: { '200': { description: 'OK' } },
58
+ },
59
+ },
60
+ '/Products': {
61
+ get: {
62
+ tags: ['Products'],
63
+ responses: { '200': { description: 'OK' } },
64
+ },
65
+ post: {
66
+ tags: ['Products'],
67
+ requestBody: {
68
+ content: {
69
+ 'application/json': {
70
+ schema: {
71
+ type: 'object',
72
+ properties: {
73
+ name: { type: 'string' },
74
+ price: { type: 'number' },
75
+ },
76
+ },
77
+ },
78
+ },
79
+ },
80
+ responses: { '200': { description: 'OK' } },
81
+ },
82
+ },
83
+ '/Products/{id}': {
84
+ get: {
85
+ tags: ['Products'],
86
+ parameters: [
87
+ { name: 'id', in: 'path', required: true, schema: { type: 'integer' } },
88
+ ],
89
+ responses: { '200': { description: 'OK' } },
90
+ },
91
+ },
92
+ },
93
+ };
94
+ describe('End-to-end generation', () => {
95
+ it('should generate tools from OpenAPI spec without operationIds', async () => {
96
+ const parsed = await parseOpenAPI(sampleApiSpec);
97
+ expect(parsed.title).toBe('Sample API');
98
+ expect(parsed.endpoints.length).toBe(7);
99
+ // Verify generated operationIds match expected format
100
+ const operationIds = parsed.endpoints.map(e => e.operationId);
101
+ expect(operationIds).toContain('GetOrders');
102
+ expect(operationIds).toContain('PostOrders');
103
+ expect(operationIds).toContain('GetOrdersById');
104
+ expect(operationIds).toContain('DeleteOrdersById');
105
+ expect(operationIds).toContain('GetProducts');
106
+ expect(operationIds).toContain('PostProducts');
107
+ expect(operationIds).toContain('GetProductsById');
108
+ });
109
+ it('should map parsed endpoints to MCP tools', async () => {
110
+ const parsed = await parseOpenAPI(sampleApiSpec);
111
+ const tools = mapToMcpTools(parsed.endpoints);
112
+ expect(tools.length).toBe(7);
113
+ const getOrders = tools.find(t => t.name === 'GetOrders');
114
+ expect(getOrders).toBeDefined();
115
+ expect(getOrders?.httpMethod).toBe('get');
116
+ expect(getOrders?.pathTemplate).toBe('/Orders');
117
+ const postOrders = tools.find(t => t.name === 'PostOrders');
118
+ expect(postOrders).toBeDefined();
119
+ expect(postOrders?.requestBodyContentType).toBe('application/json');
120
+ const getOrderById = tools.find(t => t.name === 'GetOrdersById');
121
+ expect(getOrderById).toBeDefined();
122
+ expect(getOrderById?.parameters).toHaveLength(1);
123
+ expect(getOrderById?.parameters[0].name).toBe('id');
124
+ });
125
+ it('should generate MCP server with all tools', async () => {
126
+ const parsed = await parseOpenAPI(sampleApiSpec);
127
+ const tools = mapToMcpTools(parsed.endpoints);
128
+ const files = generateMcpServer(tools, {
129
+ name: 'sample-api-mcp',
130
+ version: '1.0.0',
131
+ baseUrl: 'http://localhost:5158',
132
+ emcyEnabled: true,
133
+ });
134
+ const serverCode = files['src/index.ts'];
135
+ // Verify all tools are in the generated code
136
+ expect(serverCode).toContain('["GetOrders"');
137
+ expect(serverCode).toContain('["PostOrders"');
138
+ expect(serverCode).toContain('["GetOrdersById"');
139
+ expect(serverCode).toContain('["DeleteOrdersById"');
140
+ expect(serverCode).toContain('["GetProducts"');
141
+ expect(serverCode).toContain('["PostProducts"');
142
+ expect(serverCode).toContain('["GetProductsById"');
143
+ // Verify the toolDefinitionMap is not empty
144
+ expect(serverCode).not.toMatch(/const toolDefinitionMap.*=.*new Map\(\[\s*\]\)/);
145
+ });
146
+ it('should filter endpoints when enabledPaths is provided', async () => {
147
+ const parsed = await parseOpenAPI(sampleApiSpec);
148
+ const enabledPaths = new Set(['GET:/Orders', 'POST:/Orders']);
149
+ const tools = mapToMcpTools(parsed.endpoints, enabledPaths);
150
+ expect(tools.length).toBe(2);
151
+ expect(tools.map(t => t.name)).toEqual(['GetOrders', 'PostOrders']);
152
+ });
153
+ });
154
+ describe('operationId consistency', () => {
155
+ /**
156
+ * This test ensures the wizard's operationId generation matches the generator's.
157
+ * The wizard uses generateOperationId (duplicated in actions.ts) to create IDs,
158
+ * and the generator uses the same logic in parser.ts.
159
+ *
160
+ * If these don't match, the wizard's endpoint selection won't correctly
161
+ * filter the generator's tools, resulting in empty tool definitions.
162
+ */
163
+ it('should generate consistent operationIds across different methods and paths', () => {
164
+ const testCases = [
165
+ { method: 'get', path: '/users', expected: 'GetUsers' },
166
+ { method: 'GET', path: '/users', expected: 'GetUsers' },
167
+ { method: 'post', path: '/users', expected: 'PostUsers' },
168
+ { method: 'get', path: '/users/{id}', expected: 'GetUsersById' },
169
+ { method: 'delete', path: '/users/{id}', expected: 'DeleteUsersById' },
170
+ { method: 'get', path: '/orders/{orderId}/items', expected: 'GetOrdersByOrderIdItems' },
171
+ { method: 'patch', path: '/orders/{id}/status', expected: 'PatchOrdersByIdStatus' },
172
+ { method: 'get', path: '/api/v1/products', expected: 'GetApiV1Products' },
173
+ { method: 'get', path: '/', expected: 'Get' },
174
+ { method: 'get', path: '/Orders', expected: 'GetOrders' },
175
+ { method: 'post', path: '/Orders', expected: 'PostOrders' },
176
+ { method: 'get', path: '/Orders/{id}', expected: 'GetOrdersById' },
177
+ ];
178
+ for (const { method, path, expected } of testCases) {
179
+ const result = generateOperationId(method, path);
180
+ expect(result, `generateOperationId('${method}', '${path}')`).toBe(expected);
181
+ }
182
+ });
183
+ });
184
+ //# sourceMappingURL=integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../src/__tests__/integration.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;;GAGG;AACH,MAAM,aAAa,GAAG;IACpB,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE;QACJ,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,sCAAsC;QACnD,OAAO,EAAE,IAAI;KACd;IACD,KAAK,EAAE;QACL,SAAS,EAAE;YACT,GAAG,EAAE;gBACH,IAAI,EAAE,CAAC,QAAQ,CAAC;gBAChB,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;aAC5C;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,CAAC,QAAQ,CAAC;gBAChB,WAAW,EAAE;oBACX,OAAO,EAAE;wBACP,kBAAkB,EAAE;4BAClB,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,UAAU,EAAE;oCACV,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oCAC9B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oCAChC,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;iCAC9B;6BACF;yBACF;qBACF;iBACF;gBACD,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;aAC5C;SACF;QACD,cAAc,EAAE;YACd,GAAG,EAAE;gBACH,IAAI,EAAE,CAAC,QAAQ,CAAC;gBAChB,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;iBACxE;gBACD,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;aAC5C;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,CAAC,QAAQ,CAAC;gBAChB,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;iBACxE;gBACD,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;aAC5C;SACF;QACD,WAAW,EAAE;YACX,GAAG,EAAE;gBACH,IAAI,EAAE,CAAC,UAAU,CAAC;gBAClB,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;aAC5C;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,CAAC,UAAU,CAAC;gBAClB,WAAW,EAAE;oBACX,OAAO,EAAE;wBACP,kBAAkB,EAAE;4BAClB,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,UAAU,EAAE;oCACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oCACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iCAC1B;6BACF;yBACF;qBACF;iBACF;gBACD,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;aAC5C;SACF;QACD,gBAAgB,EAAE;YAChB,GAAG,EAAE;gBACH,IAAI,EAAE,CAAC,UAAU,CAAC;gBAClB,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;iBACxE;gBACD,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;aAC5C;SACF;KACF;CACF,CAAC;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,CAAC;QAEjD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAExC,sDAAsD;QACtD,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC9D,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAChD,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACnD,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE9C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE7B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAC1D,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEhD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAEpE,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;QACjE,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE;YACrC,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,uBAAuB;YAChC,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;QAEzC,6CAA6C;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC9C,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACjD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACpD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC/C,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAChD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAEnD,4CAA4C;QAC5C,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAE5D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC;;;;;;;OAOG;IACH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,SAAS,GAAG;YAChB,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE;YACvD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE;YACvD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE;YACzD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE;YAChE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,iBAAiB,EAAE;YACtE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,yBAAyB,EAAE;YACvF,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,uBAAuB,EAAE;YACnF,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB,EAAE;YACzE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC7C,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE;YACzD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE;YAC3D,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE;SACnE,CAAC;QAEF,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,SAAS,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,EAAE,wBAAwB,MAAM,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Mapper tests - ensures endpoints are correctly mapped to MCP tool definitions
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=mapper.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mapper.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Mapper tests - ensures endpoints are correctly mapped to MCP tool definitions
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { mapToMcpTools, getEndpointKey, getAllEndpointKeys } from '../mapper.js';
6
+ describe('mapToMcpTools', () => {
7
+ it('should map a simple GET endpoint to a tool', () => {
8
+ const endpoints = [
9
+ {
10
+ operationId: 'getUsers',
11
+ method: 'GET',
12
+ path: '/users',
13
+ summary: 'Get all users',
14
+ parameters: [],
15
+ securitySchemes: [],
16
+ tags: [],
17
+ },
18
+ ];
19
+ const tools = mapToMcpTools(endpoints);
20
+ expect(tools).toHaveLength(1);
21
+ expect(tools[0]).toEqual({
22
+ name: 'getUsers',
23
+ description: 'Get all users',
24
+ inputSchema: { type: 'object', properties: {} },
25
+ httpMethod: 'get',
26
+ pathTemplate: '/users',
27
+ parameters: [],
28
+ requestBodyContentType: undefined,
29
+ securitySchemes: [],
30
+ });
31
+ });
32
+ it('should map path parameters to input schema', () => {
33
+ const endpoints = [
34
+ {
35
+ operationId: 'getUser',
36
+ method: 'GET',
37
+ path: '/users/{id}',
38
+ summary: 'Get user by ID',
39
+ parameters: [
40
+ {
41
+ name: 'id',
42
+ in: 'path',
43
+ required: true,
44
+ schema: { type: 'integer', description: 'User ID' },
45
+ },
46
+ ],
47
+ securitySchemes: [],
48
+ tags: [],
49
+ },
50
+ ];
51
+ const tools = mapToMcpTools(endpoints);
52
+ expect(tools[0].inputSchema).toEqual({
53
+ type: 'object',
54
+ properties: {
55
+ id: { type: 'integer', description: 'User ID' },
56
+ },
57
+ required: ['id'],
58
+ });
59
+ expect(tools[0].parameters).toEqual([
60
+ { name: 'id', in: 'path', required: true, schema: { type: 'integer', description: 'User ID' } },
61
+ ]);
62
+ });
63
+ it('should map query parameters to input schema', () => {
64
+ const endpoints = [
65
+ {
66
+ operationId: 'searchUsers',
67
+ method: 'GET',
68
+ path: '/users',
69
+ summary: 'Search users',
70
+ parameters: [
71
+ {
72
+ name: 'q',
73
+ in: 'query',
74
+ required: false,
75
+ schema: { type: 'string' },
76
+ description: 'Search query',
77
+ },
78
+ {
79
+ name: 'limit',
80
+ in: 'query',
81
+ required: false,
82
+ schema: { type: 'integer', default: 10 },
83
+ },
84
+ ],
85
+ securitySchemes: [],
86
+ tags: [],
87
+ },
88
+ ];
89
+ const tools = mapToMcpTools(endpoints);
90
+ expect(tools[0].inputSchema.properties).toEqual({
91
+ q: { type: 'string', description: 'Search query' },
92
+ limit: { type: 'integer', default: 10 },
93
+ });
94
+ // Neither parameter is required, so required array should not exist
95
+ expect(tools[0].inputSchema.required).toBeUndefined();
96
+ });
97
+ it('should map request body to input schema', () => {
98
+ const endpoints = [
99
+ {
100
+ operationId: 'createUser',
101
+ method: 'POST',
102
+ path: '/users',
103
+ summary: 'Create a user',
104
+ parameters: [],
105
+ requestBody: {
106
+ required: true,
107
+ contentType: 'application/json',
108
+ schema: {
109
+ type: 'object',
110
+ properties: {
111
+ name: { type: 'string' },
112
+ email: { type: 'string' },
113
+ },
114
+ required: ['name', 'email'],
115
+ },
116
+ },
117
+ securitySchemes: [],
118
+ tags: [],
119
+ },
120
+ ];
121
+ const tools = mapToMcpTools(endpoints);
122
+ expect(tools[0].inputSchema.properties?.requestBody).toBeDefined();
123
+ expect(tools[0].inputSchema.required).toContain('requestBody');
124
+ expect(tools[0].requestBodyContentType).toBe('application/json');
125
+ });
126
+ it('should include description from endpoint', () => {
127
+ const endpoints = [
128
+ {
129
+ operationId: 'getUser',
130
+ method: 'GET',
131
+ path: '/users/{id}',
132
+ summary: 'Get user by ID',
133
+ description: 'Retrieves a single user by their unique identifier.',
134
+ parameters: [],
135
+ securitySchemes: [],
136
+ tags: [],
137
+ },
138
+ ];
139
+ const tools = mapToMcpTools(endpoints);
140
+ expect(tools[0].description).toBe('Get user by ID\n\nRetrieves a single user by their unique identifier.');
141
+ });
142
+ it('should generate description from path when no summary', () => {
143
+ const endpoints = [
144
+ {
145
+ operationId: 'deleteUser',
146
+ method: 'DELETE',
147
+ path: '/users/{id}',
148
+ parameters: [],
149
+ securitySchemes: [],
150
+ tags: [],
151
+ },
152
+ ];
153
+ const tools = mapToMcpTools(endpoints);
154
+ expect(tools[0].description).toBe('Executes DELETE /users/{id}');
155
+ });
156
+ it('should map multiple endpoints', () => {
157
+ const endpoints = [
158
+ {
159
+ operationId: 'getUsers',
160
+ method: 'GET',
161
+ path: '/users',
162
+ parameters: [],
163
+ securitySchemes: [],
164
+ tags: [],
165
+ },
166
+ {
167
+ operationId: 'createUser',
168
+ method: 'POST',
169
+ path: '/users',
170
+ parameters: [],
171
+ securitySchemes: [],
172
+ tags: [],
173
+ },
174
+ {
175
+ operationId: 'getUser',
176
+ method: 'GET',
177
+ path: '/users/{id}',
178
+ parameters: [],
179
+ securitySchemes: [],
180
+ tags: [],
181
+ },
182
+ ];
183
+ const tools = mapToMcpTools(endpoints);
184
+ expect(tools).toHaveLength(3);
185
+ expect(tools.map(t => t.name)).toEqual(['getUsers', 'createUser', 'getUser']);
186
+ });
187
+ it('should filter by enabled paths when provided', () => {
188
+ const endpoints = [
189
+ {
190
+ operationId: 'getUsers',
191
+ method: 'GET',
192
+ path: '/users',
193
+ parameters: [],
194
+ securitySchemes: [],
195
+ tags: [],
196
+ },
197
+ {
198
+ operationId: 'createUser',
199
+ method: 'POST',
200
+ path: '/users',
201
+ parameters: [],
202
+ securitySchemes: [],
203
+ tags: [],
204
+ },
205
+ ];
206
+ const enabledPaths = new Set(['GET:/users']);
207
+ const tools = mapToMcpTools(endpoints, enabledPaths);
208
+ expect(tools).toHaveLength(1);
209
+ expect(tools[0].name).toBe('getUsers');
210
+ });
211
+ it('should preserve security schemes', () => {
212
+ const endpoints = [
213
+ {
214
+ operationId: 'getSecureData',
215
+ method: 'GET',
216
+ path: '/secure',
217
+ parameters: [],
218
+ securitySchemes: ['bearerAuth', 'apiKey'],
219
+ tags: [],
220
+ },
221
+ ];
222
+ const tools = mapToMcpTools(endpoints);
223
+ expect(tools[0].securitySchemes).toEqual(['bearerAuth', 'apiKey']);
224
+ });
225
+ });
226
+ describe('getEndpointKey', () => {
227
+ it('should generate correct key format', () => {
228
+ const endpoint = {
229
+ operationId: 'getUsers',
230
+ method: 'GET',
231
+ path: '/users',
232
+ parameters: [],
233
+ securitySchemes: [],
234
+ tags: [],
235
+ };
236
+ expect(getEndpointKey(endpoint)).toBe('GET:/users');
237
+ });
238
+ });
239
+ describe('getAllEndpointKeys', () => {
240
+ it('should return all endpoint keys', () => {
241
+ const endpoints = [
242
+ { operationId: 'a', method: 'GET', path: '/users', parameters: [], securitySchemes: [], tags: [] },
243
+ { operationId: 'b', method: 'POST', path: '/users', parameters: [], securitySchemes: [], tags: [] },
244
+ { operationId: 'c', method: 'DELETE', path: '/users/{id}', parameters: [], securitySchemes: [], tags: [] },
245
+ ];
246
+ const keys = getAllEndpointKeys(endpoints);
247
+ expect(keys).toEqual(['GET:/users', 'POST:/users', 'DELETE:/users/{id}']);
248
+ });
249
+ });
250
+ //# sourceMappingURL=mapper.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.test.js","sourceRoot":"","sources":["../../src/__tests__/mapper.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Parser tests - ensures OpenAPI specs are correctly parsed into our format
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/parser.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}