mcpose 1.1.0 → 1.1.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.
- package/README.md +36 -7
- package/dist/backendClient.js +1 -1
- package/dist/core.d.ts +1 -2
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +133 -47
- package/dist/core.js.map +1 -1
- package/dist/testing.d.ts +3 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +9 -0
- package/dist/testing.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Composable middleware proxy for MCP servers.
|
|
4
4
|
|
|
5
|
+
## New in 1.1.1
|
|
6
|
+
|
|
7
|
+
- mirrors only upstream-advertised MCP capabilities
|
|
8
|
+
- forwards abort signals and progress updates through the proxy
|
|
9
|
+
- advertises and fans out list-changed notifications correctly
|
|
10
|
+
- closes active HTTP proxy sessions on shutdown
|
|
11
|
+
- ships a stronger `mcpose/testing` mock backend
|
|
12
|
+
|
|
13
|
+
---
|
|
5
14
|
---
|
|
6
15
|
|
|
7
16
|
## Background
|
|
@@ -12,7 +21,7 @@ mcpose was extracted from [`financial-elastic-mcp-server`](https://github.com/am
|
|
|
12
21
|
|
|
13
22
|
## Concept
|
|
14
23
|
|
|
15
|
-
mcpose is a **transparent proxy
|
|
24
|
+
mcpose is a **transparent proxy** between an LLM client and an upstream MCP server. It mirrors the upstream MCP surface and routes supported calls through middleware. The client sees a normal MCP server; the upstream sees a normal MCP client.
|
|
16
25
|
|
|
17
26
|
---
|
|
18
27
|
|
|
@@ -68,7 +77,7 @@ await startProxy(backend, {
|
|
|
68
77
|
└──────────────┘ └────────────────────────────────┘ └────────────────────┘
|
|
69
78
|
```
|
|
70
79
|
|
|
71
|
-
For each tool or resource, mcpose picks one of three routing paths:
|
|
80
|
+
For each supported tool or resource, mcpose picks one of three routing paths:
|
|
72
81
|
|
|
73
82
|
| Path | Option | Behavior |
|
|
74
83
|
|---|---|---|
|
|
@@ -76,7 +85,14 @@ For each tool or resource, mcpose picks one of three routing paths:
|
|
|
76
85
|
| **Pass-through** | `passThroughTools` / `passThroughResources` | Forwarded raw to upstream — all middleware skipped |
|
|
77
86
|
| **Middleware** | everything else | Routed through the full `toolMiddleware` / `resourceMiddleware` pipeline |
|
|
78
87
|
|
|
79
|
-
Prompts are
|
|
88
|
+
Prompts are forwarded as-is when the upstream supports prompts.
|
|
89
|
+
|
|
90
|
+
The proxy preserves core request semantics end to end:
|
|
91
|
+
|
|
92
|
+
- advertised capabilities are mirrored from the upstream server
|
|
93
|
+
- abort signals are forwarded to upstream tool, resource, and prompt calls
|
|
94
|
+
- upstream progress updates are relayed back to the downstream client
|
|
95
|
+
- list-changed notifications are advertised and fanned out when the upstream supports them
|
|
80
96
|
|
|
81
97
|
---
|
|
82
98
|
|
|
@@ -157,7 +173,7 @@ interface BackendConfig {
|
|
|
157
173
|
async function createBackendClient(config: BackendConfig): Promise<BackendClient>;
|
|
158
174
|
```
|
|
159
175
|
|
|
160
|
-
`BackendClient` is an alias for the SDK `Client`.
|
|
176
|
+
`BackendClient` is an alias for the SDK `Client`. It throws if neither `command` nor `url` is provided, or if the connection fails.
|
|
161
177
|
|
|
162
178
|
---
|
|
163
179
|
|
|
@@ -186,6 +202,8 @@ function createProxyServer(backend: BackendClient, options?: ProxyOptions): Serv
|
|
|
186
202
|
| `hiddenTools` | Tool names removed from `list_tools` **and** rejected at call time with `MethodNotFound`. |
|
|
187
203
|
| `hiddenResources` | Resource URIs removed from `list_resources` **and** rejected at call time with `InvalidRequest`. |
|
|
188
204
|
|
|
205
|
+
`createProxyServer` mirrors only the upstream capabilities exposed by `backend.getServerCapabilities()`. Unsupported prompt, resource, and tool endpoints are not advertised or registered.
|
|
206
|
+
|
|
189
207
|
`startProxy` connects the proxy to a `StdioServerTransport`. `createProxyServer` returns the configured `Server` without connecting — useful for testing request handlers without a live transport.
|
|
190
208
|
|
|
191
209
|
---
|
|
@@ -206,7 +224,7 @@ function startHttpProxy(
|
|
|
206
224
|
): Promise<http.Server>;
|
|
207
225
|
```
|
|
208
226
|
|
|
209
|
-
Starts the proxy over Streamable HTTP with stateful sessions. Each client connection is assigned an `mcp-session-id
|
|
227
|
+
Starts the proxy over Streamable HTTP with stateful sessions. Each client connection is assigned an `mcp-session-id`. Upstream list-change notifications (`tools/list_changed`, `resources/list_changed`, `prompts/list_changed`) are fanned out to all active sessions when the upstream advertises them.
|
|
210
228
|
|
|
211
229
|
```ts
|
|
212
230
|
import { createBackendClient, startHttpProxy } from 'mcpose';
|
|
@@ -216,13 +234,24 @@ const server = await startHttpProxy(backend, { toolMiddleware: [loggingMW] }, {
|
|
|
216
234
|
// HTTP server is now listening on port 8080 at /mcp
|
|
217
235
|
```
|
|
218
236
|
|
|
237
|
+
On shutdown, active proxy sessions are closed before the underlying `http.Server` finishes closing.
|
|
238
|
+
|
|
219
239
|
**Limitations:**
|
|
220
|
-
-
|
|
221
|
-
- Sessions are only cleaned up on `DELETE` or server close — there is no idle timeout.
|
|
240
|
+
- Sessions have no idle timeout.
|
|
222
241
|
- SSE reconnect replay is not supported (no `EventStore`).
|
|
223
242
|
|
|
224
243
|
---
|
|
225
244
|
|
|
245
|
+
### `mcpose/testing`
|
|
246
|
+
|
|
247
|
+
```ts
|
|
248
|
+
import { createMockBackendClient, runToolMiddleware } from 'mcpose/testing';
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
`createMockBackendClient()` returns an in-memory backend stub with capability lookup and notification hooks. It works with both `createProxyServer()` and `startHttpProxy()` tests.
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
226
255
|
## Recipe: PII redaction
|
|
227
256
|
|
|
228
257
|
The origin use case for mcpose: a financial-grade MCP server where every Elasticsearch tool response must be scrubbed of PII before it reaches the LLM or the audit log.
|
package/dist/backendClient.js
CHANGED
|
@@ -13,7 +13,7 @@ export async function createBackendClient(config) {
|
|
|
13
13
|
if (!config.command && !config.url) {
|
|
14
14
|
throw new Error('mcpose: either command or url must be provided in BackendConfig');
|
|
15
15
|
}
|
|
16
|
-
const client = new Client({ name: 'mcpose-backend', version: '1.
|
|
16
|
+
const client = new Client({ name: 'mcpose-backend', version: '1.1.1' }, { capabilities: {} });
|
|
17
17
|
const transport = config.url
|
|
18
18
|
? new StreamableHTTPClientTransport(new URL(config.url))
|
|
19
19
|
: new StdioClientTransport({
|
package/dist/core.d.ts
CHANGED
|
@@ -71,8 +71,7 @@ export declare function startProxy(backend: BackendClient, options?: ProxyOption
|
|
|
71
71
|
* all active sessions via their GET SSE stream.
|
|
72
72
|
*
|
|
73
73
|
* **Limitations:**
|
|
74
|
-
* -
|
|
75
|
-
* - Sessions never expire — only cleaned up on DELETE or server close.
|
|
74
|
+
* - Sessions never expire.
|
|
76
75
|
* - No `EventStore` → SSE reconnect replay unsupported.
|
|
77
76
|
*
|
|
78
77
|
* @returns Promise resolving to the listening `http.Server`.
|
package/dist/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,OAAO,EAYL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,OAAO,EAYL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAExB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC,eAAe,EACf,2BAA2B,CAC5B,CAAC;AAEF,qCAAqC;AACrC,MAAM,MAAM,kBAAkB,GAAG,UAAU,CACzC,mBAAmB,EACnB,kBAAkB,CACnB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,CAAC,EAAE,2BAA2B,GAC7B,CAAC,IAAI,cAAc,CAErB;AAED,yDAAyD;AACzD,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,4BAA4B;AAC5B,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,cAAc,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAE/C,4EAA4E;IAC5E,kBAAkB,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAEvD,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAEzC,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAE7C,gFAAgF;IAChF,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAEpC,wFAAwF;IACxF,eAAe,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACzC;AAqID;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,YAAiB,GACzB,MAAM,CA4ER;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,YAAiB,EAC1B,WAAW,GAAE,gBAAqB,GACjC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAyEtB"}
|
package/dist/core.js
CHANGED
|
@@ -13,6 +13,80 @@ import { pipe } from './middleware.js';
|
|
|
13
13
|
export function hasToolContent(r) {
|
|
14
14
|
return Array.isArray(r.content);
|
|
15
15
|
}
|
|
16
|
+
const listChangedBuses = new WeakMap();
|
|
17
|
+
function createProxyCapabilities(backend) {
|
|
18
|
+
const upstream = backend.getServerCapabilities();
|
|
19
|
+
return {
|
|
20
|
+
...(upstream?.tools
|
|
21
|
+
? { tools: upstream.tools.listChanged ? { listChanged: true } : {} }
|
|
22
|
+
: {}),
|
|
23
|
+
...(upstream?.resources
|
|
24
|
+
? { resources: upstream.resources.listChanged ? { listChanged: true } : {} }
|
|
25
|
+
: {}),
|
|
26
|
+
...(upstream?.prompts
|
|
27
|
+
? { prompts: upstream.prompts.listChanged ? { listChanged: true } : {} }
|
|
28
|
+
: {}),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function createRequestOptions(extra = {}) {
|
|
32
|
+
const progressToken = extra._meta?.progressToken;
|
|
33
|
+
const onprogress = progressToken && extra.sendNotification
|
|
34
|
+
? ({ progress, total, message, }) => {
|
|
35
|
+
void extra.sendNotification?.({
|
|
36
|
+
method: 'notifications/progress',
|
|
37
|
+
params: {
|
|
38
|
+
progressToken,
|
|
39
|
+
progress,
|
|
40
|
+
...(total === undefined ? {} : { total }),
|
|
41
|
+
...(message === undefined ? {} : { message }),
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
: undefined;
|
|
46
|
+
if (!extra.signal && !onprogress)
|
|
47
|
+
return undefined;
|
|
48
|
+
return {
|
|
49
|
+
...(extra.signal ? { signal: extra.signal } : {}),
|
|
50
|
+
...(onprogress ? { onprogress } : {}),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function registerListChangedForwarders(backend, server, capabilities) {
|
|
54
|
+
if (!capabilities.tools?.listChanged &&
|
|
55
|
+
!capabilities.resources?.listChanged &&
|
|
56
|
+
!capabilities.prompts?.listChanged) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
let bus = listChangedBuses.get(backend);
|
|
60
|
+
if (!bus) {
|
|
61
|
+
const servers = new Set();
|
|
62
|
+
const fanOut = async (notify) => {
|
|
63
|
+
await Promise.allSettled([...servers].map((proxyServer) => notify(proxyServer)));
|
|
64
|
+
};
|
|
65
|
+
if (capabilities.tools?.listChanged) {
|
|
66
|
+
backend.setNotificationHandler(ToolListChangedNotificationSchema, () => fanOut((proxyServer) => proxyServer.sendToolListChanged()));
|
|
67
|
+
}
|
|
68
|
+
if (capabilities.prompts?.listChanged) {
|
|
69
|
+
backend.setNotificationHandler(PromptListChangedNotificationSchema, () => fanOut((proxyServer) => proxyServer.sendPromptListChanged()));
|
|
70
|
+
}
|
|
71
|
+
if (capabilities.resources?.listChanged) {
|
|
72
|
+
backend.setNotificationHandler(ResourceListChangedNotificationSchema, () => fanOut((proxyServer) => proxyServer.sendResourceListChanged()));
|
|
73
|
+
}
|
|
74
|
+
bus = { servers };
|
|
75
|
+
listChangedBuses.set(backend, bus);
|
|
76
|
+
}
|
|
77
|
+
bus.servers.add(server);
|
|
78
|
+
const prevOnClose = server.onclose;
|
|
79
|
+
let active = true;
|
|
80
|
+
server.onclose = () => {
|
|
81
|
+
if (!active)
|
|
82
|
+
return;
|
|
83
|
+
active = false;
|
|
84
|
+
bus.servers.delete(server);
|
|
85
|
+
if (!bus.servers.size)
|
|
86
|
+
listChangedBuses.delete(backend);
|
|
87
|
+
prevOnClose?.();
|
|
88
|
+
};
|
|
89
|
+
}
|
|
16
90
|
/**
|
|
17
91
|
* Creates a proxy MCP server without connecting it to a transport.
|
|
18
92
|
*
|
|
@@ -27,50 +101,60 @@ export function hasToolContent(r) {
|
|
|
27
101
|
* @returns Configured {@link Server} ready to connect.
|
|
28
102
|
*/
|
|
29
103
|
export function createProxyServer(backend, options = {}) {
|
|
104
|
+
const capabilities = createProxyCapabilities(backend);
|
|
30
105
|
const toolPipeline = pipe(options.toolMiddleware ?? []);
|
|
31
106
|
const resourcePipeline = pipe(options.resourceMiddleware ?? []);
|
|
32
107
|
const hiddenToolSet = new Set(options.hiddenTools ?? []);
|
|
33
108
|
const passThroughToolSet = new Set(options.passThroughTools ?? []);
|
|
34
109
|
const hiddenResourceSet = new Set(options.hiddenResources ?? []);
|
|
35
110
|
const passThroughResourceSet = new Set(options.passThroughResources ?? []);
|
|
36
|
-
const server = new Server({ name: 'mcpose', version: '1.
|
|
111
|
+
const server = new Server({ name: 'mcpose', version: '1.1.1' }, { capabilities });
|
|
112
|
+
registerListChangedForwarders(backend, server, capabilities);
|
|
37
113
|
// ── Tool handlers ──────────────────────────────────────────────────────────
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
114
|
+
if (capabilities.tools) {
|
|
115
|
+
server.setRequestHandler(ListToolsRequestSchema, async (req, extra) => {
|
|
116
|
+
const result = await backend.listTools(req.params, createRequestOptions(extra));
|
|
117
|
+
if (!hiddenToolSet.size)
|
|
118
|
+
return result;
|
|
119
|
+
return { ...result, tools: result.tools.filter((t) => !hiddenToolSet.has(t.name)) };
|
|
120
|
+
});
|
|
121
|
+
server.setRequestHandler(CallToolRequestSchema, (req, extra) => {
|
|
122
|
+
const name = req.params.name;
|
|
123
|
+
const requestOptions = createRequestOptions(extra);
|
|
124
|
+
if (hiddenToolSet.has(name)) {
|
|
125
|
+
throw new McpError(ErrorCode.MethodNotFound, `Tool not found: ${name}`);
|
|
126
|
+
}
|
|
127
|
+
if (passThroughToolSet.has(name)) {
|
|
128
|
+
return backend.callTool(req.params, undefined, requestOptions);
|
|
129
|
+
}
|
|
130
|
+
return toolPipeline(req, (r) => backend.callTool(r.params, undefined, requestOptions));
|
|
131
|
+
});
|
|
132
|
+
}
|
|
54
133
|
// ── Resource handlers ──────────────────────────────────────────────────────
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
134
|
+
if (capabilities.resources) {
|
|
135
|
+
server.setRequestHandler(ListResourcesRequestSchema, async (req, extra) => {
|
|
136
|
+
const result = await backend.listResources(req.params, createRequestOptions(extra));
|
|
137
|
+
if (!hiddenResourceSet.size)
|
|
138
|
+
return result;
|
|
139
|
+
return { ...result, resources: result.resources.filter((r) => !hiddenResourceSet.has(r.uri)) };
|
|
140
|
+
});
|
|
141
|
+
server.setRequestHandler(ReadResourceRequestSchema, (req, extra) => {
|
|
142
|
+
const uri = req.params.uri;
|
|
143
|
+
const requestOptions = createRequestOptions(extra);
|
|
144
|
+
if (hiddenResourceSet.has(uri)) {
|
|
145
|
+
throw new McpError(ErrorCode.InvalidRequest, `Resource not found: ${uri}`);
|
|
146
|
+
}
|
|
147
|
+
if (passThroughResourceSet.has(uri)) {
|
|
148
|
+
return backend.readResource(req.params, requestOptions);
|
|
149
|
+
}
|
|
150
|
+
return resourcePipeline(req, (r) => backend.readResource(r.params, requestOptions));
|
|
151
|
+
});
|
|
152
|
+
}
|
|
71
153
|
// ── Prompt handlers (pass-through) ────────────────────────────────────────
|
|
72
|
-
|
|
73
|
-
|
|
154
|
+
if (capabilities.prompts) {
|
|
155
|
+
server.setRequestHandler(ListPromptsRequestSchema, (req, extra) => backend.listPrompts(req.params, createRequestOptions(extra)));
|
|
156
|
+
server.setRequestHandler(GetPromptRequestSchema, (req, extra) => backend.getPrompt(req.params, createRequestOptions(extra)));
|
|
157
|
+
}
|
|
74
158
|
return server;
|
|
75
159
|
}
|
|
76
160
|
/**
|
|
@@ -89,8 +173,7 @@ export async function startProxy(backend, options = {}) {
|
|
|
89
173
|
* all active sessions via their GET SSE stream.
|
|
90
174
|
*
|
|
91
175
|
* **Limitations:**
|
|
92
|
-
* -
|
|
93
|
-
* - Sessions never expire — only cleaned up on DELETE or server close.
|
|
176
|
+
* - Sessions never expire.
|
|
94
177
|
* - No `EventStore` → SSE reconnect replay unsupported.
|
|
95
178
|
*
|
|
96
179
|
* @returns Promise resolving to the listening `http.Server`.
|
|
@@ -101,16 +184,6 @@ export function startHttpProxy(backend, options = {}, httpOptions = {}) {
|
|
|
101
184
|
const host = httpOptions.host;
|
|
102
185
|
// session ID → { transport, proxyServer }
|
|
103
186
|
const sessions = new Map();
|
|
104
|
-
// Fan upstream notifications to all active sessions' SSE streams.
|
|
105
|
-
backend.setNotificationHandler(ToolListChangedNotificationSchema, async () => {
|
|
106
|
-
await Promise.all([...sessions.values()].map(({ proxyServer }) => proxyServer.sendToolListChanged()));
|
|
107
|
-
});
|
|
108
|
-
backend.setNotificationHandler(PromptListChangedNotificationSchema, async () => {
|
|
109
|
-
await Promise.all([...sessions.values()].map(({ proxyServer }) => proxyServer.sendPromptListChanged()));
|
|
110
|
-
});
|
|
111
|
-
backend.setNotificationHandler(ResourceListChangedNotificationSchema, async () => {
|
|
112
|
-
await Promise.all([...sessions.values()].map(({ proxyServer }) => proxyServer.sendResourceListChanged()));
|
|
113
|
-
});
|
|
114
187
|
const server = http.createServer((req, res) => {
|
|
115
188
|
const handle = async () => {
|
|
116
189
|
const url = new URL(req.url ?? '/', 'http://localhost');
|
|
@@ -147,6 +220,19 @@ export function startHttpProxy(backend, options = {}, httpOptions = {}) {
|
|
|
147
220
|
void err;
|
|
148
221
|
});
|
|
149
222
|
});
|
|
223
|
+
const rawClose = server.close.bind(server);
|
|
224
|
+
let shuttingDown = false;
|
|
225
|
+
server.close = ((callback) => {
|
|
226
|
+
if (shuttingDown)
|
|
227
|
+
return rawClose(callback);
|
|
228
|
+
shuttingDown = true;
|
|
229
|
+
const activeSessions = [...sessions.values()];
|
|
230
|
+
sessions.clear();
|
|
231
|
+
void Promise.allSettled(activeSessions.map(({ proxyServer }) => proxyServer.close())).finally(() => {
|
|
232
|
+
rawClose(callback);
|
|
233
|
+
});
|
|
234
|
+
return server;
|
|
235
|
+
});
|
|
150
236
|
return new Promise((resolve, reject) => {
|
|
151
237
|
server.once('error', reject);
|
|
152
238
|
server.listen(port, ...(host ? [host] : []), () => {
|
package/dist/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EACL,qBAAqB,EACrB,SAAS,EACT,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,EACtB,QAAQ,EACR,mCAAmC,EACnC,yBAAyB,EACzB,qCAAqC,EACrC,iCAAiC,
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|
package/dist/testing.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Test helpers for mcpose middleware. No test framework imports — works in any env.
|
|
3
3
|
* @module mcpose/testing
|
|
4
4
|
*/
|
|
5
|
-
import type { CallToolRequest, CallToolResult, ReadResourceResult, Tool, Resource, Prompt, CallToolRequestParams, GetPromptResult } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import type { CallToolRequest, CallToolResult, ReadResourceResult, Tool, Resource, Prompt, CallToolRequestParams, GetPromptResult, ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';
|
|
6
6
|
import type { ToolMiddleware } from './core.js';
|
|
7
7
|
import type { BackendClient } from './backendClient.js';
|
|
8
8
|
/**
|
|
@@ -16,6 +16,8 @@ import type { BackendClient } from './backendClient.js';
|
|
|
16
16
|
export declare function runToolMiddleware(mw: ToolMiddleware, req: CallToolRequest, next: (req: CallToolRequest) => Promise<CallToolResult>): Promise<CallToolResult>;
|
|
17
17
|
/** Config for mock backend client. */
|
|
18
18
|
export interface MockBackendClientOptions {
|
|
19
|
+
/** Default: tools/resources/prompts enabled */
|
|
20
|
+
capabilities?: ServerCapabilities;
|
|
19
21
|
/** Default: `[]` */
|
|
20
22
|
tools?: Tool[];
|
|
21
23
|
/**
|
package/dist/testing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAId,kBAAkB,EAClB,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,qBAAqB,EAGrB,eAAe,
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAId,kBAAkB,EAClB,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,qBAAqB,EAGrB,eAAe,EACf,kBAAkB,EACnB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,cAAc,CAAC,GACtD,OAAO,CAAC,cAAc,CAAC,CAQzB;AAED,sCAAsC;AACtC,MAAM,WAAW,wBAAwB;IACvC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,oBAAoB;IACpB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf;;;OAGG;IACH,gBAAgB,CAAC,EACb,cAAc,GACd,CAAC,CAAC,MAAM,EAAE,qBAAqB,KAAK,cAAc,CAAC,CAAC;IACxD,oBAAoB;IACpB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,oEAAoE;IACpE,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;IAC1C,oBAAoB;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,iBAAiB,CAAC,EAAE,eAAe,CAAC;CACrC;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,wBAA6B,GACrC,aAAa,CA8Cf"}
|
package/dist/testing.js
CHANGED
|
@@ -25,7 +25,13 @@ export async function runToolMiddleware(mw, req, next) {
|
|
|
25
25
|
* const result = await pipeline(req, (r) => backend.callTool(r.params, undefined));
|
|
26
26
|
*/
|
|
27
27
|
export function createMockBackendClient(options = {}) {
|
|
28
|
+
const capabilities = options.capabilities ?? {
|
|
29
|
+
tools: {},
|
|
30
|
+
resources: {},
|
|
31
|
+
prompts: {},
|
|
32
|
+
};
|
|
28
33
|
return {
|
|
34
|
+
getServerCapabilities: () => capabilities,
|
|
29
35
|
listTools: async () => ({
|
|
30
36
|
tools: options.tools ?? [],
|
|
31
37
|
}),
|
|
@@ -45,6 +51,9 @@ export function createMockBackendClient(options = {}) {
|
|
|
45
51
|
prompts: options.prompts ?? [],
|
|
46
52
|
}),
|
|
47
53
|
getPrompt: async (_params) => options.getPromptResponse ?? { messages: [] },
|
|
54
|
+
setNotificationHandler: () => undefined,
|
|
55
|
+
removeNotificationHandler: () => undefined,
|
|
56
|
+
close: async () => undefined,
|
|
48
57
|
};
|
|
49
58
|
}
|
|
50
59
|
//# sourceMappingURL=testing.js.map
|
package/dist/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAI3C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAkB,EAClB,GAAoB,EACpB,IAAuD;IAEvD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,8FAA8F,CAC/F,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAyBD;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CACrC,UAAoC,EAAE;IAEtC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI;QAC3C,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;KACZ,CAAC;IAEF,OAAO;QACL,qBAAqB,EAAE,GAAuB,EAAE,CAAC,YAAY;QAE7D,SAAS,EAAE,KAAK,IAA8B,EAAE,CAAC,CAAC;YAChD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;SAC3B,CAAC;QAEF,QAAQ,EAAE,KAAK,EACb,MAA6B,EACJ,EAAE;YAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;YACtC,IAAI,OAAO,IAAI,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;QACxE,CAAC;QAED,aAAa,EAAE,KAAK,IAAkC,EAAE,CAAC,CAAC;YACxD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;SACnC,CAAC;QAEF,YAAY,EAAE,KAAK,EACjB,OAAkC,EACL,EAAE,CAC/B,OAAO,CAAC,oBAAoB,IAAI;YAC9B,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;SAC/C;QAEH,WAAW,EAAE,KAAK,IAAgC,EAAE,CAAC,CAAC;YACpD,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;SAC/B,CAAC;QAEF,SAAS,EAAE,KAAK,EACd,OAA+B,EACL,EAAE,CAC5B,OAAO,CAAC,iBAAiB,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAE/C,sBAAsB,EAAE,GAAG,EAAE,CAAC,SAAS;QACvC,yBAAyB,EAAE,GAAG,EAAE,CAAC,SAAS;QAC1C,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;KACD,CAAC;AAChC,CAAC"}
|