@luutuankiet/mcp-proxy-shim 1.0.6 → 1.0.8

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 ADDED
@@ -0,0 +1,40 @@
1
+ /**
2
+ * MCP Proxy Shim — Shared Core
3
+ *
4
+ * Contains all upstream session management, schema transformation,
5
+ * response unwrapping, and tool handling logic shared between
6
+ * stdio and HTTP server entry points.
7
+ */
8
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
9
+ export declare const UPSTREAM_URL: string;
10
+ export declare const REQUEST_TIMEOUT_MS = 120000;
11
+ export declare const MAX_RETRIES = 2;
12
+ export declare function log(...args: unknown[]): void;
13
+ /** Mask credentials in log output */
14
+ export declare function maskUrl(url: string): string;
15
+ export declare function ensureSession(): Promise<void>;
16
+ export interface ToolSchema {
17
+ name: string;
18
+ description?: string;
19
+ inputSchema?: {
20
+ type: string;
21
+ properties?: Record<string, unknown>;
22
+ required?: string[];
23
+ [k: string]: unknown;
24
+ };
25
+ [k: string]: unknown;
26
+ }
27
+ export interface ShimServerOptions {
28
+ /**
29
+ * If true, skip eager upstream initialization. Upstream session will be
30
+ * established lazily on first tool call (via ensureSession).
31
+ * Useful for HTTP server mode where we want the server to start even
32
+ * if upstream is temporarily unavailable.
33
+ */
34
+ lazyInit?: boolean;
35
+ }
36
+ /**
37
+ * Create and wire up an MCP Server with all shim handlers.
38
+ * Caller connects their chosen transport (stdio or HTTP).
39
+ */
40
+ export declare function createShimServer(options?: ShimServerOptions): Promise<Server>;
package/dist/core.js ADDED
@@ -0,0 +1,496 @@
1
+ /**
2
+ * MCP Proxy Shim — Shared Core
3
+ *
4
+ * Contains all upstream session management, schema transformation,
5
+ * response unwrapping, and tool handling logic shared between
6
+ * stdio and HTTP server entry points.
7
+ */
8
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
9
+ import { ListToolsRequestSchema, CallToolRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
10
+ // Proxy support — Node 22 built-in undici honors https_proxy via ProxyAgent
11
+ import { createRequire } from "node:module";
12
+ const _require = createRequire(import.meta.url);
13
+ const { ProxyAgent } = _require("undici");
14
+ // ---------------------------------------------------------------------------
15
+ // Config
16
+ // ---------------------------------------------------------------------------
17
+ export const UPSTREAM_URL = process.env.MCP_URL ?? (() => {
18
+ console.error("[mcp-shim] Fatal: MCP_URL environment variable is required.");
19
+ console.error("[mcp-shim] Example: MCP_URL='https://your-proxy/mcp/?apikey=KEY' mcp-proxy-shim");
20
+ process.exit(1);
21
+ })();
22
+ export const REQUEST_TIMEOUT_MS = 120_000;
23
+ export const MAX_RETRIES = 2;
24
+ // Auto-detect HTTPS proxy from environment
25
+ const PROXY_URL = process.env.https_proxy || process.env.HTTPS_PROXY || "";
26
+ const proxyDispatcher = PROXY_URL ? new ProxyAgent(PROXY_URL) : undefined;
27
+ // Tools whose schemas get transformed (args_json:string → args:object)
28
+ const CALL_TOOL_NAMES = new Set([
29
+ "call_tool_read",
30
+ "call_tool_write",
31
+ "call_tool_destructive",
32
+ ]);
33
+ // ---------------------------------------------------------------------------
34
+ // Shim-local tools (not forwarded upstream)
35
+ // ---------------------------------------------------------------------------
36
+ const DESCRIBE_TOOLS_SCHEMA = {
37
+ name: "describe_tools",
38
+ description: "Get full schemas for specific tools by name. Use after retrieve_tools to hydrate " +
39
+ "compact results with complete inputSchema and descriptions. Accepts multiple tool " +
40
+ "names for token-efficient batch lookup.",
41
+ inputSchema: {
42
+ type: "object",
43
+ properties: {
44
+ names: {
45
+ type: "array",
46
+ items: { type: "string" },
47
+ description: "Tool names to describe — use the 'name' field from retrieve_tools results",
48
+ },
49
+ },
50
+ required: ["names"],
51
+ },
52
+ };
53
+ // ---------------------------------------------------------------------------
54
+ // Upstream MCP session (manual HTTP — avoids SDK client bugs)
55
+ // ---------------------------------------------------------------------------
56
+ let sessionId = null;
57
+ let reqId = 0;
58
+ export function log(...args) {
59
+ // stderr only — stdout is the stdio transport
60
+ console.error("[mcp-shim]", ...args);
61
+ }
62
+ /** Mask credentials in log output */
63
+ export function maskUrl(url) {
64
+ return url.replace(/apikey=[^&\s]+/gi, "apikey=***").replace(/\/\/[^@]*@/, "//***@");
65
+ }
66
+ /**
67
+ * Send a JSON-RPC request/notification to upstream mcpproxy-go.
68
+ * Handles session header, timeouts, and basic retry on transient failures.
69
+ */
70
+ async function mcpRequest(method, params, isNotification = false) {
71
+ const body = { jsonrpc: "2.0", method, params };
72
+ if (!isNotification) {
73
+ body.id = ++reqId;
74
+ }
75
+ const headers = {
76
+ "Content-Type": "application/json",
77
+ Accept: "application/json, text/event-stream",
78
+ };
79
+ if (sessionId) {
80
+ headers["Mcp-Session-Id"] = sessionId;
81
+ }
82
+ let lastError = null;
83
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
84
+ try {
85
+ const fetchOpts = {
86
+ method: "POST",
87
+ headers,
88
+ body: JSON.stringify(body),
89
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
90
+ };
91
+ if (proxyDispatcher) {
92
+ fetchOpts.dispatcher = proxyDispatcher;
93
+ }
94
+ const resp = await fetch(UPSTREAM_URL, fetchOpts);
95
+ // Capture session ID from response headers
96
+ const sid = resp.headers.get("mcp-session-id");
97
+ if (sid)
98
+ sessionId = sid;
99
+ // Notifications get 202 with no body
100
+ if (isNotification || resp.status === 202) {
101
+ return null;
102
+ }
103
+ if (!resp.ok) {
104
+ const text = await resp.text();
105
+ throw new Error(`Upstream HTTP ${resp.status}: ${text.slice(0, 500)}`);
106
+ }
107
+ // Handle SSE vs JSON response
108
+ const contentType = resp.headers.get("content-type") || "";
109
+ if (contentType.includes("text/event-stream")) {
110
+ return await parseSseResponse(resp);
111
+ }
112
+ return (await resp.json());
113
+ }
114
+ catch (err) {
115
+ lastError = err;
116
+ if (attempt < MAX_RETRIES) {
117
+ const delay = 1000 * 2 ** attempt; // 1s, 2s
118
+ log(`Retry ${attempt + 1}/${MAX_RETRIES} after ${delay}ms:`, lastError.message);
119
+ await sleep(delay);
120
+ }
121
+ }
122
+ }
123
+ throw lastError || new Error("mcpRequest failed");
124
+ }
125
+ async function parseSseResponse(resp) {
126
+ const text = await resp.text();
127
+ const lines = text.split("\n");
128
+ let lastData = null;
129
+ for (const line of lines) {
130
+ if (line.startsWith("data: ")) {
131
+ lastData = line.slice(6);
132
+ }
133
+ }
134
+ if (lastData) {
135
+ try {
136
+ return JSON.parse(lastData);
137
+ }
138
+ catch {
139
+ // fall through
140
+ }
141
+ }
142
+ throw new Error("No valid JSON-RPC response in SSE stream");
143
+ }
144
+ function sleep(ms) {
145
+ return new Promise((r) => setTimeout(r, ms));
146
+ }
147
+ // ---------------------------------------------------------------------------
148
+ // Upstream session lifecycle
149
+ // ---------------------------------------------------------------------------
150
+ async function initUpstream() {
151
+ log("Initializing upstream session...");
152
+ const resp = await mcpRequest("initialize", {
153
+ protocolVersion: "2024-11-05",
154
+ capabilities: {},
155
+ clientInfo: { name: "mcp-stdio-shim", version: "1.0.0" },
156
+ });
157
+ if (!sessionId) {
158
+ throw new Error("No session ID received from upstream after initialize");
159
+ }
160
+ log("Session ID:", sessionId.slice(0, 12) + "...");
161
+ // Send initialized notification (MCP spec requirement)
162
+ await mcpRequest("notifications/initialized", {}, true);
163
+ }
164
+ export async function ensureSession() {
165
+ if (!sessionId) {
166
+ await initUpstream();
167
+ }
168
+ }
169
+ async function reinitOnExpiry() {
170
+ log("Session may have expired — re-initializing...");
171
+ sessionId = null;
172
+ try {
173
+ await initUpstream();
174
+ return true;
175
+ }
176
+ catch (err) {
177
+ log("Re-init failed:", err.message);
178
+ return false;
179
+ }
180
+ }
181
+ function transformToolSchema(tool) {
182
+ if (!CALL_TOOL_NAMES.has(tool.name))
183
+ return tool;
184
+ if (!tool.inputSchema?.properties)
185
+ return tool;
186
+ const props = { ...tool.inputSchema.properties };
187
+ if (!("args_json" in props))
188
+ return tool;
189
+ delete props.args_json;
190
+ props.args = {
191
+ type: "object",
192
+ description: "Tool arguments as a native JSON object. The shim serializes this to args_json before forwarding upstream.",
193
+ additionalProperties: true,
194
+ };
195
+ let required = tool.inputSchema.required;
196
+ if (required) {
197
+ required = required.map((r) => (r === "args_json" ? "args" : r));
198
+ }
199
+ return {
200
+ ...tool,
201
+ inputSchema: {
202
+ ...tool.inputSchema,
203
+ properties: props,
204
+ ...(required ? { required } : {}),
205
+ },
206
+ };
207
+ }
208
+ function transformToolCallArgs(toolName, args) {
209
+ if (!CALL_TOOL_NAMES.has(toolName))
210
+ return args;
211
+ if ("args_json" in args)
212
+ return args;
213
+ if ("args" in args) {
214
+ const { args: argsObj, ...rest } = args;
215
+ return {
216
+ ...rest,
217
+ args_json: JSON.stringify(argsObj),
218
+ };
219
+ }
220
+ return args;
221
+ }
222
+ // ---------------------------------------------------------------------------
223
+ // Response unwrapping (deep, recursive)
224
+ // ---------------------------------------------------------------------------
225
+ function isMcpContentWrapper(obj) {
226
+ if (!obj || typeof obj !== "object" || Array.isArray(obj))
227
+ return false;
228
+ const o = obj;
229
+ if (!Array.isArray(o.content) || o.content.length === 0)
230
+ return false;
231
+ const first = o.content[0];
232
+ return first?.type === "text" && typeof first?.text === "string";
233
+ }
234
+ function deepParseText(text, maxDepth = 5) {
235
+ let value = text;
236
+ let depth = 0;
237
+ while (typeof value === "string" && depth < maxDepth) {
238
+ try {
239
+ const parsed = JSON.parse(value);
240
+ if (isMcpContentWrapper(parsed)) {
241
+ if (parsed.content.length === 1) {
242
+ value = parsed.content[0].text;
243
+ depth++;
244
+ continue;
245
+ }
246
+ return parsed.content.map((c) => c.type === "text" ? deepParseText(c.text, maxDepth - depth - 1) : c);
247
+ }
248
+ return parsed;
249
+ }
250
+ catch {
251
+ break;
252
+ }
253
+ }
254
+ return value;
255
+ }
256
+ function deepUnwrapResult(result) {
257
+ if (!isMcpContentWrapper(result))
258
+ return result;
259
+ if (result.content.length === 1) {
260
+ return deepParseText(result.content[0].text);
261
+ }
262
+ return result.content.map((c) => c.type === "text" ? deepParseText(c.text) : c);
263
+ }
264
+ function unwrapAndRewrap(result) {
265
+ const unwrapped = deepUnwrapResult(result);
266
+ if (isMcpContentWrapper(unwrapped)) {
267
+ return unwrapped;
268
+ }
269
+ const text = typeof unwrapped === "string" ? unwrapped : JSON.stringify(unwrapped);
270
+ return { content: [{ type: "text", text }] };
271
+ }
272
+ function compactRetrieveTools(unwrapped, args) {
273
+ const compact = args.compact !== false;
274
+ const limit = typeof args.limit === "number" ? args.limit : 0;
275
+ let result = unwrapped;
276
+ let tools = Array.isArray(result)
277
+ ? result
278
+ : (result && Array.isArray(result.tools) ? result.tools : undefined);
279
+ let wasCompacted = false;
280
+ if (compact && tools) {
281
+ const fullJson = JSON.stringify(tools);
282
+ if (fullJson.length > 5000) {
283
+ wasCompacted = true;
284
+ tools = tools.map((t) => {
285
+ const tool = t;
286
+ return {
287
+ server: tool.server,
288
+ name: tool.name,
289
+ call_with: tool.call_with,
290
+ description: typeof tool.description === "string"
291
+ ? tool.description.slice(0, 100) + (tool.description.length > 100 ? "..." : "")
292
+ : undefined,
293
+ };
294
+ });
295
+ }
296
+ }
297
+ if (limit > 0 && tools) {
298
+ tools = tools.slice(0, limit);
299
+ }
300
+ let output;
301
+ if (Array.isArray(result)) {
302
+ output = tools || result;
303
+ }
304
+ else if (result && typeof result === "object" && tools) {
305
+ output = {
306
+ ...result,
307
+ tools,
308
+ ...(wasCompacted ? {
309
+ note: "Results are compacted (inputSchema stripped). Before calling a tool, use describe_tools({names: [tool.name]}) to get the full inputSchema and avoid parameter errors.",
310
+ } : {}),
311
+ };
312
+ }
313
+ else {
314
+ output = unwrapped;
315
+ }
316
+ const text = typeof output === "string" ? output : JSON.stringify(output);
317
+ return { content: [{ type: "text", text }] };
318
+ }
319
+ // ---------------------------------------------------------------------------
320
+ // Upstream tool list (cached, refreshed on tools/list)
321
+ // ---------------------------------------------------------------------------
322
+ let cachedTools = null;
323
+ async function fetchUpstreamTools() {
324
+ await ensureSession();
325
+ const resp = await mcpRequest("tools/list", {});
326
+ if (!resp || resp.error) {
327
+ throw new Error(`Failed to list upstream tools: ${JSON.stringify(resp?.error || "no response")}`);
328
+ }
329
+ const result = resp.result;
330
+ const tools = result?.tools || [];
331
+ log(`Fetched ${tools.length} upstream tools`);
332
+ return tools;
333
+ }
334
+ /**
335
+ * Create and wire up an MCP Server with all shim handlers.
336
+ * Caller connects their chosen transport (stdio or HTTP).
337
+ */
338
+ export async function createShimServer(options = {}) {
339
+ log("Upstream:", maskUrl(UPSTREAM_URL));
340
+ if (proxyDispatcher) {
341
+ log("Using HTTPS proxy:", maskUrl(PROXY_URL));
342
+ }
343
+ if (!options.lazyInit) {
344
+ // Eager init: connect upstream and fetch tools immediately
345
+ await initUpstream();
346
+ cachedTools = await fetchUpstreamTools();
347
+ const transformed = cachedTools.map(transformToolSchema);
348
+ const callToolCount = transformed.filter((t) => CALL_TOOL_NAMES.has(t.name)).length;
349
+ log(`Ready: ${transformed.length} tools (${callToolCount} with schema transform)`);
350
+ }
351
+ else {
352
+ log("Lazy init mode — upstream session will be established on first request");
353
+ }
354
+ // 3. Create MCP server (transport-agnostic)
355
+ const server = new Server({ name: "mcp-proxy-shim", version: "1.0.0" }, { capabilities: { tools: {} } });
356
+ // Handle tools/list
357
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
358
+ try {
359
+ cachedTools = await fetchUpstreamTools();
360
+ }
361
+ catch (err) {
362
+ log("Tool refresh failed, using cached:", err.message);
363
+ if (!cachedTools)
364
+ throw err;
365
+ }
366
+ return {
367
+ tools: [
368
+ ...cachedTools.map(transformToolSchema),
369
+ DESCRIBE_TOOLS_SCHEMA,
370
+ ],
371
+ };
372
+ });
373
+ // Handle tools/call
374
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
375
+ const { name, arguments: args } = request.params;
376
+ // --- Shim-local: describe_tools ---
377
+ if (name === "describe_tools") {
378
+ const names = (args?.names ?? []);
379
+ if (!Array.isArray(names) || names.length === 0) {
380
+ return {
381
+ content: [{ type: "text", text: JSON.stringify({ error: "names array is required" }) }],
382
+ isError: true,
383
+ };
384
+ }
385
+ await ensureSession();
386
+ const nameSet = new Set(names);
387
+ const queries = new Set();
388
+ for (const n of nameSet) {
389
+ const parts = n.split("__");
390
+ const toolPart = parts[parts.length - 1] || n;
391
+ queries.add(toolPart.replace(/_/g, " "));
392
+ }
393
+ const index = new Map();
394
+ for (const query of queries) {
395
+ try {
396
+ log("describe_tools: querying upstream retrieve_tools with:", query);
397
+ const resp = await mcpRequest("tools/call", {
398
+ name: "retrieve_tools",
399
+ arguments: { query },
400
+ });
401
+ log("describe_tools: resp exists:", !!resp, "resp.result exists:", !!resp?.result);
402
+ if (resp?.result) {
403
+ const unwrapped = deepUnwrapResult(resp.result);
404
+ log("describe_tools: unwrapped type:", typeof unwrapped, "isArray:", Array.isArray(unwrapped));
405
+ if (unwrapped && typeof unwrapped === "object" && !Array.isArray(unwrapped)) {
406
+ log("describe_tools: unwrapped keys:", Object.keys(unwrapped).join(", "));
407
+ }
408
+ const result = unwrapped;
409
+ const tools = Array.isArray(result)
410
+ ? result
411
+ : (result && Array.isArray(result.tools) ? result.tools : []);
412
+ log("describe_tools: found", tools.length, "tools from query");
413
+ for (const t of tools) {
414
+ const tool = t;
415
+ if (tool.name && !index.has(tool.name)) {
416
+ index.set(tool.name, tool);
417
+ }
418
+ }
419
+ }
420
+ }
421
+ catch (err) {
422
+ log("describe_tools query failed:", query, err.message);
423
+ }
424
+ }
425
+ log("describe_tools: index has", index.size, "tools, looking up:", names.join(", "));
426
+ const results = names.map((n) => {
427
+ const tool = index.get(n);
428
+ if (!tool)
429
+ return { name: n, error: "not found" };
430
+ return transformToolSchema(tool);
431
+ });
432
+ return {
433
+ content: [{ type: "text", text: JSON.stringify(results) }],
434
+ };
435
+ }
436
+ const forwardArgs = transformToolCallArgs(name, args || {});
437
+ try {
438
+ await ensureSession();
439
+ const resp = await mcpRequest("tools/call", {
440
+ name,
441
+ arguments: forwardArgs,
442
+ });
443
+ if (!resp) {
444
+ return {
445
+ content: [{ type: "text", text: "No response from upstream" }],
446
+ isError: true,
447
+ };
448
+ }
449
+ if (resp.error) {
450
+ if (resp.error.message?.includes("session") ||
451
+ resp.error.message?.includes("Session") ||
452
+ resp.error.code === -32001) {
453
+ const ok = await reinitOnExpiry();
454
+ if (ok) {
455
+ const retry = await mcpRequest("tools/call", {
456
+ name,
457
+ arguments: forwardArgs,
458
+ });
459
+ if (retry && !retry.error) {
460
+ if (name === "retrieve_tools") {
461
+ return compactRetrieveTools(deepUnwrapResult(retry.result), args || {});
462
+ }
463
+ return unwrapAndRewrap(retry.result);
464
+ }
465
+ }
466
+ }
467
+ return {
468
+ content: [
469
+ {
470
+ type: "text",
471
+ text: JSON.stringify(resp.error),
472
+ },
473
+ ],
474
+ isError: true,
475
+ };
476
+ }
477
+ if (name === "retrieve_tools") {
478
+ return compactRetrieveTools(deepUnwrapResult(resp.result), args || {});
479
+ }
480
+ return unwrapAndRewrap(resp.result);
481
+ }
482
+ catch (err) {
483
+ const msg = err.message;
484
+ log("Tool call error:", name, msg);
485
+ if (msg.includes("fetch") || msg.includes("abort") || msg.includes("ECONNR")) {
486
+ await reinitOnExpiry();
487
+ }
488
+ return {
489
+ content: [{ type: "text", text: `Error: ${msg}` }],
490
+ isError: true,
491
+ };
492
+ }
493
+ });
494
+ return server;
495
+ }
496
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Proxy Shim — HTTP Streamable Server Entry Point
4
+ *
5
+ * Runs the schema-transforming MCP proxy as an HTTP Streamable server.
6
+ * Remote agents connect via HTTP POST/GET/DELETE to /mcp.
7
+ *
8
+ * Architecture:
9
+ * Remote Agent ──HTTP──▶ this server (:3000/mcp) ──HTTP──▶ mcpproxy-go (upstream)
10
+ *
11
+ * Each downstream client session gets its own MCP Server + Transport pair,
12
+ * but they all share a SINGLE upstream mcpproxy-go connection (module-level
13
+ * state in core.ts). This is efficient: one upstream session, many downstream.
14
+ *
15
+ * Environment variables:
16
+ * MCP_URL (required) Upstream mcpproxy-go StreamableHTTP endpoint
17
+ * MCP_PORT (optional) Port to listen on (default: 3000)
18
+ * MCP_HOST (optional) Host to bind to (default: 0.0.0.0)
19
+ * MCP_APIKEY (optional) API key for downstream clients. When set, requests
20
+ * must include ?apikey=KEY in the URL. Unset = open.
21
+ * https_proxy (optional) HTTPS proxy for upstream connection
22
+ *
23
+ * Usage:
24
+ * MCP_URL="https://mcpproxy.kenluu.org/mcp/?apikey=KEY" npx @luutuankiet/mcp-proxy-shim-http
25
+ *
26
+ * Then point your MCP client at:
27
+ * http://localhost:3000/mcp
28
+ *
29
+ * For production, put a reverse proxy (Caddy/nginx) in front for TLS:
30
+ * https://shim.yourdomain.com/mcp ──▶ http://localhost:3000/mcp
31
+ */
32
+ export {};