mcp-use 2.0.0-beta.0 → 2.0.0-beta.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/dist/.tsbuildinfo +1 -1
- package/dist/chunk-AATFAERC.js +384 -0
- package/dist/chunk-AATFAERC.js.map +1 -0
- package/dist/commands/dev.js +3 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -1
- package/dist/index.js.map +1 -1
- package/dist/openapi/index.d.ts +11 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +7 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/openapi/types.d.ts +174 -0
- package/dist/openapi/types.d.ts.map +1 -0
- package/dist/server.d.ts +22 -0
- package/dist/server.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
// src/openapi/index.ts
|
|
2
|
+
import {
|
|
3
|
+
fromJsonSchema
|
|
4
|
+
} from "@modelcontextprotocol/server";
|
|
5
|
+
var HTTP_METHODS = [
|
|
6
|
+
"get",
|
|
7
|
+
"put",
|
|
8
|
+
"post",
|
|
9
|
+
"delete",
|
|
10
|
+
"options",
|
|
11
|
+
"head",
|
|
12
|
+
"patch",
|
|
13
|
+
"trace"
|
|
14
|
+
];
|
|
15
|
+
function registerOpenAPITools(server, options) {
|
|
16
|
+
const operations = collectOperations(options.spec, options);
|
|
17
|
+
const names = createToolNames(operations);
|
|
18
|
+
const baseUrl = operations.length > 0 ? resolveBaseUrl(options) : void 0;
|
|
19
|
+
for (const [index, operation] of operations.entries()) {
|
|
20
|
+
const name = names[index];
|
|
21
|
+
if (name === void 0 || baseUrl === void 0) continue;
|
|
22
|
+
const inputBindings = createInputBindings(operation);
|
|
23
|
+
server.tool(
|
|
24
|
+
{
|
|
25
|
+
name,
|
|
26
|
+
description: createToolDescription(operation),
|
|
27
|
+
inputSchema: createToolInputSchema(
|
|
28
|
+
options.spec,
|
|
29
|
+
operation,
|
|
30
|
+
inputBindings
|
|
31
|
+
)
|
|
32
|
+
},
|
|
33
|
+
async (params) => callOpenAPIOperation(operation, params, options, inputBindings, baseUrl)
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function collectOperations(spec, options) {
|
|
38
|
+
const collected = [];
|
|
39
|
+
for (const [path, pathItemOrRef] of Object.entries(spec.paths ?? {})) {
|
|
40
|
+
const pathItem = resolveRef(spec, pathItemOrRef);
|
|
41
|
+
if (pathItem === void 0 || isReferenceObject(pathItem)) continue;
|
|
42
|
+
const pathParameters = resolveParameters(spec, pathItem.parameters);
|
|
43
|
+
for (const method of HTTP_METHODS) {
|
|
44
|
+
const operationOrRef = pathItem[method];
|
|
45
|
+
if (operationOrRef === void 0) continue;
|
|
46
|
+
const operation = resolveRef(
|
|
47
|
+
spec,
|
|
48
|
+
operationOrRef
|
|
49
|
+
);
|
|
50
|
+
if (operation === void 0 || isReferenceObject(operation)) continue;
|
|
51
|
+
const operationParameters = resolveParameters(spec, operation.parameters);
|
|
52
|
+
const requestBody = operation.requestBody === void 0 ? void 0 : resolveRef(spec, operation.requestBody);
|
|
53
|
+
const item = {
|
|
54
|
+
method,
|
|
55
|
+
path,
|
|
56
|
+
operation,
|
|
57
|
+
parameters: mergeParameters(pathParameters, operationParameters),
|
|
58
|
+
...requestBody !== void 0 && !isReferenceObject(requestBody) && { requestBody }
|
|
59
|
+
};
|
|
60
|
+
if (isIncluded(item, options)) collected.push(item);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return collected;
|
|
64
|
+
}
|
|
65
|
+
function resolveParameters(spec, parameters) {
|
|
66
|
+
const resolved = [];
|
|
67
|
+
for (const parameter of parameters ?? []) {
|
|
68
|
+
const value = resolveRef(spec, parameter);
|
|
69
|
+
if (value !== void 0 && !isReferenceObject(value)) resolved.push(value);
|
|
70
|
+
}
|
|
71
|
+
return resolved;
|
|
72
|
+
}
|
|
73
|
+
function mergeParameters(pathParameters, operationParameters) {
|
|
74
|
+
const merged = /* @__PURE__ */ new Map();
|
|
75
|
+
for (const parameter of [...pathParameters, ...operationParameters]) {
|
|
76
|
+
merged.set(`${parameter.in}:${parameter.name}`, parameter);
|
|
77
|
+
}
|
|
78
|
+
return [...merged.values()];
|
|
79
|
+
}
|
|
80
|
+
function isIncluded(operation, options) {
|
|
81
|
+
if (options.tags?.length) {
|
|
82
|
+
const tags = new Set(operation.operation.tags ?? []);
|
|
83
|
+
if (!options.tags.some((tag) => tags.has(tag))) return false;
|
|
84
|
+
}
|
|
85
|
+
return !(options.exclude ?? []).some(
|
|
86
|
+
(rule) => matchesExcludeRule(operation, rule)
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
function matchesExcludeRule(operation, rule) {
|
|
90
|
+
if (rule.method && rule.method.toLowerCase() !== operation.method) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
if (rule.operationId && !matchesPattern(rule.operationId, operation.operation.operationId ?? "")) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
if (rule.path && !matchesPattern(rule.path, operation.path)) return false;
|
|
97
|
+
if (rule.tags?.length) {
|
|
98
|
+
const tags = new Set(operation.operation.tags ?? []);
|
|
99
|
+
if (!rule.tags.some((tag) => tags.has(tag))) return false;
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
function matchesPattern(pattern, value) {
|
|
104
|
+
if (typeof pattern === "string") return pattern === value;
|
|
105
|
+
pattern.lastIndex = 0;
|
|
106
|
+
return pattern.test(value);
|
|
107
|
+
}
|
|
108
|
+
function createToolNames(operations) {
|
|
109
|
+
const seen = /* @__PURE__ */ new Map();
|
|
110
|
+
return operations.map((operation) => {
|
|
111
|
+
const baseName = slugifyToolName(
|
|
112
|
+
operation.operation.operationId ?? `${operation.method}_${operation.path.replace(/[{}]/g, "").replace(/\//g, "_")}`
|
|
113
|
+
);
|
|
114
|
+
const count = seen.get(baseName) ?? 0;
|
|
115
|
+
seen.set(baseName, count + 1);
|
|
116
|
+
if (count === 0) return baseName;
|
|
117
|
+
const suffix = `_${count + 1}`;
|
|
118
|
+
return `${baseName.slice(0, 64 - suffix.length)}${suffix}`;
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function createToolDescription(operation) {
|
|
122
|
+
return [
|
|
123
|
+
operation.operation.summary,
|
|
124
|
+
operation.operation.description,
|
|
125
|
+
`HTTP: ${operation.method.toUpperCase()} ${operation.path}`
|
|
126
|
+
].filter((part) => Boolean(part)).join("\n\n");
|
|
127
|
+
}
|
|
128
|
+
function slugifyToolName(value) {
|
|
129
|
+
const slug = value.trim().replace(/[^a-zA-Z0-9_-]+/g, "_").replace(/_+/g, "_").replace(/^_/, "").replace(/_$/, "").slice(0, 64);
|
|
130
|
+
return slug || "openapi_tool";
|
|
131
|
+
}
|
|
132
|
+
function createToolInputSchema(spec, operation, inputBindings) {
|
|
133
|
+
const properties = {};
|
|
134
|
+
const required = [];
|
|
135
|
+
for (const { parameter, inputName } of inputBindings.parameters) {
|
|
136
|
+
const parameterSchema = transformSchema(
|
|
137
|
+
spec,
|
|
138
|
+
parameter.schema ?? {}
|
|
139
|
+
);
|
|
140
|
+
properties[inputName] = {
|
|
141
|
+
...parameterSchema,
|
|
142
|
+
description: parameter.description ?? `${parameter.in} parameter`
|
|
143
|
+
};
|
|
144
|
+
if (parameter.required || parameter.in === "path") {
|
|
145
|
+
required.push(inputName);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const bodySchema = getJsonRequestBodySchema(operation.requestBody);
|
|
149
|
+
if (bodySchema !== void 0 && inputBindings.bodyInputName !== void 0) {
|
|
150
|
+
properties[inputBindings.bodyInputName] = transformSchema(spec, bodySchema);
|
|
151
|
+
if (operation.requestBody?.required) {
|
|
152
|
+
required.push(inputBindings.bodyInputName);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const definitions = createSchemaDefinitions(spec);
|
|
156
|
+
const schema = {
|
|
157
|
+
type: "object",
|
|
158
|
+
properties,
|
|
159
|
+
additionalProperties: false,
|
|
160
|
+
...required.length > 0 && { required },
|
|
161
|
+
...definitions !== void 0 && { $defs: definitions }
|
|
162
|
+
};
|
|
163
|
+
return fromJsonSchema(schema);
|
|
164
|
+
}
|
|
165
|
+
function createInputBindings(operation) {
|
|
166
|
+
const parameters = operation.parameters.filter(
|
|
167
|
+
(parameter) => parameter.in !== "cookie"
|
|
168
|
+
);
|
|
169
|
+
const bodyInputName = getJsonRequestBodySchema(operation.requestBody) === void 0 ? void 0 : "body";
|
|
170
|
+
const nameCounts = /* @__PURE__ */ new Map();
|
|
171
|
+
for (const parameter of parameters) {
|
|
172
|
+
nameCounts.set(parameter.name, (nameCounts.get(parameter.name) ?? 0) + 1);
|
|
173
|
+
}
|
|
174
|
+
const usedNames = new Set(bodyInputName === void 0 ? [] : [bodyInputName]);
|
|
175
|
+
const bindings = parameters.map((parameter) => {
|
|
176
|
+
const needsLocation = (nameCounts.get(parameter.name) ?? 0) > 1 || parameter.name === bodyInputName;
|
|
177
|
+
const preferredName = needsLocation ? `${parameter.name}_${parameter.in}` : parameter.name;
|
|
178
|
+
return {
|
|
179
|
+
parameter,
|
|
180
|
+
inputName: claimInputName(preferredName, usedNames)
|
|
181
|
+
};
|
|
182
|
+
});
|
|
183
|
+
return {
|
|
184
|
+
parameters: bindings,
|
|
185
|
+
...bodyInputName !== void 0 && { bodyInputName }
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function claimInputName(preferredName, usedNames) {
|
|
189
|
+
let inputName = preferredName;
|
|
190
|
+
let suffix = 2;
|
|
191
|
+
while (usedNames.has(inputName)) {
|
|
192
|
+
inputName = `${preferredName}_${suffix}`;
|
|
193
|
+
suffix += 1;
|
|
194
|
+
}
|
|
195
|
+
usedNames.add(inputName);
|
|
196
|
+
return inputName;
|
|
197
|
+
}
|
|
198
|
+
function createSchemaDefinitions(spec) {
|
|
199
|
+
const schemas = readRecord(spec.components?.["schemas"]);
|
|
200
|
+
if (schemas === void 0) return void 0;
|
|
201
|
+
const definitions = {};
|
|
202
|
+
for (const [name, schema] of Object.entries(schemas)) {
|
|
203
|
+
definitions[name] = transformSchemaNode(spec, schema, /* @__PURE__ */ new Set());
|
|
204
|
+
}
|
|
205
|
+
return definitions;
|
|
206
|
+
}
|
|
207
|
+
function transformSchema(spec, schema) {
|
|
208
|
+
const transformed = transformSchemaNode(spec, schema, /* @__PURE__ */ new Set());
|
|
209
|
+
return readRecord(transformed) ?? {};
|
|
210
|
+
}
|
|
211
|
+
function transformSchemaNode(spec, value, resolvingRefs) {
|
|
212
|
+
if (Array.isArray(value)) {
|
|
213
|
+
return value.map((item) => transformSchemaNode(spec, item, resolvingRefs));
|
|
214
|
+
}
|
|
215
|
+
const object = readRecord(value);
|
|
216
|
+
if (object === void 0) return value;
|
|
217
|
+
const ref = typeof object["$ref"] === "string" ? object["$ref"] : void 0;
|
|
218
|
+
const siblings = {};
|
|
219
|
+
for (const [key, child] of Object.entries(object)) {
|
|
220
|
+
if (key === "$ref") continue;
|
|
221
|
+
if (key === "nullable" && typeof child === "boolean") continue;
|
|
222
|
+
siblings[key] = transformSchemaNode(spec, child, resolvingRefs);
|
|
223
|
+
}
|
|
224
|
+
let transformed = siblings;
|
|
225
|
+
if (ref !== void 0) {
|
|
226
|
+
const schemaRef = rewriteSchemaRef(spec, ref);
|
|
227
|
+
if (schemaRef !== void 0) {
|
|
228
|
+
transformed = { $ref: schemaRef, ...siblings };
|
|
229
|
+
} else if (!resolvingRefs.has(ref)) {
|
|
230
|
+
const resolved = resolveRef(spec, { $ref: ref });
|
|
231
|
+
if (resolved !== void 0) {
|
|
232
|
+
const nextRefs = new Set(resolvingRefs);
|
|
233
|
+
nextRefs.add(ref);
|
|
234
|
+
transformed = {
|
|
235
|
+
...readRecord(transformSchemaNode(spec, resolved, nextRefs)) ?? {},
|
|
236
|
+
...siblings
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (object["nullable"] === true) {
|
|
242
|
+
return { anyOf: [transformed, { type: "null" }] };
|
|
243
|
+
}
|
|
244
|
+
return transformed;
|
|
245
|
+
}
|
|
246
|
+
function rewriteSchemaRef(spec, ref) {
|
|
247
|
+
const prefix = "#/components/schemas/";
|
|
248
|
+
if (!ref.startsWith(prefix)) return void 0;
|
|
249
|
+
return resolveRef(spec, { $ref: ref }) === void 0 ? void 0 : `#/$defs/${ref.slice(prefix.length)}`;
|
|
250
|
+
}
|
|
251
|
+
function getJsonRequestBodySchema(requestBody) {
|
|
252
|
+
const content = requestBody?.content;
|
|
253
|
+
if (content === void 0) return void 0;
|
|
254
|
+
return content["application/json"]?.schema ?? content["application/*+json"]?.schema ?? Object.entries(content).find(
|
|
255
|
+
([mediaType]) => mediaType.includes("+json")
|
|
256
|
+
)?.[1].schema;
|
|
257
|
+
}
|
|
258
|
+
async function callOpenAPIOperation(operation, params, options, inputBindings, baseUrl) {
|
|
259
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
260
|
+
const url = buildUrl(operation, params, inputBindings.parameters, baseUrl);
|
|
261
|
+
const headers = buildHeaders(inputBindings.parameters, params, options);
|
|
262
|
+
const bodyInputName = inputBindings.bodyInputName;
|
|
263
|
+
const body = bodyInputName === void 0 || params[bodyInputName] === void 0 ? void 0 : JSON.stringify(params[bodyInputName]);
|
|
264
|
+
if (body !== void 0 && !hasHeader(headers, "content-type")) {
|
|
265
|
+
headers["content-type"] = "application/json";
|
|
266
|
+
}
|
|
267
|
+
const response = await fetchImpl(url, {
|
|
268
|
+
method: operation.method.toUpperCase(),
|
|
269
|
+
headers,
|
|
270
|
+
...body !== void 0 && { body }
|
|
271
|
+
});
|
|
272
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
273
|
+
if (!response.ok) {
|
|
274
|
+
return {
|
|
275
|
+
content: [{ type: "text", text: await response.text() }],
|
|
276
|
+
isError: true
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
if (contentType.includes("application/json") || contentType.includes("+json")) {
|
|
280
|
+
const text = await response.text();
|
|
281
|
+
try {
|
|
282
|
+
const data = JSON.parse(text);
|
|
283
|
+
return {
|
|
284
|
+
content: [{ type: "text", text: JSON.stringify(data) }],
|
|
285
|
+
structuredContent: data
|
|
286
|
+
};
|
|
287
|
+
} catch {
|
|
288
|
+
return { content: [{ type: "text", text }] };
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return { content: [{ type: "text", text: await response.text() }] };
|
|
292
|
+
}
|
|
293
|
+
function buildUrl(operation, params, parameterBindings, baseUrl) {
|
|
294
|
+
const interpolatedPath = operation.path.replace(
|
|
295
|
+
/{([^}]+)}/g,
|
|
296
|
+
(_match, name) => {
|
|
297
|
+
const binding = parameterBindings.find(
|
|
298
|
+
({ parameter }) => parameter.in === "path" && parameter.name === name
|
|
299
|
+
);
|
|
300
|
+
return encodeURIComponent(
|
|
301
|
+
String(binding === void 0 ? "" : params[binding.inputName] ?? "")
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
);
|
|
305
|
+
const url = new URL(
|
|
306
|
+
interpolatedPath.replace(/^\/+/, ""),
|
|
307
|
+
ensureTrailingSlash(baseUrl)
|
|
308
|
+
);
|
|
309
|
+
for (const { parameter, inputName } of parameterBindings) {
|
|
310
|
+
if (parameter.in !== "query") continue;
|
|
311
|
+
const value = params[inputName];
|
|
312
|
+
if (value === void 0 || value === null || value === "") continue;
|
|
313
|
+
appendQueryParam(url, parameter.name, value);
|
|
314
|
+
}
|
|
315
|
+
return url.toString();
|
|
316
|
+
}
|
|
317
|
+
function buildHeaders(parameterBindings, params, options) {
|
|
318
|
+
const headers = { ...options.headers ?? {} };
|
|
319
|
+
for (const { parameter, inputName } of parameterBindings) {
|
|
320
|
+
if (parameter.in !== "header") continue;
|
|
321
|
+
const value = params[inputName];
|
|
322
|
+
if (value === void 0 || value === null || value === "") continue;
|
|
323
|
+
headers[parameter.name] = String(value);
|
|
324
|
+
}
|
|
325
|
+
if (options.auth?.type === "bearer" && options.auth.token) {
|
|
326
|
+
headers["authorization"] = `Bearer ${options.auth.token}`;
|
|
327
|
+
}
|
|
328
|
+
if (options.auth?.type === "header" && options.auth.value) {
|
|
329
|
+
headers[options.auth.name] = options.auth.value;
|
|
330
|
+
}
|
|
331
|
+
return headers;
|
|
332
|
+
}
|
|
333
|
+
function resolveBaseUrl(options) {
|
|
334
|
+
const baseUrl = options.baseUrl ?? options.spec.servers?.[0]?.url;
|
|
335
|
+
if (baseUrl === void 0 || baseUrl.trim() === "") {
|
|
336
|
+
throw new Error(
|
|
337
|
+
"MCPServer.fromOpenAPI requires options.baseUrl or spec.servers[0].url"
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
return baseUrl;
|
|
341
|
+
}
|
|
342
|
+
function appendQueryParam(url, name, value) {
|
|
343
|
+
if (Array.isArray(value)) {
|
|
344
|
+
for (const item of value) {
|
|
345
|
+
if (item !== void 0 && item !== null && item !== "") {
|
|
346
|
+
url.searchParams.append(name, String(item));
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
url.searchParams.set(name, String(value));
|
|
352
|
+
}
|
|
353
|
+
function ensureTrailingSlash(url) {
|
|
354
|
+
return url.endsWith("/") ? url : `${url}/`;
|
|
355
|
+
}
|
|
356
|
+
function hasHeader(headers, name) {
|
|
357
|
+
return Object.keys(headers).some(
|
|
358
|
+
(headerName) => headerName.toLowerCase() === name
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
function isReferenceObject(value) {
|
|
362
|
+
const object = readRecord(value);
|
|
363
|
+
return object !== void 0 && typeof object["$ref"] === "string";
|
|
364
|
+
}
|
|
365
|
+
function resolveRef(spec, value) {
|
|
366
|
+
if (!isReferenceObject(value)) return value;
|
|
367
|
+
if (!value.$ref.startsWith("#/")) return void 0;
|
|
368
|
+
const segments = value.$ref.slice(2).split("/").map((segment) => segment.replace(/~1/g, "/").replace(/~0/g, "~"));
|
|
369
|
+
let current = spec;
|
|
370
|
+
for (const segment of segments) {
|
|
371
|
+
const object = readRecord(current);
|
|
372
|
+
if (object === void 0 || !(segment in object)) return void 0;
|
|
373
|
+
current = object[segment];
|
|
374
|
+
}
|
|
375
|
+
return current;
|
|
376
|
+
}
|
|
377
|
+
function readRecord(value) {
|
|
378
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
export {
|
|
382
|
+
registerOpenAPITools
|
|
383
|
+
};
|
|
384
|
+
//# sourceMappingURL=chunk-AATFAERC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/openapi/index.ts"],"sourcesContent":["import {\n fromJsonSchema,\n type CallToolResult,\n type JSONValue,\n type JsonSchemaType,\n type StandardSchemaWithJSON,\n} from \"@modelcontextprotocol/server\";\n\nimport type { MCPServer } from \"../server.js\";\nimport type {\n CollectedOpenAPIOperation,\n FromOpenAPIOptions,\n OpenAPIDocument,\n OpenAPIExcludeRule,\n OpenAPIHttpMethod,\n OpenAPIOperationObject,\n OpenAPIParameterObject,\n OpenAPIPathItemObject,\n OpenAPIReferenceObject,\n OpenAPIRequestBodyObject,\n OpenAPISchemaObject,\n} from \"./types.js\";\n\nexport type {\n FromOpenAPIOptions,\n OpenAPIAuth,\n OpenAPIDocument,\n OpenAPIExcludeRule,\n} from \"./types.js\";\n\nconst HTTP_METHODS: OpenAPIHttpMethod[] = [\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"options\",\n \"head\",\n \"patch\",\n \"trace\",\n];\n\n/**\n * Register every included operation in a bundled OpenAPI document as an MCP\n * tool on an existing server.\n *\n * @internal\n */\nexport function registerOpenAPITools(\n server: Pick<MCPServer, \"tool\">,\n options: FromOpenAPIOptions\n): void {\n const operations = collectOperations(options.spec, options);\n const names = createToolNames(operations);\n const baseUrl = operations.length > 0 ? resolveBaseUrl(options) : undefined;\n\n for (const [index, operation] of operations.entries()) {\n const name = names[index];\n if (name === undefined || baseUrl === undefined) continue;\n const inputBindings = createInputBindings(operation);\n\n server.tool(\n {\n name,\n description: createToolDescription(operation),\n inputSchema: createToolInputSchema(\n options.spec,\n operation,\n inputBindings\n ),\n },\n async (params) =>\n callOpenAPIOperation(operation, params, options, inputBindings, baseUrl)\n );\n }\n}\n\ninterface OpenAPIParameterBinding {\n parameter: OpenAPIParameterObject;\n inputName: string;\n}\n\ninterface OpenAPIInputBindings {\n parameters: OpenAPIParameterBinding[];\n bodyInputName?: string;\n}\n\nfunction collectOperations(\n spec: OpenAPIDocument,\n options: Pick<FromOpenAPIOptions, \"tags\" | \"exclude\">\n): CollectedOpenAPIOperation[] {\n const collected: CollectedOpenAPIOperation[] = [];\n\n for (const [path, pathItemOrRef] of Object.entries(spec.paths ?? {})) {\n const pathItem = resolveRef<OpenAPIPathItemObject>(spec, pathItemOrRef);\n if (pathItem === undefined || isReferenceObject(pathItem)) continue;\n\n const pathParameters = resolveParameters(spec, pathItem.parameters);\n\n for (const method of HTTP_METHODS) {\n const operationOrRef = pathItem[method];\n if (operationOrRef === undefined) continue;\n\n const operation = resolveRef<OpenAPIOperationObject>(\n spec,\n operationOrRef\n );\n if (operation === undefined || isReferenceObject(operation)) continue;\n\n const operationParameters = resolveParameters(spec, operation.parameters);\n const requestBody =\n operation.requestBody === undefined\n ? undefined\n : resolveRef<OpenAPIRequestBodyObject>(spec, operation.requestBody);\n\n const item: CollectedOpenAPIOperation = {\n method,\n path,\n operation,\n parameters: mergeParameters(pathParameters, operationParameters),\n ...(requestBody !== undefined &&\n !isReferenceObject(requestBody) && { requestBody }),\n };\n\n if (isIncluded(item, options)) collected.push(item);\n }\n }\n\n return collected;\n}\n\nfunction resolveParameters(\n spec: OpenAPIDocument,\n parameters?: Array<OpenAPIParameterObject | OpenAPIReferenceObject>\n): OpenAPIParameterObject[] {\n const resolved: OpenAPIParameterObject[] = [];\n for (const parameter of parameters ?? []) {\n const value = resolveRef<OpenAPIParameterObject>(spec, parameter);\n if (value !== undefined && !isReferenceObject(value)) resolved.push(value);\n }\n return resolved;\n}\n\nfunction mergeParameters(\n pathParameters: OpenAPIParameterObject[],\n operationParameters: OpenAPIParameterObject[]\n): OpenAPIParameterObject[] {\n const merged = new Map<string, OpenAPIParameterObject>();\n for (const parameter of [...pathParameters, ...operationParameters]) {\n merged.set(`${parameter.in}:${parameter.name}`, parameter);\n }\n return [...merged.values()];\n}\n\nfunction isIncluded(\n operation: CollectedOpenAPIOperation,\n options: Pick<FromOpenAPIOptions, \"tags\" | \"exclude\">\n): boolean {\n if (options.tags?.length) {\n const tags = new Set(operation.operation.tags ?? []);\n if (!options.tags.some((tag) => tags.has(tag))) return false;\n }\n\n return !(options.exclude ?? []).some((rule) =>\n matchesExcludeRule(operation, rule)\n );\n}\n\nfunction matchesExcludeRule(\n operation: CollectedOpenAPIOperation,\n rule: OpenAPIExcludeRule\n): boolean {\n if (rule.method && rule.method.toLowerCase() !== operation.method) {\n return false;\n }\n if (\n rule.operationId &&\n !matchesPattern(rule.operationId, operation.operation.operationId ?? \"\")\n ) {\n return false;\n }\n if (rule.path && !matchesPattern(rule.path, operation.path)) return false;\n if (rule.tags?.length) {\n const tags = new Set(operation.operation.tags ?? []);\n if (!rule.tags.some((tag) => tags.has(tag))) return false;\n }\n return true;\n}\n\nfunction matchesPattern(pattern: string | RegExp, value: string): boolean {\n if (typeof pattern === \"string\") return pattern === value;\n pattern.lastIndex = 0;\n return pattern.test(value);\n}\n\nfunction createToolNames(operations: CollectedOpenAPIOperation[]): string[] {\n const seen = new Map<string, number>();\n return operations.map((operation) => {\n const baseName = slugifyToolName(\n operation.operation.operationId ??\n `${operation.method}_${operation.path\n .replace(/[{}]/g, \"\")\n .replace(/\\//g, \"_\")}`\n );\n const count = seen.get(baseName) ?? 0;\n seen.set(baseName, count + 1);\n if (count === 0) return baseName;\n\n const suffix = `_${count + 1}`;\n return `${baseName.slice(0, 64 - suffix.length)}${suffix}`;\n });\n}\n\nfunction createToolDescription(operation: CollectedOpenAPIOperation): string {\n return [\n operation.operation.summary,\n operation.operation.description,\n `HTTP: ${operation.method.toUpperCase()} ${operation.path}`,\n ]\n .filter((part): part is string => Boolean(part))\n .join(\"\\n\\n\");\n}\n\nfunction slugifyToolName(value: string): string {\n const slug = value\n .trim()\n .replace(/[^a-zA-Z0-9_-]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_/, \"\")\n .replace(/_$/, \"\")\n .slice(0, 64);\n return slug || \"openapi_tool\";\n}\n\nfunction createToolInputSchema(\n spec: OpenAPIDocument,\n operation: CollectedOpenAPIOperation,\n inputBindings: OpenAPIInputBindings\n): StandardSchemaWithJSON<Record<string, unknown>, Record<string, unknown>> {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const { parameter, inputName } of inputBindings.parameters) {\n const parameterSchema = transformSchema(\n spec,\n parameter.schema ?? ({} satisfies OpenAPISchemaObject)\n );\n properties[inputName] = {\n ...parameterSchema,\n description: parameter.description ?? `${parameter.in} parameter`,\n };\n if (parameter.required || parameter.in === \"path\") {\n required.push(inputName);\n }\n }\n\n const bodySchema = getJsonRequestBodySchema(operation.requestBody);\n if (bodySchema !== undefined && inputBindings.bodyInputName !== undefined) {\n properties[inputBindings.bodyInputName] = transformSchema(spec, bodySchema);\n if (operation.requestBody?.required) {\n required.push(inputBindings.bodyInputName);\n }\n }\n\n const definitions = createSchemaDefinitions(spec);\n const schema = {\n type: \"object\",\n properties,\n additionalProperties: false,\n ...(required.length > 0 && { required }),\n ...(definitions !== undefined && { $defs: definitions }),\n };\n\n return fromJsonSchema<Record<string, unknown>>(schema as JsonSchemaType);\n}\n\nfunction createInputBindings(\n operation: CollectedOpenAPIOperation\n): OpenAPIInputBindings {\n const parameters = operation.parameters.filter(\n (parameter) => parameter.in !== \"cookie\"\n );\n const bodyInputName =\n getJsonRequestBodySchema(operation.requestBody) === undefined\n ? undefined\n : \"body\";\n const nameCounts = new Map<string, number>();\n for (const parameter of parameters) {\n nameCounts.set(parameter.name, (nameCounts.get(parameter.name) ?? 0) + 1);\n }\n\n const usedNames = new Set(bodyInputName === undefined ? [] : [bodyInputName]);\n const bindings = parameters.map((parameter) => {\n const needsLocation =\n (nameCounts.get(parameter.name) ?? 0) > 1 ||\n parameter.name === bodyInputName;\n const preferredName = needsLocation\n ? `${parameter.name}_${parameter.in}`\n : parameter.name;\n return {\n parameter,\n inputName: claimInputName(preferredName, usedNames),\n };\n });\n\n return {\n parameters: bindings,\n ...(bodyInputName !== undefined && { bodyInputName }),\n };\n}\n\nfunction claimInputName(preferredName: string, usedNames: Set<string>): string {\n let inputName = preferredName;\n let suffix = 2;\n while (usedNames.has(inputName)) {\n inputName = `${preferredName}_${suffix}`;\n suffix += 1;\n }\n usedNames.add(inputName);\n return inputName;\n}\n\nfunction createSchemaDefinitions(\n spec: OpenAPIDocument\n): Record<string, unknown> | undefined {\n const schemas = readRecord(spec.components?.[\"schemas\"]);\n if (schemas === undefined) return undefined;\n\n const definitions: Record<string, unknown> = {};\n for (const [name, schema] of Object.entries(schemas)) {\n definitions[name] = transformSchemaNode(spec, schema, new Set());\n }\n return definitions;\n}\n\nfunction transformSchema(\n spec: OpenAPIDocument,\n schema: OpenAPISchemaObject | OpenAPIReferenceObject\n): Record<string, unknown> {\n const transformed = transformSchemaNode(spec, schema, new Set());\n return readRecord(transformed) ?? {};\n}\n\nfunction transformSchemaNode(\n spec: OpenAPIDocument,\n value: unknown,\n resolvingRefs: Set<string>\n): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => transformSchemaNode(spec, item, resolvingRefs));\n }\n const object = readRecord(value);\n if (object === undefined) return value;\n\n const ref = typeof object[\"$ref\"] === \"string\" ? object[\"$ref\"] : undefined;\n const siblings: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(object)) {\n if (key === \"$ref\") continue;\n if (key === \"nullable\" && typeof child === \"boolean\") continue;\n siblings[key] = transformSchemaNode(spec, child, resolvingRefs);\n }\n\n let transformed: Record<string, unknown> = siblings;\n if (ref !== undefined) {\n const schemaRef = rewriteSchemaRef(spec, ref);\n if (schemaRef !== undefined) {\n transformed = { $ref: schemaRef, ...siblings };\n } else if (!resolvingRefs.has(ref)) {\n const resolved = resolveRef<unknown>(spec, { $ref: ref });\n if (resolved !== undefined) {\n const nextRefs = new Set(resolvingRefs);\n nextRefs.add(ref);\n transformed = {\n ...(readRecord(transformSchemaNode(spec, resolved, nextRefs)) ?? {}),\n ...siblings,\n };\n }\n }\n }\n\n if (object[\"nullable\"] === true) {\n return { anyOf: [transformed, { type: \"null\" }] };\n }\n return transformed;\n}\n\nfunction rewriteSchemaRef(\n spec: OpenAPIDocument,\n ref: string\n): string | undefined {\n const prefix = \"#/components/schemas/\";\n if (!ref.startsWith(prefix)) return undefined;\n return resolveRef<unknown>(spec, { $ref: ref }) === undefined\n ? undefined\n : `#/$defs/${ref.slice(prefix.length)}`;\n}\n\nfunction getJsonRequestBodySchema(\n requestBody: OpenAPIRequestBodyObject | undefined\n): OpenAPISchemaObject | OpenAPIReferenceObject | undefined {\n const content = requestBody?.content;\n if (content === undefined) return undefined;\n return (\n content[\"application/json\"]?.schema ??\n content[\"application/*+json\"]?.schema ??\n Object.entries(content).find(([mediaType]) =>\n mediaType.includes(\"+json\")\n )?.[1].schema\n );\n}\n\nasync function callOpenAPIOperation(\n operation: CollectedOpenAPIOperation,\n params: Record<string, unknown>,\n options: FromOpenAPIOptions,\n inputBindings: OpenAPIInputBindings,\n baseUrl: string\n): Promise<CallToolResult> {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n const url = buildUrl(operation, params, inputBindings.parameters, baseUrl);\n const headers = buildHeaders(inputBindings.parameters, params, options);\n const bodyInputName = inputBindings.bodyInputName;\n const body =\n bodyInputName === undefined || params[bodyInputName] === undefined\n ? undefined\n : JSON.stringify(params[bodyInputName]);\n\n if (body !== undefined && !hasHeader(headers, \"content-type\")) {\n headers[\"content-type\"] = \"application/json\";\n }\n\n const response = await fetchImpl(url, {\n method: operation.method.toUpperCase(),\n headers,\n ...(body !== undefined && { body }),\n });\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n\n if (!response.ok) {\n return {\n content: [{ type: \"text\", text: await response.text() }],\n isError: true,\n };\n }\n if (\n contentType.includes(\"application/json\") ||\n contentType.includes(\"+json\")\n ) {\n const text = await response.text();\n try {\n const data = JSON.parse(text) as JSONValue;\n return {\n content: [{ type: \"text\", text: JSON.stringify(data) }],\n structuredContent: data,\n };\n } catch {\n return { content: [{ type: \"text\", text }] };\n }\n }\n return { content: [{ type: \"text\", text: await response.text() }] };\n}\n\nfunction buildUrl(\n operation: CollectedOpenAPIOperation,\n params: Record<string, unknown>,\n parameterBindings: OpenAPIParameterBinding[],\n baseUrl: string\n): string {\n const interpolatedPath = operation.path.replace(\n /{([^}]+)}/g,\n (_match, name: string) => {\n const binding = parameterBindings.find(\n ({ parameter }) => parameter.in === \"path\" && parameter.name === name\n );\n return encodeURIComponent(\n String(binding === undefined ? \"\" : (params[binding.inputName] ?? \"\"))\n );\n }\n );\n const url = new URL(\n interpolatedPath.replace(/^\\/+/, \"\"),\n ensureTrailingSlash(baseUrl)\n );\n\n for (const { parameter, inputName } of parameterBindings) {\n if (parameter.in !== \"query\") continue;\n const value = params[inputName];\n if (value === undefined || value === null || value === \"\") continue;\n appendQueryParam(url, parameter.name, value);\n }\n return url.toString();\n}\n\nfunction buildHeaders(\n parameterBindings: OpenAPIParameterBinding[],\n params: Record<string, unknown>,\n options: FromOpenAPIOptions\n): Record<string, string> {\n const headers: Record<string, string> = { ...(options.headers ?? {}) };\n\n for (const { parameter, inputName } of parameterBindings) {\n if (parameter.in !== \"header\") continue;\n const value = params[inputName];\n if (value === undefined || value === null || value === \"\") continue;\n headers[parameter.name] = String(value);\n }\n if (options.auth?.type === \"bearer\" && options.auth.token) {\n headers[\"authorization\"] = `Bearer ${options.auth.token}`;\n }\n if (options.auth?.type === \"header\" && options.auth.value) {\n headers[options.auth.name] = options.auth.value;\n }\n return headers;\n}\n\nfunction resolveBaseUrl(options: FromOpenAPIOptions): string {\n const baseUrl = options.baseUrl ?? options.spec.servers?.[0]?.url;\n if (baseUrl === undefined || baseUrl.trim() === \"\") {\n throw new Error(\n \"MCPServer.fromOpenAPI requires options.baseUrl or spec.servers[0].url\"\n );\n }\n return baseUrl;\n}\n\nfunction appendQueryParam(url: URL, name: string, value: unknown): void {\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item !== undefined && item !== null && item !== \"\") {\n url.searchParams.append(name, String(item));\n }\n }\n return;\n }\n url.searchParams.set(name, String(value));\n}\n\nfunction ensureTrailingSlash(url: string): string {\n return url.endsWith(\"/\") ? url : `${url}/`;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n return Object.keys(headers).some(\n (headerName) => headerName.toLowerCase() === name\n );\n}\n\nfunction isReferenceObject(value: unknown): value is OpenAPIReferenceObject {\n const object = readRecord(value);\n return object !== undefined && typeof object[\"$ref\"] === \"string\";\n}\n\nfunction resolveRef<T>(\n spec: OpenAPIDocument,\n value: T | OpenAPIReferenceObject\n): T | undefined {\n if (!isReferenceObject(value)) return value;\n if (!value.$ref.startsWith(\"#/\")) return undefined;\n\n const segments = value.$ref\n .slice(2)\n .split(\"/\")\n .map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"));\n let current: unknown = spec;\n for (const segment of segments) {\n const object = readRecord(current);\n if (object === undefined || !(segment in object)) return undefined;\n current = object[segment];\n }\n return current as T;\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,OAKK;AAwBP,IAAM,eAAoC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQO,SAAS,qBACd,QACA,SACM;AACN,QAAM,aAAa,kBAAkB,QAAQ,MAAM,OAAO;AAC1D,QAAM,QAAQ,gBAAgB,UAAU;AACxC,QAAM,UAAU,WAAW,SAAS,IAAI,eAAe,OAAO,IAAI;AAElE,aAAW,CAAC,OAAO,SAAS,KAAK,WAAW,QAAQ,GAAG;AACrD,UAAM,OAAO,MAAM,KAAK;AACxB,QAAI,SAAS,UAAa,YAAY,OAAW;AACjD,UAAM,gBAAgB,oBAAoB,SAAS;AAEnD,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,aAAa,sBAAsB,SAAS;AAAA,QAC5C,aAAa;AAAA,UACX,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO,WACL,qBAAqB,WAAW,QAAQ,SAAS,eAAe,OAAO;AAAA,IAC3E;AAAA,EACF;AACF;AAYA,SAAS,kBACP,MACA,SAC6B;AAC7B,QAAM,YAAyC,CAAC;AAEhD,aAAW,CAAC,MAAM,aAAa,KAAK,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,GAAG;AACpE,UAAM,WAAW,WAAkC,MAAM,aAAa;AACtE,QAAI,aAAa,UAAa,kBAAkB,QAAQ,EAAG;AAE3D,UAAM,iBAAiB,kBAAkB,MAAM,SAAS,UAAU;AAElE,eAAW,UAAU,cAAc;AACjC,YAAM,iBAAiB,SAAS,MAAM;AACtC,UAAI,mBAAmB,OAAW;AAElC,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,MACF;AACA,UAAI,cAAc,UAAa,kBAAkB,SAAS,EAAG;AAE7D,YAAM,sBAAsB,kBAAkB,MAAM,UAAU,UAAU;AACxE,YAAM,cACJ,UAAU,gBAAgB,SACtB,SACA,WAAqC,MAAM,UAAU,WAAW;AAEtE,YAAM,OAAkC;AAAA,QACtC;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,gBAAgB,gBAAgB,mBAAmB;AAAA,QAC/D,GAAI,gBAAgB,UAClB,CAAC,kBAAkB,WAAW,KAAK,EAAE,YAAY;AAAA,MACrD;AAEA,UAAI,WAAW,MAAM,OAAO,EAAG,WAAU,KAAK,IAAI;AAAA,IACpD;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBACP,MACA,YAC0B;AAC1B,QAAM,WAAqC,CAAC;AAC5C,aAAW,aAAa,cAAc,CAAC,GAAG;AACxC,UAAM,QAAQ,WAAmC,MAAM,SAAS;AAChE,QAAI,UAAU,UAAa,CAAC,kBAAkB,KAAK,EAAG,UAAS,KAAK,KAAK;AAAA,EAC3E;AACA,SAAO;AACT;AAEA,SAAS,gBACP,gBACA,qBAC0B;AAC1B,QAAM,SAAS,oBAAI,IAAoC;AACvD,aAAW,aAAa,CAAC,GAAG,gBAAgB,GAAG,mBAAmB,GAAG;AACnE,WAAO,IAAI,GAAG,UAAU,EAAE,IAAI,UAAU,IAAI,IAAI,SAAS;AAAA,EAC3D;AACA,SAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B;AAEA,SAAS,WACP,WACA,SACS;AACT,MAAI,QAAQ,MAAM,QAAQ;AACxB,UAAM,OAAO,IAAI,IAAI,UAAU,UAAU,QAAQ,CAAC,CAAC;AACnD,QAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,KAAK,IAAI,GAAG,CAAC,EAAG,QAAO;AAAA,EACzD;AAEA,SAAO,EAAE,QAAQ,WAAW,CAAC,GAAG;AAAA,IAAK,CAAC,SACpC,mBAAmB,WAAW,IAAI;AAAA,EACpC;AACF;AAEA,SAAS,mBACP,WACA,MACS;AACT,MAAI,KAAK,UAAU,KAAK,OAAO,YAAY,MAAM,UAAU,QAAQ;AACjE,WAAO;AAAA,EACT;AACA,MACE,KAAK,eACL,CAAC,eAAe,KAAK,aAAa,UAAU,UAAU,eAAe,EAAE,GACvE;AACA,WAAO;AAAA,EACT;AACA,MAAI,KAAK,QAAQ,CAAC,eAAe,KAAK,MAAM,UAAU,IAAI,EAAG,QAAO;AACpE,MAAI,KAAK,MAAM,QAAQ;AACrB,UAAM,OAAO,IAAI,IAAI,UAAU,UAAU,QAAQ,CAAC,CAAC;AACnD,QAAI,CAAC,KAAK,KAAK,KAAK,CAAC,QAAQ,KAAK,IAAI,GAAG,CAAC,EAAG,QAAO;AAAA,EACtD;AACA,SAAO;AACT;AAEA,SAAS,eAAe,SAA0B,OAAwB;AACxE,MAAI,OAAO,YAAY,SAAU,QAAO,YAAY;AACpD,UAAQ,YAAY;AACpB,SAAO,QAAQ,KAAK,KAAK;AAC3B;AAEA,SAAS,gBAAgB,YAAmD;AAC1E,QAAM,OAAO,oBAAI,IAAoB;AACrC,SAAO,WAAW,IAAI,CAAC,cAAc;AACnC,UAAM,WAAW;AAAA,MACf,UAAU,UAAU,eAClB,GAAG,UAAU,MAAM,IAAI,UAAU,KAC9B,QAAQ,SAAS,EAAE,EACnB,QAAQ,OAAO,GAAG,CAAC;AAAA,IAC1B;AACA,UAAM,QAAQ,KAAK,IAAI,QAAQ,KAAK;AACpC,SAAK,IAAI,UAAU,QAAQ,CAAC;AAC5B,QAAI,UAAU,EAAG,QAAO;AAExB,UAAM,SAAS,IAAI,QAAQ,CAAC;AAC5B,WAAO,GAAG,SAAS,MAAM,GAAG,KAAK,OAAO,MAAM,CAAC,GAAG,MAAM;AAAA,EAC1D,CAAC;AACH;AAEA,SAAS,sBAAsB,WAA8C;AAC3E,SAAO;AAAA,IACL,UAAU,UAAU;AAAA,IACpB,UAAU,UAAU;AAAA,IACpB,SAAS,UAAU,OAAO,YAAY,CAAC,IAAI,UAAU,IAAI;AAAA,EAC3D,EACG,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,KAAK,MAAM;AAChB;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,QAAM,OAAO,MACV,KAAK,EACL,QAAQ,oBAAoB,GAAG,EAC/B,QAAQ,OAAO,GAAG,EAClB,QAAQ,MAAM,EAAE,EAChB,QAAQ,MAAM,EAAE,EAChB,MAAM,GAAG,EAAE;AACd,SAAO,QAAQ;AACjB;AAEA,SAAS,sBACP,MACA,WACA,eAC0E;AAC1E,QAAM,aAAsC,CAAC;AAC7C,QAAM,WAAqB,CAAC;AAE5B,aAAW,EAAE,WAAW,UAAU,KAAK,cAAc,YAAY;AAC/D,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA,UAAU,UAAW,CAAC;AAAA,IACxB;AACA,eAAW,SAAS,IAAI;AAAA,MACtB,GAAG;AAAA,MACH,aAAa,UAAU,eAAe,GAAG,UAAU,EAAE;AAAA,IACvD;AACA,QAAI,UAAU,YAAY,UAAU,OAAO,QAAQ;AACjD,eAAS,KAAK,SAAS;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,aAAa,yBAAyB,UAAU,WAAW;AACjE,MAAI,eAAe,UAAa,cAAc,kBAAkB,QAAW;AACzE,eAAW,cAAc,aAAa,IAAI,gBAAgB,MAAM,UAAU;AAC1E,QAAI,UAAU,aAAa,UAAU;AACnC,eAAS,KAAK,cAAc,aAAa;AAAA,IAC3C;AAAA,EACF;AAEA,QAAM,cAAc,wBAAwB,IAAI;AAChD,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN;AAAA,IACA,sBAAsB;AAAA,IACtB,GAAI,SAAS,SAAS,KAAK,EAAE,SAAS;AAAA,IACtC,GAAI,gBAAgB,UAAa,EAAE,OAAO,YAAY;AAAA,EACxD;AAEA,SAAO,eAAwC,MAAwB;AACzE;AAEA,SAAS,oBACP,WACsB;AACtB,QAAM,aAAa,UAAU,WAAW;AAAA,IACtC,CAAC,cAAc,UAAU,OAAO;AAAA,EAClC;AACA,QAAM,gBACJ,yBAAyB,UAAU,WAAW,MAAM,SAChD,SACA;AACN,QAAM,aAAa,oBAAI,IAAoB;AAC3C,aAAW,aAAa,YAAY;AAClC,eAAW,IAAI,UAAU,OAAO,WAAW,IAAI,UAAU,IAAI,KAAK,KAAK,CAAC;AAAA,EAC1E;AAEA,QAAM,YAAY,IAAI,IAAI,kBAAkB,SAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAC5E,QAAM,WAAW,WAAW,IAAI,CAAC,cAAc;AAC7C,UAAM,iBACH,WAAW,IAAI,UAAU,IAAI,KAAK,KAAK,KACxC,UAAU,SAAS;AACrB,UAAM,gBAAgB,gBAClB,GAAG,UAAU,IAAI,IAAI,UAAU,EAAE,KACjC,UAAU;AACd,WAAO;AAAA,MACL;AAAA,MACA,WAAW,eAAe,eAAe,SAAS;AAAA,IACpD;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,GAAI,kBAAkB,UAAa,EAAE,cAAc;AAAA,EACrD;AACF;AAEA,SAAS,eAAe,eAAuB,WAAgC;AAC7E,MAAI,YAAY;AAChB,MAAI,SAAS;AACb,SAAO,UAAU,IAAI,SAAS,GAAG;AAC/B,gBAAY,GAAG,aAAa,IAAI,MAAM;AACtC,cAAU;AAAA,EACZ;AACA,YAAU,IAAI,SAAS;AACvB,SAAO;AACT;AAEA,SAAS,wBACP,MACqC;AACrC,QAAM,UAAU,WAAW,KAAK,aAAa,SAAS,CAAC;AACvD,MAAI,YAAY,OAAW,QAAO;AAElC,QAAM,cAAuC,CAAC;AAC9C,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACpD,gBAAY,IAAI,IAAI,oBAAoB,MAAM,QAAQ,oBAAI,IAAI,CAAC;AAAA,EACjE;AACA,SAAO;AACT;AAEA,SAAS,gBACP,MACA,QACyB;AACzB,QAAM,cAAc,oBAAoB,MAAM,QAAQ,oBAAI,IAAI,CAAC;AAC/D,SAAO,WAAW,WAAW,KAAK,CAAC;AACrC;AAEA,SAAS,oBACP,MACA,OACA,eACS;AACT,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,oBAAoB,MAAM,MAAM,aAAa,CAAC;AAAA,EAC3E;AACA,QAAM,SAAS,WAAW,KAAK;AAC/B,MAAI,WAAW,OAAW,QAAO;AAEjC,QAAM,MAAM,OAAO,OAAO,MAAM,MAAM,WAAW,OAAO,MAAM,IAAI;AAClE,QAAM,WAAoC,CAAC;AAC3C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,QAAQ,OAAQ;AACpB,QAAI,QAAQ,cAAc,OAAO,UAAU,UAAW;AACtD,aAAS,GAAG,IAAI,oBAAoB,MAAM,OAAO,aAAa;AAAA,EAChE;AAEA,MAAI,cAAuC;AAC3C,MAAI,QAAQ,QAAW;AACrB,UAAM,YAAY,iBAAiB,MAAM,GAAG;AAC5C,QAAI,cAAc,QAAW;AAC3B,oBAAc,EAAE,MAAM,WAAW,GAAG,SAAS;AAAA,IAC/C,WAAW,CAAC,cAAc,IAAI,GAAG,GAAG;AAClC,YAAM,WAAW,WAAoB,MAAM,EAAE,MAAM,IAAI,CAAC;AACxD,UAAI,aAAa,QAAW;AAC1B,cAAM,WAAW,IAAI,IAAI,aAAa;AACtC,iBAAS,IAAI,GAAG;AAChB,sBAAc;AAAA,UACZ,GAAI,WAAW,oBAAoB,MAAM,UAAU,QAAQ,CAAC,KAAK,CAAC;AAAA,UAClE,GAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,MAAM,MAAM;AAC/B,WAAO,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC,EAAE;AAAA,EAClD;AACA,SAAO;AACT;AAEA,SAAS,iBACP,MACA,KACoB;AACpB,QAAM,SAAS;AACf,MAAI,CAAC,IAAI,WAAW,MAAM,EAAG,QAAO;AACpC,SAAO,WAAoB,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,SAChD,SACA,WAAW,IAAI,MAAM,OAAO,MAAM,CAAC;AACzC;AAEA,SAAS,yBACP,aAC0D;AAC1D,QAAM,UAAU,aAAa;AAC7B,MAAI,YAAY,OAAW,QAAO;AAClC,SACE,QAAQ,kBAAkB,GAAG,UAC7B,QAAQ,oBAAoB,GAAG,UAC/B,OAAO,QAAQ,OAAO,EAAE;AAAA,IAAK,CAAC,CAAC,SAAS,MACtC,UAAU,SAAS,OAAO;AAAA,EAC5B,IAAI,CAAC,EAAE;AAEX;AAEA,eAAe,qBACb,WACA,QACA,SACA,eACA,SACyB;AACzB,QAAM,YAAY,QAAQ,SAAS,WAAW;AAC9C,QAAM,MAAM,SAAS,WAAW,QAAQ,cAAc,YAAY,OAAO;AACzE,QAAM,UAAU,aAAa,cAAc,YAAY,QAAQ,OAAO;AACtE,QAAM,gBAAgB,cAAc;AACpC,QAAM,OACJ,kBAAkB,UAAa,OAAO,aAAa,MAAM,SACrD,SACA,KAAK,UAAU,OAAO,aAAa,CAAC;AAE1C,MAAI,SAAS,UAAa,CAAC,UAAU,SAAS,cAAc,GAAG;AAC7D,YAAQ,cAAc,IAAI;AAAA,EAC5B;AAEA,QAAM,WAAW,MAAM,UAAU,KAAK;AAAA,IACpC,QAAQ,UAAU,OAAO,YAAY;AAAA,IACrC;AAAA,IACA,GAAI,SAAS,UAAa,EAAE,KAAK;AAAA,EACnC,CAAC;AACD,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAE5D,MAAI,CAAC,SAAS,IAAI;AAChB,WAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,SAAS,KAAK,EAAE,CAAC;AAAA,MACvD,SAAS;AAAA,IACX;AAAA,EACF;AACA,MACE,YAAY,SAAS,kBAAkB,KACvC,YAAY,SAAS,OAAO,GAC5B;AACA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI;AACF,YAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC;AAAA,QACtD,mBAAmB;AAAA,MACrB;AAAA,IACF,QAAQ;AACN,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,IAC7C;AAAA,EACF;AACA,SAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,SAAS,KAAK,EAAE,CAAC,EAAE;AACpE;AAEA,SAAS,SACP,WACA,QACA,mBACA,SACQ;AACR,QAAM,mBAAmB,UAAU,KAAK;AAAA,IACtC;AAAA,IACA,CAAC,QAAQ,SAAiB;AACxB,YAAM,UAAU,kBAAkB;AAAA,QAChC,CAAC,EAAE,UAAU,MAAM,UAAU,OAAO,UAAU,UAAU,SAAS;AAAA,MACnE;AACA,aAAO;AAAA,QACL,OAAO,YAAY,SAAY,KAAM,OAAO,QAAQ,SAAS,KAAK,EAAG;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,IAAI;AAAA,IACd,iBAAiB,QAAQ,QAAQ,EAAE;AAAA,IACnC,oBAAoB,OAAO;AAAA,EAC7B;AAEA,aAAW,EAAE,WAAW,UAAU,KAAK,mBAAmB;AACxD,QAAI,UAAU,OAAO,QAAS;AAC9B,UAAM,QAAQ,OAAO,SAAS;AAC9B,QAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,GAAI;AAC3D,qBAAiB,KAAK,UAAU,MAAM,KAAK;AAAA,EAC7C;AACA,SAAO,IAAI,SAAS;AACtB;AAEA,SAAS,aACP,mBACA,QACA,SACwB;AACxB,QAAM,UAAkC,EAAE,GAAI,QAAQ,WAAW,CAAC,EAAG;AAErE,aAAW,EAAE,WAAW,UAAU,KAAK,mBAAmB;AACxD,QAAI,UAAU,OAAO,SAAU;AAC/B,UAAM,QAAQ,OAAO,SAAS;AAC9B,QAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,GAAI;AAC3D,YAAQ,UAAU,IAAI,IAAI,OAAO,KAAK;AAAA,EACxC;AACA,MAAI,QAAQ,MAAM,SAAS,YAAY,QAAQ,KAAK,OAAO;AACzD,YAAQ,eAAe,IAAI,UAAU,QAAQ,KAAK,KAAK;AAAA,EACzD;AACA,MAAI,QAAQ,MAAM,SAAS,YAAY,QAAQ,KAAK,OAAO;AACzD,YAAQ,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,eAAe,SAAqC;AAC3D,QAAM,UAAU,QAAQ,WAAW,QAAQ,KAAK,UAAU,CAAC,GAAG;AAC9D,MAAI,YAAY,UAAa,QAAQ,KAAK,MAAM,IAAI;AAClD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAAU,MAAc,OAAsB;AACtE,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAW,QAAQ,OAAO;AACxB,UAAI,SAAS,UAAa,SAAS,QAAQ,SAAS,IAAI;AACtD,YAAI,aAAa,OAAO,MAAM,OAAO,IAAI,CAAC;AAAA,MAC5C;AAAA,IACF;AACA;AAAA,EACF;AACA,MAAI,aAAa,IAAI,MAAM,OAAO,KAAK,CAAC;AAC1C;AAEA,SAAS,oBAAoB,KAAqB;AAChD,SAAO,IAAI,SAAS,GAAG,IAAI,MAAM,GAAG,GAAG;AACzC;AAEA,SAAS,UAAU,SAAiC,MAAuB;AACzE,SAAO,OAAO,KAAK,OAAO,EAAE;AAAA,IAC1B,CAAC,eAAe,WAAW,YAAY,MAAM;AAAA,EAC/C;AACF;AAEA,SAAS,kBAAkB,OAAiD;AAC1E,QAAM,SAAS,WAAW,KAAK;AAC/B,SAAO,WAAW,UAAa,OAAO,OAAO,MAAM,MAAM;AAC3D;AAEA,SAAS,WACP,MACA,OACe;AACf,MAAI,CAAC,kBAAkB,KAAK,EAAG,QAAO;AACtC,MAAI,CAAC,MAAM,KAAK,WAAW,IAAI,EAAG,QAAO;AAEzC,QAAM,WAAW,MAAM,KACpB,MAAM,CAAC,EACP,MAAM,GAAG,EACT,IAAI,CAAC,YAAY,QAAQ,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,CAAC;AACnE,MAAI,UAAmB;AACvB,aAAW,WAAW,UAAU;AAC9B,UAAM,SAAS,WAAW,OAAO;AACjC,QAAI,WAAW,UAAa,EAAE,WAAW,QAAS,QAAO;AACzD,cAAU,OAAO,OAAO;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAqD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IACrE,QACD;AACN;","names":[]}
|
package/dist/commands/dev.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolvePort
|
|
3
|
+
} from "../chunk-Q4PUTBMV.js";
|
|
1
4
|
import {
|
|
2
5
|
buildDevViewsManifest,
|
|
3
6
|
discoverEntry,
|
|
@@ -8,9 +11,6 @@ import {
|
|
|
8
11
|
resolveUserViteConfig,
|
|
9
12
|
resolveWorkspacePaths
|
|
10
13
|
} from "../chunk-UDLRVMML.js";
|
|
11
|
-
import {
|
|
12
|
-
resolvePort
|
|
13
|
-
} from "../chunk-Q4PUTBMV.js";
|
|
14
14
|
|
|
15
15
|
// src/cli/dev.ts
|
|
16
16
|
import { spawn as spawn2 } from "child_process";
|
package/dist/index.d.ts
CHANGED
|
@@ -34,6 +34,7 @@ export type { CompletionCallback, CompletionContext } from "./completable.js";
|
|
|
34
34
|
*/
|
|
35
35
|
export type { StandardSchemaV1, StandardSchemaWithJSON, } from "@modelcontextprotocol/server";
|
|
36
36
|
export type { InspectorOptions, ServerConfig } from "./config.js";
|
|
37
|
+
export type { FromOpenAPIOptions, OpenAPIAuth, OpenAPIDocument, OpenAPIExcludeRule, } from "./openapi/index.js";
|
|
37
38
|
export type { Elicit, ElicitationResult, OAuthAuth, RequestClientContext, RequestContext, } from "./context.js";
|
|
38
39
|
export type { InferToolInput, InferToolName, InferToolOutput, ToolCallback, ToolDefinition, ToolRef, ToolResult, ToolViewConfig, } from "./tools.js";
|
|
39
40
|
export type { ExternalViewManifestEntry, InlineViewManifestEntry, UiPermissions, ViewManifestEntry, ViewsManifest, } from "./views/index.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACL,YAAY,EACZ,aAAa,EACb,wBAAwB,EACxB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,0BAA0B,EAC1B,UAAU,EACV,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7D;;;;;GAKG;AACH,YAAY,EACV,cAAc,EACd,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC;;;GAGG;AACH,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,aAAa,EACb,aAAa,EACb,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE9E;;;;;GAKG;AACH,YAAY,EACV,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAClE,YAAY,EACV,MAAM,EACN,iBAAiB,EACjB,SAAS,EACT,oBAAoB,EACpB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,cAAc,EACd,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,EACd,OAAO,EACP,UAAU,EACV,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,yBAAyB,EACzB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,gBAAgB,GACjB,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACL,YAAY,EACZ,aAAa,EACb,wBAAwB,EACxB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,0BAA0B,EAC1B,UAAU,EACV,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7D;;;;;GAKG;AACH,YAAY,EACV,cAAc,EACd,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC;;;GAGG;AACH,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,aAAa,EACb,aAAa,EACb,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE9E;;;;;GAKG;AACH,YAAY,EACV,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAClE,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,MAAM,EACN,iBAAiB,EACjB,SAAS,EACT,oBAAoB,EACpB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,cAAc,EACd,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,EACd,OAAO,EACP,UAAU,EACV,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,yBAAyB,EACzB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,gBAAgB,GACjB,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -19,6 +19,9 @@ import {
|
|
|
19
19
|
resolveLocalOAuthResource,
|
|
20
20
|
wrapOAuthTokenVerifier
|
|
21
21
|
} from "./chunk-DPL7OEXC.js";
|
|
22
|
+
import {
|
|
23
|
+
registerOpenAPITools
|
|
24
|
+
} from "./chunk-AATFAERC.js";
|
|
22
25
|
|
|
23
26
|
// src/server.ts
|
|
24
27
|
import {
|
|
@@ -929,7 +932,7 @@ function viewResourceConfig(_viewName, _entry, authorFacts, servingOrigin, optio
|
|
|
929
932
|
}
|
|
930
933
|
|
|
931
934
|
// src/server.ts
|
|
932
|
-
var MCPServer = class {
|
|
935
|
+
var MCPServer = class _MCPServer {
|
|
933
936
|
#config;
|
|
934
937
|
#tools = /* @__PURE__ */ new Map();
|
|
935
938
|
#resources = /* @__PURE__ */ new Map();
|
|
@@ -955,6 +958,34 @@ var MCPServer = class {
|
|
|
955
958
|
#oauthResourceConfigurationAbsent = false;
|
|
956
959
|
/** Whether the mounted app validates Host headers (fixed at first mount). */
|
|
957
960
|
#hostValidated = false;
|
|
961
|
+
/**
|
|
962
|
+
* Create an MCP server from a parsed, bundled OpenAPI document.
|
|
963
|
+
*
|
|
964
|
+
* Each included OpenAPI operation becomes a tool that validates its input,
|
|
965
|
+
* calls the matching upstream HTTP endpoint, and returns the response using
|
|
966
|
+
* the SDK's raw tool-result shape. External `$ref` values are not fetched;
|
|
967
|
+
* bundle the document before passing it in.
|
|
968
|
+
*
|
|
969
|
+
* @param options - OpenAPI document, operation filters, upstream URL, and
|
|
970
|
+
* request authentication options.
|
|
971
|
+
* @returns An unauthenticated MCP server populated with generated tools.
|
|
972
|
+
*
|
|
973
|
+
* @example
|
|
974
|
+
* ```ts
|
|
975
|
+
* const spec = await fetch("https://api.example.com/openapi.json")
|
|
976
|
+
* .then((response) => response.json());
|
|
977
|
+
* const server = MCPServer.fromOpenAPI({ spec });
|
|
978
|
+
* await server.listen(3000);
|
|
979
|
+
* ```
|
|
980
|
+
*/
|
|
981
|
+
static fromOpenAPI(options) {
|
|
982
|
+
const server = new _MCPServer({
|
|
983
|
+
name: options.name ?? options.spec.info.title,
|
|
984
|
+
version: options.version ?? options.spec.info.version ?? "1.0.0"
|
|
985
|
+
});
|
|
986
|
+
registerOpenAPITools(server, options);
|
|
987
|
+
return server;
|
|
988
|
+
}
|
|
958
989
|
/**
|
|
959
990
|
* Create a server. `config.name` and `config.version` identify the server
|
|
960
991
|
* to clients during initialization. `config.basePath` (default `"/mcp"`)
|