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.
Files changed (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +247 -0
  3. package/dist/auth/env.d.ts +14 -0
  4. package/dist/auth/env.js +64 -0
  5. package/dist/auth/env.js.map +1 -0
  6. package/dist/auth/oauthClient.d.ts +12 -0
  7. package/dist/auth/oauthClient.js +55 -0
  8. package/dist/auth/oauthClient.js.map +1 -0
  9. package/dist/auth/resolveAuth.d.ts +10 -0
  10. package/dist/auth/resolveAuth.js +118 -0
  11. package/dist/auth/resolveAuth.js.map +1 -0
  12. package/dist/cli.d.ts +2 -0
  13. package/dist/cli.js +50 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config/loadConfig.d.ts +2 -0
  16. package/dist/config/loadConfig.js +89 -0
  17. package/dist/config/loadConfig.js.map +1 -0
  18. package/dist/errors.d.ts +11 -0
  19. package/dist/errors.js +31 -0
  20. package/dist/errors.js.map +1 -0
  21. package/dist/http/requestExecutor.d.ts +19 -0
  22. package/dist/http/requestExecutor.js +342 -0
  23. package/dist/http/requestExecutor.js.map +1 -0
  24. package/dist/index.d.ts +7 -0
  25. package/dist/index.js +7 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/mcp/context.d.ts +7 -0
  28. package/dist/mcp/context.js +2 -0
  29. package/dist/mcp/context.js.map +1 -0
  30. package/dist/mcp/server.d.ts +2 -0
  31. package/dist/mcp/server.js +125 -0
  32. package/dist/mcp/server.js.map +1 -0
  33. package/dist/mcp/tools/common.d.ts +16 -0
  34. package/dist/mcp/tools/common.js +60 -0
  35. package/dist/mcp/tools/common.js.map +1 -0
  36. package/dist/mcp/tools/getApiEndpoint.d.ts +3 -0
  37. package/dist/mcp/tools/getApiEndpoint.js +59 -0
  38. package/dist/mcp/tools/getApiEndpoint.js.map +1 -0
  39. package/dist/mcp/tools/getApiSchema.d.ts +3 -0
  40. package/dist/mcp/tools/getApiSchema.js +27 -0
  41. package/dist/mcp/tools/getApiSchema.js.map +1 -0
  42. package/dist/mcp/tools/index.d.ts +5 -0
  43. package/dist/mcp/tools/index.js +6 -0
  44. package/dist/mcp/tools/index.js.map +1 -0
  45. package/dist/mcp/tools/listApiEndpoints.d.ts +3 -0
  46. package/dist/mcp/tools/listApiEndpoints.js +55 -0
  47. package/dist/mcp/tools/listApiEndpoints.js.map +1 -0
  48. package/dist/mcp/tools/listApis.d.ts +3 -0
  49. package/dist/mcp/tools/listApis.js +18 -0
  50. package/dist/mcp/tools/listApis.js.map +1 -0
  51. package/dist/mcp/tools/makeEndpointRequest.d.ts +3 -0
  52. package/dist/mcp/tools/makeEndpointRequest.js +63 -0
  53. package/dist/mcp/tools/makeEndpointRequest.js.map +1 -0
  54. package/dist/openapi/endpointIndex.d.ts +6 -0
  55. package/dist/openapi/endpointIndex.js +75 -0
  56. package/dist/openapi/endpointIndex.js.map +1 -0
  57. package/dist/openapi/jsonPointer.d.ts +1 -0
  58. package/dist/openapi/jsonPointer.js +40 -0
  59. package/dist/openapi/jsonPointer.js.map +1 -0
  60. package/dist/openapi/loadSpec.d.ts +2 -0
  61. package/dist/openapi/loadSpec.js +67 -0
  62. package/dist/openapi/loadSpec.js.map +1 -0
  63. package/dist/types.d.ts +98 -0
  64. package/dist/types.js +2 -0
  65. package/dist/types.js.map +1 -0
  66. package/package.json +51 -0
@@ -0,0 +1,89 @@
1
+ import { access, readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { parse as parseYaml } from "yaml";
4
+ import { z } from "zod";
5
+ import { normalizeEnvSegment } from "../auth/env.js";
6
+ import { OpenApiMcpError } from "../errors.js";
7
+ const retry429Schema = z.object({
8
+ maxRetries: z.number().int().min(0).optional(),
9
+ baseDelayMs: z.number().int().positive().optional(),
10
+ maxDelayMs: z.number().int().positive().optional(),
11
+ jitterRatio: z.number().min(0).max(1).optional(),
12
+ respectRetryAfter: z.boolean().optional()
13
+ });
14
+ const apiSchema = z.object({
15
+ name: z.string().min(1),
16
+ specPath: z.string().min(1),
17
+ baseUrl: z.string().url().optional(),
18
+ timeoutMs: z.number().int().positive().optional(),
19
+ headers: z.record(z.string()).optional(),
20
+ oauth2: z
21
+ .object({
22
+ tokenUrlOverride: z.string().url().optional(),
23
+ scopes: z.array(z.string().min(1)).optional(),
24
+ tokenEndpointAuthMethod: z
25
+ .enum(["client_secret_basic", "client_secret_post"])
26
+ .optional()
27
+ })
28
+ .optional(),
29
+ retry429: retry429Schema.optional()
30
+ });
31
+ const rootSchema = z.object({
32
+ version: z.literal(1),
33
+ apis: z.array(apiSchema).min(1)
34
+ });
35
+ export async function loadConfig(configPath) {
36
+ let raw;
37
+ try {
38
+ raw = await readFile(configPath, "utf8");
39
+ }
40
+ catch (error) {
41
+ throw new OpenApiMcpError("CONFIG_ERROR", `Cannot read config file: ${configPath}`, {
42
+ cause: error instanceof Error ? error.message : String(error)
43
+ });
44
+ }
45
+ let parsedYaml;
46
+ try {
47
+ parsedYaml = parseYaml(raw);
48
+ }
49
+ catch (error) {
50
+ throw new OpenApiMcpError("CONFIG_ERROR", `Invalid YAML in config: ${configPath}`, {
51
+ cause: error instanceof Error ? error.message : String(error)
52
+ });
53
+ }
54
+ const parsed = rootSchema.safeParse(parsedYaml);
55
+ if (!parsed.success) {
56
+ throw new OpenApiMcpError("CONFIG_ERROR", "Config validation failed", {
57
+ issues: parsed.error.issues
58
+ });
59
+ }
60
+ const resolvedApis = [];
61
+ const seenNames = new Set();
62
+ const configDir = path.dirname(path.resolve(configPath));
63
+ for (const api of parsed.data.apis) {
64
+ const normalized = normalizeEnvSegment(api.name).toLowerCase();
65
+ if (seenNames.has(normalized)) {
66
+ throw new OpenApiMcpError("CONFIG_ERROR", `Duplicate API name: ${api.name}`);
67
+ }
68
+ seenNames.add(normalized);
69
+ const resolvedSpecPath = path.resolve(configDir, api.specPath);
70
+ try {
71
+ await access(resolvedSpecPath);
72
+ }
73
+ catch {
74
+ throw new OpenApiMcpError("CONFIG_ERROR", `OpenAPI schema file not found: ${resolvedSpecPath}`, {
75
+ apiName: api.name
76
+ });
77
+ }
78
+ resolvedApis.push({
79
+ ...api,
80
+ specPath: resolvedSpecPath,
81
+ timeoutMs: api.timeoutMs ?? 30000
82
+ });
83
+ }
84
+ return {
85
+ version: 1,
86
+ apis: resolvedApis
87
+ };
88
+ }
89
+ //# sourceMappingURL=loadConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/config/loadConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type ErrorCode = "CONFIG_ERROR" | "API_NOT_FOUND" | "ENDPOINT_NOT_FOUND" | "AUTH_ERROR" | "REQUEST_ERROR" | "SCHEMA_ERROR";
2
+ export declare class OpenApiMcpError extends Error {
3
+ readonly code: ErrorCode;
4
+ readonly details?: unknown;
5
+ constructor(code: ErrorCode, message: string, details?: unknown);
6
+ }
7
+ export declare function asErrorResponse(error: unknown): {
8
+ code: ErrorCode;
9
+ message: string;
10
+ details?: unknown;
11
+ };
package/dist/errors.js ADDED
@@ -0,0 +1,31 @@
1
+ export class OpenApiMcpError extends Error {
2
+ code;
3
+ details;
4
+ constructor(code, message, details) {
5
+ super(message);
6
+ this.name = "OpenApiMcpError";
7
+ this.code = code;
8
+ this.details = details;
9
+ }
10
+ }
11
+ export function asErrorResponse(error) {
12
+ if (error instanceof OpenApiMcpError) {
13
+ return {
14
+ code: error.code,
15
+ message: error.message,
16
+ details: error.details
17
+ };
18
+ }
19
+ if (error instanceof Error) {
20
+ return {
21
+ code: "REQUEST_ERROR",
22
+ message: error.message
23
+ };
24
+ }
25
+ return {
26
+ code: "REQUEST_ERROR",
27
+ message: "Unknown error",
28
+ details: error
29
+ };
30
+ }
31
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxB,IAAI,CAAY;IAChB,OAAO,CAAW;IAElC,YAAY,IAAe,EAAE,OAAe,EAAE,OAAiB;QAC7D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAK5C,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { OAuthClient } from "../auth/oauthClient.js";
2
+ import type { EndpointDefinition, LoadedApi, RequestExecutionResult, Retry429Config } from "../types.js";
3
+ interface RequestExecutorInput {
4
+ api: LoadedApi;
5
+ endpoint: EndpointDefinition;
6
+ pathParams?: Record<string, unknown>;
7
+ query?: Record<string, unknown>;
8
+ headers?: Record<string, string>;
9
+ cookies?: Record<string, string>;
10
+ body?: unknown;
11
+ contentType?: string;
12
+ accept?: string;
13
+ timeoutMs?: number;
14
+ retry429?: Retry429Config;
15
+ oauthClient: OAuthClient;
16
+ env?: NodeJS.ProcessEnv;
17
+ }
18
+ export declare function executeEndpointRequest(input: RequestExecutorInput): Promise<RequestExecutionResult>;
19
+ export {};
@@ -0,0 +1,342 @@
1
+ import { readApiExtraHeaders } from "../auth/env.js";
2
+ import { resolveAuth } from "../auth/resolveAuth.js";
3
+ import { OpenApiMcpError } from "../errors.js";
4
+ const TEXT_CONTENT_TYPE_PATTERNS = [
5
+ /^text\//i,
6
+ /^application\/xml/i,
7
+ /^application\/x-www-form-urlencoded/i,
8
+ /^application\/graphql/i
9
+ ];
10
+ const DEFAULT_RETRY_429_OPTIONS = {
11
+ maxRetries: 0,
12
+ baseDelayMs: 250,
13
+ maxDelayMs: 5000,
14
+ jitterRatio: 0.2,
15
+ respectRetryAfter: true
16
+ };
17
+ export async function executeEndpointRequest(input) {
18
+ const env = input.env ?? process.env;
19
+ const start = Date.now();
20
+ const auth = await resolveAuth({
21
+ api: input.api,
22
+ endpoint: input.endpoint,
23
+ oauthClient: input.oauthClient,
24
+ env
25
+ });
26
+ const url = new URL(joinBaseAndPath(input.api.baseUrl, expandPath(input.endpoint.path, input.pathParams)));
27
+ appendQueryParams(url.searchParams, input.endpoint, input.query ?? {});
28
+ const mergedHeaders = {
29
+ ...(input.api.config.headers ?? {}),
30
+ ...readApiExtraHeaders(input.api.config.name, env),
31
+ ...(input.headers ?? {})
32
+ };
33
+ if (input.accept) {
34
+ mergedHeaders.accept = input.accept;
35
+ }
36
+ const cookieMap = { ...(input.cookies ?? {}) };
37
+ for (const scheme of auth.schemes) {
38
+ if (scheme.type === "apiKey") {
39
+ if (scheme.in === "header") {
40
+ mergedHeaders[scheme.name] = scheme.value;
41
+ }
42
+ else if (scheme.in === "query") {
43
+ url.searchParams.set(scheme.name, scheme.value);
44
+ }
45
+ else {
46
+ cookieMap[scheme.name] = scheme.value;
47
+ }
48
+ continue;
49
+ }
50
+ mergedHeaders.authorization = `Bearer ${scheme.token}`;
51
+ }
52
+ if (Object.keys(cookieMap).length > 0) {
53
+ mergedHeaders.cookie = Object.entries(cookieMap)
54
+ .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
55
+ .join("; ");
56
+ }
57
+ const { body, inferredContentType } = prepareRequestBody(input.body, input.contentType);
58
+ if (inferredContentType && !hasHeader(mergedHeaders, "content-type")) {
59
+ mergedHeaders["content-type"] = inferredContentType;
60
+ }
61
+ const timeoutMs = input.timeoutMs ?? input.api.config.timeoutMs ?? 30000;
62
+ const retry429 = resolveRetry429Options(input.api.config.retry429, input.retry429);
63
+ let response;
64
+ for (let attempt = 0; attempt <= retry429.maxRetries; attempt++) {
65
+ const controller = new AbortController();
66
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
67
+ try {
68
+ response = await fetch(url, {
69
+ method: input.endpoint.method.toUpperCase(),
70
+ headers: mergedHeaders,
71
+ body,
72
+ signal: controller.signal
73
+ });
74
+ }
75
+ catch (error) {
76
+ if (error instanceof Error && error.name === "AbortError") {
77
+ throw new OpenApiMcpError("REQUEST_ERROR", `Request timed out after ${timeoutMs}ms`, {
78
+ apiName: input.api.config.name,
79
+ endpointId: input.endpoint.endpointId
80
+ });
81
+ }
82
+ throw new OpenApiMcpError("REQUEST_ERROR", "Request failed", {
83
+ cause: error instanceof Error ? error.message : String(error),
84
+ apiName: input.api.config.name,
85
+ endpointId: input.endpoint.endpointId
86
+ });
87
+ }
88
+ finally {
89
+ clearTimeout(timeout);
90
+ }
91
+ if (response.status !== 429 || attempt >= retry429.maxRetries) {
92
+ break;
93
+ }
94
+ const delayMs = computeRetryDelayMs(response.headers.get("retry-after"), attempt, retry429);
95
+ if (delayMs > 0) {
96
+ await sleep(delayMs);
97
+ }
98
+ }
99
+ if (!response) {
100
+ throw new OpenApiMcpError("REQUEST_ERROR", "Request failed", {
101
+ apiName: input.api.config.name,
102
+ endpointId: input.endpoint.endpointId
103
+ });
104
+ }
105
+ const responseHeaders = Object.fromEntries(response.headers.entries());
106
+ const responseBody = await decodeResponseBody(response);
107
+ return {
108
+ request: {
109
+ url: url.toString(),
110
+ method: input.endpoint.method.toUpperCase(),
111
+ headersRedacted: redactHeaders(mergedHeaders),
112
+ endpointId: input.endpoint.endpointId
113
+ },
114
+ response: {
115
+ status: response.status,
116
+ headers: responseHeaders,
117
+ ...responseBody
118
+ },
119
+ timingMs: Date.now() - start,
120
+ authUsed: auth.authUsed
121
+ };
122
+ }
123
+ function resolveRetry429Options(configOptions, inputOptions) {
124
+ const maxRetries = inputOptions?.maxRetries ?? configOptions?.maxRetries ?? DEFAULT_RETRY_429_OPTIONS.maxRetries;
125
+ const baseDelayMs = inputOptions?.baseDelayMs ?? configOptions?.baseDelayMs ?? DEFAULT_RETRY_429_OPTIONS.baseDelayMs;
126
+ const maxDelayMs = inputOptions?.maxDelayMs ?? configOptions?.maxDelayMs ?? DEFAULT_RETRY_429_OPTIONS.maxDelayMs;
127
+ const jitterRatio = inputOptions?.jitterRatio ?? configOptions?.jitterRatio ?? DEFAULT_RETRY_429_OPTIONS.jitterRatio;
128
+ const respectRetryAfter = inputOptions?.respectRetryAfter ??
129
+ configOptions?.respectRetryAfter ??
130
+ DEFAULT_RETRY_429_OPTIONS.respectRetryAfter;
131
+ return {
132
+ maxRetries: Math.max(0, Math.floor(maxRetries)),
133
+ baseDelayMs: Math.max(1, Math.floor(baseDelayMs)),
134
+ maxDelayMs: Math.max(1, Math.floor(maxDelayMs)),
135
+ jitterRatio: Math.min(1, Math.max(0, jitterRatio)),
136
+ respectRetryAfter
137
+ };
138
+ }
139
+ function computeRetryDelayMs(retryAfterHeader, retryIndex, options) {
140
+ if (options.respectRetryAfter) {
141
+ const retryAfterMs = parseRetryAfterMs(retryAfterHeader);
142
+ if (retryAfterMs !== undefined) {
143
+ return Math.min(retryAfterMs, options.maxDelayMs);
144
+ }
145
+ }
146
+ const exponential = options.baseDelayMs * 2 ** retryIndex;
147
+ const capped = Math.min(exponential, options.maxDelayMs);
148
+ if (options.jitterRatio === 0) {
149
+ return capped;
150
+ }
151
+ const jitterMultiplier = 1 + (Math.random() * 2 - 1) * options.jitterRatio;
152
+ const jittered = capped * jitterMultiplier;
153
+ return Math.max(0, Math.min(options.maxDelayMs, jittered));
154
+ }
155
+ function parseRetryAfterMs(value) {
156
+ if (!value) {
157
+ return undefined;
158
+ }
159
+ const trimmed = value.trim();
160
+ if (/^\d+$/.test(trimmed)) {
161
+ const seconds = Number.parseInt(trimmed, 10);
162
+ if (seconds <= 0) {
163
+ return undefined;
164
+ }
165
+ return seconds * 1000;
166
+ }
167
+ const unixMs = Date.parse(trimmed);
168
+ if (Number.isNaN(unixMs)) {
169
+ return undefined;
170
+ }
171
+ const deltaMs = unixMs - Date.now();
172
+ if (deltaMs <= 0) {
173
+ return undefined;
174
+ }
175
+ return deltaMs;
176
+ }
177
+ async function sleep(ms) {
178
+ await new Promise((resolve) => setTimeout(resolve, ms));
179
+ }
180
+ function appendQueryParams(searchParams, endpoint, query) {
181
+ const definedParams = collectParameters(endpoint).filter((param) => !isReference(param) && param.in === "query");
182
+ const byName = new Map();
183
+ for (const param of definedParams) {
184
+ byName.set(param.name, param);
185
+ }
186
+ for (const [key, value] of Object.entries(query)) {
187
+ if (value === undefined || value === null) {
188
+ continue;
189
+ }
190
+ const param = byName.get(key);
191
+ if (param) {
192
+ serializeQueryValue(searchParams, key, value, param.style ?? "form", param.explode ?? true);
193
+ continue;
194
+ }
195
+ serializeQueryValue(searchParams, key, value, "form", true);
196
+ }
197
+ }
198
+ function serializeQueryValue(searchParams, key, value, style, explode) {
199
+ if (style === "deepObject" && isPlainObject(value)) {
200
+ for (const [nestedKey, nestedValue] of Object.entries(value)) {
201
+ if (nestedValue !== undefined && nestedValue !== null) {
202
+ searchParams.append(`${key}[${nestedKey}]`, String(nestedValue));
203
+ }
204
+ }
205
+ return;
206
+ }
207
+ if (Array.isArray(value)) {
208
+ if (explode) {
209
+ for (const item of value) {
210
+ searchParams.append(key, String(item));
211
+ }
212
+ return;
213
+ }
214
+ searchParams.append(key, value.map((item) => String(item)).join(","));
215
+ return;
216
+ }
217
+ if (isPlainObject(value)) {
218
+ if (explode) {
219
+ for (const [itemKey, itemValue] of Object.entries(value)) {
220
+ searchParams.append(itemKey, String(itemValue));
221
+ }
222
+ return;
223
+ }
224
+ const flat = [];
225
+ for (const [itemKey, itemValue] of Object.entries(value)) {
226
+ flat.push(itemKey, String(itemValue));
227
+ }
228
+ searchParams.append(key, flat.join(","));
229
+ return;
230
+ }
231
+ searchParams.append(key, String(value));
232
+ }
233
+ function prepareRequestBody(rawBody, contentTypeOverride) {
234
+ if (rawBody === undefined || rawBody === null) {
235
+ return { body: undefined, inferredContentType: undefined };
236
+ }
237
+ if (typeof rawBody === "string") {
238
+ return {
239
+ body: rawBody,
240
+ inferredContentType: contentTypeOverride ?? "text/plain"
241
+ };
242
+ }
243
+ if (rawBody instanceof Uint8Array) {
244
+ return {
245
+ body: rawBody,
246
+ inferredContentType: contentTypeOverride ?? "application/octet-stream"
247
+ };
248
+ }
249
+ return {
250
+ body: JSON.stringify(rawBody),
251
+ inferredContentType: contentTypeOverride ?? "application/json"
252
+ };
253
+ }
254
+ function expandPath(pathTemplate, pathParams) {
255
+ return pathTemplate.replace(/\{([^}]+)\}/g, (_match, group) => {
256
+ const value = pathParams?.[group];
257
+ if (value === undefined || value === null) {
258
+ throw new OpenApiMcpError("REQUEST_ERROR", `Missing path parameter '${group}'`);
259
+ }
260
+ if (Array.isArray(value)) {
261
+ return value.map((item) => encodeURIComponent(String(item))).join(",");
262
+ }
263
+ if (isPlainObject(value)) {
264
+ const flat = [];
265
+ for (const [k, v] of Object.entries(value)) {
266
+ flat.push(k, String(v));
267
+ }
268
+ return encodeURIComponent(flat.join(","));
269
+ }
270
+ return encodeURIComponent(String(value));
271
+ });
272
+ }
273
+ async function decodeResponseBody(response) {
274
+ if (response.status === 204 || response.status === 205) {
275
+ return { bodyType: "empty" };
276
+ }
277
+ const contentType = response.headers.get("content-type") ?? "";
278
+ if (contentType.toLowerCase().includes("json")) {
279
+ const text = await response.text();
280
+ if (!text) {
281
+ return { bodyType: "empty" };
282
+ }
283
+ try {
284
+ return {
285
+ bodyType: "json",
286
+ bodyJson: JSON.parse(text)
287
+ };
288
+ }
289
+ catch {
290
+ return {
291
+ bodyType: "text",
292
+ bodyText: text
293
+ };
294
+ }
295
+ }
296
+ if (TEXT_CONTENT_TYPE_PATTERNS.some((pattern) => pattern.test(contentType)) || /charset=/i.test(contentType)) {
297
+ return {
298
+ bodyType: "text",
299
+ bodyText: await response.text()
300
+ };
301
+ }
302
+ const bytes = new Uint8Array(await response.arrayBuffer());
303
+ if (bytes.length === 0) {
304
+ return { bodyType: "empty" };
305
+ }
306
+ return {
307
+ bodyType: "binary",
308
+ bodyBase64: Buffer.from(bytes).toString("base64")
309
+ };
310
+ }
311
+ function collectParameters(endpoint) {
312
+ const pathParams = endpoint.pathItem.parameters ?? [];
313
+ const operationParams = endpoint.operation.parameters ?? [];
314
+ return [...pathParams, ...operationParams].filter((param) => !isReference(param));
315
+ }
316
+ function isReference(value) {
317
+ return "$ref" in value;
318
+ }
319
+ function joinBaseAndPath(baseUrl, apiPath) {
320
+ const trimmedBase = baseUrl.replace(/\/+$/, "");
321
+ const trimmedPath = apiPath.startsWith("/") ? apiPath : `/${apiPath}`;
322
+ return `${trimmedBase}${trimmedPath}`;
323
+ }
324
+ function hasHeader(headers, name) {
325
+ return Object.keys(headers).some((key) => key.toLowerCase() === name.toLowerCase());
326
+ }
327
+ function redactHeaders(headers) {
328
+ const result = {};
329
+ for (const [key, value] of Object.entries(headers)) {
330
+ const lower = key.toLowerCase();
331
+ if (lower === "authorization" || lower.includes("api-key") || lower === "cookie") {
332
+ result[key] = "<redacted>";
333
+ continue;
334
+ }
335
+ result[key] = value;
336
+ }
337
+ return result;
338
+ }
339
+ function isPlainObject(value) {
340
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
341
+ }
342
+ //# sourceMappingURL=requestExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestExecutor.js","sourceRoot":"","sources":["../../src/http/requestExecutor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { loadConfig } from "./config/loadConfig.js";
2
+ export { loadApiRegistry } from "./openapi/loadSpec.js";
3
+ export { executeEndpointRequest } from "./http/requestExecutor.js";
4
+ export { resolveAuth } from "./auth/resolveAuth.js";
5
+ export { normalizeEnvSegment } from "./auth/env.js";
6
+ export { OpenApiMcpError } from "./errors.js";
7
+ export type * from "./types.js";
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { loadConfig } from "./config/loadConfig.js";
2
+ export { loadApiRegistry } from "./openapi/loadSpec.js";
3
+ export { executeEndpointRequest } from "./http/requestExecutor.js";
4
+ export { resolveAuth } from "./auth/resolveAuth.js";
5
+ export { normalizeEnvSegment } from "./auth/env.js";
6
+ export { OpenApiMcpError } from "./errors.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ApiRegistry } from "../types.js";
2
+ import { OAuthClient } from "../auth/oauthClient.js";
3
+ export interface ToolContext {
4
+ registry: ApiRegistry;
5
+ oauthClient: OAuthClient;
6
+ env: NodeJS.ProcessEnv;
7
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/mcp/context.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import type { ToolContext } from "./context.js";
2
+ export declare function startMcpServer(context: ToolContext): Promise<void>;