mcpose 2.0.2 → 3.0.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/LICENSE +21 -0
- package/README.md +494 -37
- package/dist/backendClient.d.ts +5 -0
- package/dist/backendClient.d.ts.map +1 -1
- package/dist/backendClient.js +17 -9
- package/dist/backendClient.js.map +1 -1
- package/dist/core.d.ts +293 -28
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +969 -175
- package/dist/core.js.map +1 -1
- package/dist/delegation.d.ts +89 -0
- package/dist/delegation.d.ts.map +1 -0
- package/dist/delegation.js +175 -0
- package/dist/delegation.js.map +1 -0
- package/dist/eventStore.d.ts +12 -0
- package/dist/eventStore.d.ts.map +1 -1
- package/dist/eventStore.js +43 -5
- package/dist/eventStore.js.map +1 -1
- package/dist/hiddenTools.d.ts +42 -0
- package/dist/hiddenTools.d.ts.map +1 -0
- package/dist/hiddenTools.js +53 -0
- package/dist/hiddenTools.js.map +1 -0
- package/dist/index.d.ts +15 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/mesh.d.ts +82 -0
- package/dist/mesh.d.ts.map +1 -0
- package/dist/mesh.js +141 -0
- package/dist/mesh.js.map +1 -0
- package/dist/middleware.d.ts +13 -0
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +27 -3
- package/dist/middleware.js.map +1 -1
- package/dist/proxyContext.d.ts +65 -5
- package/dist/proxyContext.d.ts.map +1 -1
- package/dist/proxyContext.js +39 -4
- package/dist/proxyContext.js.map +1 -1
- package/dist/rejection.d.ts +1 -1
- package/dist/rejection.d.ts.map +1 -1
- package/dist/rejection.js +1 -1
- package/dist/rejection.js.map +1 -1
- package/dist/sanitizeCatalog.d.ts +37 -0
- package/dist/sanitizeCatalog.d.ts.map +1 -0
- package/dist/sanitizeCatalog.js +86 -0
- package/dist/sanitizeCatalog.js.map +1 -0
- package/dist/sessionRegistry.d.ts +79 -0
- package/dist/sessionRegistry.d.ts.map +1 -0
- package/dist/sessionRegistry.js +83 -0
- package/dist/sessionRegistry.js.map +1 -0
- package/dist/telemetry.d.ts +29 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/testing.d.ts +18 -2
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +30 -8
- package/dist/testing.js.map +1 -1
- package/dist/version.d.ts +7 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +1 -0
- package/package.json +30 -14
- package/src/__tests__/_helpers.ts +64 -0
- package/src/__tests__/backendClient.test.ts +198 -0
- package/src/__tests__/core.delegation.test.ts +964 -0
- package/src/__tests__/core.edge.test.ts +314 -0
- package/src/__tests__/core.hiddenTools.predicate.test.ts +236 -0
- package/src/__tests__/core.localTools.test.ts +314 -0
- package/src/__tests__/core.mesh.test.ts +1182 -0
- package/src/__tests__/core.stripRequestMeta.test.ts +226 -0
- package/src/__tests__/core.stripResultMeta.test.ts +217 -0
- package/src/__tests__/core.test.ts +1019 -0
- package/src/__tests__/eventStore.test.ts +141 -0
- package/src/__tests__/mapToolResult.test.ts +101 -0
- package/src/__tests__/middleware.edge.test.ts +126 -0
- package/src/__tests__/middleware.test.ts +233 -0
- package/src/__tests__/proxyContext.test.ts +140 -0
- package/src/__tests__/sanitizeCatalog.test.ts +359 -0
- package/src/__tests__/startHttpProxy.lifecycle.test.ts +638 -0
- package/src/__tests__/startHttpProxy.registry.test.ts +409 -0
- package/src/__tests__/startHttpProxy.replay.test.ts +116 -0
- package/src/__tests__/startHttpProxy.security.test.ts +288 -0
- package/src/__tests__/startHttpProxy.test.ts +985 -0
- package/src/__tests__/testing.test.ts +250 -0
- package/src/__tests__/version.test.ts +12 -0
- package/src/backendClient.ts +83 -0
- package/src/core.ts +2042 -0
- package/src/delegation.ts +224 -0
- package/src/eventStore.ts +106 -0
- package/src/hiddenTools.ts +84 -0
- package/src/identity.ts +15 -0
- package/src/index.ts +63 -0
- package/src/mesh.ts +204 -0
- package/src/middleware.ts +101 -0
- package/src/proxyContext.ts +108 -0
- package/src/rejection.ts +37 -0
- package/src/sanitizeCatalog.ts +120 -0
- package/src/sessionRegistry.ts +142 -0
- package/src/telemetry.ts +46 -0
- package/src/testing.ts +174 -0
- package/src/version.ts +6 -0
package/dist/backendClient.d.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Backend MCP client factory.
|
|
3
3
|
* Modes: stdio (spawns child process) or HTTP/SSE (connects to running server).
|
|
4
4
|
*/
|
|
5
|
+
import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
5
6
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
6
7
|
/** Backend connection config. */
|
|
7
8
|
export interface BackendConfig {
|
|
@@ -11,6 +12,10 @@ export interface BackendConfig {
|
|
|
11
12
|
args?: string[];
|
|
12
13
|
/** HTTP/SSE URL of running backend. Takes precedence over stdio. */
|
|
13
14
|
url?: string;
|
|
15
|
+
/** Custom HTTP headers sent on every request to the backend (HTTP/SSE only). */
|
|
16
|
+
headers?: Record<string, string>;
|
|
17
|
+
/** OAuth provdider for interactive/browser auth + transparent token refresh (HHT/SSE only). */
|
|
18
|
+
authProvider?: OAuthClientProvider;
|
|
14
19
|
}
|
|
15
20
|
export type BackendClient = Client;
|
|
16
21
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backendClient.d.ts","sourceRoot":"","sources":["../src/backendClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"backendClient.d.ts","sourceRoot":"","sources":["../src/backendClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AASnE,iCAAiC;AACjC,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,+FAA+F;IAC/F,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC;AAEnC;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,CAAC,CAyBxB"}
|
package/dist/backendClient.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Backend MCP client factory.
|
|
3
|
-
* Modes: stdio (spawns child process) or HTTP/SSE (connects to running server).
|
|
4
|
-
*/
|
|
5
1
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
6
2
|
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
7
|
-
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
3
|
+
import { StreamableHTTPClientTransport, } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
4
|
+
import { VERSION } from './version.js';
|
|
8
5
|
/**
|
|
9
6
|
* Creates and connects an MCP client to the backend.
|
|
10
7
|
* @throws If neither `command` nor `url` provided, or connection fails.
|
|
@@ -13,21 +10,32 @@ export async function createBackendClient(config) {
|
|
|
13
10
|
if (!config.command && !config.url) {
|
|
14
11
|
throw new Error('mcpose: either command or url must be provided in BackendConfig');
|
|
15
12
|
}
|
|
16
|
-
const client = new Client({ name: 'mcpose-backend', version:
|
|
13
|
+
const client = new Client({ name: 'mcpose-backend', version: VERSION }, { capabilities: {} });
|
|
17
14
|
const transport = config.url
|
|
18
|
-
? getHttpTransport(config.url)
|
|
15
|
+
? getHttpTransport(config.url, config.headers, config.authProvider)
|
|
19
16
|
: new StdioClientTransport({
|
|
20
17
|
command: config.command,
|
|
21
18
|
args: config.args ?? [],
|
|
22
19
|
});
|
|
20
|
+
// The SDK's own transports are not assignable to its own `Transport`
|
|
21
|
+
// interface under `exactOptionalPropertyTypes` (the interface declares
|
|
22
|
+
// `sessionId?: string`, the implementations `sessionId: string | undefined`).
|
|
23
|
+
// Purely a declaration mismatch upstream — the value is a real Transport.
|
|
23
24
|
await client.connect(transport);
|
|
24
25
|
return client;
|
|
25
26
|
}
|
|
26
|
-
const getHttpTransport = (urlString) => {
|
|
27
|
+
const getHttpTransport = (urlString, headers, authProvider) => {
|
|
27
28
|
const url = new URL(urlString);
|
|
28
29
|
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
29
30
|
throw new Error(`mcpose: unsupported URL protocol "${url.protocol}" — only http: and https: are allowed`);
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
+
const opts = {};
|
|
33
|
+
if (headers) {
|
|
34
|
+
opts.requestInit = { headers };
|
|
35
|
+
}
|
|
36
|
+
if (authProvider) {
|
|
37
|
+
opts.authProvider = authProvider;
|
|
38
|
+
}
|
|
39
|
+
return new StreamableHTTPClientTransport(url, opts);
|
|
32
40
|
};
|
|
33
41
|
//# sourceMappingURL=backendClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backendClient.js","sourceRoot":"","sources":["../src/backendClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backendClient.js","sourceRoot":"","sources":["../src/backendClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,6BAA6B,GAE9B,MAAM,oDAAoD,CAAC;AAE5D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAkBvC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAqB;IAErB,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC5C,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG;QAC1B,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC;QACnE,CAAC,CAAC,IAAI,oBAAoB,CAAC;YACvB,OAAO,EAAE,MAAM,CAAC,OAAQ;YACxB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;SACxB,CAAC,CAAC;IAEP,qEAAqE;IACrE,uEAAuE;IACvE,8EAA8E;IAC9E,0EAA0E;IAC1E,MAAM,MAAM,CAAC,OAAO,CAAC,SAAsB,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,gBAAgB,GAAG,CACvB,SAAiB,EACjB,OAAgC,EAChC,YAAkC,EAClC,EAAE;IACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CACb,qCAAqC,GAAG,CAAC,QAAQ,uCAAuC,CACzF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAkD,EAAE,CAAC;IAC/D,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC,WAAW,GAAG,EAAE,OAAO,EAAE,CAAC;IACjC,CAAC;IACD,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,6BAA6B,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACtD,CAAC,CAAC"}
|
package/dist/core.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import * as http from 'node:http';
|
|
2
2
|
import * as https from 'node:https';
|
|
3
3
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
4
|
-
import { type ListToolsRequest, type ListToolsResult, type CallToolRequest, type CallToolResult, type CompatibilityCallToolResult, type ReadResourceRequest, type ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { type ListToolsRequest, type ListToolsResult, type CallToolRequest, type CallToolRequestParams, type CallToolResult, type CompatibilityCallToolResult, type ContentBlock, type GetPromptRequest, type GetPromptResult, type TextContent, type ReadResourceRequest, type ReadResourceResult, type Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
5
5
|
import { type Middleware } from './middleware.js';
|
|
6
|
-
import type {
|
|
6
|
+
import type { HiddenToolPredicate } from './hiddenTools.js';
|
|
7
|
+
import { type ProxyContext } from './proxyContext.js';
|
|
7
8
|
import type { Identity } from './identity.js';
|
|
8
9
|
import type { TelemetryEvent } from './telemetry.js';
|
|
10
|
+
import { type Backends } from './mesh.js';
|
|
11
|
+
import { type SessionRegistry } from './sessionRegistry.js';
|
|
9
12
|
import type { EventStore } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
10
|
-
export type { ProxyContext } from './proxyContext.js';
|
|
11
13
|
/**
|
|
12
14
|
* Middleware for tool calls.
|
|
13
15
|
* Uses `CompatibilityCallToolResult` to cover legacy `{ toolResult }` shape
|
|
@@ -16,30 +18,103 @@ export type { ProxyContext } from './proxyContext.js';
|
|
|
16
18
|
export type ToolMiddleware = Middleware<CallToolRequest, CompatibilityCallToolResult>;
|
|
17
19
|
/** Middleware for resource reads. */
|
|
18
20
|
export type ResourceMiddleware = Middleware<ReadResourceRequest, ReadResourceResult>;
|
|
21
|
+
/** Middleware for prompt fetches (`prompts/get`). */
|
|
22
|
+
export type PromptMiddleware = Middleware<GetPromptRequest, GetPromptResult>;
|
|
19
23
|
/** Middleware for tool-list responses. */
|
|
20
24
|
export type ListToolsMiddleware = Middleware<ListToolsRequest, ListToolsResult>;
|
|
21
25
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
26
|
+
* The result channels of a `CallToolResult` — everything a redaction or
|
|
27
|
+
* transform middleware must account for:
|
|
28
|
+
*
|
|
29
|
+
* 1. `content` blocks (text, image, audio, resource link, embedded
|
|
30
|
+
* resource), each carrying its own block-level `_meta`,
|
|
31
|
+
* 2. `structuredContent`, the machine-readable mirror of the content,
|
|
32
|
+
* 3. result-level `_meta`,
|
|
33
|
+
* 4. `isError`,
|
|
34
|
+
* 5. unknown extra keys via the index signature.
|
|
35
|
+
*
|
|
36
|
+
* Redaction that maps only `.content` misses 2, 3, and the non-text
|
|
37
|
+
* members of 1. Use {@link mapToolResult} to cover every payload channel
|
|
38
|
+
* by construction; channel 3 is stripped at the proxy boundary by default
|
|
39
|
+
* via `ProxyOptions.stripResultMeta` (ADR-0009).
|
|
40
|
+
*
|
|
41
|
+
* This guard narrows `CompatibilityCallToolResult` to `CallToolResult`
|
|
42
|
+
* (has `.content` array). Both union members carry `[x: string]: unknown`,
|
|
43
|
+
* so this avoids unsafe casts.
|
|
24
44
|
*/
|
|
25
45
|
export declare function hasToolContent(r: CompatibilityCallToolResult): r is CallToolResult;
|
|
46
|
+
/**
|
|
47
|
+
* Handlers for {@link mapToolResult}, one per payload channel. All three
|
|
48
|
+
* are required, so forgetting a channel is a compile error rather than a
|
|
49
|
+
* silent leak.
|
|
50
|
+
*/
|
|
51
|
+
export interface ToolResultHandlers {
|
|
52
|
+
/** Maps a text content block. Return `null` to drop the block. */
|
|
53
|
+
onText: (block: TextContent) => ContentBlock | null;
|
|
54
|
+
/**
|
|
55
|
+
* Maps a non-text content block (image, audio, resource link, embedded
|
|
56
|
+
* resource). Return `null` to drop the block.
|
|
57
|
+
*/
|
|
58
|
+
onOther: (block: Exclude<ContentBlock, TextContent>) => ContentBlock | null;
|
|
59
|
+
/**
|
|
60
|
+
* Maps `structuredContent`. Called only when the field is present.
|
|
61
|
+
* Return `undefined` to remove the field entirely.
|
|
62
|
+
*/
|
|
63
|
+
onStructured: (structured: Record<string, unknown>) => Record<string, unknown> | undefined;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Maps every payload channel of a tool result through the given handlers.
|
|
67
|
+
*
|
|
68
|
+
* The legacy `{ toolResult }` shape (protocol 2024-10-07) is returned
|
|
69
|
+
* untouched. `isError`, result-level `_meta`, and unknown extra keys are
|
|
70
|
+
* preserved by spread — result-level `_meta` needs no handler because the
|
|
71
|
+
* proxy strips it by default (`stripResultMeta`, ADR-0009); with
|
|
72
|
+
* `stripResultMeta: false` forwarding it is the consumer's explicit choice.
|
|
73
|
+
*/
|
|
74
|
+
export declare function mapToolResult(result: CompatibilityCallToolResult, handlers: ToolResultHandlers): CompatibilityCallToolResult;
|
|
26
75
|
/** HTTP transport options for {@link startHttpProxy}. */
|
|
27
76
|
export interface HttpProxyOptions {
|
|
28
77
|
/** Default: 3000 */
|
|
29
78
|
port?: number;
|
|
30
|
-
/**
|
|
79
|
+
/**
|
|
80
|
+
* Bind address. Default: `'127.0.0.1'` (loopback).
|
|
81
|
+
*
|
|
82
|
+
* Binding a non-loopback address (e.g. `'0.0.0.0'`) exposes an
|
|
83
|
+
* unauthenticated MCP proxy holding an authenticated upstream session to
|
|
84
|
+
* the network, so it is a deliberate opt-in; doing so without
|
|
85
|
+
* {@link resolveIdentity} reports a startup warning through {@link onError}.
|
|
86
|
+
*/
|
|
31
87
|
host?: string;
|
|
32
88
|
/** Default: '/mcp' */
|
|
33
89
|
path?: string;
|
|
34
|
-
/**
|
|
90
|
+
/**
|
|
91
|
+
* Called for every incoming request before MCP handling. Return false to
|
|
92
|
+
* block (caller writes its own response). Throw to get a 401, with the error
|
|
93
|
+
* reported through {@link onError}.
|
|
94
|
+
*/
|
|
35
95
|
onRequest?: (req: http.IncomingMessage, res: http.ServerResponse) => boolean | Promise<boolean>;
|
|
36
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* Called on unhandled errors instead of console.error, and on every auth
|
|
98
|
+
* hook that throws: the request still fails closed, and the operator still
|
|
99
|
+
* sees why.
|
|
100
|
+
*/
|
|
37
101
|
onError?: (err: unknown) => void;
|
|
38
102
|
/** Maximum request body size in bytes. Default: 4 MB. */
|
|
39
103
|
maxBodyBytes?: number;
|
|
40
|
-
/**
|
|
104
|
+
/**
|
|
105
|
+
* Maximum number of concurrent MCP sessions. Excess requests return 503.
|
|
106
|
+
* Default: 1000. Set to `Infinity` to opt out of the cap.
|
|
107
|
+
*
|
|
108
|
+
* `0` is a valid value and means "reject every session", so it is not the
|
|
109
|
+
* opt-out.
|
|
110
|
+
*/
|
|
41
111
|
maxSessions?: number;
|
|
42
|
-
/**
|
|
112
|
+
/**
|
|
113
|
+
* Session TTL in milliseconds. Sessions are closed after this duration,
|
|
114
|
+
* which fires {@link onSessionClosed}. Default: 30 minutes. Finite values
|
|
115
|
+
* must not exceed Node's maximum timer delay of 2,147,483,647 ms. Set to
|
|
116
|
+
* `Infinity` to opt out of the TTL.
|
|
117
|
+
*/
|
|
43
118
|
sessionTtlMs?: number;
|
|
44
119
|
/**
|
|
45
120
|
* Resolves caller identity from the initial session request.
|
|
@@ -48,7 +123,7 @@ export interface HttpProxyOptions {
|
|
|
48
123
|
*
|
|
49
124
|
* Supply a JWT extractor, mTLS cert reader, API-key lookup, or any async
|
|
50
125
|
* function returning an {@link Identity}. Errors thrown here abort the
|
|
51
|
-
* session with a 401.
|
|
126
|
+
* session with a 401 and are reported through {@link onError}.
|
|
52
127
|
*
|
|
53
128
|
* @example
|
|
54
129
|
* resolveIdentity: extractJwtIdentity({ jwksUri: '...' })
|
|
@@ -73,21 +148,118 @@ export interface HttpProxyOptions {
|
|
|
73
148
|
* (suitable for single-instance deployments). For multi-instance / HA
|
|
74
149
|
* deployments, supply a Redis or Postgres-backed implementation.
|
|
75
150
|
*
|
|
151
|
+
* Stream ids reach the store namespaced as `<sessionId>:<streamId>`, so
|
|
152
|
+
* one store serves every session without their replay histories mixing.
|
|
153
|
+
*
|
|
76
154
|
* Set to `null` to disable reconnect replay entirely.
|
|
77
155
|
*/
|
|
78
156
|
eventStore?: EventStore | null;
|
|
79
157
|
/**
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
158
|
+
* Shared record of live sessions, so a client can resume after a proxy
|
|
159
|
+
* restart or on another instance behind a load balancer. Without one,
|
|
160
|
+
* sessions live only in this process and a resume against a fresh process
|
|
161
|
+
* is a 404.
|
|
162
|
+
*
|
|
163
|
+
* A record is written before the initialize response goes out and read
|
|
164
|
+
* only for an `mcp-session-id` this instance does not hold; the resumed
|
|
165
|
+
* session negotiates what the original did, keeps its identity, and dies
|
|
166
|
+
* at the original deadline. Client DELETE and TTL expiry delete the
|
|
167
|
+
* record, server shutdown keeps it. Pair it with the matching
|
|
168
|
+
* {@link eventStore} adapter, or a resumed session has no replay history.
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* sessionRegistry: createRedisSessionRegistry(redis),
|
|
172
|
+
* eventStore: createRedisEventStore(redis),
|
|
173
|
+
*/
|
|
174
|
+
sessionRegistry?: SessionRegistry;
|
|
175
|
+
/**
|
|
176
|
+
* Called when a session is closed (client DELETE, TTL expiry, or server
|
|
177
|
+
* shutdown). Wire {@link AuditMiddlewareHandle.closeSession} here to flush
|
|
178
|
+
* the ReplayManifest for the session.
|
|
179
|
+
*
|
|
180
|
+
* A returned promise is awaited: `server.close()` does not complete until
|
|
181
|
+
* every session's hook has settled, so a host that exits in the close
|
|
182
|
+
* callback never loses a final manifest. A throw or a rejection is routed
|
|
183
|
+
* to {@link onError} and never breaks teardown.
|
|
83
184
|
*
|
|
84
185
|
* @example
|
|
85
186
|
* onSessionClosed: (sessionId) => auditHandle.closeSession(sessionId)
|
|
86
187
|
*/
|
|
87
|
-
onSessionClosed?: (sessionId: string) =>
|
|
188
|
+
onSessionClosed?: (sessionId: string) => unknown;
|
|
189
|
+
/**
|
|
190
|
+
* Re-validates an existing session on every routed request. Return `false`
|
|
191
|
+
* (or throw, which is reported through {@link onError}) to reject with 401.
|
|
192
|
+
* Use to bind sessions to their original credential — e.g. re-check the
|
|
193
|
+
* bearer token — so a leaked `mcp-session-id` alone cannot take over a
|
|
194
|
+
* session.
|
|
195
|
+
*/
|
|
196
|
+
validateSession?: (req: http.IncomingMessage, session: {
|
|
197
|
+
sessionId: string;
|
|
198
|
+
identity?: Identity;
|
|
199
|
+
}) => boolean | Promise<boolean>;
|
|
200
|
+
/**
|
|
201
|
+
* Hosts allowed in the `Host` header when
|
|
202
|
+
* {@link enableDnsRebindingProtection} is on. Forwarded to the SDK
|
|
203
|
+
* transport, which only validates against a non-empty list.
|
|
204
|
+
*
|
|
205
|
+
* Default: for a loopback bind, derived from the effective bind address
|
|
206
|
+
* and the real listening port (`127.0.0.1:<port>`, `localhost:<port>`,
|
|
207
|
+
* `[::1]:<port>`). An explicit value is used verbatim, never merged with
|
|
208
|
+
* the derived list. No list is derived for a non-loopback bind.
|
|
209
|
+
*/
|
|
210
|
+
allowedHosts?: string[];
|
|
211
|
+
/**
|
|
212
|
+
* Origins allowed in the `Origin` header. Forwarded to the SDK transport,
|
|
213
|
+
* which only validates against a non-empty list.
|
|
214
|
+
*
|
|
215
|
+
* Default: for a loopback bind, the derived {@link allowedHosts} entries
|
|
216
|
+
* as origins (`http://` or `https://` matching {@link tlsOptions}). An
|
|
217
|
+
* explicit value is used verbatim, never merged.
|
|
218
|
+
*/
|
|
219
|
+
allowedOrigins?: string[];
|
|
220
|
+
/**
|
|
221
|
+
* Enables the SDK transport's DNS-rebinding protection (Host/Origin
|
|
222
|
+
* checks). Default: `true` when the effective bind address is loopback,
|
|
223
|
+
* `false` otherwise (a non-loopback bind usually sits behind a gateway
|
|
224
|
+
* that rewrites `Host`).
|
|
225
|
+
*
|
|
226
|
+
* Enabling this on a non-loopback bind without explicit
|
|
227
|
+
* {@link allowedHosts} / {@link allowedOrigins} validates nothing and
|
|
228
|
+
* reports a startup warning through {@link onError}.
|
|
229
|
+
*/
|
|
230
|
+
enableDnsRebindingProtection?: boolean;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* A tool the proxy implements itself, instead of forwarding to the
|
|
234
|
+
* upstream. See ADR-0007.
|
|
235
|
+
*/
|
|
236
|
+
export interface LocalTool {
|
|
237
|
+
/** The tool definition advertised in `tools/list`. */
|
|
238
|
+
tool: Tool;
|
|
239
|
+
/**
|
|
240
|
+
* Runs instead of the upstream call, from inside the innermost `next`,
|
|
241
|
+
* so the whole `toolMiddleware` pipeline (audit, redaction) still
|
|
242
|
+
* applies.
|
|
243
|
+
*/
|
|
244
|
+
handler: (params: CallToolRequestParams, context: ProxyContext) => Promise<CallToolResult>;
|
|
88
245
|
}
|
|
89
246
|
/** Proxy server options. */
|
|
90
247
|
export interface ProxyOptions {
|
|
248
|
+
/**
|
|
249
|
+
* Human-readable name for this proxy instance. Required, and rejected at
|
|
250
|
+
* construction when empty or whitespace-only.
|
|
251
|
+
*
|
|
252
|
+
* It is stamped onto every `ProxyContext`, every audit event, and the
|
|
253
|
+
* `ReplayManifest` as provenance (ADR-0012), so a default would record a
|
|
254
|
+
* whole fleet under one name: attribution in appearance only (#122).
|
|
255
|
+
*/
|
|
256
|
+
name: string;
|
|
257
|
+
/**
|
|
258
|
+
* Version of this proxy server (yours, not the mcpose library). MCP clients see
|
|
259
|
+
* it in the `initialize` response. Defaults to the mcpose library version when
|
|
260
|
+
* omitted; set it to your own release version when you ship your proxy.
|
|
261
|
+
*/
|
|
262
|
+
version?: string;
|
|
91
263
|
/**
|
|
92
264
|
* Tool middleware in response-processing order (first = innermost).
|
|
93
265
|
* @example [piiMW, auditMW] // pii redacts first, audit logs clean data
|
|
@@ -95,20 +267,110 @@ export interface ProxyOptions {
|
|
|
95
267
|
toolMiddleware?: ReadonlyArray<ToolMiddleware>;
|
|
96
268
|
/** Resource middleware in response-processing order (first = innermost). */
|
|
97
269
|
resourceMiddleware?: ReadonlyArray<ResourceMiddleware>;
|
|
270
|
+
/**
|
|
271
|
+
* Prompt middleware in response-processing order (first = innermost),
|
|
272
|
+
* per ADR-0002. Runs around every `prompts/get`, in both 1:1 and mesh
|
|
273
|
+
* mode.
|
|
274
|
+
*
|
|
275
|
+
* Mesh routing and the `BACKEND_UNROUTABLE` rejection for an unroutable
|
|
276
|
+
* prompt name happen inside the innermost `next` (the ADR-0007 pattern),
|
|
277
|
+
* so an observing middleware such as audit records every prompt call
|
|
278
|
+
* including the rejected ones.
|
|
279
|
+
*
|
|
280
|
+
* `prompts/list` has no pipeline yet; hiding and pass-through for prompts
|
|
281
|
+
* are deferred with it (ADR-0014).
|
|
282
|
+
*/
|
|
283
|
+
promptMiddleware?: ReadonlyArray<PromptMiddleware>;
|
|
98
284
|
/** Tool-list middleware in response-processing order (first = innermost). */
|
|
99
285
|
listToolsMiddleware?: ReadonlyArray<ListToolsMiddleware>;
|
|
100
|
-
/**
|
|
286
|
+
/**
|
|
287
|
+
* Tools that skip transforming middleware — upstream response forwarded
|
|
288
|
+
* as-is. Middleware wrapped in `markPassThroughObserver()` (e.g. audit)
|
|
289
|
+
* still runs for these tools.
|
|
290
|
+
*/
|
|
101
291
|
passThroughTools?: ReadonlyArray<string>;
|
|
102
|
-
/**
|
|
292
|
+
/**
|
|
293
|
+
* Resources that skip middleware — upstream response forwarded as-is.
|
|
294
|
+
* Matched against the URI the client sees, which in mesh mode is
|
|
295
|
+
* `mcpose://<backendKey>/<uri>` (ADR-0022).
|
|
296
|
+
*/
|
|
103
297
|
passThroughResources?: ReadonlyArray<string>;
|
|
104
|
-
/**
|
|
105
|
-
|
|
106
|
-
|
|
298
|
+
/**
|
|
299
|
+
* Tools hidden from list_tools and rejected at runtime with
|
|
300
|
+
* MethodNotFound. Precedence: a tool listed here AND in
|
|
301
|
+
* `passThroughTools` stays hidden. Hidden filtering is applied both
|
|
302
|
+
* before and after `listToolsMiddleware`, so list middleware cannot
|
|
303
|
+
* re-expose a hidden tool.
|
|
304
|
+
*
|
|
305
|
+
* A name array cannot see through a dispatcher (meta-tool) that takes
|
|
306
|
+
* the real tool name as an argument. Pass a {@link HiddenToolPredicate}
|
|
307
|
+
* (e.g. {@link dispatcherAwareBlock}) to close that bypass: it receives
|
|
308
|
+
* `undefined` args during list filtering and always an object at call
|
|
309
|
+
* time. See ADR-0006.
|
|
310
|
+
*/
|
|
311
|
+
hiddenTools?: ReadonlyArray<string> | HiddenToolPredicate;
|
|
312
|
+
/**
|
|
313
|
+
* Resources hidden from list_resources and rejected at runtime with
|
|
314
|
+
* InvalidRequest. Matched against the URI the client sees, which in mesh
|
|
315
|
+
* mode is `mcpose://<backendKey>/<uri>` (ADR-0022).
|
|
316
|
+
*/
|
|
107
317
|
hiddenResources?: ReadonlyArray<string>;
|
|
108
318
|
/**
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
319
|
+
* Strips `params._meta` from every request the proxy forwards (tool
|
|
320
|
+
* calls, resource reads, list and prompt calls). Default: `true`.
|
|
321
|
+
*
|
|
322
|
+
* MCP clients put correlation identifiers there (VS Code sends
|
|
323
|
+
* `progressToken`, a W3C `traceparent`, and `vscode/conversationId`),
|
|
324
|
+
* and the upstream is frequently a third party. The strip happens at the
|
|
325
|
+
* proxy boundary, before the pipeline, so middleware sees the stripped
|
|
326
|
+
* request and can still add its own `_meta` deliberately. Progress relay
|
|
327
|
+
* is unaffected: the proxy reads the client's progress token from the
|
|
328
|
+
* server-side request `extra`, and the SDK client stamps its own token
|
|
329
|
+
* on the upstream request.
|
|
330
|
+
*
|
|
331
|
+
* Applies to `passThroughTools` too; disable only globally with `false`
|
|
332
|
+
* for upstreams that read other `_meta` keys. See ADR-0008.
|
|
333
|
+
*/
|
|
334
|
+
stripRequestMeta?: boolean;
|
|
335
|
+
/**
|
|
336
|
+
* Strips top-level `_meta` from every result the proxy returns from the
|
|
337
|
+
* upstream (tool calls, resource reads, list and prompt calls).
|
|
338
|
+
* Default: `true`.
|
|
339
|
+
*
|
|
340
|
+
* The response-direction mirror of {@link stripRequestMeta}: upstreams
|
|
341
|
+
* stamp correlation identifiers there (the SDK stamps
|
|
342
|
+
* `io.modelcontextprotocol/related-task`), and the client is a third
|
|
343
|
+
* party to them. The strip happens at the upstream boundary, inside the
|
|
344
|
+
* innermost `next`, so middleware sees the stripped result and any
|
|
345
|
+
* `_meta` middleware adds deliberately still reaches the client.
|
|
346
|
+
*
|
|
347
|
+
* Local tool results are not stripped (they have no upstream), and
|
|
348
|
+
* nested `_meta` (per-tool in `tools[]`, per-block in `content`) is
|
|
349
|
+
* untouched. Applies to pass-through tools and resources too; disable
|
|
350
|
+
* only globally with `false`. See ADR-0009.
|
|
351
|
+
*/
|
|
352
|
+
stripResultMeta?: boolean;
|
|
353
|
+
/**
|
|
354
|
+
* Tools the proxy implements itself. Local tools appear in `tools/list`
|
|
355
|
+
* (first page only, so pagination does not duplicate them) and route to
|
|
356
|
+
* their handler instead of the upstream, from inside the innermost
|
|
357
|
+
* `next`, so the full `toolMiddleware` pipeline still runs.
|
|
358
|
+
*
|
|
359
|
+
* Precedence: `hiddenTools` beats a local tool; a local tool beats (and
|
|
360
|
+
* shadows) an upstream tool of the same name; `passThroughTools` has no
|
|
361
|
+
* effect on a local tool, because pass-through means "forward the
|
|
362
|
+
* upstream response as-is" and a local tool has no upstream.
|
|
363
|
+
*
|
|
364
|
+
* The proxy advertises the `tools` capability when this is non-empty
|
|
365
|
+
* even if the upstream has none. A duplicate local tool name throws at
|
|
366
|
+
* {@link createProxyServer}. See ADR-0007.
|
|
367
|
+
*/
|
|
368
|
+
localTools?: ReadonlyArray<LocalTool>;
|
|
369
|
+
/**
|
|
370
|
+
* Called after every tool call with timing and outcome data. Wire to any
|
|
371
|
+
* custom telemetry sink, or to `createOtelTelemetry` from `@mcpose/otel`
|
|
372
|
+
* for OpenTelemetry spans.
|
|
373
|
+
* A throwing sink is logged and never fails the tool call.
|
|
112
374
|
*/
|
|
113
375
|
onTelemetry?: (event: TelemetryEvent) => void;
|
|
114
376
|
}
|
|
@@ -116,22 +378,25 @@ export interface ProxyOptions {
|
|
|
116
378
|
* Creates a proxy MCP server without connecting it to a transport.
|
|
117
379
|
*
|
|
118
380
|
* Mirrors upstream tool/resource/prompt lists and routes requests through
|
|
119
|
-
* middleware pipelines.
|
|
381
|
+
* middleware pipelines. `prompts/list` is forwarded as-is; `prompts/get`
|
|
382
|
+
* runs `promptMiddleware` (ADR-0014).
|
|
120
383
|
*
|
|
121
384
|
* Uses low-level `Server` (not `McpServer`) — transparent proxying requires
|
|
122
385
|
* generic list interception; `McpServer.tool()` needs names upfront.
|
|
123
386
|
*
|
|
124
|
-
* @param
|
|
387
|
+
* @param backends - Connected (or mock) upstream MCP client for a 1:1 proxy,
|
|
388
|
+
* or a record of named backends for mesh mode (ADR-0013), where every
|
|
389
|
+
* upstream tool and prompt is exposed as `<backendKey>__<name>`.
|
|
125
390
|
* @param options - Middleware stacks, hidden/passthrough sets.
|
|
126
391
|
* @returns Configured {@link Server} ready to connect.
|
|
127
392
|
*/
|
|
128
|
-
export declare function createProxyServer(
|
|
393
|
+
export declare function createProxyServer(backends: Backends, options: ProxyOptions): Server;
|
|
129
394
|
/**
|
|
130
395
|
* Starts the proxy on stdio.
|
|
131
396
|
* Calls {@link createProxyServer} then connects to `StdioServerTransport`.
|
|
132
397
|
* Use `createProxyServer` directly for testable access to the server.
|
|
133
398
|
*/
|
|
134
|
-
export declare function startProxy(
|
|
399
|
+
export declare function startProxy(backends: Backends, options: ProxyOptions): Promise<void>;
|
|
135
400
|
/**
|
|
136
401
|
* Starts the proxy over Streamable HTTP with stateful sessions.
|
|
137
402
|
*
|
|
@@ -143,5 +408,5 @@ export declare function startProxy(backend: BackendClient, options?: ProxyOption
|
|
|
143
408
|
* @returns Promise resolving to the listening `http.Server` (or `https.Server`
|
|
144
409
|
* when `tlsOptions` is supplied).
|
|
145
410
|
*/
|
|
146
|
-
export declare function startHttpProxy(
|
|
411
|
+
export declare function startHttpProxy(backends: Backends, options: ProxyOptions, httpOptions?: HttpProxyOptions): Promise<http.Server>;
|
|
147
412
|
//# sourceMappingURL=core.d.ts.map
|
package/dist/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|