mcp-use 2.0.0-beta.13 → 2.0.0-beta.14
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/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +209 -39
- package/dist/index.js.map +1 -1
- package/dist/middleware/mcp-middleware.d.ts +142 -102
- package/dist/middleware/mcp-middleware.d.ts.map +1 -1
- package/dist/server.d.ts +6 -4
- package/dist/server.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index.d.ts
CHANGED
|
@@ -45,8 +45,8 @@ export type { InspectorOptions, ServerConfig, CorsOptions } from "./config.js";
|
|
|
45
45
|
export type { ServerBranding } from "./branding.js";
|
|
46
46
|
/** Official MCP icon shape used by {@link ServerConfig.icons}. */
|
|
47
47
|
export type { Icon } from "@modelcontextprotocol/server";
|
|
48
|
-
export type { MiddlewareContext, McpCompleteEventListenerFn, McpEventListenerFn, McpMiddlewareFn, McpMiddlewareFnFor, McpMiddlewarePatternMap, PromptsGetMiddlewareContext, ResourcesReadMiddlewareContext, ToolsCallMiddlewareContext, } from "./middleware/mcp-middleware.js";
|
|
49
|
-
export { composeMiddleware, matchesPattern, } from "./middleware/mcp-middleware.js";
|
|
48
|
+
export type { MiddlewareContext, McpMiddlewareContext, McpCompleteEventListenerFn, McpEventListenerFnFor, McpEventPattern, McpEventPatternBody, McpEventListenerFn, McpExactMiddlewareFn, McpMiddlewareFn, McpMiddlewareFnFor, McpMiddlewareMethod, McpMiddlewareMethodsForPattern, McpMiddlewareNext, McpMiddlewareOperationMap, McpMiddlewareParams, McpMiddlewarePattern, McpMiddlewarePatternBody, McpMiddlewarePatternMap, McpMiddlewareResult, PromptsGetMiddlewareContext, PromptsListMiddlewareContext, ReadonlyMiddlewareContext, ResourcesReadMiddlewareContext, ResourcesListMiddlewareContext, ToolsCallMiddlewareContext, ToolsListMiddlewareContext, } from "./middleware/mcp-middleware.js";
|
|
49
|
+
export { composeMiddleware, createMcpEventListenerEntry, createMcpMiddlewareEntry, matchesPattern, } from "./middleware/mcp-middleware.js";
|
|
50
50
|
export type { NodeRequestHandler } from "./node-bridge.js";
|
|
51
51
|
export type { FromOpenAPIOptions, OpenAPIAuth, OpenAPIDocument, OpenAPIExcludeRule, } from "./openapi/index.js";
|
|
52
52
|
export type { Elicit, ElicitationResult, OAuthAuth, RequestClientContext, RequestContext, } from "./context.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -51,7 +51,7 @@ import {
|
|
|
51
51
|
localhostAllowedOrigins,
|
|
52
52
|
McpServer as SdkMcpServer,
|
|
53
53
|
ResourceTemplate,
|
|
54
|
-
isInputRequiredResult
|
|
54
|
+
isInputRequiredResult as isInputRequiredResult2
|
|
55
55
|
} from "@modelcontextprotocol/server";
|
|
56
56
|
|
|
57
57
|
// src/branding.ts
|
|
@@ -563,6 +563,72 @@ function isGlobalCorsEnabled(cors) {
|
|
|
563
563
|
}
|
|
564
564
|
|
|
565
565
|
// src/middleware/mcp-middleware.ts
|
|
566
|
+
import {
|
|
567
|
+
CallToolResultSchema,
|
|
568
|
+
GetPromptResultSchema,
|
|
569
|
+
ListPromptsResultSchema,
|
|
570
|
+
ListResourcesResultSchema,
|
|
571
|
+
ListToolsResultSchema,
|
|
572
|
+
ReadResourceResultSchema
|
|
573
|
+
} from "@modelcontextprotocol/core";
|
|
574
|
+
import { isInputRequiredResult } from "@modelcontextprotocol/server";
|
|
575
|
+
var MCP_MIDDLEWARE_METHODS = [
|
|
576
|
+
"tools/call",
|
|
577
|
+
"tools/list",
|
|
578
|
+
"resources/read",
|
|
579
|
+
"resources/list",
|
|
580
|
+
"prompts/get",
|
|
581
|
+
"prompts/list"
|
|
582
|
+
];
|
|
583
|
+
function withMcpMiddlewareParams(request, params) {
|
|
584
|
+
if (typeof request !== "object" || request === null || Array.isArray(request)) {
|
|
585
|
+
throw new TypeError(
|
|
586
|
+
"[mcp-use] MCP middleware received an invalid downstream request"
|
|
587
|
+
);
|
|
588
|
+
}
|
|
589
|
+
return { ...request, params };
|
|
590
|
+
}
|
|
591
|
+
function createMcpMiddlewareEntry(pattern, handler) {
|
|
592
|
+
const normalizedPattern = normalizeMcpMiddlewarePattern(pattern);
|
|
593
|
+
const invoke = handler;
|
|
594
|
+
if (normalizedPattern !== "*" && !isMcpMiddlewareMethod(normalizedPattern)) {
|
|
595
|
+
throw new TypeError(
|
|
596
|
+
`Unsupported MCP middleware pattern "${pattern}". Use an exact MCP method or "mcp:*".`
|
|
597
|
+
);
|
|
598
|
+
}
|
|
599
|
+
if (normalizedPattern === "*") {
|
|
600
|
+
return {
|
|
601
|
+
pattern: normalizedPattern,
|
|
602
|
+
handler: async (ctx, next) => {
|
|
603
|
+
let downstreamCalled = false;
|
|
604
|
+
let downstreamResult;
|
|
605
|
+
await invoke(ctx, async () => {
|
|
606
|
+
downstreamResult = await next();
|
|
607
|
+
downstreamCalled = true;
|
|
608
|
+
});
|
|
609
|
+
if (!downstreamCalled) {
|
|
610
|
+
throw new Error(
|
|
611
|
+
`Wildcard MCP middleware "${normalizedPattern}" must call next()`
|
|
612
|
+
);
|
|
613
|
+
}
|
|
614
|
+
return downstreamResult;
|
|
615
|
+
}
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
return {
|
|
619
|
+
pattern: normalizedPattern,
|
|
620
|
+
handler: (ctx, next) => invoke(ctx, next)
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
function createMcpEventListenerEntry(pattern, handler) {
|
|
624
|
+
const { pattern: normalizedPattern, phase } = parseMcpPattern(pattern);
|
|
625
|
+
const invoke = handler;
|
|
626
|
+
return {
|
|
627
|
+
pattern: normalizedPattern,
|
|
628
|
+
phase,
|
|
629
|
+
handler: (ctx, result) => invoke(ctx, result)
|
|
630
|
+
};
|
|
631
|
+
}
|
|
566
632
|
function matchesPattern(pattern, method) {
|
|
567
633
|
if (pattern === "*") return true;
|
|
568
634
|
if (pattern.endsWith("/*")) {
|
|
@@ -571,8 +637,13 @@ function matchesPattern(pattern, method) {
|
|
|
571
637
|
}
|
|
572
638
|
return pattern === method;
|
|
573
639
|
}
|
|
640
|
+
function isMcpMiddlewareMethod(value) {
|
|
641
|
+
return MCP_MIDDLEWARE_METHODS.some((method) => method === value);
|
|
642
|
+
}
|
|
574
643
|
function composeMiddleware(entries, method, innerFn) {
|
|
575
|
-
const matching = entries.filter(
|
|
644
|
+
const matching = entries.filter(
|
|
645
|
+
(entry) => matchesPattern(entry.pattern, method)
|
|
646
|
+
);
|
|
576
647
|
if (matching.length === 0) {
|
|
577
648
|
return (_ctx) => innerFn();
|
|
578
649
|
}
|
|
@@ -596,17 +667,69 @@ function freezeMiddlewareContext(ctx) {
|
|
|
596
667
|
return Object.freeze({
|
|
597
668
|
method: ctx.method,
|
|
598
669
|
params: Object.freeze({ ...ctx.params }),
|
|
670
|
+
...ctx.session !== void 0 && {
|
|
671
|
+
session: Object.freeze({ ...ctx.session })
|
|
672
|
+
},
|
|
599
673
|
...ctx.auth !== void 0 && { auth: ctx.auth },
|
|
600
|
-
state: ctx.state
|
|
674
|
+
state: new Map(ctx.state)
|
|
601
675
|
});
|
|
602
676
|
}
|
|
603
677
|
async function runMcpOperation(middlewares, events, method, ctx, innerFn) {
|
|
604
678
|
dispatchMcpEvents(events, method, "before", ctx);
|
|
605
679
|
const chained = composeMiddleware(middlewares, method, innerFn);
|
|
606
680
|
const result = await chained(ctx);
|
|
681
|
+
assertValidMiddlewareResult(method, result);
|
|
607
682
|
dispatchMcpEvents(events, method, "complete", ctx, result);
|
|
608
683
|
return result;
|
|
609
684
|
}
|
|
685
|
+
function assertValidMiddlewareResult(method, result) {
|
|
686
|
+
if ((method === "tools/call" || method === "resources/read" || method === "prompts/get") && isInputRequiredResult(result)) {
|
|
687
|
+
return;
|
|
688
|
+
}
|
|
689
|
+
const validation = (() => {
|
|
690
|
+
switch (method) {
|
|
691
|
+
case "tools/call":
|
|
692
|
+
assertArrayProperty(method, result, "content");
|
|
693
|
+
return CallToolResultSchema.safeParse(result);
|
|
694
|
+
case "tools/list":
|
|
695
|
+
assertArrayResult(method, result);
|
|
696
|
+
return ListToolsResultSchema.safeParse({ tools: result });
|
|
697
|
+
case "resources/read":
|
|
698
|
+
assertArrayProperty(method, result, "contents");
|
|
699
|
+
return ReadResourceResultSchema.safeParse(result);
|
|
700
|
+
case "resources/list":
|
|
701
|
+
assertArrayResult(method, result);
|
|
702
|
+
return ListResourcesResultSchema.safeParse({ resources: result });
|
|
703
|
+
case "prompts/get":
|
|
704
|
+
assertArrayProperty(method, result, "messages");
|
|
705
|
+
return GetPromptResultSchema.safeParse(result);
|
|
706
|
+
case "prompts/list":
|
|
707
|
+
assertArrayResult(method, result);
|
|
708
|
+
return ListPromptsResultSchema.safeParse({ prompts: result });
|
|
709
|
+
default:
|
|
710
|
+
throw new TypeError(`Unsupported MCP middleware method "${method}"`);
|
|
711
|
+
}
|
|
712
|
+
})();
|
|
713
|
+
if (!validation.success) {
|
|
714
|
+
throw new TypeError(
|
|
715
|
+
`[mcp-use] ${method} middleware returned an invalid result: ${validation.error.message}`
|
|
716
|
+
);
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
function assertArrayResult(method, result) {
|
|
720
|
+
if (!Array.isArray(result)) {
|
|
721
|
+
throw new TypeError(
|
|
722
|
+
`[mcp-use] ${method} middleware returned an invalid result: expected an array`
|
|
723
|
+
);
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
function assertArrayProperty(method, result, property) {
|
|
727
|
+
if (typeof result !== "object" || result === null || !Array.isArray(result[property])) {
|
|
728
|
+
throw new TypeError(
|
|
729
|
+
`[mcp-use] ${method} middleware returned an invalid result: expected a ${property} array`
|
|
730
|
+
);
|
|
731
|
+
}
|
|
732
|
+
}
|
|
610
733
|
function dispatchMcpEvents(events, method, phase, ctx, result) {
|
|
611
734
|
const frozen = freezeMiddlewareContext(ctx);
|
|
612
735
|
for (const entry of events) {
|
|
@@ -614,11 +737,7 @@ function dispatchMcpEvents(events, method, phase, ctx, result) {
|
|
|
614
737
|
continue;
|
|
615
738
|
}
|
|
616
739
|
try {
|
|
617
|
-
|
|
618
|
-
entry.handler(frozen);
|
|
619
|
-
} else {
|
|
620
|
-
entry.handler(frozen, result);
|
|
621
|
-
}
|
|
740
|
+
entry.handler(frozen, result);
|
|
622
741
|
} catch (error) {
|
|
623
742
|
console.error(
|
|
624
743
|
`[mcp-use] MCP event listener for "${entry.pattern}" (${phase}) threw:`,
|
|
@@ -1412,6 +1531,21 @@ function viewResourceConfig(_viewName, _entry, authorFacts, options) {
|
|
|
1412
1531
|
}
|
|
1413
1532
|
|
|
1414
1533
|
// src/server.ts
|
|
1534
|
+
function omitRootSchemaDialect(schema) {
|
|
1535
|
+
if (typeof schema !== "object" || schema === null || Array.isArray(schema) || !("$schema" in schema)) {
|
|
1536
|
+
return schema;
|
|
1537
|
+
}
|
|
1538
|
+
const emittedSchema = { ...schema };
|
|
1539
|
+
delete emittedSchema["$schema"];
|
|
1540
|
+
return emittedSchema;
|
|
1541
|
+
}
|
|
1542
|
+
function omitToolSchemaDialects(tools) {
|
|
1543
|
+
return tools.map((tool) => ({
|
|
1544
|
+
...tool,
|
|
1545
|
+
inputSchema: omitRootSchemaDialect(tool.inputSchema),
|
|
1546
|
+
...tool.outputSchema === void 0 ? {} : { outputSchema: omitRootSchemaDialect(tool.outputSchema) }
|
|
1547
|
+
}));
|
|
1548
|
+
}
|
|
1415
1549
|
var MCPServer = class _MCPServer {
|
|
1416
1550
|
#config;
|
|
1417
1551
|
#branding;
|
|
@@ -1692,7 +1826,9 @@ var MCPServer = class _MCPServer {
|
|
|
1692
1826
|
* Register MCP operation middleware that intercepts JSON-RPC dispatch.
|
|
1693
1827
|
*
|
|
1694
1828
|
* Patterns use an `mcp:` prefix (for example `mcp:tools/call`, `mcp:*`).
|
|
1695
|
-
*
|
|
1829
|
+
* Exact methods may transform their typed result. The global `mcp:*` pattern
|
|
1830
|
+
* is pass-through middleware. Middleware runs in registration order; call
|
|
1831
|
+
* `next()` to continue the chain.
|
|
1696
1832
|
*
|
|
1697
1833
|
* @example
|
|
1698
1834
|
* ```ts
|
|
@@ -1704,10 +1840,7 @@ var MCPServer = class _MCPServer {
|
|
|
1704
1840
|
*/
|
|
1705
1841
|
use(pattern, handler) {
|
|
1706
1842
|
this.#assertNotStarted("middleware", pattern);
|
|
1707
|
-
this.#mcpMiddlewares.push(
|
|
1708
|
-
pattern: normalizeMcpMiddlewarePattern(pattern),
|
|
1709
|
-
handler
|
|
1710
|
-
});
|
|
1843
|
+
this.#mcpMiddlewares.push(createMcpMiddlewareEntry(pattern, handler));
|
|
1711
1844
|
return this;
|
|
1712
1845
|
}
|
|
1713
1846
|
/**
|
|
@@ -1727,12 +1860,7 @@ var MCPServer = class _MCPServer {
|
|
|
1727
1860
|
*/
|
|
1728
1861
|
on(pattern, handler) {
|
|
1729
1862
|
this.#assertNotStarted("event listener", pattern);
|
|
1730
|
-
|
|
1731
|
-
this.#mcpEventListeners.push({
|
|
1732
|
-
pattern: stripped,
|
|
1733
|
-
phase,
|
|
1734
|
-
handler
|
|
1735
|
-
});
|
|
1863
|
+
this.#mcpEventListeners.push(createMcpEventListenerEntry(pattern, handler));
|
|
1736
1864
|
return this;
|
|
1737
1865
|
}
|
|
1738
1866
|
/**
|
|
@@ -2287,6 +2415,9 @@ var MCPServer = class _MCPServer {
|
|
|
2287
2415
|
return {
|
|
2288
2416
|
method,
|
|
2289
2417
|
params,
|
|
2418
|
+
...ctx.sessionId !== void 0 && {
|
|
2419
|
+
session: { sessionId: ctx.sessionId }
|
|
2420
|
+
},
|
|
2290
2421
|
...ctx.http?.authInfo !== void 0 && { auth: ctx.http.authInfo },
|
|
2291
2422
|
state: /* @__PURE__ */ new Map()
|
|
2292
2423
|
};
|
|
@@ -2312,7 +2443,7 @@ var MCPServer = class _MCPServer {
|
|
|
2312
2443
|
if (handlers === void 0) {
|
|
2313
2444
|
return;
|
|
2314
2445
|
}
|
|
2315
|
-
const wrapListMethod = (method, resultKey) => {
|
|
2446
|
+
const wrapListMethod = (method, resultKey, transform) => {
|
|
2316
2447
|
const original = handlers.get(method);
|
|
2317
2448
|
if (original === void 0) {
|
|
2318
2449
|
return;
|
|
@@ -2321,27 +2452,50 @@ var MCPServer = class _MCPServer {
|
|
|
2321
2452
|
return;
|
|
2322
2453
|
}
|
|
2323
2454
|
const wrapped = async (request, extra) => {
|
|
2324
|
-
const
|
|
2325
|
-
const
|
|
2455
|
+
const serverContext = extra;
|
|
2456
|
+
const params = request.params ?? {};
|
|
2457
|
+
const mwCtx = this.#createMiddlewareContext(
|
|
2326
2458
|
method,
|
|
2327
|
-
params
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2459
|
+
params,
|
|
2460
|
+
serverContext
|
|
2461
|
+
);
|
|
2462
|
+
let originalEnvelope;
|
|
2331
2463
|
const innerFn = async () => {
|
|
2332
|
-
const
|
|
2333
|
-
|
|
2464
|
+
const downstreamRequest = withMcpMiddlewareParams(
|
|
2465
|
+
request,
|
|
2466
|
+
mwCtx.params
|
|
2467
|
+
);
|
|
2468
|
+
const result = await original(downstreamRequest, extra);
|
|
2469
|
+
if (typeof result !== "object" || result === null) {
|
|
2470
|
+
throw new TypeError(
|
|
2471
|
+
`[mcp-use] ${method} handler returned a non-object result`
|
|
2472
|
+
);
|
|
2473
|
+
}
|
|
2474
|
+
originalEnvelope = result;
|
|
2475
|
+
const items = originalEnvelope[resultKey];
|
|
2476
|
+
if (!Array.isArray(items)) {
|
|
2477
|
+
throw new TypeError(
|
|
2478
|
+
`[mcp-use] ${method} handler result is missing a ${resultKey} array`
|
|
2479
|
+
);
|
|
2480
|
+
}
|
|
2481
|
+
return items;
|
|
2334
2482
|
};
|
|
2335
2483
|
const filtered = await this.#runMcpHook(method, mwCtx, innerFn);
|
|
2336
|
-
if (Array.isArray(filtered)) {
|
|
2337
|
-
|
|
2484
|
+
if (!Array.isArray(filtered)) {
|
|
2485
|
+
throw new TypeError(
|
|
2486
|
+
`[mcp-use] ${method} middleware must return a ${resultKey} array`
|
|
2487
|
+
);
|
|
2338
2488
|
}
|
|
2339
|
-
|
|
2489
|
+
const emitted = transform?.(filtered) ?? filtered;
|
|
2490
|
+
return {
|
|
2491
|
+
...originalEnvelope,
|
|
2492
|
+
[resultKey]: emitted
|
|
2493
|
+
};
|
|
2340
2494
|
};
|
|
2341
2495
|
wrapped.__mcpListWrapped = true;
|
|
2342
2496
|
handlers.set(method, wrapped);
|
|
2343
2497
|
};
|
|
2344
|
-
wrapListMethod("tools/list", "tools");
|
|
2498
|
+
wrapListMethod("tools/list", "tools", omitToolSchemaDialects);
|
|
2345
2499
|
wrapListMethod("resources/list", "resources");
|
|
2346
2500
|
wrapListMethod("prompts/list", "prompts");
|
|
2347
2501
|
}
|
|
@@ -2370,7 +2524,11 @@ var MCPServer = class _MCPServer {
|
|
|
2370
2524
|
const invokeTool = async (args, ctx) => {
|
|
2371
2525
|
const mwCtx = this.#createMiddlewareContext(
|
|
2372
2526
|
"tools/call",
|
|
2373
|
-
{
|
|
2527
|
+
{
|
|
2528
|
+
name: definition.name,
|
|
2529
|
+
arguments: args,
|
|
2530
|
+
...ctx.mcpReq._meta !== void 0 && { _meta: ctx.mcpReq._meta }
|
|
2531
|
+
},
|
|
2374
2532
|
ctx
|
|
2375
2533
|
);
|
|
2376
2534
|
const innerFn = async () => {
|
|
@@ -2379,7 +2537,7 @@ var MCPServer = class _MCPServer {
|
|
|
2379
2537
|
effectiveArgs,
|
|
2380
2538
|
this.#toRequestContext(ctx)
|
|
2381
2539
|
);
|
|
2382
|
-
if (
|
|
2540
|
+
if (isInputRequiredResult2(result) || wireResultMeta === void 0 || result.isError === true) {
|
|
2383
2541
|
return result;
|
|
2384
2542
|
}
|
|
2385
2543
|
return {
|
|
@@ -2466,7 +2624,10 @@ var MCPServer = class _MCPServer {
|
|
|
2466
2624
|
async (uri, ctx) => {
|
|
2467
2625
|
const mwCtx = this.#createMiddlewareContext(
|
|
2468
2626
|
"resources/read",
|
|
2469
|
-
{
|
|
2627
|
+
{
|
|
2628
|
+
uri: uri.href,
|
|
2629
|
+
...ctx.mcpReq._meta !== void 0 && { _meta: ctx.mcpReq._meta }
|
|
2630
|
+
},
|
|
2470
2631
|
ctx
|
|
2471
2632
|
);
|
|
2472
2633
|
const innerFn = async () => callback(uri, this.#toRequestContext(ctx));
|
|
@@ -2504,7 +2665,10 @@ var MCPServer = class _MCPServer {
|
|
|
2504
2665
|
async (uri, variables, ctx) => {
|
|
2505
2666
|
const mwCtx = this.#createMiddlewareContext(
|
|
2506
2667
|
"resources/read",
|
|
2507
|
-
{
|
|
2668
|
+
{
|
|
2669
|
+
uri: uri.href,
|
|
2670
|
+
...ctx.mcpReq._meta !== void 0 && { _meta: ctx.mcpReq._meta }
|
|
2671
|
+
},
|
|
2508
2672
|
ctx
|
|
2509
2673
|
);
|
|
2510
2674
|
const innerFn = async () => callback(
|
|
@@ -2548,7 +2712,11 @@ var MCPServer = class _MCPServer {
|
|
|
2548
2712
|
const invokePrompt = async (args, ctx) => {
|
|
2549
2713
|
const mwCtx = this.#createMiddlewareContext(
|
|
2550
2714
|
"prompts/get",
|
|
2551
|
-
{
|
|
2715
|
+
{
|
|
2716
|
+
name: definition.name,
|
|
2717
|
+
arguments: args,
|
|
2718
|
+
...ctx.mcpReq._meta !== void 0 && { _meta: ctx.mcpReq._meta }
|
|
2719
|
+
},
|
|
2552
2720
|
ctx
|
|
2553
2721
|
);
|
|
2554
2722
|
const innerFn = async () => {
|
|
@@ -2586,7 +2754,7 @@ import {
|
|
|
2586
2754
|
createRequestStateCodec,
|
|
2587
2755
|
inputRequired as inputRequired2,
|
|
2588
2756
|
inputResponse as inputResponse2,
|
|
2589
|
-
isInputRequiredResult as
|
|
2757
|
+
isInputRequiredResult as isInputRequiredResult3
|
|
2590
2758
|
} from "@modelcontextprotocol/server";
|
|
2591
2759
|
export {
|
|
2592
2760
|
MCPServer,
|
|
@@ -2594,13 +2762,15 @@ export {
|
|
|
2594
2762
|
completable,
|
|
2595
2763
|
composeFetch,
|
|
2596
2764
|
composeMiddleware,
|
|
2765
|
+
createMcpEventListenerEntry,
|
|
2766
|
+
createMcpMiddlewareEntry,
|
|
2597
2767
|
createMcpMount,
|
|
2598
2768
|
createRequestStateCodec,
|
|
2599
2769
|
getRequestBag,
|
|
2600
2770
|
hostValidationMiddleware,
|
|
2601
2771
|
inputRequired2 as inputRequired,
|
|
2602
2772
|
inputResponse2 as inputResponse,
|
|
2603
|
-
|
|
2773
|
+
isInputRequiredResult3 as isInputRequiredResult,
|
|
2604
2774
|
jsonBodyMiddleware,
|
|
2605
2775
|
matchesPath,
|
|
2606
2776
|
matchesPathPrefix,
|