@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 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
@@ -0,0 +1,2 @@
1
+ #\!/usr/bin/env node
2
+ require('../dist/index.js');
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bake.js","sourceRoot":"","sources":["../src/bake.ts"],"names":[],"mappings":"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"}
@@ -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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -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
+ }