openapi-dynamic-mcp 0.1.3 → 0.2.1
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.
- package/README.md +150 -105
- package/dist/auth/env.d.ts +7 -1
- package/dist/auth/env.js +25 -12
- package/dist/auth/env.js.map +1 -1
- package/dist/auth/oauthClient.d.ts +1 -1
- package/dist/auth/oauthClient.js +13 -13
- package/dist/auth/oauthClient.js.map +1 -1
- package/dist/auth/resolveAuth.d.ts +3 -3
- package/dist/auth/resolveAuth.js +58 -19
- package/dist/auth/resolveAuth.js.map +1 -1
- package/dist/cli.js +11 -11
- package/dist/cli.js.map +1 -1
- package/dist/config/loadConfig.d.ts +1 -1
- package/dist/config/loadConfig.js +46 -34
- package/dist/config/loadConfig.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +7 -7
- package/dist/http/requestExecutor.d.ts +3 -2
- package/dist/http/requestExecutor.js +201 -67
- package/dist/http/requestExecutor.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.js +6 -6
- package/dist/mcp/context.d.ts +2 -2
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.js +86 -59
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/common.d.ts +6 -6
- package/dist/mcp/tools/common.js +15 -14
- package/dist/mcp/tools/common.js.map +1 -1
- package/dist/mcp/tools/getApiEndpoint.d.ts +2 -2
- package/dist/mcp/tools/getApiEndpoint.js +19 -15
- package/dist/mcp/tools/getApiEndpoint.js.map +1 -1
- package/dist/mcp/tools/getApiSchema.d.ts +2 -2
- package/dist/mcp/tools/getApiSchema.js +6 -6
- package/dist/mcp/tools/getApiSchema.js.map +1 -1
- package/dist/mcp/tools/index.d.ts +5 -5
- package/dist/mcp/tools/index.js +5 -5
- package/dist/mcp/tools/listApiEndpoints.d.ts +2 -2
- package/dist/mcp/tools/listApiEndpoints.js +4 -4
- package/dist/mcp/tools/listApis.d.ts +2 -2
- package/dist/mcp/tools/listApis.js +2 -2
- package/dist/mcp/tools/makeEndpointRequest.d.ts +2 -2
- package/dist/mcp/tools/makeEndpointRequest.js +21 -19
- package/dist/mcp/tools/makeEndpointRequest.js.map +1 -1
- package/dist/openapi/endpointIndex.d.ts +2 -2
- package/dist/openapi/endpointIndex.js +13 -13
- package/dist/openapi/endpointIndex.js.map +1 -1
- package/dist/openapi/jsonPointer.js +15 -12
- package/dist/openapi/jsonPointer.js.map +1 -1
- package/dist/openapi/loadSpec.d.ts +1 -1
- package/dist/openapi/loadSpec.js +46 -17
- package/dist/openapi/loadSpec.js.map +1 -1
- package/dist/types.d.ts +29 -9
- package/dist/types.js +9 -1
- package/dist/types.js.map +1 -1
- package/package.json +16 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makeEndpointRequest.js","sourceRoot":"","sources":["../../../src/mcp/tools/makeEndpointRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"makeEndpointRequest.js","sourceRoot":"","sources":["../../../src/mcp/tools/makeEndpointRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,IAAI,EACJ,EAAE,EACF,UAAU,EACV,UAAU,EACV,WAAW,GAEZ,MAAM,aAAa,CAAC;AAErB,MAAM,8BAA8B,GAAG,CAAC;KACrC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACvD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAClD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACpD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACpD,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5B,KAAK,EAAE,CAAC;SACL,MAAM,CACL,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAChC,CAAC,CACH;SACA,QAAQ,EAAE;IACb,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACjD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;CACzD,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAoB,EACpB,IAAa;IAEb,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,8BAA8B,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACpC,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,qBAAqB,UAAU,GAAG,EAClC;gBACE,OAAO;aACR,CACF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC;YAC1C,GAAG;YACH,QAAQ;YACR,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;YAClC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;YACxB,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;YACnC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;YACnC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAEA;YACb,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EACN,KAAK,CAAC,aAAa,KAAK,SAAS;gBAC/B,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE;gBACrC,CAAC,CAAC,SAAS;YACf,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QAEH,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { OpenAPIV3 } from
|
|
2
|
-
import type { EndpointDefinition } from
|
|
1
|
+
import type { OpenAPIV3 } from 'openapi-types';
|
|
2
|
+
import type { EndpointDefinition } from '../types.js';
|
|
3
3
|
export declare function buildEndpointIndex(document: OpenAPIV3.Document): {
|
|
4
4
|
endpoints: EndpointDefinition[];
|
|
5
5
|
endpointById: Map<string, EndpointDefinition>;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { OpenApiMcpError } from
|
|
1
|
+
import { OpenApiMcpError } from '../errors.js';
|
|
2
2
|
const METHODS = [
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
'get',
|
|
4
|
+
'put',
|
|
5
|
+
'post',
|
|
6
|
+
'delete',
|
|
7
|
+
'options',
|
|
8
|
+
'head',
|
|
9
|
+
'patch',
|
|
10
|
+
'trace',
|
|
11
11
|
];
|
|
12
12
|
function normalizePathForId(path) {
|
|
13
|
-
return path.replace(/\s+/g,
|
|
13
|
+
return path.replace(/\s+/g, '').replace(/\/+$/, '') || '/';
|
|
14
14
|
}
|
|
15
15
|
export function buildEndpointIndex(document) {
|
|
16
16
|
const paths = document.paths ?? {};
|
|
@@ -52,12 +52,12 @@ export function buildEndpointIndex(document) {
|
|
|
52
52
|
description: operation.description,
|
|
53
53
|
tags: operation.tags,
|
|
54
54
|
operation,
|
|
55
|
-
pathItem: pathItem
|
|
55
|
+
pathItem: pathItem,
|
|
56
56
|
};
|
|
57
57
|
if (endpointById.has(endpointId)) {
|
|
58
|
-
throw new OpenApiMcpError(
|
|
58
|
+
throw new OpenApiMcpError('SCHEMA_ERROR', `Endpoint ID collision for '${endpointId}'`, {
|
|
59
59
|
path,
|
|
60
|
-
method
|
|
60
|
+
method,
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
63
|
endpointById.set(endpointId, endpoint);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpointIndex.js","sourceRoot":"","sources":["../../src/openapi/endpointIndex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,MAAM,OAAO,GAAiB;IAC5B,KAAK;IACL,KAAK;IACL,MAAM;IACN,QAAQ;IACR,SAAS;IACT,MAAM;IACN,OAAO;IACP,OAAO;CACR,CAAC;AAEF,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAA4B;IAI7D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE7C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC;gBACpB,UAAU,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"endpointIndex.js","sourceRoot":"","sources":["../../src/openapi/endpointIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +1,39 @@
|
|
|
1
|
-
import { OpenApiMcpError } from
|
|
1
|
+
import { OpenApiMcpError } from '../errors.js';
|
|
2
2
|
export function getByJsonPointer(root, pointer) {
|
|
3
|
-
if (!pointer || pointer ===
|
|
3
|
+
if (!pointer || pointer === '') {
|
|
4
4
|
return root;
|
|
5
5
|
}
|
|
6
|
-
if (!pointer.startsWith(
|
|
7
|
-
throw new OpenApiMcpError(
|
|
6
|
+
if (!pointer.startsWith('/')) {
|
|
7
|
+
throw new OpenApiMcpError('SCHEMA_ERROR', "JSON pointer must start with '/'", { pointer });
|
|
8
8
|
}
|
|
9
9
|
const tokens = pointer
|
|
10
10
|
.slice(1)
|
|
11
|
-
.split(
|
|
12
|
-
.map((part) => part.replace(/~1/g,
|
|
11
|
+
.split('/')
|
|
12
|
+
.map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'));
|
|
13
13
|
let cursor = root;
|
|
14
14
|
for (const token of tokens) {
|
|
15
15
|
if (Array.isArray(cursor)) {
|
|
16
16
|
const idx = Number.parseInt(token, 10);
|
|
17
17
|
if (!Number.isInteger(idx) || idx < 0 || idx >= cursor.length) {
|
|
18
|
-
throw new OpenApiMcpError(
|
|
18
|
+
throw new OpenApiMcpError('SCHEMA_ERROR', 'JSON pointer index out of bounds', {
|
|
19
|
+
pointer,
|
|
20
|
+
token,
|
|
21
|
+
});
|
|
19
22
|
}
|
|
20
23
|
cursor = cursor[idx];
|
|
21
24
|
continue;
|
|
22
25
|
}
|
|
23
|
-
if (!cursor || typeof cursor !==
|
|
24
|
-
throw new OpenApiMcpError(
|
|
26
|
+
if (!cursor || typeof cursor !== 'object') {
|
|
27
|
+
throw new OpenApiMcpError('SCHEMA_ERROR', 'JSON pointer target does not exist', {
|
|
25
28
|
pointer,
|
|
26
|
-
token
|
|
29
|
+
token,
|
|
27
30
|
});
|
|
28
31
|
}
|
|
29
32
|
const object = cursor;
|
|
30
33
|
if (!(token in object)) {
|
|
31
|
-
throw new OpenApiMcpError(
|
|
34
|
+
throw new OpenApiMcpError('SCHEMA_ERROR', 'JSON pointer target does not exist', {
|
|
32
35
|
pointer,
|
|
33
|
-
token
|
|
36
|
+
token,
|
|
34
37
|
});
|
|
35
38
|
}
|
|
36
39
|
cursor = object[token];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonPointer.js","sourceRoot":"","sources":["../../src/openapi/jsonPointer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,gBAAgB,CAAC,IAAa,EAAE,OAAgB;IAC9D,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,eAAe,
|
|
1
|
+
{"version":3,"file":"jsonPointer.js","sourceRoot":"","sources":["../../src/openapi/jsonPointer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,gBAAgB,CAAC,IAAa,EAAE,OAAgB;IAC9D,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,eAAe,CACvB,cAAc,EACd,kCAAkC,EAClC,EAAE,OAAO,EAAE,CACZ,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,OAAO;SACnB,KAAK,CAAC,CAAC,CAAC;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAE/D,IAAI,MAAM,GAAY,IAAI,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC9D,MAAM,IAAI,eAAe,CACvB,cAAc,EACd,kCAAkC,EAClC;oBACE,OAAO;oBACP,KAAK;iBACN,CACF,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,eAAe,CACvB,cAAc,EACd,oCAAoC,EACpC;gBACE,OAAO;gBACP,KAAK;aACN,CACF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAiC,CAAC;QACjD,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,eAAe,CACvB,cAAc,EACd,oCAAoC,EACpC;gBACE,OAAO;gBACP,KAAK;aACN,CACF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { ApiRegistry, RootConfig } from
|
|
1
|
+
import type { ApiRegistry, RootConfig } from '../types.js';
|
|
2
2
|
export declare function loadApiRegistry(config: RootConfig, env?: NodeJS.ProcessEnv): Promise<ApiRegistry>;
|
package/dist/openapi/loadSpec.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import SwaggerParser from
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import SwaggerParser from '@apidevtools/swagger-parser';
|
|
2
|
+
import * as swagger2openapi from 'swagger2openapi';
|
|
3
|
+
import { readApiBaseUrl } from '../auth/env.js';
|
|
4
|
+
import { OpenApiMcpError } from '../errors.js';
|
|
5
|
+
import { buildEndpointIndex } from './endpointIndex.js';
|
|
5
6
|
function assertSupportedOpenApiVersion(version) {
|
|
6
7
|
const match = /^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/.exec(version);
|
|
7
8
|
if (!match) {
|
|
8
|
-
throw new OpenApiMcpError(
|
|
9
|
+
throw new OpenApiMcpError('SCHEMA_ERROR', `Unsupported OpenAPI version format: ${version}`);
|
|
9
10
|
}
|
|
10
11
|
const major = Number(match[1]);
|
|
11
12
|
if (major < 3) {
|
|
12
|
-
throw new OpenApiMcpError(
|
|
13
|
+
throw new OpenApiMcpError('SCHEMA_ERROR', `OpenAPI version must be 3.x (received ${version})`);
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
function resolveBaseUrl(api, document, env) {
|
|
@@ -17,30 +18,58 @@ function resolveBaseUrl(api, document, env) {
|
|
|
17
18
|
const schemaBaseUrl = document.servers?.[0]?.url;
|
|
18
19
|
const baseUrl = envBaseUrl ?? api.baseUrl ?? schemaBaseUrl;
|
|
19
20
|
if (!baseUrl) {
|
|
20
|
-
throw new OpenApiMcpError(
|
|
21
|
-
resolutionOrder: [
|
|
21
|
+
throw new OpenApiMcpError('CONFIG_ERROR', `No base URL found for API '${api.name}'`, {
|
|
22
|
+
resolutionOrder: [
|
|
23
|
+
'env:<API>_BASE_URL',
|
|
24
|
+
'config.baseUrl',
|
|
25
|
+
'openapi.servers[0].url',
|
|
26
|
+
],
|
|
22
27
|
});
|
|
23
28
|
}
|
|
24
29
|
return baseUrl;
|
|
25
30
|
}
|
|
26
31
|
async function loadSingleApi(api, env) {
|
|
32
|
+
const specSource = api.specUrl ?? api.specPath;
|
|
33
|
+
if (!specSource) {
|
|
34
|
+
throw new OpenApiMcpError('CONFIG_ERROR', `No spec path or URL provided for API '${api.name}'`);
|
|
35
|
+
}
|
|
27
36
|
let parsed;
|
|
28
37
|
try {
|
|
29
|
-
parsed = await SwaggerParser.dereference(
|
|
38
|
+
parsed = await SwaggerParser.dereference(specSource);
|
|
30
39
|
}
|
|
31
40
|
catch (error) {
|
|
32
|
-
throw new OpenApiMcpError(
|
|
41
|
+
throw new OpenApiMcpError('SCHEMA_ERROR', `Failed to parse OpenAPI schema for '${api.name}'`, {
|
|
33
42
|
apiName: api.name,
|
|
34
|
-
|
|
35
|
-
cause: error instanceof Error ? error.message : String(error)
|
|
43
|
+
specSource,
|
|
44
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
36
45
|
});
|
|
37
46
|
}
|
|
47
|
+
if (parsed &&
|
|
48
|
+
typeof parsed === 'object' &&
|
|
49
|
+
'swagger' in parsed &&
|
|
50
|
+
parsed.swagger === '2.0') {
|
|
51
|
+
try {
|
|
52
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
|
|
53
|
+
const converted = await swagger2openapi.convertObj(parsed, {
|
|
54
|
+
patch: true,
|
|
55
|
+
warnOnly: true,
|
|
56
|
+
});
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
58
|
+
parsed = converted.openapi;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
throw new OpenApiMcpError('SCHEMA_ERROR', `Failed to convert Swagger 2.0 to OpenAPI 3.0 for '${api.name}'`, {
|
|
62
|
+
apiName: api.name,
|
|
63
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
38
67
|
const document = parsed;
|
|
39
|
-
if (!document || typeof document !==
|
|
40
|
-
throw new OpenApiMcpError(
|
|
68
|
+
if (!document || typeof document !== 'object') {
|
|
69
|
+
throw new OpenApiMcpError('SCHEMA_ERROR', `Invalid OpenAPI document for '${api.name}'`);
|
|
41
70
|
}
|
|
42
71
|
if (!document.openapi) {
|
|
43
|
-
throw new OpenApiMcpError(
|
|
72
|
+
throw new OpenApiMcpError('SCHEMA_ERROR', `OpenAPI 'openapi' field is missing in '${api.name}'`);
|
|
44
73
|
}
|
|
45
74
|
assertSupportedOpenApiVersion(document.openapi);
|
|
46
75
|
const { endpoints, endpointById } = buildEndpointIndex(document);
|
|
@@ -48,12 +77,12 @@ async function loadSingleApi(api, env) {
|
|
|
48
77
|
const authSchemeNames = Object.keys(document.components?.securitySchemes ?? {});
|
|
49
78
|
return {
|
|
50
79
|
config: api,
|
|
51
|
-
schemaPath:
|
|
80
|
+
schemaPath: specSource,
|
|
52
81
|
schema: document,
|
|
53
82
|
baseUrl,
|
|
54
83
|
endpoints,
|
|
55
84
|
endpointById,
|
|
56
|
-
authSchemeNames
|
|
85
|
+
authSchemeNames,
|
|
57
86
|
};
|
|
58
87
|
}
|
|
59
88
|
export async function loadApiRegistry(config, env = process.env) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadSpec.js","sourceRoot":"","sources":["../../src/openapi/loadSpec.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"loadSpec.js","sourceRoot":"","sources":["../../src/openapi/loadSpec.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
|
-
import type { OpenAPIV3 } from
|
|
1
|
+
import type { OpenAPIV3 } from 'openapi-types';
|
|
2
|
+
export type McpFileDescriptor = {
|
|
3
|
+
name?: string;
|
|
4
|
+
contentType?: string;
|
|
5
|
+
} & ({
|
|
6
|
+
base64: string;
|
|
7
|
+
} | {
|
|
8
|
+
text: string;
|
|
9
|
+
} | {
|
|
10
|
+
filePath: string;
|
|
11
|
+
});
|
|
12
|
+
export declare function isMcpFileDescriptor(value: unknown): value is McpFileDescriptor;
|
|
2
13
|
export interface ApiOauth2Config {
|
|
3
14
|
tokenUrlOverride?: string;
|
|
4
15
|
scopes?: string[];
|
|
5
|
-
tokenEndpointAuthMethod?:
|
|
16
|
+
tokenEndpointAuthMethod?: 'client_secret_basic' | 'client_secret_post';
|
|
6
17
|
}
|
|
7
18
|
export interface Retry429Config {
|
|
8
19
|
maxRetries?: number;
|
|
@@ -13,7 +24,8 @@ export interface Retry429Config {
|
|
|
13
24
|
}
|
|
14
25
|
export interface ApiConfig {
|
|
15
26
|
name: string;
|
|
16
|
-
specPath
|
|
27
|
+
specPath?: string;
|
|
28
|
+
specUrl?: string;
|
|
17
29
|
baseUrl?: string;
|
|
18
30
|
timeoutMs?: number;
|
|
19
31
|
headers?: Record<string, string>;
|
|
@@ -24,7 +36,7 @@ export interface RootConfig {
|
|
|
24
36
|
version: 1;
|
|
25
37
|
apis: ApiConfig[];
|
|
26
38
|
}
|
|
27
|
-
export type HttpMethod =
|
|
39
|
+
export type HttpMethod = 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch' | 'trace';
|
|
28
40
|
export interface EndpointDefinition {
|
|
29
41
|
endpointId: string;
|
|
30
42
|
method: HttpMethod;
|
|
@@ -37,18 +49,26 @@ export interface EndpointDefinition {
|
|
|
37
49
|
pathItem: OpenAPIV3.PathItemObject;
|
|
38
50
|
}
|
|
39
51
|
export interface ResolvedApiKeyAuth {
|
|
40
|
-
type:
|
|
52
|
+
type: 'apiKey';
|
|
41
53
|
schemeName: string;
|
|
42
|
-
in:
|
|
54
|
+
in: 'query' | 'header' | 'cookie';
|
|
43
55
|
name: string;
|
|
44
56
|
value: string;
|
|
45
57
|
}
|
|
46
58
|
export interface ResolvedOAuth2Auth {
|
|
47
|
-
type:
|
|
59
|
+
type: 'oauth2';
|
|
48
60
|
schemeName: string;
|
|
49
61
|
token: string;
|
|
50
62
|
}
|
|
51
|
-
export
|
|
63
|
+
export interface ResolvedHttpAuth {
|
|
64
|
+
type: 'http';
|
|
65
|
+
schemeName: string;
|
|
66
|
+
scheme: 'bearer' | 'basic';
|
|
67
|
+
token?: string;
|
|
68
|
+
username?: string;
|
|
69
|
+
password?: string;
|
|
70
|
+
}
|
|
71
|
+
export type ResolvedAuthScheme = ResolvedApiKeyAuth | ResolvedOAuth2Auth | ResolvedHttpAuth;
|
|
52
72
|
export interface ResolvedAuthResult {
|
|
53
73
|
authUsed: string[];
|
|
54
74
|
schemes: ResolvedAuthScheme[];
|
|
@@ -88,7 +108,7 @@ export interface RequestExecutionResult {
|
|
|
88
108
|
response: {
|
|
89
109
|
status: number;
|
|
90
110
|
headers: Record<string, string>;
|
|
91
|
-
bodyType:
|
|
111
|
+
bodyType: 'json' | 'text' | 'binary' | 'empty';
|
|
92
112
|
bodyJson?: unknown;
|
|
93
113
|
bodyText?: string;
|
|
94
114
|
bodyBase64?: string;
|
package/dist/types.js
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export function isMcpFileDescriptor(value) {
|
|
2
|
+
if (typeof value !== 'object' || value === null) {
|
|
3
|
+
return false;
|
|
4
|
+
}
|
|
5
|
+
const obj = value;
|
|
6
|
+
return (typeof obj.base64 === 'string' ||
|
|
7
|
+
typeof obj.text === 'string' ||
|
|
8
|
+
typeof obj.filePath === 'string');
|
|
9
|
+
}
|
|
2
10
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,mBAAmB,CACjC,KAAc;IAEd,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,CACL,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAC9B,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CACjC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openapi-dynamic-mcp",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "MCP stdio server for OpenAPI APIs",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -22,8 +22,12 @@
|
|
|
22
22
|
"scripts": {
|
|
23
23
|
"build": "tsc -p tsconfig.json",
|
|
24
24
|
"dev": "tsx src/cli.ts",
|
|
25
|
+
"format": "prettier --write .",
|
|
26
|
+
"lint": "eslint .",
|
|
27
|
+
"lint:fix": "eslint . --fix",
|
|
25
28
|
"test": "vitest run",
|
|
26
|
-
"test:watch": "vitest"
|
|
29
|
+
"test:watch": "vitest",
|
|
30
|
+
"prepare": "husky"
|
|
27
31
|
},
|
|
28
32
|
"engines": {
|
|
29
33
|
"node": ">=20"
|
|
@@ -39,14 +43,24 @@
|
|
|
39
43
|
"@modelcontextprotocol/sdk": "^1.17.3",
|
|
40
44
|
"oauth4webapi": "^3.8.5",
|
|
41
45
|
"openapi-types": "^12.1.3",
|
|
46
|
+
"swagger2openapi": "^7.0.8",
|
|
42
47
|
"yaml": "^2.8.1",
|
|
43
48
|
"zod": "^3.24.1"
|
|
44
49
|
},
|
|
45
50
|
"devDependencies": {
|
|
51
|
+
"@eslint/js": "^10.0.1",
|
|
46
52
|
"@types/node": "^22.13.8",
|
|
53
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
54
|
+
"eslint": "^10.0.2",
|
|
55
|
+
"eslint-config-prettier": "^10.1.8",
|
|
56
|
+
"globals": "^17.3.0",
|
|
57
|
+
"husky": "^9.1.7",
|
|
58
|
+
"lint-staged": "^16.2.7",
|
|
47
59
|
"nock": "^14.0.10",
|
|
60
|
+
"prettier": "^3.8.1",
|
|
48
61
|
"tsx": "^4.20.5",
|
|
49
62
|
"typescript": "^5.8.2",
|
|
63
|
+
"typescript-eslint": "^8.56.1",
|
|
50
64
|
"vitest": "^3.2.4"
|
|
51
65
|
}
|
|
52
66
|
}
|