openapi-dynamic-mcp 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.
- package/LICENSE +21 -0
- package/README.md +247 -0
- package/dist/auth/env.d.ts +14 -0
- package/dist/auth/env.js +64 -0
- package/dist/auth/env.js.map +1 -0
- package/dist/auth/oauthClient.d.ts +12 -0
- package/dist/auth/oauthClient.js +55 -0
- package/dist/auth/oauthClient.js.map +1 -0
- package/dist/auth/resolveAuth.d.ts +10 -0
- package/dist/auth/resolveAuth.js +118 -0
- package/dist/auth/resolveAuth.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +50 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/loadConfig.d.ts +2 -0
- package/dist/config/loadConfig.js +89 -0
- package/dist/config/loadConfig.js.map +1 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.js +31 -0
- package/dist/errors.js.map +1 -0
- package/dist/http/requestExecutor.d.ts +19 -0
- package/dist/http/requestExecutor.js +342 -0
- package/dist/http/requestExecutor.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/context.d.ts +7 -0
- package/dist/mcp/context.js +2 -0
- package/dist/mcp/context.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +125 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/common.d.ts +16 -0
- package/dist/mcp/tools/common.js +60 -0
- package/dist/mcp/tools/common.js.map +1 -0
- package/dist/mcp/tools/getApiEndpoint.d.ts +3 -0
- package/dist/mcp/tools/getApiEndpoint.js +59 -0
- package/dist/mcp/tools/getApiEndpoint.js.map +1 -0
- package/dist/mcp/tools/getApiSchema.d.ts +3 -0
- package/dist/mcp/tools/getApiSchema.js +27 -0
- package/dist/mcp/tools/getApiSchema.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +5 -0
- package/dist/mcp/tools/index.js +6 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/listApiEndpoints.d.ts +3 -0
- package/dist/mcp/tools/listApiEndpoints.js +55 -0
- package/dist/mcp/tools/listApiEndpoints.js.map +1 -0
- package/dist/mcp/tools/listApis.d.ts +3 -0
- package/dist/mcp/tools/listApis.js +18 -0
- package/dist/mcp/tools/listApis.js.map +1 -0
- package/dist/mcp/tools/makeEndpointRequest.d.ts +3 -0
- package/dist/mcp/tools/makeEndpointRequest.js +63 -0
- package/dist/mcp/tools/makeEndpointRequest.js.map +1 -0
- package/dist/openapi/endpointIndex.d.ts +6 -0
- package/dist/openapi/endpointIndex.js +75 -0
- package/dist/openapi/endpointIndex.js.map +1 -0
- package/dist/openapi/jsonPointer.d.ts +1 -0
- package/dist/openapi/jsonPointer.js +40 -0
- package/dist/openapi/jsonPointer.js.map +1 -0
- package/dist/openapi/loadSpec.d.ts +2 -0
- package/dist/openapi/loadSpec.js +67 -0
- package/dist/openapi/loadSpec.js.map +1 -0
- package/dist/types.d.ts +98 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { OpenApiMcpError } from "../errors.js";
|
|
2
|
+
export function getByJsonPointer(root, pointer) {
|
|
3
|
+
if (!pointer || pointer === "") {
|
|
4
|
+
return root;
|
|
5
|
+
}
|
|
6
|
+
if (!pointer.startsWith("/")) {
|
|
7
|
+
throw new OpenApiMcpError("SCHEMA_ERROR", "JSON pointer must start with '/'", { pointer });
|
|
8
|
+
}
|
|
9
|
+
const tokens = pointer
|
|
10
|
+
.slice(1)
|
|
11
|
+
.split("/")
|
|
12
|
+
.map((part) => part.replace(/~1/g, "/").replace(/~0/g, "~"));
|
|
13
|
+
let cursor = root;
|
|
14
|
+
for (const token of tokens) {
|
|
15
|
+
if (Array.isArray(cursor)) {
|
|
16
|
+
const idx = Number.parseInt(token, 10);
|
|
17
|
+
if (!Number.isInteger(idx) || idx < 0 || idx >= cursor.length) {
|
|
18
|
+
throw new OpenApiMcpError("SCHEMA_ERROR", "JSON pointer index out of bounds", { pointer, token });
|
|
19
|
+
}
|
|
20
|
+
cursor = cursor[idx];
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (!cursor || typeof cursor !== "object") {
|
|
24
|
+
throw new OpenApiMcpError("SCHEMA_ERROR", "JSON pointer target does not exist", {
|
|
25
|
+
pointer,
|
|
26
|
+
token
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const object = cursor;
|
|
30
|
+
if (!(token in object)) {
|
|
31
|
+
throw new OpenApiMcpError("SCHEMA_ERROR", "JSON pointer target does not exist", {
|
|
32
|
+
pointer,
|
|
33
|
+
token
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
cursor = object[token];
|
|
37
|
+
}
|
|
38
|
+
return cursor;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=jsonPointer.js.map
|
|
@@ -0,0 +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,CAAC,cAAc,EAAE,kCAAkC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7F,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,CAAC,cAAc,EAAE,kCAAkC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACpG,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,CAAC,cAAc,EAAE,oCAAoC,EAAE;gBAC9E,OAAO;gBACP,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,MAAiC,CAAC;QACjD,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,eAAe,CAAC,cAAc,EAAE,oCAAoC,EAAE;gBAC9E,OAAO;gBACP,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import SwaggerParser from "@apidevtools/swagger-parser";
|
|
2
|
+
import { readApiBaseUrl } from "../auth/env.js";
|
|
3
|
+
import { OpenApiMcpError } from "../errors.js";
|
|
4
|
+
import { buildEndpointIndex } from "./endpointIndex.js";
|
|
5
|
+
function assertSupportedOpenApiVersion(version) {
|
|
6
|
+
const match = /^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/.exec(version);
|
|
7
|
+
if (!match) {
|
|
8
|
+
throw new OpenApiMcpError("SCHEMA_ERROR", `Unsupported OpenAPI version format: ${version}`);
|
|
9
|
+
}
|
|
10
|
+
const major = Number(match[1]);
|
|
11
|
+
if (major < 3) {
|
|
12
|
+
throw new OpenApiMcpError("SCHEMA_ERROR", `OpenAPI version must be 3.x (received ${version})`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function resolveBaseUrl(api, document, env) {
|
|
16
|
+
const envBaseUrl = readApiBaseUrl(api.name, env);
|
|
17
|
+
const schemaBaseUrl = document.servers?.[0]?.url;
|
|
18
|
+
const baseUrl = envBaseUrl ?? api.baseUrl ?? schemaBaseUrl;
|
|
19
|
+
if (!baseUrl) {
|
|
20
|
+
throw new OpenApiMcpError("CONFIG_ERROR", `No base URL found for API '${api.name}'`, {
|
|
21
|
+
resolutionOrder: ["env:<API>_BASE_URL", "config.baseUrl", "openapi.servers[0].url"]
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return baseUrl;
|
|
25
|
+
}
|
|
26
|
+
async function loadSingleApi(api, env) {
|
|
27
|
+
let parsed;
|
|
28
|
+
try {
|
|
29
|
+
parsed = await SwaggerParser.dereference(api.specPath);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
throw new OpenApiMcpError("SCHEMA_ERROR", `Failed to parse OpenAPI schema for '${api.name}'`, {
|
|
33
|
+
apiName: api.name,
|
|
34
|
+
specPath: api.specPath,
|
|
35
|
+
cause: error instanceof Error ? error.message : String(error)
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const document = parsed;
|
|
39
|
+
if (!document || typeof document !== "object") {
|
|
40
|
+
throw new OpenApiMcpError("SCHEMA_ERROR", `Invalid OpenAPI document for '${api.name}'`);
|
|
41
|
+
}
|
|
42
|
+
if (!document.openapi) {
|
|
43
|
+
throw new OpenApiMcpError("SCHEMA_ERROR", `OpenAPI 'openapi' field is missing in '${api.name}'`);
|
|
44
|
+
}
|
|
45
|
+
assertSupportedOpenApiVersion(document.openapi);
|
|
46
|
+
const { endpoints, endpointById } = buildEndpointIndex(document);
|
|
47
|
+
const baseUrl = resolveBaseUrl(api, document, env);
|
|
48
|
+
const authSchemeNames = Object.keys(document.components?.securitySchemes ?? {});
|
|
49
|
+
return {
|
|
50
|
+
config: api,
|
|
51
|
+
schemaPath: api.specPath,
|
|
52
|
+
schema: document,
|
|
53
|
+
baseUrl,
|
|
54
|
+
endpoints,
|
|
55
|
+
endpointById,
|
|
56
|
+
authSchemeNames
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export async function loadApiRegistry(config, env = process.env) {
|
|
60
|
+
const byName = new Map();
|
|
61
|
+
for (const api of config.apis) {
|
|
62
|
+
const loadedApi = await loadSingleApi(api, env);
|
|
63
|
+
byName.set(api.name.toLowerCase(), loadedApi);
|
|
64
|
+
}
|
|
65
|
+
return { byName };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=loadSpec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadSpec.js","sourceRoot":"","sources":["../../src/openapi/loadSpec.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { OpenAPIV3 } from "openapi-types";
|
|
2
|
+
export interface ApiOauth2Config {
|
|
3
|
+
tokenUrlOverride?: string;
|
|
4
|
+
scopes?: string[];
|
|
5
|
+
tokenEndpointAuthMethod?: "client_secret_basic" | "client_secret_post";
|
|
6
|
+
}
|
|
7
|
+
export interface Retry429Config {
|
|
8
|
+
maxRetries?: number;
|
|
9
|
+
baseDelayMs?: number;
|
|
10
|
+
maxDelayMs?: number;
|
|
11
|
+
jitterRatio?: number;
|
|
12
|
+
respectRetryAfter?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface ApiConfig {
|
|
15
|
+
name: string;
|
|
16
|
+
specPath: string;
|
|
17
|
+
baseUrl?: string;
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
headers?: Record<string, string>;
|
|
20
|
+
oauth2?: ApiOauth2Config;
|
|
21
|
+
retry429?: Retry429Config;
|
|
22
|
+
}
|
|
23
|
+
export interface RootConfig {
|
|
24
|
+
version: 1;
|
|
25
|
+
apis: ApiConfig[];
|
|
26
|
+
}
|
|
27
|
+
export type HttpMethod = "get" | "put" | "post" | "delete" | "options" | "head" | "patch" | "trace";
|
|
28
|
+
export interface EndpointDefinition {
|
|
29
|
+
endpointId: string;
|
|
30
|
+
method: HttpMethod;
|
|
31
|
+
path: string;
|
|
32
|
+
operationId?: string;
|
|
33
|
+
summary?: string;
|
|
34
|
+
description?: string;
|
|
35
|
+
tags?: string[];
|
|
36
|
+
operation: OpenAPIV3.OperationObject;
|
|
37
|
+
pathItem: OpenAPIV3.PathItemObject;
|
|
38
|
+
}
|
|
39
|
+
export interface ResolvedApiKeyAuth {
|
|
40
|
+
type: "apiKey";
|
|
41
|
+
schemeName: string;
|
|
42
|
+
in: "query" | "header" | "cookie";
|
|
43
|
+
name: string;
|
|
44
|
+
value: string;
|
|
45
|
+
}
|
|
46
|
+
export interface ResolvedOAuth2Auth {
|
|
47
|
+
type: "oauth2";
|
|
48
|
+
schemeName: string;
|
|
49
|
+
token: string;
|
|
50
|
+
}
|
|
51
|
+
export type ResolvedAuthScheme = ResolvedApiKeyAuth | ResolvedOAuth2Auth;
|
|
52
|
+
export interface ResolvedAuthResult {
|
|
53
|
+
authUsed: string[];
|
|
54
|
+
schemes: ResolvedAuthScheme[];
|
|
55
|
+
}
|
|
56
|
+
export interface LoadedApi {
|
|
57
|
+
config: ApiConfig;
|
|
58
|
+
schemaPath: string;
|
|
59
|
+
schema: OpenAPIV3.Document;
|
|
60
|
+
baseUrl: string;
|
|
61
|
+
endpoints: EndpointDefinition[];
|
|
62
|
+
endpointById: Map<string, EndpointDefinition>;
|
|
63
|
+
authSchemeNames: string[];
|
|
64
|
+
}
|
|
65
|
+
export interface ApiRegistry {
|
|
66
|
+
byName: Map<string, LoadedApi>;
|
|
67
|
+
}
|
|
68
|
+
export interface MakeEndpointRequestInput {
|
|
69
|
+
apiName: string;
|
|
70
|
+
endpointId: string;
|
|
71
|
+
pathParams?: Record<string, unknown>;
|
|
72
|
+
query?: Record<string, unknown>;
|
|
73
|
+
headers?: Record<string, string>;
|
|
74
|
+
cookies?: Record<string, string>;
|
|
75
|
+
body?: unknown;
|
|
76
|
+
contentType?: string;
|
|
77
|
+
accept?: string;
|
|
78
|
+
timeoutMs?: number;
|
|
79
|
+
retry429?: Retry429Config;
|
|
80
|
+
}
|
|
81
|
+
export interface RequestExecutionResult {
|
|
82
|
+
request: {
|
|
83
|
+
url: string;
|
|
84
|
+
method: string;
|
|
85
|
+
headersRedacted: Record<string, string>;
|
|
86
|
+
endpointId: string;
|
|
87
|
+
};
|
|
88
|
+
response: {
|
|
89
|
+
status: number;
|
|
90
|
+
headers: Record<string, string>;
|
|
91
|
+
bodyType: "json" | "text" | "binary" | "empty";
|
|
92
|
+
bodyJson?: unknown;
|
|
93
|
+
bodyText?: string;
|
|
94
|
+
bodyBase64?: string;
|
|
95
|
+
};
|
|
96
|
+
timingMs: number;
|
|
97
|
+
authUsed: string[];
|
|
98
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "openapi-dynamic-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP stdio server for OpenAPI APIs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"openapi-dynamic-mcp": "dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/mayorandrew/openapi-dynamic-mcp.git"
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc -p tsconfig.json",
|
|
23
|
+
"dev": "tsx src/cli.ts",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest"
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=20"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"mcp",
|
|
32
|
+
"openapi",
|
|
33
|
+
"stdio"
|
|
34
|
+
],
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@apidevtools/swagger-parser": "^12.1.0",
|
|
38
|
+
"@modelcontextprotocol/sdk": "^1.17.3",
|
|
39
|
+
"oauth4webapi": "^3.8.5",
|
|
40
|
+
"openapi-types": "^12.1.3",
|
|
41
|
+
"yaml": "^2.8.1",
|
|
42
|
+
"zod": "^3.24.1"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^22.13.8",
|
|
46
|
+
"nock": "^14.0.10",
|
|
47
|
+
"tsx": "^4.20.5",
|
|
48
|
+
"typescript": "^5.8.2",
|
|
49
|
+
"vitest": "^3.2.4"
|
|
50
|
+
}
|
|
51
|
+
}
|