@silkweave/mcp 1.8.0 → 1.9.0

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.
@@ -1,17 +1,13 @@
1
-
2
- 
3
- > @silkweave/mcp@1.7.1 build /Users/atomic/projects/silkweave/silkweave/packages/mcp
4
- > tsdown
5
-
6
- ℹ tsdown v0.21.8 powered by rolldown v1.0.0-rc.15
7
- ℹ config file: /Users/atomic/projects/silkweave/silkweave/packages/mcp/tsdown.config.ts
8
- ℹ entry: src/index.ts
9
- ℹ tsconfig: tsconfig.json
10
- ℹ Build start
11
- ℹ Cleaning 4 files
12
- ℹ build/index.mjs 16.50 kB │ gzip: 4.74 kB
13
- ℹ build/index.mjs.map 30.99 kB │ gzip: 8.52 kB
14
- ℹ build/index.d.mts.map  0.93 kB │ gzip: 0.43 kB
15
- ℹ build/index.d.mts  2.15 kB │ gzip: 0.80 kB
16
- ℹ 4 files, total: 50.57 kB
17
- ✔ Build complete in 1056ms
1
+ $ tsdown
2
+ ℹ tsdown v0.21.8 powered by rolldown v1.0.0-rc.15
3
+ ℹ config file: /Users/atomic/projects/silkweave/silkweave/packages/mcp/tsdown.config.ts
4
+ ℹ entry: src/index.ts
5
+ ℹ tsconfig: tsconfig.json
6
+ ℹ Build start
7
+ ℹ Cleaning 4 files
8
+ ℹ build/index.mjs 17.31 kB │ gzip: 5.04 kB
9
+ ℹ build/index.mjs.map 32.92 kB │ gzip: 9.07 kB
10
+ ℹ build/index.d.mts.map  1.22 kB │ gzip: 0.55 kB
11
+ ℹ build/index.d.mts  3.71 kB │ gzip: 1.36 kB
12
+ ℹ 4 files, total: 55.16 kB
13
+ ✔ Build complete in 673ms
@@ -1,13 +1,4 @@
1
-
2
- 
3
- > @silkweave/mcp@1.7.0 check /Users/atomic/projects/silkweave/silkweave/packages/mcp
4
- > pnpm lint && pnpm typecheck
5
-
6
-
7
- > @silkweave/mcp@1.7.0 lint /Users/atomic/projects/silkweave/silkweave/packages/mcp
8
- > eslint
9
-
10
-
11
- > @silkweave/mcp@1.7.0 typecheck /Users/atomic/projects/silkweave/silkweave/packages/mcp
12
- > tsc --noEmit
13
-
1
+ $ pnpm lint && pnpm typecheck
2
+ $ eslint
3
+ [ELIFECYCLE] Command failed.
4
+ [ELIFECYCLE] Command failed.
@@ -1,14 +1,14 @@
1
1
 
2
2
  
3
- > @silkweave/mcp@1.7.1 prepack /Users/atomic/projects/silkweave/silkweave/packages/mcp
3
+ > @silkweave/mcp@1.8.0 prepack /Users/atomic/projects/silkweave/silkweave/packages/mcp
4
4
  > pnpm clean && pnpm build
5
5
 
6
6
 
7
- > @silkweave/mcp@1.7.1 clean /Users/atomic/projects/silkweave/silkweave/packages/mcp
7
+ > @silkweave/mcp@1.8.0 clean /Users/atomic/projects/silkweave/silkweave/packages/mcp
8
8
  > rimraf build
9
9
 
10
10
 
11
- > @silkweave/mcp@1.7.1 build /Users/atomic/projects/silkweave/silkweave/packages/mcp
11
+ > @silkweave/mcp@1.8.0 build /Users/atomic/projects/silkweave/silkweave/packages/mcp
12
12
  > tsdown
13
13
 
14
14
  ℹ tsdown v0.21.8 powered by rolldown v1.0.0-rc.15
@@ -21,4 +21,4 @@
21
21
  ℹ build/index.d.mts.map  0.93 kB │ gzip: 0.43 kB
22
22
  ℹ build/index.d.mts  2.15 kB │ gzip: 0.80 kB
23
23
  ℹ 4 files, total: 50.57 kB
24
- ✔ Build complete in 600ms
24
+ ✔ Build complete in 755ms
package/build/index.d.mts CHANGED
@@ -1,8 +1,9 @@
1
1
  import { CallToolResult, ContentBlock, EmbeddedResource } from "@modelcontextprotocol/sdk/types.js";
2
- import { AdapterFactory, SilkweaveError } from "@silkweave/core";
2
+ import { Action, AdapterFactory, SilkweaveContext, SilkweaveError, SilkweaveOptions } from "@silkweave/core";
3
3
  import { CreateMcpExpressAppOptions } from "@modelcontextprotocol/sdk/server/express.js";
4
4
  import { AuthConfig } from "@silkweave/auth";
5
5
  import { CorsOptions, CorsOptions as CorsOptions$1 } from "cors";
6
+ import { Express } from "express";
6
7
 
7
8
  //#region src/adapter/cliProxy.d.ts
8
9
  type CLIFormatterFn = (message: ContentBlock, index: number, messages: ContentBlock[]) => string | undefined;
@@ -12,8 +13,32 @@ interface CliProxyOptions {
12
13
  }
13
14
  declare const cliProxy: AdapterFactory<CliProxyOptions>;
14
15
  //#endregion
16
+ //#region src/lib/handler.d.ts
17
+ /** Headers required by the MCP protocol that must always be exposed when CORS is in use. */
18
+ declare const MCP_REQUIRED_HEADERS: string[];
19
+ interface CreateMcpExpressHandlerOptions extends CreateMcpExpressAppOptions {
20
+ /** Bearer-token / OAuth auth configuration. Omit to disable auth entirely. */
21
+ auth?: AuthConfig;
22
+ /** CORS configuration. `false` to disable, `true`/`undefined` for permissive defaults, or a CorsOptions object. */
23
+ cors?: CorsOptions$1 | boolean;
24
+ /** Hostname for the underlying express app (used by some MCP SDK checks). Default `'0.0.0.0'`. */
25
+ host?: string;
26
+ /** Mount the `/resource/:id` sideload route on the returned app. Default `true`. */
27
+ sideloadResources?: boolean;
28
+ }
29
+ /**
30
+ * Build an Express sub-app exposing the MCP Streamable HTTP transport, OAuth
31
+ * routes (if configured), and bearer-token auth middleware. The returned app
32
+ * can be listened on directly OR mounted onto an existing server via
33
+ * `parentApp.use(basePath, app)` / Nest's `httpAdapter.use(basePath, app)`.
34
+ *
35
+ * Used by `@silkweave/mcp`'s `http()` adapter (server-owning) and
36
+ * `@silkweave/nestjs`'s `mcp()` adapter (mounts on Nest's HTTP server).
37
+ */
38
+ declare function createMcpExpressHandler(silkweaveOptions: SilkweaveOptions, context: SilkweaveContext, actions: Action[], options?: CreateMcpExpressHandlerOptions): Express;
39
+ //#endregion
15
40
  //#region src/adapter/http.d.ts
16
- interface HttpAdapterOptions extends CreateMcpExpressAppOptions {
41
+ interface HttpAdapterOptions extends Omit<CreateMcpExpressHandlerOptions, 'auth' | 'cors'> {
17
42
  host: string;
18
43
  port: number;
19
44
  auth?: AuthConfig;
@@ -50,5 +75,5 @@ declare function createSideloadResource(buffer: Buffer, {
50
75
  contentType
51
76
  }: Pick<SideloadResource, 'name' | 'contentType'>): Promise<SideloadResource>;
52
77
  //#endregion
53
- export { CLIFormatterFn, CliProxyOptions, type CorsOptions, HttpAdapterOptions, SideloadResource, cliProxy, createSideloadResource, errorToolResult, handleToolError, http, jsonToolResult, parseResourceMessage, smartToolResult, stdio };
78
+ export { CLIFormatterFn, CliProxyOptions, type CorsOptions, CreateMcpExpressHandlerOptions, HttpAdapterOptions, MCP_REQUIRED_HEADERS, SideloadResource, cliProxy, createMcpExpressHandler, createSideloadResource, errorToolResult, handleToolError, http, jsonToolResult, parseResourceMessage, smartToolResult, stdio };
54
79
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/adapter/cliProxy.ts","../src/adapter/http.ts","../src/adapter/stdio.ts","../src/util/result.ts","../src/util/sideload.ts"],"mappings":";;;;;;;KAaY,cAAA,IAAkB,OAAA,EAAS,YAAA,EAAc,KAAA,UAAe,QAAA,EAAU,YAAA;AAAA,UAE7D,eAAA;EACf,GAAA,EAAK,GAAA;EACL,SAAA,GAAY,cAAA;AAAA;AAAA,cAgCD,QAAA,EAAU,cAAA,CAAe,eAAA;;;UC1BrB,kBAAA,SAA2B,0BAAA;EAC1C,IAAA;EACA,IAAA;EACA,IAAA,GAAO,UAAA;EDbiB;ECexB,IAAA,GAAO,aAAA;AAAA;AAAA,cA2LI,IAAA,EAAM,cAAA,CAAe,kBAAA;;;cCpLrB,KAAA,EAAO,cAAA;;;iBC/BJ,eAAA,CAAgB,IAAA,+BAAmC,cAAA;AAAA,iBAqBnD,cAAA,CAAe,IAAA,UAAc,OAAA,aAAkB,cAAA;AAAA,iBAM/C,eAAA,CAAA;EAAkB,IAAA;EAAM,IAAA;EAAM;AAAA,GAAW,cAAA,GAAiB,cAAA;AAAA,iBAU1D,eAAA,CAAgB,KAAA,YAAiB,cAAA;AAAA,iBAUjC,oBAAA,CAAA;EAAuB;AAAA,GAAY,gBAAA;;;UChDlC,gBAAA;EACf,EAAA;EACA,IAAA;EACA,WAAA;EACA,IAAA;AAAA;AAAA,iBAGoB,sBAAA,CAAuB,MAAA,EAAQ,MAAA;EAAU,IAAA;EAAM;AAAA,GAAe,IAAA,CAAK,gBAAA,4BAAyC,OAAA,CAAA,gBAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/adapter/cliProxy.ts","../src/lib/handler.ts","../src/adapter/http.ts","../src/adapter/stdio.ts","../src/util/result.ts","../src/util/sideload.ts"],"mappings":";;;;;;;;KAaY,cAAA,IAAkB,OAAA,EAAS,YAAA,EAAc,KAAA,UAAe,QAAA,EAAU,YAAA;AAAA,UAE7D,eAAA;EACf,GAAA,EAAK,GAAA;EACL,SAAA,GAAY,cAAA;AAAA;AAAA,cAgCD,QAAA,EAAU,cAAA,CAAe,eAAA;;;;cC7BzB,oBAAA;AAAA,UAEI,8BAAA,SAAuC,0BAAA;EDT5C;ECWV,IAAA,GAAO,UAAA;;EAEP,IAAA,GAAO,aAAA;EDb8B;ECerC,IAAA;EDfmD;ECiBnD,iBAAA;AAAA;;;ADfF;;;;;;;iBCqNgB,uBAAA,CACd,gBAAA,EAAkB,gBAAA,EAClB,OAAA,EAAS,gBAAA,EACT,OAAA,EAAS,MAAA,IACT,OAAA,GAAS,8BAAA,GACR,OAAA;;;UClOc,kBAAA,SAA2B,IAAA,CAAK,8BAAA;EAC/C,IAAA;EACA,IAAA;EACA,IAAA,GAAO,UAAA;EFGG;EEDV,IAAA,GAAO,aAAA;AAAA;AAAA,cAGI,IAAA,EAAM,cAAA,CAAe,kBAAA;;;cCoBrB,KAAA,EAAO,cAAA;;;iBC/BJ,eAAA,CAAgB,IAAA,+BAAmC,cAAA;AAAA,iBAqBnD,cAAA,CAAe,IAAA,UAAc,OAAA,aAAkB,cAAA;AAAA,iBAM/C,eAAA,CAAA;EAAkB,IAAA;EAAM,IAAA;EAAM;AAAA,GAAW,cAAA,GAAiB,cAAA;AAAA,iBAU1D,eAAA,CAAgB,KAAA,YAAiB,cAAA;AAAA,iBAUjC,oBAAA,CAAA;EAAuB;AAAA,GAAY,gBAAA;;;UChDlC,gBAAA;EACf,EAAA;EACA,IAAA;EACA,WAAA;EACA,IAAA;AAAA;AAAA,iBAGoB,sBAAA,CAAuB,MAAA,EAAQ,MAAA;EAAU,IAAA;EAAM;AAAA,GAAe,IAAA,CAAK,gBAAA,4BAAyC,OAAA,CAAA,gBAAA"}
package/build/index.mjs CHANGED
@@ -171,29 +171,31 @@ const cliProxy = ({ url, formatter = defaultFormatter }) => {
171
171
  };
172
172
  };
173
173
  //#endregion
174
- //#region src/adapter/http.ts
174
+ //#region src/lib/handler.ts
175
175
  const authStorage = new AsyncLocalStorage();
176
- /** Headers required by the MCP protocol that must always be exposed */
176
+ /** Headers required by the MCP protocol that must always be exposed when CORS is in use. */
177
177
  const MCP_REQUIRED_HEADERS = [
178
178
  "WWW-Authenticate",
179
179
  "Mcp-Session-Id",
180
180
  "Last-Event-Id",
181
181
  "Mcp-Protocol-Version"
182
182
  ];
183
- function mountOAuthRoutes(app, auth) {
184
- const provider = auth.provider;
185
- const callbackPath = auth.callbackPath ?? "/auth/callback";
186
- const toOAuthReq = (req) => ({
183
+ function toOAuthReq(req) {
184
+ return {
187
185
  method: req.method,
188
186
  url: new URL(req.url, `${req.protocol}://${req.get("host")}`),
189
187
  headers: Object.fromEntries(Object.entries(req.headers).map(([k, v]) => [k, Array.isArray(v) ? v[0] : v])),
190
188
  body: req.body
191
- });
192
- const sendOAuth = (res, oauthRes) => {
193
- for (const [key, value] of Object.entries(oauthRes.headers)) res.header(key, value);
194
- if (oauthRes.body) res.status(oauthRes.status).send(typeof oauthRes.body === "string" ? oauthRes.body : JSON.stringify(oauthRes.body));
195
- else res.status(oauthRes.status).end();
196
189
  };
190
+ }
191
+ function sendOAuth(res, oauthRes) {
192
+ for (const [key, value] of Object.entries(oauthRes.headers)) res.header(key, value);
193
+ if (oauthRes.body) res.status(oauthRes.status).send(typeof oauthRes.body === "string" ? oauthRes.body : JSON.stringify(oauthRes.body));
194
+ else res.status(oauthRes.status).end();
195
+ }
196
+ function mountOAuthRoutes(app, auth) {
197
+ const provider = auth.provider;
198
+ const callbackPath = auth.callbackPath ?? "/auth/callback";
197
199
  app.get("/.well-known/oauth-authorization-server", (_req, res) => {
198
200
  sendOAuth(res, provider.metadata());
199
201
  });
@@ -359,46 +361,65 @@ function mountMcpTransport(app, transports, createServer) {
359
361
  app.delete("/mcp", handleSessionStream);
360
362
  app.get("/mcp/resource/:id", handleSessionStream);
361
363
  }
364
+ /**
365
+ * Build an Express sub-app exposing the MCP Streamable HTTP transport, OAuth
366
+ * routes (if configured), and bearer-token auth middleware. The returned app
367
+ * can be listened on directly OR mounted onto an existing server via
368
+ * `parentApp.use(basePath, app)` / Nest's `httpAdapter.use(basePath, app)`.
369
+ *
370
+ * Used by `@silkweave/mcp`'s `http()` adapter (server-owning) and
371
+ * `@silkweave/nestjs`'s `mcp()` adapter (mounts on Nest's HTTP server).
372
+ */
373
+ function createMcpExpressHandler(silkweaveOptions, context, actions, options = {}) {
374
+ const { auth, cors: corsConfig, host = "0.0.0.0", sideloadResources = true, ...mcpOptions } = options;
375
+ const app = createMcpExpressApp({
376
+ ...mcpOptions,
377
+ host
378
+ });
379
+ if (corsConfig !== false) {
380
+ const userConfig = corsConfig === true || corsConfig === void 0 ? {} : corsConfig;
381
+ const userExposed = userConfig.exposedHeaders;
382
+ const exposedHeaders = [...MCP_REQUIRED_HEADERS, ...Array.isArray(userExposed) ? userExposed : userExposed ? [userExposed] : []];
383
+ app.use(cors({
384
+ origin: "*",
385
+ ...userConfig,
386
+ exposedHeaders
387
+ }));
388
+ }
389
+ if (auth?.authorizationServers?.length && auth.resourceUrl) app.get("/.well-known/oauth-protected-resource", (_req, res) => {
390
+ const metadata = generateProtectedResourceMetadata(auth.resourceUrl, auth.authorizationServers);
391
+ res.json(metadata);
392
+ });
393
+ const oauthPaths = auth?.provider ? mountOAuthRoutes(app, auth) : /* @__PURE__ */ new Set();
394
+ if (auth) mountAuthMiddleware(app, auth, oauthPaths, context);
395
+ if (sideloadResources) app.get("/resource/:id", async (req, res) => {
396
+ const id = req.params.id;
397
+ if (!id || typeof id !== "string") throw new Error("Invalid ID");
398
+ const resourceMeta = JSON.parse(await readFile(`resources/${id}.json`, "utf-8"));
399
+ const buffer = await readFile(`resources/${id}`);
400
+ res.status(200);
401
+ res.header("Content-Type", resourceMeta.contentType);
402
+ res.send(buffer);
403
+ });
404
+ mountMcpTransport(app, {}, () => createMcpServer(silkweaveOptions, actions, context));
405
+ return app;
406
+ }
407
+ //#endregion
408
+ //#region src/adapter/http.ts
362
409
  const http = ({ host, port, auth, cors: corsConfig, ...mcpOptions }) => {
363
410
  return (options, baseContext) => {
364
411
  const context = baseContext.fork({ adapter: "http" });
365
- const app = createMcpExpressApp({
366
- ...mcpOptions,
367
- host
368
- });
369
- if (corsConfig !== false) {
370
- const userConfig = corsConfig === true || corsConfig === void 0 ? {} : corsConfig;
371
- const userExposed = userConfig.exposedHeaders;
372
- const exposedHeaders = [...MCP_REQUIRED_HEADERS, ...Array.isArray(userExposed) ? userExposed : userExposed ? [userExposed] : []];
373
- app.use(cors({
374
- origin: "*",
375
- ...userConfig,
376
- exposedHeaders
377
- }));
378
- }
379
- if (auth?.authorizationServers?.length && auth.resourceUrl) app.get("/.well-known/oauth-protected-resource", (_req, res) => {
380
- const metadata = generateProtectedResourceMetadata(auth.resourceUrl, auth.authorizationServers);
381
- res.json(metadata);
382
- });
383
- const oauthPaths = auth?.provider ? mountOAuthRoutes(app, auth) : /* @__PURE__ */ new Set();
384
- if (auth) mountAuthMiddleware(app, auth, oauthPaths, context);
385
- const transports = {};
386
- let mountedActions = [];
387
- app.get("/resource/:id", async (req, res) => {
388
- const id = req.params.id;
389
- if (!id || typeof id !== "string") throw new Error("Invalid ID");
390
- const resourceMeta = JSON.parse(await readFile(`resources/${id}.json`, "utf-8"));
391
- const buffer = await readFile(`resources/${id}`);
392
- res.status(200);
393
- res.header("Content-Type", resourceMeta.contentType);
394
- res.send(buffer);
395
- });
396
- mountMcpTransport(app, transports, () => createMcpServer(options, mountedActions, context));
397
412
  let httpServer;
413
+ let app;
398
414
  return {
399
415
  context,
400
416
  start: async (actions) => {
401
- mountedActions = actions;
417
+ app = createMcpExpressHandler(options, context, actions, {
418
+ ...mcpOptions,
419
+ host,
420
+ auth,
421
+ cors: corsConfig
422
+ });
402
423
  httpServer = app.listen(port, host, (error) => {
403
424
  if (error) {
404
425
  console.error("Failed to start server:", error);
@@ -496,6 +517,6 @@ async function createSideloadResource(buffer, { name, contentType }) {
496
517
  return resource;
497
518
  }
498
519
  //#endregion
499
- export { cliProxy, createSideloadResource, errorToolResult, handleToolError, http, jsonToolResult, parseResourceMessage, smartToolResult, stdio };
520
+ export { MCP_REQUIRED_HEADERS, cliProxy, createMcpExpressHandler, createSideloadResource, errorToolResult, handleToolError, http, jsonToolResult, parseResourceMessage, smartToolResult, stdio };
500
521
 
501
522
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["randomUUID","registerTools"],"sources":["../src/util/result.ts","../src/adapter/cliProxy.ts","../src/adapter/http.ts","../src/adapter/stdio.ts","../src/util/sideload.ts"],"sourcesContent":["import { EmbeddedResource, type CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport { SilkweaveError } from '@silkweave/core'\nimport { randomUUID } from 'node:crypto'\n\nexport function smartToolResult(data: string | object | object[]): CallToolResult {\n const text = typeof data === 'string' ? data : JSON.stringify(data)\n const mimeType = typeof data === 'string' ? 'text/plain' : 'application/json'\n const ext = typeof data === 'string' ? 'txt' : 'json'\n if (text.length > 4096) {\n const uri = `mcp://toolResult/${randomUUID()}.${ext}`\n const buffer = Buffer.from(text)\n const blob = buffer.toString('base64')\n return {\n content: [\n { type: 'text', text: `Received resource ${uri} with ${buffer.byteLength} bytes` },\n { type: 'resource', resource: { uri, mimeType, blob } }\n ]\n }\n } else {\n return {\n content: [{ type: 'text' as const, text }]\n }\n }\n}\n\nexport function jsonToolResult(data: object, isError = false): CallToolResult {\n const result: CallToolResult = { content: [{ type: 'text' as const, text: JSON.stringify(data) }] }\n if (isError) { result.isError = true }\n return result\n}\n\nexport function errorToolResult({ code, name, message }: SilkweaveError): CallToolResult {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: JSON.stringify({ success: false, code, name, message })\n }]\n }\n}\n\nexport function handleToolError(error: unknown): CallToolResult {\n if (error instanceof SilkweaveError) {\n return jsonToolResult({ success: false, name: error.name, message: error.message, code: error.code }, true)\n } else if (error instanceof Error) {\n return jsonToolResult({ success: false, name: error.name, message: error.message, stack: error.stack }, true)\n } else {\n return jsonToolResult({ success: false, name: 'Unknown error', message: 'An unknown error occurred', error }, true)\n }\n}\n\nexport function parseResourceMessage({ resource }: EmbeddedResource) {\n const text = ('blob' in resource) ? Buffer.from(resource.blob, 'base64').toString('utf-8') : resource.text\n return text\n}\n","import { intro } from '@clack/prompts'\nimport { Client } from '@modelcontextprotocol/sdk/client'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\nimport { ContentBlock, LoggingMessageNotificationSchema, ProgressNotificationSchema, ToolResultContent } from '@modelcontextprotocol/sdk/types.js'\nimport { AdapterFactory, unwrap } from '@silkweave/core'\nimport { createCLILogger } from '@silkweave/logger'\nimport { kebabCase } from 'change-case'\nimport { Command } from 'commander'\nimport { randomUUID } from 'crypto'\nimport { z } from 'zod/v4'\nimport { JSONSchema } from 'zod/v4/core'\nimport { parseResourceMessage } from '../util/result.js'\n\nexport type CLIFormatterFn = (message: ContentBlock, index: number, messages: ContentBlock[]) => string | undefined\n\nexport interface CliProxyOptions {\n url: URL\n formatter?: CLIFormatterFn\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction addCliOption(command: Command, key: string, type: z.ZodType, defaultValue: any) {\n const description = type.description\n const flag = kebabCase(key)\n if (type instanceof z.ZodBoolean) {\n command.option(`--${flag}`, description, defaultValue)\n command.option(`--no-${flag}`)\n } else if (type instanceof z.ZodNumber) {\n command.option(`--${flag} <number>`, description, defaultValue)\n } else if (type instanceof z.ZodString || type instanceof z.ZodEnum) {\n command.option(`--${flag} <string>`, description, defaultValue)\n } else if (type instanceof z.ZodObject || type instanceof z.ZodRecord || type instanceof z.ZodArray) {\n command.option(`--${flag} <json>`, description ?? '', JSON.parse, defaultValue)\n } else {\n throw new Error(`Invalid zod type: ${type.def.type}`)\n }\n}\n\nconst defaultFormatter: CLIFormatterFn = (message) => {\n if (message.type === 'text' && !message.text.includes('mcp://toolResult/')) {\n return `${message.text}`\n } else if (message.type === 'resource') {\n return parseResourceMessage(message)\n } else {\n return JSON.stringify(message)\n }\n\n}\n\nexport const cliProxy: AdapterFactory<CliProxyOptions> = ({ url, formatter = defaultFormatter }) => {\n return (options, baseContext) => {\n const context = baseContext.fork({ adapter: 'cliProxy' })\n const program = new Command()\n .name(options.name)\n .description(options.description)\n .version(options.version)\n .option('-s, --silent', 'Silent mode, prevent log messages', false)\n\n return {\n context,\n start: async () => {\n const client = new Client({\n name: options.name,\n description: options.description,\n version: options.version\n })\n const transport = new StreamableHTTPClientTransport(url)\n await client.connect(transport)\n const { tools } = await client.listTools()\n for (const tool of tools) {\n const name = kebabCase(tool.name)\n const command = program.command(name)\n if (tool.description) { command.description(tool.description) }\n const schema = z.fromJSONSchema(tool.inputSchema as JSONSchema.JSONSchema)\n if (!(schema instanceof z.ZodObject)) { throw new Error('Invalid schema') }\n const shape = schema.shape\n for (const key of Object.keys(shape)) {\n const [type, { defaultValue }] = unwrap(shape[key])\n addCliOption(command, key, type, defaultValue)\n }\n command.action(async (args) => {\n const { silent } = program.opts<{ silent: boolean }>()\n const logger = createCLILogger()\n if (!silent) {\n intro(`${options.name} - ${tool.name}`)\n client.setNotificationHandler(LoggingMessageNotificationSchema, ({ params: { level, data } }) => {\n logger[level](data)\n })\n client.setNotificationHandler(ProgressNotificationSchema, ({ params: { progress, total, message } }) => {\n logger.info({ progress, total, message })\n })\n }\n const input = await schema.parseAsync(args)\n const response = await client.callTool({\n name: tool.name,\n arguments: input,\n _meta: { progressToken: randomUUID(), disposition: 'json' }\n }) as ToolResultContent\n response.content.forEach((message, index, messages) => {\n const text = formatter(message, index, messages)\n process.stdout.write(`${text}\\n`)\n })\n })\n }\n await program.parseAsync()\n await transport.close()\n },\n stop: async () => { }\n }\n }\n}\n","import { InMemoryEventStore } from '@modelcontextprotocol/sdk/examples/shared/inMemoryEventStore.js'\nimport { createMcpExpressApp, CreateMcpExpressAppOptions } from '@modelcontextprotocol/sdk/server/express.js'\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'\nimport { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js'\nimport { AuthConfig, AuthInfo, generateProtectedResourceMetadata, OAuthRequest, OAuthResponse, validateToken } from '@silkweave/auth'\nimport { Action, AdapterFactory, SilkweaveContext, SilkweaveOptions } from '@silkweave/core'\nimport { createLogger } from '@silkweave/logger'\nimport { capitalCase, pascalCase } from 'change-case'\nimport cors, { CorsOptions } from 'cors'\nimport { randomUUID } from 'crypto'\nimport express, { Express, Request, Response } from 'express'\nimport { readFile } from 'fs/promises'\nimport { Server } from 'http'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { handleToolError, jsonToolResult, smartToolResult } from '../util/result.js'\nimport { SideloadResource } from '../util/sideload.js'\n\nconst authStorage = new AsyncLocalStorage<AuthInfo>()\n\n/** Headers required by the MCP protocol that must always be exposed */\nconst MCP_REQUIRED_HEADERS = ['WWW-Authenticate', 'Mcp-Session-Id', 'Last-Event-Id', 'Mcp-Protocol-Version']\n\nexport interface HttpAdapterOptions extends CreateMcpExpressAppOptions {\n host: string\n port: number\n auth?: AuthConfig\n /** CORS configuration. `false` to disable, `true`/`undefined` for permissive defaults, or a CorsOptions object. */\n cors?: CorsOptions | boolean\n}\n\nfunction mountOAuthRoutes(app: Express, auth: AuthConfig): Set<string> {\n const provider = auth.provider!\n const callbackPath = auth.callbackPath ?? '/auth/callback'\n\n const toOAuthReq = (req: Request): OAuthRequest => ({\n method: req.method,\n url: new URL(req.url, `${req.protocol}://${req.get('host')}`),\n headers: Object.fromEntries(Object.entries(req.headers).map(([k, v]) => [k, Array.isArray(v) ? v[0] : v])),\n body: req.body as Record<string, string> | undefined\n })\n\n const sendOAuth = (res: Response, oauthRes: OAuthResponse) => {\n for (const [key, value] of Object.entries(oauthRes.headers)) { res.header(key, value) }\n if (oauthRes.body) {\n res.status(oauthRes.status).send(typeof oauthRes.body === 'string' ? oauthRes.body : JSON.stringify(oauthRes.body))\n } else {\n res.status(oauthRes.status).end()\n }\n }\n\n app.get('/.well-known/oauth-authorization-server', (_req: Request, res: Response) => {\n sendOAuth(res, provider.metadata())\n })\n app.get('/authorize', async (req: Request, res: Response) => {\n sendOAuth(res, await provider.authorize(toOAuthReq(req)))\n })\n app.get(callbackPath, async (req: Request, res: Response) => {\n sendOAuth(res, await provider.callback(toOAuthReq(req)))\n })\n app.post('/token', express.urlencoded({ extended: false }), async (req: Request, res: Response) => {\n sendOAuth(res, await provider.token(toOAuthReq(req)))\n })\n app.post('/register', express.json(), async (req: Request, res: Response) => {\n sendOAuth(res, await provider.register(toOAuthReq(req)))\n })\n\n return new Set(['/.well-known/oauth-authorization-server', '/authorize', callbackPath, '/token', '/register'])\n}\n\nfunction mountAuthMiddleware(app: Express, auth: AuthConfig, oauthPaths: Set<string>, context: SilkweaveContext) {\n app.use(async (req: Request, res: Response, next: (err?: unknown) => void) => {\n if (req.path.startsWith('/.well-known/') || oauthPaths.has(req.path)) { return next() }\n const result = await validateToken(req.headers.authorization, auth, context.fork({ request: req }))\n if (result.error) {\n for (const [key, value] of Object.entries(result.error.headers)) {\n res.header(key, value)\n }\n res.status(result.error.statusCode).json(result.error.body)\n return\n }\n if (result.auth) {\n authStorage.run(result.auth, () => { next() })\n } else {\n next()\n }\n })\n}\n\nfunction registerTools(server: McpServer, actions: Action[], context: SilkweaveContext) {\n for (const action of actions) {\n server.registerTool(pascalCase(action.name), {\n title: capitalCase(action.name),\n description: action.description,\n inputSchema: action.input\n }, async (input, extra) => {\n const logger = createLogger({\n stream: process.stderr,\n onLog: (level, data) => {\n extra.sendNotification({ method: 'notifications/message', params: { level, data } })\n },\n onProgress: ({ progress, total, message }) => {\n if (!extra._meta?.progressToken) { return }\n extra.sendNotification({\n method: 'notifications/progress',\n params: { progress, total, message, progressToken: extra._meta.progressToken }\n })\n }\n })\n const currentAuth = authStorage.getStore()\n const actionContext = context.fork({ logger, extra, ...(currentAuth ? { auth: currentAuth } : {}) })\n const disposition = extra._meta?.disposition\n return action.run(input, actionContext).then((result) => {\n if (action.toolResult) {\n const response = action.toolResult(result, actionContext)\n if (response) { return response }\n }\n if (disposition === 'json') {\n return jsonToolResult(result)\n } else {\n return smartToolResult(result)\n }\n }).catch(handleToolError)\n })\n }\n}\n\nfunction createMcpServer(options: SilkweaveOptions, actions: Action[], context: SilkweaveContext): McpServer {\n const server = new McpServer({\n name: options.name,\n description: options.description,\n version: options.version\n }, {\n capabilities: { tools: {}, logging: {} }\n })\n registerTools(server, actions, context)\n return server\n}\n\nfunction createSessionTransport(transports: Record<string, StreamableHTTPServerTransport>): StreamableHTTPServerTransport {\n const eventStore = new InMemoryEventStore()\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n enableJsonResponse: false,\n eventStore,\n onsessioninitialized: (sId) => {\n console.log(`Session initialized with ID: ${sId}`)\n transports[sId] = transport\n }\n })\n transport.onerror = (error) => {\n console.error(error)\n }\n transport.onclose = () => {\n const sid = transport.sessionId\n if (sid && transports[sid]) {\n console.log(`Transport closed for session ${sid}, removing from transports map`)\n delete transports[sid]\n }\n }\n return transport\n}\n\nfunction mountMcpTransport(\n app: Express,\n transports: Record<string, StreamableHTTPServerTransport>,\n createServer: () => McpServer\n) {\n app.post('/mcp', async (req: Request, res: Response) => {\n const sessionId = req.headers['mcp-session-id'] as string | undefined\n try {\n if (sessionId && transports[sessionId]) {\n await transports[sessionId].handleRequest(req, res, req.body)\n return\n }\n\n if (!isInitializeRequest(req.body)) {\n res.status(404).json({\n jsonrpc: '2.0',\n error: { code: -32_000, message: 'Session not found' },\n id: null\n })\n return\n }\n\n const transport = createSessionTransport(transports)\n await createServer().connect(transport)\n await transport.handleRequest(req, res, req.body)\n } catch (error) {\n console.error('Error handling MCP request:', error)\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: { code: -32_603, message: 'Internal server error' },\n id: null\n })\n }\n }\n })\n\n const handleSessionStream = async (req: Request, res: Response) => {\n const sessionId = req.headers['mcp-session-id'] as string | undefined\n if (!sessionId || !transports[sessionId]) {\n res.status(400).send('Invalid or missing session ID')\n return\n }\n const transport = transports[sessionId]\n await transport.handleRequest(req, res)\n }\n\n app.get('/mcp', handleSessionStream)\n app.delete('/mcp', handleSessionStream)\n app.get('/mcp/resource/:id', handleSessionStream)\n}\n\nexport const http: AdapterFactory<HttpAdapterOptions> = ({ host, port, auth, cors: corsConfig, ...mcpOptions }) => {\n return (options, baseContext) => {\n const context = baseContext.fork({ adapter: 'http' })\n const app = createMcpExpressApp({ ...mcpOptions, host })\n\n if (corsConfig !== false) {\n const userConfig = corsConfig === true || corsConfig === undefined ? {} : corsConfig\n const userExposed = userConfig.exposedHeaders\n const exposedHeaders = [\n ...MCP_REQUIRED_HEADERS,\n ...(Array.isArray(userExposed) ? userExposed : userExposed ? [userExposed] : [])\n ]\n app.use(cors({ origin: '*', ...userConfig, exposedHeaders }))\n }\n\n if (auth?.authorizationServers?.length && auth.resourceUrl) {\n app.get('/.well-known/oauth-protected-resource', (_req: Request, res: Response) => {\n const metadata = generateProtectedResourceMetadata(auth.resourceUrl!, auth.authorizationServers!)\n res.json(metadata)\n })\n }\n\n const oauthPaths = auth?.provider ? mountOAuthRoutes(app, auth) : new Set<string>()\n\n if (auth) {\n mountAuthMiddleware(app, auth, oauthPaths, context)\n }\n\n const transports: Record<string, StreamableHTTPServerTransport> = {}\n let mountedActions: Action[] = []\n\n app.get('/resource/:id', async (req: Request, res: Response) => {\n const id = req.params.id\n if (!id || typeof id !== 'string') { throw new Error('Invalid ID') }\n const resourceMeta: SideloadResource = JSON.parse(await readFile(`resources/${id}.json`, 'utf-8'))\n const buffer = await readFile(`resources/${id}`)\n res.status(200)\n res.header('Content-Type', resourceMeta.contentType)\n res.send(buffer)\n })\n\n mountMcpTransport(app, transports, () => createMcpServer(options, mountedActions, context))\n\n let httpServer: Server | undefined\n return {\n context,\n start: async (actions) => {\n mountedActions = actions\n httpServer = app.listen(port, host, (error) => {\n if (error) {\n console.error('Failed to start server:', error)\n process.exit(1)\n }\n console.log(`MCP Streamable HTTP Server listening on http://${host}:${port}/mcp`)\n })\n },\n stop: async () => {\n if (httpServer) {\n await new Promise<void>((resolve, reject) => {\n return httpServer!.close((err) => {\n if (err) {\n reject(err)\n } else {\n resolve()\n }\n })\n })\n }\n httpServer = undefined\n }\n }\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { Action, AdapterFactory, SilkweaveContext } from '@silkweave/core'\nimport { createLogger } from '@silkweave/logger'\nimport { capitalCase, pascalCase } from 'change-case'\nimport { handleToolError, smartToolResult } from '../util/result.js'\n\nfunction registerTools(server: McpServer, actions: Action[], context: SilkweaveContext) {\n for (const action of actions) {\n server.registerTool(pascalCase(action.name), {\n title: capitalCase(action.name),\n description: action.description,\n inputSchema: action.input\n }, async (input, extra) => {\n const logger = createLogger({\n stream: false,\n onLog: (level, data) => {\n extra.sendNotification({ method: 'notifications/message', params: { level, data } })\n },\n onProgress: ({ progress, total, message }) => {\n if (!extra._meta?.progressToken) { return }\n extra.sendNotification({\n method: 'notifications/progress',\n params: { progress, total, message, progressToken: extra._meta.progressToken }\n })\n }\n })\n const actionContext = context.fork({ logger, extra })\n return action.run(input, actionContext)\n .then((result) => action.toolResult?.(result, actionContext) ?? smartToolResult(result))\n .catch(handleToolError)\n })\n }\n}\n\nexport const stdio: AdapterFactory = () => {\n return (options, baseContext) => {\n const context = baseContext.fork({ adapter: 'stdio' })\n const server = new McpServer({\n name: options.name,\n description: options.description,\n version: options.version\n }, {\n capabilities: { tools: {}, logging: {} }\n })\n return {\n context,\n start: async (actions) => {\n registerTools(server, actions, context)\n const transport = new StdioServerTransport()\n await server.connect(transport)\n },\n stop: async () => {\n await server?.close()\n }\n }\n }\n}\n","import { randomUUID } from 'crypto'\nimport { writeFile } from 'fs/promises'\n\nexport interface SideloadResource {\n id: string\n name: string\n contentType: string\n size: number\n}\n\nexport async function createSideloadResource(buffer: Buffer, { name, contentType }: Pick<SideloadResource, 'name' | 'contentType'>) {\n const id = randomUUID()\n const resource: SideloadResource = { id, name, contentType, size: buffer.length }\n await Promise.all([\n writeFile(`resources/${id}`, buffer),\n writeFile(`resources/${id}.json`, JSON.stringify(resource), 'utf-8')\n ])\n return resource\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAIA,SAAgB,gBAAgB,MAAkD;CAChF,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,KAAK,UAAU,KAAK;CACnE,MAAM,WAAW,OAAO,SAAS,WAAW,eAAe;CAC3D,MAAM,MAAM,OAAO,SAAS,WAAW,QAAQ;AAC/C,KAAI,KAAK,SAAS,MAAM;EACtB,MAAM,MAAM,oBAAoBA,cAAY,CAAC,GAAG;EAChD,MAAM,SAAS,OAAO,KAAK,KAAK;EAChC,MAAM,OAAO,OAAO,SAAS,SAAS;AACtC,SAAO,EACL,SAAS,CACP;GAAE,MAAM;GAAQ,MAAM,qBAAqB,IAAI,QAAQ,OAAO,WAAW;GAAS,EAClF;GAAE,MAAM;GAAY,UAAU;IAAE;IAAK;IAAU;IAAM;GAAE,CACxD,EACF;OAED,QAAO,EACL,SAAS,CAAC;EAAE,MAAM;EAAiB;EAAM,CAAC,EAC3C;;AAIL,SAAgB,eAAe,MAAc,UAAU,OAAuB;CAC5E,MAAM,SAAyB,EAAE,SAAS,CAAC;EAAE,MAAM;EAAiB,MAAM,KAAK,UAAU,KAAK;EAAE,CAAC,EAAE;AACnG,KAAI,QAAW,QAAO,UAAU;AAChC,QAAO;;AAGT,SAAgB,gBAAgB,EAAE,MAAM,MAAM,WAA2C;AACvF,QAAO;EACL,SAAS;EACT,SAAS,CAAC;GACR,MAAM;GACN,MAAM,KAAK,UAAU;IAAE,SAAS;IAAO;IAAM;IAAM;IAAS,CAAC;GAC9D,CAAC;EACH;;AAGH,SAAgB,gBAAgB,OAAgC;AAC9D,KAAI,iBAAiB,eACnB,QAAO,eAAe;EAAE,SAAS;EAAO,MAAM,MAAM;EAAM,SAAS,MAAM;EAAS,MAAM,MAAM;EAAM,EAAE,KAAK;UAClG,iBAAiB,MAC1B,QAAO,eAAe;EAAE,SAAS;EAAO,MAAM,MAAM;EAAM,SAAS,MAAM;EAAS,OAAO,MAAM;EAAO,EAAE,KAAK;KAE7G,QAAO,eAAe;EAAE,SAAS;EAAO,MAAM;EAAiB,SAAS;EAA6B;EAAO,EAAE,KAAK;;AAIvH,SAAgB,qBAAqB,EAAE,YAA8B;AAEnE,QADc,UAAU,WAAY,OAAO,KAAK,SAAS,MAAM,SAAS,CAAC,SAAS,QAAQ,GAAG,SAAS;;;;AC/BxG,SAAS,aAAa,SAAkB,KAAa,MAAiB,cAAmB;CACvF,MAAM,cAAc,KAAK;CACzB,MAAM,OAAO,UAAU,IAAI;AAC3B,KAAI,gBAAgB,EAAE,YAAY;AAChC,UAAQ,OAAO,KAAK,QAAQ,aAAa,aAAa;AACtD,UAAQ,OAAO,QAAQ,OAAO;YACrB,gBAAgB,EAAE,UAC3B,SAAQ,OAAO,KAAK,KAAK,YAAY,aAAa,aAAa;UACtD,gBAAgB,EAAE,aAAa,gBAAgB,EAAE,QAC1D,SAAQ,OAAO,KAAK,KAAK,YAAY,aAAa,aAAa;UACtD,gBAAgB,EAAE,aAAa,gBAAgB,EAAE,aAAa,gBAAgB,EAAE,SACzF,SAAQ,OAAO,KAAK,KAAK,UAAU,eAAe,IAAI,KAAK,OAAO,aAAa;KAE/E,OAAM,IAAI,MAAM,qBAAqB,KAAK,IAAI,OAAO;;AAIzD,MAAM,oBAAoC,YAAY;AACpD,KAAI,QAAQ,SAAS,UAAU,CAAC,QAAQ,KAAK,SAAS,oBAAoB,CACxE,QAAO,GAAG,QAAQ;UACT,QAAQ,SAAS,WAC1B,QAAO,qBAAqB,QAAQ;KAEpC,QAAO,KAAK,UAAU,QAAQ;;AAKlC,MAAa,YAA6C,EAAE,KAAK,YAAY,uBAAuB;AAClG,SAAQ,SAAS,gBAAgB;EAC/B,MAAM,UAAU,YAAY,KAAK,EAAE,SAAS,YAAY,CAAC;EACzD,MAAM,UAAU,IAAI,SAAS,CAC1B,KAAK,QAAQ,KAAK,CAClB,YAAY,QAAQ,YAAY,CAChC,QAAQ,QAAQ,QAAQ,CACxB,OAAO,gBAAgB,qCAAqC,MAAM;AAErE,SAAO;GACL;GACA,OAAO,YAAY;IACjB,MAAM,SAAS,IAAI,OAAO;KACxB,MAAM,QAAQ;KACd,aAAa,QAAQ;KACrB,SAAS,QAAQ;KAClB,CAAC;IACF,MAAM,YAAY,IAAI,8BAA8B,IAAI;AACxD,UAAM,OAAO,QAAQ,UAAU;IAC/B,MAAM,EAAE,UAAU,MAAM,OAAO,WAAW;AAC1C,SAAK,MAAM,QAAQ,OAAO;KACxB,MAAM,OAAO,UAAU,KAAK,KAAK;KACjC,MAAM,UAAU,QAAQ,QAAQ,KAAK;AACrC,SAAI,KAAK,YAAe,SAAQ,YAAY,KAAK,YAAY;KAC7D,MAAM,SAAS,EAAE,eAAe,KAAK,YAAqC;AAC1E,SAAI,EAAE,kBAAkB,EAAE,WAAc,OAAM,IAAI,MAAM,iBAAiB;KACzE,MAAM,QAAQ,OAAO;AACrB,UAAK,MAAM,OAAO,OAAO,KAAK,MAAM,EAAE;MACpC,MAAM,CAAC,MAAM,EAAE,kBAAkB,OAAO,MAAM,KAAK;AACnD,mBAAa,SAAS,KAAK,MAAM,aAAa;;AAEhD,aAAQ,OAAO,OAAO,SAAS;MAC7B,MAAM,EAAE,WAAW,QAAQ,MAA2B;MACtD,MAAM,SAAS,iBAAiB;AAChC,UAAI,CAAC,QAAQ;AACX,aAAM,GAAG,QAAQ,KAAK,KAAK,KAAK,OAAO;AACvC,cAAO,uBAAuB,mCAAmC,EAAE,QAAQ,EAAE,OAAO,aAAa;AAC/F,eAAO,OAAO,KAAK;SACnB;AACF,cAAO,uBAAuB,6BAA6B,EAAE,QAAQ,EAAE,UAAU,OAAO,gBAAgB;AACtG,eAAO,KAAK;SAAE;SAAU;SAAO;SAAS,CAAC;SACzC;;MAEJ,MAAM,QAAQ,MAAM,OAAO,WAAW,KAAK;AAM3C,OALiB,MAAM,OAAO,SAAS;OACrC,MAAM,KAAK;OACX,WAAW;OACX,OAAO;QAAE,eAAe,YAAY;QAAE,aAAa;QAAQ;OAC5D,CAAC,EACO,QAAQ,SAAS,SAAS,OAAO,aAAa;OACrD,MAAM,OAAO,UAAU,SAAS,OAAO,SAAS;AAChD,eAAQ,OAAO,MAAM,GAAG,KAAK,IAAI;QACjC;OACF;;AAEJ,UAAM,QAAQ,YAAY;AAC1B,UAAM,UAAU,OAAO;;GAEzB,MAAM,YAAY;GACnB;;;;;AC1FL,MAAM,cAAc,IAAI,mBAA6B;;AAGrD,MAAM,uBAAuB;CAAC;CAAoB;CAAkB;CAAiB;CAAuB;AAU5G,SAAS,iBAAiB,KAAc,MAA+B;CACrE,MAAM,WAAW,KAAK;CACtB,MAAM,eAAe,KAAK,gBAAgB;CAE1C,MAAM,cAAc,SAAgC;EAClD,QAAQ,IAAI;EACZ,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,GAAG;EAC7D,SAAS,OAAO,YAAY,OAAO,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,MAAM,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;EAC1G,MAAM,IAAI;EACX;CAED,MAAM,aAAa,KAAe,aAA4B;AAC5D,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,QAAQ,CAAI,KAAI,OAAO,KAAK,MAAM;AACrF,MAAI,SAAS,KACX,KAAI,OAAO,SAAS,OAAO,CAAC,KAAK,OAAO,SAAS,SAAS,WAAW,SAAS,OAAO,KAAK,UAAU,SAAS,KAAK,CAAC;MAEnH,KAAI,OAAO,SAAS,OAAO,CAAC,KAAK;;AAIrC,KAAI,IAAI,4CAA4C,MAAe,QAAkB;AACnF,YAAU,KAAK,SAAS,UAAU,CAAC;GACnC;AACF,KAAI,IAAI,cAAc,OAAO,KAAc,QAAkB;AAC3D,YAAU,KAAK,MAAM,SAAS,UAAU,WAAW,IAAI,CAAC,CAAC;GACzD;AACF,KAAI,IAAI,cAAc,OAAO,KAAc,QAAkB;AAC3D,YAAU,KAAK,MAAM,SAAS,SAAS,WAAW,IAAI,CAAC,CAAC;GACxD;AACF,KAAI,KAAK,UAAU,QAAQ,WAAW,EAAE,UAAU,OAAO,CAAC,EAAE,OAAO,KAAc,QAAkB;AACjG,YAAU,KAAK,MAAM,SAAS,MAAM,WAAW,IAAI,CAAC,CAAC;GACrD;AACF,KAAI,KAAK,aAAa,QAAQ,MAAM,EAAE,OAAO,KAAc,QAAkB;AAC3E,YAAU,KAAK,MAAM,SAAS,SAAS,WAAW,IAAI,CAAC,CAAC;GACxD;AAEF,QAAO,IAAI,IAAI;EAAC;EAA2C;EAAc;EAAc;EAAU;EAAY,CAAC;;AAGhH,SAAS,oBAAoB,KAAc,MAAkB,YAAyB,SAA2B;AAC/G,KAAI,IAAI,OAAO,KAAc,KAAe,SAAkC;AAC5E,MAAI,IAAI,KAAK,WAAW,gBAAgB,IAAI,WAAW,IAAI,IAAI,KAAK,CAAI,QAAO,MAAM;EACrF,MAAM,SAAS,MAAM,cAAc,IAAI,QAAQ,eAAe,MAAM,QAAQ,KAAK,EAAE,SAAS,KAAK,CAAC,CAAC;AACnG,MAAI,OAAO,OAAO;AAChB,QAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,MAAM,QAAQ,CAC7D,KAAI,OAAO,KAAK,MAAM;AAExB,OAAI,OAAO,OAAO,MAAM,WAAW,CAAC,KAAK,OAAO,MAAM,KAAK;AAC3D;;AAEF,MAAI,OAAO,KACT,aAAY,IAAI,OAAO,YAAY;AAAE,SAAM;IAAG;MAE9C,OAAM;GAER;;AAGJ,SAASC,gBAAc,QAAmB,SAAmB,SAA2B;AACtF,MAAK,MAAM,UAAU,QACnB,QAAO,aAAa,WAAW,OAAO,KAAK,EAAE;EAC3C,OAAO,YAAY,OAAO,KAAK;EAC/B,aAAa,OAAO;EACpB,aAAa,OAAO;EACrB,EAAE,OAAO,OAAO,UAAU;EACzB,MAAM,SAAS,aAAa;GAC1B,QAAQ,QAAQ;GAChB,QAAQ,OAAO,SAAS;AACtB,UAAM,iBAAiB;KAAE,QAAQ;KAAyB,QAAQ;MAAE;MAAO;MAAM;KAAE,CAAC;;GAEtF,aAAa,EAAE,UAAU,OAAO,cAAc;AAC5C,QAAI,CAAC,MAAM,OAAO,cAAiB;AACnC,UAAM,iBAAiB;KACrB,QAAQ;KACR,QAAQ;MAAE;MAAU;MAAO;MAAS,eAAe,MAAM,MAAM;MAAe;KAC/E,CAAC;;GAEL,CAAC;EACF,MAAM,cAAc,YAAY,UAAU;EAC1C,MAAM,gBAAgB,QAAQ,KAAK;GAAE;GAAQ;GAAO,GAAI,cAAc,EAAE,MAAM,aAAa,GAAG,EAAE;GAAG,CAAC;EACpG,MAAM,cAAc,MAAM,OAAO;AACjC,SAAO,OAAO,IAAI,OAAO,cAAc,CAAC,MAAM,WAAW;AACvD,OAAI,OAAO,YAAY;IACrB,MAAM,WAAW,OAAO,WAAW,QAAQ,cAAc;AACzD,QAAI,SAAY,QAAO;;AAEzB,OAAI,gBAAgB,OAClB,QAAO,eAAe,OAAO;OAE7B,QAAO,gBAAgB,OAAO;IAEhC,CAAC,MAAM,gBAAgB;GACzB;;AAIN,SAAS,gBAAgB,SAA2B,SAAmB,SAAsC;CAC3G,MAAM,SAAS,IAAI,UAAU;EAC3B,MAAM,QAAQ;EACd,aAAa,QAAQ;EACrB,SAAS,QAAQ;EAClB,EAAE,EACD,cAAc;EAAE,OAAO,EAAE;EAAE,SAAS,EAAE;EAAE,EACzC,CAAC;AACF,iBAAc,QAAQ,SAAS,QAAQ;AACvC,QAAO;;AAGT,SAAS,uBAAuB,YAA0F;CAExH,MAAM,YAAY,IAAI,8BAA8B;EAClD,0BAA0B,YAAY;EACtC,oBAAoB;EACpB,YAJiB,IAAI,oBAAoB;EAKzC,uBAAuB,QAAQ;AAC7B,WAAQ,IAAI,gCAAgC,MAAM;AAClD,cAAW,OAAO;;EAErB,CAAC;AACF,WAAU,WAAW,UAAU;AAC7B,UAAQ,MAAM,MAAM;;AAEtB,WAAU,gBAAgB;EACxB,MAAM,MAAM,UAAU;AACtB,MAAI,OAAO,WAAW,MAAM;AAC1B,WAAQ,IAAI,gCAAgC,IAAI,gCAAgC;AAChF,UAAO,WAAW;;;AAGtB,QAAO;;AAGT,SAAS,kBACP,KACA,YACA,cACA;AACA,KAAI,KAAK,QAAQ,OAAO,KAAc,QAAkB;EACtD,MAAM,YAAY,IAAI,QAAQ;AAC9B,MAAI;AACF,OAAI,aAAa,WAAW,YAAY;AACtC,UAAM,WAAW,WAAW,cAAc,KAAK,KAAK,IAAI,KAAK;AAC7D;;AAGF,OAAI,CAAC,oBAAoB,IAAI,KAAK,EAAE;AAClC,QAAI,OAAO,IAAI,CAAC,KAAK;KACnB,SAAS;KACT,OAAO;MAAE,MAAM;MAAS,SAAS;MAAqB;KACtD,IAAI;KACL,CAAC;AACF;;GAGF,MAAM,YAAY,uBAAuB,WAAW;AACpD,SAAM,cAAc,CAAC,QAAQ,UAAU;AACvC,SAAM,UAAU,cAAc,KAAK,KAAK,IAAI,KAAK;WAC1C,OAAO;AACd,WAAQ,MAAM,+BAA+B,MAAM;AACnD,OAAI,CAAC,IAAI,YACP,KAAI,OAAO,IAAI,CAAC,KAAK;IACnB,SAAS;IACT,OAAO;KAAE,MAAM;KAAS,SAAS;KAAyB;IAC1D,IAAI;IACL,CAAC;;GAGN;CAEF,MAAM,sBAAsB,OAAO,KAAc,QAAkB;EACjE,MAAM,YAAY,IAAI,QAAQ;AAC9B,MAAI,CAAC,aAAa,CAAC,WAAW,YAAY;AACxC,OAAI,OAAO,IAAI,CAAC,KAAK,gCAAgC;AACrD;;AAGF,QADkB,WAAW,WACb,cAAc,KAAK,IAAI;;AAGzC,KAAI,IAAI,QAAQ,oBAAoB;AACpC,KAAI,OAAO,QAAQ,oBAAoB;AACvC,KAAI,IAAI,qBAAqB,oBAAoB;;AAGnD,MAAa,QAA4C,EAAE,MAAM,MAAM,MAAM,MAAM,YAAY,GAAG,iBAAiB;AACjH,SAAQ,SAAS,gBAAgB;EAC/B,MAAM,UAAU,YAAY,KAAK,EAAE,SAAS,QAAQ,CAAC;EACrD,MAAM,MAAM,oBAAoB;GAAE,GAAG;GAAY;GAAM,CAAC;AAExD,MAAI,eAAe,OAAO;GACxB,MAAM,aAAa,eAAe,QAAQ,eAAe,KAAA,IAAY,EAAE,GAAG;GAC1E,MAAM,cAAc,WAAW;GAC/B,MAAM,iBAAiB,CACrB,GAAG,sBACH,GAAI,MAAM,QAAQ,YAAY,GAAG,cAAc,cAAc,CAAC,YAAY,GAAG,EAAE,CAChF;AACD,OAAI,IAAI,KAAK;IAAE,QAAQ;IAAK,GAAG;IAAY;IAAgB,CAAC,CAAC;;AAG/D,MAAI,MAAM,sBAAsB,UAAU,KAAK,YAC7C,KAAI,IAAI,0CAA0C,MAAe,QAAkB;GACjF,MAAM,WAAW,kCAAkC,KAAK,aAAc,KAAK,qBAAsB;AACjG,OAAI,KAAK,SAAS;IAClB;EAGJ,MAAM,aAAa,MAAM,WAAW,iBAAiB,KAAK,KAAK,mBAAG,IAAI,KAAa;AAEnF,MAAI,KACF,qBAAoB,KAAK,MAAM,YAAY,QAAQ;EAGrD,MAAM,aAA4D,EAAE;EACpE,IAAI,iBAA2B,EAAE;AAEjC,MAAI,IAAI,iBAAiB,OAAO,KAAc,QAAkB;GAC9D,MAAM,KAAK,IAAI,OAAO;AACtB,OAAI,CAAC,MAAM,OAAO,OAAO,SAAY,OAAM,IAAI,MAAM,aAAa;GAClE,MAAM,eAAiC,KAAK,MAAM,MAAM,SAAS,aAAa,GAAG,QAAQ,QAAQ,CAAC;GAClG,MAAM,SAAS,MAAM,SAAS,aAAa,KAAK;AAChD,OAAI,OAAO,IAAI;AACf,OAAI,OAAO,gBAAgB,aAAa,YAAY;AACpD,OAAI,KAAK,OAAO;IAChB;AAEF,oBAAkB,KAAK,kBAAkB,gBAAgB,SAAS,gBAAgB,QAAQ,CAAC;EAE3F,IAAI;AACJ,SAAO;GACL;GACA,OAAO,OAAO,YAAY;AACxB,qBAAiB;AACjB,iBAAa,IAAI,OAAO,MAAM,OAAO,UAAU;AAC7C,SAAI,OAAO;AACT,cAAQ,MAAM,2BAA2B,MAAM;AAC/C,cAAQ,KAAK,EAAE;;AAEjB,aAAQ,IAAI,kDAAkD,KAAK,GAAG,KAAK,MAAM;MACjF;;GAEJ,MAAM,YAAY;AAChB,QAAI,WACF,OAAM,IAAI,SAAe,SAAS,WAAW;AAC3C,YAAO,WAAY,OAAO,QAAQ;AAChC,UAAI,IACF,QAAO,IAAI;UAEX,UAAS;OAEX;MACF;AAEJ,iBAAa,KAAA;;GAEhB;;;;;ACtRL,SAAS,cAAc,QAAmB,SAAmB,SAA2B;AACtF,MAAK,MAAM,UAAU,QACnB,QAAO,aAAa,WAAW,OAAO,KAAK,EAAE;EAC3C,OAAO,YAAY,OAAO,KAAK;EAC/B,aAAa,OAAO;EACpB,aAAa,OAAO;EACrB,EAAE,OAAO,OAAO,UAAU;EACzB,MAAM,SAAS,aAAa;GAC1B,QAAQ;GACR,QAAQ,OAAO,SAAS;AACtB,UAAM,iBAAiB;KAAE,QAAQ;KAAyB,QAAQ;MAAE;MAAO;MAAM;KAAE,CAAC;;GAEtF,aAAa,EAAE,UAAU,OAAO,cAAc;AAC5C,QAAI,CAAC,MAAM,OAAO,cAAiB;AACnC,UAAM,iBAAiB;KACrB,QAAQ;KACR,QAAQ;MAAE;MAAU;MAAO;MAAS,eAAe,MAAM,MAAM;MAAe;KAC/E,CAAC;;GAEL,CAAC;EACF,MAAM,gBAAgB,QAAQ,KAAK;GAAE;GAAQ;GAAO,CAAC;AACrD,SAAO,OAAO,IAAI,OAAO,cAAc,CACpC,MAAM,WAAW,OAAO,aAAa,QAAQ,cAAc,IAAI,gBAAgB,OAAO,CAAC,CACvF,MAAM,gBAAgB;GACzB;;AAIN,MAAa,cAA8B;AACzC,SAAQ,SAAS,gBAAgB;EAC/B,MAAM,UAAU,YAAY,KAAK,EAAE,SAAS,SAAS,CAAC;EACtD,MAAM,SAAS,IAAI,UAAU;GAC3B,MAAM,QAAQ;GACd,aAAa,QAAQ;GACrB,SAAS,QAAQ;GAClB,EAAE,EACD,cAAc;GAAE,OAAO,EAAE;GAAE,SAAS,EAAE;GAAE,EACzC,CAAC;AACF,SAAO;GACL;GACA,OAAO,OAAO,YAAY;AACxB,kBAAc,QAAQ,SAAS,QAAQ;IACvC,MAAM,YAAY,IAAI,sBAAsB;AAC5C,UAAM,OAAO,QAAQ,UAAU;;GAEjC,MAAM,YAAY;AAChB,UAAM,QAAQ,OAAO;;GAExB;;;;;AC7CL,eAAsB,uBAAuB,QAAgB,EAAE,MAAM,eAA+D;CAClI,MAAM,KAAK,YAAY;CACvB,MAAM,WAA6B;EAAE;EAAI;EAAM;EAAa,MAAM,OAAO;EAAQ;AACjF,OAAM,QAAQ,IAAI,CAChB,UAAU,aAAa,MAAM,OAAO,EACpC,UAAU,aAAa,GAAG,QAAQ,KAAK,UAAU,SAAS,EAAE,QAAQ,CACrE,CAAC;AACF,QAAO"}
1
+ {"version":3,"file":"index.mjs","names":["randomUUID","registerTools"],"sources":["../src/util/result.ts","../src/adapter/cliProxy.ts","../src/lib/handler.ts","../src/adapter/http.ts","../src/adapter/stdio.ts","../src/util/sideload.ts"],"sourcesContent":["import { EmbeddedResource, type CallToolResult } from '@modelcontextprotocol/sdk/types.js'\nimport { SilkweaveError } from '@silkweave/core'\nimport { randomUUID } from 'node:crypto'\n\nexport function smartToolResult(data: string | object | object[]): CallToolResult {\n const text = typeof data === 'string' ? data : JSON.stringify(data)\n const mimeType = typeof data === 'string' ? 'text/plain' : 'application/json'\n const ext = typeof data === 'string' ? 'txt' : 'json'\n if (text.length > 4096) {\n const uri = `mcp://toolResult/${randomUUID()}.${ext}`\n const buffer = Buffer.from(text)\n const blob = buffer.toString('base64')\n return {\n content: [\n { type: 'text', text: `Received resource ${uri} with ${buffer.byteLength} bytes` },\n { type: 'resource', resource: { uri, mimeType, blob } }\n ]\n }\n } else {\n return {\n content: [{ type: 'text' as const, text }]\n }\n }\n}\n\nexport function jsonToolResult(data: object, isError = false): CallToolResult {\n const result: CallToolResult = { content: [{ type: 'text' as const, text: JSON.stringify(data) }] }\n if (isError) { result.isError = true }\n return result\n}\n\nexport function errorToolResult({ code, name, message }: SilkweaveError): CallToolResult {\n return {\n isError: true,\n content: [{\n type: 'text',\n text: JSON.stringify({ success: false, code, name, message })\n }]\n }\n}\n\nexport function handleToolError(error: unknown): CallToolResult {\n if (error instanceof SilkweaveError) {\n return jsonToolResult({ success: false, name: error.name, message: error.message, code: error.code }, true)\n } else if (error instanceof Error) {\n return jsonToolResult({ success: false, name: error.name, message: error.message, stack: error.stack }, true)\n } else {\n return jsonToolResult({ success: false, name: 'Unknown error', message: 'An unknown error occurred', error }, true)\n }\n}\n\nexport function parseResourceMessage({ resource }: EmbeddedResource) {\n const text = ('blob' in resource) ? Buffer.from(resource.blob, 'base64').toString('utf-8') : resource.text\n return text\n}\n","import { intro } from '@clack/prompts'\nimport { Client } from '@modelcontextprotocol/sdk/client'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\nimport { ContentBlock, LoggingMessageNotificationSchema, ProgressNotificationSchema, ToolResultContent } from '@modelcontextprotocol/sdk/types.js'\nimport { AdapterFactory, unwrap } from '@silkweave/core'\nimport { createCLILogger } from '@silkweave/logger'\nimport { kebabCase } from 'change-case'\nimport { Command } from 'commander'\nimport { randomUUID } from 'crypto'\nimport { z } from 'zod/v4'\nimport { JSONSchema } from 'zod/v4/core'\nimport { parseResourceMessage } from '../util/result.js'\n\nexport type CLIFormatterFn = (message: ContentBlock, index: number, messages: ContentBlock[]) => string | undefined\n\nexport interface CliProxyOptions {\n url: URL\n formatter?: CLIFormatterFn\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction addCliOption(command: Command, key: string, type: z.ZodType, defaultValue: any) {\n const description = type.description\n const flag = kebabCase(key)\n if (type instanceof z.ZodBoolean) {\n command.option(`--${flag}`, description, defaultValue)\n command.option(`--no-${flag}`)\n } else if (type instanceof z.ZodNumber) {\n command.option(`--${flag} <number>`, description, defaultValue)\n } else if (type instanceof z.ZodString || type instanceof z.ZodEnum) {\n command.option(`--${flag} <string>`, description, defaultValue)\n } else if (type instanceof z.ZodObject || type instanceof z.ZodRecord || type instanceof z.ZodArray) {\n command.option(`--${flag} <json>`, description ?? '', JSON.parse, defaultValue)\n } else {\n throw new Error(`Invalid zod type: ${type.def.type}`)\n }\n}\n\nconst defaultFormatter: CLIFormatterFn = (message) => {\n if (message.type === 'text' && !message.text.includes('mcp://toolResult/')) {\n return `${message.text}`\n } else if (message.type === 'resource') {\n return parseResourceMessage(message)\n } else {\n return JSON.stringify(message)\n }\n\n}\n\nexport const cliProxy: AdapterFactory<CliProxyOptions> = ({ url, formatter = defaultFormatter }) => {\n return (options, baseContext) => {\n const context = baseContext.fork({ adapter: 'cliProxy' })\n const program = new Command()\n .name(options.name)\n .description(options.description)\n .version(options.version)\n .option('-s, --silent', 'Silent mode, prevent log messages', false)\n\n return {\n context,\n start: async () => {\n const client = new Client({\n name: options.name,\n description: options.description,\n version: options.version\n })\n const transport = new StreamableHTTPClientTransport(url)\n await client.connect(transport)\n const { tools } = await client.listTools()\n for (const tool of tools) {\n const name = kebabCase(tool.name)\n const command = program.command(name)\n if (tool.description) { command.description(tool.description) }\n const schema = z.fromJSONSchema(tool.inputSchema as JSONSchema.JSONSchema)\n if (!(schema instanceof z.ZodObject)) { throw new Error('Invalid schema') }\n const shape = schema.shape\n for (const key of Object.keys(shape)) {\n const [type, { defaultValue }] = unwrap(shape[key])\n addCliOption(command, key, type, defaultValue)\n }\n command.action(async (args) => {\n const { silent } = program.opts<{ silent: boolean }>()\n const logger = createCLILogger()\n if (!silent) {\n intro(`${options.name} - ${tool.name}`)\n client.setNotificationHandler(LoggingMessageNotificationSchema, ({ params: { level, data } }) => {\n logger[level](data)\n })\n client.setNotificationHandler(ProgressNotificationSchema, ({ params: { progress, total, message } }) => {\n logger.info({ progress, total, message })\n })\n }\n const input = await schema.parseAsync(args)\n const response = await client.callTool({\n name: tool.name,\n arguments: input,\n _meta: { progressToken: randomUUID(), disposition: 'json' }\n }) as ToolResultContent\n response.content.forEach((message, index, messages) => {\n const text = formatter(message, index, messages)\n process.stdout.write(`${text}\\n`)\n })\n })\n }\n await program.parseAsync()\n await transport.close()\n },\n stop: async () => { }\n }\n }\n}\n","import { InMemoryEventStore } from '@modelcontextprotocol/sdk/examples/shared/inMemoryEventStore.js'\nimport { createMcpExpressApp, CreateMcpExpressAppOptions } from '@modelcontextprotocol/sdk/server/express.js'\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'\nimport { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js'\nimport { AuthConfig, AuthInfo, generateProtectedResourceMetadata, OAuthRequest, OAuthResponse, validateToken } from '@silkweave/auth'\nimport { Action, SilkweaveContext, SilkweaveOptions } from '@silkweave/core'\nimport { createLogger } from '@silkweave/logger'\nimport { capitalCase, pascalCase } from 'change-case'\nimport cors, { CorsOptions } from 'cors'\nimport { randomUUID } from 'crypto'\nimport express, { Express, Request, Response } from 'express'\nimport { readFile } from 'fs/promises'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { handleToolError, jsonToolResult, smartToolResult } from '../util/result.js'\nimport { SideloadResource } from '../util/sideload.js'\n\nconst authStorage = new AsyncLocalStorage<AuthInfo>()\n\n/** Headers required by the MCP protocol that must always be exposed when CORS is in use. */\nexport const MCP_REQUIRED_HEADERS = ['WWW-Authenticate', 'Mcp-Session-Id', 'Last-Event-Id', 'Mcp-Protocol-Version']\n\nexport interface CreateMcpExpressHandlerOptions extends CreateMcpExpressAppOptions {\n /** Bearer-token / OAuth auth configuration. Omit to disable auth entirely. */\n auth?: AuthConfig\n /** CORS configuration. `false` to disable, `true`/`undefined` for permissive defaults, or a CorsOptions object. */\n cors?: CorsOptions | boolean\n /** Hostname for the underlying express app (used by some MCP SDK checks). Default `'0.0.0.0'`. */\n host?: string\n /** Mount the `/resource/:id` sideload route on the returned app. Default `true`. */\n sideloadResources?: boolean\n}\n\nfunction toOAuthReq(req: Request): OAuthRequest {\n return {\n method: req.method,\n url: new URL(req.url, `${req.protocol}://${req.get('host')}`),\n headers: Object.fromEntries(Object.entries(req.headers).map(([k, v]) => [k, Array.isArray(v) ? v[0] : v])),\n body: req.body as Record<string, string> | undefined\n }\n}\n\nfunction sendOAuth(res: Response, oauthRes: OAuthResponse) {\n for (const [key, value] of Object.entries(oauthRes.headers)) { res.header(key, value) }\n if (oauthRes.body) {\n res.status(oauthRes.status).send(typeof oauthRes.body === 'string' ? oauthRes.body : JSON.stringify(oauthRes.body))\n } else {\n res.status(oauthRes.status).end()\n }\n}\n\nfunction mountOAuthRoutes(app: Express, auth: AuthConfig): Set<string> {\n const provider = auth.provider!\n const callbackPath = auth.callbackPath ?? '/auth/callback'\n\n app.get('/.well-known/oauth-authorization-server', (_req: Request, res: Response) => {\n sendOAuth(res, provider.metadata())\n })\n app.get('/authorize', async (req: Request, res: Response) => {\n sendOAuth(res, await provider.authorize(toOAuthReq(req)))\n })\n app.get(callbackPath, async (req: Request, res: Response) => {\n sendOAuth(res, await provider.callback(toOAuthReq(req)))\n })\n app.post('/token', express.urlencoded({ extended: false }), async (req: Request, res: Response) => {\n sendOAuth(res, await provider.token(toOAuthReq(req)))\n })\n app.post('/register', express.json(), async (req: Request, res: Response) => {\n sendOAuth(res, await provider.register(toOAuthReq(req)))\n })\n\n return new Set(['/.well-known/oauth-authorization-server', '/authorize', callbackPath, '/token', '/register'])\n}\n\nfunction mountAuthMiddleware(app: Express, auth: AuthConfig, oauthPaths: Set<string>, context: SilkweaveContext) {\n app.use(async (req: Request, res: Response, next: (err?: unknown) => void) => {\n if (req.path.startsWith('/.well-known/') || oauthPaths.has(req.path)) { return next() }\n const result = await validateToken(req.headers.authorization, auth, context.fork({ request: req }))\n if (result.error) {\n for (const [key, value] of Object.entries(result.error.headers)) {\n res.header(key, value)\n }\n res.status(result.error.statusCode).json(result.error.body)\n return\n }\n if (result.auth) {\n authStorage.run(result.auth, () => { next() })\n } else {\n next()\n }\n })\n}\n\nfunction registerTools(server: McpServer, actions: Action[], context: SilkweaveContext) {\n for (const action of actions) {\n server.registerTool(pascalCase(action.name), {\n title: capitalCase(action.name),\n description: action.description,\n inputSchema: action.input\n }, async (input, extra) => {\n const logger = createLogger({\n stream: process.stderr,\n onLog: (level, data) => {\n extra.sendNotification({ method: 'notifications/message', params: { level, data } })\n },\n onProgress: ({ progress, total, message }) => {\n if (!extra._meta?.progressToken) { return }\n extra.sendNotification({\n method: 'notifications/progress',\n params: { progress, total, message, progressToken: extra._meta.progressToken }\n })\n }\n })\n const currentAuth = authStorage.getStore()\n const actionContext = context.fork({ logger, extra, ...(currentAuth ? { auth: currentAuth } : {}) })\n const disposition = extra._meta?.disposition\n return action.run(input, actionContext).then((result) => {\n if (action.toolResult) {\n const response = action.toolResult(result, actionContext)\n if (response) { return response }\n }\n if (disposition === 'json') {\n return jsonToolResult(result)\n } else {\n return smartToolResult(result)\n }\n }).catch(handleToolError)\n })\n }\n}\n\nfunction createMcpServer(options: SilkweaveOptions, actions: Action[], context: SilkweaveContext): McpServer {\n const server = new McpServer({\n name: options.name,\n description: options.description,\n version: options.version\n }, {\n capabilities: { tools: {}, logging: {} }\n })\n registerTools(server, actions, context)\n return server\n}\n\nfunction createSessionTransport(transports: Record<string, StreamableHTTPServerTransport>): StreamableHTTPServerTransport {\n const eventStore = new InMemoryEventStore()\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n enableJsonResponse: false,\n eventStore,\n onsessioninitialized: (sId) => {\n console.log(`Session initialized with ID: ${sId}`)\n transports[sId] = transport\n }\n })\n transport.onerror = (error) => {\n console.error(error)\n }\n transport.onclose = () => {\n const sid = transport.sessionId\n if (sid && transports[sid]) {\n console.log(`Transport closed for session ${sid}, removing from transports map`)\n delete transports[sid]\n }\n }\n return transport\n}\n\nfunction mountMcpTransport(\n app: Express,\n transports: Record<string, StreamableHTTPServerTransport>,\n createServer: () => McpServer\n) {\n app.post('/mcp', async (req: Request, res: Response) => {\n const sessionId = req.headers['mcp-session-id'] as string | undefined\n try {\n if (sessionId && transports[sessionId]) {\n await transports[sessionId].handleRequest(req, res, req.body)\n return\n }\n\n if (!isInitializeRequest(req.body)) {\n res.status(404).json({\n jsonrpc: '2.0',\n error: { code: -32_000, message: 'Session not found' },\n id: null\n })\n return\n }\n\n const transport = createSessionTransport(transports)\n await createServer().connect(transport)\n await transport.handleRequest(req, res, req.body)\n } catch (error) {\n console.error('Error handling MCP request:', error)\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: { code: -32_603, message: 'Internal server error' },\n id: null\n })\n }\n }\n })\n\n const handleSessionStream = async (req: Request, res: Response) => {\n const sessionId = req.headers['mcp-session-id'] as string | undefined\n if (!sessionId || !transports[sessionId]) {\n res.status(400).send('Invalid or missing session ID')\n return\n }\n const transport = transports[sessionId]\n await transport.handleRequest(req, res)\n }\n\n app.get('/mcp', handleSessionStream)\n app.delete('/mcp', handleSessionStream)\n app.get('/mcp/resource/:id', handleSessionStream)\n}\n\n/**\n * Build an Express sub-app exposing the MCP Streamable HTTP transport, OAuth\n * routes (if configured), and bearer-token auth middleware. The returned app\n * can be listened on directly OR mounted onto an existing server via\n * `parentApp.use(basePath, app)` / Nest's `httpAdapter.use(basePath, app)`.\n *\n * Used by `@silkweave/mcp`'s `http()` adapter (server-owning) and\n * `@silkweave/nestjs`'s `mcp()` adapter (mounts on Nest's HTTP server).\n */\nexport function createMcpExpressHandler(\n silkweaveOptions: SilkweaveOptions,\n context: SilkweaveContext,\n actions: Action[],\n options: CreateMcpExpressHandlerOptions = {}\n): Express {\n const { auth, cors: corsConfig, host = '0.0.0.0', sideloadResources = true, ...mcpOptions } = options\n const app = createMcpExpressApp({ ...mcpOptions, host })\n\n if (corsConfig !== false) {\n const userConfig = corsConfig === true || corsConfig === undefined ? {} : corsConfig\n const userExposed = userConfig.exposedHeaders\n const exposedHeaders = [\n ...MCP_REQUIRED_HEADERS,\n ...(Array.isArray(userExposed) ? userExposed : userExposed ? [userExposed] : [])\n ]\n app.use(cors({ origin: '*', ...userConfig, exposedHeaders }))\n }\n\n if (auth?.authorizationServers?.length && auth.resourceUrl) {\n app.get('/.well-known/oauth-protected-resource', (_req: Request, res: Response) => {\n const metadata = generateProtectedResourceMetadata(auth.resourceUrl!, auth.authorizationServers!)\n res.json(metadata)\n })\n }\n\n const oauthPaths = auth?.provider ? mountOAuthRoutes(app, auth) : new Set<string>()\n\n if (auth) {\n mountAuthMiddleware(app, auth, oauthPaths, context)\n }\n\n if (sideloadResources) {\n app.get('/resource/:id', async (req: Request, res: Response) => {\n const id = req.params.id\n if (!id || typeof id !== 'string') { throw new Error('Invalid ID') }\n const resourceMeta: SideloadResource = JSON.parse(await readFile(`resources/${id}.json`, 'utf-8'))\n const buffer = await readFile(`resources/${id}`)\n res.status(200)\n res.header('Content-Type', resourceMeta.contentType)\n res.send(buffer)\n })\n }\n\n const transports: Record<string, StreamableHTTPServerTransport> = {}\n mountMcpTransport(app, transports, () => createMcpServer(silkweaveOptions, actions, context))\n\n return app\n}\n","import { AuthConfig } from '@silkweave/auth'\nimport { AdapterFactory } from '@silkweave/core'\nimport { CorsOptions } from 'cors'\nimport { Express } from 'express'\nimport { Server } from 'http'\nimport { createMcpExpressHandler, CreateMcpExpressHandlerOptions } from '../lib/handler.js'\n\nexport interface HttpAdapterOptions extends Omit<CreateMcpExpressHandlerOptions, 'auth' | 'cors'> {\n host: string\n port: number\n auth?: AuthConfig\n /** CORS configuration. `false` to disable, `true`/`undefined` for permissive defaults, or a CorsOptions object. */\n cors?: CorsOptions | boolean\n}\n\nexport const http: AdapterFactory<HttpAdapterOptions> = ({ host, port, auth, cors: corsConfig, ...mcpOptions }) => {\n return (options, baseContext) => {\n const context = baseContext.fork({ adapter: 'http' })\n let httpServer: Server | undefined\n let app: Express | undefined\n return {\n context,\n start: async (actions) => {\n app = createMcpExpressHandler(options, context, actions, { ...mcpOptions, host, auth, cors: corsConfig })\n httpServer = app.listen(port, host, (error) => {\n if (error) {\n console.error('Failed to start server:', error)\n process.exit(1)\n }\n console.log(`MCP Streamable HTTP Server listening on http://${host}:${port}/mcp`)\n })\n },\n stop: async () => {\n if (httpServer) {\n await new Promise<void>((resolve, reject) => {\n return httpServer!.close((err) => {\n if (err) {\n reject(err)\n } else {\n resolve()\n }\n })\n })\n }\n httpServer = undefined\n }\n }\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { Action, AdapterFactory, SilkweaveContext } from '@silkweave/core'\nimport { createLogger } from '@silkweave/logger'\nimport { capitalCase, pascalCase } from 'change-case'\nimport { handleToolError, smartToolResult } from '../util/result.js'\n\nfunction registerTools(server: McpServer, actions: Action[], context: SilkweaveContext) {\n for (const action of actions) {\n server.registerTool(pascalCase(action.name), {\n title: capitalCase(action.name),\n description: action.description,\n inputSchema: action.input\n }, async (input, extra) => {\n const logger = createLogger({\n stream: false,\n onLog: (level, data) => {\n extra.sendNotification({ method: 'notifications/message', params: { level, data } })\n },\n onProgress: ({ progress, total, message }) => {\n if (!extra._meta?.progressToken) { return }\n extra.sendNotification({\n method: 'notifications/progress',\n params: { progress, total, message, progressToken: extra._meta.progressToken }\n })\n }\n })\n const actionContext = context.fork({ logger, extra })\n return action.run(input, actionContext)\n .then((result) => action.toolResult?.(result, actionContext) ?? smartToolResult(result))\n .catch(handleToolError)\n })\n }\n}\n\nexport const stdio: AdapterFactory = () => {\n return (options, baseContext) => {\n const context = baseContext.fork({ adapter: 'stdio' })\n const server = new McpServer({\n name: options.name,\n description: options.description,\n version: options.version\n }, {\n capabilities: { tools: {}, logging: {} }\n })\n return {\n context,\n start: async (actions) => {\n registerTools(server, actions, context)\n const transport = new StdioServerTransport()\n await server.connect(transport)\n },\n stop: async () => {\n await server?.close()\n }\n }\n }\n}\n","import { randomUUID } from 'crypto'\nimport { writeFile } from 'fs/promises'\n\nexport interface SideloadResource {\n id: string\n name: string\n contentType: string\n size: number\n}\n\nexport async function createSideloadResource(buffer: Buffer, { name, contentType }: Pick<SideloadResource, 'name' | 'contentType'>) {\n const id = randomUUID()\n const resource: SideloadResource = { id, name, contentType, size: buffer.length }\n await Promise.all([\n writeFile(`resources/${id}`, buffer),\n writeFile(`resources/${id}.json`, JSON.stringify(resource), 'utf-8')\n ])\n return resource\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@silkweave/mcp",
3
- "version": "1.8.0",
3
+ "version": "1.9.0",
4
4
  "description": "Silkweave MCP Package",
5
5
  "repository": {
6
6
  "type": "git",
@@ -17,9 +17,9 @@
17
17
  "cors": "^2.8.6",
18
18
  "express": "^5.2.1",
19
19
  "zod": "^3.25.0",
20
- "@silkweave/logger": "1.8.0",
21
- "@silkweave/core": "1.8.0",
22
- "@silkweave/auth": "1.8.0"
20
+ "@silkweave/auth": "1.9.0",
21
+ "@silkweave/logger": "1.9.0",
22
+ "@silkweave/core": "1.9.0"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@eslint/js": "^10.0.1",