@silkweave/mcp 1.3.2 → 1.4.1

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,18 @@
1
-
2
- > @silkweave/mcp@1.3.1 build /Users/atomic/projects/ai/silkweave/packages/mcp
3
- > tsup
4
-
5
- CLI Building entry: src/index.ts
6
- CLI Using tsconfig: tsconfig.json
7
- CLI tsup v8.5.1
8
- CLI Using tsup config: /Users/atomic/projects/ai/silkweave/packages/mcp/tsup.config.ts
9
- CLI Target: es2022
10
- CLI Cleaning output folder
11
- ESM Build start
12
- ESM build/index.js 14.61 KB
13
- ESM build/index.js.map 26.77 KB
14
- ESM ⚡️ Build success in 7ms
15
- DTS Build start
16
- DTS ⚡️ Build success in 746ms
17
- DTS build/index.d.ts 903.00 B
1
+
2
+ 
3
+ > @silkweave/mcp@1.4.0 build /Users/atomic/projects/ai/silkweave/packages/mcp
4
+ > tsup
5
+
6
+ CLI Building entry: src/index.ts
7
+ CLI Using tsconfig: tsconfig.json
8
+ CLI tsup v8.5.1
9
+ CLI Using tsup config: /Users/atomic/projects/ai/silkweave/packages/mcp/tsup.config.ts
10
+ CLI Target: es2022
11
+ CLI Cleaning output folder
12
+ ESM Build start
13
+ ESM build/index.js 16.40 KB
14
+ ESM build/index.js.map 30.34 KB
15
+ ESM ⚡️ Build success in 8ms
16
+ DTS Build start
17
+ DTS ⚡️ Build success in 709ms
18
+ DTS build/index.d.ts 1.35 KB
@@ -1,12 +1,12 @@
1
1
 
2
- > @silkweave/mcp@1.3.1 check /Users/atomic/projects/ai/silkweave/packages/mcp
2
+ > @silkweave/mcp@1.3.2 check /Users/atomic/projects/ai/silkweave/packages/mcp
3
3
  > pnpm lint && pnpm typecheck
4
4
 
5
5
 
6
- > @silkweave/mcp@1.3.1 lint /Users/atomic/projects/ai/silkweave/packages/mcp
6
+ > @silkweave/mcp@1.3.2 lint /Users/atomic/projects/ai/silkweave/packages/mcp
7
7
  > eslint
8
8
 
9
9
 
10
- > @silkweave/mcp@1.3.1 typecheck /Users/atomic/projects/ai/silkweave/packages/mcp
10
+ > @silkweave/mcp@1.3.2 typecheck /Users/atomic/projects/ai/silkweave/packages/mcp
11
11
  > tsc --noEmit
12
12
 
@@ -1,5 +1,5 @@
1
1
 
2
2
  
3
- > @silkweave/mcp@1.3.1 lint /Users/atomic/projects/ai/silkweave/packages/mcp
3
+ > @silkweave/mcp@1.4.0 lint /Users/atomic/projects/ai/silkweave/packages/mcp
4
4
  > eslint
5
5
 
@@ -1,14 +1,14 @@
1
1
 
2
2
  
3
- > @silkweave/mcp@1.3.0 prepack /Users/atomic/projects/ai/silkweave/packages/mcp
3
+ > @silkweave/mcp@1.4.0 prepack /Users/atomic/projects/ai/silkweave/packages/mcp
4
4
  > pnpm clean && pnpm build
5
5
 
6
6
 
7
- > @silkweave/mcp@1.3.0 clean /Users/atomic/projects/ai/silkweave/packages/mcp
7
+ > @silkweave/mcp@1.4.0 clean /Users/atomic/projects/ai/silkweave/packages/mcp
8
8
  > rimraf build
9
9
 
10
10
 
11
- > @silkweave/mcp@1.3.0 build /Users/atomic/projects/ai/silkweave/packages/mcp
11
+ > @silkweave/mcp@1.4.0 build /Users/atomic/projects/ai/silkweave/packages/mcp
12
12
  > tsup
13
13
 
14
14
  CLI Building entry: src/index.ts
@@ -18,9 +18,9 @@
18
18
  CLI Target: es2022
19
19
  CLI Cleaning output folder
20
20
  ESM Build start
21
- ESM build/index.js 16.03 KB
22
- ESM build/index.js.map 28.18 KB
23
- ESM ⚡️ Build success in 14ms
21
+ ESM build/index.js 16.40 KB
22
+ ESM build/index.js.map 30.34 KB
23
+ ESM ⚡️ Build success in 8ms
24
24
  DTS Build start
25
- DTS ⚡️ Build success in 899ms
26
- DTS build/index.d.ts 903.00 B
25
+ DTS ⚡️ Build success in 705ms
26
+ DTS build/index.d.ts 1.35 KB
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @silkweave/mcp
2
2
 
3
- MCP transport adapters for [Silkweave](https://github.com/silkweave/silkweave) expose your actions as MCP tools over stdio, Streamable HTTP, or via a CLI proxy client.
3
+ MCP transport adapters for [Silkweave](https://github.com/silkweave/silkweave) - expose your actions as MCP tools over stdio, Streamable HTTP, or via a CLI proxy client.
4
4
 
5
5
  ## Install
6
6
 
@@ -61,7 +61,7 @@ Exposes `POST /mcp` (invoke tools), `GET /mcp` (SSE stream), and `DELETE /mcp` (
61
61
 
62
62
  ### cliProxy
63
63
 
64
- MCP CLI proxy client connects to a running HTTP MCP server and invokes tools from the command line.
64
+ MCP CLI proxy client - connects to a running HTTP MCP server and invokes tools from the command line.
65
65
 
66
66
  ```typescript
67
67
  import { silkweave } from '@silkweave/core'
@@ -79,13 +79,71 @@ await silkweave({ name: 'my-tools', description: 'My Tools', version: '1.0.0' })
79
79
  | `name: 'searchDocs'` | Tool name: `SearchDocs` (PascalCase) |
80
80
  | `description` | Tool description |
81
81
  | `input` (Zod schema) | `inputSchema` (JSON Schema) |
82
- | Return value | `TextContent` JSON response |
83
- | Thrown errors | Structured error response |
82
+ | Return value | `CallToolResult` via `smartToolResult` or custom `toolResult` hook |
83
+ | Thrown errors | Structured error response via `handleToolError` |
84
84
 
85
85
  Logging notifications (`logger.info()`, `logger.progress()`) are sent to the MCP client as `notifications/message` and `notifications/progress`.
86
86
 
87
+ ## Smart Tool Results
88
+
89
+ By default, all MCP adapters use `smartToolResult()` to format action return values:
90
+
91
+ - **Small responses** (≤ 4096 chars): returned as inline `TextContent` JSON
92
+ - **Large responses** (> 4096 chars): split into a short text summary + a base64 **embedded resource**, keeping the LLM's context window lean while preserving full data access
93
+
94
+ This is a server-side best practice for managing context bloat. Some MCP clients (e.g. VS Code since December 2025) handle this client-side for all tool calls, but most clients don't — `smartToolResult` ensures good behavior regardless of client capabilities.
95
+
96
+ ### Custom `toolResult` Hook
97
+
98
+ Actions can override the default formatting by defining a `toolResult` hook:
99
+
100
+ ```typescript
101
+ import { createAction } from '@silkweave/core'
102
+ import { jsonToolResult, smartToolResult } from '@silkweave/mcp'
103
+
104
+ const MyAction = createAction({
105
+ name: 'my-action',
106
+ description: 'Example with custom tool result',
107
+ input: z.object({ format: z.enum(['full', 'summary']).default('summary') }),
108
+ run: async ({ format }, context) => {
109
+ context.set('format', format)
110
+ return fetchLargeDataset()
111
+ },
112
+ toolResult: (data, context) => {
113
+ if (context.get('format') === 'full') {
114
+ return smartToolResult(data) // Use default smart splitting
115
+ }
116
+ // Return a lean summary as text + full data as embedded resource
117
+ const summary = data.map(({ id, name }) => ({ id, name }))
118
+ return {
119
+ content: [
120
+ { type: 'text', text: JSON.stringify(summary) },
121
+ { type: 'resource', resource: {
122
+ uri: 'mcp://my-app/dataset.json',
123
+ mimeType: 'application/json',
124
+ blob: Buffer.from(JSON.stringify(data)).toString('base64')
125
+ }}
126
+ ]
127
+ }
128
+ }
129
+ })
130
+ ```
131
+
132
+ Return `undefined` from `toolResult` to fall through to the default `smartToolResult` behavior.
133
+
134
+ ## MCP Result Utilities
135
+
136
+ All result utilities are exported from `@silkweave/mcp`:
137
+
138
+ | Function | Description |
139
+ |----------|-------------|
140
+ | `smartToolResult(data)` | Default formatter with automatic embedded resource splitting at 4096 chars |
141
+ | `jsonToolResult(data, isError?)` | Simple inline `TextContent` JSON (no splitting) |
142
+ | `errorToolResult(error)` | Format a `SilkweaveError` as an error result |
143
+ | `handleToolError(error)` | Catch-all error handler used by all MCP adapters |
144
+
87
145
  ## See Also
88
146
 
89
- - [Silkweave README](https://github.com/silkweave/silkweave) Full documentation
90
- - [`@silkweave/core`](https://www.npmjs.com/package/@silkweave/core) Core library
91
- - [`@silkweave/vercel`](https://www.npmjs.com/package/@silkweave/vercel) Stateless MCP for Vercel
147
+ - [Silkweave README](https://github.com/silkweave/silkweave) - Full documentation
148
+ - [`@silkweave/core`](https://www.npmjs.com/package/@silkweave/core) - Core library
149
+ - [`@silkweave/vercel`](https://www.npmjs.com/package/@silkweave/vercel) - Stateless MCP for Vercel
package/build/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { AdapterFactory } from '@silkweave/core';
1
+ import { AdapterFactory, SilkweaveError } from '@silkweave/core';
2
2
  import { CreateMcpExpressAppOptions } from '@modelcontextprotocol/sdk/server/express.js';
3
3
  import { AuthConfig } from '@silkweave/auth';
4
+ import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
4
5
 
5
6
  interface CliProxyOptions {
6
7
  url: URL;
@@ -16,6 +17,11 @@ declare const http: AdapterFactory<HttpAdapterOptions>;
16
17
 
17
18
  declare const stdio: AdapterFactory;
18
19
 
20
+ declare function smartToolResult(data: string | object | object[]): CallToolResult;
21
+ declare function jsonToolResult(data: object, isError?: boolean): CallToolResult;
22
+ declare function errorToolResult({ code, name, message }: SilkweaveError): CallToolResult;
23
+ declare function handleToolError(error: unknown): CallToolResult;
24
+
19
25
  interface SideloadResource {
20
26
  id: string;
21
27
  name: string;
@@ -24,4 +30,4 @@ interface SideloadResource {
24
30
  }
25
31
  declare function createSideloadResource(buffer: Buffer, { name, contentType }: Pick<SideloadResource, 'name' | 'contentType'>): Promise<SideloadResource>;
26
32
 
27
- export { type CliProxyOptions, type HttpAdapterOptions, type SideloadResource, cliProxy, createSideloadResource, http, stdio };
33
+ export { type CliProxyOptions, type HttpAdapterOptions, type SideloadResource, cliProxy, createSideloadResource, errorToolResult, handleToolError, http, jsonToolResult, smartToolResult, stdio };
package/build/index.js CHANGED
@@ -2,8 +2,8 @@
2
2
  import { intro } from "@clack/prompts";
3
3
  import { Client } from "@modelcontextprotocol/sdk/client";
4
4
  import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
5
- import { LoggingMessageNotificationSchema, ProgressNotificationSchema } from "@modelcontextprotocol/sdk/types";
6
- import { parseToolResponse, unwrap } from "@silkweave/core";
5
+ import { LoggingMessageNotificationSchema, ProgressNotificationSchema } from "@modelcontextprotocol/sdk/types.js";
6
+ import { unwrap } from "@silkweave/core";
7
7
  import { createCLILogger } from "@silkweave/logger";
8
8
  import { kebabCase } from "change-case";
9
9
  import { Command } from "commander";
@@ -58,8 +58,7 @@ function registerProxyCommand(program, client, tool, options) {
58
58
  arguments: input,
59
59
  _meta: { progressToken: randomUUID() }
60
60
  });
61
- const result = parseToolResponse(response);
62
- process.stdout.write(JSON.stringify(result, null, 2));
61
+ process.stdout.write(JSON.stringify(response));
63
62
  });
64
63
  }
65
64
  var cliProxy = ({ url }) => {
@@ -96,14 +95,64 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
96
95
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
97
96
  import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
98
97
  import { generateProtectedResourceMetadata, validateToken } from "@silkweave/auth";
99
- import { handleToolError, toolResponse } from "@silkweave/core";
100
98
  import { createLogger } from "@silkweave/logger";
101
99
  import { capitalCase, pascalCase } from "change-case";
102
100
  import cors from "cors";
103
- import { randomUUID as randomUUID2 } from "crypto";
101
+ import { randomUUID as randomUUID3 } from "crypto";
104
102
  import express from "express";
105
103
  import { readFile } from "fs/promises";
106
104
  import { AsyncLocalStorage } from "async_hooks";
105
+
106
+ // src/util/result.ts
107
+ import { SilkweaveError } from "@silkweave/core";
108
+ import { randomUUID as randomUUID2 } from "crypto";
109
+ function smartToolResult(data) {
110
+ const text = typeof data === "string" ? data : JSON.stringify(data);
111
+ const mimeType = typeof data === "string" ? "text/plain" : "application/json";
112
+ const ext = typeof data === "string" ? "txt" : "json";
113
+ if (text.length > 4096) {
114
+ const uri = `mcp://toolResult/${randomUUID2()}.${ext}`;
115
+ const buffer = Buffer.from(text);
116
+ const blob = buffer.toString("base64");
117
+ return {
118
+ content: [
119
+ { type: "text", text: `Received resource ${uri} with ${buffer.byteLength} bytes` },
120
+ { type: "resource", resource: { uri, mimeType, blob } }
121
+ ]
122
+ };
123
+ } else {
124
+ return {
125
+ content: [{ type: "text", text }]
126
+ };
127
+ }
128
+ }
129
+ function jsonToolResult(data, isError = false) {
130
+ const result = { content: [{ type: "text", text: JSON.stringify(data) }] };
131
+ if (isError) {
132
+ result.isError = true;
133
+ }
134
+ return result;
135
+ }
136
+ function errorToolResult({ code, name, message }) {
137
+ return {
138
+ isError: true,
139
+ content: [{
140
+ type: "text",
141
+ text: JSON.stringify({ success: false, code, name, message })
142
+ }]
143
+ };
144
+ }
145
+ function handleToolError(error) {
146
+ if (error instanceof SilkweaveError) {
147
+ return jsonToolResult({ success: false, name: error.name, message: error.message, code: error.code }, true);
148
+ } else if (error instanceof Error) {
149
+ return jsonToolResult({ success: false, name: error.name, message: error.message, stack: error.stack }, true);
150
+ } else {
151
+ return jsonToolResult({ success: false, name: "Unknown error", message: "An unknown error occurred", error }, true);
152
+ }
153
+ }
154
+
155
+ // src/adapter/http.ts
107
156
  var authStorage = new AsyncLocalStorage();
108
157
  function mountOAuthRoutes(app, auth) {
109
158
  const provider = auth.provider;
@@ -141,12 +190,12 @@ function mountOAuthRoutes(app, auth) {
141
190
  });
142
191
  return /* @__PURE__ */ new Set(["/.well-known/oauth-authorization-server", "/authorize", callbackPath, "/token", "/register"]);
143
192
  }
144
- function mountAuthMiddleware(app, auth, oauthPaths) {
193
+ function mountAuthMiddleware(app, auth, oauthPaths, context) {
145
194
  app.use(async (req, res, next) => {
146
195
  if (req.path.startsWith("/.well-known/") || oauthPaths.has(req.path)) {
147
196
  return next();
148
197
  }
149
- const result = await validateToken(req.headers.authorization, auth);
198
+ const result = await validateToken(req.headers.authorization, auth, context.fork({ request: req }));
150
199
  if (result.error) {
151
200
  for (const [key, value] of Object.entries(result.error.headers)) {
152
201
  res.header(key, value);
@@ -186,7 +235,11 @@ function registerTools(server, actions, context) {
186
235
  }
187
236
  });
188
237
  const currentAuth = authStorage.getStore();
189
- return action.run(input, context.fork({ logger, extra, ...currentAuth ? { auth: currentAuth } : {} })).then((result) => toolResponse(result)).catch(handleToolError);
238
+ const actionContext = context.fork({ logger, extra, ...currentAuth ? { auth: currentAuth } : {} });
239
+ return action.run(input, actionContext).then((result) => {
240
+ const data = action.toolResult?.(result, actionContext) ?? smartToolResult(result);
241
+ return data;
242
+ }).catch(handleToolError);
190
243
  });
191
244
  }
192
245
  }
@@ -204,7 +257,7 @@ function createMcpServer(options, actions, context) {
204
257
  function createSessionTransport(transports) {
205
258
  const eventStore = new InMemoryEventStore();
206
259
  const transport = new StreamableHTTPServerTransport({
207
- sessionIdGenerator: () => randomUUID2(),
260
+ sessionIdGenerator: () => randomUUID3(),
208
261
  enableJsonResponse: false,
209
262
  eventStore,
210
263
  onsessioninitialized: (sId) => {
@@ -280,7 +333,7 @@ var http = ({ host, port, auth, ...mcpOptions }) => {
280
333
  }
281
334
  const oauthPaths = auth?.provider ? mountOAuthRoutes(app, auth) : /* @__PURE__ */ new Set();
282
335
  if (auth) {
283
- mountAuthMiddleware(app, auth, oauthPaths);
336
+ mountAuthMiddleware(app, auth, oauthPaths, context);
284
337
  }
285
338
  const transports = {};
286
339
  let mountedActions = [];
@@ -330,7 +383,6 @@ var http = ({ host, port, auth, ...mcpOptions }) => {
330
383
  // src/adapter/stdio.ts
331
384
  import { McpServer as McpServer2 } from "@modelcontextprotocol/sdk/server/mcp.js";
332
385
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
333
- import { handleToolError as handleToolError2, toolResponse as toolResponse2 } from "@silkweave/core";
334
386
  import { createLogger as createLogger2 } from "@silkweave/logger";
335
387
  import { capitalCase as capitalCase2, pascalCase as pascalCase2 } from "change-case";
336
388
  function registerTools2(server, actions, context) {
@@ -355,7 +407,8 @@ function registerTools2(server, actions, context) {
355
407
  });
356
408
  }
357
409
  });
358
- return action.run(input, context.fork({ logger, extra })).then((result) => toolResponse2(result)).catch(handleToolError2);
410
+ const actionContext = context.fork({ logger, extra });
411
+ return action.run(input, actionContext).then((result) => action.toolResult?.(result, actionContext) ?? smartToolResult(result)).catch(handleToolError);
359
412
  });
360
413
  }
361
414
  }
@@ -384,10 +437,10 @@ var stdio = () => {
384
437
  };
385
438
 
386
439
  // src/util/sideload.ts
387
- import { randomUUID as randomUUID3 } from "crypto";
440
+ import { randomUUID as randomUUID4 } from "crypto";
388
441
  import { writeFile } from "fs/promises";
389
442
  async function createSideloadResource(buffer, { name, contentType }) {
390
- const id = randomUUID3();
443
+ const id = randomUUID4();
391
444
  const resource = { id, name, contentType, size: buffer.length };
392
445
  await Promise.all([
393
446
  writeFile(`resources/${id}`, buffer),
@@ -398,7 +451,11 @@ async function createSideloadResource(buffer, { name, contentType }) {
398
451
  export {
399
452
  cliProxy,
400
453
  createSideloadResource,
454
+ errorToolResult,
455
+ handleToolError,
401
456
  http,
457
+ jsonToolResult,
458
+ smartToolResult,
402
459
  stdio
403
460
  };
404
461
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter/cliProxy.ts","../src/adapter/http.ts","../src/adapter/stdio.ts","../src/util/sideload.ts"],"sourcesContent":["import { intro } from '@clack/prompts'\nimport { Client } from '@modelcontextprotocol/sdk/client'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\nimport { LoggingMessageNotificationSchema, ProgressNotificationSchema } from '@modelcontextprotocol/sdk/types'\nimport { AdapterFactory, parseToolResponse, ToolResponse, 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'\nimport { JSONSchema } from 'zod/v4/core'\n\nexport interface CliProxyOptions {\n url: URL\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/* eslint-enable @typescript-eslint/no-explicit-any */\n\nfunction registerProxyCommand(\n program: Command,\n client: Client,\n tool: { name: string; description?: string; inputSchema: object },\n options: { name: string; version: string; description: string }\n) {\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() }\n })\n const result = parseToolResponse(response as ToolResponse)\n process.stdout.write(JSON.stringify(result, null, 2))\n })\n}\n\nexport const cliProxy: AdapterFactory<CliProxyOptions> = ({ url }) => {\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 registerProxyCommand(program, client, tool, options)\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, handleToolError, SilkweaveContext, SilkweaveOptions, toolResponse } from '@silkweave/core'\nimport { createLogger } from '@silkweave/logger'\nimport { capitalCase, pascalCase } from 'change-case'\nimport cors 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 { SideloadResource } from '../util/sideload.js'\n\nconst authStorage = new AsyncLocalStorage<AuthInfo>()\n\nexport interface HttpAdapterOptions extends CreateMcpExpressAppOptions {\n host: string\n port: number\n auth?: AuthConfig\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>) {\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)\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 return action.run(input, context.fork({ logger, extra, ...(currentAuth ? { auth: currentAuth } : {}) }))\n .then((result) => toolResponse(result))\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, ...mcpOptions }) => {\n return (options, baseContext) => {\n const context = baseContext.fork({ adapter: 'http' })\n const app = createMcpExpressApp({ ...mcpOptions, host })\n app.use(cors({ exposedHeaders: ['WWW-Authenticate', 'Mcp-Session-Id', 'Last-Event-Id', 'Mcp-Protocol-Version'], origin: '*' }))\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)\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, handleToolError, SilkweaveContext, toolResponse } from '@silkweave/core'\nimport { createLogger } from '@silkweave/logger'\nimport { capitalCase, pascalCase } from 'change-case'\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 return action.run(input, context.fork({ logger, extra }))\n .then((result) => toolResponse(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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","names":["randomUUID","McpServer","handleToolError","toolResponse","createLogger","capitalCase","pascalCase","registerTools","randomUUID"]}
1
+ {"version":3,"sources":["../src/adapter/cliProxy.ts","../src/adapter/http.ts","../src/util/result.ts","../src/adapter/stdio.ts","../src/util/sideload.ts"],"sourcesContent":["import { intro } from '@clack/prompts'\nimport { Client } from '@modelcontextprotocol/sdk/client'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\nimport { LoggingMessageNotificationSchema, ProgressNotificationSchema } 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'\nimport { JSONSchema } from 'zod/v4/core'\n\nexport interface CliProxyOptions {\n url: URL\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/* eslint-enable @typescript-eslint/no-explicit-any */\n\nfunction registerProxyCommand(\n program: Command,\n client: Client,\n tool: { name: string; description?: string; inputSchema: object },\n options: { name: string; version: string; description: string }\n) {\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() }\n })\n process.stdout.write(JSON.stringify(response))\n })\n}\n\nexport const cliProxy: AdapterFactory<CliProxyOptions> = ({ url }) => {\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 registerProxyCommand(program, client, tool, options)\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 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, smartToolResult } from '../util/result.js'\nimport { SideloadResource } from '../util/sideload.js'\n\nconst authStorage = new AsyncLocalStorage<AuthInfo>()\n\nexport interface HttpAdapterOptions extends CreateMcpExpressAppOptions {\n host: string\n port: number\n auth?: AuthConfig\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 return action.run(input, actionContext)\n .then((result) => {\n const data = action.toolResult?.(result, actionContext) ?? smartToolResult(result)\n return data\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, ...mcpOptions }) => {\n return (options, baseContext) => {\n const context = baseContext.fork({ adapter: 'http' })\n const app = createMcpExpressApp({ ...mcpOptions, host })\n app.use(cors({ exposedHeaders: ['WWW-Authenticate', 'Mcp-Session-Id', 'Last-Event-Id', 'Mcp-Protocol-Version'], origin: '*' }))\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 { 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","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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","names":["randomUUID","randomUUID","randomUUID","McpServer","createLogger","capitalCase","pascalCase","registerTools","pascalCase","capitalCase","createLogger","McpServer","randomUUID"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@silkweave/mcp",
3
- "version": "1.3.2",
3
+ "version": "1.4.1",
4
4
  "description": "Silkweave MCP Package",
5
5
  "repository": {
6
6
  "type": "git",
@@ -18,9 +18,9 @@
18
18
  "cors": "^2.8.6",
19
19
  "express": "^5.2.1",
20
20
  "zod": "^4.3.6",
21
- "@silkweave/logger": "1.3.2",
22
- "@silkweave/core": "1.3.2",
23
- "@silkweave/auth": "1.3.2"
21
+ "@silkweave/core": "1.4.1",
22
+ "@silkweave/auth": "1.4.1",
23
+ "@silkweave/logger": "1.4.1"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@eslint/js": "^10.0.1",