mcpose 1.2.0 → 2.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/dist/core.d.ts +59 -6
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +94 -26
- package/dist/core.js.map +1 -1
- package/dist/eventStore.d.ts +17 -0
- package/dist/eventStore.d.ts.map +1 -0
- package/dist/eventStore.js +34 -0
- package/dist/eventStore.js.map +1 -0
- package/dist/identity.d.ts +16 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +2 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/proxyContext.d.ts +7 -0
- package/dist/proxyContext.d.ts.map +1 -1
- package/dist/proxyContext.js +4 -4
- package/dist/proxyContext.js.map +1 -1
- package/dist/rejection.d.ts +19 -0
- package/dist/rejection.d.ts.map +1 -0
- package/dist/rejection.js +10 -0
- package/dist/rejection.js.map +1 -0
- package/dist/telemetry.d.ts +15 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +2 -0
- package/dist/telemetry.js.map +1 -0
- package/package.json +27 -13
- package/README.md +0 -368
package/dist/core.d.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import * as http from 'node:http';
|
|
2
|
+
import * as https from 'node:https';
|
|
2
3
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
4
|
import { type ListToolsRequest, type ListToolsResult, type CallToolRequest, type CallToolResult, type CompatibilityCallToolResult, type ReadResourceRequest, type ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';
|
|
4
5
|
import { type Middleware } from './middleware.js';
|
|
5
6
|
import type { BackendClient } from './backendClient.js';
|
|
7
|
+
import type { Identity } from './identity.js';
|
|
8
|
+
import type { TelemetryEvent } from './telemetry.js';
|
|
9
|
+
import type { EventStore } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
6
10
|
export type { ProxyContext } from './proxyContext.js';
|
|
7
11
|
/**
|
|
8
12
|
* Middleware for tool calls.
|
|
@@ -37,6 +41,50 @@ export interface HttpProxyOptions {
|
|
|
37
41
|
maxSessions?: number;
|
|
38
42
|
/** Session TTL in milliseconds. Sessions are closed after this duration. */
|
|
39
43
|
sessionTtlMs?: number;
|
|
44
|
+
/**
|
|
45
|
+
* Resolves caller identity from the initial session request.
|
|
46
|
+
* Called once per new session; the result is stamped on every
|
|
47
|
+
* {@link ProxyContext} within that session.
|
|
48
|
+
*
|
|
49
|
+
* Supply a JWT extractor, mTLS cert reader, API-key lookup, or any async
|
|
50
|
+
* function returning an {@link Identity}. Errors thrown here abort the
|
|
51
|
+
* session with a 401.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* resolveIdentity: extractJwtIdentity({ jwksUri: '...' })
|
|
55
|
+
*/
|
|
56
|
+
resolveIdentity?: (req: http.IncomingMessage) => Identity | Promise<Identity>;
|
|
57
|
+
/**
|
|
58
|
+
* TLS options for mutual TLS (mTLS). When provided, the proxy listens on
|
|
59
|
+
* HTTPS and requires client certificates signed by the supplied CA.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* tlsOptions: {
|
|
63
|
+
* key: fs.readFileSync('server.key'),
|
|
64
|
+
* cert: fs.readFileSync('server.crt'),
|
|
65
|
+
* ca: fs.readFileSync('trusted-ca.crt'),
|
|
66
|
+
* requestCert: true,
|
|
67
|
+
* rejectUnauthorized: true,
|
|
68
|
+
* }
|
|
69
|
+
*/
|
|
70
|
+
tlsOptions?: https.ServerOptions;
|
|
71
|
+
/**
|
|
72
|
+
* Event store for SSE reconnect replay. Defaults to an in-memory store
|
|
73
|
+
* (suitable for single-instance deployments). For multi-instance / HA
|
|
74
|
+
* deployments, supply a Redis or Postgres-backed implementation.
|
|
75
|
+
*
|
|
76
|
+
* Set to `null` to disable reconnect replay entirely.
|
|
77
|
+
*/
|
|
78
|
+
eventStore?: EventStore | null;
|
|
79
|
+
/**
|
|
80
|
+
* Called when a session is closed (client DELETE or TTL expiry).
|
|
81
|
+
* Wire {@link AuditMiddlewareHandle.closeSession} here to flush the
|
|
82
|
+
* ReplayManifest for the session.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* onSessionClosed: (sessionId) => auditHandle.closeSession(sessionId)
|
|
86
|
+
*/
|
|
87
|
+
onSessionClosed?: (sessionId: string) => void;
|
|
40
88
|
}
|
|
41
89
|
/** Proxy server options. */
|
|
42
90
|
export interface ProxyOptions {
|
|
@@ -57,6 +105,12 @@ export interface ProxyOptions {
|
|
|
57
105
|
hiddenTools?: ReadonlyArray<string>;
|
|
58
106
|
/** Resources hidden from list_resources and rejected at runtime with InvalidRequest. */
|
|
59
107
|
hiddenResources?: ReadonlyArray<string>;
|
|
108
|
+
/**
|
|
109
|
+
* Called after every tool call with timing and outcome data.
|
|
110
|
+
* Wire to {@link https://www.npmjs.com/package/@mcpose/otel | @mcpose/otel}
|
|
111
|
+
* or any custom telemetry sink.
|
|
112
|
+
*/
|
|
113
|
+
onTelemetry?: (event: TelemetryEvent) => void;
|
|
60
114
|
}
|
|
61
115
|
/**
|
|
62
116
|
* Creates a proxy MCP server without connecting it to a transport.
|
|
@@ -82,13 +136,12 @@ export declare function startProxy(backend: BackendClient, options?: ProxyOption
|
|
|
82
136
|
* Starts the proxy over Streamable HTTP with stateful sessions.
|
|
83
137
|
*
|
|
84
138
|
* Sessions keyed by `mcp-session-id`. Upstream notifications fanned out to
|
|
85
|
-
* all active sessions via their GET SSE stream.
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* - Sessions never expire.
|
|
89
|
-
* - No `EventStore` → SSE reconnect replay unsupported.
|
|
139
|
+
* all active sessions via their GET SSE stream. Dropped connections can
|
|
140
|
+
* replay missed notifications via the built-in in-memory EventStore (or a
|
|
141
|
+
* custom persistent store for multi-instance deployments).
|
|
90
142
|
*
|
|
91
|
-
* @returns Promise resolving to the listening `http.Server
|
|
143
|
+
* @returns Promise resolving to the listening `http.Server` (or `https.Server`
|
|
144
|
+
* when `tlsOptions` is supplied).
|
|
92
145
|
*/
|
|
93
146
|
export declare function startHttpProxy(backend: BackendClient, options?: ProxyOptions, httpOptions?: HttpProxyOptions): Promise<http.Server>;
|
|
94
147
|
//# 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;
|
|
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;AAGnE,OAAO,EAML,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAOpB,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,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oDAAoD,CAAC;AAIrF,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;;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,0CAA0C;AAC1C,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AAEhF;;;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;IACd,yIAAyI;IACzI,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChG,2DAA2D;IAC3D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9E;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACjC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;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,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAEzD,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;IAExC;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CAC/C;AA8KD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,YAAiB,GACzB,MAAM,CAiIR;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAGf;AA6BD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,YAAiB,EAC1B,WAAW,GAAE,gBAAqB,GACjC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAuJtB"}
|
package/dist/core.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
/** MCP proxy core: wires server→upstream through middleware pipelines. */
|
|
2
2
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
3
3
|
import * as http from 'node:http';
|
|
4
|
+
import * as https from 'node:https';
|
|
4
5
|
import { randomUUID } from 'node:crypto';
|
|
5
6
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
6
7
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
7
8
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
8
|
-
import { CallToolRequestSchema, ErrorCode, GetPromptRequestSchema, ListPromptsRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema,
|
|
9
|
+
import { CallToolRequestSchema, ErrorCode, GetPromptRequestSchema, ListPromptsRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, PromptListChangedNotificationSchema, ReadResourceRequestSchema, ResourceListChangedNotificationSchema, ToolListChangedNotificationSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
9
10
|
import { pipe } from './middleware.js';
|
|
10
11
|
import { createProxyContext } from './proxyContext.js';
|
|
12
|
+
import { createInMemoryEventStore } from './eventStore.js';
|
|
13
|
+
import { rejectionMcpError } from './rejection.js';
|
|
11
14
|
/**
|
|
12
15
|
* Narrows `CompatibilityCallToolResult` to `CallToolResult` (has `.content` array).
|
|
13
16
|
* Both union members carry `[x: string]: unknown`, so this avoids unsafe casts.
|
|
@@ -149,17 +152,47 @@ export function createProxyServer(backend, options = {}) {
|
|
|
149
152
|
const result = await listToolsPipeline(req, async (currentReq) => filterHiddenTools(await backend.listTools(currentReq.params, requestOptions), hiddenToolSet), context);
|
|
150
153
|
return filterHiddenTools(result, hiddenToolSet);
|
|
151
154
|
});
|
|
152
|
-
server.setRequestHandler(CallToolRequestSchema, (req, extra) => {
|
|
155
|
+
server.setRequestHandler(CallToolRequestSchema, async (req, extra) => {
|
|
153
156
|
const name = req.params.name;
|
|
154
157
|
const requestOptions = createRequestOptions(extra);
|
|
155
158
|
const context = getMiddlewareContext(extra.signal);
|
|
159
|
+
const start = Date.now();
|
|
160
|
+
const emitTelemetry = (outcome, rejectionReason) => {
|
|
161
|
+
options.onTelemetry?.({
|
|
162
|
+
type: 'tool_call',
|
|
163
|
+
requestId: context.requestId,
|
|
164
|
+
...(context.sessionId === undefined ? {} : { sessionId: context.sessionId }),
|
|
165
|
+
tool: name,
|
|
166
|
+
duration_ms: Date.now() - start,
|
|
167
|
+
outcome,
|
|
168
|
+
...(rejectionReason === undefined ? {} : { rejectionReason }),
|
|
169
|
+
...(context.identity === undefined ? {} : { identity: context.identity }),
|
|
170
|
+
});
|
|
171
|
+
};
|
|
156
172
|
if (hiddenToolSet.has(name)) {
|
|
157
|
-
|
|
173
|
+
emitTelemetry('rejected', 'TOOL_HIDDEN');
|
|
174
|
+
throw rejectionMcpError('TOOL_HIDDEN', ErrorCode.MethodNotFound, `Tool not found: ${name}`);
|
|
158
175
|
}
|
|
159
176
|
if (passThroughToolSet.has(name)) {
|
|
160
|
-
|
|
177
|
+
try {
|
|
178
|
+
const result = await backend.callTool(req.params, undefined, requestOptions);
|
|
179
|
+
emitTelemetry('success');
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
emitTelemetry('error');
|
|
184
|
+
throw err;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
const result = await toolPipeline(req, (r) => backend.callTool(r.params, undefined, requestOptions), context);
|
|
189
|
+
emitTelemetry('success');
|
|
190
|
+
return result;
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
emitTelemetry('error');
|
|
194
|
+
throw err;
|
|
161
195
|
}
|
|
162
|
-
return toolPipeline(req, (r) => backend.callTool(r.params, undefined, requestOptions), context);
|
|
163
196
|
});
|
|
164
197
|
}
|
|
165
198
|
// ── Resource handlers ──────────────────────────────────────────────────────
|
|
@@ -175,7 +208,7 @@ export function createProxyServer(backend, options = {}) {
|
|
|
175
208
|
const requestOptions = createRequestOptions(extra);
|
|
176
209
|
const context = getMiddlewareContext(extra.signal);
|
|
177
210
|
if (hiddenResourceSet.has(uri)) {
|
|
178
|
-
throw
|
|
211
|
+
throw rejectionMcpError('RESOURCE_HIDDEN', ErrorCode.InvalidRequest, `Resource not found: ${uri}`);
|
|
179
212
|
}
|
|
180
213
|
if (passThroughResourceSet.has(uri)) {
|
|
181
214
|
return backend.readResource(req.params, requestOptions);
|
|
@@ -206,6 +239,12 @@ function applyBodySizeLimit(req, res, maxBodyBytes) {
|
|
|
206
239
|
if (chunk !== null && total + chunk.length > maxBodyBytes) {
|
|
207
240
|
if (!res.headersSent)
|
|
208
241
|
res.writeHead(413).end();
|
|
242
|
+
// Mute the response for downstream writers (the SDK transport will
|
|
243
|
+
// observe the destroyed request and try to send its own error).
|
|
244
|
+
const muted = res;
|
|
245
|
+
muted.writeHead = () => res;
|
|
246
|
+
muted.write = () => true;
|
|
247
|
+
muted.end = () => res;
|
|
209
248
|
req.destroy(new Error('Request body too large'));
|
|
210
249
|
return false;
|
|
211
250
|
}
|
|
@@ -218,21 +257,23 @@ function applyBodySizeLimit(req, res, maxBodyBytes) {
|
|
|
218
257
|
* Starts the proxy over Streamable HTTP with stateful sessions.
|
|
219
258
|
*
|
|
220
259
|
* Sessions keyed by `mcp-session-id`. Upstream notifications fanned out to
|
|
221
|
-
* all active sessions via their GET SSE stream.
|
|
260
|
+
* all active sessions via their GET SSE stream. Dropped connections can
|
|
261
|
+
* replay missed notifications via the built-in in-memory EventStore (or a
|
|
262
|
+
* custom persistent store for multi-instance deployments).
|
|
222
263
|
*
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
* - No `EventStore` → SSE reconnect replay unsupported.
|
|
226
|
-
*
|
|
227
|
-
* @returns Promise resolving to the listening `http.Server`.
|
|
264
|
+
* @returns Promise resolving to the listening `http.Server` (or `https.Server`
|
|
265
|
+
* when `tlsOptions` is supplied).
|
|
228
266
|
*/
|
|
229
267
|
export function startHttpProxy(backend, options = {}, httpOptions = {}) {
|
|
230
268
|
const mcpPath = httpOptions.path ?? '/mcp';
|
|
231
269
|
const port = httpOptions.port ?? 3000;
|
|
232
270
|
const host = httpOptions.host;
|
|
233
|
-
|
|
271
|
+
const eventStore = httpOptions.eventStore === null
|
|
272
|
+
? undefined
|
|
273
|
+
: (httpOptions.eventStore ?? createInMemoryEventStore());
|
|
274
|
+
// session ID → { transport, proxyServer, identity }
|
|
234
275
|
const sessions = new Map();
|
|
235
|
-
const
|
|
276
|
+
const requestHandler = (req, res) => {
|
|
236
277
|
const handle = async () => {
|
|
237
278
|
if (httpOptions.onRequest !== undefined) {
|
|
238
279
|
let allowed;
|
|
@@ -258,20 +299,23 @@ export function startHttpProxy(backend, options = {}, httpOptions = {}) {
|
|
|
258
299
|
}
|
|
259
300
|
const sessionId = req.headers['mcp-session-id'];
|
|
260
301
|
const headers = normalizeHeaders(req.headers);
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
...(headers === undefined ? {} : { headers }),
|
|
265
|
-
};
|
|
266
|
-
await httpProxyContext.run(requestContext, async () => {
|
|
302
|
+
await httpProxyContext.run(
|
|
303
|
+
// Base context — requestId added per-request by getMiddlewareContext()
|
|
304
|
+
{ transport: 'http' }, async () => {
|
|
267
305
|
if (typeof sessionId === 'string') {
|
|
268
|
-
// Route to existing session
|
|
306
|
+
// Route to existing session — stamp its resolved identity into context
|
|
269
307
|
const session = sessions.get(sessionId);
|
|
270
308
|
if (!session) {
|
|
271
309
|
res.writeHead(404).end();
|
|
272
310
|
return;
|
|
273
311
|
}
|
|
274
|
-
|
|
312
|
+
const requestContext = {
|
|
313
|
+
transport: 'http',
|
|
314
|
+
sessionId,
|
|
315
|
+
...(headers === undefined ? {} : { headers }),
|
|
316
|
+
...(session.identity === undefined ? {} : { identity: session.identity }),
|
|
317
|
+
};
|
|
318
|
+
await httpProxyContext.run(requestContext, () => session.transport.handleRequest(req, res));
|
|
275
319
|
}
|
|
276
320
|
else {
|
|
277
321
|
// New session (initialize request)
|
|
@@ -279,11 +323,24 @@ export function startHttpProxy(backend, options = {}, httpOptions = {}) {
|
|
|
279
323
|
res.writeHead(503).end();
|
|
280
324
|
return;
|
|
281
325
|
}
|
|
326
|
+
// Resolve identity once for the lifetime of this session
|
|
327
|
+
let identity;
|
|
328
|
+
if (httpOptions.resolveIdentity !== undefined) {
|
|
329
|
+
try {
|
|
330
|
+
identity = await httpOptions.resolveIdentity(req);
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
if (!res.headersSent)
|
|
334
|
+
res.writeHead(401).end();
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
282
338
|
const proxyServer = createProxyServer(backend, options);
|
|
283
339
|
const transport = new StreamableHTTPServerTransport({
|
|
284
340
|
sessionIdGenerator: randomUUID,
|
|
341
|
+
...(eventStore ? { eventStore } : {}),
|
|
285
342
|
onsessioninitialized: (id) => {
|
|
286
|
-
sessions.set(id, { transport, proxyServer });
|
|
343
|
+
sessions.set(id, { transport, proxyServer, identity });
|
|
287
344
|
if (httpOptions.sessionTtlMs !== undefined) {
|
|
288
345
|
const timer = setTimeout(() => {
|
|
289
346
|
const session = sessions.get(id);
|
|
@@ -295,10 +352,18 @@ export function startHttpProxy(backend, options = {}, httpOptions = {}) {
|
|
|
295
352
|
timer.unref();
|
|
296
353
|
}
|
|
297
354
|
},
|
|
298
|
-
onsessionclosed: (id) => {
|
|
355
|
+
onsessionclosed: (id) => {
|
|
356
|
+
sessions.delete(id);
|
|
357
|
+
httpOptions.onSessionClosed?.(id);
|
|
358
|
+
},
|
|
299
359
|
});
|
|
360
|
+
const requestContext = {
|
|
361
|
+
transport: 'http',
|
|
362
|
+
...(headers === undefined ? {} : { headers }),
|
|
363
|
+
...(identity === undefined ? {} : { identity }),
|
|
364
|
+
};
|
|
300
365
|
await proxyServer.connect(transport);
|
|
301
|
-
await transport.handleRequest(req, res);
|
|
366
|
+
await httpProxyContext.run(requestContext, () => transport.handleRequest(req, res));
|
|
302
367
|
}
|
|
303
368
|
});
|
|
304
369
|
};
|
|
@@ -307,7 +372,10 @@ export function startHttpProxy(backend, options = {}, httpOptions = {}) {
|
|
|
307
372
|
res.writeHead(500).end();
|
|
308
373
|
(httpOptions.onError ?? console.error)(err);
|
|
309
374
|
});
|
|
310
|
-
}
|
|
375
|
+
};
|
|
376
|
+
const server = httpOptions.tlsOptions
|
|
377
|
+
? https.createServer(httpOptions.tlsOptions, requestHandler)
|
|
378
|
+
: http.createServer(requestHandler);
|
|
311
379
|
const rawClose = server.close.bind(server);
|
|
312
380
|
let shuttingDown = false;
|
|
313
381
|
server.close = ((callback) => {
|
package/dist/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { EventStore } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
2
|
+
/**
|
|
3
|
+
* Plug in a persistent event store to support SSE reconnect replay across
|
|
4
|
+
* restarts or load-balanced instances. Re-exports the SDK's `EventStore`
|
|
5
|
+
* interface — any implementation satisfying it is compatible.
|
|
6
|
+
*
|
|
7
|
+
* For single-instance deployments, use {@link createInMemoryEventStore}.
|
|
8
|
+
* For production (multi-instance, HA), implement against Redis or Postgres.
|
|
9
|
+
*/
|
|
10
|
+
export type { EventStore as PersistentEventStore };
|
|
11
|
+
/**
|
|
12
|
+
* In-memory EventStore — default for single-instance deployments.
|
|
13
|
+
* Dropped connections can replay missed notifications on reconnect.
|
|
14
|
+
* Events are evicted FIFO once `maxEvents` is reached.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createInMemoryEventStore(maxEvents?: number): EventStore;
|
|
17
|
+
//# sourceMappingURL=eventStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventStore.d.ts","sourceRoot":"","sources":["../src/eventStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,oDAAoD,CAAC;AAGxG;;;;;;;GAOG;AACH,YAAY,EAAE,UAAU,IAAI,oBAAoB,EAAE,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,SAAO,GAAG,UAAU,CA8BrE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory EventStore — default for single-instance deployments.
|
|
3
|
+
* Dropped connections can replay missed notifications on reconnect.
|
|
4
|
+
* Events are evicted FIFO once `maxEvents` is reached.
|
|
5
|
+
*/
|
|
6
|
+
export function createInMemoryEventStore(maxEvents = 1000) {
|
|
7
|
+
const store = new Map();
|
|
8
|
+
let seq = 0;
|
|
9
|
+
return {
|
|
10
|
+
async storeEvent(streamId, message) {
|
|
11
|
+
const id = String(++seq);
|
|
12
|
+
store.set(id, { streamId, message });
|
|
13
|
+
if (store.size > maxEvents) {
|
|
14
|
+
store.delete(store.keys().next().value);
|
|
15
|
+
}
|
|
16
|
+
return id;
|
|
17
|
+
},
|
|
18
|
+
async getStreamIdForEventId(eventId) {
|
|
19
|
+
return store.get(eventId)?.streamId;
|
|
20
|
+
},
|
|
21
|
+
async replayEventsAfter(lastEventId, { send }) {
|
|
22
|
+
const afterSeq = parseInt(lastEventId, 10) || 0;
|
|
23
|
+
let latestStreamId = '';
|
|
24
|
+
for (const [id, { streamId, message }] of store) {
|
|
25
|
+
if (parseInt(id, 10) > afterSeq) {
|
|
26
|
+
await send(id, message);
|
|
27
|
+
latestStreamId = streamId;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return latestStreamId;
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=eventStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventStore.js","sourceRoot":"","sources":["../src/eventStore.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAAS,GAAG,IAAI;IACvD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4D,CAAC;IAClF,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,OAAO;QACL,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO;YAChC,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,CAAY,CAAC;YACpC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,IAAI,GAAG,SAAS,EAAE,CAAC;gBAC3B,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,KAAK,CAAC,qBAAqB,CAAC,OAAO;YACjC,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC;QACtC,CAAC;QAED,KAAK,CAAC,iBAAiB,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE;YAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAqB,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,cAAc,GAAa,EAAc,CAAC;YAC9C,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;gBAChD,IAAI,QAAQ,CAAC,EAAY,EAAE,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC;oBAC1C,MAAM,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;oBACxB,cAAc,GAAG,QAAQ,CAAC;gBAC5B,CAAC;YACH,CAAC;YACD,OAAO,cAAc,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Who made the request — resolved once per session via {@link resolveIdentity}. */
|
|
2
|
+
export interface Identity {
|
|
3
|
+
/** Stable unique identifier (e.g. OIDC `sub` claim). */
|
|
4
|
+
sub: string;
|
|
5
|
+
/** Whether the caller is a human user, an AI agent, or an automated service. */
|
|
6
|
+
type: 'human' | 'agent' | 'service';
|
|
7
|
+
displayName?: string;
|
|
8
|
+
roles: string[];
|
|
9
|
+
/** Arbitrary claims from the resolved identity source (JWT payload, cert CN, etc.). */
|
|
10
|
+
claims: Record<string, unknown>;
|
|
11
|
+
/** ISO 8601 timestamp of when identity was resolved. */
|
|
12
|
+
resolvedAt: string;
|
|
13
|
+
/** Which resolver produced this identity. */
|
|
14
|
+
source: 'jwt' | 'mtls' | 'apikey' | 'custom';
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,MAAM,WAAW,QAAQ;IACvB,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,gFAAgF;IAChF,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,uFAAuF;IACvF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAC9C"}
|
package/dist/identity.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,8 +2,13 @@ export type { Middleware } from './middleware.js';
|
|
|
2
2
|
export { compose } from './middleware.js';
|
|
3
3
|
export type { BackendConfig, BackendClient } from './backendClient.js';
|
|
4
4
|
export { createBackendClient } from './backendClient.js';
|
|
5
|
+
export type { Identity } from './identity.js';
|
|
5
6
|
export type { ProxyContext } from './proxyContext.js';
|
|
6
7
|
export { createProxyContext } from './proxyContext.js';
|
|
8
|
+
export type { TelemetryEvent } from './telemetry.js';
|
|
9
|
+
export type { PersistentEventStore } from './eventStore.js';
|
|
10
|
+
export { createInMemoryEventStore } from './eventStore.js';
|
|
11
|
+
export type { RejectionReason } from './rejection.js';
|
|
7
12
|
export type { ProxyOptions, HttpProxyOptions, ToolMiddleware, ResourceMiddleware, ListToolsMiddleware, } from './core.js';
|
|
8
13
|
export { hasToolContent, createProxyServer, startProxy, startHttpProxy } from './core.js';
|
|
9
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { compose } from './middleware.js';
|
|
2
2
|
export { createBackendClient } from './backendClient.js';
|
|
3
3
|
export { createProxyContext } from './proxyContext.js';
|
|
4
|
+
export { createInMemoryEventStore } from './eventStore.js';
|
|
4
5
|
export { hasToolContent, createProxyServer, startProxy, startHttpProxy } from './core.js';
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAKzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAKvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAW3D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/proxyContext.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Identity } from './identity.js';
|
|
1
2
|
/** Normalized request metadata that mcpose passes through middleware layers. */
|
|
2
3
|
export interface ProxyContext {
|
|
3
4
|
requestId: string;
|
|
@@ -5,6 +6,12 @@ export interface ProxyContext {
|
|
|
5
6
|
sessionId?: string;
|
|
6
7
|
headers?: Readonly<Record<string, string>>;
|
|
7
8
|
signal?: AbortSignal;
|
|
9
|
+
/** Resolved caller identity. Present when {@link HttpProxyOptions.resolveIdentity} is configured. */
|
|
10
|
+
identity?: Identity;
|
|
11
|
+
/** Agent delegation chain — populated when an upstream A2A agent delegates through mcpose. */
|
|
12
|
+
delegatedFrom?: Identity[];
|
|
13
|
+
/** @stable Reserved for v3 policy engine. */
|
|
14
|
+
policy?: never;
|
|
8
15
|
}
|
|
9
16
|
/** Creates a middleware context with a fresh request ID. */
|
|
10
17
|
export declare function createProxyContext(overrides?: Partial<ProxyContext>): ProxyContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxyContext.d.ts","sourceRoot":"","sources":["../src/proxyContext.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"proxyContext.d.ts","sourceRoot":"","sources":["../src/proxyContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,gFAAgF;AAChF,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,qGAAqG;IACrG,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,8FAA8F;IAC9F,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC3B,6CAA6C;IAC7C,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAChC,SAAS,GAAE,OAAO,CAAC,YAAY,CAAM,GACpC,YAAY,CAUd"}
|
package/dist/proxyContext.js
CHANGED
|
@@ -2,13 +2,13 @@ import { randomUUID } from 'node:crypto';
|
|
|
2
2
|
/** Creates a middleware context with a fresh request ID. */
|
|
3
3
|
export function createProxyContext(overrides = {}) {
|
|
4
4
|
return {
|
|
5
|
-
requestId: overrides.requestId
|
|
5
|
+
requestId: overrides.requestId || randomUUID(),
|
|
6
6
|
transport: overrides.transport ?? 'stdio',
|
|
7
|
-
...(overrides.sessionId === undefined
|
|
8
|
-
? {}
|
|
9
|
-
: { sessionId: overrides.sessionId }),
|
|
7
|
+
...(overrides.sessionId === undefined ? {} : { sessionId: overrides.sessionId }),
|
|
10
8
|
...(overrides.headers === undefined ? {} : { headers: overrides.headers }),
|
|
11
9
|
...(overrides.signal === undefined ? {} : { signal: overrides.signal }),
|
|
10
|
+
...(overrides.identity === undefined ? {} : { identity: overrides.identity }),
|
|
11
|
+
...(overrides.delegatedFrom === undefined ? {} : { delegatedFrom: overrides.delegatedFrom }),
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=proxyContext.js.map
|
package/dist/proxyContext.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxyContext.js","sourceRoot":"","sources":["../src/proxyContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"proxyContext.js","sourceRoot":"","sources":["../src/proxyContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAkBzC,4DAA4D;AAC5D,MAAM,UAAU,kBAAkB,CAChC,YAAmC,EAAE;IAErC,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,UAAU,EAAE;QAC9C,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,OAAO;QACzC,GAAG,CAAC,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;QAChF,GAAG,CAAC,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;QAC1E,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;QACvE,GAAG,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC7E,GAAG,CAAC,SAAS,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,SAAS,CAAC,aAAa,EAAE,CAAC;KAC7F,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Structured reason for a rejected call.
|
|
4
|
+
*
|
|
5
|
+
* Placed in the MCP error `data` field — the top-level error code is
|
|
6
|
+
* unchanged (`MethodNotFound` / `InvalidRequest`) so existing clients are
|
|
7
|
+
* unaffected. Agents and audit middleware can inspect `error.data.rejectionReason`
|
|
8
|
+
* for programmatic handling and compliance logging.
|
|
9
|
+
*
|
|
10
|
+
* @stable
|
|
11
|
+
*/
|
|
12
|
+
export type RejectionReason = 'TOOL_HIDDEN' | 'RESOURCE_HIDDEN' | 'POLICY_DENIED' | 'IDENTITY_UNRESOLVED' | 'CONSENT_MISSING' | 'SENSITIVITY_BLOCKED' | 'DELEGATION_INVALID' | 'BUDGET_EXCEEDED' | 'SESSION_LIMIT' | 'BODY_LIMIT';
|
|
13
|
+
/**
|
|
14
|
+
* Creates an `McpError` with the rejection reason embedded in `error.data`.
|
|
15
|
+
* The top-level `code` is unchanged so clients that only inspect the code
|
|
16
|
+
* are unaffected.
|
|
17
|
+
*/
|
|
18
|
+
export declare function rejectionMcpError(reason: RejectionReason, code: ErrorCode, message: string): McpError;
|
|
19
|
+
//# sourceMappingURL=rejection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rejection.d.ts","sourceRoot":"","sources":["../src/rejection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;;;;;;;;GASG;AACH,MAAM,MAAM,eAAe,GACvB,aAAa,GACb,iBAAiB,GACjB,eAAe,GACf,qBAAqB,GACrB,iBAAiB,GACjB,qBAAqB,GACrB,oBAAoB,GACpB,iBAAiB,GACjB,eAAe,GACf,YAAY,CAAC;AAEjB;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,GACd,QAAQ,CAEV"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates an `McpError` with the rejection reason embedded in `error.data`.
|
|
4
|
+
* The top-level `code` is unchanged so clients that only inspect the code
|
|
5
|
+
* are unaffected.
|
|
6
|
+
*/
|
|
7
|
+
export function rejectionMcpError(reason, code, message) {
|
|
8
|
+
return new McpError(code, message, { rejectionReason: reason });
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=rejection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rejection.js","sourceRoot":"","sources":["../src/rejection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,oCAAoC,CAAC;AAwBzE;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAuB,EACvB,IAAe,EACf,OAAe;IAEf,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Identity } from './identity.js';
|
|
2
|
+
import type { RejectionReason } from './rejection.js';
|
|
3
|
+
/** Emitted after every tool call (success, error, or rejection). */
|
|
4
|
+
export interface TelemetryEvent {
|
|
5
|
+
type: 'tool_call';
|
|
6
|
+
requestId: string;
|
|
7
|
+
sessionId?: string;
|
|
8
|
+
tool: string;
|
|
9
|
+
duration_ms: number;
|
|
10
|
+
outcome: 'success' | 'error' | 'rejected';
|
|
11
|
+
/** Populated when `outcome` is `'rejected'`. */
|
|
12
|
+
rejectionReason?: RejectionReason;
|
|
13
|
+
identity?: Identity;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,oEAAoE;AACpE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;IAC1C,gDAAgD;IAChD,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcpose",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "The audit and governance layer for MCP",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -15,15 +15,27 @@
|
|
|
15
15
|
"default": "./dist/testing.js"
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
|
-
"files": [
|
|
19
|
-
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"keywords": [
|
|
23
|
+
"mcp",
|
|
24
|
+
"middleware",
|
|
25
|
+
"functional-programming",
|
|
26
|
+
"proxy",
|
|
27
|
+
"compose",
|
|
28
|
+
"model-context-protocol",
|
|
29
|
+
"audit",
|
|
30
|
+
"compliance",
|
|
31
|
+
"fintech"
|
|
32
|
+
],
|
|
20
33
|
"author": "Amir Gorji",
|
|
21
34
|
"license": "MIT",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"prepublishOnly": "npm run ts:ci && npm run test && npm run build"
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/amir-gorji/mcpose.git",
|
|
38
|
+
"directory": "packages/core"
|
|
27
39
|
},
|
|
28
40
|
"peerDependencies": {
|
|
29
41
|
"@modelcontextprotocol/sdk": ">=1.0.0"
|
|
@@ -33,8 +45,10 @@
|
|
|
33
45
|
"@types/node": "^22.0.0",
|
|
34
46
|
"typescript": "^5.0.0",
|
|
35
47
|
"vitest": "^3.0.0"
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsc -p tsconfig.build.json",
|
|
51
|
+
"ts:ci": "tsc --noEmit",
|
|
52
|
+
"test": "vitest run --passWithNoTests"
|
|
39
53
|
}
|
|
40
|
-
}
|
|
54
|
+
}
|
package/README.md
DELETED
|
@@ -1,368 +0,0 @@
|
|
|
1
|
-
<p align="center">
|
|
2
|
-
<img src="assets/logo.png" alt="mcpose logo" width="500" />
|
|
3
|
-
</p>
|
|
4
|
-
|
|
5
|
-
# mcpose
|
|
6
|
-
|
|
7
|
-
A transparent middleware proxy for MCP servers - intercept, transform, and govern tool calls and tool discovery through composable functional middleware.
|
|
8
|
-
|
|
9
|
-
You'll probably love it if you have enjoyed working with middleware functions or LEGO.
|
|
10
|
-
|
|
11
|
-
## New in 1.2.0
|
|
12
|
-
|
|
13
|
-
- `onRequest` hook — auth/request gating on HTTP proxy
|
|
14
|
-
- `onError` callback — custom error handler (replaces `console.error`)
|
|
15
|
-
- `maxBodyBytes` — body size cap, returns 413 (default 4 MB)
|
|
16
|
-
- `maxSessions` — concurrent session cap, excess returns 503
|
|
17
|
-
- `sessionTtlMs` — session TTL with auto-close
|
|
18
|
-
- `createProxyContext` exported for manual context construction
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## Background
|
|
24
|
-
|
|
25
|
-
mcpose was extracted from [`financial-elastic-mcp-server`](https://github.com/amir-gorji/financial-elastic-mcp-server), an Elasticsearch MCP server built for financial institutions that needed PII redaction and audit logging on every tool call. Those cross-cutting concerns were originally hardcoded into a single server. mcpose lifts that pattern into a reusable, composable middleware layer that can wrap **any** upstream MCP server.
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## Concept
|
|
30
|
-
|
|
31
|
-
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.
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## Install
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
npm install mcpose
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
**Peer dependency** — must be installed separately:
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
npm install @modelcontextprotocol/sdk@>=1.0.0
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
## Quick Start
|
|
50
|
-
|
|
51
|
-
```ts
|
|
52
|
-
import { createBackendClient, startProxy } from 'mcpose';
|
|
53
|
-
import type { ToolMiddleware } from 'mcpose';
|
|
54
|
-
|
|
55
|
-
// 1. Connect to the upstream MCP server (stdio)
|
|
56
|
-
const backend = await createBackendClient({
|
|
57
|
-
command: 'node',
|
|
58
|
-
args: ['/path/to/backend-server.mjs'],
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
// 2. Define middleware
|
|
62
|
-
const loggingMW: ToolMiddleware = async (req, next) => {
|
|
63
|
-
console.error(`→ ${req.params.name}`);
|
|
64
|
-
const result = await next(req);
|
|
65
|
-
console.error(`← ${req.params.name} done`);
|
|
66
|
-
return result;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
// 3. Start the proxy on stdio
|
|
70
|
-
await startProxy(backend, {
|
|
71
|
-
toolMiddleware: [loggingMW],
|
|
72
|
-
});
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
---
|
|
76
|
-
|
|
77
|
-
## Proxy model
|
|
78
|
-
|
|
79
|
-
```
|
|
80
|
-
┌──────────────┐ ┌────────────────────────────────┐ ┌────────────────────┐
|
|
81
|
-
│ LLM client │ ◄────► │ mcpose │ ◄────► │ Upstream MCP │
|
|
82
|
-
│ (Claude, │ │ · visibility filters │ │ server │
|
|
83
|
-
│ Cursor…) │ │ · middleware pipelines │ │ (stdio or HTTP) │
|
|
84
|
-
└──────────────┘ └────────────────────────────────┘ └────────────────────┘
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
For each supported tool or resource, mcpose picks one of three routing paths:
|
|
88
|
-
|
|
89
|
-
| Path | Option | Behavior |
|
|
90
|
-
|---|---|---|
|
|
91
|
-
| **Hidden** | `hiddenTools` / `hiddenResources` | Omitted from list responses; rejected with an error at call time |
|
|
92
|
-
| **Pass-through** | `passThroughTools` / `passThroughResources` | Forwarded raw to upstream — all middleware skipped |
|
|
93
|
-
| **Middleware** | everything else | Routed through the full `toolMiddleware` / `resourceMiddleware` pipeline |
|
|
94
|
-
|
|
95
|
-
Prompts are forwarded as-is when the upstream supports prompts.
|
|
96
|
-
|
|
97
|
-
The proxy preserves core request semantics end to end:
|
|
98
|
-
|
|
99
|
-
- advertised capabilities are mirrored from the upstream server
|
|
100
|
-
- abort signals are forwarded to upstream tool, resource, and prompt calls
|
|
101
|
-
- upstream progress updates are relayed back to the downstream client
|
|
102
|
-
- list-changed notifications are advertised and fanned out when the upstream supports them
|
|
103
|
-
- `list_tools` responses can be transformed through `listToolsMiddleware` without weakening local `hiddenTools` guarantees
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## Middleware model
|
|
108
|
-
|
|
109
|
-
Middleware follows the **onion model**: outer layers run code before *and* after inner layers. Each middleware receives the request, a `next` function to invoke the rest of the pipeline, and a normalized `ProxyContext`.
|
|
110
|
-
|
|
111
|
-
```
|
|
112
|
-
request ──►
|
|
113
|
-
┌──────────────────────────────────────────┐
|
|
114
|
-
│ outerMW (enter) │
|
|
115
|
-
│ ┌────────────────────────────────────┐ │
|
|
116
|
-
│ │ innerMW (enter) │ │
|
|
117
|
-
│ │ ┌──────────────────────────────┐ │ │
|
|
118
|
-
│ │ │ upstream call │ │ │
|
|
119
|
-
│ │ └──────────────────────────────┘ │ │
|
|
120
|
-
│ │ innerMW (exit) ◄── response │ │
|
|
121
|
-
│ └────────────────────────────────────┘ │
|
|
122
|
-
│ outerMW (exit) ◄── response │
|
|
123
|
-
└──────────────────────────────────────────┘
|
|
124
|
-
◄── response
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
**Array order in `ProxyOptions`** uses **response-processing order**: the first element processes the response *first* (innermost layer). `ProxyOptions` calls `pipe()` internally — no need to wrap manually. To guarantee audit never sees raw PII:
|
|
128
|
-
|
|
129
|
-
```ts
|
|
130
|
-
toolMiddleware: [piiMW, auditMW]
|
|
131
|
-
// Execution:
|
|
132
|
-
// 1. auditMW enter → capture startTime (outermost)
|
|
133
|
-
// 2. piiMW enter → transform request
|
|
134
|
-
// 3. upstream call
|
|
135
|
-
// 4. piiMW exit → redact PII from response (processes response first)
|
|
136
|
-
// 5. auditMW exit → log already-clean data (processes response last)
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
`compose([outerMW, innerMW])` uses the **opposite** (outermost-first) convention — `ProxyOptions` arrays are **not** interchangeable with `compose()` arguments.
|
|
140
|
-
|
|
141
|
-
A middleware can **short-circuit** by returning without calling `next`, or **handle upstream errors** by wrapping `await next(req)` in a try/catch. Existing two-argument middleware keeps working unchanged; `mcpose` supplies `ProxyContext` as an optional third argument.
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
## API Reference
|
|
146
|
-
|
|
147
|
-
### `ProxyContext` · `Middleware<Req, Res>` · `ToolMiddleware` · `ResourceMiddleware` · `ListToolsMiddleware` · `compose()` · `createProxyContext()`
|
|
148
|
-
|
|
149
|
-
```ts
|
|
150
|
-
interface ProxyContext {
|
|
151
|
-
requestId: string;
|
|
152
|
-
transport: 'stdio' | 'http';
|
|
153
|
-
sessionId?: string;
|
|
154
|
-
headers?: Readonly<Record<string, string>>;
|
|
155
|
-
signal?: AbortSignal;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Builds a ProxyContext with a fresh requestId; useful in tests or custom orchestration:
|
|
159
|
-
function createProxyContext(overrides?: Partial<ProxyContext>): ProxyContext;
|
|
160
|
-
|
|
161
|
-
type Middleware<Req, Res> = (
|
|
162
|
-
req: Req,
|
|
163
|
-
next: (req: Req) => Promise<Res>,
|
|
164
|
-
context: ProxyContext,
|
|
165
|
-
) => Promise<Res>;
|
|
166
|
-
|
|
167
|
-
// Convenience aliases for the three pipeline types:
|
|
168
|
-
type ToolMiddleware = Middleware<CallToolRequest, CompatibilityCallToolResult>;
|
|
169
|
-
type ResourceMiddleware = Middleware<ReadResourceRequest, ReadResourceResult>;
|
|
170
|
-
type ListToolsMiddleware = Middleware<ListToolsRequest, ListToolsResult>;
|
|
171
|
-
|
|
172
|
-
function compose<Req, Res>(
|
|
173
|
-
middlewares: ReadonlyArray<Middleware<Req, Res>>,
|
|
174
|
-
): {
|
|
175
|
-
(req: Req, next: (req: Req) => Promise<Res>): Promise<Res>;
|
|
176
|
-
(req: Req, next: (req: Req) => Promise<Res>, context: ProxyContext): Promise<Res>;
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
// Type guard — narrows CompatibilityCallToolResult to CallToolResult
|
|
180
|
-
// (safe access to .content and .isError without casts):
|
|
181
|
-
function hasToolContent(r: CompatibilityCallToolResult): r is CallToolResult;
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
`compose` takes an array in **outermost-first** order. Use `hasToolContent` in middleware implementations before accessing `.content` or `.isError`, since `CompatibilityCallToolResult` also covers the legacy `{ toolResult }` shape. `ProxyContext.signal` carries the downstream abort signal when the transport provides one.
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
### `BackendConfig` · `createBackendClient()`
|
|
189
|
-
|
|
190
|
-
```ts
|
|
191
|
-
interface BackendConfig {
|
|
192
|
-
command?: string; // Executable to spawn for stdio transport (e.g., "node")
|
|
193
|
-
args?: string[]; // Arguments for the spawned process
|
|
194
|
-
url?: string; // HTTP endpoint of a running MCP server (takes precedence over stdio)
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
async function createBackendClient(config: BackendConfig): Promise<BackendClient>;
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
`BackendClient` is an alias for the SDK `Client`. It throws if neither `command` nor `url` is provided, or if the connection fails.
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
### `ProxyOptions` · `startProxy()` · `createProxyServer()`
|
|
205
|
-
|
|
206
|
-
```ts
|
|
207
|
-
interface ProxyOptions {
|
|
208
|
-
toolMiddleware?: ReadonlyArray<ToolMiddleware>;
|
|
209
|
-
resourceMiddleware?: ReadonlyArray<ResourceMiddleware>;
|
|
210
|
-
listToolsMiddleware?: ReadonlyArray<ListToolsMiddleware>;
|
|
211
|
-
passThroughTools?: ReadonlyArray<string>;
|
|
212
|
-
passThroughResources?: ReadonlyArray<string>;
|
|
213
|
-
hiddenTools?: ReadonlyArray<string>;
|
|
214
|
-
hiddenResources?: ReadonlyArray<string>;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
async function startProxy(backend: BackendClient, options?: ProxyOptions): Promise<void>;
|
|
218
|
-
function createProxyServer(backend: BackendClient, options?: ProxyOptions): Server;
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
| Option | Description |
|
|
222
|
-
|---|---|
|
|
223
|
-
| `toolMiddleware` | Middleware stack for tool calls, in response-processing order (first element processes response first). |
|
|
224
|
-
| `resourceMiddleware` | Middleware stack for resource reads, in response-processing order. |
|
|
225
|
-
| `listToolsMiddleware` | Middleware stack for `list_tools`, in response-processing order. Local `hiddenTools` filtering still runs before and after this pipeline. |
|
|
226
|
-
| `passThroughTools` | Tool names forwarded raw to upstream — middleware skipped entirely. |
|
|
227
|
-
| `passThroughResources` | Resource URIs forwarded raw to upstream — middleware skipped entirely. |
|
|
228
|
-
| `hiddenTools` | Tool names removed from `list_tools` **and** rejected at call time with `MethodNotFound`. |
|
|
229
|
-
| `hiddenResources` | Resource URIs removed from `list_resources` **and** rejected at call time with `InvalidRequest`. |
|
|
230
|
-
|
|
231
|
-
`createProxyServer` mirrors only the upstream capabilities exposed by `backend.getServerCapabilities()`. Unsupported prompt, resource, and tool endpoints are not advertised or registered.
|
|
232
|
-
|
|
233
|
-
`startProxy` connects the proxy to a `StdioServerTransport`. `createProxyServer` returns the configured `Server` without connecting — useful for testing request handlers without a live transport.
|
|
234
|
-
|
|
235
|
-
---
|
|
236
|
-
|
|
237
|
-
### `HttpProxyOptions` · `startHttpProxy()`
|
|
238
|
-
|
|
239
|
-
```ts
|
|
240
|
-
interface HttpProxyOptions {
|
|
241
|
-
port?: number; // Default: 3000
|
|
242
|
-
host?: string; // Default: all interfaces
|
|
243
|
-
path?: string; // Default: '/mcp'
|
|
244
|
-
onRequest?: (req: http.IncomingMessage, res: http.ServerResponse) => boolean | Promise<boolean>;
|
|
245
|
-
onError?: (err: unknown) => void;
|
|
246
|
-
maxBodyBytes?: number; // Default: 4 MB — returns 413 on excess
|
|
247
|
-
maxSessions?: number; // Excess requests return 503
|
|
248
|
-
sessionTtlMs?: number; // Sessions auto-close after this duration
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
function startHttpProxy(
|
|
252
|
-
backend: BackendClient,
|
|
253
|
-
options?: ProxyOptions,
|
|
254
|
-
httpOptions?: HttpProxyOptions,
|
|
255
|
-
): Promise<http.Server>;
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
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.
|
|
259
|
-
|
|
260
|
-
```ts
|
|
261
|
-
import { createBackendClient, startHttpProxy } from 'mcpose';
|
|
262
|
-
|
|
263
|
-
const backend = await createBackendClient({ url: 'http://upstream-mcp-server/mcp' });
|
|
264
|
-
const server = await startHttpProxy(backend, { toolMiddleware: [loggingMW] }, { port: 8080 });
|
|
265
|
-
// HTTP server is now listening on port 8080 at /mcp
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
On shutdown, active proxy sessions are closed before the underlying `http.Server` finishes closing.
|
|
269
|
-
|
|
270
|
-
**Limitations:**
|
|
271
|
-
- SSE reconnect replay is not supported (no `EventStore`).
|
|
272
|
-
|
|
273
|
-
---
|
|
274
|
-
|
|
275
|
-
### `mcpose/testing`
|
|
276
|
-
|
|
277
|
-
```ts
|
|
278
|
-
import { createMockBackendClient, runToolMiddleware } from 'mcpose/testing';
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
`createMockBackendClient()` returns an in-memory backend stub with capability lookup and notification hooks. It works with both `createProxyServer()` and `startHttpProxy()` tests.
|
|
282
|
-
|
|
283
|
-
---
|
|
284
|
-
|
|
285
|
-
## Recipe: list_tools rewriting
|
|
286
|
-
|
|
287
|
-
Use `listToolsMiddleware` when you want to rewrite the visible tool catalog without changing local routing guarantees:
|
|
288
|
-
|
|
289
|
-
```ts
|
|
290
|
-
import type { ListToolsMiddleware } from 'mcpose';
|
|
291
|
-
|
|
292
|
-
const enrichDescriptions: ListToolsMiddleware = async (req, next, context) => {
|
|
293
|
-
const result = await next(req);
|
|
294
|
-
return {
|
|
295
|
-
...result,
|
|
296
|
-
tools: result.tools.map((tool) =>
|
|
297
|
-
tool.name === 'wire_transfer'
|
|
298
|
-
? {
|
|
299
|
-
...tool,
|
|
300
|
-
description: `${tool.description ?? 'Wire transfer'} (approval required on ${context.transport})`,
|
|
301
|
-
}
|
|
302
|
-
: tool,
|
|
303
|
-
),
|
|
304
|
-
};
|
|
305
|
-
};
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
`hiddenTools` remains authoritative even if a `listToolsMiddleware` tries to add a hidden tool back into the response.
|
|
309
|
-
|
|
310
|
-
---
|
|
311
|
-
|
|
312
|
-
## Recipe: PII redaction
|
|
313
|
-
|
|
314
|
-
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.
|
|
315
|
-
|
|
316
|
-
Use a factory to keep middleware configurable and testable:
|
|
317
|
-
|
|
318
|
-
```ts
|
|
319
|
-
import { hasToolContent } from 'mcpose';
|
|
320
|
-
import type { ToolMiddleware } from 'mcpose';
|
|
321
|
-
|
|
322
|
-
function createPiiMiddleware(patterns: RegExp[]): ToolMiddleware {
|
|
323
|
-
return async (req, next) => {
|
|
324
|
-
const result = await next(req);
|
|
325
|
-
if (!hasToolContent(result)) return result;
|
|
326
|
-
return {
|
|
327
|
-
...result,
|
|
328
|
-
content: result.content.map((item) =>
|
|
329
|
-
item.type === 'text'
|
|
330
|
-
? { ...item, text: redactPii(item.text, patterns) }
|
|
331
|
-
: item,
|
|
332
|
-
),
|
|
333
|
-
};
|
|
334
|
-
};
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
function redactPii(text: string, patterns: RegExp[]): string {
|
|
338
|
-
return patterns.reduce((t, re) => t.replace(re, '[REDACTED]'), text);
|
|
339
|
-
}
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
Stack it with audit middleware — PII first in the array so audit always sees clean data:
|
|
343
|
-
|
|
344
|
-
```ts
|
|
345
|
-
await startProxy(backend, {
|
|
346
|
-
toolMiddleware: [
|
|
347
|
-
createPiiMiddleware([/\b\d{9}\b/g, /[A-Z]{2}\d{6}/g]), // SSNs, account numbers
|
|
348
|
-
createAuditMiddleware({ destination: auditLog }),
|
|
349
|
-
],
|
|
350
|
-
});
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
The array order guarantees: PII is redacted *before* the audit layer ever sees the response. No raw PII reaches a log, satisfying financial regulatory requirements.
|
|
354
|
-
|
|
355
|
-
> **Reference implementation:** [`elastic-pii-proxy`](https://github.com/amir-gorji/elastic-pii-proxy) is a production example of this pattern — an Elasticsearch MCP proxy that uses mcpose with a PII redaction middleware and an audit middleware to serve financial data safely to LLM agents.
|
|
356
|
-
|
|
357
|
-
---
|
|
358
|
-
|
|
359
|
-
## Roadmap
|
|
360
|
-
|
|
361
|
-
- [x] **HTTP/SSE server transport** — `startHttpProxy()` adds a Streamable HTTP server-side transport with stateful sessions
|
|
362
|
-
- [ ] **ATXP protocol support** — enable MCP monetization by implementing the ATXP (Agent Transaction Protocol) standard, letting tool providers attach pricing and billing metadata to responses
|
|
363
|
-
|
|
364
|
-
---
|
|
365
|
-
|
|
366
|
-
## License
|
|
367
|
-
|
|
368
|
-
MIT
|