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.
- package/README.md +2 -0
- package/dist/cli/build-helpers.d.ts +1 -1
- package/dist/cli/build-helpers.js +7 -2
- package/dist/cli/build-helpers.js.map +1 -1
- package/dist/cli/build-helpers.test.js +15 -2
- package/dist/cli/build-helpers.test.js.map +1 -1
- package/dist/cli/build-steps.js +3 -3
- package/dist/cli/build-steps.js.map +1 -1
- package/dist/cli/resolve-skybridge-config.d.ts +5 -0
- package/dist/cli/{resolve-views-dir.js → resolve-skybridge-config.js} +4 -3
- package/dist/cli/resolve-skybridge-config.js.map +1 -0
- package/dist/cli/use-execute-steps.d.ts +1 -1
- package/dist/commands/dev.js +2 -2
- package/dist/commands/dev.js.map +1 -1
- package/dist/context-warnings.d.ts +5 -0
- package/dist/context-warnings.js +31 -0
- package/dist/context-warnings.js.map +1 -0
- package/dist/context-warnings.test.js +28 -0
- package/dist/context-warnings.test.js.map +1 -0
- package/dist/server/auth/discovery.d.ts +1 -0
- package/dist/server/auth/discovery.js +1 -1
- package/dist/server/auth/discovery.js.map +1 -1
- package/dist/server/auth/index.d.ts +17 -5
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/auth/providers/auth0.d.ts +24 -2
- package/dist/server/auth/providers/auth0.js.map +1 -1
- package/dist/server/auth/providers/auth0.test.js +4 -2
- package/dist/server/auth/providers/auth0.test.js.map +1 -1
- package/dist/server/auth/providers/authplane.d.ts +49 -0
- package/dist/server/auth/providers/authplane.js +57 -0
- package/dist/server/auth/providers/authplane.js.map +1 -0
- package/dist/server/auth/providers/authplane.test.d.ts +1 -0
- package/dist/server/auth/providers/authplane.test.js +140 -0
- package/dist/server/auth/providers/authplane.test.js.map +1 -0
- package/dist/server/auth/providers/clerk.d.ts +39 -2
- package/dist/server/auth/providers/clerk.js +4 -1
- package/dist/server/auth/providers/clerk.js.map +1 -1
- package/dist/server/auth/providers/clerk.test.js +5 -3
- package/dist/server/auth/providers/clerk.test.js.map +1 -1
- package/dist/server/auth/providers/custom.d.ts +16 -6
- package/dist/server/auth/providers/custom.js +25 -9
- package/dist/server/auth/providers/custom.js.map +1 -1
- package/dist/server/auth/providers/custom.test.js +46 -16
- package/dist/server/auth/providers/custom.test.js.map +1 -1
- package/dist/server/auth/providers/descope.d.ts +31 -2
- package/dist/server/auth/providers/descope.js +12 -3
- package/dist/server/auth/providers/descope.js.map +1 -1
- package/dist/server/auth/providers/descope.test.js +42 -19
- package/dist/server/auth/providers/descope.test.js.map +1 -1
- package/dist/server/auth/providers/stytch.d.ts +15 -2
- package/dist/server/auth/providers/stytch.js +4 -1
- package/dist/server/auth/providers/stytch.js.map +1 -1
- package/dist/server/auth/providers/verify-spy.d.ts +12 -0
- package/dist/server/auth/providers/verify-spy.js +21 -0
- package/dist/server/auth/providers/verify-spy.js.map +1 -0
- package/dist/server/auth/providers/workos.d.ts +24 -2
- package/dist/server/auth/providers/workos.js +4 -1
- package/dist/server/auth/providers/workos.js.map +1 -1
- package/dist/server/auth/setup.d.ts +1 -1
- package/dist/server/auth/setup.js +4 -5
- package/dist/server/auth/setup.js.map +1 -1
- package/dist/server/auth/setup.test.js +39 -15
- package/dist/server/auth/setup.test.js.map +1 -1
- package/dist/server/auth/verify.d.ts +37 -3
- package/dist/server/auth/verify.js +27 -3
- package/dist/server/auth/verify.js.map +1 -1
- package/dist/server/auth/verify.test.js +49 -0
- package/dist/server/auth/verify.test.js.map +1 -1
- package/dist/server/auth-extra.test-d.d.ts +1 -0
- package/dist/server/auth-extra.test-d.js +71 -0
- package/dist/server/auth-extra.test-d.js.map +1 -0
- package/dist/server/auth.d.ts +42 -5
- package/dist/server/auth.js +3 -4
- package/dist/server/auth.js.map +1 -1
- package/dist/server/content-helpers.d.ts +1 -1
- package/dist/server/content-helpers.js.map +1 -1
- package/dist/server/express.js +9 -28
- package/dist/server/express.js.map +1 -1
- package/dist/server/express.test.js +42 -7
- package/dist/server/express.test.js.map +1 -1
- package/dist/server/index.d.ts +11 -7
- package/dist/server/index.js +5 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp-errors.test.d.ts +1 -0
- package/dist/server/mcp-errors.test.js +37 -0
- package/dist/server/mcp-errors.test.js.map +1 -0
- package/dist/server/middleware.d.ts +35 -10
- package/dist/server/middleware.js +33 -0
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/middleware.test-d.js +1 -1
- package/dist/server/middleware.test-d.js.map +1 -1
- package/dist/server/middleware.test.js +38 -3
- package/dist/server/middleware.test.js.map +1 -1
- package/dist/server/register-tool.test.d.ts +1 -0
- package/dist/server/register-tool.test.js +25 -0
- package/dist/server/register-tool.test.js.map +1 -0
- package/dist/server/server.d.ts +86 -50
- package/dist/server/server.js +101 -58
- package/dist/server/server.js.map +1 -1
- package/dist/server/skills-integration.test.js +31 -15
- package/dist/server/skills-integration.test.js.map +1 -1
- package/dist/server/skills.d.ts +14 -10
- package/dist/server/skills.js +48 -38
- package/dist/server/skills.js.map +1 -1
- package/dist/server/skills.test.js +77 -44
- package/dist/server/skills.test.js.map +1 -1
- package/dist/server/tool-extra.test.d.ts +1 -0
- package/dist/server/tool-extra.test.js +72 -0
- package/dist/server/tool-extra.test.js.map +1 -0
- package/dist/server/view-resource-resolution.test.js +1 -3
- package/dist/server/view-resource-resolution.test.js.map +1 -1
- package/dist/standard-schema.d.ts +3 -0
- package/dist/standard-schema.js +2 -0
- package/dist/standard-schema.js.map +1 -0
- package/dist/test/utils.d.ts +5 -8
- package/dist/test/utils.js +8 -4
- package/dist/test/utils.js.map +1 -1
- package/dist/test/view.test.js +17 -17
- package/dist/test/view.test.js.map +1 -1
- package/dist/web/bridges/adaptor.js +14 -17
- package/dist/web/bridges/adaptor.js.map +1 -1
- package/dist/web/bridges/adaptor.test.js +24 -7
- package/dist/web/bridges/adaptor.test.js.map +1 -1
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +1 -1
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +1 -1
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
- package/dist/web/bridges/mcp-app/bridge.js +5 -3
- package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
- package/dist/web/bridges/mcp-app/bridge.test.js +1 -1
- package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -1
- package/dist/web/bridges/mcp-app/types.d.ts +2 -0
- package/dist/web/bridges/mcp-app/types.js.map +1 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +1 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-context.js +1 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
- package/dist/web/bridges/types.d.ts +17 -9
- package/dist/web/bridges/types.js.map +1 -1
- package/dist/web/create-store.test.js +1 -1
- package/dist/web/create-store.test.js.map +1 -1
- package/dist/web/data-llm.test.js +4 -3
- package/dist/web/data-llm.test.js.map +1 -1
- package/dist/web/hooks/index.d.ts +2 -1
- package/dist/web/hooks/index.js +2 -1
- package/dist/web/hooks/index.js.map +1 -1
- package/dist/web/hooks/test/utils.d.ts +2 -1
- package/dist/web/hooks/test/utils.js +1 -1
- package/dist/web/hooks/test/utils.js.map +1 -1
- package/dist/web/hooks/use-call-tool.test.js +2 -2
- package/dist/web/hooks/use-call-tool.test.js.map +1 -1
- package/dist/web/hooks/use-display-mode.d.ts +1 -1
- package/dist/web/hooks/use-display-mode.js +1 -1
- package/dist/web/hooks/use-display-mode.js.map +1 -1
- package/dist/web/hooks/use-display-mode.test.js +1 -1
- package/dist/web/hooks/use-display-mode.test.js.map +1 -1
- package/dist/web/hooks/use-download.d.ts +1 -3
- package/dist/web/hooks/use-download.js +1 -2
- package/dist/web/hooks/use-download.js.map +1 -1
- package/dist/web/hooks/use-download.test.js +5 -5
- package/dist/web/hooks/use-download.test.js.map +1 -1
- package/dist/web/hooks/use-files.test.js +1 -1
- package/dist/web/hooks/use-files.test.js.map +1 -1
- package/dist/web/hooks/use-host.d.ts +22 -0
- package/dist/web/hooks/use-host.js +30 -0
- package/dist/web/hooks/use-host.js.map +1 -0
- package/dist/web/hooks/use-host.test.d.ts +1 -0
- package/dist/web/hooks/use-host.test.js +59 -0
- package/dist/web/hooks/use-host.test.js.map +1 -0
- package/dist/web/hooks/use-open-external.test.js +1 -1
- package/dist/web/hooks/use-open-external.test.js.map +1 -1
- package/dist/web/hooks/use-register-view-tool.d.ts +2 -3
- package/dist/web/hooks/use-register-view-tool.js.map +1 -1
- package/dist/web/hooks/use-request-modal.test.js +1 -1
- package/dist/web/hooks/use-request-modal.test.js.map +1 -1
- package/dist/web/hooks/use-request-size.d.ts +1 -1
- package/dist/web/hooks/use-request-size.js +1 -1
- package/dist/web/hooks/use-request-size.js.map +1 -1
- package/dist/web/hooks/use-set-open-in-app-url.test.js +1 -1
- package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
- package/dist/web/hooks/use-tool-info.d.ts +1 -20
- package/dist/web/hooks/use-tool-info.js +0 -1
- package/dist/web/hooks/use-tool-info.js.map +1 -1
- package/dist/web/hooks/use-tool-info.test-d.js +0 -5
- package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
- package/dist/web/hooks/use-tool-info.test.js +1 -6
- package/dist/web/hooks/use-tool-info.test.js.map +1 -1
- package/dist/web/hooks/use-user.d.ts +3 -2
- package/dist/web/hooks/use-user.js +4 -3
- package/dist/web/hooks/use-user.js.map +1 -1
- package/dist/web/hooks/use-user.test.js +4 -2
- package/dist/web/hooks/use-user.test.js.map +1 -1
- package/dist/web/hooks/use-view-state.js +19 -9
- package/dist/web/hooks/use-view-state.js.map +1 -1
- package/dist/web/hooks/use-view-state.test.js +32 -1
- package/dist/web/hooks/use-view-state.test.js.map +1 -1
- package/dist/web/hooks/use-viewport.d.ts +20 -0
- package/dist/web/hooks/use-viewport.js +21 -0
- package/dist/web/hooks/use-viewport.js.map +1 -0
- package/dist/web/hooks/use-viewport.test.d.ts +1 -0
- package/dist/web/hooks/{use-layout.test.js → use-viewport.test.js} +11 -31
- package/dist/web/hooks/use-viewport.test.js.map +1 -0
- package/dist/web/index.d.ts +1 -0
- package/dist/web/index.js.map +1 -1
- package/dist/web/mount-view.d.ts +3 -2
- package/dist/web/mount-view.js +3 -2
- package/dist/web/mount-view.js.map +1 -1
- package/dist/web/plugin/plugin-build.test.d.ts +1 -0
- package/dist/web/plugin/plugin-build.test.js +54 -0
- package/dist/web/plugin/plugin-build.test.js.map +1 -0
- package/dist/web/plugin/plugin.d.ts +6 -0
- package/dist/web/plugin/plugin.js +18 -6
- package/dist/web/plugin/plugin.js.map +1 -1
- package/dist/web/plugin/plugin.test.d.ts +1 -0
- package/dist/web/plugin/plugin.test.js +61 -0
- package/dist/web/plugin/plugin.test.js.map +1 -0
- package/package.json +10 -6
- package/dist/cli/resolve-views-dir.d.ts +0 -1
- package/dist/cli/resolve-views-dir.js.map +0 -1
- package/dist/web/hooks/use-layout.d.ts +0 -24
- package/dist/web/hooks/use-layout.js +0 -25
- package/dist/web/hooks/use-layout.js.map +0 -1
- package/dist/web/hooks/use-layout.test.js.map +0 -1
- /package/dist/{web/hooks/use-layout.test.d.ts → context-warnings.test.d.ts} +0 -0
package/dist/server/server.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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
|
-
*
|
|
380
|
-
*
|
|
381
|
-
*
|
|
382
|
-
*
|
|
383
|
-
*
|
|
384
|
-
*
|
|
385
|
-
*
|
|
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
|
-
|
|
411
|
+
createStatelessServerInstance() {
|
|
389
412
|
this.applyMcpMiddleware();
|
|
390
|
-
const
|
|
391
|
-
const
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
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(
|
|
507
|
+
resolveViewRequestContext(ctx) {
|
|
471
508
|
const isProduction = process.env.NODE_ENV === "production";
|
|
472
|
-
const
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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(
|
|
733
|
+
registerTool(rawConfig, rawCb) {
|
|
697
734
|
const baseFn = McpServerBase.prototype.registerTool;
|
|
698
|
-
const
|
|
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
|
}
|