truss-api-mcp 1.0.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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +89 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/code-generator.d.ts +6 -0
  8. package/dist/lib/code-generator.d.ts.map +1 -0
  9. package/dist/lib/code-generator.js +890 -0
  10. package/dist/lib/code-generator.js.map +1 -0
  11. package/dist/lib/http-client.d.ts +6 -0
  12. package/dist/lib/http-client.d.ts.map +1 -0
  13. package/dist/lib/http-client.js +76 -0
  14. package/dist/lib/http-client.js.map +1 -0
  15. package/dist/lib/license.d.ts +4 -0
  16. package/dist/lib/license.d.ts.map +1 -0
  17. package/dist/lib/license.js +97 -0
  18. package/dist/lib/license.js.map +1 -0
  19. package/dist/lib/openapi-parser.d.ts +11 -0
  20. package/dist/lib/openapi-parser.d.ts.map +1 -0
  21. package/dist/lib/openapi-parser.js +390 -0
  22. package/dist/lib/openapi-parser.js.map +1 -0
  23. package/dist/lib/schema-validator.d.ts +15 -0
  24. package/dist/lib/schema-validator.d.ts.map +1 -0
  25. package/dist/lib/schema-validator.js +206 -0
  26. package/dist/lib/schema-validator.js.map +1 -0
  27. package/dist/tools/compare-specs.d.ts +3 -0
  28. package/dist/tools/compare-specs.d.ts.map +1 -0
  29. package/dist/tools/compare-specs.js +59 -0
  30. package/dist/tools/compare-specs.js.map +1 -0
  31. package/dist/tools/generate-client.d.ts +3 -0
  32. package/dist/tools/generate-client.d.ts.map +1 -0
  33. package/dist/tools/generate-client.js +65 -0
  34. package/dist/tools/generate-client.js.map +1 -0
  35. package/dist/tools/generate-openapi.d.ts +3 -0
  36. package/dist/tools/generate-openapi.d.ts.map +1 -0
  37. package/dist/tools/generate-openapi.js +57 -0
  38. package/dist/tools/generate-openapi.js.map +1 -0
  39. package/dist/tools/generate-tests.d.ts +3 -0
  40. package/dist/tools/generate-tests.d.ts.map +1 -0
  41. package/dist/tools/generate-tests.js +59 -0
  42. package/dist/tools/generate-tests.js.map +1 -0
  43. package/dist/tools/mock-server.d.ts +3 -0
  44. package/dist/tools/mock-server.d.ts.map +1 -0
  45. package/dist/tools/mock-server.js +60 -0
  46. package/dist/tools/mock-server.js.map +1 -0
  47. package/dist/tools/parse-openapi.d.ts +3 -0
  48. package/dist/tools/parse-openapi.d.ts.map +1 -0
  49. package/dist/tools/parse-openapi.js +48 -0
  50. package/dist/tools/parse-openapi.js.map +1 -0
  51. package/dist/tools/test-endpoint.d.ts +3 -0
  52. package/dist/tools/test-endpoint.d.ts.map +1 -0
  53. package/dist/tools/test-endpoint.js +66 -0
  54. package/dist/tools/test-endpoint.js.map +1 -0
  55. package/dist/tools/validate-response.d.ts +3 -0
  56. package/dist/tools/validate-response.d.ts.map +1 -0
  57. package/dist/tools/validate-response.js +44 -0
  58. package/dist/tools/validate-response.js.map +1 -0
  59. package/dist/types.d.ts +121 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +3 -0
  62. package/dist/types.js.map +1 -0
  63. package/evals/eval-http.ts +163 -0
  64. package/evals/eval-openapi.ts +506 -0
  65. package/evals/run-evals.ts +29 -0
  66. package/glama.json +4 -0
  67. package/package.json +37 -0
  68. package/smithery.yaml +9 -0
  69. package/src/index.ts +110 -0
  70. package/src/lib/code-generator.ts +1045 -0
  71. package/src/lib/http-client.ts +87 -0
  72. package/src/lib/license.ts +121 -0
  73. package/src/lib/openapi-parser.ts +456 -0
  74. package/src/lib/schema-validator.ts +234 -0
  75. package/src/tools/compare-specs.ts +67 -0
  76. package/src/tools/generate-client.ts +75 -0
  77. package/src/tools/generate-openapi.ts +67 -0
  78. package/src/tools/generate-tests.ts +69 -0
  79. package/src/tools/mock-server.ts +68 -0
  80. package/src/tools/parse-openapi.ts +54 -0
  81. package/src/tools/test-endpoint.ts +71 -0
  82. package/src/tools/validate-response.ts +54 -0
  83. package/src/types.ts +156 -0
  84. package/tsconfig.json +19 -0
@@ -0,0 +1,390 @@
1
+ import * as yaml from 'js-yaml';
2
+ const HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'];
3
+ /**
4
+ * Parse an OpenAPI 3.x or Swagger 2.0 spec from JSON or YAML string.
5
+ */
6
+ export function parseOpenApiSpec(input) {
7
+ let doc;
8
+ // Try JSON first, then YAML
9
+ try {
10
+ doc = JSON.parse(input);
11
+ }
12
+ catch {
13
+ try {
14
+ doc = yaml.load(input);
15
+ }
16
+ catch (yamlErr) {
17
+ throw new Error(`Failed to parse spec as JSON or YAML: ${yamlErr instanceof Error ? yamlErr.message : String(yamlErr)}`);
18
+ }
19
+ }
20
+ if (!doc || typeof doc !== 'object') {
21
+ throw new Error('Spec must be a valid JSON or YAML object');
22
+ }
23
+ // Detect version
24
+ const isSwagger2 = typeof doc.swagger === 'string' && doc.swagger.startsWith('2.');
25
+ const isOpenApi3 = typeof doc.openapi === 'string' && doc.openapi.startsWith('3.');
26
+ if (!isSwagger2 && !isOpenApi3) {
27
+ throw new Error('Unsupported spec: must be OpenAPI 3.x or Swagger 2.0');
28
+ }
29
+ // Build a flat definitions map for $ref resolution
30
+ const definitions = buildDefinitions(doc);
31
+ const info = extractInfo(doc);
32
+ const servers = isOpenApi3 ? extractServers(doc) : extractSwagger2Servers(doc);
33
+ const endpoints = extractEndpoints(doc, definitions, isSwagger2);
34
+ return { info, servers, endpoints };
35
+ }
36
+ // ── Info ────────────────────────────────────────────────────────────
37
+ function extractInfo(doc) {
38
+ const info = (doc.info ?? {});
39
+ return {
40
+ title: String(info.title ?? 'Untitled API'),
41
+ version: String(info.version ?? '0.0.0'),
42
+ description: info.description ? String(info.description) : undefined,
43
+ };
44
+ }
45
+ // ── Servers ─────────────────────────────────────────────────────────
46
+ function extractServers(doc) {
47
+ const servers = doc.servers;
48
+ if (!Array.isArray(servers) || servers.length === 0)
49
+ return undefined;
50
+ return servers.map((s) => ({
51
+ url: String(s.url ?? ''),
52
+ description: s.description ? String(s.description) : undefined,
53
+ }));
54
+ }
55
+ function extractSwagger2Servers(doc) {
56
+ const host = doc.host;
57
+ const basePath = doc.basePath ?? '';
58
+ const schemes = doc.schemes ?? ['https'];
59
+ if (!host)
60
+ return undefined;
61
+ return schemes.map((scheme) => ({ url: `${scheme}://${host}${basePath}` }));
62
+ }
63
+ // ── Definitions / Components ────────────────────────────────────────
64
+ function buildDefinitions(doc) {
65
+ const defs = new Map();
66
+ // OpenAPI 3.x components/schemas
67
+ const components = doc.components;
68
+ if (components?.schemas && typeof components.schemas === 'object') {
69
+ for (const [name, schema] of Object.entries(components.schemas)) {
70
+ defs.set(`#/components/schemas/${name}`, schema);
71
+ }
72
+ }
73
+ // Swagger 2.0 definitions
74
+ const definitions = doc.definitions;
75
+ if (definitions && typeof definitions === 'object') {
76
+ for (const [name, schema] of Object.entries(definitions)) {
77
+ defs.set(`#/definitions/${name}`, schema);
78
+ }
79
+ }
80
+ return defs;
81
+ }
82
+ function resolveRef(schema, defs, depth = 0) {
83
+ if (depth > 20)
84
+ return schema; // prevent infinite recursion
85
+ if (schema.$ref) {
86
+ const resolved = defs.get(schema.$ref);
87
+ if (resolved)
88
+ return resolveRef(resolved, defs, depth + 1);
89
+ // Unresolvable ref — return a stub
90
+ return { type: 'object', description: `Unresolved: ${schema.$ref}` };
91
+ }
92
+ return schema;
93
+ }
94
+ // ── Endpoints ───────────────────────────────────────────────────────
95
+ function extractEndpoints(doc, defs, isSwagger2) {
96
+ const paths = doc.paths;
97
+ if (!paths)
98
+ return [];
99
+ const endpoints = [];
100
+ for (const [path, pathItem] of Object.entries(paths)) {
101
+ if (!pathItem || typeof pathItem !== 'object')
102
+ continue;
103
+ // Path-level parameters
104
+ const pathParams = (pathItem.parameters ?? []);
105
+ for (const method of HTTP_METHODS) {
106
+ const operation = pathItem[method];
107
+ if (!operation)
108
+ continue;
109
+ const operationParams = (operation.parameters ?? []);
110
+ const allParams = [...pathParams, ...operationParams];
111
+ const parameters = extractParameters(allParams, defs, isSwagger2);
112
+ const requestBody = isSwagger2
113
+ ? extractSwagger2Body(allParams, defs)
114
+ : extractRequestBody(operation, defs);
115
+ const responses = extractResponses(operation, defs, isSwagger2);
116
+ const tags = Array.isArray(operation.tags) ? operation.tags.map(String) : undefined;
117
+ endpoints.push({
118
+ method: method.toUpperCase(),
119
+ path,
120
+ summary: String(operation.summary ?? operation.description ?? ''),
121
+ operationId: operation.operationId ? String(operation.operationId) : undefined,
122
+ parameters,
123
+ requestBody: requestBody ?? undefined,
124
+ responses,
125
+ tags,
126
+ });
127
+ }
128
+ }
129
+ return endpoints;
130
+ }
131
+ function extractParameters(params, defs, isSwagger2) {
132
+ return params
133
+ .filter((p) => {
134
+ // Skip body params in Swagger 2 — handled separately
135
+ if (isSwagger2 && p.in === 'body')
136
+ return false;
137
+ return p.in === 'query' || p.in === 'path' || p.in === 'header' || p.in === 'cookie';
138
+ })
139
+ .map((p) => {
140
+ let schema;
141
+ if (p.schema) {
142
+ schema = resolveRef(p.schema, defs);
143
+ }
144
+ else if (isSwagger2 && p.type) {
145
+ schema = { type: String(p.type) };
146
+ }
147
+ return {
148
+ name: String(p.name ?? ''),
149
+ in: p.in,
150
+ required: Boolean(p.required),
151
+ description: p.description ? String(p.description) : undefined,
152
+ schema,
153
+ };
154
+ });
155
+ }
156
+ function extractRequestBody(operation, defs) {
157
+ const rb = operation.requestBody;
158
+ if (!rb)
159
+ return null;
160
+ const content = rb.content;
161
+ if (!content)
162
+ return null;
163
+ // Prefer application/json
164
+ const jsonContent = content['application/json'] ?? content[Object.keys(content)[0]];
165
+ if (!jsonContent?.schema)
166
+ return null;
167
+ return resolveRef(jsonContent.schema, defs);
168
+ }
169
+ function extractSwagger2Body(params, defs) {
170
+ const bodyParam = params.find((p) => p.in === 'body');
171
+ if (!bodyParam?.schema)
172
+ return null;
173
+ return resolveRef(bodyParam.schema, defs);
174
+ }
175
+ function extractResponses(operation, defs, isSwagger2) {
176
+ const responses = operation.responses;
177
+ if (!responses)
178
+ return [];
179
+ return Object.entries(responses).map(([status, resp]) => {
180
+ let schema;
181
+ if (isSwagger2) {
182
+ if (resp.schema) {
183
+ schema = resolveRef(resp.schema, defs);
184
+ }
185
+ }
186
+ else {
187
+ const content = resp.content;
188
+ if (content) {
189
+ const jsonContent = content['application/json'] ?? content[Object.keys(content)[0]];
190
+ if (jsonContent?.schema) {
191
+ schema = resolveRef(jsonContent.schema, defs);
192
+ }
193
+ }
194
+ }
195
+ return {
196
+ status,
197
+ description: String(resp.description ?? ''),
198
+ schema,
199
+ };
200
+ });
201
+ }
202
+ /**
203
+ * Auto-generate an OpenAPI 3.0 spec from a set of request/response examples.
204
+ */
205
+ export function generateOpenApiFromExamples(examples) {
206
+ // Group examples by path pattern
207
+ const endpointMap = new Map();
208
+ for (const ex of examples) {
209
+ let urlPath;
210
+ try {
211
+ const parsed = new URL(ex.url);
212
+ urlPath = parsed.pathname;
213
+ }
214
+ catch {
215
+ urlPath = ex.url;
216
+ }
217
+ // Normalize numeric segments to path params
218
+ const normalized = urlPath.replace(/\/(\d+)/g, '/{id}');
219
+ const key = `${ex.method.toUpperCase()} ${normalized}`;
220
+ if (!endpointMap.has(key))
221
+ endpointMap.set(key, []);
222
+ endpointMap.get(key).push(ex);
223
+ }
224
+ // Extract base URL from first example
225
+ let baseUrl = '';
226
+ try {
227
+ const parsed = new URL(examples[0].url);
228
+ baseUrl = `${parsed.protocol}//${parsed.host}`;
229
+ }
230
+ catch {
231
+ baseUrl = 'http://localhost:3000';
232
+ }
233
+ // Build paths
234
+ const paths = {};
235
+ for (const [key, exs] of endpointMap) {
236
+ const [method, path] = key.split(' ', 2);
237
+ if (!paths[path])
238
+ paths[path] = {};
239
+ const example = exs[0];
240
+ const methodLower = method.toLowerCase();
241
+ // Infer path parameters
242
+ const pathParams = [];
243
+ const paramMatches = path.match(/\{(\w+)\}/g);
244
+ if (paramMatches) {
245
+ for (const match of paramMatches) {
246
+ const name = match.replace(/[{}]/g, '');
247
+ pathParams.push({
248
+ name,
249
+ in: 'path',
250
+ required: true,
251
+ schema: { type: 'integer' },
252
+ });
253
+ }
254
+ }
255
+ // Infer query parameters from URL
256
+ const queryParams = [];
257
+ try {
258
+ const parsed = new URL(example.url);
259
+ for (const [qname, qvalue] of parsed.searchParams) {
260
+ queryParams.push({
261
+ name: qname,
262
+ in: 'query',
263
+ required: false,
264
+ schema: { type: inferJsonType(qvalue) },
265
+ example: qvalue,
266
+ });
267
+ }
268
+ }
269
+ catch {
270
+ // ignore
271
+ }
272
+ const operation = {
273
+ summary: `${method} ${path}`,
274
+ operationId: `${methodLower}${path.replace(/[/{}\-]/g, '_').replace(/_+/g, '_').replace(/^_|_$/g, '')}`,
275
+ parameters: [...pathParams, ...queryParams],
276
+ responses: {},
277
+ };
278
+ // Request body
279
+ if (example.request_body !== undefined && example.request_body !== null) {
280
+ operation.requestBody = {
281
+ required: true,
282
+ content: {
283
+ 'application/json': {
284
+ schema: inferSchema(example.request_body),
285
+ example: example.request_body,
286
+ },
287
+ },
288
+ };
289
+ }
290
+ // Responses — collect all unique status codes
291
+ const statusCodes = new Set(exs.map((e) => e.status));
292
+ const responses = {};
293
+ for (const status of statusCodes) {
294
+ const statusExample = exs.find((e) => e.status === status);
295
+ responses[String(status)] = {
296
+ description: describeStatus(status),
297
+ content: statusExample?.response_body !== undefined
298
+ ? {
299
+ 'application/json': {
300
+ schema: inferSchema(statusExample.response_body),
301
+ example: statusExample.response_body,
302
+ },
303
+ }
304
+ : undefined,
305
+ };
306
+ }
307
+ operation.responses = responses;
308
+ paths[path][methodLower] = operation;
309
+ }
310
+ const spec = {
311
+ openapi: '3.0.3',
312
+ info: {
313
+ title: 'Auto-Generated API',
314
+ version: '1.0.0',
315
+ description: `Generated from ${examples.length} example request(s)`,
316
+ },
317
+ servers: [{ url: baseUrl }],
318
+ paths,
319
+ };
320
+ return yaml.dump(spec, { lineWidth: 120, noRefs: true, sortKeys: false });
321
+ }
322
+ function inferJsonType(value) {
323
+ if (value === null || value === undefined)
324
+ return 'string';
325
+ if (typeof value === 'number' || (typeof value === 'string' && !isNaN(Number(value)) && value !== '')) {
326
+ return Number.isInteger(Number(value)) ? 'integer' : 'number';
327
+ }
328
+ if (typeof value === 'boolean' || value === 'true' || value === 'false')
329
+ return 'boolean';
330
+ if (Array.isArray(value))
331
+ return 'array';
332
+ if (typeof value === 'object')
333
+ return 'object';
334
+ return 'string';
335
+ }
336
+ function inferSchema(value) {
337
+ if (value === null || value === undefined) {
338
+ return { type: 'string', nullable: true };
339
+ }
340
+ if (typeof value === 'string') {
341
+ const schema = { type: 'string' };
342
+ if (/^\d{4}-\d{2}-\d{2}/.test(value))
343
+ schema.format = 'date-time';
344
+ if (/^[^@]+@[^@]+\.[^@]+$/.test(value))
345
+ schema.format = 'email';
346
+ if (/^https?:\/\//.test(value))
347
+ schema.format = 'uri';
348
+ return schema;
349
+ }
350
+ if (typeof value === 'number') {
351
+ return Number.isInteger(value) ? { type: 'integer' } : { type: 'number' };
352
+ }
353
+ if (typeof value === 'boolean') {
354
+ return { type: 'boolean' };
355
+ }
356
+ if (Array.isArray(value)) {
357
+ return {
358
+ type: 'array',
359
+ items: value.length > 0 ? inferSchema(value[0]) : { type: 'string' },
360
+ };
361
+ }
362
+ if (typeof value === 'object') {
363
+ const properties = {};
364
+ const required = [];
365
+ for (const [k, v] of Object.entries(value)) {
366
+ properties[k] = inferSchema(v);
367
+ if (v !== null && v !== undefined)
368
+ required.push(k);
369
+ }
370
+ return { type: 'object', properties, required: required.length > 0 ? required : undefined };
371
+ }
372
+ return { type: 'string' };
373
+ }
374
+ function describeStatus(status) {
375
+ const descriptions = {
376
+ 200: 'Successful response',
377
+ 201: 'Resource created',
378
+ 204: 'No content',
379
+ 400: 'Bad request',
380
+ 401: 'Unauthorized',
381
+ 403: 'Forbidden',
382
+ 404: 'Not found',
383
+ 409: 'Conflict',
384
+ 422: 'Unprocessable entity',
385
+ 429: 'Too many requests',
386
+ 500: 'Internal server error',
387
+ };
388
+ return descriptions[status] ?? `HTTP ${status}`;
389
+ }
390
+ //# sourceMappingURL=openapi-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-parser.js","sourceRoot":"","sources":["../../src/lib/openapi-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { JsonSchema, ValidationResult } from '../types.js';
2
+ /**
3
+ * Validate a value against a JSON Schema (draft-07 subset).
4
+ * Supports: type, properties, required, items, enum, minimum, maximum,
5
+ * minLength, maxLength, pattern, additionalProperties, oneOf, anyOf, allOf, nullable.
6
+ */
7
+ export declare function validateSchema(value: unknown, schema: JsonSchema, path?: string): ValidationResult;
8
+ /**
9
+ * Validate an HTTP response against expected status and optional schema.
10
+ */
11
+ export declare function validateResponse(response: {
12
+ status: number;
13
+ body: unknown;
14
+ }, expectedStatus: number, expectedSchema?: JsonSchema): ValidationResult;
15
+ //# sourceMappingURL=schema-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../src/lib/schema-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEjF;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,UAAU,EAClB,IAAI,SAAM,GACT,gBAAgB,CAIlB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,EAC3C,cAAc,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,UAAU,GAC1B,gBAAgB,CAkBlB"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Validate a value against a JSON Schema (draft-07 subset).
3
+ * Supports: type, properties, required, items, enum, minimum, maximum,
4
+ * minLength, maxLength, pattern, additionalProperties, oneOf, anyOf, allOf, nullable.
5
+ */
6
+ export function validateSchema(value, schema, path = '$') {
7
+ const errors = [];
8
+ validate(value, schema, path, errors);
9
+ return { valid: errors.length === 0, errors };
10
+ }
11
+ /**
12
+ * Validate an HTTP response against expected status and optional schema.
13
+ */
14
+ export function validateResponse(response, expectedStatus, expectedSchema) {
15
+ const errors = [];
16
+ if (response.status !== expectedStatus) {
17
+ errors.push({
18
+ path: '$.status',
19
+ message: `Expected status ${expectedStatus}, got ${response.status}`,
20
+ expected: String(expectedStatus),
21
+ actual: String(response.status),
22
+ });
23
+ }
24
+ if (expectedSchema) {
25
+ const bodyResult = validateSchema(response.body, expectedSchema, '$.body');
26
+ errors.push(...bodyResult.errors);
27
+ }
28
+ return { valid: errors.length === 0, errors };
29
+ }
30
+ // ── Internal Validation ─────────────────────────────────────────────
31
+ function validate(value, schema, path, errors) {
32
+ // Handle nullable
33
+ if (schema.nullable && (value === null || value === undefined)) {
34
+ return;
35
+ }
36
+ // allOf: all must match
37
+ if (schema.allOf) {
38
+ for (const sub of schema.allOf) {
39
+ validate(value, sub, path, errors);
40
+ }
41
+ return;
42
+ }
43
+ // anyOf: at least one must match
44
+ if (schema.anyOf) {
45
+ const anyErrors = [];
46
+ for (const sub of schema.anyOf) {
47
+ const subErrors = [];
48
+ validate(value, sub, path, subErrors);
49
+ if (subErrors.length === 0)
50
+ return; // matched
51
+ anyErrors.push(subErrors);
52
+ }
53
+ errors.push({
54
+ path,
55
+ message: `Value does not match any of the ${schema.anyOf.length} schemas in anyOf`,
56
+ });
57
+ return;
58
+ }
59
+ // oneOf: exactly one must match
60
+ if (schema.oneOf) {
61
+ let matchCount = 0;
62
+ for (const sub of schema.oneOf) {
63
+ const subErrors = [];
64
+ validate(value, sub, path, subErrors);
65
+ if (subErrors.length === 0)
66
+ matchCount++;
67
+ }
68
+ if (matchCount !== 1) {
69
+ errors.push({
70
+ path,
71
+ message: `Value must match exactly one schema in oneOf, but matched ${matchCount}`,
72
+ });
73
+ }
74
+ return;
75
+ }
76
+ // enum
77
+ if (schema.enum) {
78
+ if (!schema.enum.some((e) => JSON.stringify(e) === JSON.stringify(value))) {
79
+ errors.push({
80
+ path,
81
+ message: `Value must be one of: ${schema.enum.map((e) => JSON.stringify(e)).join(', ')}`,
82
+ actual: JSON.stringify(value),
83
+ });
84
+ }
85
+ return;
86
+ }
87
+ // type checking
88
+ if (schema.type) {
89
+ const types = Array.isArray(schema.type) ? schema.type : [schema.type];
90
+ const actualType = getJsonType(value);
91
+ if (!types.includes(actualType)) {
92
+ // Allow integer to match number
93
+ if (!(actualType === 'integer' && types.includes('number'))) {
94
+ // Allow null if nullable
95
+ if (!(actualType === 'null' && schema.nullable)) {
96
+ errors.push({
97
+ path,
98
+ message: `Expected type ${types.join('|')}, got ${actualType}`,
99
+ expected: types.join('|'),
100
+ actual: actualType,
101
+ });
102
+ return;
103
+ }
104
+ }
105
+ }
106
+ }
107
+ // string validations
108
+ if (typeof value === 'string') {
109
+ if (schema.minLength !== undefined && value.length < schema.minLength) {
110
+ errors.push({
111
+ path,
112
+ message: `String length ${value.length} is less than minimum ${schema.minLength}`,
113
+ });
114
+ }
115
+ if (schema.maxLength !== undefined && value.length > schema.maxLength) {
116
+ errors.push({
117
+ path,
118
+ message: `String length ${value.length} exceeds maximum ${schema.maxLength}`,
119
+ });
120
+ }
121
+ if (schema.pattern) {
122
+ try {
123
+ if (!new RegExp(schema.pattern).test(value)) {
124
+ errors.push({
125
+ path,
126
+ message: `String does not match pattern: ${schema.pattern}`,
127
+ });
128
+ }
129
+ }
130
+ catch {
131
+ // Invalid regex — skip validation
132
+ }
133
+ }
134
+ }
135
+ // number validations
136
+ if (typeof value === 'number') {
137
+ if (schema.minimum !== undefined && value < schema.minimum) {
138
+ errors.push({
139
+ path,
140
+ message: `Value ${value} is less than minimum ${schema.minimum}`,
141
+ });
142
+ }
143
+ if (schema.maximum !== undefined && value > schema.maximum) {
144
+ errors.push({
145
+ path,
146
+ message: `Value ${value} exceeds maximum ${schema.maximum}`,
147
+ });
148
+ }
149
+ }
150
+ // object validations
151
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
152
+ const obj = value;
153
+ // required
154
+ if (schema.required) {
155
+ for (const req of schema.required) {
156
+ if (!(req in obj)) {
157
+ errors.push({
158
+ path: `${path}.${req}`,
159
+ message: `Missing required property: ${req}`,
160
+ });
161
+ }
162
+ }
163
+ }
164
+ // properties
165
+ if (schema.properties) {
166
+ for (const [key, propSchema] of Object.entries(schema.properties)) {
167
+ if (key in obj) {
168
+ validate(obj[key], propSchema, `${path}.${key}`, errors);
169
+ }
170
+ }
171
+ }
172
+ // additionalProperties
173
+ if (schema.additionalProperties === false && schema.properties) {
174
+ const allowed = new Set(Object.keys(schema.properties));
175
+ for (const key of Object.keys(obj)) {
176
+ if (!allowed.has(key)) {
177
+ errors.push({
178
+ path: `${path}.${key}`,
179
+ message: `Additional property not allowed: ${key}`,
180
+ });
181
+ }
182
+ }
183
+ }
184
+ }
185
+ // array validations
186
+ if (Array.isArray(value)) {
187
+ if (schema.items) {
188
+ for (let i = 0; i < value.length; i++) {
189
+ validate(value[i], schema.items, `${path}[${i}]`, errors);
190
+ }
191
+ }
192
+ }
193
+ }
194
+ function getJsonType(value) {
195
+ if (value === null)
196
+ return 'null';
197
+ if (value === undefined)
198
+ return 'null';
199
+ if (Array.isArray(value))
200
+ return 'array';
201
+ if (typeof value === 'number') {
202
+ return Number.isInteger(value) ? 'integer' : 'number';
203
+ }
204
+ return typeof value; // 'string', 'boolean', 'object'
205
+ }
206
+ //# sourceMappingURL=schema-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../src/lib/schema-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerCompareSpecs(server: McpServer): void;
3
+ //# sourceMappingURL=compare-specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-specs.d.ts","sourceRoot":"","sources":["../../src/tools/compare-specs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4D5D"}