@darkiceinteractive/mcp-conductor 1.1.0 → 3.0.0-beta.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 +35 -5
- package/dist/bin/cli.d.ts +20 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +260 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bridge/http-server.d.ts +65 -1
- package/dist/bridge/http-server.d.ts.map +1 -1
- package/dist/bridge/http-server.js +192 -7
- package/dist/bridge/http-server.js.map +1 -1
- package/dist/bridge/index.d.ts +1 -0
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/index.js +1 -0
- package/dist/bridge/index.js.map +1 -1
- package/dist/bridge/pool.d.ts +95 -0
- package/dist/bridge/pool.d.ts.map +1 -0
- package/dist/bridge/pool.js +384 -0
- package/dist/bridge/pool.js.map +1 -0
- package/dist/bridge/session-registry.d.ts +64 -0
- package/dist/bridge/session-registry.d.ts.map +1 -0
- package/dist/bridge/session-registry.js +124 -0
- package/dist/bridge/session-registry.js.map +1 -0
- package/dist/cache/cache.d.ts +43 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +167 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/delta.d.ts +32 -0
- package/dist/cache/delta.d.ts.map +1 -0
- package/dist/cache/delta.js +131 -0
- package/dist/cache/delta.js.map +1 -0
- package/dist/cache/disk.d.ts +65 -0
- package/dist/cache/disk.d.ts.map +1 -0
- package/dist/cache/disk.js +238 -0
- package/dist/cache/disk.js.map +1 -0
- package/dist/cache/index.d.ts +53 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +12 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/key.d.ts +44 -0
- package/dist/cache/key.d.ts.map +1 -0
- package/dist/cache/key.js +83 -0
- package/dist/cache/key.js.map +1 -0
- package/dist/cache/lru.d.ts +57 -0
- package/dist/cache/lru.d.ts.map +1 -0
- package/dist/cache/lru.js +112 -0
- package/dist/cache/lru.js.map +1 -0
- package/dist/cache/policy.d.ts +34 -0
- package/dist/cache/policy.d.ts.map +1 -0
- package/dist/cache/policy.js +95 -0
- package/dist/cache/policy.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +33 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +135 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/export-servers.d.ts +22 -0
- package/dist/cli/commands/export-servers.d.ts.map +1 -0
- package/dist/cli/commands/export-servers.js +45 -0
- package/dist/cli/commands/export-servers.js.map +1 -0
- package/dist/cli/commands/import-servers.d.ts +57 -0
- package/dist/cli/commands/import-servers.d.ts.map +1 -0
- package/dist/cli/commands/import-servers.js +137 -0
- package/dist/cli/commands/import-servers.js.map +1 -0
- package/dist/cli/commands/routing.d.ts +34 -0
- package/dist/cli/commands/routing.d.ts.map +1 -0
- package/dist/cli/commands/routing.js +60 -0
- package/dist/cli/commands/routing.js.map +1 -0
- package/dist/cli/commands/test-server.d.ts +34 -0
- package/dist/cli/commands/test-server.d.ts.map +1 -0
- package/dist/cli/commands/test-server.js +86 -0
- package/dist/cli/commands/test-server.js.map +1 -0
- package/dist/cli/daemon.d.ts +60 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +244 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/replay.d.ts +16 -0
- package/dist/cli/replay.d.ts.map +1 -0
- package/dist/cli/replay.js +89 -0
- package/dist/cli/replay.js.map +1 -0
- package/dist/cli/wizard/setup.d.ts +12 -0
- package/dist/cli/wizard/setup.d.ts.map +1 -0
- package/dist/cli/wizard/setup.js +71 -0
- package/dist/cli/wizard/setup.js.map +1 -0
- package/dist/config/defaults.d.ts +10 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +14 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/schema.d.ts +34 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/daemon/client.d.ts +97 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +279 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/discovery.d.ts +50 -0
- package/dist/daemon/discovery.d.ts.map +1 -0
- package/dist/daemon/discovery.js +104 -0
- package/dist/daemon/discovery.js.map +1 -0
- package/dist/daemon/index.d.ts +16 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +11 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/sandbox-api.d.ts +45 -0
- package/dist/daemon/sandbox-api.d.ts.map +1 -0
- package/dist/daemon/sandbox-api.js +74 -0
- package/dist/daemon/sandbox-api.js.map +1 -0
- package/dist/daemon/server.d.ts +65 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +351 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/shared-kv.d.ts +81 -0
- package/dist/daemon/shared-kv.d.ts.map +1 -0
- package/dist/daemon/shared-kv.js +215 -0
- package/dist/daemon/shared-kv.js.map +1 -0
- package/dist/daemon/shared-lock.d.ts +71 -0
- package/dist/daemon/shared-lock.d.ts.map +1 -0
- package/dist/daemon/shared-lock.js +119 -0
- package/dist/daemon/shared-lock.js.map +1 -0
- package/dist/hub/mcp-hub.d.ts +23 -0
- package/dist/hub/mcp-hub.d.ts.map +1 -1
- package/dist/hub/mcp-hub.js +34 -1
- package/dist/hub/mcp-hub.js.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/observability/anomaly.d.ts +67 -0
- package/dist/observability/anomaly.d.ts.map +1 -0
- package/dist/observability/anomaly.js +141 -0
- package/dist/observability/anomaly.js.map +1 -0
- package/dist/observability/cost-predictor.d.ts +49 -0
- package/dist/observability/cost-predictor.d.ts.map +1 -0
- package/dist/observability/cost-predictor.js +145 -0
- package/dist/observability/cost-predictor.js.map +1 -0
- package/dist/observability/hot-path.d.ts +49 -0
- package/dist/observability/hot-path.d.ts.map +1 -0
- package/dist/observability/hot-path.js +125 -0
- package/dist/observability/hot-path.js.map +1 -0
- package/dist/observability/index.d.ts +10 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +10 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/replay.d.ts +104 -0
- package/dist/observability/replay.d.ts.map +1 -0
- package/dist/observability/replay.js +239 -0
- package/dist/observability/replay.js.map +1 -0
- package/dist/registry/built-in-recommendations.d.ts +54 -0
- package/dist/registry/built-in-recommendations.d.ts.map +1 -0
- package/dist/registry/built-in-recommendations.js +65 -0
- package/dist/registry/built-in-recommendations.js.map +1 -0
- package/dist/registry/events.d.ts +26 -0
- package/dist/registry/events.d.ts.map +1 -0
- package/dist/registry/events.js +22 -0
- package/dist/registry/events.js.map +1 -0
- package/dist/registry/index.d.ts +159 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +12 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/registry.d.ts +87 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +294 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/snapshot.d.ts +42 -0
- package/dist/registry/snapshot.d.ts.map +1 -0
- package/dist/registry/snapshot.js +71 -0
- package/dist/registry/snapshot.js.map +1 -0
- package/dist/registry/typegen.d.ts +48 -0
- package/dist/registry/typegen.d.ts.map +1 -0
- package/dist/registry/typegen.js +200 -0
- package/dist/registry/typegen.js.map +1 -0
- package/dist/registry/validator.d.ts +23 -0
- package/dist/registry/validator.d.ts.map +1 -0
- package/dist/registry/validator.js +50 -0
- package/dist/registry/validator.js.map +1 -0
- package/dist/reliability/breaker.d.ts +57 -0
- package/dist/reliability/breaker.d.ts.map +1 -0
- package/dist/reliability/breaker.js +130 -0
- package/dist/reliability/breaker.js.map +1 -0
- package/dist/reliability/errors.d.ts +78 -0
- package/dist/reliability/errors.d.ts.map +1 -0
- package/dist/reliability/errors.js +160 -0
- package/dist/reliability/errors.js.map +1 -0
- package/dist/reliability/gateway.d.ts +88 -0
- package/dist/reliability/gateway.d.ts.map +1 -0
- package/dist/reliability/gateway.js +180 -0
- package/dist/reliability/gateway.js.map +1 -0
- package/dist/reliability/index.d.ts +20 -0
- package/dist/reliability/index.d.ts.map +1 -0
- package/dist/reliability/index.js +16 -0
- package/dist/reliability/index.js.map +1 -0
- package/dist/reliability/profile.d.ts +49 -0
- package/dist/reliability/profile.d.ts.map +1 -0
- package/dist/reliability/profile.js +58 -0
- package/dist/reliability/profile.js.map +1 -0
- package/dist/reliability/retry.d.ts +39 -0
- package/dist/reliability/retry.d.ts.map +1 -0
- package/dist/reliability/retry.js +51 -0
- package/dist/reliability/retry.js.map +1 -0
- package/dist/reliability/timeout.d.ts +34 -0
- package/dist/reliability/timeout.d.ts.map +1 -0
- package/dist/reliability/timeout.js +53 -0
- package/dist/reliability/timeout.js.map +1 -0
- package/dist/runtime/executor.d.ts +12 -0
- package/dist/runtime/executor.d.ts.map +1 -1
- package/dist/runtime/executor.js +148 -16
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/findtool/embed.d.ts +28 -0
- package/dist/runtime/findtool/embed.d.ts.map +1 -0
- package/dist/runtime/findtool/embed.js +85 -0
- package/dist/runtime/findtool/embed.js.map +1 -0
- package/dist/runtime/findtool/index.d.ts +52 -0
- package/dist/runtime/findtool/index.d.ts.map +1 -0
- package/dist/runtime/findtool/index.js +78 -0
- package/dist/runtime/findtool/index.js.map +1 -0
- package/dist/runtime/findtool/vector-index.d.ts +53 -0
- package/dist/runtime/findtool/vector-index.d.ts.map +1 -0
- package/dist/runtime/findtool/vector-index.js +71 -0
- package/dist/runtime/findtool/vector-index.js.map +1 -0
- package/dist/runtime/helpers/budget.d.ts +27 -0
- package/dist/runtime/helpers/budget.d.ts.map +1 -0
- package/dist/runtime/helpers/budget.js +103 -0
- package/dist/runtime/helpers/budget.js.map +1 -0
- package/dist/runtime/helpers/compact.d.ts +32 -0
- package/dist/runtime/helpers/compact.d.ts.map +1 -0
- package/dist/runtime/helpers/compact.js +93 -0
- package/dist/runtime/helpers/compact.js.map +1 -0
- package/dist/runtime/helpers/delta.d.ts +45 -0
- package/dist/runtime/helpers/delta.d.ts.map +1 -0
- package/dist/runtime/helpers/delta.js +116 -0
- package/dist/runtime/helpers/delta.js.map +1 -0
- package/dist/runtime/helpers/index.d.ts +16 -0
- package/dist/runtime/helpers/index.d.ts.map +1 -0
- package/dist/runtime/helpers/index.js +13 -0
- package/dist/runtime/helpers/index.js.map +1 -0
- package/dist/runtime/helpers/summarize.d.ts +24 -0
- package/dist/runtime/helpers/summarize.d.ts.map +1 -0
- package/dist/runtime/helpers/summarize.js +124 -0
- package/dist/runtime/helpers/summarize.js.map +1 -0
- package/dist/runtime/helpers/worker-preload.d.ts +25 -0
- package/dist/runtime/helpers/worker-preload.d.ts.map +1 -0
- package/dist/runtime/helpers/worker-preload.js +223 -0
- package/dist/runtime/helpers/worker-preload.js.map +1 -0
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/pool/index.d.ts +11 -0
- package/dist/runtime/pool/index.d.ts.map +1 -0
- package/dist/runtime/pool/index.js +8 -0
- package/dist/runtime/pool/index.js.map +1 -0
- package/dist/runtime/pool/recycle.d.ts +44 -0
- package/dist/runtime/pool/recycle.d.ts.map +1 -0
- package/dist/runtime/pool/recycle.js +50 -0
- package/dist/runtime/pool/recycle.js.map +1 -0
- package/dist/runtime/pool/worker-pool.d.ts +77 -0
- package/dist/runtime/pool/worker-pool.d.ts.map +1 -0
- package/dist/runtime/pool/worker-pool.js +216 -0
- package/dist/runtime/pool/worker-pool.js.map +1 -0
- package/dist/runtime/pool/worker.d.ts +80 -0
- package/dist/runtime/pool/worker.d.ts.map +1 -0
- package/dist/runtime/pool/worker.js +324 -0
- package/dist/runtime/pool/worker.js.map +1 -0
- package/dist/server/mcp-server.d.ts +6 -0
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +610 -45
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/server/passthrough-registrar.d.ts +73 -0
- package/dist/server/passthrough-registrar.d.ts.map +1 -0
- package/dist/server/passthrough-registrar.js +110 -0
- package/dist/server/passthrough-registrar.js.map +1 -0
- package/dist/skills/skills-engine.d.ts +9 -1
- package/dist/skills/skills-engine.d.ts.map +1 -1
- package/dist/skills/skills-engine.js +20 -3
- package/dist/skills/skills-engine.js.map +1 -1
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +5 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/orphan-watch.d.ts +34 -0
- package/dist/utils/orphan-watch.d.ts.map +1 -0
- package/dist/utils/orphan-watch.js +54 -0
- package/dist/utils/orphan-watch.js.map +1 -0
- package/dist/utils/redact.d.ts +15 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +48 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/utils/tokenize.d.ts +55 -0
- package/dist/utils/tokenize.d.ts.map +1 -0
- package/dist/utils/tokenize.js +205 -0
- package/dist/utils/tokenize.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 +13 -3
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# MCP Conductor
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**99.7% fewer tokens. Parallel execution. 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)
|
|
@@ -11,11 +11,32 @@
|
|
|
11
11
|
MCP Conductor is a single MCP server that orchestrates all your other MCP servers through a sandboxed Deno runtime. Instead of Claude making direct tool calls (and dumping every intermediate result into your context window), Claude writes TypeScript code that runs in an isolated sandbox. Only the final result comes back.
|
|
12
12
|
|
|
13
13
|
```
|
|
14
|
-
Before:
|
|
15
|
-
After:
|
|
14
|
+
Before: 153,900 tokens → Claude context window → 153,900 tokens billed
|
|
15
|
+
After: 153,900 tokens → Deno sandbox → 435 tokens → Claude context window
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
**Average measured reduction:
|
|
18
|
+
**Average measured reduction: 99.7%. Verified against Anthropic's published benchmarks.**
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## What's New in v3 (beta)
|
|
23
|
+
|
|
24
|
+
v3 is a ground-up registry-driven architecture. Every backend tool is described, validated, and type-generated at startup. New workstreams add production-grade reliability, caching, observability, and multi-agent coordination.
|
|
25
|
+
|
|
26
|
+
| Workstream | Feature | Docs |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| Phase 1 | Tool Registry — schema validation, hot-reload, type generation | [architecture](./docs/v3/architecture.md) |
|
|
29
|
+
| Phase 2 | Response cache — LRU + CBOR serialisation, TTL per tool | [configuration](./docs/v3/configuration.md) |
|
|
30
|
+
| Phase 3 | Reliability gateway — timeout, retry, circuit breaker | [architecture](./docs/v3/architecture.md) |
|
|
31
|
+
| Phase 4 | Connection pool + warm sandbox pool | [configuration](./docs/v3/configuration.md) |
|
|
32
|
+
| Phase 5 | Sandbox API — `compact`, `summarize`, `findTool`, `budget` | [sandbox-api](./docs/v3/sandbox-api.md) |
|
|
33
|
+
| Phase 6 | Daemon mode, shared KV store, distributed lock | [configuration](./docs/v3/configuration.md) |
|
|
34
|
+
| Phase 7 | Structured observability, session replay | [architecture](./docs/v3/architecture.md) |
|
|
35
|
+
| X1 | Passthrough adapter — expose backend tools directly | [recipes](./docs/v3/recipes.md) |
|
|
36
|
+
| X2 | Lifecycle tools, CLI wizard | [sandbox-api](./docs/v3/sandbox-api.md) |
|
|
37
|
+
| X4 | PII tokenisation, response redaction | [configuration](./docs/v3/configuration.md) |
|
|
38
|
+
|
|
39
|
+
Migrating from v2? See the [migration guide](./docs/v3/migration.md).
|
|
19
40
|
|
|
20
41
|
---
|
|
21
42
|
|
|
@@ -161,13 +182,22 @@ Inside `execute_code`, you have access to the `mcp` object:
|
|
|
161
182
|
// Call a server tool
|
|
162
183
|
const result = await mcp.server('github').call('list_issues', { owner: 'org', repo: 'repo' });
|
|
163
184
|
|
|
164
|
-
// Parallel execution — executes all calls simultaneously
|
|
185
|
+
// Parallel execution — executes all calls simultaneously.
|
|
186
|
+
// Two call shapes are supported:
|
|
187
|
+
//
|
|
188
|
+
// 1. Callback form (composable, no rate-limit detection):
|
|
165
189
|
const [issues, files, searches] = await mcp.batch([
|
|
166
190
|
() => mcp.server('github').call('list_issues', { owner: 'org', repo: 'repo' }),
|
|
167
191
|
() => mcp.server('filesystem').call('list_directory', { path: '/src' }),
|
|
168
192
|
() => mcp.server('brave-search').call('search', { q: 'topic', count: 5 })
|
|
169
193
|
]);
|
|
170
194
|
|
|
195
|
+
// 2. Descriptor form (rate-limit aware, retries on 429s):
|
|
196
|
+
const [a, b] = await mcp.batch([
|
|
197
|
+
{ server: 'github', tool: 'list_issues', params: { owner: 'org', repo: 'repo' } },
|
|
198
|
+
{ server: 'filesystem', tool: 'list_directory', params: { path: '/src' } },
|
|
199
|
+
]);
|
|
200
|
+
|
|
171
201
|
// Batch web searches (handles rate limits automatically)
|
|
172
202
|
const results = await mcp.batchSearch(['query 1', 'query 2', 'query 3'], { topN: 3 });
|
|
173
203
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Conductor CLI — interactive wizard and server management commands.
|
|
4
|
+
*
|
|
5
|
+
* Entry point for the `mcp-conductor-cli` binary.
|
|
6
|
+
* Subcommands:
|
|
7
|
+
* setup — interactive wizard (imports from Claude configs)
|
|
8
|
+
* add — add a server to conductor config
|
|
9
|
+
* list — list configured servers
|
|
10
|
+
* test — transient connect + list tools
|
|
11
|
+
* routing — show/apply routing recommendations
|
|
12
|
+
* doctor — health check all servers
|
|
13
|
+
* import — non-interactive import from Claude configs
|
|
14
|
+
* export — generate mcpServers JSON for Claude rollback
|
|
15
|
+
* daemon — start|stop|status|logs (wired to Phase 6 module)
|
|
16
|
+
*
|
|
17
|
+
* @module bin/cli
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG"}
|
package/dist/bin/cli.js
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Conductor CLI — interactive wizard and server management commands.
|
|
4
|
+
*
|
|
5
|
+
* Entry point for the `mcp-conductor-cli` binary.
|
|
6
|
+
* Subcommands:
|
|
7
|
+
* setup — interactive wizard (imports from Claude configs)
|
|
8
|
+
* add — add a server to conductor config
|
|
9
|
+
* list — list configured servers
|
|
10
|
+
* test — transient connect + list tools
|
|
11
|
+
* routing — show/apply routing recommendations
|
|
12
|
+
* doctor — health check all servers
|
|
13
|
+
* import — non-interactive import from Claude configs
|
|
14
|
+
* export — generate mcpServers JSON for Claude rollback
|
|
15
|
+
* daemon — start|stop|status|logs (wired to Phase 6 module)
|
|
16
|
+
*
|
|
17
|
+
* @module bin/cli
|
|
18
|
+
*/
|
|
19
|
+
import { Command } from 'commander';
|
|
20
|
+
import pc from 'picocolors';
|
|
21
|
+
import { runSetupWizard } from '../cli/wizard/setup.js';
|
|
22
|
+
import { importServers, formatImportResults } from '../cli/commands/import-servers.js';
|
|
23
|
+
import { exportToClaude } from '../cli/commands/export-servers.js';
|
|
24
|
+
import { testServer } from '../cli/commands/test-server.js';
|
|
25
|
+
import { getRoutingRecommendations } from '../cli/commands/routing.js';
|
|
26
|
+
import { runDoctor, formatDoctorResults } from '../cli/commands/doctor.js';
|
|
27
|
+
import { loadConductorConfig, saveConductorConfig, getDefaultConductorConfigPath, } from '../config/index.js';
|
|
28
|
+
import { registerDaemonCommands } from '../cli/daemon.js';
|
|
29
|
+
import { VERSION } from '../version.js';
|
|
30
|
+
const program = new Command();
|
|
31
|
+
program
|
|
32
|
+
.name('mcp-conductor-cli')
|
|
33
|
+
.description('MCP Conductor — server lifecycle management CLI')
|
|
34
|
+
.version(VERSION);
|
|
35
|
+
// ----------------------------------------------------------------
|
|
36
|
+
// setup — interactive wizard
|
|
37
|
+
// ----------------------------------------------------------------
|
|
38
|
+
program
|
|
39
|
+
.command('setup')
|
|
40
|
+
.description('Interactive wizard: detect Claude configs, import servers, verify health')
|
|
41
|
+
.action(async () => {
|
|
42
|
+
try {
|
|
43
|
+
await runSetupWizard();
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
console.error(pc.red(`Setup failed: ${String(err)}`));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
// ----------------------------------------------------------------
|
|
51
|
+
// add — add a server
|
|
52
|
+
// ----------------------------------------------------------------
|
|
53
|
+
program
|
|
54
|
+
.command('add <name> <command> [args...]')
|
|
55
|
+
.description('Add an MCP server to the conductor config')
|
|
56
|
+
.option('-e, --env <pairs...>', 'Environment variables as KEY=VALUE pairs')
|
|
57
|
+
.action((name, command, args, opts) => {
|
|
58
|
+
try {
|
|
59
|
+
const env = {};
|
|
60
|
+
for (const pair of opts.env ?? []) {
|
|
61
|
+
const [k, ...rest] = pair.split('=');
|
|
62
|
+
if (k)
|
|
63
|
+
env[k] = rest.join('=');
|
|
64
|
+
}
|
|
65
|
+
let config = loadConductorConfig() ?? { exclusive: false, servers: {} };
|
|
66
|
+
if (config.servers[name]) {
|
|
67
|
+
console.error(pc.red(`Server '${name}' already exists. Remove it first with: mcp-conductor-cli remove ${name}`));
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
config.servers[name] = { command, args, env };
|
|
71
|
+
const result = saveConductorConfig(config, getDefaultConductorConfigPath());
|
|
72
|
+
if (result.success) {
|
|
73
|
+
console.log(pc.green(`Added server '${name}' — config saved to ${result.path}`));
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.error(pc.red(`Failed to save config: ${result.error}`));
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
console.error(pc.red(`Add failed: ${String(err)}`));
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
// ----------------------------------------------------------------
|
|
86
|
+
// list — list configured servers
|
|
87
|
+
// ----------------------------------------------------------------
|
|
88
|
+
program
|
|
89
|
+
.command('list')
|
|
90
|
+
.description('List all servers in the conductor config')
|
|
91
|
+
.action(() => {
|
|
92
|
+
try {
|
|
93
|
+
const config = loadConductorConfig();
|
|
94
|
+
if (!config) {
|
|
95
|
+
console.log(pc.yellow('No conductor config found. Run `mcp-conductor-cli setup` first.'));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const names = Object.keys(config.servers);
|
|
99
|
+
if (names.length === 0) {
|
|
100
|
+
console.log(pc.dim('No servers configured.'));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
console.log(pc.bold(`\nConfigured servers (${names.length}):\n`));
|
|
104
|
+
for (const [name, def] of Object.entries(config.servers)) {
|
|
105
|
+
console.log(` ${pc.cyan(name)}`);
|
|
106
|
+
console.log(` command: ${def.command}${(def.args ?? []).length ? ' ' + def.args.join(' ') : ''}`);
|
|
107
|
+
if (Object.keys(def.env ?? {}).length > 0) {
|
|
108
|
+
const envKeys = Object.keys(def.env).join(', ');
|
|
109
|
+
console.log(` env: ${envKeys}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
console.log('');
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
console.error(pc.red(`List failed: ${String(err)}`));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
// ----------------------------------------------------------------
|
|
120
|
+
// test — transient connect + list tools
|
|
121
|
+
// ----------------------------------------------------------------
|
|
122
|
+
program
|
|
123
|
+
.command('test <name>')
|
|
124
|
+
.description('Transiently connect to a server, list its tools and measure latency')
|
|
125
|
+
.option('--timeout <ms>', 'Connection timeout in milliseconds', '15000')
|
|
126
|
+
.action(async (name, opts) => {
|
|
127
|
+
try {
|
|
128
|
+
console.log(pc.dim(`Testing server '${name}'...`));
|
|
129
|
+
const result = await testServer({
|
|
130
|
+
name,
|
|
131
|
+
timeoutMs: parseInt(opts.timeout ?? '15000', 10),
|
|
132
|
+
});
|
|
133
|
+
if (result.success) {
|
|
134
|
+
console.log(pc.green(`\n[OK] ${result.serverName}`));
|
|
135
|
+
console.log(` Latency: ${result.latencyMs}ms`);
|
|
136
|
+
console.log(` Tools: ${result.toolCount}`);
|
|
137
|
+
if (result.tools.length > 0) {
|
|
138
|
+
for (const t of result.tools.slice(0, 20)) {
|
|
139
|
+
console.log(` • ${t.name}: ${t.description.slice(0, 80)}`);
|
|
140
|
+
}
|
|
141
|
+
if (result.tools.length > 20) {
|
|
142
|
+
console.log(` ... and ${result.tools.length - 20} more`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
console.log(pc.red(`\n[FAIL] ${result.serverName}`));
|
|
148
|
+
console.log(` Error: ${result.error}`);
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
console.error(pc.red(`Test failed: ${String(err)}`));
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
// ----------------------------------------------------------------
|
|
158
|
+
// routing — routing recommendations
|
|
159
|
+
// ----------------------------------------------------------------
|
|
160
|
+
program
|
|
161
|
+
.command('routing [name]')
|
|
162
|
+
.description('Show routing recommendations for a server (or all servers)')
|
|
163
|
+
.option('--apply', 'Write routing hints to conductor config')
|
|
164
|
+
.action((name, opts) => {
|
|
165
|
+
try {
|
|
166
|
+
const result = getRoutingRecommendations({ serverName: name, apply: opts.apply });
|
|
167
|
+
if (result.recommendations.length === 0) {
|
|
168
|
+
console.log(pc.yellow('No servers found to analyse.'));
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
console.log(pc.bold('\nRouting recommendations:\n'));
|
|
172
|
+
for (const rec of result.recommendations) {
|
|
173
|
+
const icon = rec.recommendation === 'passthrough' ? pc.green('passthrough') : pc.dim('execute_code');
|
|
174
|
+
console.log(` ${pc.cyan(rec.serverName)}: ${icon}`);
|
|
175
|
+
console.log(` Reason: ${rec.reason}`);
|
|
176
|
+
}
|
|
177
|
+
if (result.applied) {
|
|
178
|
+
console.log(pc.green(`\nRouting hints written to ${result.configPath}`));
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
console.log(pc.dim('\nUse --apply to write hints to conductor config.'));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
console.error(pc.red(`Routing failed: ${String(err)}`));
|
|
186
|
+
process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
// ----------------------------------------------------------------
|
|
190
|
+
// doctor — health check
|
|
191
|
+
// ----------------------------------------------------------------
|
|
192
|
+
program
|
|
193
|
+
.command('doctor')
|
|
194
|
+
.description('Health check all configured MCP servers')
|
|
195
|
+
.action(() => {
|
|
196
|
+
try {
|
|
197
|
+
const result = runDoctor();
|
|
198
|
+
console.log('\n' + formatDoctorResults(result));
|
|
199
|
+
if (result.errorCount > 0) {
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
console.error(pc.red(`Doctor failed: ${String(err)}`));
|
|
205
|
+
process.exit(1);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
// ----------------------------------------------------------------
|
|
209
|
+
// import — non-interactive import
|
|
210
|
+
// ----------------------------------------------------------------
|
|
211
|
+
program
|
|
212
|
+
.command('import')
|
|
213
|
+
.description('Import MCP servers from Claude config files (non-interactive)')
|
|
214
|
+
.option('--remove-originals', 'Remove imported servers from source configs')
|
|
215
|
+
.option('--dry-run', 'Show what would be imported without writing')
|
|
216
|
+
.action((opts) => {
|
|
217
|
+
try {
|
|
218
|
+
const results = importServers({
|
|
219
|
+
yes: true,
|
|
220
|
+
removeOriginals: opts.removeOriginals,
|
|
221
|
+
dryRun: opts.dryRun,
|
|
222
|
+
});
|
|
223
|
+
console.log(formatImportResults(results, opts.dryRun));
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
console.error(pc.red(`Import failed: ${String(err)}`));
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
// ----------------------------------------------------------------
|
|
231
|
+
// export — generate rollback JSON
|
|
232
|
+
// ----------------------------------------------------------------
|
|
233
|
+
program
|
|
234
|
+
.command('export')
|
|
235
|
+
.description('Generate mcpServers JSON that points Claude back at mcp-conductor (rollback path)')
|
|
236
|
+
.option('--format <format>', 'Output format: claude-desktop | claude-code | raw', 'claude-desktop')
|
|
237
|
+
.action((opts) => {
|
|
238
|
+
try {
|
|
239
|
+
const result = exportToClaude({
|
|
240
|
+
format: opts.format ?? 'claude-desktop',
|
|
241
|
+
});
|
|
242
|
+
console.log(result.json);
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
console.error(pc.red(`Export failed: ${String(err)}`));
|
|
246
|
+
process.exit(1);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
// ----------------------------------------------------------------
|
|
250
|
+
// daemon — Phase 6 subcommands (start|stop|status|logs)
|
|
251
|
+
// ----------------------------------------------------------------
|
|
252
|
+
registerDaemonCommands(program);
|
|
253
|
+
// ----------------------------------------------------------------
|
|
254
|
+
// parse
|
|
255
|
+
// ----------------------------------------------------------------
|
|
256
|
+
program.parseAsync(process.argv).catch((err) => {
|
|
257
|
+
console.error(pc.red(`Unexpected error: ${String(err)}`));
|
|
258
|
+
process.exit(1);
|
|
259
|
+
});
|
|
260
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { BridgeConfig } from '../config/index.js';
|
|
9
9
|
import { type ExecutionStream } from '../streaming/index.js';
|
|
10
|
+
import { SessionRegistry } from './session-registry.js';
|
|
10
11
|
export interface ToolCallRequest {
|
|
11
12
|
server: string;
|
|
12
13
|
tool: string;
|
|
@@ -17,12 +18,38 @@ export interface ToolCallResponse {
|
|
|
17
18
|
error?: {
|
|
18
19
|
type: string;
|
|
19
20
|
message: string;
|
|
21
|
+
/** Populated when type === 'mcp_tool_error' */
|
|
22
|
+
code?: string;
|
|
23
|
+
server?: string;
|
|
24
|
+
tool?: string;
|
|
20
25
|
};
|
|
21
26
|
metrics?: {
|
|
22
27
|
durationMs: number;
|
|
23
28
|
dataSize: number;
|
|
24
29
|
};
|
|
30
|
+
/**
|
|
31
|
+
* Per-call PII reverse map (X4 — Agent J).
|
|
32
|
+
* Present only when the tool's `ToolDefinition.redact.response` annotation
|
|
33
|
+
* is active. Maps `[TOKEN_N]` → original sensitive value. The sandbox
|
|
34
|
+
* accumulates this across tool calls within one `execute_code` invocation
|
|
35
|
+
* and uses it to back `mcp.detokenize()`.
|
|
36
|
+
*/
|
|
37
|
+
reverseMap?: Record<string, string>;
|
|
25
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Internal marker returned by the bridge callTool handler when X4
|
|
41
|
+
* tokenization is active. The HTTP server unwraps it so the wire format
|
|
42
|
+
* cleanly separates `result` from `reverseMap`.
|
|
43
|
+
*
|
|
44
|
+
* @internal Not part of the public API — used only between mcp-server.ts
|
|
45
|
+
* and http-server.ts handleToolCall.
|
|
46
|
+
*/
|
|
47
|
+
export interface TokenizedCallResult {
|
|
48
|
+
__x4_result: unknown;
|
|
49
|
+
__x4_reverseMap: Record<string, string>;
|
|
50
|
+
}
|
|
51
|
+
/** Type guard for TokenizedCallResult */
|
|
52
|
+
export declare function isTokenizedCallResult(v: unknown): v is TokenizedCallResult;
|
|
26
53
|
export interface ServerInfo {
|
|
27
54
|
name: string;
|
|
28
55
|
toolCount: number;
|
|
@@ -72,7 +99,12 @@ export declare class HttpBridge {
|
|
|
72
99
|
private handlers;
|
|
73
100
|
private startTime;
|
|
74
101
|
private actualPort;
|
|
75
|
-
|
|
102
|
+
private sessions;
|
|
103
|
+
constructor(config: BridgeConfig, sessions?: SessionRegistry);
|
|
104
|
+
/**
|
|
105
|
+
* Exposed for tests that need to assert registry state directly.
|
|
106
|
+
*/
|
|
107
|
+
getSessionRegistry(): SessionRegistry;
|
|
76
108
|
/**
|
|
77
109
|
* Set the handlers for bridge operations
|
|
78
110
|
*/
|
|
@@ -93,6 +125,38 @@ export declare class HttpBridge {
|
|
|
93
125
|
* Get the actual port the server is listening on
|
|
94
126
|
*/
|
|
95
127
|
getPort(): number;
|
|
128
|
+
/**
|
|
129
|
+
* Return true if a bare hostname (no brackets, no port) is loopback.
|
|
130
|
+
* Hostnames are case-insensitive per RFC 1035 §2.3.3 — `Localhost` and
|
|
131
|
+
* `LOCALHOST` are valid Host header values, so compare lowercased.
|
|
132
|
+
*/
|
|
133
|
+
private static isLoopbackHostname;
|
|
134
|
+
/**
|
|
135
|
+
* Extract the bare hostname from a `Host` header (`host[:port]` or
|
|
136
|
+
* `[ipv6]:port`). Returns undefined for malformed values.
|
|
137
|
+
*/
|
|
138
|
+
private static extractHostHeaderName;
|
|
139
|
+
/**
|
|
140
|
+
* Extract hostname from an `Origin` header (a full URL like
|
|
141
|
+
* `http://example.com:8080`). Returns undefined for malformed values.
|
|
142
|
+
*
|
|
143
|
+
* Node's WHATWG URL keeps IPv6 addresses in bracketed form (`[::1]`) on
|
|
144
|
+
* the `hostname` property, so strip the brackets for comparison.
|
|
145
|
+
*/
|
|
146
|
+
private static extractOriginHostname;
|
|
147
|
+
/**
|
|
148
|
+
* Internal sandbox-only routes that should bypass MCP session middleware.
|
|
149
|
+
* The Deno sandbox is not an MCP client; tracking a session per call
|
|
150
|
+
* inflates the registry without any reconnection benefit and forces the
|
|
151
|
+
* 1000-entry LRU evictor into the hot path.
|
|
152
|
+
*/
|
|
153
|
+
private static isSandboxInternalPath;
|
|
154
|
+
/**
|
|
155
|
+
* Normalise the Mcp-Session-Id header. Node surfaces duplicates as string[],
|
|
156
|
+
* so take the first value and trim. Reject obvious garbage so bad clients
|
|
157
|
+
* don't get stored in the registry.
|
|
158
|
+
*/
|
|
159
|
+
private readSessionHeader;
|
|
96
160
|
/**
|
|
97
161
|
* Handle incoming HTTP request
|
|
98
162
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/bridge/http-server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/bridge/http-server.ts"],"names":[],"mappings":"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"}
|