@darkiceinteractive/mcp-conductor 3.1.0-rc.2 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +140 -12
- package/dist/bin/cli.d.ts +2 -2
- package/dist/bin/cli.js +37 -14
- package/dist/bin/cli.js.map +1 -1
- package/dist/cli/clients/adapter.d.ts +103 -0
- package/dist/cli/clients/adapter.d.ts.map +1 -0
- package/dist/cli/clients/adapter.js +24 -0
- package/dist/cli/clients/adapter.js.map +1 -0
- package/dist/cli/clients/claude-code.d.ts +15 -0
- package/dist/cli/clients/claude-code.d.ts.map +1 -0
- package/dist/cli/clients/claude-code.js +110 -0
- package/dist/cli/clients/claude-code.js.map +1 -0
- package/dist/cli/clients/claude-desktop.d.ts +26 -0
- package/dist/cli/clients/claude-desktop.d.ts.map +1 -0
- package/dist/cli/clients/claude-desktop.js +118 -0
- package/dist/cli/clients/claude-desktop.js.map +1 -0
- package/dist/cli/clients/cline.d.ts +40 -0
- package/dist/cli/clients/cline.d.ts.map +1 -0
- package/dist/cli/clients/cline.js +134 -0
- package/dist/cli/clients/cline.js.map +1 -0
- package/dist/cli/clients/codex.d.ts +30 -0
- package/dist/cli/clients/codex.d.ts.map +1 -0
- package/dist/cli/clients/codex.js +176 -0
- package/dist/cli/clients/codex.js.map +1 -0
- package/dist/cli/clients/continue.d.ts +41 -0
- package/dist/cli/clients/continue.d.ts.map +1 -0
- package/dist/cli/clients/continue.js +150 -0
- package/dist/cli/clients/continue.js.map +1 -0
- package/dist/cli/clients/cursor.d.ts +20 -0
- package/dist/cli/clients/cursor.d.ts.map +1 -0
- package/dist/cli/clients/cursor.js +110 -0
- package/dist/cli/clients/cursor.js.map +1 -0
- package/dist/cli/clients/gemini-cli.d.ts +42 -0
- package/dist/cli/clients/gemini-cli.d.ts.map +1 -0
- package/dist/cli/clients/gemini-cli.js +169 -0
- package/dist/cli/clients/gemini-cli.js.map +1 -0
- package/dist/cli/clients/index.d.ts +28 -0
- package/dist/cli/clients/index.d.ts.map +1 -0
- package/dist/cli/clients/index.js +44 -0
- package/dist/cli/clients/index.js.map +1 -0
- package/dist/cli/clients/kimi-code.d.ts +33 -0
- package/dist/cli/clients/kimi-code.d.ts.map +1 -0
- package/dist/cli/clients/kimi-code.js +177 -0
- package/dist/cli/clients/kimi-code.js.map +1 -0
- package/dist/cli/clients/opencode.d.ts +21 -0
- package/dist/cli/clients/opencode.d.ts.map +1 -0
- package/dist/cli/clients/opencode.js +150 -0
- package/dist/cli/clients/opencode.js.map +1 -0
- package/dist/cli/clients/registry.d.ts +51 -0
- package/dist/cli/clients/registry.d.ts.map +1 -0
- package/dist/cli/clients/registry.js +169 -0
- package/dist/cli/clients/registry.js.map +1 -0
- package/dist/cli/clients/zed.d.ts +41 -0
- package/dist/cli/clients/zed.d.ts.map +1 -0
- package/dist/cli/clients/zed.js +171 -0
- package/dist/cli/clients/zed.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +27 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +71 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/export-servers.d.ts +60 -0
- package/dist/cli/commands/export-servers.d.ts.map +1 -1
- package/dist/cli/commands/export-servers.js +85 -1
- package/dist/cli/commands/export-servers.js.map +1 -1
- package/dist/cli/commands/import-servers.d.ts +1 -1
- package/dist/cli/commands/import-servers.js +2 -2
- package/dist/cli/commands/import-servers.js.map +1 -1
- package/dist/cli/wizard/setup.d.ts +29 -3
- package/dist/cli/wizard/setup.d.ts.map +1 -1
- package/dist/cli/wizard/setup.js +204 -7
- package/dist/cli/wizard/setup.js.map +1 -1
- package/dist/config/loader.d.ts +10 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +14 -24
- package/dist/config/loader.js.map +1 -1
- package/dist/utils/backup.d.ts +24 -0
- package/dist/utils/backup.d.ts.map +1 -0
- package/dist/utils/backup.js +40 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/version.d.ts +3 -3
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +3 -3
- package/dist/version.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# MCP Conductor
|
|
2
2
|
|
|
3
|
-
**99.7% fewer tokens.
|
|
3
|
+
**The canonical MCP hub for any agent platform. 99.7% fewer tokens. One `npx` command.**
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@darkiceinteractive/mcp-conductor)
|
|
6
6
|
[](https://www.npmjs.com/package/@darkiceinteractive/mcp-conductor)
|
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
[](https://opensource.org/licenses/MIT)
|
|
9
9
|
[](https://deno.land)
|
|
10
10
|
|
|
11
|
-
MCP Conductor is a single MCP server that orchestrates all your other MCP servers through a sandboxed Deno runtime. Instead of
|
|
11
|
+
MCP Conductor is a single MCP server that orchestrates all your other MCP servers through a sandboxed Deno runtime. Works with Claude Code, Claude Desktop, Cursor, Gemini CLI, Codex CLI, Cline, Zed, Continue.dev, OpenCode, and Kimi Code. Instead of your AI client making direct tool calls (and dumping every intermediate result into your context window), it writes TypeScript code that runs in an isolated sandbox. Only the final result comes back.
|
|
12
12
|
|
|
13
13
|
```
|
|
14
|
-
Before: 153,900 tokens →
|
|
15
|
-
After: 153,900 tokens → Deno sandbox → 435 tokens →
|
|
14
|
+
Before: 153,900 tokens → AI client context window → 153,900 tokens billed
|
|
15
|
+
After: 153,900 tokens → Deno sandbox → 435 tokens → AI client context window
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
**Average measured reduction: 99.7%. Verified against Anthropic's published benchmarks.**
|
|
@@ -21,7 +21,62 @@ After: 153,900 tokens → Deno sandbox → 435 tokens → Claude context window
|
|
|
21
21
|
|
|
22
22
|
## Quick Install
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
### v3.1.1 — Supported Clients
|
|
25
|
+
|
|
26
|
+
| Client | Config path (macOS) | Config path (Linux) | Config path (Windows) |
|
|
27
|
+
|---|---|---|---|
|
|
28
|
+
| Claude Code | `~/.claude/settings.json` | `~/.claude/settings.json` | `%APPDATA%\Claude Code\claude_code_config.json` |
|
|
29
|
+
| Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` | `~/.config/claude/claude_desktop_config.json` | `%APPDATA%\Claude\claude_desktop_config.json` |
|
|
30
|
+
| Cursor | `~/.cursor/mcp.json` | `~/.cursor/mcp.json` | `~/.cursor/mcp.json` |
|
|
31
|
+
| Gemini CLI | `~/.gemini/settings.json` | `~/.gemini/settings.json` | `~/.gemini/settings.json` |
|
|
32
|
+
| Codex CLI | `~/.codex/config.toml` | `~/.codex/config.toml` | `~/.codex/config.toml` |
|
|
33
|
+
| Cline | `~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json` | `~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json` | `%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json` |
|
|
34
|
+
| Zed | `~/Library/Application Support/Zed/settings.json` | `~/.config/zed/settings.json` | `%LOCALAPPDATA%\Zed\settings.json` |
|
|
35
|
+
| Continue.dev | `~/.continue/config.yaml` | `~/.continue/config.yaml` | `~/.continue/config.yaml` |
|
|
36
|
+
| OpenCode | `~/.config/opencode/opencode.json` | `~/.config/opencode/opencode.json` | `%APPDATA%\opencode\opencode.json` |
|
|
37
|
+
| Kimi Code | `~/Library/Application Support/Kimi Code/mcp_settings.json` | `~/.config/kimi-code/mcp_settings.json` | `%APPDATA%\Kimi Code\mcp_settings.json` |
|
|
38
|
+
|
|
39
|
+
### Guided Setup (recommended)
|
|
40
|
+
|
|
41
|
+
The setup wizard auto-detects every supported client on your machine and offers per-client consolidation:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npx -y @darkiceinteractive/mcp-conductor-cli@next setup
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
See [What the wizard does](#what-the-wizard-does) below.
|
|
48
|
+
|
|
49
|
+
### Manual Config Snippets
|
|
50
|
+
|
|
51
|
+
Paste the appropriate block into your client's config file. The wizard does this automatically.
|
|
52
|
+
|
|
53
|
+
**Claude Code** (`~/.claude/settings.json`):
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"mcpServers": {
|
|
58
|
+
"mcp-conductor": {
|
|
59
|
+
"command": "npx",
|
|
60
|
+
"args": ["-y", "@darkiceinteractive/mcp-conductor"]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Claude Desktop** (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"mcpServers": {
|
|
71
|
+
"mcp-conductor": {
|
|
72
|
+
"command": "npx",
|
|
73
|
+
"args": ["-y", "@darkiceinteractive/mcp-conductor"]
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Cursor** (`~/.cursor/mcp.json`):
|
|
25
80
|
|
|
26
81
|
```json
|
|
27
82
|
{
|
|
@@ -34,14 +89,71 @@ After: 153,900 tokens → Deno sandbox → 435 tokens → Claude context window
|
|
|
34
89
|
}
|
|
35
90
|
```
|
|
36
91
|
|
|
37
|
-
|
|
92
|
+
For Codex CLI (TOML), Continue.dev (YAML), and other formats, use `mcp-conductor-cli export --client <id>` — see [Multi-client export](#multi-client-export).
|
|
93
|
+
|
|
94
|
+
Restart your AI tool after editing the config. That's it.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## What the Wizard Does
|
|
99
|
+
|
|
100
|
+
Running `npx -y @darkiceinteractive/mcp-conductor-cli@next setup` steps through the following for each detected client:
|
|
101
|
+
|
|
102
|
+
1. **Scan** — discovers all 10 client config locations on your machine (global and project-local).
|
|
103
|
+
2. **Diff** — for each existing config, parses the current server list and shows what will move.
|
|
104
|
+
3. **Confirm per-client** — prompts once per client; you can skip any client individually.
|
|
105
|
+
4. **Write conductor config** — merges your existing servers into `~/.mcp-conductor.json` and installs the conductor entry back into the client config.
|
|
106
|
+
5. **Backup originals** — creates a timestamped `.bak.YYYYMMDDHHMMSS` copy of every config file before modifying it.
|
|
107
|
+
|
|
108
|
+
In non-interactive environments (CI, piped stdin) the wizard proceeds automatically with safe defaults.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Verifying Setup
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
mcp-conductor-cli doctor
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
The `doctor` command runs a health check across all configured servers and prints an **MCP CLIENT COVERAGE** section showing every detected client config with an `[OK]` or `[MISSING]` status for the conductor entry.
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
MCP CLIENT COVERAGE
|
|
122
|
+
[OK] Claude Code ~/.claude/settings.json
|
|
123
|
+
[OK] Claude Desktop ~/Library/Application Support/Claude/claude_desktop_config.json
|
|
124
|
+
[OK] Cursor ~/.cursor/mcp.json
|
|
125
|
+
[MISSING] Zed ~/Library/Application Support/Zed/settings.json
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Run `npx -y @darkiceinteractive/mcp-conductor-cli@next setup` to install the conductor entry in any `[MISSING]` client.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Multi-client Export
|
|
133
|
+
|
|
134
|
+
Generate a ready-to-paste config snippet for any supported client:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# Codex CLI — writes TOML
|
|
138
|
+
mcp-conductor-cli export --client codex
|
|
139
|
+
|
|
140
|
+
# Continue.dev — writes YAML
|
|
141
|
+
mcp-conductor-cli export --client continue
|
|
142
|
+
|
|
143
|
+
# Claude Desktop — writes JSON (default)
|
|
144
|
+
mcp-conductor-cli export --client claude-desktop
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
The exported file is written to the current directory as `<client>-config.<ext>`. Pass `--output <path>` to override.
|
|
148
|
+
|
|
149
|
+
Full client setup documentation is at **[docs.darkice.co/setup/clients](https://docs.darkice.co/setup/clients)**.
|
|
38
150
|
|
|
39
151
|
---
|
|
40
152
|
|
|
41
153
|
## 30-Second Example
|
|
42
154
|
|
|
43
155
|
```typescript
|
|
44
|
-
//
|
|
156
|
+
// Your AI client writes this code, which runs inside the Deno sandbox
|
|
45
157
|
const [issues, files] = await mcp.batch([
|
|
46
158
|
() => mcp.server('github').call('list_issues', { owner: 'myorg', repo: 'myrepo', state: 'open' }),
|
|
47
159
|
() => mcp.server('filesystem').call('list_directory', { path: '/src' })
|
|
@@ -58,9 +170,9 @@ return {
|
|
|
58
170
|
|
|
59
171
|
## Why It Matters
|
|
60
172
|
|
|
61
|
-
When
|
|
173
|
+
When an AI client calls MCP tools directly, every response lands in the context window — raw JSON, file metadata, pagination objects, fields you never asked for. A single GitHub `list_issues` call can return 40,000+ tokens. If you're making 10 calls per task, that's 400,000 tokens before the model has written a single line of code.
|
|
62
174
|
|
|
63
|
-
MCP Conductor flips the model:
|
|
175
|
+
MCP Conductor flips the model: the client writes TypeScript code that *processes* the tool responses inside a Deno sandbox. The sandbox can call any connected MCP server, filter and aggregate the results, and return only the compact summary. Your context window stays small. Your costs stay low.
|
|
64
176
|
|
|
65
177
|
| Scenario | Without Conductor | With Conductor | Reduction |
|
|
66
178
|
|---|---|---|---|
|
|
@@ -85,6 +197,15 @@ MCP Conductor flips the model: Claude writes TypeScript code that *processes* th
|
|
|
85
197
|
| Lifecycle Tools + CLI | `import_servers_from_claude`, setup wizard (X2) | [Sandbox API](https://docs.darkice.co/docs/v3/sandbox-api) |
|
|
86
198
|
| PII Tokenisation | Built-in redaction matchers (X4) | [Configuration](https://docs.darkice.co/docs/v3/configuration) |
|
|
87
199
|
|
|
200
|
+
## v3.1.1 Additions
|
|
201
|
+
|
|
202
|
+
| Feature | What it does |
|
|
203
|
+
|---|---|
|
|
204
|
+
| Multi-client adapters | Read and write configs for all 10 supported clients |
|
|
205
|
+
| Setup wizard (MC3) | Interactive per-client consolidation with backups |
|
|
206
|
+
| Per-client export (MC4) | `export --client <id>` writes the correct format (JSON / TOML / YAML) |
|
|
207
|
+
| Doctor client coverage (MC5) | `doctor` reports `[OK]` / `[MISSING]` per detected client config |
|
|
208
|
+
|
|
88
209
|
Migrating from v2? See the [migration guide](https://docs.darkice.co/docs/v3/migration).
|
|
89
210
|
|
|
90
211
|
---
|
|
@@ -130,16 +251,23 @@ Full documentation at **https://docs.darkice.co** — deploys at D4. In the mean
|
|
|
130
251
|
| [Sandbox API](./docs/v3/sandbox-api.md) | The `mcp` object inside `execute_code` |
|
|
131
252
|
| [Recipes](./docs/v3/recipes.md) | Practical patterns and examples |
|
|
132
253
|
| [Migration (v2 → v3)](./docs/v3/migration.md) | Breaking changes and migration steps |
|
|
254
|
+
| [Client Setup](https://docs.darkice.co/setup/clients) | Per-client config reference for all 10 supported clients |
|
|
133
255
|
|
|
134
256
|
---
|
|
135
257
|
|
|
136
258
|
## CLI Quick-Start
|
|
137
259
|
|
|
138
260
|
```bash
|
|
139
|
-
# Guided setup — detects
|
|
140
|
-
npx @darkiceinteractive/mcp-conductor setup
|
|
261
|
+
# Guided multi-client setup — detects all supported client configs automatically
|
|
262
|
+
npx -y @darkiceinteractive/mcp-conductor-cli@next setup
|
|
263
|
+
|
|
264
|
+
# Health check with client coverage report
|
|
265
|
+
mcp-conductor-cli doctor
|
|
266
|
+
|
|
267
|
+
# Export config for a specific client (TOML for Codex, YAML for Continue, etc.)
|
|
268
|
+
mcp-conductor-cli export --client <client-id>
|
|
141
269
|
|
|
142
|
-
# Check system requirements (Node, Deno,
|
|
270
|
+
# Check system requirements (Node, Deno, conductor config)
|
|
143
271
|
mcp-conductor-cli check
|
|
144
272
|
|
|
145
273
|
# Show current configuration status
|
package/dist/bin/cli.d.ts
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* test — transient connect + list tools
|
|
11
11
|
* routing — show/apply routing recommendations
|
|
12
12
|
* doctor — health check all servers
|
|
13
|
-
* import — non-interactive import from
|
|
14
|
-
* export — generate mcpServers JSON for
|
|
13
|
+
* import — non-interactive import from MCP client configs
|
|
14
|
+
* export — generate mcpServers JSON for client rollback
|
|
15
15
|
* daemon — start|stop|status|logs (wired to Phase 6 module)
|
|
16
16
|
*
|
|
17
17
|
* @module bin/cli
|
package/dist/bin/cli.js
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* test — transient connect + list tools
|
|
11
11
|
* routing — show/apply routing recommendations
|
|
12
12
|
* doctor — health check all servers
|
|
13
|
-
* import — non-interactive import from
|
|
14
|
-
* export — generate mcpServers JSON for
|
|
13
|
+
* import — non-interactive import from MCP client configs
|
|
14
|
+
* export — generate mcpServers JSON for client rollback
|
|
15
15
|
* daemon — start|stop|status|logs (wired to Phase 6 module)
|
|
16
16
|
*
|
|
17
17
|
* @module bin/cli
|
|
@@ -20,7 +20,7 @@ import { Command } from 'commander';
|
|
|
20
20
|
import pc from 'picocolors';
|
|
21
21
|
import { runSetupWizard } from '../cli/wizard/setup.js';
|
|
22
22
|
import { importServers, formatImportResults } from '../cli/commands/import-servers.js';
|
|
23
|
-
import { exportToClaude } from '../cli/commands/export-servers.js';
|
|
23
|
+
import { exportToClaude, exportForClient, listExportableClients } from '../cli/commands/export-servers.js';
|
|
24
24
|
import { testServer } from '../cli/commands/test-server.js';
|
|
25
25
|
import { getRoutingRecommendations } from '../cli/commands/routing.js';
|
|
26
26
|
import { runDoctor, formatDoctorResults } from '../cli/commands/doctor.js';
|
|
@@ -37,10 +37,11 @@ program
|
|
|
37
37
|
// ----------------------------------------------------------------
|
|
38
38
|
program
|
|
39
39
|
.command('setup')
|
|
40
|
-
.description('Interactive wizard: detect
|
|
41
|
-
.
|
|
40
|
+
.description('Interactive wizard: detect all MCP client configs, migrate servers, verify health')
|
|
41
|
+
.option('--legacy', 'Use the legacy single-Claude wizard instead of the multi-client wizard')
|
|
42
|
+
.action(async (opts) => {
|
|
42
43
|
try {
|
|
43
|
-
await runSetupWizard();
|
|
44
|
+
await runSetupWizard({ legacy: opts.legacy });
|
|
44
45
|
}
|
|
45
46
|
catch (err) {
|
|
46
47
|
console.error(pc.red(`Setup failed: ${String(err)}`));
|
|
@@ -210,7 +211,7 @@ program
|
|
|
210
211
|
// ----------------------------------------------------------------
|
|
211
212
|
program
|
|
212
213
|
.command('import')
|
|
213
|
-
.description('Import MCP servers from
|
|
214
|
+
.description('Import MCP servers from MCP client config files (non-interactive)')
|
|
214
215
|
.option('--remove-originals', 'Remove imported servers from source configs')
|
|
215
216
|
.option('--dry-run', 'Show what would be imported without writing')
|
|
216
217
|
.action((opts) => {
|
|
@@ -228,18 +229,40 @@ program
|
|
|
228
229
|
}
|
|
229
230
|
});
|
|
230
231
|
// ----------------------------------------------------------------
|
|
231
|
-
// export — generate rollback JSON
|
|
232
|
+
// export — generate rollback JSON or per-client config file
|
|
232
233
|
// ----------------------------------------------------------------
|
|
233
234
|
program
|
|
234
235
|
.command('export')
|
|
235
|
-
.description('
|
|
236
|
-
|
|
236
|
+
.description('Export conductor config for a specific MCP client, or print legacy rollback JSON.\n' +
|
|
237
|
+
' --client <id> Write <id>-config.<ext> in the current directory.\n' +
|
|
238
|
+
' Valid IDs: ' + ['claude-desktop', 'claude-code', 'codex', 'gemini-cli',
|
|
239
|
+
'cursor', 'cline', 'zed', 'continue', 'opencode', 'kimi-code'].join(', '))
|
|
240
|
+
.option('--client <id>', 'Client ID to export for (writes a config file to cwd)')
|
|
241
|
+
.option('--format <format>', 'Legacy text format: claude-desktop | claude-code | raw (ignored when --client is set)', 'claude-desktop')
|
|
242
|
+
.option('--output <path>', 'Override the output file path (only with --client)')
|
|
237
243
|
.action((opts) => {
|
|
238
244
|
try {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
245
|
+
if (opts.client) {
|
|
246
|
+
// MC4: per-client file export
|
|
247
|
+
const validClients = listExportableClients();
|
|
248
|
+
if (!validClients.includes(opts.client)) {
|
|
249
|
+
console.error(pc.red(`Unknown client "${opts.client}". Valid clients: ${validClients.join(', ')}`));
|
|
250
|
+
process.exit(1);
|
|
251
|
+
}
|
|
252
|
+
const result = exportForClient({
|
|
253
|
+
clientId: opts.client,
|
|
254
|
+
outputPath: opts.output,
|
|
255
|
+
});
|
|
256
|
+
console.log(pc.green(`Exported conductor config for ${result.clientId} → ${result.outputPath}`));
|
|
257
|
+
console.log(pc.dim(`Drop this file into the appropriate location for your client.`));
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
// Legacy: print JSON to stdout
|
|
261
|
+
const result = exportToClaude({
|
|
262
|
+
format: opts.format ?? 'claude-desktop',
|
|
263
|
+
});
|
|
264
|
+
console.log(result.json);
|
|
265
|
+
}
|
|
243
266
|
}
|
|
244
267
|
catch (err) {
|
|
245
268
|
console.error(pc.red(`Export failed: ${String(err)}`));
|
package/dist/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-client adapter interface for reading and writing MCP configuration files.
|
|
3
|
+
*
|
|
4
|
+
* Each MCP client stores server definitions in its own format and schema.
|
|
5
|
+
* Adapters normalise those into a common shape so the rest of the codebase can
|
|
6
|
+
* work with any client without caring about per-client quirks.
|
|
7
|
+
*
|
|
8
|
+
* Wave 2 agents implement concrete adapters and register them in `index.ts`.
|
|
9
|
+
*
|
|
10
|
+
* @module cli/clients/adapter
|
|
11
|
+
*/
|
|
12
|
+
import type { MCPClientId } from './registry.js';
|
|
13
|
+
export type { MCPClientId };
|
|
14
|
+
/**
|
|
15
|
+
* A single MCP server entry in normalised form.
|
|
16
|
+
*
|
|
17
|
+
* All fields mirror the lowest-common-denominator shape used by Claude Desktop
|
|
18
|
+
* and Claude Code so existing conductor logic can consume it unchanged.
|
|
19
|
+
*/
|
|
20
|
+
export interface NormalisedServerEntry {
|
|
21
|
+
/** Executable or interpreter path (e.g. `"node"`, `"uvx"`, `"deno"`). */
|
|
22
|
+
command: string;
|
|
23
|
+
/** Positional arguments to the command. */
|
|
24
|
+
args?: string[];
|
|
25
|
+
/** Environment variable overrides for the server process. */
|
|
26
|
+
env?: Record<string, string>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The full config file contents in normalised form.
|
|
30
|
+
*/
|
|
31
|
+
export interface NormalisedClientConfig {
|
|
32
|
+
/** Map of server name → server definition. */
|
|
33
|
+
servers: Record<string, NormalisedServerEntry>;
|
|
34
|
+
/**
|
|
35
|
+
* The original parsed object from the config file.
|
|
36
|
+
*
|
|
37
|
+
* Preserved so adapters can do round-trip writes without losing fields the
|
|
38
|
+
* normalisation doesn't cover (e.g. client-specific metadata, non-MCP keys).
|
|
39
|
+
*/
|
|
40
|
+
raw: unknown;
|
|
41
|
+
}
|
|
42
|
+
export interface SerializeOptions {
|
|
43
|
+
/**
|
|
44
|
+
* When `true`, all server entries except the mcp-conductor entry are removed
|
|
45
|
+
* before writing. Used during the "migrate to conductor" setup flow.
|
|
46
|
+
*/
|
|
47
|
+
keepOnlyConductor?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* The conductor server entry that must always be present in the written
|
|
50
|
+
* config. Required so the serialiser can add or update it.
|
|
51
|
+
*/
|
|
52
|
+
conductorEntry: NormalisedServerEntry;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A per-client adapter translates between a client's native config format and
|
|
56
|
+
* the conductor's normalised representation.
|
|
57
|
+
*
|
|
58
|
+
* Concrete implementations are registered in `src/cli/clients/index.ts` and
|
|
59
|
+
* selected at runtime by matching the `MCPClientConfigLocation.client` field.
|
|
60
|
+
*/
|
|
61
|
+
export interface MCPClientAdapter {
|
|
62
|
+
/**
|
|
63
|
+
* Stable identifier matching `MCPClientId`.
|
|
64
|
+
* Used as the key in the `ADAPTERS` map.
|
|
65
|
+
*/
|
|
66
|
+
readonly client: MCPClientId;
|
|
67
|
+
/**
|
|
68
|
+
* Parse the client's config file at `path` into the normalised shape.
|
|
69
|
+
*
|
|
70
|
+
* Returns `null` when the file does not exist, cannot be parsed, or contains
|
|
71
|
+
* no MCP server definitions — allowing callers to skip gracefully.
|
|
72
|
+
*
|
|
73
|
+
* @param path - Absolute path to the client config file.
|
|
74
|
+
*/
|
|
75
|
+
parse(path: string): NormalisedClientConfig | null;
|
|
76
|
+
/**
|
|
77
|
+
* Write a (potentially modified) config back to disk at `path`.
|
|
78
|
+
*
|
|
79
|
+
* The adapter must:
|
|
80
|
+
* 1. Merge `config.servers` (or a filtered subset if `keepOnlyConductor` is
|
|
81
|
+
* set) into `config.raw` under the client's native key.
|
|
82
|
+
* 2. Ensure `conductorEntry` is present under the `"mcp-conductor"` key.
|
|
83
|
+
* 3. Preserve all non-MCP keys from `config.raw` so nothing is lost.
|
|
84
|
+
*
|
|
85
|
+
* @param path - Absolute path to the client config file.
|
|
86
|
+
* @param config - Normalised config (including original `raw`).
|
|
87
|
+
* @param options - Serialisation options.
|
|
88
|
+
*/
|
|
89
|
+
serialize(path: string, config: NormalisedClientConfig, options: SerializeOptions): void;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Singleton adapter registry.
|
|
93
|
+
*
|
|
94
|
+
* Lives here (not in `index.ts`) because adapter modules import from `./index.js`
|
|
95
|
+
* to call `ADAPTERS.set()` at module load — putting the Map in `index.ts` would
|
|
96
|
+
* create a temporal-dead-zone error since ESM hoists `import` statements above
|
|
97
|
+
* the `const ADAPTERS = new Map()` declaration.
|
|
98
|
+
*
|
|
99
|
+
* The wizard, doctor, and import commands look up adapters here rather than
|
|
100
|
+
* importing client-specific code directly.
|
|
101
|
+
*/
|
|
102
|
+
export declare const ADAPTERS: Map<MCPClientId, MCPClientAdapter>;
|
|
103
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/cli/clients/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,YAAY,EAAE,WAAW,EAAE,CAAC;AAM5B;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC/C;;;;;OAKG;IACH,GAAG,EAAE,OAAO,CAAC;CACd;AAMD,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,cAAc,EAAE,qBAAqB,CAAC;CACvC;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B;;;;;;;OAOG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAAC;IAEnD;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC1F;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,oCAA2C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-client adapter interface for reading and writing MCP configuration files.
|
|
3
|
+
*
|
|
4
|
+
* Each MCP client stores server definitions in its own format and schema.
|
|
5
|
+
* Adapters normalise those into a common shape so the rest of the codebase can
|
|
6
|
+
* work with any client without caring about per-client quirks.
|
|
7
|
+
*
|
|
8
|
+
* Wave 2 agents implement concrete adapters and register them in `index.ts`.
|
|
9
|
+
*
|
|
10
|
+
* @module cli/clients/adapter
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Singleton adapter registry.
|
|
14
|
+
*
|
|
15
|
+
* Lives here (not in `index.ts`) because adapter modules import from `./index.js`
|
|
16
|
+
* to call `ADAPTERS.set()` at module load — putting the Map in `index.ts` would
|
|
17
|
+
* create a temporal-dead-zone error since ESM hoists `import` statements above
|
|
18
|
+
* the `const ADAPTERS = new Map()` declaration.
|
|
19
|
+
*
|
|
20
|
+
* The wizard, doctor, and import commands look up adapters here rather than
|
|
21
|
+
* importing client-specific code directly.
|
|
22
|
+
*/
|
|
23
|
+
export const ADAPTERS = new Map();
|
|
24
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/cli/clients/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAsGH;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCPClientAdapter implementation for Claude Code.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code stores MCP servers under the canonical Anthropic `mcpServers` key
|
|
5
|
+
* in a JSON settings file, so parse() reads the key directly without any field
|
|
6
|
+
* translation, and serialize() writes it back in the same shape.
|
|
7
|
+
*
|
|
8
|
+
* The adapter registers itself in `ADAPTERS` at module load time; callers only
|
|
9
|
+
* need to `import './claude-code.js'` (done in `index.ts`) to enable it.
|
|
10
|
+
*
|
|
11
|
+
* @module cli/clients/claude-code
|
|
12
|
+
*/
|
|
13
|
+
import type { MCPClientAdapter } from './adapter.js';
|
|
14
|
+
export declare const CLAUDE_CODE_ADAPTER: MCPClientAdapter;
|
|
15
|
+
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/cli/clients/claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAA4C,MAAM,cAAc,CAAC;AAqD/F,eAAO,MAAM,mBAAmB,EAAE,gBA6EjC,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCPClientAdapter implementation for Claude Code.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code stores MCP servers under the canonical Anthropic `mcpServers` key
|
|
5
|
+
* in a JSON settings file, so parse() reads the key directly without any field
|
|
6
|
+
* translation, and serialize() writes it back in the same shape.
|
|
7
|
+
*
|
|
8
|
+
* The adapter registers itself in `ADAPTERS` at module load time; callers only
|
|
9
|
+
* need to `import './claude-code.js'` (done in `index.ts`) to enable it.
|
|
10
|
+
*
|
|
11
|
+
* @module cli/clients/claude-code
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync, writeFileSync, copyFileSync } from 'node:fs';
|
|
14
|
+
import { ADAPTERS } from './adapter.js';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Internal helpers
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* Generate a `.bak.YYYYMMDDHHMMSS` path alongside `filePath` and copy the
|
|
20
|
+
* original file to it.
|
|
21
|
+
*
|
|
22
|
+
* Matches the same strategy as `writeBackup` in
|
|
23
|
+
* `src/cli/commands/import-servers.ts`:
|
|
24
|
+
* - Derive a 14-digit UTC timestamp from ISO string.
|
|
25
|
+
* - Guard against sub-second collisions with a 4-char hex salt.
|
|
26
|
+
*
|
|
27
|
+
* @returns The path of the backup file written.
|
|
28
|
+
*/
|
|
29
|
+
function writeBackup(filePath) {
|
|
30
|
+
// toISOString() → "2026-05-05T11:23:45.678Z"; strip non-digits, take first 14.
|
|
31
|
+
const ts = new Date().toISOString().replace(/\D/g, '').slice(0, 14);
|
|
32
|
+
let backupPath = `${filePath}.bak.${ts}`;
|
|
33
|
+
// Sub-second collision guard.
|
|
34
|
+
if (existsSync(backupPath)) {
|
|
35
|
+
const salt = Math.floor(Math.random() * 0xffff).toString(16).padStart(4, '0');
|
|
36
|
+
backupPath = `${backupPath}.${salt}`;
|
|
37
|
+
}
|
|
38
|
+
copyFileSync(filePath, backupPath);
|
|
39
|
+
return backupPath;
|
|
40
|
+
}
|
|
41
|
+
export const CLAUDE_CODE_ADAPTER = {
|
|
42
|
+
client: 'claude-code',
|
|
43
|
+
/**
|
|
44
|
+
* Parse the Claude Code settings file at `path`.
|
|
45
|
+
*
|
|
46
|
+
* Returns `null` when the file does not exist, is not valid JSON, or contains
|
|
47
|
+
* no `mcpServers` entries — allowing callers to skip gracefully.
|
|
48
|
+
*/
|
|
49
|
+
parse(path) {
|
|
50
|
+
if (!existsSync(path)) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
let raw;
|
|
54
|
+
try {
|
|
55
|
+
raw = JSON.parse(readFileSync(path, 'utf-8'));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const mcpServers = raw.mcpServers;
|
|
61
|
+
if (!mcpServers ||
|
|
62
|
+
typeof mcpServers !== 'object' ||
|
|
63
|
+
Object.keys(mcpServers).length === 0) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
// Claude Code uses the canonical Anthropic shape — no field translation needed.
|
|
67
|
+
const servers = {};
|
|
68
|
+
for (const [name, entry] of Object.entries(mcpServers)) {
|
|
69
|
+
if (entry && typeof entry.command === 'string') {
|
|
70
|
+
servers[name] = {
|
|
71
|
+
command: entry.command,
|
|
72
|
+
...(Array.isArray(entry.args) ? { args: entry.args } : {}),
|
|
73
|
+
...(entry.env && typeof entry.env === 'object' ? { env: entry.env } : {}),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { servers, raw };
|
|
78
|
+
},
|
|
79
|
+
/**
|
|
80
|
+
* Write the (potentially modified) config back to disk at `path`.
|
|
81
|
+
*
|
|
82
|
+
* Steps:
|
|
83
|
+
* 1. Write a `.bak.YYYYMMDDHHMMSS` backup if the file already exists.
|
|
84
|
+
* 2. Start from `config.raw` so non-MCP keys (e.g. `apiKeyHelper`) are kept.
|
|
85
|
+
* 3. If `keepOnlyConductor` is set, replace `mcpServers` with just the
|
|
86
|
+
* conductor entry; otherwise write the full `config.servers` map and
|
|
87
|
+
* ensure `"mcp-conductor"` is present and up-to-date.
|
|
88
|
+
*/
|
|
89
|
+
serialize(path, config, options) {
|
|
90
|
+
if (existsSync(path)) {
|
|
91
|
+
writeBackup(path);
|
|
92
|
+
}
|
|
93
|
+
// Clone raw to avoid mutating the caller's in-memory config.
|
|
94
|
+
const output = { ...config.raw };
|
|
95
|
+
let mcpServers;
|
|
96
|
+
if (options.keepOnlyConductor) {
|
|
97
|
+
mcpServers = { 'mcp-conductor': options.conductorEntry };
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Spread existing servers then overlay the conductor entry.
|
|
101
|
+
mcpServers = { ...config.servers };
|
|
102
|
+
mcpServers['mcp-conductor'] = options.conductorEntry;
|
|
103
|
+
}
|
|
104
|
+
output['mcpServers'] = mcpServers;
|
|
105
|
+
writeFileSync(path, JSON.stringify(output, null, 2) + '\n', 'utf-8');
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
// Side-effect registration: runs when this module is first imported.
|
|
109
|
+
ADAPTERS.set('claude-code', CLAUDE_CODE_ADAPTER);
|
|
110
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/cli/clients/claude-code.ts"],"names":[],"mappings":"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"}
|