mcp-stdio-proxy 0.1.29

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/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ /node_modules
2
+
package/LICENSE-MIT ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 nuwax-ai
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md ADDED
@@ -0,0 +1,388 @@
1
+ # mcp-stdio-proxy
2
+
3
+ **[English](README.md)** | **[简体中文](README_zh-CN.md)**
4
+
5
+ ---
6
+
7
+ # mcp-stdio-proxy
8
+
9
+ MCP (Model Context Protocol) client proxy tool that converts remote MCP services (SSE/Streamable HTTP) to local stdio interface.
10
+
11
+ > **Package Name**: `mcp-stdio-proxy`
12
+ > **Command Name**: `mcp-proxy` (shorter)
13
+
14
+ ## Core Features
15
+
16
+ `mcp-proxy` is a lightweight client proxy tool that solves one core problem:
17
+
18
+ **Enabling stdio-only MCP clients to access remote SSE/HTTP MCP services.**
19
+
20
+ ### How It Works
21
+
22
+ ```
23
+ Remote MCP Service (SSE/HTTP) ←→ mcp-proxy ←→ Local Application (stdio)
24
+ ```
25
+
26
+ - **Input**: Remote MCP service URL (supports SSE or Streamable HTTP protocols)
27
+ - **Output**: Local stdio interface (standard input/output)
28
+ - **Purpose**: Protocol conversion + transparent proxy
29
+
30
+ ## Features
31
+
32
+ - 🔄 **Protocol Conversion**: Auto-detect and convert SSE/Streamable HTTP → stdio
33
+ - 🌐 **Remote Access**: Enable local applications to access remote MCP services
34
+ - 🔍 **Auto Protocol Detection**: Intelligently identify service protocol types
35
+ - 🔐 **Authentication Support**: Custom Authorization header and HTTP headers
36
+ - ⚡ **Lightweight & Efficient**: No extra configuration needed, works out of the box
37
+
38
+ ## Installation
39
+
40
+ ### Install from crates.io (Recommended)
41
+
42
+ ```bash
43
+ cargo install mcp-stdio-proxy
44
+ ```
45
+
46
+ ### Build from Source
47
+
48
+ ```bash
49
+ git clone https://github.com/nuwax-ai/mcp-proxy.git
50
+ cd mcp-proxy/mcp-proxy
51
+ cargo build --release
52
+ # Binary located at: target/release/mcp-proxy
53
+ ```
54
+
55
+ ## Quick Start
56
+
57
+ ### Basic Usage
58
+
59
+ ```bash
60
+ # Convert remote SSE service to stdio
61
+ mcp-proxy convert https://example.com/mcp/sse
62
+
63
+ # Or use simplified syntax (backward compatible)
64
+ mcp-proxy https://example.com/mcp/sse
65
+ ```
66
+
67
+ ### Complete Example with Authentication
68
+
69
+ ```bash
70
+ # Use Bearer token authentication
71
+ mcp-proxy convert https://api.example.com/mcp/sse \
72
+ --auth "Bearer your-api-token"
73
+
74
+ # Add custom headers
75
+ mcp-proxy convert https://api.example.com/mcp/sse \
76
+ -H "Authorization=Bearer token" \
77
+ -H "X-Custom-Header=value"
78
+ ```
79
+
80
+ ### Use with MCP Clients
81
+
82
+ ```bash
83
+ # Pipe mcp-proxy output to your MCP client
84
+ mcp-proxy convert https://remote-server.com/mcp \
85
+ --auth "Bearer token" | \
86
+ your-mcp-client
87
+
88
+ # Or use in MCP client configuration
89
+ # Example (Claude Desktop configuration):
90
+ {
91
+ "mcpServers": {
92
+ "remote-service": {
93
+ "command": "mcp-proxy",
94
+ "args": [
95
+ "convert",
96
+ "https://remote-server.com/mcp/sse",
97
+ "--auth",
98
+ "Bearer your-token"
99
+ ]
100
+ }
101
+ }
102
+ }
103
+ ```
104
+
105
+ ## Command Details
106
+
107
+ ### 1. `convert` - Protocol Conversion (Core Command)
108
+
109
+ Convert remote MCP service to local stdio interface.
110
+
111
+ ```bash
112
+ mcp-proxy convert <URL> [options]
113
+ ```
114
+
115
+ **Options:**
116
+
117
+ | Option | Short | Description | Default |
118
+ |--------|-------|-------------|---------|
119
+ | `--auth <TOKEN>` | `-a` | Authentication header (e.g., "Bearer token") | - |
120
+ | `--header <KEY=VALUE>` | `-H` | Custom HTTP headers (can be used multiple times) | - |
121
+ | `--timeout <SECONDS>` | - | Connection timeout in seconds | 30 |
122
+ | `--retries <NUM>` | - | Number of retries | 3 |
123
+ | `--verbose` | `-v` | Verbose output (show debug info) | false |
124
+ | `--quiet` | `-q` | Quiet mode (errors only) | false |
125
+
126
+ **Examples:**
127
+
128
+ ```bash
129
+ # Basic conversion
130
+ mcp-proxy convert https://api.example.com/mcp/sse
131
+
132
+ # With authentication and timeout
133
+ mcp-proxy convert https://api.example.com/mcp/sse \
134
+ --auth "Bearer sk-1234567890" \
135
+ --timeout 60 \
136
+ --retries 5
137
+
138
+ # Add multiple custom headers
139
+ mcp-proxy convert https://api.example.com/mcp \
140
+ -H "Authorization=Bearer token" \
141
+ -H "X-API-Key=your-key" \
142
+ -H "X-Request-ID=abc123"
143
+
144
+ # Verbose mode (view connection process)
145
+ mcp-proxy convert https://api.example.com/mcp/sse --verbose
146
+ ```
147
+
148
+ ### 2. `check` - Service Status Check
149
+
150
+ Check if remote MCP service is available, verify connectivity and protocol support.
151
+
152
+ ```bash
153
+ mcp-proxy check <URL> [options]
154
+ ```
155
+
156
+ **Options:**
157
+
158
+ | Option | Short | Description | Default |
159
+ |--------|-------|-------------|---------|
160
+ | `--auth <TOKEN>` | `-a` | Authentication header | - |
161
+ | `--timeout <SECONDS>` | - | Timeout in seconds | 10 |
162
+
163
+ **Examples:**
164
+
165
+ ```bash
166
+ # Check service status
167
+ mcp-proxy check https://api.example.com/mcp/sse
168
+
169
+ # With authentication
170
+ mcp-proxy check https://api.example.com/mcp/sse \
171
+ --auth "Bearer token" \
172
+ --timeout 5
173
+ ```
174
+
175
+ **Exit Codes:**
176
+ - `0`: Service is healthy
177
+ - `Non-zero`: Service unavailable or check failed
178
+
179
+ ### 3. `detect` - Protocol Detection
180
+
181
+ Automatically detect the protocol type used by remote MCP service.
182
+
183
+ ```bash
184
+ mcp-proxy detect <URL> [options]
185
+ ```
186
+
187
+ **Options:**
188
+
189
+ | Option | Short | Description |
190
+ |--------|-------|-------------|
191
+ | `--auth <TOKEN>` | `-a` | Authentication header |
192
+ | `--quiet` | `-q` | Quiet mode (output protocol type only) |
193
+
194
+ **Output:**
195
+ - `SSE` - Server-Sent Events protocol
196
+ - `Streamable HTTP` - Streamable HTTP protocol
197
+ - `Stdio` - Standard input/output protocol (not applicable for remote services)
198
+
199
+ **Examples:**
200
+
201
+ ```bash
202
+ # Detect protocol type
203
+ mcp-proxy detect https://api.example.com/mcp/sse
204
+
205
+ # Use in scripts
206
+ PROTOCOL=$(mcp-proxy detect https://api.example.com/mcp --quiet)
207
+ if [ "$PROTOCOL" = "SSE" ]; then
208
+ echo "Detected SSE protocol"
209
+ fi
210
+ ```
211
+
212
+ ## Use Cases
213
+
214
+ ### Case 1: Claude Desktop with Remote MCP Service
215
+
216
+ Claude Desktop only supports stdio protocol MCP services. Use `mcp-proxy` to access remote services.
217
+
218
+ **Configuration Example** (`~/Library/Application Support/Claude/config.json`):
219
+
220
+ ```json
221
+ {
222
+ "mcpServers": {
223
+ "remote-database": {
224
+ "command": "mcp-proxy",
225
+ "args": [
226
+ "convert",
227
+ "https://your-server.com/mcp/database",
228
+ "--auth",
229
+ "Bearer your-token-here"
230
+ ]
231
+ },
232
+ "remote-search": {
233
+ "command": "mcp-proxy",
234
+ "args": ["https://search-api.com/mcp/sse"]
235
+ }
236
+ }
237
+ }
238
+ ```
239
+
240
+ ### Case 2: Health Check in CI/CD Pipeline
241
+
242
+ ```bash
243
+ #!/bin/bash
244
+ # Check MCP service status before deployment
245
+
246
+ echo "Checking MCP service..."
247
+ if mcp-proxy check https://api.example.com/mcp --timeout 5; then
248
+ echo "✅ MCP service is healthy, continuing deployment"
249
+ # Execute deployment script
250
+ ./deploy.sh
251
+ else
252
+ echo "❌ MCP service unavailable, aborting deployment"
253
+ exit 1
254
+ fi
255
+ ```
256
+
257
+ ### Case 3: Cross-Network Enterprise Internal MCP Service
258
+
259
+ ```bash
260
+ # Access internal MCP service via VPN or jump host
261
+ mcp-proxy convert https://internal-mcp.company.com/api/sse \
262
+ --auth "Bearer ${MCP_TOKEN}" \
263
+ --timeout 120 | \
264
+ local-mcp-client
265
+ ```
266
+
267
+ ### Case 4: Development and Testing
268
+
269
+ ```bash
270
+ # Quick test remote MCP service
271
+ mcp-proxy convert https://test-api.com/mcp/sse --verbose
272
+
273
+ # View detailed connection and communication logs
274
+ RUST_LOG=debug mcp-proxy convert https://api.com/mcp/sse -v
275
+ ```
276
+
277
+ ## Supported Protocols
278
+
279
+ `mcp-proxy` can connect to remote MCP services using the following protocols:
280
+
281
+ | Protocol | Description | Status |
282
+ |----------|-------------|--------|
283
+ | **SSE** | Server-Sent Events, unidirectional real-time push | ✅ Fully Supported |
284
+ | **Streamable HTTP** | Bidirectional streaming HTTP communication | ✅ Fully Supported |
285
+
286
+ **Output Protocol**: Always **stdio** (standard input/output)
287
+
288
+ ## Environment Variables
289
+
290
+ | Variable | Description | Example |
291
+ |----------|-------------|---------|
292
+ | `RUST_LOG` | Log level | `RUST_LOG=debug mcp-proxy convert ...` |
293
+ | `HTTP_PROXY` | HTTP proxy | `HTTP_PROXY=http://proxy:8080` |
294
+ | `HTTPS_PROXY` | HTTPS proxy | `HTTPS_PROXY=http://proxy:8080` |
295
+
296
+ ## FAQ
297
+
298
+ ### Q: Why do I need mcp-proxy?
299
+
300
+ **A:** Many MCP clients (like Claude Desktop) only support local stdio protocol services. If your MCP service is deployed on a remote server using SSE or HTTP protocols, you need `mcp-proxy` as a protocol conversion bridge.
301
+
302
+ ### Q: What's the difference between mcp-proxy and MCP server?
303
+
304
+ **A:**
305
+ - **MCP Server**: Backend service that provides specific functionality (database access, file operations, etc.)
306
+ - **mcp-proxy**: Pure client proxy tool that only does protocol conversion, provides no business functionality
307
+
308
+ ### Q: Does it support bidirectional communication?
309
+
310
+ **A:** Yes! Whether using SSE or Streamable HTTP protocol, `mcp-proxy` supports full bidirectional communication (request/response).
311
+
312
+ ### Q: How to debug connection issues?
313
+
314
+ **A:** Use `--verbose` option and `RUST_LOG` environment variable:
315
+
316
+ ```bash
317
+ RUST_LOG=debug mcp-proxy convert https://api.com/mcp --verbose
318
+ ```
319
+
320
+ ### Q: Does it support self-signed SSL certificates?
321
+
322
+ **A:** Current version uses system default certificate verification. For self-signed certificate support, please submit an Issue.
323
+
324
+ ## Troubleshooting
325
+
326
+ ### Connection Timeout
327
+
328
+ ```bash
329
+ # Increase timeout
330
+ mcp-proxy convert https://slow-api.com/mcp --timeout 120
331
+ ```
332
+
333
+ ### Authentication Failed
334
+
335
+ ```bash
336
+ # Check token format, ensure "Bearer " prefix
337
+ mcp-proxy convert https://api.com/mcp --auth "Bearer your-token-here"
338
+
339
+ # Or use custom header
340
+ mcp-proxy convert https://api.com/mcp -H "Authorization=Bearer your-token"
341
+ ```
342
+
343
+ ### Protocol Detection Failed
344
+
345
+ ```bash
346
+ # View detailed error message
347
+ mcp-proxy detect https://api.com/mcp --verbose
348
+
349
+ # Check service status
350
+ mcp-proxy check https://api.com/mcp
351
+ ```
352
+
353
+ ## System Requirements
354
+
355
+ - **Operating System**: Linux, macOS, Windows
356
+ - **Rust Version**: 1.70+ (only required for building from source)
357
+ - **Network**: Ability to access target MCP service
358
+
359
+ ## License
360
+
361
+ This project is dual-licensed under MIT or Apache-2.0.
362
+
363
+ ## Contributing
364
+
365
+ Issues and Pull Requests are welcome!
366
+
367
+ - **GitHub Repository**: https://github.com/nuwax-ai/mcp-proxy
368
+ - **Issue Tracker**: https://github.com/nuwax-ai/mcp-proxy/issues
369
+ - **Feature Discussions**: https://github.com/nuwax-ai/mcp-proxy/discussions
370
+
371
+ ## Related Resources
372
+
373
+ - [MCP Official Documentation](https://modelcontextprotocol.io/)
374
+ - [rmcp - Rust MCP Implementation](https://crates.io/crates/rmcp)
375
+ - [MCP Servers List](https://github.com/modelcontextprotocol/servers)
376
+
377
+ ## Changelog
378
+
379
+ ### v0.1.18
380
+
381
+ - ✅ SSE and Streamable HTTP protocol conversion support
382
+ - ✅ Auto protocol detection
383
+ - ✅ Authentication and custom headers support
384
+ - ✅ Service status check command
385
+ - ✅ Protocol detection command
386
+ - ✅ OpenTelemetry integration with OTLP
387
+ - ✅ Background health checks
388
+ - ✅ Run code execution via external processes
@@ -0,0 +1,212 @@
1
+ const { createWriteStream, existsSync, mkdirSync, mkdtemp } = require("fs");
2
+ const { join, sep } = require("path");
3
+ const { spawnSync } = require("child_process");
4
+ const { tmpdir } = require("os");
5
+
6
+ const axios = require("axios");
7
+ const rimraf = require("rimraf");
8
+ const tmpDir = tmpdir();
9
+
10
+ const error = (msg) => {
11
+ console.error(msg);
12
+ process.exit(1);
13
+ };
14
+
15
+ class Package {
16
+ constructor(platform, name, url, filename, zipExt, binaries) {
17
+ let errors = [];
18
+ if (typeof url !== "string") {
19
+ errors.push("url must be a string");
20
+ } else {
21
+ try {
22
+ new URL(url);
23
+ } catch (e) {
24
+ errors.push(e);
25
+ }
26
+ }
27
+ if (name && typeof name !== "string") {
28
+ errors.push("package name must be a string");
29
+ }
30
+ if (!name) {
31
+ errors.push("You must specify the name of your package");
32
+ }
33
+ if (binaries && typeof binaries !== "object") {
34
+ errors.push("binaries must be a string => string map");
35
+ }
36
+ if (!binaries) {
37
+ errors.push("You must specify the binaries in the package");
38
+ }
39
+
40
+ if (errors.length > 0) {
41
+ let errorMsg =
42
+ "One or more of the parameters you passed to the Binary constructor are invalid:\n";
43
+ errors.forEach((error) => {
44
+ errorMsg += error;
45
+ });
46
+ errorMsg +=
47
+ '\n\nCorrect usage: new Package("my-binary", "https://example.com/binary/download.tar.gz", {"my-binary": "my-binary"})';
48
+ error(errorMsg);
49
+ }
50
+
51
+ this.platform = platform;
52
+ this.url = url;
53
+ this.name = name;
54
+ this.filename = filename;
55
+ this.zipExt = zipExt;
56
+ this.installDirectory = join(__dirname, "node_modules", ".bin_real");
57
+ this.binaries = binaries;
58
+
59
+ if (!existsSync(this.installDirectory)) {
60
+ mkdirSync(this.installDirectory, { recursive: true });
61
+ }
62
+ }
63
+
64
+ exists() {
65
+ for (const binaryName in this.binaries) {
66
+ const binRelPath = this.binaries[binaryName];
67
+ const binPath = join(this.installDirectory, binRelPath);
68
+ if (!existsSync(binPath)) {
69
+ return false;
70
+ }
71
+ }
72
+ return true;
73
+ }
74
+
75
+ install(fetchOptions, suppressLogs = false) {
76
+ if (this.exists()) {
77
+ if (!suppressLogs) {
78
+ console.error(
79
+ `${this.name} is already installed, skipping installation.`,
80
+ );
81
+ }
82
+ return Promise.resolve();
83
+ }
84
+
85
+ if (existsSync(this.installDirectory)) {
86
+ rimraf.sync(this.installDirectory);
87
+ }
88
+
89
+ mkdirSync(this.installDirectory, { recursive: true });
90
+
91
+ if (!suppressLogs) {
92
+ console.error(`Downloading release from ${this.url}`);
93
+ }
94
+
95
+ return axios({ ...fetchOptions, url: this.url, responseType: "stream" })
96
+ .then((res) => {
97
+ return new Promise((resolve, reject) => {
98
+ mkdtemp(`${tmpDir}${sep}`, (err, directory) => {
99
+ let tempFile = join(directory, this.filename);
100
+ const sink = res.data.pipe(createWriteStream(tempFile));
101
+ sink.on("error", (err) => reject(err));
102
+ sink.on("close", () => {
103
+ if (/\.tar\.*/.test(this.zipExt)) {
104
+ const result = spawnSync("tar", [
105
+ "xf",
106
+ tempFile,
107
+ // The tarballs are stored with a leading directory
108
+ // component; we strip one component in the
109
+ // shell installers too.
110
+ "--strip-components",
111
+ "1",
112
+ "-C",
113
+ this.installDirectory,
114
+ ]);
115
+ if (result.status == 0) {
116
+ resolve();
117
+ } else if (result.error) {
118
+ reject(result.error);
119
+ } else {
120
+ reject(
121
+ new Error(
122
+ `An error occurred untarring the artifact: stdout: ${result.stdout}; stderr: ${result.stderr}`,
123
+ ),
124
+ );
125
+ }
126
+ } else if (this.zipExt == ".zip") {
127
+ let result;
128
+ if (this.platform.artifactName.includes("windows")) {
129
+ // Windows does not have "unzip" by default on many installations, instead
130
+ // we use Expand-Archive from powershell
131
+ result = spawnSync("powershell.exe", [
132
+ "-NoProfile",
133
+ "-NonInteractive",
134
+ "-Command",
135
+ `& {
136
+ param([string]$LiteralPath, [string]$DestinationPath)
137
+ Expand-Archive -LiteralPath $LiteralPath -DestinationPath $DestinationPath -Force
138
+ }`,
139
+ tempFile,
140
+ this.installDirectory,
141
+ ]);
142
+ } else {
143
+ result = spawnSync("unzip", [
144
+ "-q",
145
+ tempFile,
146
+ "-d",
147
+ this.installDirectory,
148
+ ]);
149
+ }
150
+
151
+ if (result.status == 0) {
152
+ resolve();
153
+ } else if (result.error) {
154
+ reject(result.error);
155
+ } else {
156
+ reject(
157
+ new Error(
158
+ `An error occurred unzipping the artifact: stdout: ${result.stdout}; stderr: ${result.stderr}`,
159
+ ),
160
+ );
161
+ }
162
+ } else {
163
+ reject(
164
+ new Error(`Unrecognized file extension: ${this.zipExt}`),
165
+ );
166
+ }
167
+ });
168
+ });
169
+ });
170
+ })
171
+ .then(() => {
172
+ if (!suppressLogs) {
173
+ console.error(`${this.name} has been installed!`);
174
+ }
175
+ })
176
+ .catch((e) => {
177
+ error(`Error fetching release: ${e.message}`);
178
+ });
179
+ }
180
+
181
+ run(binaryName, fetchOptions) {
182
+ const promise = !this.exists()
183
+ ? this.install(fetchOptions, true)
184
+ : Promise.resolve();
185
+
186
+ promise
187
+ .then(() => {
188
+ const [, , ...args] = process.argv;
189
+
190
+ const options = { cwd: process.cwd(), stdio: "inherit" };
191
+
192
+ const binRelPath = this.binaries[binaryName];
193
+ if (!binRelPath) {
194
+ error(`${binaryName} is not a known binary in ${this.name}`);
195
+ }
196
+ const binPath = join(this.installDirectory, binRelPath);
197
+ const result = spawnSync(binPath, args, options);
198
+
199
+ if (result.error) {
200
+ error(result.error);
201
+ }
202
+
203
+ process.exit(result.status);
204
+ })
205
+ .catch((e) => {
206
+ error(e.message);
207
+ process.exit(1);
208
+ });
209
+ }
210
+ }
211
+
212
+ module.exports.Package = Package;
package/binary.js ADDED
@@ -0,0 +1,126 @@
1
+ const { Package } = require("./binary-install");
2
+ const os = require("os");
3
+ const cTable = require("console.table");
4
+ const libc = require("detect-libc");
5
+ const { configureProxy } = require("axios-proxy-builder");
6
+
7
+ const error = (msg) => {
8
+ console.error(msg);
9
+ process.exit(1);
10
+ };
11
+
12
+ const {
13
+ name,
14
+ artifactDownloadUrl,
15
+ supportedPlatforms,
16
+ glibcMinimum,
17
+ } = require("./package.json");
18
+
19
+ const builderGlibcMajorVersion = glibcMinimum.major;
20
+ const builderGlibcMInorVersion = glibcMinimum.series;
21
+
22
+ const getPlatform = () => {
23
+ const rawOsType = os.type();
24
+ const rawArchitecture = os.arch();
25
+
26
+ // We want to use rust-style target triples as the canonical key
27
+ // for a platform, so translate the "os" library's concepts into rust ones
28
+ let osType = "";
29
+ switch (rawOsType) {
30
+ case "Windows_NT":
31
+ osType = "pc-windows-msvc";
32
+ break;
33
+ case "Darwin":
34
+ osType = "apple-darwin";
35
+ break;
36
+ case "Linux":
37
+ osType = "unknown-linux-gnu";
38
+ break;
39
+ }
40
+
41
+ let arch = "";
42
+ switch (rawArchitecture) {
43
+ case "x64":
44
+ arch = "x86_64";
45
+ break;
46
+ case "arm64":
47
+ arch = "aarch64";
48
+ break;
49
+ }
50
+
51
+ if (rawOsType === "Linux") {
52
+ if (libc.familySync() == "musl") {
53
+ osType = "unknown-linux-musl-dynamic";
54
+ } else if (libc.isNonGlibcLinuxSync()) {
55
+ console.warn(
56
+ "Your libc is neither glibc nor musl; trying static musl binary instead",
57
+ );
58
+ osType = "unknown-linux-musl-static";
59
+ } else {
60
+ let libcVersion = libc.versionSync();
61
+ let splitLibcVersion = libcVersion.split(".");
62
+ let libcMajorVersion = splitLibcVersion[0];
63
+ let libcMinorVersion = splitLibcVersion[1];
64
+ if (
65
+ libcMajorVersion != builderGlibcMajorVersion ||
66
+ libcMinorVersion < builderGlibcMInorVersion
67
+ ) {
68
+ // We can't run the glibc binaries, but we can run the static musl ones
69
+ // if they exist
70
+ console.warn(
71
+ "Your glibc isn't compatible; trying static musl binary instead",
72
+ );
73
+ osType = "unknown-linux-musl-static";
74
+ }
75
+ }
76
+ }
77
+
78
+ // Assume the above succeeded and build a target triple to look things up with.
79
+ // If any of it failed, this lookup will fail and we'll handle it like normal.
80
+ let targetTriple = `${arch}-${osType}`;
81
+ let platform = supportedPlatforms[targetTriple];
82
+
83
+ if (!platform) {
84
+ error(
85
+ `Platform with type "${rawOsType}" and architecture "${rawArchitecture}" is not supported by ${name}.\nYour system must be one of the following:\n\n${Object.keys(
86
+ supportedPlatforms,
87
+ ).join(",")}`,
88
+ );
89
+ }
90
+
91
+ return platform;
92
+ };
93
+
94
+ const getPackage = () => {
95
+ const platform = getPlatform();
96
+ const url = `${artifactDownloadUrl}/${platform.artifactName}`;
97
+ let filename = platform.artifactName;
98
+ let ext = platform.zipExt;
99
+ let binary = new Package(platform, name, url, filename, ext, platform.bins);
100
+
101
+ return binary;
102
+ };
103
+
104
+ const install = (suppressLogs) => {
105
+ if (!artifactDownloadUrl || artifactDownloadUrl.length === 0) {
106
+ console.warn("in demo mode, not installing binaries");
107
+ return;
108
+ }
109
+ const package = getPackage();
110
+ const proxy = configureProxy(package.url);
111
+
112
+ return package.install(proxy, suppressLogs);
113
+ };
114
+
115
+ const run = (binaryName) => {
116
+ const package = getPackage();
117
+ const proxy = configureProxy(package.url);
118
+
119
+ package.run(binaryName, proxy);
120
+ };
121
+
122
+ module.exports = {
123
+ install,
124
+ run,
125
+ getPackage,
126
+ };
package/install.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { install } = require("./binary");
4
+ install(false);
@@ -0,0 +1,519 @@
1
+ {
2
+ "lockfileVersion": 3,
3
+ "name": "mcp-stdio-proxy",
4
+ "packages": {
5
+ "": {
6
+ "bin": {
7
+ "mcp-proxy": "run-mcp-proxy.js"
8
+ },
9
+ "dependencies": {
10
+ "axios": "^1.13.2",
11
+ "axios-proxy-builder": "^0.1.2",
12
+ "console.table": "^0.10.0",
13
+ "detect-libc": "^2.1.2",
14
+ "rimraf": "^6.1.2"
15
+ },
16
+ "devDependencies": {
17
+ "prettier": "^3.7.4"
18
+ },
19
+ "engines": {
20
+ "node": ">=14",
21
+ "npm": ">=6"
22
+ },
23
+ "hasInstallScript": true,
24
+ "license": "MIT OR Apache-2.0",
25
+ "name": "mcp-stdio-proxy",
26
+ "version": "0.1.29"
27
+ },
28
+ "node_modules/@isaacs/balanced-match": {
29
+ "engines": {
30
+ "node": "20 || >=22"
31
+ },
32
+ "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
33
+ "license": "MIT",
34
+ "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
35
+ "version": "4.0.1"
36
+ },
37
+ "node_modules/@isaacs/brace-expansion": {
38
+ "dependencies": {
39
+ "@isaacs/balanced-match": "^4.0.1"
40
+ },
41
+ "engines": {
42
+ "node": "20 || >=22"
43
+ },
44
+ "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
45
+ "license": "MIT",
46
+ "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
47
+ "version": "5.0.0"
48
+ },
49
+ "node_modules/asynckit": {
50
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
51
+ "license": "MIT",
52
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
53
+ "version": "0.4.0"
54
+ },
55
+ "node_modules/axios": {
56
+ "dependencies": {
57
+ "follow-redirects": "^1.15.6",
58
+ "form-data": "^4.0.4",
59
+ "proxy-from-env": "^1.1.0"
60
+ },
61
+ "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
62
+ "license": "MIT",
63
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
64
+ "version": "1.13.2"
65
+ },
66
+ "node_modules/axios-proxy-builder": {
67
+ "dependencies": {
68
+ "tunnel": "^0.0.6"
69
+ },
70
+ "integrity": "sha512-6uBVsBZzkB3tCC8iyx59mCjQckhB8+GQrI9Cop8eC7ybIsvs/KtnNgEBfRMSEa7GqK2VBGUzgjNYMdPIfotyPA==",
71
+ "license": "MIT",
72
+ "resolved": "https://registry.npmjs.org/axios-proxy-builder/-/axios-proxy-builder-0.1.2.tgz",
73
+ "version": "0.1.2"
74
+ },
75
+ "node_modules/call-bind-apply-helpers": {
76
+ "dependencies": {
77
+ "es-errors": "^1.3.0",
78
+ "function-bind": "^1.1.2"
79
+ },
80
+ "engines": {
81
+ "node": ">= 0.4"
82
+ },
83
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
84
+ "license": "MIT",
85
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
86
+ "version": "1.0.2"
87
+ },
88
+ "node_modules/clone": {
89
+ "engines": {
90
+ "node": ">=0.8"
91
+ },
92
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
93
+ "license": "MIT",
94
+ "optional": true,
95
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
96
+ "version": "1.0.4"
97
+ },
98
+ "node_modules/combined-stream": {
99
+ "dependencies": {
100
+ "delayed-stream": "~1.0.0"
101
+ },
102
+ "engines": {
103
+ "node": ">= 0.8"
104
+ },
105
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
106
+ "license": "MIT",
107
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
108
+ "version": "1.0.8"
109
+ },
110
+ "node_modules/console.table": {
111
+ "dependencies": {
112
+ "easy-table": "1.1.0"
113
+ },
114
+ "engines": {
115
+ "node": "> 0.10"
116
+ },
117
+ "integrity": "sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==",
118
+ "license": "MIT",
119
+ "resolved": "https://registry.npmjs.org/console.table/-/console.table-0.10.0.tgz",
120
+ "version": "0.10.0"
121
+ },
122
+ "node_modules/defaults": {
123
+ "dependencies": {
124
+ "clone": "^1.0.2"
125
+ },
126
+ "funding": {
127
+ "url": "https://github.com/sponsors/sindresorhus"
128
+ },
129
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
130
+ "license": "MIT",
131
+ "optional": true,
132
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
133
+ "version": "1.0.4"
134
+ },
135
+ "node_modules/delayed-stream": {
136
+ "engines": {
137
+ "node": ">=0.4.0"
138
+ },
139
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
140
+ "license": "MIT",
141
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
142
+ "version": "1.0.0"
143
+ },
144
+ "node_modules/detect-libc": {
145
+ "engines": {
146
+ "node": ">=8"
147
+ },
148
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
149
+ "license": "Apache-2.0",
150
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
151
+ "version": "2.1.2"
152
+ },
153
+ "node_modules/dunder-proto": {
154
+ "dependencies": {
155
+ "call-bind-apply-helpers": "^1.0.1",
156
+ "es-errors": "^1.3.0",
157
+ "gopd": "^1.2.0"
158
+ },
159
+ "engines": {
160
+ "node": ">= 0.4"
161
+ },
162
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
163
+ "license": "MIT",
164
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
165
+ "version": "1.0.1"
166
+ },
167
+ "node_modules/easy-table": {
168
+ "integrity": "sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==",
169
+ "license": "MIT",
170
+ "optionalDependencies": {
171
+ "wcwidth": ">=1.0.1"
172
+ },
173
+ "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz",
174
+ "version": "1.1.0"
175
+ },
176
+ "node_modules/es-define-property": {
177
+ "engines": {
178
+ "node": ">= 0.4"
179
+ },
180
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
181
+ "license": "MIT",
182
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
183
+ "version": "1.0.1"
184
+ },
185
+ "node_modules/es-errors": {
186
+ "engines": {
187
+ "node": ">= 0.4"
188
+ },
189
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
190
+ "license": "MIT",
191
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
192
+ "version": "1.3.0"
193
+ },
194
+ "node_modules/es-object-atoms": {
195
+ "dependencies": {
196
+ "es-errors": "^1.3.0"
197
+ },
198
+ "engines": {
199
+ "node": ">= 0.4"
200
+ },
201
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
202
+ "license": "MIT",
203
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
204
+ "version": "1.1.1"
205
+ },
206
+ "node_modules/es-set-tostringtag": {
207
+ "dependencies": {
208
+ "es-errors": "^1.3.0",
209
+ "get-intrinsic": "^1.2.6",
210
+ "has-tostringtag": "^1.0.2",
211
+ "hasown": "^2.0.2"
212
+ },
213
+ "engines": {
214
+ "node": ">= 0.4"
215
+ },
216
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
217
+ "license": "MIT",
218
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
219
+ "version": "2.1.0"
220
+ },
221
+ "node_modules/follow-redirects": {
222
+ "engines": {
223
+ "node": ">=4.0"
224
+ },
225
+ "funding": [
226
+ {
227
+ "type": "individual",
228
+ "url": "https://github.com/sponsors/RubenVerborgh"
229
+ }
230
+ ],
231
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
232
+ "license": "MIT",
233
+ "peerDependenciesMeta": {
234
+ "debug": {
235
+ "optional": true
236
+ }
237
+ },
238
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
239
+ "version": "1.15.6"
240
+ },
241
+ "node_modules/form-data": {
242
+ "dependencies": {
243
+ "asynckit": "^0.4.0",
244
+ "combined-stream": "^1.0.8",
245
+ "es-set-tostringtag": "^2.1.0",
246
+ "hasown": "^2.0.2",
247
+ "mime-types": "^2.1.12"
248
+ },
249
+ "engines": {
250
+ "node": ">= 6"
251
+ },
252
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
253
+ "license": "MIT",
254
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
255
+ "version": "4.0.4"
256
+ },
257
+ "node_modules/function-bind": {
258
+ "funding": {
259
+ "url": "https://github.com/sponsors/ljharb"
260
+ },
261
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
262
+ "license": "MIT",
263
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
264
+ "version": "1.1.2"
265
+ },
266
+ "node_modules/get-intrinsic": {
267
+ "dependencies": {
268
+ "call-bind-apply-helpers": "^1.0.2",
269
+ "es-define-property": "^1.0.1",
270
+ "es-errors": "^1.3.0",
271
+ "es-object-atoms": "^1.1.1",
272
+ "function-bind": "^1.1.2",
273
+ "get-proto": "^1.0.1",
274
+ "gopd": "^1.2.0",
275
+ "has-symbols": "^1.1.0",
276
+ "hasown": "^2.0.2",
277
+ "math-intrinsics": "^1.1.0"
278
+ },
279
+ "engines": {
280
+ "node": ">= 0.4"
281
+ },
282
+ "funding": {
283
+ "url": "https://github.com/sponsors/ljharb"
284
+ },
285
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
286
+ "license": "MIT",
287
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
288
+ "version": "1.3.0"
289
+ },
290
+ "node_modules/get-proto": {
291
+ "dependencies": {
292
+ "dunder-proto": "^1.0.1",
293
+ "es-object-atoms": "^1.0.0"
294
+ },
295
+ "engines": {
296
+ "node": ">= 0.4"
297
+ },
298
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
299
+ "license": "MIT",
300
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
301
+ "version": "1.0.1"
302
+ },
303
+ "node_modules/glob": {
304
+ "dependencies": {
305
+ "minimatch": "^10.1.1",
306
+ "minipass": "^7.1.2",
307
+ "path-scurry": "^2.0.0"
308
+ },
309
+ "engines": {
310
+ "node": "20 || >=22"
311
+ },
312
+ "funding": {
313
+ "url": "https://github.com/sponsors/isaacs"
314
+ },
315
+ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==",
316
+ "license": "BlueOak-1.0.0",
317
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz",
318
+ "version": "13.0.0"
319
+ },
320
+ "node_modules/gopd": {
321
+ "engines": {
322
+ "node": ">= 0.4"
323
+ },
324
+ "funding": {
325
+ "url": "https://github.com/sponsors/ljharb"
326
+ },
327
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
328
+ "license": "MIT",
329
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
330
+ "version": "1.2.0"
331
+ },
332
+ "node_modules/has-symbols": {
333
+ "engines": {
334
+ "node": ">= 0.4"
335
+ },
336
+ "funding": {
337
+ "url": "https://github.com/sponsors/ljharb"
338
+ },
339
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
340
+ "license": "MIT",
341
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
342
+ "version": "1.1.0"
343
+ },
344
+ "node_modules/has-tostringtag": {
345
+ "dependencies": {
346
+ "has-symbols": "^1.0.3"
347
+ },
348
+ "engines": {
349
+ "node": ">= 0.4"
350
+ },
351
+ "funding": {
352
+ "url": "https://github.com/sponsors/ljharb"
353
+ },
354
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
355
+ "license": "MIT",
356
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
357
+ "version": "1.0.2"
358
+ },
359
+ "node_modules/hasown": {
360
+ "dependencies": {
361
+ "function-bind": "^1.1.2"
362
+ },
363
+ "engines": {
364
+ "node": ">= 0.4"
365
+ },
366
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
367
+ "license": "MIT",
368
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
369
+ "version": "2.0.2"
370
+ },
371
+ "node_modules/lru-cache": {
372
+ "engines": {
373
+ "node": "20 || >=22"
374
+ },
375
+ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==",
376
+ "license": "BlueOak-1.0.0",
377
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz",
378
+ "version": "11.2.4"
379
+ },
380
+ "node_modules/math-intrinsics": {
381
+ "engines": {
382
+ "node": ">= 0.4"
383
+ },
384
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
385
+ "license": "MIT",
386
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
387
+ "version": "1.1.0"
388
+ },
389
+ "node_modules/mime-db": {
390
+ "engines": {
391
+ "node": ">= 0.6"
392
+ },
393
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
394
+ "license": "MIT",
395
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
396
+ "version": "1.52.0"
397
+ },
398
+ "node_modules/mime-types": {
399
+ "dependencies": {
400
+ "mime-db": "1.52.0"
401
+ },
402
+ "engines": {
403
+ "node": ">= 0.6"
404
+ },
405
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
406
+ "license": "MIT",
407
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
408
+ "version": "2.1.35"
409
+ },
410
+ "node_modules/minimatch": {
411
+ "dependencies": {
412
+ "@isaacs/brace-expansion": "^5.0.0"
413
+ },
414
+ "engines": {
415
+ "node": "20 || >=22"
416
+ },
417
+ "funding": {
418
+ "url": "https://github.com/sponsors/isaacs"
419
+ },
420
+ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
421
+ "license": "BlueOak-1.0.0",
422
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
423
+ "version": "10.1.1"
424
+ },
425
+ "node_modules/minipass": {
426
+ "engines": {
427
+ "node": ">=16 || 14 >=14.17"
428
+ },
429
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
430
+ "license": "ISC",
431
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
432
+ "version": "7.1.2"
433
+ },
434
+ "node_modules/package-json-from-dist": {
435
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
436
+ "license": "BlueOak-1.0.0",
437
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
438
+ "version": "1.0.1"
439
+ },
440
+ "node_modules/path-scurry": {
441
+ "dependencies": {
442
+ "lru-cache": "^11.0.0",
443
+ "minipass": "^7.1.2"
444
+ },
445
+ "engines": {
446
+ "node": "20 || >=22"
447
+ },
448
+ "funding": {
449
+ "url": "https://github.com/sponsors/isaacs"
450
+ },
451
+ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==",
452
+ "license": "BlueOak-1.0.0",
453
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz",
454
+ "version": "2.0.1"
455
+ },
456
+ "node_modules/prettier": {
457
+ "bin": {
458
+ "prettier": "bin/prettier.cjs"
459
+ },
460
+ "dev": true,
461
+ "engines": {
462
+ "node": ">=14"
463
+ },
464
+ "funding": {
465
+ "url": "https://github.com/prettier/prettier?sponsor=1"
466
+ },
467
+ "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==",
468
+ "license": "MIT",
469
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz",
470
+ "version": "3.7.4"
471
+ },
472
+ "node_modules/proxy-from-env": {
473
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
474
+ "license": "MIT",
475
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
476
+ "version": "1.1.0"
477
+ },
478
+ "node_modules/rimraf": {
479
+ "bin": {
480
+ "rimraf": "dist/esm/bin.mjs"
481
+ },
482
+ "dependencies": {
483
+ "glob": "^13.0.0",
484
+ "package-json-from-dist": "^1.0.1"
485
+ },
486
+ "engines": {
487
+ "node": "20 || >=22"
488
+ },
489
+ "funding": {
490
+ "url": "https://github.com/sponsors/isaacs"
491
+ },
492
+ "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==",
493
+ "license": "BlueOak-1.0.0",
494
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz",
495
+ "version": "6.1.2"
496
+ },
497
+ "node_modules/tunnel": {
498
+ "engines": {
499
+ "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
500
+ },
501
+ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
502
+ "license": "MIT",
503
+ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
504
+ "version": "0.0.6"
505
+ },
506
+ "node_modules/wcwidth": {
507
+ "dependencies": {
508
+ "defaults": "^1.0.3"
509
+ },
510
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
511
+ "license": "MIT",
512
+ "optional": true,
513
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
514
+ "version": "1.0.1"
515
+ }
516
+ },
517
+ "requires": true,
518
+ "version": "0.1.29"
519
+ }
package/package.json ADDED
@@ -0,0 +1,101 @@
1
+ {
2
+ "artifactDownloadUrl": "https://github.com/nuwax-ai/mcp-proxy/releases/download/v0.1.29",
3
+ "author": "nuwax-ai",
4
+ "bin": {
5
+ "mcp-proxy": "run-mcp-proxy.js"
6
+ },
7
+ "dependencies": {
8
+ "axios": "^1.13.2",
9
+ "axios-proxy-builder": "^0.1.2",
10
+ "console.table": "^0.10.0",
11
+ "detect-libc": "^2.1.2",
12
+ "rimraf": "^6.1.2"
13
+ },
14
+ "description": "MCP (Model Context Protocol) proxy server and CLI tool for protocol conversion and remote service access",
15
+ "devDependencies": {
16
+ "prettier": "^3.7.4"
17
+ },
18
+ "engines": {
19
+ "node": ">=14",
20
+ "npm": ">=6"
21
+ },
22
+ "glibcMinimum": {
23
+ "major": 2,
24
+ "series": 35
25
+ },
26
+ "keywords": [
27
+ "web-programming",
28
+ "command-line-utilities",
29
+ "network-programming",
30
+ "mcp",
31
+ "proxy",
32
+ "protocol",
33
+ "sse",
34
+ "cli"
35
+ ],
36
+ "license": "MIT OR Apache-2.0",
37
+ "name": "mcp-stdio-proxy",
38
+ "preferUnplugged": true,
39
+ "repository": "https://github.com/nuwax-ai/mcp-proxy",
40
+ "scripts": {
41
+ "fmt": "prettier --write **/*.js",
42
+ "fmt:check": "prettier --check **/*.js",
43
+ "postinstall": "node ./install.js"
44
+ },
45
+ "supportedPlatforms": {
46
+ "aarch64-apple-darwin": {
47
+ "artifactName": "mcp-stdio-proxy-aarch64-apple-darwin.tar.xz",
48
+ "bins": {
49
+ "mcp-proxy": "mcp-proxy"
50
+ },
51
+ "zipExt": ".tar.xz"
52
+ },
53
+ "aarch64-pc-windows-msvc": {
54
+ "artifactName": "mcp-stdio-proxy-x86_64-pc-windows-msvc.zip",
55
+ "bins": {
56
+ "mcp-proxy": "mcp-proxy.exe"
57
+ },
58
+ "zipExt": ".zip"
59
+ },
60
+ "aarch64-unknown-linux-gnu": {
61
+ "artifactName": "mcp-stdio-proxy-aarch64-unknown-linux-gnu.tar.xz",
62
+ "bins": {
63
+ "mcp-proxy": "mcp-proxy"
64
+ },
65
+ "zipExt": ".tar.xz"
66
+ },
67
+ "x86_64-apple-darwin": {
68
+ "artifactName": "mcp-stdio-proxy-x86_64-apple-darwin.tar.xz",
69
+ "bins": {
70
+ "mcp-proxy": "mcp-proxy"
71
+ },
72
+ "zipExt": ".tar.xz"
73
+ },
74
+ "x86_64-pc-windows-gnu": {
75
+ "artifactName": "mcp-stdio-proxy-x86_64-pc-windows-msvc.zip",
76
+ "bins": {
77
+ "mcp-proxy": "mcp-proxy.exe"
78
+ },
79
+ "zipExt": ".zip"
80
+ },
81
+ "x86_64-pc-windows-msvc": {
82
+ "artifactName": "mcp-stdio-proxy-x86_64-pc-windows-msvc.zip",
83
+ "bins": {
84
+ "mcp-proxy": "mcp-proxy.exe"
85
+ },
86
+ "zipExt": ".zip"
87
+ },
88
+ "x86_64-unknown-linux-gnu": {
89
+ "artifactName": "mcp-stdio-proxy-x86_64-unknown-linux-gnu.tar.xz",
90
+ "bins": {
91
+ "mcp-proxy": "mcp-proxy"
92
+ },
93
+ "zipExt": ".tar.xz"
94
+ }
95
+ },
96
+ "version": "0.1.29",
97
+ "volta": {
98
+ "node": "18.14.1",
99
+ "npm": "9.5.0"
100
+ }
101
+ }
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { run } = require("./binary");
4
+ run("mcp-proxy");