@tronsfey/mcp2cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +224 -0
- package/bin/mcp2cli +2 -0
- package/dist/bake.d.ts +10 -0
- package/dist/bake.d.ts.map +1 -0
- package/dist/bake.js +105 -0
- package/dist/bake.js.map +1 -0
- package/dist/cache.d.ts +5 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +81 -0
- package/dist/cache.js.map +1 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +94 -0
- package/dist/client/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +275 -0
- package/dist/index.js.map +1 -0
- package/dist/runner/index.d.ts +26 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +231 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/types/index.d.ts +64 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +80 -0
package/README.md
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# mcp2cli
|
|
2
|
+
|
|
3
|
+
> Command-line proxy for any MCP (Model Context Protocol) server — call tools directly from the terminal.
|
|
4
|
+
|
|
5
|
+
A Node.js/TypeScript CLI tool that connects to MCP servers and exposes their tools as command-line commands. Supports both HTTP/SSE and stdio transports, with tool list caching and named server shortcuts ("bakes").
|
|
6
|
+
|
|
7
|
+
Inspired by [knowsuchagency/mcp2cli](https://github.com/knowsuchagency/mcp2cli).
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install -g @tronsfey/mcp2cli
|
|
15
|
+
# or run directly
|
|
16
|
+
npx @tronsfey/mcp2cli --help
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
### Connect to an HTTP/SSE MCP server
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# List all available tools
|
|
27
|
+
mcp2cli --mcp https://server.example.com/mcp --list
|
|
28
|
+
|
|
29
|
+
# Call a tool
|
|
30
|
+
mcp2cli --mcp https://server.example.com/mcp search --query "hello world"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Connect to a local stdio MCP server
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# Spawn a local server and list its tools
|
|
37
|
+
mcp2cli --mcp-stdio "npx -y @modelcontextprotocol/server-filesystem /" --list
|
|
38
|
+
|
|
39
|
+
# Call a tool on the local server
|
|
40
|
+
mcp2cli --mcp-stdio "npx -y @modelcontextprotocol/server-filesystem /" \
|
|
41
|
+
list-directory --path /tmp
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Usage
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
mcp2cli [options] [tool-name] [tool-options]
|
|
50
|
+
|
|
51
|
+
Options:
|
|
52
|
+
--mcp <url> MCP HTTP/SSE server URL
|
|
53
|
+
--mcp-stdio <command> MCP stdio server command (spawns local process)
|
|
54
|
+
--env <KEY=VALUE...> Extra environment variables for stdio server
|
|
55
|
+
--header <Header:Value> Custom HTTP headers (can repeat)
|
|
56
|
+
-l, --list List available tools and exit
|
|
57
|
+
--pretty Pretty-print output (default)
|
|
58
|
+
--raw Output raw JSON
|
|
59
|
+
--jq <expression> Filter output with JMESPath expression
|
|
60
|
+
--no-cache Bypass tool list cache
|
|
61
|
+
--cache-ttl <seconds> Cache TTL in seconds (default: 3600)
|
|
62
|
+
-V, --version Output version
|
|
63
|
+
-h, --help Show help
|
|
64
|
+
|
|
65
|
+
Commands:
|
|
66
|
+
bake Manage saved server configurations
|
|
67
|
+
completion [shell] Output shell completion script (bash|zsh|fish)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Bake — Save Server Shortcuts
|
|
73
|
+
|
|
74
|
+
Save a server configuration once and reference it with `@name`:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Save an HTTP server
|
|
78
|
+
mcp2cli bake create myserver --mcp https://server.example.com/mcp
|
|
79
|
+
mcp2cli bake create myserver --mcp https://server.example.com/mcp \
|
|
80
|
+
--header "Authorization: Bearer TOKEN"
|
|
81
|
+
|
|
82
|
+
# Save a local stdio server
|
|
83
|
+
mcp2cli bake create localfs --mcp-stdio "npx -y @modelcontextprotocol/server-filesystem /"
|
|
84
|
+
|
|
85
|
+
# List saved bakes
|
|
86
|
+
mcp2cli bake list
|
|
87
|
+
|
|
88
|
+
# Delete a bake
|
|
89
|
+
mcp2cli bake delete myserver
|
|
90
|
+
|
|
91
|
+
# Use a saved bake
|
|
92
|
+
mcp2cli @myserver --list
|
|
93
|
+
mcp2cli @localfs list-directory --path /tmp
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Bakes are stored in `~/.mcp2cli/bakes.json`.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Output Formatting
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# Default: pretty-print text content from tool result
|
|
104
|
+
mcp2cli --mcp <url> <tool> [args]
|
|
105
|
+
|
|
106
|
+
# Raw JSON output
|
|
107
|
+
mcp2cli --mcp <url> <tool> [args] --raw
|
|
108
|
+
|
|
109
|
+
# Filter with JMESPath
|
|
110
|
+
mcp2cli --mcp <url> <tool> [args] --jq 'results[*].name'
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Caching
|
|
116
|
+
|
|
117
|
+
Tool lists are cached per server (default TTL: 1 hour) to speed up repeated invocations.
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# Bypass cache
|
|
121
|
+
mcp2cli --mcp <url> --list --no-cache
|
|
122
|
+
|
|
123
|
+
# Custom TTL (5 minutes)
|
|
124
|
+
mcp2cli --mcp <url> --list --cache-ttl 300
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Cache files are stored in `~/.mcp2cli/cache/`.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Authentication
|
|
132
|
+
|
|
133
|
+
### HTTP server with Bearer token
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
mcp2cli --mcp https://server.example.com/mcp \
|
|
137
|
+
--header "Authorization: Bearer YOUR_TOKEN" \
|
|
138
|
+
--list
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### stdio server with environment variables
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
mcp2cli --mcp-stdio "node server.js" \
|
|
145
|
+
--env "API_KEY=secret" \
|
|
146
|
+
--env "DB_URL=postgres://localhost/mydb" \
|
|
147
|
+
<tool-name> [args]
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Shell Completion
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# Bash
|
|
156
|
+
mcp2cli completion bash >> ~/.bashrc
|
|
157
|
+
source ~/.bashrc
|
|
158
|
+
|
|
159
|
+
# Zsh
|
|
160
|
+
mcp2cli completion zsh >> ~/.zshrc
|
|
161
|
+
source ~/.zshrc
|
|
162
|
+
|
|
163
|
+
# Fish
|
|
164
|
+
mcp2cli completion fish > ~/.config/fish/completions/mcp2cli.fish
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Architecture
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
CLI invocation
|
|
173
|
+
│
|
|
174
|
+
▼
|
|
175
|
+
Resolve @name shortcut (bake lookup)
|
|
176
|
+
│
|
|
177
|
+
▼
|
|
178
|
+
Parse global options (Commander.js)
|
|
179
|
+
│
|
|
180
|
+
├─► --list ──► Connect → listTools() → print → exit
|
|
181
|
+
│
|
|
182
|
+
└─► tool-name
|
|
183
|
+
│
|
|
184
|
+
▼
|
|
185
|
+
createMcpClient() [src/client/]
|
|
186
|
+
(HTTP Streamable → SSE fallback | stdio)
|
|
187
|
+
│
|
|
188
|
+
▼
|
|
189
|
+
getTools() [src/runner/ + src/cache.ts]
|
|
190
|
+
(cache lookup → listTools() → cache write)
|
|
191
|
+
│
|
|
192
|
+
▼
|
|
193
|
+
schemaToParams() [JSON Schema → ToolParam[]]
|
|
194
|
+
│
|
|
195
|
+
▼
|
|
196
|
+
Parse tool-specific args [dynamic Commander subcommand]
|
|
197
|
+
│
|
|
198
|
+
▼
|
|
199
|
+
client.callTool()
|
|
200
|
+
│
|
|
201
|
+
▼
|
|
202
|
+
Format & print result [--raw / --jq / pretty]
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Development
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
git clone https://github.com/tronsfey928/mcp2cli.git
|
|
211
|
+
cd mcp2cli
|
|
212
|
+
npm install
|
|
213
|
+
npm run build
|
|
214
|
+
npm test
|
|
215
|
+
|
|
216
|
+
# Run directly without building
|
|
217
|
+
npm run dev -- --help
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## License
|
|
223
|
+
|
|
224
|
+
MIT
|
package/bin/mcp2cli
ADDED
package/dist/bake.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BakeEntry, McpServerConfig } from './types/index';
|
|
2
|
+
export declare function createBake(name: string, config: McpServerConfig): Promise<void>;
|
|
3
|
+
export declare function getBake(name: string): Promise<BakeEntry | null>;
|
|
4
|
+
export declare function listBakes(): Promise<BakeEntry[]>;
|
|
5
|
+
export declare function deleteBake(name: string): Promise<boolean>;
|
|
6
|
+
/**
|
|
7
|
+
* Convert a McpServerConfig back into CLI flag strings for argv injection.
|
|
8
|
+
*/
|
|
9
|
+
export declare function configToArgs(config: McpServerConfig): string[];
|
|
10
|
+
//# sourceMappingURL=bake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bake.d.ts","sourceRoot":"","sources":["../src/bake.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAoBtE,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAKrF;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAGrE;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAGtD;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAM/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,EAAE,CAkB9D"}
|
package/dist/bake.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.createBake = createBake;
|
|
37
|
+
exports.getBake = getBake;
|
|
38
|
+
exports.listBakes = listBakes;
|
|
39
|
+
exports.deleteBake = deleteBake;
|
|
40
|
+
exports.configToArgs = configToArgs;
|
|
41
|
+
const fs = __importStar(require("fs-extra"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const os = __importStar(require("os"));
|
|
44
|
+
function getBakeFile() {
|
|
45
|
+
return path.join(os.homedir(), '.mcp2cli', 'bakes.json');
|
|
46
|
+
}
|
|
47
|
+
async function readStore() {
|
|
48
|
+
try {
|
|
49
|
+
return await fs.readJson(getBakeFile());
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return {};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function writeStore(store) {
|
|
56
|
+
const bakeFile = getBakeFile();
|
|
57
|
+
await fs.ensureDir(path.dirname(bakeFile));
|
|
58
|
+
await fs.writeJson(bakeFile, store, { spaces: 2 });
|
|
59
|
+
}
|
|
60
|
+
async function createBake(name, config) {
|
|
61
|
+
const store = await readStore();
|
|
62
|
+
const entry = { name, config, createdAt: new Date().toISOString() };
|
|
63
|
+
store[name] = entry;
|
|
64
|
+
await writeStore(store);
|
|
65
|
+
}
|
|
66
|
+
async function getBake(name) {
|
|
67
|
+
const store = await readStore();
|
|
68
|
+
return store[name] ?? null;
|
|
69
|
+
}
|
|
70
|
+
async function listBakes() {
|
|
71
|
+
const store = await readStore();
|
|
72
|
+
return Object.values(store);
|
|
73
|
+
}
|
|
74
|
+
async function deleteBake(name) {
|
|
75
|
+
const store = await readStore();
|
|
76
|
+
if (!store[name])
|
|
77
|
+
return false;
|
|
78
|
+
delete store[name];
|
|
79
|
+
await writeStore(store);
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Convert a McpServerConfig back into CLI flag strings for argv injection.
|
|
84
|
+
*/
|
|
85
|
+
function configToArgs(config) {
|
|
86
|
+
const args = [];
|
|
87
|
+
if (config.type === 'http') {
|
|
88
|
+
args.push('--mcp', config.url);
|
|
89
|
+
if (config.headers) {
|
|
90
|
+
for (const [k, v] of Object.entries(config.headers)) {
|
|
91
|
+
args.push('--header', `${k}: ${v}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
args.push('--mcp-stdio', config.command);
|
|
97
|
+
if (config.env) {
|
|
98
|
+
for (const [k, v] of Object.entries(config.env)) {
|
|
99
|
+
args.push('--env', `${k}=${v}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return args;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=bake.js.map
|
package/dist/bake.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bake.js","sourceRoot":"","sources":["../src/bake.ts"],"names":[],"mappings":"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"}
|
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { McpServerConfig, ToolDefinition } from './types/index';
|
|
2
|
+
export declare function getCachedTools(config: McpServerConfig, ttl: number): Promise<ToolDefinition[] | null>;
|
|
3
|
+
export declare function setCachedTools(config: McpServerConfig, tools: ToolDefinition[], ttl: number): Promise<void>;
|
|
4
|
+
export declare function invalidateCache(config: McpServerConfig): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAIA,OAAO,EAAc,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAe5E,wBAAsB,cAAc,CAClC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,CAYlC;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,cAAc,EAAE,EACvB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAO5E"}
|
package/dist/cache.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getCachedTools = getCachedTools;
|
|
37
|
+
exports.setCachedTools = setCachedTools;
|
|
38
|
+
exports.invalidateCache = invalidateCache;
|
|
39
|
+
const fs = __importStar(require("fs-extra"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const os = __importStar(require("os"));
|
|
42
|
+
const crypto = __importStar(require("crypto"));
|
|
43
|
+
function getCacheDir() {
|
|
44
|
+
return path.join(os.homedir(), '.mcp2cli', 'cache');
|
|
45
|
+
}
|
|
46
|
+
function getCacheKey(config) {
|
|
47
|
+
const key = config.type === 'http' ? config.url : config.command;
|
|
48
|
+
return crypto.createHash('md5').update(key).digest('hex');
|
|
49
|
+
}
|
|
50
|
+
function getCachePath(config) {
|
|
51
|
+
return path.join(getCacheDir(), `${getCacheKey(config)}.json`);
|
|
52
|
+
}
|
|
53
|
+
async function getCachedTools(config, ttl) {
|
|
54
|
+
const cachePath = getCachePath(config);
|
|
55
|
+
try {
|
|
56
|
+
const entry = await fs.readJson(cachePath);
|
|
57
|
+
const age = (Date.now() - entry.cachedAt) / 1000;
|
|
58
|
+
if (age < ttl) {
|
|
59
|
+
return entry.tools;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// cache miss or invalid
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
async function setCachedTools(config, tools, ttl) {
|
|
68
|
+
await fs.ensureDir(getCacheDir());
|
|
69
|
+
const entry = { tools, cachedAt: Date.now(), ttl };
|
|
70
|
+
await fs.writeJson(getCachePath(config), entry, { spaces: 2 });
|
|
71
|
+
}
|
|
72
|
+
async function invalidateCache(config) {
|
|
73
|
+
const cachePath = getCachePath(config);
|
|
74
|
+
try {
|
|
75
|
+
await fs.remove(cachePath);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// ignore if not exists
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,wCAeC;AAED,wCAQC;AAED,0CAOC;AArDD,6CAA+B;AAC/B,2CAA6B;AAC7B,uCAAyB;AACzB,+CAAiC;AAGjC,SAAS,WAAW;IAClB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,WAAW,CAAC,MAAuB;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAQ,CAAC;IACnE,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,YAAY,CAAC,MAAuB;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACjE,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,MAAuB,EACvB,GAAW;IAEX,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,KAAK,GAAe,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QACjD,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YACd,OAAO,KAAK,CAAC,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,MAAuB,EACvB,KAAuB,EACvB,GAAW;IAEX,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IAClC,MAAM,KAAK,GAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC;IAC/D,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACjE,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,MAAuB;IAC3D,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { McpServerConfig } from '../types/index';
|
|
3
|
+
/**
|
|
4
|
+
* Create and connect an MCP client using the appropriate transport.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createMcpClient(config: McpServerConfig, verbose?: boolean): Promise<Client>;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAInE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAiCjD;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,EACvB,OAAO,UAAQ,GACd,OAAO,CAAC,MAAM,CAAC,CAqDjB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMcpClient = createMcpClient;
|
|
4
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
|
|
5
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/client/stdio.js");
|
|
6
|
+
const sse_js_1 = require("@modelcontextprotocol/sdk/client/sse.js");
|
|
7
|
+
const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
|
|
8
|
+
/**
|
|
9
|
+
* Parse a command string into command and args array.
|
|
10
|
+
* Handles simple quoting (single and double quotes).
|
|
11
|
+
*/
|
|
12
|
+
function parseCommand(cmdString) {
|
|
13
|
+
const parts = [];
|
|
14
|
+
let current = '';
|
|
15
|
+
let inSingle = false;
|
|
16
|
+
let inDouble = false;
|
|
17
|
+
for (let i = 0; i < cmdString.length; i++) {
|
|
18
|
+
const ch = cmdString[i];
|
|
19
|
+
if (ch === "'" && !inDouble) {
|
|
20
|
+
inSingle = !inSingle;
|
|
21
|
+
}
|
|
22
|
+
else if (ch === '"' && !inSingle) {
|
|
23
|
+
inDouble = !inDouble;
|
|
24
|
+
}
|
|
25
|
+
else if (ch === ' ' && !inSingle && !inDouble) {
|
|
26
|
+
if (current) {
|
|
27
|
+
parts.push(current);
|
|
28
|
+
current = '';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
current += ch;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (current)
|
|
36
|
+
parts.push(current);
|
|
37
|
+
const [command, ...args] = parts;
|
|
38
|
+
return { command, args };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create and connect an MCP client using the appropriate transport.
|
|
42
|
+
*/
|
|
43
|
+
async function createMcpClient(config, verbose = false) {
|
|
44
|
+
const client = new index_js_1.Client({
|
|
45
|
+
name: 'mcp2cli',
|
|
46
|
+
version: '1.0.0',
|
|
47
|
+
});
|
|
48
|
+
if (config.type === 'stdio') {
|
|
49
|
+
if (!config.command) {
|
|
50
|
+
throw new Error('stdio config requires a command');
|
|
51
|
+
}
|
|
52
|
+
const { command, args } = parseCommand(config.command);
|
|
53
|
+
const env = {
|
|
54
|
+
...Object.fromEntries(Object.entries(process.env).filter(([, v]) => v !== undefined)),
|
|
55
|
+
...(config.env ?? {}),
|
|
56
|
+
};
|
|
57
|
+
const transport = new stdio_js_1.StdioClientTransport({ command, args, env });
|
|
58
|
+
await client.connect(transport);
|
|
59
|
+
if (verbose) {
|
|
60
|
+
console.error(`[mcp2cli] Connected via stdio: ${config.command}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
if (!config.url) {
|
|
65
|
+
throw new Error('http config requires a url');
|
|
66
|
+
}
|
|
67
|
+
const serverUrl = new URL(config.url);
|
|
68
|
+
const headers = config.headers ?? {};
|
|
69
|
+
// Try modern Streamable HTTP first, fall back to legacy SSE
|
|
70
|
+
try {
|
|
71
|
+
const transport = new streamableHttp_js_1.StreamableHTTPClientTransport(serverUrl, {
|
|
72
|
+
requestInit: { headers },
|
|
73
|
+
});
|
|
74
|
+
await client.connect(transport);
|
|
75
|
+
if (verbose) {
|
|
76
|
+
console.error(`[mcp2cli] Connected via Streamable HTTP: ${config.url}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
if (verbose) {
|
|
81
|
+
console.error(`[mcp2cli] Streamable HTTP failed, falling back to SSE`);
|
|
82
|
+
}
|
|
83
|
+
const sseTransport = new sse_js_1.SSEClientTransport(serverUrl, {
|
|
84
|
+
requestInit: { headers },
|
|
85
|
+
});
|
|
86
|
+
await client.connect(sseTransport);
|
|
87
|
+
if (verbose) {
|
|
88
|
+
console.error(`[mcp2cli] Connected via SSE: ${config.url}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return client;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const ora_1 = __importDefault(require("ora"));
|
|
10
|
+
const index_1 = require("./client/index");
|
|
11
|
+
const index_2 = require("./runner/index");
|
|
12
|
+
const bake_1 = require("./bake");
|
|
13
|
+
// --------------------------------------------------------------------------
|
|
14
|
+
// @name shortcut resolution: rewrite argv before parsing
|
|
15
|
+
// --------------------------------------------------------------------------
|
|
16
|
+
async function resolveAtShortcut() {
|
|
17
|
+
const args = process.argv.slice(2);
|
|
18
|
+
if (args.length === 0 || !args[0].startsWith('@'))
|
|
19
|
+
return;
|
|
20
|
+
const bakeName = args[0].slice(1);
|
|
21
|
+
const entry = await (0, bake_1.getBake)(bakeName);
|
|
22
|
+
if (!entry) {
|
|
23
|
+
console.error(chalk_1.default.red(`No bake found for "@${bakeName}". Use 'mcp2cli bake list' to see saved configs.`));
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
// Replace @name with the equivalent --mcp / --mcp-stdio flags
|
|
27
|
+
process.argv.splice(2, 1, ...(0, bake_1.configToArgs)(entry.config));
|
|
28
|
+
}
|
|
29
|
+
// --------------------------------------------------------------------------
|
|
30
|
+
// bake subcommand
|
|
31
|
+
// --------------------------------------------------------------------------
|
|
32
|
+
function buildBakeCommand() {
|
|
33
|
+
const bakeCmd = new commander_1.Command('bake').description('Manage saved MCP server configurations');
|
|
34
|
+
bakeCmd
|
|
35
|
+
.command('create <name>')
|
|
36
|
+
.description('Save an MCP server config as a named shortcut')
|
|
37
|
+
.option('--mcp <url>', 'MCP HTTP/SSE server URL')
|
|
38
|
+
.option('--mcp-stdio <command>', 'MCP stdio server command')
|
|
39
|
+
.option('--env <KEY=VALUE...>', 'Environment variables for stdio server')
|
|
40
|
+
.option('--header <Header:Value...>', 'HTTP headers for HTTP server')
|
|
41
|
+
.action(async (name, opts) => {
|
|
42
|
+
if (!opts.mcp && !opts.mcpStdio) {
|
|
43
|
+
console.error(chalk_1.default.red('Error: must provide --mcp <url> or --mcp-stdio <command>'));
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
const config = buildServerConfig(opts);
|
|
47
|
+
await (0, bake_1.createBake)(name, config);
|
|
48
|
+
console.log(chalk_1.default.green(`Saved bake "${name}" successfully.`));
|
|
49
|
+
});
|
|
50
|
+
bakeCmd
|
|
51
|
+
.command('list')
|
|
52
|
+
.description('List all saved bakes')
|
|
53
|
+
.action(async () => {
|
|
54
|
+
const bakes = await (0, bake_1.listBakes)();
|
|
55
|
+
if (bakes.length === 0) {
|
|
56
|
+
console.log(chalk_1.default.yellow('No saved bakes.'));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
console.log(chalk_1.default.bold('\nSaved bakes:\n'));
|
|
60
|
+
for (const b of bakes) {
|
|
61
|
+
const loc = b.config.type === 'http'
|
|
62
|
+
? chalk_1.default.cyan(b.config.url)
|
|
63
|
+
: chalk_1.default.cyan(b.config.command);
|
|
64
|
+
console.log(` ${chalk_1.default.bold(b.name)} (${b.config.type}) ${loc}`);
|
|
65
|
+
console.log(` Created: ${b.createdAt}`);
|
|
66
|
+
}
|
|
67
|
+
console.log();
|
|
68
|
+
});
|
|
69
|
+
bakeCmd
|
|
70
|
+
.command('delete <name>')
|
|
71
|
+
.description('Delete a saved bake')
|
|
72
|
+
.action(async (name) => {
|
|
73
|
+
const deleted = await (0, bake_1.deleteBake)(name);
|
|
74
|
+
if (deleted) {
|
|
75
|
+
console.log(chalk_1.default.green(`Deleted bake "${name}".`));
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
console.error(chalk_1.default.red(`Bake "${name}" not found.`));
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return bakeCmd;
|
|
83
|
+
}
|
|
84
|
+
// --------------------------------------------------------------------------
|
|
85
|
+
// completion subcommand
|
|
86
|
+
// --------------------------------------------------------------------------
|
|
87
|
+
function buildCompletionCommand() {
|
|
88
|
+
return new commander_1.Command('completion')
|
|
89
|
+
.description('Output shell completion script')
|
|
90
|
+
.argument('[shell]', 'Shell type: bash | zsh | fish', 'bash')
|
|
91
|
+
.action((shell) => {
|
|
92
|
+
if (shell === 'bash') {
|
|
93
|
+
console.log(BASH_COMPLETION);
|
|
94
|
+
}
|
|
95
|
+
else if (shell === 'zsh') {
|
|
96
|
+
console.log(ZSH_COMPLETION);
|
|
97
|
+
}
|
|
98
|
+
else if (shell === 'fish') {
|
|
99
|
+
console.log(FISH_COMPLETION);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.error(chalk_1.default.red(`Unknown shell: ${shell}. Use bash, zsh, or fish.`));
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
// --------------------------------------------------------------------------
|
|
108
|
+
// Helpers
|
|
109
|
+
// --------------------------------------------------------------------------
|
|
110
|
+
function buildServerConfig(opts) {
|
|
111
|
+
if (opts.mcp) {
|
|
112
|
+
const headers = {};
|
|
113
|
+
for (const h of opts.header ?? []) {
|
|
114
|
+
const idx = h.indexOf(':');
|
|
115
|
+
if (idx !== -1) {
|
|
116
|
+
headers[h.slice(0, idx).trim()] = h.slice(idx + 1).trim();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { type: 'http', url: opts.mcp, headers };
|
|
120
|
+
}
|
|
121
|
+
const env = {};
|
|
122
|
+
for (const e of opts.env ?? []) {
|
|
123
|
+
const idx = e.indexOf('=');
|
|
124
|
+
if (idx !== -1) {
|
|
125
|
+
env[e.slice(0, idx)] = e.slice(idx + 1);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return { type: 'stdio', command: opts.mcpStdio, env };
|
|
129
|
+
}
|
|
130
|
+
// --------------------------------------------------------------------------
|
|
131
|
+
// Main program
|
|
132
|
+
// --------------------------------------------------------------------------
|
|
133
|
+
async function main() {
|
|
134
|
+
await resolveAtShortcut();
|
|
135
|
+
const program = new commander_1.Command('mcp2cli');
|
|
136
|
+
program
|
|
137
|
+
.description('Command-line proxy for any MCP server')
|
|
138
|
+
.version('1.0.0')
|
|
139
|
+
.enablePositionalOptions()
|
|
140
|
+
.option('--mcp <url>', 'MCP HTTP/SSE server URL')
|
|
141
|
+
.option('--mcp-stdio <command>', 'MCP stdio server command')
|
|
142
|
+
.option('--env <KEY=VALUE...>', 'Environment variables for stdio server')
|
|
143
|
+
.option('--header <Header: Value...>', 'Custom HTTP headers for HTTP server')
|
|
144
|
+
.option('-l, --list', 'List available tools and exit')
|
|
145
|
+
.option('--pretty', 'Pretty-print output (default)')
|
|
146
|
+
.option('--raw', 'Output raw JSON')
|
|
147
|
+
.option('--jq <expression>', 'Filter output with JMESPath expression')
|
|
148
|
+
.option('--no-cache', 'Bypass tool list cache')
|
|
149
|
+
.option('--cache-ttl <seconds>', 'Cache TTL in seconds', '3600')
|
|
150
|
+
.allowUnknownOption(true)
|
|
151
|
+
.addCommand(buildBakeCommand())
|
|
152
|
+
.addCommand(buildCompletionCommand());
|
|
153
|
+
program.action(async (_opts, cmd) => {
|
|
154
|
+
const opts = cmd.opts();
|
|
155
|
+
if (!opts.mcp && !opts.mcpStdio) {
|
|
156
|
+
program.help();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const config = buildServerConfig({
|
|
160
|
+
mcp: opts.mcp,
|
|
161
|
+
mcpStdio: opts.mcpStdio,
|
|
162
|
+
env: opts.env,
|
|
163
|
+
header: opts.header,
|
|
164
|
+
});
|
|
165
|
+
const noCache = opts.noCache === true;
|
|
166
|
+
const cacheTtl = parseInt(String(opts.cacheTtl ?? '3600'), 10);
|
|
167
|
+
const spinner = (0, ora_1.default)('Connecting to MCP server…').start();
|
|
168
|
+
let client;
|
|
169
|
+
try {
|
|
170
|
+
client = await (0, index_1.createMcpClient)(config);
|
|
171
|
+
spinner.succeed('Connected');
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
spinner.fail(`Connection failed: ${err.message}`);
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
const tools = await (0, index_2.getTools)(client, config, { noCache, cacheTtl });
|
|
179
|
+
if (opts.list) {
|
|
180
|
+
(0, index_2.printToolList)(tools);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// The first unknown arg is the tool name
|
|
184
|
+
const remaining = cmd.args;
|
|
185
|
+
const toolName = remaining[0];
|
|
186
|
+
if (!toolName) {
|
|
187
|
+
console.error(chalk_1.default.red('Error: tool name required. Use --list to see available tools.'));
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
const tool = tools.find((t) => t.name === toolName);
|
|
191
|
+
if (!tool) {
|
|
192
|
+
console.error(chalk_1.default.red(`Unknown tool "${toolName}". Use --list to see available tools.`));
|
|
193
|
+
process.exit(1);
|
|
194
|
+
}
|
|
195
|
+
await (0, index_2.runTool)(client, tool, remaining.slice(1), {
|
|
196
|
+
raw: opts.raw,
|
|
197
|
+
jq: opts.jq,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
await client.close();
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
await program.parseAsync(process.argv);
|
|
205
|
+
}
|
|
206
|
+
main().catch((err) => {
|
|
207
|
+
console.error(chalk_1.default.red(`Fatal error: ${err.message ?? err}`));
|
|
208
|
+
process.exit(1);
|
|
209
|
+
});
|
|
210
|
+
// --------------------------------------------------------------------------
|
|
211
|
+
// Shell completion scripts
|
|
212
|
+
// --------------------------------------------------------------------------
|
|
213
|
+
const BASH_COMPLETION = `
|
|
214
|
+
# mcp2cli bash completion
|
|
215
|
+
_mcp2cli_completion() {
|
|
216
|
+
local cur prev words
|
|
217
|
+
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
218
|
+
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
219
|
+
case "\${prev}" in
|
|
220
|
+
mcp2cli)
|
|
221
|
+
COMPREPLY=($(compgen -W "--mcp --mcp-stdio --list --raw --jq --no-cache --cache-ttl --pretty --env --header bake completion" -- "\${cur}"))
|
|
222
|
+
;;
|
|
223
|
+
bake)
|
|
224
|
+
COMPREPLY=($(compgen -W "create list delete" -- "\${cur}"))
|
|
225
|
+
;;
|
|
226
|
+
completion)
|
|
227
|
+
COMPREPLY=($(compgen -W "bash zsh fish" -- "\${cur}"))
|
|
228
|
+
;;
|
|
229
|
+
esac
|
|
230
|
+
}
|
|
231
|
+
complete -F _mcp2cli_completion mcp2cli
|
|
232
|
+
`.trim();
|
|
233
|
+
const ZSH_COMPLETION = `
|
|
234
|
+
#compdef mcp2cli
|
|
235
|
+
|
|
236
|
+
_mcp2cli() {
|
|
237
|
+
local -a commands
|
|
238
|
+
commands=(
|
|
239
|
+
'bake:Manage saved MCP server configurations'
|
|
240
|
+
'completion:Output shell completion script'
|
|
241
|
+
)
|
|
242
|
+
_arguments \\
|
|
243
|
+
'--mcp[MCP HTTP/SSE server URL]:url:' \\
|
|
244
|
+
'--mcp-stdio[MCP stdio server command]:command:' \\
|
|
245
|
+
'--list[List available tools]' \\
|
|
246
|
+
'--raw[Output raw JSON]' \\
|
|
247
|
+
'--jq[JMESPath expression]:expression:' \\
|
|
248
|
+
'--no-cache[Bypass cache]' \\
|
|
249
|
+
'--cache-ttl[Cache TTL in seconds]:seconds:' \\
|
|
250
|
+
'--pretty[Pretty-print output]' \\
|
|
251
|
+
'--env[Environment variables]:KEY=VALUE:' \\
|
|
252
|
+
'--header[HTTP headers]:Header\\:Value:' \\
|
|
253
|
+
'1:command:->command'
|
|
254
|
+
case \$state in
|
|
255
|
+
command) _describe 'command' commands ;;
|
|
256
|
+
esac
|
|
257
|
+
}
|
|
258
|
+
_mcp2cli
|
|
259
|
+
`.trim();
|
|
260
|
+
const FISH_COMPLETION = `
|
|
261
|
+
# mcp2cli fish completion
|
|
262
|
+
complete -c mcp2cli -l mcp -d 'MCP HTTP/SSE server URL' -r
|
|
263
|
+
complete -c mcp2cli -l mcp-stdio -d 'MCP stdio server command' -r
|
|
264
|
+
complete -c mcp2cli -l list -d 'List available tools'
|
|
265
|
+
complete -c mcp2cli -l raw -d 'Output raw JSON'
|
|
266
|
+
complete -c mcp2cli -l jq -d 'JMESPath expression' -r
|
|
267
|
+
complete -c mcp2cli -l no-cache -d 'Bypass cache'
|
|
268
|
+
complete -c mcp2cli -l cache-ttl -d 'Cache TTL in seconds' -r
|
|
269
|
+
complete -c mcp2cli -l pretty -d 'Pretty-print output'
|
|
270
|
+
complete -c mcp2cli -l env -d 'Environment variables' -r
|
|
271
|
+
complete -c mcp2cli -l header -d 'HTTP headers' -r
|
|
272
|
+
complete -c mcp2cli -f -a bake -d 'Manage saved configs'
|
|
273
|
+
complete -c mcp2cli -f -a completion -d 'Output shell completion script'
|
|
274
|
+
`.trim();
|
|
275
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { McpServerConfig, ToolParam, ToolDefinition } from '../types/index';
|
|
3
|
+
/** Convert camelCase or snake_case property name to kebab-case CLI flag */
|
|
4
|
+
export declare function toKebabCase(name: string): string;
|
|
5
|
+
/** Build ToolParam list from a tool's inputSchema */
|
|
6
|
+
export declare function schemaToParams(tool: ToolDefinition): ToolParam[];
|
|
7
|
+
/**
|
|
8
|
+
* Fetch tools from the MCP server, using cache when available.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getTools(client: Client, config: McpServerConfig, options: {
|
|
11
|
+
noCache?: boolean;
|
|
12
|
+
cacheTtl?: number;
|
|
13
|
+
}): Promise<ToolDefinition[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Print a formatted list of all tools.
|
|
16
|
+
*/
|
|
17
|
+
export declare function printToolList(tools: ToolDefinition[]): void;
|
|
18
|
+
/**
|
|
19
|
+
* Execute a named tool with the given client.
|
|
20
|
+
* Dynamically builds a subcommand from the tool's schema, parses args, calls the tool.
|
|
21
|
+
*/
|
|
22
|
+
export declare function runTool(client: Client, tool: ToolDefinition, rawArgs: string[], options: {
|
|
23
|
+
raw?: boolean;
|
|
24
|
+
jq?: string;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAsB,MAAM,gBAAgB,CAAC;AAIhG,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhD;AAiBD,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,EAAE,CAiBhE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,cAAc,EAAE,CAAC,CAoB3B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,CAoB3D;AAuED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GACtC,OAAO,CAAC,IAAI,CAAC,CA0Df"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.toKebabCase = toKebabCase;
|
|
7
|
+
exports.schemaToParams = schemaToParams;
|
|
8
|
+
exports.getTools = getTools;
|
|
9
|
+
exports.printToolList = printToolList;
|
|
10
|
+
exports.runTool = runTool;
|
|
11
|
+
const commander_1 = require("commander");
|
|
12
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
13
|
+
const jmespath_1 = __importDefault(require("jmespath"));
|
|
14
|
+
const cache_1 = require("../cache");
|
|
15
|
+
const DEFAULT_CACHE_TTL = 3600;
|
|
16
|
+
/** Convert camelCase or snake_case property name to kebab-case CLI flag */
|
|
17
|
+
function toKebabCase(name) {
|
|
18
|
+
return name
|
|
19
|
+
.replace(/_/g, '-')
|
|
20
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
|
|
21
|
+
.toLowerCase();
|
|
22
|
+
}
|
|
23
|
+
/** Resolve the primary type from a JSON Schema type field (string or array) */
|
|
24
|
+
function resolveType(schemaProp) {
|
|
25
|
+
const raw = schemaProp.type;
|
|
26
|
+
const primary = Array.isArray(raw)
|
|
27
|
+
? (raw.find((t) => t !== 'null') ?? 'string')
|
|
28
|
+
: raw ?? 'string';
|
|
29
|
+
if (primary === 'integer' || primary === 'number')
|
|
30
|
+
return 'number';
|
|
31
|
+
if (primary === 'boolean')
|
|
32
|
+
return 'boolean';
|
|
33
|
+
if (primary === 'array')
|
|
34
|
+
return 'array';
|
|
35
|
+
return 'string';
|
|
36
|
+
}
|
|
37
|
+
/** Build ToolParam list from a tool's inputSchema */
|
|
38
|
+
function schemaToParams(tool) {
|
|
39
|
+
const schema = tool.inputSchema;
|
|
40
|
+
const properties = schema.properties ?? {};
|
|
41
|
+
const required = new Set(schema.required ?? []);
|
|
42
|
+
return Object.entries(properties).map(([name, prop]) => {
|
|
43
|
+
const type = resolveType(prop);
|
|
44
|
+
return {
|
|
45
|
+
name,
|
|
46
|
+
cliFlag: toKebabCase(name),
|
|
47
|
+
type,
|
|
48
|
+
description: prop.description ?? '',
|
|
49
|
+
required: required.has(name),
|
|
50
|
+
defaultValue: prop.default,
|
|
51
|
+
enumValues: prop.enum,
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Fetch tools from the MCP server, using cache when available.
|
|
57
|
+
*/
|
|
58
|
+
async function getTools(client, config, options) {
|
|
59
|
+
const ttl = options.cacheTtl ?? DEFAULT_CACHE_TTL;
|
|
60
|
+
if (!options.noCache) {
|
|
61
|
+
const cached = await (0, cache_1.getCachedTools)(config, ttl);
|
|
62
|
+
if (cached)
|
|
63
|
+
return cached;
|
|
64
|
+
}
|
|
65
|
+
const allTools = [];
|
|
66
|
+
let cursor;
|
|
67
|
+
do {
|
|
68
|
+
const result = await client.listTools({ cursor });
|
|
69
|
+
allTools.push(...result.tools);
|
|
70
|
+
cursor = result.nextCursor;
|
|
71
|
+
} while (cursor);
|
|
72
|
+
if (!options.noCache) {
|
|
73
|
+
await (0, cache_1.setCachedTools)(config, allTools, ttl);
|
|
74
|
+
}
|
|
75
|
+
return allTools;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Print a formatted list of all tools.
|
|
79
|
+
*/
|
|
80
|
+
function printToolList(tools) {
|
|
81
|
+
if (tools.length === 0) {
|
|
82
|
+
console.log(chalk_1.default.yellow('No tools available.'));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
console.log(chalk_1.default.bold(`\nAvailable tools (${tools.length}):\n`));
|
|
86
|
+
for (const tool of tools) {
|
|
87
|
+
console.log(` ${chalk_1.default.cyan(tool.name)}`);
|
|
88
|
+
if (tool.description) {
|
|
89
|
+
console.log(` ${chalk_1.default.gray(tool.description)}`);
|
|
90
|
+
}
|
|
91
|
+
const params = schemaToParams(tool);
|
|
92
|
+
if (params.length > 0) {
|
|
93
|
+
const paramStr = params
|
|
94
|
+
.map((p) => (p.required ? chalk_1.default.yellow(`--${p.cliFlag}`) : `--${p.cliFlag}`))
|
|
95
|
+
.join(' ');
|
|
96
|
+
console.log(` ${paramStr}`);
|
|
97
|
+
}
|
|
98
|
+
console.log();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Format and print tool result content */
|
|
102
|
+
function formatResult(result, options) {
|
|
103
|
+
let data = result;
|
|
104
|
+
if (options.jq) {
|
|
105
|
+
try {
|
|
106
|
+
data = jmespath_1.default.search(data, options.jq);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
console.error(chalk_1.default.red(`JMESPath error: ${err.message}`));
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (options.raw) {
|
|
114
|
+
console.log(JSON.stringify(data, null, 2));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Pretty-print: handle MCP content blocks
|
|
118
|
+
if (data &&
|
|
119
|
+
typeof data === 'object' &&
|
|
120
|
+
'content' in data) {
|
|
121
|
+
const content = data.content;
|
|
122
|
+
if (Array.isArray(content)) {
|
|
123
|
+
for (const block of content) {
|
|
124
|
+
if (block &&
|
|
125
|
+
typeof block === 'object' &&
|
|
126
|
+
'type' in block) {
|
|
127
|
+
const b = block;
|
|
128
|
+
if (b.type === 'text' && b.text !== undefined) {
|
|
129
|
+
console.log(b.text);
|
|
130
|
+
}
|
|
131
|
+
else if (b.type === 'image') {
|
|
132
|
+
console.log(chalk_1.default.gray(`[image: ${b.mimeType ?? 'unknown'}]`));
|
|
133
|
+
}
|
|
134
|
+
else if (b.type === 'resource') {
|
|
135
|
+
console.log(chalk_1.default.gray(`[resource: ${b.uri ?? 'unknown'}]`));
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
console.log(JSON.stringify(block, null, 2));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Fallback: pretty JSON
|
|
146
|
+
console.log(JSON.stringify(data, null, 2));
|
|
147
|
+
}
|
|
148
|
+
/** Coerce a CLI string value to the expected type */
|
|
149
|
+
function coerceValue(value, type) {
|
|
150
|
+
if (type === 'number')
|
|
151
|
+
return Number(value);
|
|
152
|
+
if (type === 'boolean')
|
|
153
|
+
return value !== 'false' && value !== '0';
|
|
154
|
+
if (type === 'array') {
|
|
155
|
+
// Accept comma-separated or JSON array string
|
|
156
|
+
try {
|
|
157
|
+
const parsed = JSON.parse(value);
|
|
158
|
+
if (Array.isArray(parsed))
|
|
159
|
+
return parsed;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// fall through
|
|
163
|
+
}
|
|
164
|
+
return value.split(',').map((s) => s.trim());
|
|
165
|
+
}
|
|
166
|
+
return value;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Execute a named tool with the given client.
|
|
170
|
+
* Dynamically builds a subcommand from the tool's schema, parses args, calls the tool.
|
|
171
|
+
*/
|
|
172
|
+
async function runTool(client, tool, rawArgs, options) {
|
|
173
|
+
const params = schemaToParams(tool);
|
|
174
|
+
const sub = new commander_1.Command(tool.name);
|
|
175
|
+
if (tool.description)
|
|
176
|
+
sub.description(tool.description);
|
|
177
|
+
for (const param of params) {
|
|
178
|
+
let flagStr;
|
|
179
|
+
if (param.type === 'boolean') {
|
|
180
|
+
flagStr = `--${param.cliFlag}`;
|
|
181
|
+
}
|
|
182
|
+
else if (param.type === 'array') {
|
|
183
|
+
flagStr = `--${param.cliFlag} <values...>`;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
flagStr = `--${param.cliFlag} <value>`;
|
|
187
|
+
}
|
|
188
|
+
const opt = new commander_1.Option(flagStr, param.description);
|
|
189
|
+
if (param.required)
|
|
190
|
+
opt.makeOptionMandatory(true);
|
|
191
|
+
if (param.defaultValue !== undefined)
|
|
192
|
+
opt.default(param.defaultValue);
|
|
193
|
+
if (param.enumValues)
|
|
194
|
+
opt.choices(param.enumValues);
|
|
195
|
+
sub.addOption(opt);
|
|
196
|
+
}
|
|
197
|
+
sub.allowUnknownOption(false);
|
|
198
|
+
sub.exitOverride();
|
|
199
|
+
sub.configureOutput({
|
|
200
|
+
writeErr: (str) => process.stderr.write(str),
|
|
201
|
+
});
|
|
202
|
+
try {
|
|
203
|
+
sub.parse(['node', tool.name, ...rawArgs]);
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
const e = err;
|
|
207
|
+
if (e.code === 'commander.missingMandatoryOptionValue' || e.code === 'commander.optionMissingArgument') {
|
|
208
|
+
process.stderr.write(`${e.message ?? 'Missing required option'}\n`);
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
throw err;
|
|
212
|
+
}
|
|
213
|
+
const opts = sub.opts();
|
|
214
|
+
// Build arguments object using original property names
|
|
215
|
+
const toolArgs = {};
|
|
216
|
+
for (const param of params) {
|
|
217
|
+
const cliKey = param.cliFlag.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
218
|
+
const rawVal = opts[cliKey];
|
|
219
|
+
if (rawVal === undefined)
|
|
220
|
+
continue;
|
|
221
|
+
const coerced = param.type === 'array' && Array.isArray(rawVal)
|
|
222
|
+
? rawVal.map((v) => coerceValue(v, 'string'))
|
|
223
|
+
: typeof rawVal === 'string'
|
|
224
|
+
? coerceValue(rawVal, param.type)
|
|
225
|
+
: rawVal;
|
|
226
|
+
toolArgs[param.name] = coerced;
|
|
227
|
+
}
|
|
228
|
+
const result = await client.callTool({ name: tool.name, arguments: toolArgs });
|
|
229
|
+
formatResult(result, options);
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runner/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export interface McpServerConfig {
|
|
2
|
+
type: 'http' | 'stdio';
|
|
3
|
+
/** HTTP/SSE server URL (for type === 'http') */
|
|
4
|
+
url?: string;
|
|
5
|
+
/** Full command string to spawn (for type === 'stdio') */
|
|
6
|
+
command?: string;
|
|
7
|
+
/** Extra environment variables for the stdio process */
|
|
8
|
+
env?: Record<string, string>;
|
|
9
|
+
/** Custom HTTP headers for the HTTP server */
|
|
10
|
+
headers?: Record<string, string>;
|
|
11
|
+
}
|
|
12
|
+
export interface BakeEntry {
|
|
13
|
+
name: string;
|
|
14
|
+
config: McpServerConfig;
|
|
15
|
+
createdAt: string;
|
|
16
|
+
}
|
|
17
|
+
export interface BakeStore {
|
|
18
|
+
[name: string]: BakeEntry;
|
|
19
|
+
}
|
|
20
|
+
export interface GlobalOptions {
|
|
21
|
+
mcp?: string;
|
|
22
|
+
mcpStdio?: string;
|
|
23
|
+
env?: string[];
|
|
24
|
+
header?: string[];
|
|
25
|
+
list?: boolean;
|
|
26
|
+
pretty?: boolean;
|
|
27
|
+
raw?: boolean;
|
|
28
|
+
jq?: string;
|
|
29
|
+
noCache?: boolean;
|
|
30
|
+
cacheTtl?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface ToolParam {
|
|
33
|
+
/** Original property name from the JSON Schema (may be camelCase) */
|
|
34
|
+
name: string;
|
|
35
|
+
/** Kebab-cased CLI flag name without leading dashes */
|
|
36
|
+
cliFlag: string;
|
|
37
|
+
type: 'string' | 'number' | 'boolean' | 'array';
|
|
38
|
+
description: string;
|
|
39
|
+
required: boolean;
|
|
40
|
+
defaultValue?: unknown;
|
|
41
|
+
enumValues?: string[];
|
|
42
|
+
}
|
|
43
|
+
export interface CacheEntry {
|
|
44
|
+
tools: ToolDefinition[];
|
|
45
|
+
cachedAt: number;
|
|
46
|
+
ttl: number;
|
|
47
|
+
}
|
|
48
|
+
export interface ToolDefinition {
|
|
49
|
+
name: string;
|
|
50
|
+
description?: string;
|
|
51
|
+
inputSchema: {
|
|
52
|
+
type: string;
|
|
53
|
+
properties?: Record<string, JsonSchemaProperty>;
|
|
54
|
+
required?: string[];
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export interface JsonSchemaProperty {
|
|
58
|
+
type?: string | string[];
|
|
59
|
+
description?: string;
|
|
60
|
+
default?: unknown;
|
|
61
|
+
enum?: string[];
|
|
62
|
+
items?: JsonSchemaProperty;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAChD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tronsfey/mcp2cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Command-line proxy for any MCP server — call tools directly from the terminal",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mcp2cli": "./bin/mcp2cli"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/",
|
|
11
|
+
"bin/",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"keywords": [
|
|
16
|
+
"mcp",
|
|
17
|
+
"model-context-protocol",
|
|
18
|
+
"cli",
|
|
19
|
+
"proxy",
|
|
20
|
+
"commander",
|
|
21
|
+
"typescript",
|
|
22
|
+
"ai",
|
|
23
|
+
"tools"
|
|
24
|
+
],
|
|
25
|
+
"author": "",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/tronsfey928/mcp2cli.git"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://github.com/tronsfey928/mcp2cli#readme",
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/tronsfey928/mcp2cli/issues"
|
|
34
|
+
},
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc",
|
|
40
|
+
"dev": "ts-node src/index.ts",
|
|
41
|
+
"start": "node dist/index.js",
|
|
42
|
+
"test": "jest --testPathIgnorePatterns=tests/integration",
|
|
43
|
+
"test:coverage": "jest --coverage --testPathIgnorePatterns=tests/integration",
|
|
44
|
+
"test:e2e": "npm run build && jest --testPathPattern=tests/integration --testTimeout=30000 --runInBand --forceExit",
|
|
45
|
+
"lint": "tsc --noEmit",
|
|
46
|
+
"clean": "rm -rf dist",
|
|
47
|
+
"prepublishOnly": "npm run lint && npm test && npm run build"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
51
|
+
"chalk": "^4.1.2",
|
|
52
|
+
"commander": "^12.1.0",
|
|
53
|
+
"fs-extra": "^11.2.0",
|
|
54
|
+
"jmespath": "^0.16.0",
|
|
55
|
+
"ora": "^5.4.1",
|
|
56
|
+
"yaml": "^2.8.3"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/express": "^4.17.25",
|
|
60
|
+
"@types/fs-extra": "^11.0.4",
|
|
61
|
+
"@types/jest": "^29.5.14",
|
|
62
|
+
"@types/jmespath": "^0.15.2",
|
|
63
|
+
"@types/node": "^22.0.0",
|
|
64
|
+
"jest": "^29.7.0",
|
|
65
|
+
"ts-jest": "^29.4.0",
|
|
66
|
+
"ts-node": "^10.9.2",
|
|
67
|
+
"typescript": "^5.7.3",
|
|
68
|
+
"zod": "^3.25.76"
|
|
69
|
+
},
|
|
70
|
+
"jest": {
|
|
71
|
+
"preset": "ts-jest",
|
|
72
|
+
"testEnvironment": "node",
|
|
73
|
+
"testMatch": [
|
|
74
|
+
"**/tests/**/*.test.ts"
|
|
75
|
+
],
|
|
76
|
+
"collectCoverageFrom": [
|
|
77
|
+
"src/**/*.ts"
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
}
|