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/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";
@@ -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((e) => matchesPattern(e.pattern, method));
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
- if (phase === "before") {
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
- * Middleware runs in registration order; call `next()` to continue the chain.
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
- const { pattern: stripped, phase } = parseMcpPattern(pattern);
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 authInfo = extra?.http?.authInfo;
2325
- const mwCtx = {
2455
+ const serverContext = extra;
2456
+ const params = request.params ?? {};
2457
+ const mwCtx = this.#createMiddlewareContext(
2326
2458
  method,
2327
- params: {},
2328
- ...authInfo !== void 0 && { auth: authInfo },
2329
- state: /* @__PURE__ */ new Map()
2330
- };
2459
+ params,
2460
+ serverContext
2461
+ );
2462
+ let originalEnvelope;
2331
2463
  const innerFn = async () => {
2332
- const result = await original(request, extra);
2333
- return result[resultKey] ?? result;
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
- return { [resultKey]: filtered };
2484
+ if (!Array.isArray(filtered)) {
2485
+ throw new TypeError(
2486
+ `[mcp-use] ${method} middleware must return a ${resultKey} array`
2487
+ );
2338
2488
  }
2339
- return filtered;
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
- { name: definition.name, arguments: args },
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 (isInputRequiredResult(result) || wireResultMeta === void 0 || result.isError === true) {
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
- { uri: uri.href },
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
- { uri: uri.href },
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
- { name: definition.name, arguments: args },
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 isInputRequiredResult2
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
- isInputRequiredResult2 as isInputRequiredResult,
2773
+ isInputRequiredResult3 as isInputRequiredResult,
2604
2774
  jsonBodyMiddleware,
2605
2775
  matchesPath,
2606
2776
  matchesPathPrefix,