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 +2 -0
- package/LICENSE-MIT +22 -0
- package/README.md +388 -0
- package/binary-install.js +212 -0
- package/binary.js +126 -0
- package/install.js +4 -0
- package/npm-shrinkwrap.json +519 -0
- package/package.json +101 -0
- package/run-mcp-proxy.js +4 -0
package/.gitignore
ADDED
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,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
|
+
}
|
package/run-mcp-proxy.js
ADDED