@silkweave/mcp 1.3.1 → 1.4.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.
- package/.turbo/turbo-build.log +6 -6
- package/.turbo/turbo-check.log +3 -5
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-prepack.log +8 -8
- package/README.md +65 -7
- package/build/index.d.ts +8 -2
- package/build/index.js +188 -147
- package/build/index.js.map +1 -1
- package/package.json +4 -4
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @silkweave/mcp@1.3.
|
|
3
|
+
> @silkweave/mcp@1.3.2 build /Users/atomic/projects/ai/silkweave/packages/mcp
|
|
4
4
|
> tsup
|
|
5
5
|
|
|
6
6
|
[34mCLI[39m Building entry: src/index.ts
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
[34mCLI[39m Target: es2022
|
|
11
11
|
[34mCLI[39m Cleaning output folder
|
|
12
12
|
[34mESM[39m Build start
|
|
13
|
-
[32mESM[39m [1mbuild/index.js [22m[32m16.
|
|
14
|
-
[32mESM[39m [1mbuild/index.js.map [22m[
|
|
15
|
-
[32mESM[39m ⚡️ Build success in
|
|
13
|
+
[32mESM[39m [1mbuild/index.js [22m[32m16.40 KB[39m
|
|
14
|
+
[32mESM[39m [1mbuild/index.js.map [22m[32m30.34 KB[39m
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 9ms
|
|
16
16
|
DTS Build start
|
|
17
|
-
DTS ⚡️ Build success in
|
|
18
|
-
DTS build/index.d.ts
|
|
17
|
+
DTS ⚡️ Build success in 711ms
|
|
18
|
+
DTS build/index.d.ts 1.34 KB
|
package/.turbo/turbo-check.log
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
|
|
2
|
-
> @silkweave/mcp@1.3.
|
|
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.
|
|
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.
|
|
10
|
+
> @silkweave/mcp@1.3.2 typecheck /Users/atomic/projects/ai/silkweave/packages/mcp
|
|
11
11
|
> tsc --noEmit
|
|
12
12
|
|
|
13
|
-
ELIFECYCLE Command failed.
|
|
14
|
-
ELIFECYCLE Command failed.
|
package/.turbo/turbo-lint.log
CHANGED
package/.turbo/turbo-prepack.log
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @silkweave/mcp@1.
|
|
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.
|
|
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.
|
|
11
|
+
> @silkweave/mcp@1.4.0 build /Users/atomic/projects/ai/silkweave/packages/mcp
|
|
12
12
|
> tsup
|
|
13
13
|
|
|
14
14
|
[34mCLI[39m Building entry: src/index.ts
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
[34mCLI[39m Target: es2022
|
|
19
19
|
[34mCLI[39m Cleaning output folder
|
|
20
20
|
[34mESM[39m Build start
|
|
21
|
-
[32mESM[39m [1mbuild/index.js [22m[32m16.
|
|
22
|
-
[32mESM[39m [1mbuild/index.js.map [22m[
|
|
23
|
-
[32mESM[39m ⚡️ Build success in
|
|
21
|
+
[32mESM[39m [1mbuild/index.js [22m[32m16.40 KB[39m
|
|
22
|
+
[32mESM[39m [1mbuild/index.js.map [22m[32m30.34 KB[39m
|
|
23
|
+
[32mESM[39m ⚡️ Build success in 8ms
|
|
24
24
|
DTS Build start
|
|
25
|
-
DTS ⚡️ Build success in
|
|
26
|
-
DTS build/index.d.ts
|
|
25
|
+
DTS ⚡️ Build success in 728ms
|
|
26
|
+
DTS build/index.d.ts 1.34 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)
|
|
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
|
|
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 | `
|
|
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)
|
|
90
|
-
- [`@silkweave/core`](https://www.npmjs.com/package/@silkweave/core)
|
|
91
|
-
- [`@silkweave/vercel`](https://www.npmjs.com/package/@silkweave/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';
|
|
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
|
@@ -3,12 +3,64 @@ import { intro } from "@clack/prompts";
|
|
|
3
3
|
import { Client } from "@modelcontextprotocol/sdk/client";
|
|
4
4
|
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
5
5
|
import { LoggingMessageNotificationSchema, ProgressNotificationSchema } from "@modelcontextprotocol/sdk/types";
|
|
6
|
-
import {
|
|
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";
|
|
10
10
|
import { randomUUID } from "crypto";
|
|
11
11
|
import { z } from "zod";
|
|
12
|
+
function addCliOption(command, key, type, defaultValue) {
|
|
13
|
+
const description = type.description;
|
|
14
|
+
const flag = kebabCase(key);
|
|
15
|
+
if (type instanceof z.ZodBoolean) {
|
|
16
|
+
command.option(`--${flag}`, description, defaultValue);
|
|
17
|
+
command.option(`--no-${flag}`);
|
|
18
|
+
} else if (type instanceof z.ZodNumber) {
|
|
19
|
+
command.option(`--${flag} <number>`, description, defaultValue);
|
|
20
|
+
} else if (type instanceof z.ZodString || type instanceof z.ZodEnum) {
|
|
21
|
+
command.option(`--${flag} <string>`, description, defaultValue);
|
|
22
|
+
} else if (type instanceof z.ZodObject || type instanceof z.ZodRecord || type instanceof z.ZodArray) {
|
|
23
|
+
command.option(`--${flag} <json>`, description ?? "", JSON.parse, defaultValue);
|
|
24
|
+
} else {
|
|
25
|
+
throw new Error(`Invalid zod type: ${type.def.type}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function registerProxyCommand(program, client, tool, options) {
|
|
29
|
+
const name = kebabCase(tool.name);
|
|
30
|
+
const command = program.command(name);
|
|
31
|
+
if (tool.description) {
|
|
32
|
+
command.description(tool.description);
|
|
33
|
+
}
|
|
34
|
+
const schema = z.fromJSONSchema(tool.inputSchema);
|
|
35
|
+
if (!(schema instanceof z.ZodObject)) {
|
|
36
|
+
throw new Error("Invalid schema");
|
|
37
|
+
}
|
|
38
|
+
const shape = schema.shape;
|
|
39
|
+
for (const key of Object.keys(shape)) {
|
|
40
|
+
const [type, { defaultValue }] = unwrap(shape[key]);
|
|
41
|
+
addCliOption(command, key, type, defaultValue);
|
|
42
|
+
}
|
|
43
|
+
command.action(async (args) => {
|
|
44
|
+
const { silent } = program.opts();
|
|
45
|
+
const logger = createCLILogger();
|
|
46
|
+
if (!silent) {
|
|
47
|
+
intro(`${options.name} - ${tool.name}`);
|
|
48
|
+
client.setNotificationHandler(LoggingMessageNotificationSchema, ({ params: { level, data } }) => {
|
|
49
|
+
logger[level](data);
|
|
50
|
+
});
|
|
51
|
+
client.setNotificationHandler(ProgressNotificationSchema, ({ params: { progress, total, message } }) => {
|
|
52
|
+
logger.info({ progress, total, message });
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const input = await schema.parseAsync(args);
|
|
56
|
+
const response = await client.callTool({
|
|
57
|
+
name: tool.name,
|
|
58
|
+
arguments: input,
|
|
59
|
+
_meta: { progressToken: randomUUID() }
|
|
60
|
+
});
|
|
61
|
+
process.stdout.write(JSON.stringify(response));
|
|
62
|
+
});
|
|
63
|
+
}
|
|
12
64
|
var cliProxy = ({ url }) => {
|
|
13
65
|
return (options, baseContext) => {
|
|
14
66
|
const context = baseContext.fork({ adapter: "cliProxy" });
|
|
@@ -25,54 +77,7 @@ var cliProxy = ({ url }) => {
|
|
|
25
77
|
await client.connect(transport);
|
|
26
78
|
const { tools } = await client.listTools();
|
|
27
79
|
for (const tool of tools) {
|
|
28
|
-
|
|
29
|
-
const command = program.command(name);
|
|
30
|
-
if (tool.description) {
|
|
31
|
-
command.description(tool.description);
|
|
32
|
-
}
|
|
33
|
-
const schema = z.fromJSONSchema(tool.inputSchema);
|
|
34
|
-
if (!(schema instanceof z.ZodObject)) {
|
|
35
|
-
throw new Error("Invalid schema");
|
|
36
|
-
}
|
|
37
|
-
const shape = schema.shape;
|
|
38
|
-
const keys = Object.keys(shape);
|
|
39
|
-
for (const key of keys) {
|
|
40
|
-
const [type, { defaultValue }] = unwrap(shape[key]);
|
|
41
|
-
const description = type.description;
|
|
42
|
-
if (type instanceof z.ZodBoolean) {
|
|
43
|
-
command.option(`--${kebabCase(key)}`, description, defaultValue);
|
|
44
|
-
command.option(`--no-${kebabCase(key)}`);
|
|
45
|
-
} else if (type instanceof z.ZodNumber) {
|
|
46
|
-
command.option(`--${kebabCase(key)} <number>`, description, defaultValue);
|
|
47
|
-
} else if (type instanceof z.ZodString || type instanceof z.ZodEnum) {
|
|
48
|
-
command.option(`--${kebabCase(key)} <string>`, description, defaultValue);
|
|
49
|
-
} else if (type instanceof z.ZodObject || type instanceof z.ZodRecord || type instanceof z.ZodArray) {
|
|
50
|
-
command.option(`--${kebabCase(key)} <json>`, description ?? "", JSON.parse, defaultValue);
|
|
51
|
-
} else {
|
|
52
|
-
throw new Error(`Invalid zod type: ${type.def.type}`);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
command.action(async (args) => {
|
|
56
|
-
const { silent } = program.opts();
|
|
57
|
-
const logger = createCLILogger();
|
|
58
|
-
if (!silent) {
|
|
59
|
-
intro(`${options.name} - ${tool.name}`);
|
|
60
|
-
client.setNotificationHandler(LoggingMessageNotificationSchema, ({ params: { level, data } }) => {
|
|
61
|
-
logger[level](data);
|
|
62
|
-
});
|
|
63
|
-
client.setNotificationHandler(ProgressNotificationSchema, ({ params: { progress, total, message } }) => {
|
|
64
|
-
logger.info({ progress, total, message });
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
const input = await schema.parseAsync(args);
|
|
68
|
-
const response = await client.callTool({
|
|
69
|
-
name: tool.name,
|
|
70
|
-
arguments: input,
|
|
71
|
-
_meta: { progressToken: randomUUID() }
|
|
72
|
-
});
|
|
73
|
-
const result = parseToolResponse(response);
|
|
74
|
-
process.stdout.write(JSON.stringify(result, null, 2));
|
|
75
|
-
});
|
|
80
|
+
registerProxyCommand(program, client, tool, options);
|
|
76
81
|
}
|
|
77
82
|
await program.parseAsync();
|
|
78
83
|
await transport.close();
|
|
@@ -90,14 +95,64 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
90
95
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
91
96
|
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
92
97
|
import { generateProtectedResourceMetadata, validateToken } from "@silkweave/auth";
|
|
93
|
-
import { SilkweaveError, toolResponse } from "@silkweave/core";
|
|
94
98
|
import { createLogger } from "@silkweave/logger";
|
|
95
99
|
import { capitalCase, pascalCase } from "change-case";
|
|
96
100
|
import cors from "cors";
|
|
97
|
-
import { randomUUID as
|
|
101
|
+
import { randomUUID as randomUUID3 } from "crypto";
|
|
98
102
|
import express from "express";
|
|
99
103
|
import { readFile } from "fs/promises";
|
|
100
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
|
|
101
156
|
var authStorage = new AsyncLocalStorage();
|
|
102
157
|
function mountOAuthRoutes(app, auth) {
|
|
103
158
|
const provider = auth.provider;
|
|
@@ -135,12 +190,12 @@ function mountOAuthRoutes(app, auth) {
|
|
|
135
190
|
});
|
|
136
191
|
return /* @__PURE__ */ new Set(["/.well-known/oauth-authorization-server", "/authorize", callbackPath, "/token", "/register"]);
|
|
137
192
|
}
|
|
138
|
-
function mountAuthMiddleware(app, auth, oauthPaths) {
|
|
193
|
+
function mountAuthMiddleware(app, auth, oauthPaths, context) {
|
|
139
194
|
app.use(async (req, res, next) => {
|
|
140
195
|
if (req.path.startsWith("/.well-known/") || oauthPaths.has(req.path)) {
|
|
141
196
|
return next();
|
|
142
197
|
}
|
|
143
|
-
const result = await validateToken(req.headers.authorization, auth);
|
|
198
|
+
const result = await validateToken(req.headers.authorization, auth, context.fork({ request: req }));
|
|
144
199
|
if (result.error) {
|
|
145
200
|
for (const [key, value] of Object.entries(result.error.headers)) {
|
|
146
201
|
res.header(key, value);
|
|
@@ -157,14 +212,7 @@ function mountAuthMiddleware(app, auth, oauthPaths) {
|
|
|
157
212
|
}
|
|
158
213
|
});
|
|
159
214
|
}
|
|
160
|
-
function
|
|
161
|
-
const server = new McpServer({
|
|
162
|
-
name: options.name,
|
|
163
|
-
description: options.description,
|
|
164
|
-
version: options.version
|
|
165
|
-
}, {
|
|
166
|
-
capabilities: { tools: {}, logging: {} }
|
|
167
|
-
});
|
|
215
|
+
function registerTools(server, actions, context) {
|
|
168
216
|
for (const action of actions) {
|
|
169
217
|
server.registerTool(pascalCase(action.name), {
|
|
170
218
|
title: capitalCase(action.name),
|
|
@@ -182,63 +230,62 @@ function createMcpServer(options, actions, context) {
|
|
|
182
230
|
}
|
|
183
231
|
extra.sendNotification({
|
|
184
232
|
method: "notifications/progress",
|
|
185
|
-
params: {
|
|
186
|
-
progress,
|
|
187
|
-
total,
|
|
188
|
-
message,
|
|
189
|
-
progressToken: extra._meta.progressToken
|
|
190
|
-
}
|
|
233
|
+
params: { progress, total, message, progressToken: extra._meta.progressToken }
|
|
191
234
|
});
|
|
192
235
|
}
|
|
193
236
|
});
|
|
194
237
|
const currentAuth = authStorage.getStore();
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
} else if (error instanceof Error) {
|
|
201
|
-
return toolResponse({ success: false, name: error.name, message: error.message, stack: error.stack }, true);
|
|
202
|
-
} else {
|
|
203
|
-
return toolResponse({ success: false, name: "Unknown Error", message: "An unknown error occurred", error }, true);
|
|
204
|
-
}
|
|
205
|
-
});
|
|
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);
|
|
206
243
|
});
|
|
207
244
|
}
|
|
245
|
+
}
|
|
246
|
+
function createMcpServer(options, actions, context) {
|
|
247
|
+
const server = new McpServer({
|
|
248
|
+
name: options.name,
|
|
249
|
+
description: options.description,
|
|
250
|
+
version: options.version
|
|
251
|
+
}, {
|
|
252
|
+
capabilities: { tools: {}, logging: {} }
|
|
253
|
+
});
|
|
254
|
+
registerTools(server, actions, context);
|
|
208
255
|
return server;
|
|
209
256
|
}
|
|
257
|
+
function createSessionTransport(transports) {
|
|
258
|
+
const eventStore = new InMemoryEventStore();
|
|
259
|
+
const transport = new StreamableHTTPServerTransport({
|
|
260
|
+
sessionIdGenerator: () => randomUUID3(),
|
|
261
|
+
enableJsonResponse: false,
|
|
262
|
+
eventStore,
|
|
263
|
+
onsessioninitialized: (sId) => {
|
|
264
|
+
console.log(`Session initialized with ID: ${sId}`);
|
|
265
|
+
transports[sId] = transport;
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
transport.onerror = (error) => {
|
|
269
|
+
console.error(error);
|
|
270
|
+
};
|
|
271
|
+
transport.onclose = () => {
|
|
272
|
+
const sid = transport.sessionId;
|
|
273
|
+
if (sid && transports[sid]) {
|
|
274
|
+
console.log(`Transport closed for session ${sid}, removing from transports map`);
|
|
275
|
+
delete transports[sid];
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
return transport;
|
|
279
|
+
}
|
|
210
280
|
function mountMcpTransport(app, transports, createServer) {
|
|
211
281
|
app.post("/mcp", async (req, res) => {
|
|
212
282
|
const sessionId = req.headers["mcp-session-id"];
|
|
213
283
|
try {
|
|
214
|
-
let transport;
|
|
215
284
|
if (sessionId && transports[sessionId]) {
|
|
216
|
-
|
|
217
|
-
} else if (isInitializeRequest(req.body)) {
|
|
218
|
-
const eventStore = new InMemoryEventStore();
|
|
219
|
-
transport = new StreamableHTTPServerTransport({
|
|
220
|
-
sessionIdGenerator: () => randomUUID2(),
|
|
221
|
-
enableJsonResponse: false,
|
|
222
|
-
eventStore,
|
|
223
|
-
onsessioninitialized: (sId) => {
|
|
224
|
-
console.log(`Session initialized with ID: ${sId}`);
|
|
225
|
-
transports[sId] = transport;
|
|
226
|
-
}
|
|
227
|
-
});
|
|
228
|
-
transport.onerror = (error) => {
|
|
229
|
-
console.error(error);
|
|
230
|
-
};
|
|
231
|
-
transport.onclose = () => {
|
|
232
|
-
const sid = transport.sessionId;
|
|
233
|
-
if (sid && transports[sid]) {
|
|
234
|
-
console.log(`Transport closed for session ${sid}, removing from transports map`);
|
|
235
|
-
delete transports[sid];
|
|
236
|
-
}
|
|
237
|
-
};
|
|
238
|
-
await createServer().connect(transport);
|
|
239
|
-
await transport.handleRequest(req, res, req.body);
|
|
285
|
+
await transports[sessionId].handleRequest(req, res, req.body);
|
|
240
286
|
return;
|
|
241
|
-
}
|
|
287
|
+
}
|
|
288
|
+
if (!isInitializeRequest(req.body)) {
|
|
242
289
|
res.status(404).json({
|
|
243
290
|
jsonrpc: "2.0",
|
|
244
291
|
error: { code: -32e3, message: "Session not found" },
|
|
@@ -246,6 +293,8 @@ function mountMcpTransport(app, transports, createServer) {
|
|
|
246
293
|
});
|
|
247
294
|
return;
|
|
248
295
|
}
|
|
296
|
+
const transport = createSessionTransport(transports);
|
|
297
|
+
await createServer().connect(transport);
|
|
249
298
|
await transport.handleRequest(req, res, req.body);
|
|
250
299
|
} catch (error) {
|
|
251
300
|
console.error("Error handling MCP request:", error);
|
|
@@ -284,7 +333,7 @@ var http = ({ host, port, auth, ...mcpOptions }) => {
|
|
|
284
333
|
}
|
|
285
334
|
const oauthPaths = auth?.provider ? mountOAuthRoutes(app, auth) : /* @__PURE__ */ new Set();
|
|
286
335
|
if (auth) {
|
|
287
|
-
mountAuthMiddleware(app, auth, oauthPaths);
|
|
336
|
+
mountAuthMiddleware(app, auth, oauthPaths, context);
|
|
288
337
|
}
|
|
289
338
|
const transports = {};
|
|
290
339
|
let mountedActions = [];
|
|
@@ -334,9 +383,35 @@ var http = ({ host, port, auth, ...mcpOptions }) => {
|
|
|
334
383
|
// src/adapter/stdio.ts
|
|
335
384
|
import { McpServer as McpServer2 } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
336
385
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
337
|
-
import { SilkweaveError as SilkweaveError2, toolResponse as toolResponse2 } from "@silkweave/core";
|
|
338
386
|
import { createLogger as createLogger2 } from "@silkweave/logger";
|
|
339
387
|
import { capitalCase as capitalCase2, pascalCase as pascalCase2 } from "change-case";
|
|
388
|
+
function registerTools2(server, actions, context) {
|
|
389
|
+
for (const action of actions) {
|
|
390
|
+
server.registerTool(pascalCase2(action.name), {
|
|
391
|
+
title: capitalCase2(action.name),
|
|
392
|
+
description: action.description,
|
|
393
|
+
inputSchema: action.input
|
|
394
|
+
}, async (input, extra) => {
|
|
395
|
+
const logger = createLogger2({
|
|
396
|
+
stream: false,
|
|
397
|
+
onLog: (level, data) => {
|
|
398
|
+
extra.sendNotification({ method: "notifications/message", params: { level, data } });
|
|
399
|
+
},
|
|
400
|
+
onProgress: ({ progress, total, message }) => {
|
|
401
|
+
if (!extra._meta?.progressToken) {
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
extra.sendNotification({
|
|
405
|
+
method: "notifications/progress",
|
|
406
|
+
params: { progress, total, message, progressToken: extra._meta.progressToken }
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
const actionContext = context.fork({ logger, extra });
|
|
411
|
+
return action.run(input, actionContext).then((result) => action.toolResult?.(result, actionContext) ?? smartToolResult(result)).catch(handleToolError);
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
}
|
|
340
415
|
var stdio = () => {
|
|
341
416
|
return (options, baseContext) => {
|
|
342
417
|
const context = baseContext.fork({ adapter: "stdio" });
|
|
@@ -350,45 +425,7 @@ var stdio = () => {
|
|
|
350
425
|
return {
|
|
351
426
|
context,
|
|
352
427
|
start: async (actions) => {
|
|
353
|
-
|
|
354
|
-
server.registerTool(pascalCase2(action.name), {
|
|
355
|
-
title: capitalCase2(action.name),
|
|
356
|
-
description: action.description,
|
|
357
|
-
inputSchema: action.input
|
|
358
|
-
}, async (input, extra) => {
|
|
359
|
-
const logger = createLogger2({
|
|
360
|
-
stream: false,
|
|
361
|
-
onLog: (level, data) => {
|
|
362
|
-
extra.sendNotification({ method: "notifications/message", params: { level, data } });
|
|
363
|
-
},
|
|
364
|
-
onProgress: ({ progress, total, message }) => {
|
|
365
|
-
if (!extra._meta?.progressToken) {
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
extra.sendNotification({
|
|
369
|
-
method: "notifications/progress",
|
|
370
|
-
params: {
|
|
371
|
-
progress,
|
|
372
|
-
total,
|
|
373
|
-
message,
|
|
374
|
-
progressToken: extra._meta.progressToken
|
|
375
|
-
}
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
});
|
|
379
|
-
return action.run(input, context.fork({ logger, extra })).then((result) => {
|
|
380
|
-
return toolResponse2(result);
|
|
381
|
-
}).catch((error) => {
|
|
382
|
-
if (error instanceof SilkweaveError2) {
|
|
383
|
-
return toolResponse2({ success: false, code: error.code, name: error.name, message: error.message }, true);
|
|
384
|
-
} else if (error instanceof Error) {
|
|
385
|
-
return toolResponse2({ success: false, name: error.name, message: error.message, stack: error.stack }, true);
|
|
386
|
-
} else {
|
|
387
|
-
return toolResponse2({ success: false, name: "Unknown Error", message: "An unknown error occurred", error }, true);
|
|
388
|
-
}
|
|
389
|
-
});
|
|
390
|
-
});
|
|
391
|
-
}
|
|
428
|
+
registerTools2(server, actions, context);
|
|
392
429
|
const transport = new StdioServerTransport();
|
|
393
430
|
await server.connect(transport);
|
|
394
431
|
},
|
|
@@ -400,10 +437,10 @@ var stdio = () => {
|
|
|
400
437
|
};
|
|
401
438
|
|
|
402
439
|
// src/util/sideload.ts
|
|
403
|
-
import { randomUUID as
|
|
440
|
+
import { randomUUID as randomUUID4 } from "crypto";
|
|
404
441
|
import { writeFile } from "fs/promises";
|
|
405
442
|
async function createSideloadResource(buffer, { name, contentType }) {
|
|
406
|
-
const id =
|
|
443
|
+
const id = randomUUID4();
|
|
407
444
|
const resource = { id, name, contentType, size: buffer.length };
|
|
408
445
|
await Promise.all([
|
|
409
446
|
writeFile(`resources/${id}`, buffer),
|
|
@@ -414,7 +451,11 @@ async function createSideloadResource(buffer, { name, contentType }) {
|
|
|
414
451
|
export {
|
|
415
452
|
cliProxy,
|
|
416
453
|
createSideloadResource,
|
|
454
|
+
errorToolResult,
|
|
455
|
+
handleToolError,
|
|
417
456
|
http,
|
|
457
|
+
jsonToolResult,
|
|
458
|
+
smartToolResult,
|
|
418
459
|
stdio
|
|
419
460
|
};
|
|
420
461
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -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\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 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 const keys = Object.keys(shape)\n for (const key of keys) {\n const [type, { defaultValue }] = unwrap(shape[key])\n const description = type.description\n if (type instanceof z.ZodBoolean) {\n command.option(`--${kebabCase(key)}`, description, defaultValue)\n command.option(`--no-${kebabCase(key)}`)\n } else if (type instanceof z.ZodNumber) {\n command.option(`--${kebabCase(key)} <number>`, description, defaultValue)\n } else if (type instanceof z.ZodString || type instanceof z.ZodEnum) {\n command.option(`--${kebabCase(key)} <string>`, description, defaultValue)\n } else if (type instanceof z.ZodObject || type instanceof z.ZodRecord || type instanceof z.ZodArray) {\n command.option(`--${kebabCase(key)} <json>`, description ?? '', JSON.parse, defaultValue)\n } else {\n throw new Error(`Invalid zod type: ${type.def.type}`)\n }\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 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, SilkweaveError, 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 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\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: {\n progress,\n total,\n message,\n progressToken: extra._meta.progressToken\n }\n })\n }\n })\n const currentAuth = authStorage.getStore()\n return action.run(input, context.fork({ logger, extra, ...(currentAuth ? { auth: currentAuth } : {}) })).then((result) => {\n return toolResponse(result)\n }).catch((error) => {\n if (error instanceof SilkweaveError) {\n return toolResponse({ success: false, code: error.code, name: error.name, message: error.message }, true)\n } else if (error instanceof Error) {\n return toolResponse({ success: false, name: error.name, message: error.message, stack: error.stack }, true)\n } else {\n return toolResponse({ success: false, name: 'Unknown Error', message: 'An unknown error occurred', error }, true)\n }\n })\n })\n }\n\n return server\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 let transport: StreamableHTTPServerTransport\n if (sessionId && transports[sessionId]) {\n transport = transports[sessionId]\n } else if (isInitializeRequest(req.body)) {\n const eventStore = new InMemoryEventStore()\n 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 await createServer().connect(transport)\n await transport.handleRequest(req, res, req.body)\n return\n } else {\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 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 { AdapterFactory, SilkweaveError, toolResponse } from '@silkweave/core'\nimport { createLogger } from '@silkweave/logger'\nimport { capitalCase, pascalCase } from 'change-case'\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 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: {\n progress,\n total,\n message,\n progressToken: extra._meta.progressToken\n }\n })\n }\n })\n return action.run(input, context.fork({ logger, extra })).then((result) => {\n return toolResponse(result)\n }).catch((error) => {\n if (error instanceof SilkweaveError) {\n return toolResponse({ success: false, code: error.code, name: error.name, message: error.message }, true)\n } else if (error instanceof Error) {\n return toolResponse({ success: false, name: error.name, message: error.message, stack: error.stack }, true)\n } else {\n return toolResponse({ success: false, name: 'Unknown Error', message: 'An unknown error occurred', error }, true)\n }\n })\n })\n }\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","SilkweaveError","toolResponse","createLogger","capitalCase","pascalCase","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'\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'\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
|
+
"version": "1.4.0",
|
|
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/
|
|
22
|
-
"@silkweave/
|
|
23
|
-
"@silkweave/logger": "1.
|
|
21
|
+
"@silkweave/auth": "1.4.0",
|
|
22
|
+
"@silkweave/core": "1.4.0",
|
|
23
|
+
"@silkweave/logger": "1.4.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@eslint/js": "^10.0.1",
|