skybridge 0.0.0-dev.81ea105 → 0.0.0-dev.81fd90a

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 (222) hide show
  1. package/README.md +2 -0
  2. package/dist/cli/build-helpers.d.ts +1 -1
  3. package/dist/cli/build-helpers.js +7 -2
  4. package/dist/cli/build-helpers.js.map +1 -1
  5. package/dist/cli/build-helpers.test.js +15 -2
  6. package/dist/cli/build-helpers.test.js.map +1 -1
  7. package/dist/cli/build-steps.js +3 -3
  8. package/dist/cli/build-steps.js.map +1 -1
  9. package/dist/cli/resolve-skybridge-config.d.ts +5 -0
  10. package/dist/cli/{resolve-views-dir.js → resolve-skybridge-config.js} +4 -3
  11. package/dist/cli/resolve-skybridge-config.js.map +1 -0
  12. package/dist/cli/use-execute-steps.d.ts +1 -1
  13. package/dist/commands/dev.js +2 -2
  14. package/dist/commands/dev.js.map +1 -1
  15. package/dist/context-warnings.d.ts +5 -0
  16. package/dist/context-warnings.js +31 -0
  17. package/dist/context-warnings.js.map +1 -0
  18. package/dist/context-warnings.test.js +28 -0
  19. package/dist/context-warnings.test.js.map +1 -0
  20. package/dist/server/auth/discovery.d.ts +1 -0
  21. package/dist/server/auth/discovery.js +1 -1
  22. package/dist/server/auth/discovery.js.map +1 -1
  23. package/dist/server/auth/index.d.ts +17 -5
  24. package/dist/server/auth/index.js.map +1 -1
  25. package/dist/server/auth/providers/auth0.d.ts +24 -2
  26. package/dist/server/auth/providers/auth0.js.map +1 -1
  27. package/dist/server/auth/providers/auth0.test.js +4 -2
  28. package/dist/server/auth/providers/auth0.test.js.map +1 -1
  29. package/dist/server/auth/providers/authplane.d.ts +49 -0
  30. package/dist/server/auth/providers/authplane.js +57 -0
  31. package/dist/server/auth/providers/authplane.js.map +1 -0
  32. package/dist/server/auth/providers/authplane.test.d.ts +1 -0
  33. package/dist/server/auth/providers/authplane.test.js +140 -0
  34. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  35. package/dist/server/auth/providers/clerk.d.ts +39 -2
  36. package/dist/server/auth/providers/clerk.js +4 -1
  37. package/dist/server/auth/providers/clerk.js.map +1 -1
  38. package/dist/server/auth/providers/clerk.test.js +5 -3
  39. package/dist/server/auth/providers/clerk.test.js.map +1 -1
  40. package/dist/server/auth/providers/custom.d.ts +16 -6
  41. package/dist/server/auth/providers/custom.js +25 -9
  42. package/dist/server/auth/providers/custom.js.map +1 -1
  43. package/dist/server/auth/providers/custom.test.js +46 -16
  44. package/dist/server/auth/providers/custom.test.js.map +1 -1
  45. package/dist/server/auth/providers/descope.d.ts +31 -2
  46. package/dist/server/auth/providers/descope.js +12 -3
  47. package/dist/server/auth/providers/descope.js.map +1 -1
  48. package/dist/server/auth/providers/descope.test.js +42 -19
  49. package/dist/server/auth/providers/descope.test.js.map +1 -1
  50. package/dist/server/auth/providers/stytch.d.ts +15 -2
  51. package/dist/server/auth/providers/stytch.js +4 -1
  52. package/dist/server/auth/providers/stytch.js.map +1 -1
  53. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  54. package/dist/server/auth/providers/verify-spy.js +21 -0
  55. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  56. package/dist/server/auth/providers/workos.d.ts +24 -2
  57. package/dist/server/auth/providers/workos.js +4 -1
  58. package/dist/server/auth/providers/workos.js.map +1 -1
  59. package/dist/server/auth/setup.d.ts +1 -1
  60. package/dist/server/auth/setup.js +4 -5
  61. package/dist/server/auth/setup.js.map +1 -1
  62. package/dist/server/auth/setup.test.js +39 -15
  63. package/dist/server/auth/setup.test.js.map +1 -1
  64. package/dist/server/auth/verify.d.ts +37 -3
  65. package/dist/server/auth/verify.js +27 -3
  66. package/dist/server/auth/verify.js.map +1 -1
  67. package/dist/server/auth/verify.test.js +49 -0
  68. package/dist/server/auth/verify.test.js.map +1 -1
  69. package/dist/server/auth-extra.test-d.d.ts +1 -0
  70. package/dist/server/auth-extra.test-d.js +71 -0
  71. package/dist/server/auth-extra.test-d.js.map +1 -0
  72. package/dist/server/auth.d.ts +42 -5
  73. package/dist/server/auth.js +3 -4
  74. package/dist/server/auth.js.map +1 -1
  75. package/dist/server/content-helpers.d.ts +1 -1
  76. package/dist/server/content-helpers.js.map +1 -1
  77. package/dist/server/express.js +9 -28
  78. package/dist/server/express.js.map +1 -1
  79. package/dist/server/express.test.js +42 -7
  80. package/dist/server/express.test.js.map +1 -1
  81. package/dist/server/index.d.ts +11 -7
  82. package/dist/server/index.js +5 -2
  83. package/dist/server/index.js.map +1 -1
  84. package/dist/server/mcp-errors.test.d.ts +1 -0
  85. package/dist/server/mcp-errors.test.js +37 -0
  86. package/dist/server/mcp-errors.test.js.map +1 -0
  87. package/dist/server/middleware.d.ts +35 -10
  88. package/dist/server/middleware.js +33 -0
  89. package/dist/server/middleware.js.map +1 -1
  90. package/dist/server/middleware.test-d.js +1 -1
  91. package/dist/server/middleware.test-d.js.map +1 -1
  92. package/dist/server/middleware.test.js +38 -3
  93. package/dist/server/middleware.test.js.map +1 -1
  94. package/dist/server/register-tool.test.d.ts +1 -0
  95. package/dist/server/register-tool.test.js +25 -0
  96. package/dist/server/register-tool.test.js.map +1 -0
  97. package/dist/server/server.d.ts +86 -50
  98. package/dist/server/server.js +101 -58
  99. package/dist/server/server.js.map +1 -1
  100. package/dist/server/skills-integration.test.js +31 -15
  101. package/dist/server/skills-integration.test.js.map +1 -1
  102. package/dist/server/skills.d.ts +14 -10
  103. package/dist/server/skills.js +48 -38
  104. package/dist/server/skills.js.map +1 -1
  105. package/dist/server/skills.test.js +77 -44
  106. package/dist/server/skills.test.js.map +1 -1
  107. package/dist/server/tool-extra.test.d.ts +1 -0
  108. package/dist/server/tool-extra.test.js +72 -0
  109. package/dist/server/tool-extra.test.js.map +1 -0
  110. package/dist/server/view-resource-resolution.test.js +1 -3
  111. package/dist/server/view-resource-resolution.test.js.map +1 -1
  112. package/dist/standard-schema.d.ts +3 -0
  113. package/dist/standard-schema.js +2 -0
  114. package/dist/standard-schema.js.map +1 -0
  115. package/dist/test/utils.d.ts +5 -8
  116. package/dist/test/utils.js +8 -4
  117. package/dist/test/utils.js.map +1 -1
  118. package/dist/test/view.test.js +17 -17
  119. package/dist/test/view.test.js.map +1 -1
  120. package/dist/web/bridges/adaptor.js +14 -17
  121. package/dist/web/bridges/adaptor.js.map +1 -1
  122. package/dist/web/bridges/adaptor.test.js +24 -7
  123. package/dist/web/bridges/adaptor.test.js.map +1 -1
  124. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +1 -1
  125. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +1 -1
  126. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  127. package/dist/web/bridges/mcp-app/bridge.js +5 -3
  128. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  129. package/dist/web/bridges/mcp-app/bridge.test.js +1 -1
  130. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -1
  131. package/dist/web/bridges/mcp-app/types.d.ts +2 -0
  132. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  133. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +1 -1
  134. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +1 -1
  135. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  136. package/dist/web/bridges/types.d.ts +17 -9
  137. package/dist/web/bridges/types.js.map +1 -1
  138. package/dist/web/create-store.test.js +1 -1
  139. package/dist/web/create-store.test.js.map +1 -1
  140. package/dist/web/data-llm.test.js +4 -3
  141. package/dist/web/data-llm.test.js.map +1 -1
  142. package/dist/web/hooks/index.d.ts +2 -1
  143. package/dist/web/hooks/index.js +2 -1
  144. package/dist/web/hooks/index.js.map +1 -1
  145. package/dist/web/hooks/test/utils.d.ts +2 -1
  146. package/dist/web/hooks/test/utils.js +1 -1
  147. package/dist/web/hooks/test/utils.js.map +1 -1
  148. package/dist/web/hooks/use-call-tool.test.js +2 -2
  149. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  150. package/dist/web/hooks/use-display-mode.d.ts +1 -1
  151. package/dist/web/hooks/use-display-mode.js +1 -1
  152. package/dist/web/hooks/use-display-mode.js.map +1 -1
  153. package/dist/web/hooks/use-display-mode.test.js +1 -1
  154. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  155. package/dist/web/hooks/use-download.d.ts +1 -3
  156. package/dist/web/hooks/use-download.js +1 -2
  157. package/dist/web/hooks/use-download.js.map +1 -1
  158. package/dist/web/hooks/use-download.test.js +5 -5
  159. package/dist/web/hooks/use-download.test.js.map +1 -1
  160. package/dist/web/hooks/use-files.test.js +1 -1
  161. package/dist/web/hooks/use-files.test.js.map +1 -1
  162. package/dist/web/hooks/use-host.d.ts +22 -0
  163. package/dist/web/hooks/use-host.js +30 -0
  164. package/dist/web/hooks/use-host.js.map +1 -0
  165. package/dist/web/hooks/use-host.test.d.ts +1 -0
  166. package/dist/web/hooks/use-host.test.js +59 -0
  167. package/dist/web/hooks/use-host.test.js.map +1 -0
  168. package/dist/web/hooks/use-open-external.test.js +1 -1
  169. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  170. package/dist/web/hooks/use-register-view-tool.d.ts +2 -3
  171. package/dist/web/hooks/use-register-view-tool.js.map +1 -1
  172. package/dist/web/hooks/use-request-modal.test.js +1 -1
  173. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  174. package/dist/web/hooks/use-request-size.d.ts +1 -1
  175. package/dist/web/hooks/use-request-size.js +1 -1
  176. package/dist/web/hooks/use-request-size.js.map +1 -1
  177. package/dist/web/hooks/use-set-open-in-app-url.test.js +1 -1
  178. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  179. package/dist/web/hooks/use-tool-info.d.ts +1 -20
  180. package/dist/web/hooks/use-tool-info.js +0 -1
  181. package/dist/web/hooks/use-tool-info.js.map +1 -1
  182. package/dist/web/hooks/use-tool-info.test-d.js +0 -5
  183. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  184. package/dist/web/hooks/use-tool-info.test.js +1 -6
  185. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  186. package/dist/web/hooks/use-user.d.ts +3 -2
  187. package/dist/web/hooks/use-user.js +4 -3
  188. package/dist/web/hooks/use-user.js.map +1 -1
  189. package/dist/web/hooks/use-user.test.js +4 -2
  190. package/dist/web/hooks/use-user.test.js.map +1 -1
  191. package/dist/web/hooks/use-view-state.js +19 -9
  192. package/dist/web/hooks/use-view-state.js.map +1 -1
  193. package/dist/web/hooks/use-view-state.test.js +32 -1
  194. package/dist/web/hooks/use-view-state.test.js.map +1 -1
  195. package/dist/web/hooks/use-viewport.d.ts +20 -0
  196. package/dist/web/hooks/use-viewport.js +21 -0
  197. package/dist/web/hooks/use-viewport.js.map +1 -0
  198. package/dist/web/hooks/use-viewport.test.d.ts +1 -0
  199. package/dist/web/hooks/{use-layout.test.js → use-viewport.test.js} +11 -31
  200. package/dist/web/hooks/use-viewport.test.js.map +1 -0
  201. package/dist/web/index.d.ts +1 -0
  202. package/dist/web/index.js.map +1 -1
  203. package/dist/web/mount-view.d.ts +3 -2
  204. package/dist/web/mount-view.js +3 -2
  205. package/dist/web/mount-view.js.map +1 -1
  206. package/dist/web/plugin/plugin-build.test.d.ts +1 -0
  207. package/dist/web/plugin/plugin-build.test.js +54 -0
  208. package/dist/web/plugin/plugin-build.test.js.map +1 -0
  209. package/dist/web/plugin/plugin.d.ts +6 -0
  210. package/dist/web/plugin/plugin.js +18 -6
  211. package/dist/web/plugin/plugin.js.map +1 -1
  212. package/dist/web/plugin/plugin.test.d.ts +1 -0
  213. package/dist/web/plugin/plugin.test.js +61 -0
  214. package/dist/web/plugin/plugin.test.js.map +1 -0
  215. package/package.json +10 -6
  216. package/dist/cli/resolve-views-dir.d.ts +0 -1
  217. package/dist/cli/resolve-views-dir.js.map +0 -1
  218. package/dist/web/hooks/use-layout.d.ts +0 -24
  219. package/dist/web/hooks/use-layout.js +0 -25
  220. package/dist/web/hooks/use-layout.js.map +0 -1
  221. package/dist/web/hooks/use-layout.test.js.map +0 -1
  222. /package/dist/{web/hooks/use-layout.test.d.ts → context-warnings.test.d.ts} +0 -0
@@ -2,16 +2,16 @@ import crypto from "node:crypto";
2
2
  import { readFileSync } from "node:fs";
3
3
  import http from "node:http";
4
4
  import path from "node:path";
5
- import { Server as SdkServer, } from "@modelcontextprotocol/sdk/server/index.js";
6
- import { McpServer as McpServerBase } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { McpServer as McpServerBase, } from "@modelcontextprotocol/server";
7
6
  import { mergeWith, union } from "es-toolkit";
8
7
  import express, {} from "express";
8
+ import { warnOnLargeToolOutput } from "../context-warnings.js";
9
9
  import { authToSecuritySchemes, evaluateSecuritySchemes, inBandChallengeResult, } from "./auth/security-schemes.js";
10
10
  import { setupOAuth } from "./auth/setup.js";
11
11
  import { createApp } from "./express.js";
12
12
  import { hostFromUserAgent } from "./host.js";
13
13
  import { createMiddlewareEntry } from "./metric.js";
14
- import { buildMiddlewareChain, getHandlerMaps } from "./middleware.js";
14
+ import { buildMiddlewareChain, captureToolError, getHandlerMaps, } from "./middleware.js";
15
15
  import { resolveServerOrigin } from "./requestOrigin.js";
16
16
  import { discoverSkills, registerSkills, SKILLS_EXTENSION_KEY, } from "./skills.js";
17
17
  import { templateHelper } from "./templateHelper.js";
@@ -130,26 +130,6 @@ function withSkillsCapability(options, skybridgeOptions) {
130
130
  },
131
131
  };
132
132
  }
133
- // Collapses registerTool's two overloads into a single { config, cb } shape.
134
- // registerTool("greet", { description }, handler)
135
- // -> { config: { name: "greet", description }, cb: handler }
136
- // registerTool({ name: "greet", description }, handler)
137
- // -> { config: { name: "greet", description }, cb: handler }
138
- function normalizeRegisterToolArgs(args) {
139
- if (typeof args[0] === "string") {
140
- return {
141
- config: {
142
- name: args[0],
143
- ...args[1],
144
- },
145
- cb: args[2],
146
- };
147
- }
148
- return {
149
- config: args[0],
150
- cb: args[1],
151
- };
152
- }
153
133
  export class McpServer extends McpServerBaseOmitted {
154
134
  /**
155
135
  * The underlying Express app. Use this to extend the HTTP server with
@@ -169,6 +149,8 @@ export class McpServer extends McpServerBaseOmitted {
169
149
  customErrorMiddleware = [];
170
150
  mcpMiddlewareEntries = [];
171
151
  mcpMiddlewareApplied = false;
152
+ middlewareEntriesCache = null;
153
+ registrations = [];
172
154
  claimedViews = new Map();
173
155
  viewMetaBuilders = new Map();
174
156
  /**
@@ -206,6 +188,43 @@ export class McpServer extends McpServerBaseOmitted {
206
188
  }
207
189
  this.setupSkills(Boolean(skybridgeOptions?.skills));
208
190
  }
191
+ registerResource(...args) {
192
+ return this.recordInherited("registerResource", args);
193
+ }
194
+ /**
195
+ * Register a prompt, recorded so every per-request instance carries it.
196
+ * Signature owned by Skybridge (not inherited) so a typed wrapper can land
197
+ * in a minor without a type-level break.
198
+ */
199
+ registerPrompt(name, config, cb) {
200
+ return this.recordInherited("registerPrompt", [
201
+ name,
202
+ config,
203
+ cb,
204
+ ]);
205
+ }
206
+ recordInherited(method, args) {
207
+ const base = McpServerBase.prototype[method];
208
+ let registered;
209
+ this.record((target) => {
210
+ const result = base.apply(target, args);
211
+ if (target === this) {
212
+ registered = result;
213
+ }
214
+ });
215
+ return registered;
216
+ }
217
+ skillRegistrar() {
218
+ const registerResource = this.registerResource.bind(this);
219
+ return {
220
+ registerResource,
221
+ server: {
222
+ setRequestHandler: ((...args) => {
223
+ this.recordRequestHandler(...args);
224
+ }),
225
+ },
226
+ };
227
+ }
209
228
  setupSkills(enabled) {
210
229
  const manifest = pendingSkillsManifest;
211
230
  pendingSkillsManifest = null;
@@ -216,7 +235,7 @@ export class McpServer extends McpServerBaseOmitted {
216
235
  if (skills.length === 0) {
217
236
  console.warn(`skybridge: the "skills" option is enabled but no skills were found in "${SKILLS_DIR}". Add a <name>/SKILL.md there, or remove the option.`);
218
237
  }
219
- registerSkills(this, skills);
238
+ registerSkills(this.skillRegistrar(), skills);
220
239
  }
221
240
  use(pathOrHandler, ...handlers) {
222
241
  // Branching is load-bearing: Express's `app.use` overloads can't be
@@ -352,7 +371,12 @@ export class McpServer extends McpServerBaseOmitted {
352
371
  toolsListSecuritySchemesEntry,
353
372
  ...this.mcpMiddlewareEntries,
354
373
  ];
355
- const { requestHandlers, notificationHandlers } = getHandlerMaps(this.server);
374
+ this.middlewareEntriesCache = entries;
375
+ this.instrumentHandlers(this.server);
376
+ }
377
+ instrumentHandlers(server) {
378
+ const entries = this.middlewareEntriesCache ?? [];
379
+ const { requestHandlers, notificationHandlers } = getHandlerMaps(server);
356
380
  const instrumentMap = (map, isNotification) => {
357
381
  for (const [method, handler] of map) {
358
382
  map.set(method, buildMiddlewareChain(method, isNotification, handler, entries));
@@ -376,23 +400,36 @@ export class McpServer extends McpServerBaseOmitted {
376
400
  return McpServerBase.prototype.connect.call(this, transport);
377
401
  }
378
402
  /**
379
- * Per-request stateless connect. The SDK's `Protocol` only allows one
380
- * transport per instance, so we can't reuse this `McpServer` across
381
- * concurrent requests. The SDK's idiomatic fix is a `() => McpServer`
382
- * factory, but that would break Skybridge's singleton API — so instead
383
- * we build a fresh underlying `Server` per request and share the main
384
- * server's handler maps by reference. The cast is unavoidable: there's
385
- * no public API to inject handler maps. `getHandlerMaps` validates the
386
- * read side and fails fast on SDK field renames.
403
+ * Build a fresh server for one stateless HTTP request, as
404
+ * `createMcpHandler`'s factory contract requires: every registration is
405
+ * replayed onto the new instance so the SDK's handler closures belong to
406
+ * the instance whose protocol era it stamps. Sharing the singleton's
407
+ * handler maps instead would bind them to an instance that is never
408
+ * marked, pinning every request to the 2025 codec and letting concurrent
409
+ * callers overwrite each other's negotiated version.
387
410
  */
388
- async connectStatelessTransport(transport) {
411
+ createStatelessServerInstance() {
389
412
  this.applyMcpMiddleware();
390
- const { requestHandlers, notificationHandlers } = getHandlerMaps(this.server);
391
- const fresh = new SdkServer(this.serverInfo, this.serverOptions);
392
- const target = fresh;
393
- target._requestHandlers = requestHandlers;
394
- target._notificationHandlers = notificationHandlers;
395
- await fresh.connect(transport);
413
+ const fresh = new McpServerBase(this.serverInfo, this.serverOptions);
414
+ for (const apply of this.registrations) {
415
+ apply(fresh);
416
+ }
417
+ this.instrumentHandlers(fresh.server);
418
+ return fresh.server;
419
+ }
420
+ /**
421
+ * Apply an SDK registration to the singleton and remember it, so each
422
+ * per-request instance can be built with the same surface.
423
+ */
424
+ record(apply) {
425
+ this.registrations.push(apply);
426
+ apply(this);
427
+ }
428
+ /** Records a raw request handler (used for methods the SDK has no sugar for). */
429
+ recordRequestHandler(...args) {
430
+ this.record((target) => {
431
+ target.server.setRequestHandler(...args);
432
+ });
396
433
  }
397
434
  /**
398
435
  * Start the HTTP server. Listens on `process.env.__PORT` (default `3000`),
@@ -467,13 +504,9 @@ export class McpServer extends McpServerBaseOmitted {
467
504
  }
468
505
  this.claimedViews.set(component, toolName);
469
506
  }
470
- resolveViewRequestContext(extra) {
507
+ resolveViewRequestContext(ctx) {
471
508
  const isProduction = process.env.NODE_ENV === "production";
472
- const headers = extra?.requestInfo?.headers || {};
473
- const header = (key) => {
474
- const val = headers[key];
475
- return Array.isArray(val) ? val[0] : val;
476
- };
509
+ const header = (key) => ctx?.http?.req?.headers.get(key) ?? undefined;
477
510
  const isClaude = hostFromUserAgent(header("user-agent")) === "claude";
478
511
  const serverUrl = resolveServerOrigin(header);
479
512
  // Path prefix the proxy routed this request under (e.g. `foo.com/v1`). Read
@@ -489,7 +522,7 @@ export class McpServer extends McpServerBaseOmitted {
489
522
  }
490
523
  let contentMetaOverrides = {};
491
524
  if (isClaude) {
492
- const pathname = extra?.requestInfo?.url?.pathname ?? "";
525
+ const pathname = ctx?.http?.req ? new URL(ctx.http.req.url).pathname : "";
493
526
  const rawUrl = header("x-alpic-forwarded-url") ?? `${serverUrl}${pathname}`;
494
527
  // Strip a lone trailing slash so the hash matches the connector URL
495
528
  // as registered with Claude (which has no trailing slash on bare origins).
@@ -618,20 +651,24 @@ export class McpServer extends McpServerBaseOmitted {
618
651
  this.viewUriByPath.set(`ui://widgets/apps-sdk/${component}.html`, canonicalUri);
619
652
  this.viewUriByPath.set(`ui://widgets/ext-apps/${component}.html`, canonicalUri);
620
653
  }
621
- decorateToolHandler(cb, { attachViewUUID, securitySchemes, }) {
654
+ decorateToolHandler(cb, { attachViewUUID, securitySchemes, toolName, }) {
622
655
  return async (args, extra) => {
623
656
  if (this.oauthEnabled) {
624
- const failure = evaluateSecuritySchemes(securitySchemes, extra.authInfo);
657
+ const failure = evaluateSecuritySchemes(securitySchemes, extra.http?.authInfo);
625
658
  if (failure) {
626
- const headers = extra?.requestInfo?.headers ?? {};
627
- const header = (key) => {
628
- const value = headers[key];
629
- return Array.isArray(value) ? value[0] : value;
630
- };
659
+ const header = (key) => extra.http?.req?.headers.get(key) ?? undefined;
631
660
  return inBandChallengeResult(failure, this.resolveResourceMetadataUrl?.(header));
632
661
  }
633
662
  }
634
- const result = await cb(args, extra);
663
+ let result;
664
+ try {
665
+ result = await cb(args, extra);
666
+ }
667
+ catch (error) {
668
+ captureToolError(extra, error);
669
+ throw error;
670
+ }
671
+ warnOnLargeToolOutput(result, toolName);
635
672
  return {
636
673
  ...result,
637
674
  content: normalizeContent(result.content),
@@ -693,9 +730,10 @@ export class McpServer extends McpServerBaseOmitted {
693
730
  }
694
731
  return JSON.parse(readFileSync(path.join(process.cwd(), "dist", "assets", ".vite", "manifest.json"), "utf-8"));
695
732
  }
696
- registerTool(...args) {
733
+ registerTool(rawConfig, rawCb) {
697
734
  const baseFn = McpServerBase.prototype.registerTool;
698
- const { config, cb } = normalizeRegisterToolArgs(args);
735
+ const config = rawConfig;
736
+ const cb = rawCb;
699
737
  const { name, view, auth, securitySchemes: rawSecuritySchemes, _meta: userToolMeta, ...toolFields } = config;
700
738
  const authNeedsProvider = auth !== undefined &&
701
739
  (!auth.allowsAnonymous || Boolean(auth.scopes?.length));
@@ -723,8 +761,13 @@ export class McpServer extends McpServerBaseOmitted {
723
761
  const wrappedCb = this.decorateToolHandler(cb, {
724
762
  attachViewUUID: Boolean(view),
725
763
  securitySchemes,
764
+ toolName: name,
765
+ });
766
+ this.record((target) => {
767
+ baseFn.call(target, name, { ...toolFields, _meta: toolMeta }, toolFields.inputSchema === undefined
768
+ ? (extra) => wrappedCb({}, extra)
769
+ : wrappedCb);
726
770
  });
727
- baseFn.call(this, name, { ...toolFields, _meta: toolMeta }, wrappedCb);
728
771
  return this;
729
772
  }
730
773
  }