mcp-proxy 2.7.0 → 2.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,6 +11,8 @@ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"
11
11
  import { Client } from "@modelcontextprotocol/sdk/client/index.js";
12
12
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
13
13
  import { EventSource } from "eventsource";
14
+ import { setTimeout } from "node:timers/promises";
15
+ import multiline from "multiline-ts";
14
16
  if (!("EventSource" in global)) {
15
17
  global.EventSource = EventSource;
16
18
  }
@@ -42,7 +44,8 @@ var argv = await yargs(hideBin(process.argv)).scriptName("mcp-proxy").command("$
42
44
  var transport = new StdioClientTransport({
43
45
  command: argv.command,
44
46
  args: argv.args,
45
- env: process.env
47
+ env: process.env,
48
+ stderr: "pipe"
46
49
  });
47
50
  var client = new Client(
48
51
  {
@@ -53,22 +56,50 @@ var client = new Client(
53
56
  capabilities: {}
54
57
  }
55
58
  );
56
- await client.connect(transport);
59
+ var stderrOutput = "";
60
+ try {
61
+ console.info("connecting to the MCP server...");
62
+ const connectionPromise = client.connect(transport);
63
+ transport?.stderr?.on("data", (chunk) => {
64
+ stderrOutput += chunk.toString();
65
+ });
66
+ await connectionPromise;
67
+ console.info("connected to the MCP server");
68
+ } catch (error) {
69
+ console.error(multiline`
70
+ could not connect to the MCP server
71
+
72
+ --- error ---
73
+ ${String(error)}
74
+
75
+ --- stderr output ---
76
+ ${stderrOutput}
77
+ `);
78
+ await setTimeout(1e3);
79
+ process.exit(1);
80
+ }
57
81
  var serverVersion = client.getServerVersion();
58
82
  var serverCapabilities = client.getServerCapabilities();
59
- await startSSEServer({
60
- createServer: async () => {
61
- const server = new Server(serverVersion, {
62
- capabilities: serverCapabilities
63
- });
64
- proxyServer({
65
- server,
66
- client,
67
- serverCapabilities
68
- });
69
- return server;
70
- },
71
- port: argv.port,
72
- endpoint: argv.endpoint
73
- });
83
+ try {
84
+ console.info("starting the SSE server on port %d", argv.port);
85
+ await startSSEServer({
86
+ createServer: async () => {
87
+ const server = new Server(serverVersion, {
88
+ capabilities: serverCapabilities
89
+ });
90
+ proxyServer({
91
+ server,
92
+ client,
93
+ serverCapabilities
94
+ });
95
+ return server;
96
+ },
97
+ port: argv.port,
98
+ endpoint: argv.endpoint
99
+ });
100
+ } catch (error) {
101
+ console.error("could not start the SSE server", error);
102
+ await setTimeout(1e3);
103
+ process.exit(1);
104
+ }
74
105
  //# sourceMappingURL=mcp-proxy.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/mcp-proxy.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { proxyServer, startSSEServer } from \"../MCPProxy.js\";\nimport { EventSource } from \"eventsource\";\n\nif (!(\"EventSource\" in global)) {\n // @ts-expect-error - figure out how to use --experimental-eventsource with vitest\n global.EventSource = EventSource;\n}\n\nconst argv = await yargs(hideBin(process.argv))\n .scriptName(\"mcp-proxy\")\n .command(\"$0 <command> [args...]\", \"Run a command with MCP arguments\")\n .positional(\"command\", {\n type: \"string\",\n describe: \"The command to run\",\n demandOption: true,\n })\n .positional(\"args\", {\n type: \"string\",\n array: true,\n describe: \"The arguments to pass to the command\",\n })\n .options({\n debug: {\n type: \"boolean\",\n describe: \"Enable debug logging\",\n default: false,\n },\n endpoint: {\n type: \"string\",\n describe: \"The endpoint to listen on for SSE\",\n default: \"/sse\",\n },\n port: {\n type: \"number\",\n describe: \"The port to listen on for SSE\",\n default: 8080,\n },\n })\n .help()\n .parseAsync();\n\nconst transport = new StdioClientTransport({\n command: argv.command,\n args: argv.args,\n env: process.env as Record<string, string>,\n});\n\nconst client = new Client(\n {\n name: \"mcp-proxy\",\n version: \"1.0.0\",\n },\n {\n capabilities: {},\n },\n);\n\nawait client.connect(transport);\n\nconst serverVersion = client.getServerVersion() as {\n name: string;\n version: string;\n};\n\nconst serverCapabilities = client.getServerCapabilities() as {};\n\nawait startSSEServer({\n createServer: async () => {\n const server = new Server(serverVersion, {\n capabilities: serverCapabilities,\n });\n\n proxyServer({\n server,\n client,\n serverCapabilities,\n });\n\n return server;\n },\n port: argv.port,\n endpoint: argv.endpoint as `/${string}`,\n});\n"],"mappings":";;;;;;;AAEA,OAAO,WAAW;AAClB,SAAS,eAAe;AACxB,SAAS,4BAA4B;AACrC,SAAS,cAAc;AACvB,SAAS,cAAc;AAEvB,SAAS,mBAAmB;AAE5B,IAAI,EAAE,iBAAiB,SAAS;AAE9B,SAAO,cAAc;AACvB;AAEA,IAAM,OAAO,MAAM,MAAM,QAAQ,QAAQ,IAAI,CAAC,EAC3C,WAAW,WAAW,EACtB,QAAQ,0BAA0B,kCAAkC,EACpE,WAAW,WAAW;AAAA,EACrB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,cAAc;AAChB,CAAC,EACA,WAAW,QAAQ;AAAA,EAClB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AACZ,CAAC,EACA,QAAQ;AAAA,EACP,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AACF,CAAC,EACA,KAAK,EACL,WAAW;AAEd,IAAM,YAAY,IAAI,qBAAqB;AAAA,EACzC,SAAS,KAAK;AAAA,EACd,MAAM,KAAK;AAAA,EACX,KAAK,QAAQ;AACf,CAAC;AAED,IAAM,SAAS,IAAI;AAAA,EACjB;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc,CAAC;AAAA,EACjB;AACF;AAEA,MAAM,OAAO,QAAQ,SAAS;AAE9B,IAAM,gBAAgB,OAAO,iBAAiB;AAK9C,IAAM,qBAAqB,OAAO,sBAAsB;AAExD,MAAM,eAAe;AAAA,EACnB,cAAc,YAAY;AACxB,UAAM,SAAS,IAAI,OAAO,eAAe;AAAA,MACvC,cAAc;AAAA,IAChB,CAAC;AAED,gBAAY;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK;AAAA,EACX,UAAU,KAAK;AACjB,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../src/bin/mcp-proxy.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { proxyServer, startSSEServer } from \"../MCPProxy.js\";\nimport { EventSource } from \"eventsource\";\nimport { setTimeout } from \"node:timers/promises\";\nimport multiline from 'multiline-ts';\n\nif (!(\"EventSource\" in global)) {\n // @ts-expect-error - figure out how to use --experimental-eventsource with vitest\n global.EventSource = EventSource;\n}\n\nconst argv = await yargs(hideBin(process.argv))\n .scriptName(\"mcp-proxy\")\n .command(\"$0 <command> [args...]\", \"Run a command with MCP arguments\")\n .positional(\"command\", {\n type: \"string\",\n describe: \"The command to run\",\n demandOption: true,\n })\n .positional(\"args\", {\n type: \"string\",\n array: true,\n describe: \"The arguments to pass to the command\",\n })\n .options({\n debug: {\n type: \"boolean\",\n describe: \"Enable debug logging\",\n default: false,\n },\n endpoint: {\n type: \"string\",\n describe: \"The endpoint to listen on for SSE\",\n default: \"/sse\",\n },\n port: {\n type: \"number\",\n describe: \"The port to listen on for SSE\",\n default: 8080,\n },\n })\n .help()\n .parseAsync();\n\nconst transport = new StdioClientTransport({\n command: argv.command,\n args: argv.args,\n env: process.env as Record<string, string>,\n stderr: 'pipe',\n});\n\nconst client = new Client(\n {\n name: \"mcp-proxy\",\n version: \"1.0.0\",\n },\n {\n capabilities: {},\n },\n);\n\n\nlet stderrOutput = '';\n\ntry {\n console.info('connecting to the MCP server...');\n\n const connectionPromise = client.connect(transport);\n\n transport?.stderr?.on('data', (chunk) => {\n stderrOutput += chunk.toString();\n });\n\n await connectionPromise;\n\n console.info('connected to the MCP server');\n} catch (error) {\n console.error(multiline`\n could not connect to the MCP server\n\n --- error ---\n ${String(error)}\n\n --- stderr output ---\n ${stderrOutput}\n`);\n\n await setTimeout(1000);\n\n process.exit(1);\n}\n\nconst serverVersion = client.getServerVersion() as {\n name: string;\n version: string;\n};\n\nconst serverCapabilities = client.getServerCapabilities() as {};\n\ntry {\n console.info('starting the SSE server on port %d', argv.port);\n\n await startSSEServer({\n createServer: async () => {\n const server = new Server(serverVersion, {\n capabilities: serverCapabilities,\n });\n \n proxyServer({\n server,\n client,\n serverCapabilities,\n });\n \n return server;\n },\n port: argv.port,\n endpoint: argv.endpoint as `/${string}`,\n });\n} catch (error) {\n console.error('could not start the SSE server', error);\n\n await setTimeout(1000);\n\n process.exit(1);\n}\n"],"mappings":";;;;;;;AAEA,OAAO,WAAW;AAClB,SAAS,eAAe;AACxB,SAAS,4BAA4B;AACrC,SAAS,cAAc;AACvB,SAAS,cAAc;AAEvB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,OAAO,eAAe;AAEtB,IAAI,EAAE,iBAAiB,SAAS;AAE9B,SAAO,cAAc;AACvB;AAEA,IAAM,OAAO,MAAM,MAAM,QAAQ,QAAQ,IAAI,CAAC,EAC3C,WAAW,WAAW,EACtB,QAAQ,0BAA0B,kCAAkC,EACpE,WAAW,WAAW;AAAA,EACrB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,cAAc;AAChB,CAAC,EACA,WAAW,QAAQ;AAAA,EAClB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AACZ,CAAC,EACA,QAAQ;AAAA,EACP,OAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AACF,CAAC,EACA,KAAK,EACL,WAAW;AAEd,IAAM,YAAY,IAAI,qBAAqB;AAAA,EACzC,SAAS,KAAK;AAAA,EACd,MAAM,KAAK;AAAA,EACX,KAAK,QAAQ;AAAA,EACb,QAAQ;AACV,CAAC;AAED,IAAM,SAAS,IAAI;AAAA,EACjB;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc,CAAC;AAAA,EACjB;AACF;AAGA,IAAI,eAAe;AAEnB,IAAI;AACF,UAAQ,KAAK,iCAAiC;AAE9C,QAAM,oBAAoB,OAAO,QAAQ,SAAS;AAElD,aAAW,QAAQ,GAAG,QAAQ,CAAC,UAAU;AACvC,oBAAgB,MAAM,SAAS;AAAA,EACjC,CAAC;AAED,QAAM;AAEN,UAAQ,KAAK,6BAA6B;AAC5C,SAAS,OAAO;AACd,UAAQ,MAAM;AAAA;AAAA;AAAA;AAAA,MAIV,OAAO,KAAK,CAAC;AAAA;AAAA;AAAA,MAGb,YAAY;AAAA,CACjB;AAEC,QAAM,WAAW,GAAI;AAErB,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,gBAAgB,OAAO,iBAAiB;AAK9C,IAAM,qBAAqB,OAAO,sBAAsB;AAExD,IAAI;AACF,UAAQ,KAAK,sCAAsC,KAAK,IAAI;AAE5D,QAAM,eAAe;AAAA,IACnB,cAAc,YAAY;AACxB,YAAM,SAAS,IAAI,OAAO,eAAe;AAAA,QACvC,cAAc;AAAA,MAChB,CAAC;AAED,kBAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK;AAAA,IACX,UAAU,KAAK;AAAA,EACjB,CAAC;AACH,SAAS,OAAO;AACd,UAAQ,MAAM,kCAAkC,KAAK;AAErD,QAAM,WAAW,GAAI;AAErB,UAAQ,KAAK,CAAC;AAChB;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-proxy",
3
- "version": "2.7.0",
3
+ "version": "2.8.1",
4
4
  "main": "dist/MCPProxy.js",
5
5
  "scripts": {
6
6
  "build": "tsup",
@@ -25,6 +25,7 @@
25
25
  "@modelcontextprotocol/sdk": "^1.6.0",
26
26
  "eventsource": "^3.0.5",
27
27
  "fastmcp": "^1.18.0",
28
+ "multiline-ts": "^4.0.1",
28
29
  "yargs": "^17.7.2"
29
30
  },
30
31
  "repository": {
@@ -7,6 +7,8 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
7
7
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
8
8
  import { proxyServer, startSSEServer } from "../MCPProxy.js";
9
9
  import { EventSource } from "eventsource";
10
+ import { setTimeout } from "node:timers/promises";
11
+ import multiline from 'multiline-ts';
10
12
 
11
13
  if (!("EventSource" in global)) {
12
14
  // @ts-expect-error - figure out how to use --experimental-eventsource with vitest
@@ -50,6 +52,7 @@ const transport = new StdioClientTransport({
50
52
  command: argv.command,
51
53
  args: argv.args,
52
54
  env: process.env as Record<string, string>,
55
+ stderr: 'pipe',
53
56
  });
54
57
 
55
58
  const client = new Client(
@@ -62,7 +65,36 @@ const client = new Client(
62
65
  },
63
66
  );
64
67
 
65
- await client.connect(transport);
68
+
69
+ let stderrOutput = '';
70
+
71
+ try {
72
+ console.info('connecting to the MCP server...');
73
+
74
+ const connectionPromise = client.connect(transport);
75
+
76
+ transport?.stderr?.on('data', (chunk) => {
77
+ stderrOutput += chunk.toString();
78
+ });
79
+
80
+ await connectionPromise;
81
+
82
+ console.info('connected to the MCP server');
83
+ } catch (error) {
84
+ console.error(multiline`
85
+ could not connect to the MCP server
86
+
87
+ --- error ---
88
+ ${String(error)}
89
+
90
+ --- stderr output ---
91
+ ${stderrOutput}
92
+ `);
93
+
94
+ await setTimeout(1000);
95
+
96
+ process.exit(1);
97
+ }
66
98
 
67
99
  const serverVersion = client.getServerVersion() as {
68
100
  name: string;
@@ -71,20 +103,30 @@ const serverVersion = client.getServerVersion() as {
71
103
 
72
104
  const serverCapabilities = client.getServerCapabilities() as {};
73
105
 
74
- await startSSEServer({
75
- createServer: async () => {
76
- const server = new Server(serverVersion, {
77
- capabilities: serverCapabilities,
78
- });
106
+ try {
107
+ console.info('starting the SSE server on port %d', argv.port);
108
+
109
+ await startSSEServer({
110
+ createServer: async () => {
111
+ const server = new Server(serverVersion, {
112
+ capabilities: serverCapabilities,
113
+ });
114
+
115
+ proxyServer({
116
+ server,
117
+ client,
118
+ serverCapabilities,
119
+ });
120
+
121
+ return server;
122
+ },
123
+ port: argv.port,
124
+ endpoint: argv.endpoint as `/${string}`,
125
+ });
126
+ } catch (error) {
127
+ console.error('could not start the SSE server', error);
79
128
 
80
- proxyServer({
81
- server,
82
- client,
83
- serverCapabilities,
84
- });
129
+ await setTimeout(1000);
85
130
 
86
- return server;
87
- },
88
- port: argv.port,
89
- endpoint: argv.endpoint as `/${string}`,
90
- });
131
+ process.exit(1);
132
+ }