claude-mcp-bridge 0.3.1 → 0.4.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 CHANGED
@@ -50,8 +50,8 @@ npx claude-mcp-bridge
50
50
 
51
51
  - [Claude Code CLI](https://github.com/anthropics/claude-code) installed and on PATH
52
52
  - Authentication (one of):
53
- - **Subscription**: `claude login` (uses your Pro/Max plan, no API credits needed)
54
- - **API key**: set `ANTHROPIC_API_KEY` (billed per use via console.anthropic.com)
53
+ - **Subscription** (default): `claude login` (uses your Pro/Max plan, no API credits needed)
54
+ - **API key**: set `ANTHROPIC_API_KEY` + `CLAUDE_BRIDGE_USE_API_KEY=1` (billed per use via console.anthropic.com)
55
55
 
56
56
  ### Codex CLI
57
57
 
@@ -90,7 +90,8 @@ Add to your MCP settings:
90
90
  "command": "npx",
91
91
  "args": ["-y", "claude-mcp-bridge"],
92
92
  "env": {
93
- "ANTHROPIC_API_KEY": "sk-ant-..."
93
+ "ANTHROPIC_API_KEY": "sk-ant-...",
94
+ "CLAUDE_BRIDGE_USE_API_KEY": "1"
94
95
  }
95
96
  }
96
97
  }
@@ -165,7 +166,8 @@ Model resolution: explicit parameter > tool-specific env var > `CLAUDE_DEFAULT_M
165
166
  | `CLAUDE_MAX_CONCURRENT` | `3` | Max concurrent subprocess spawns |
166
167
  | `CLAUDE_CLI_PATH` | `claude` | Path to CLI binary |
167
168
  | `CLAUDE_MAX_BUDGET_USD` | | Global cost cap in USD (per call) |
168
- | `ANTHROPIC_API_KEY` | | API key for bare mode auth |
169
+ | `ANTHROPIC_API_KEY` | | API key (only forwarded when `CLAUDE_BRIDGE_USE_API_KEY=1`) |
170
+ | `CLAUDE_BRIDGE_USE_API_KEY` | | Set to `1` to forward `ANTHROPIC_API_KEY` to the subprocess (default: subscription auth) |
169
171
 
170
172
  ### Effort
171
173
 
@@ -213,8 +215,8 @@ Three MCP servers, same architecture, different underlying CLIs. Each wraps a te
213
215
  | **Budget caps** | Native `--max-budget-usd` | Not supported | Not supported |
214
216
  | **Effort control** | `--effort low/medium/high/max` | Not supported | Not supported |
215
217
  | **Cold start** | ~1-2s | ~16s | <100ms (inference dominates) |
216
- | **Auth** | `claude login` (subscription) or `ANTHROPIC_API_KEY` | `gemini auth login` | `OPENAI_API_KEY` |
217
- | **Cost** | Subscription (included) or API credits | Free tier available | Pay-per-token |
218
+ | **Auth** | `claude login` (default) or `ANTHROPIC_API_KEY` + opt-in | `gemini auth login` | `OPENAI_API_KEY` |
219
+ | **Cost** | Subscription (default) or API credits (opt-in) | Free tier available | Pay-per-token |
218
220
  | **Concurrency** | 3 (configurable) | 3 (configurable) | 3 (configurable) |
219
221
  | **Model fallback** | Auto-retry with fallback model | Not supported | Auto-retry with fallback model |
220
222
 
@@ -1,3 +1,8 @@
1
- /** Build a minimal, safe environment for Claude CLI subprocesses. */
1
+ /**
2
+ * Build a minimal, safe environment for Claude CLI subprocesses.
3
+ *
4
+ * By default, uses subscription auth (OAuth tokens in ~/.claude/).
5
+ * Set CLAUDE_BRIDGE_USE_API_KEY=1 to forward ANTHROPIC_API_KEY to the subprocess.
6
+ */
2
7
  export declare function buildSubprocessEnv(): Record<string, string>;
3
8
  //# sourceMappingURL=env.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAgBA,qEAAqE;AACrE,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAc3D"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAeA;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqB3D"}
package/dist/utils/env.js CHANGED
@@ -1,5 +1,4 @@
1
1
  const ALLOWED_ENV_KEYS = [
2
- "ANTHROPIC_API_KEY",
3
2
  "CLAUDE_CONFIG_DIR",
4
3
  "CLAUDE_CODE_USE_BEDROCK",
5
4
  "CLAUDE_CODE_USE_VERTEX",
@@ -13,12 +12,23 @@ const ALLOWED_ENV_KEYS = [
13
12
  "TERM",
14
13
  "XDG_CONFIG_HOME",
15
14
  ];
16
- /** Build a minimal, safe environment for Claude CLI subprocesses. */
15
+ /**
16
+ * Build a minimal, safe environment for Claude CLI subprocesses.
17
+ *
18
+ * By default, uses subscription auth (OAuth tokens in ~/.claude/).
19
+ * Set CLAUDE_BRIDGE_USE_API_KEY=1 to forward ANTHROPIC_API_KEY to the subprocess.
20
+ */
17
21
  export function buildSubprocessEnv() {
18
22
  const env = {
19
23
  NO_COLOR: "1",
20
24
  FORCE_COLOR: "0",
21
25
  };
26
+ if (process.env["CLAUDE_BRIDGE_USE_API_KEY"] === "1") {
27
+ const apiKey = process.env["ANTHROPIC_API_KEY"];
28
+ if (apiKey) {
29
+ env["ANTHROPIC_API_KEY"] = apiKey;
30
+ }
31
+ }
22
32
  for (const key of ALLOWED_ENV_KEYS) {
23
33
  const value = process.env[key];
24
34
  if (value) {
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG;IACvB,mBAAmB;IACnB,mBAAmB;IACnB,yBAAyB;IACzB,wBAAwB;IACxB,YAAY;IACZ,oBAAoB;IACpB,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,iBAAiB;CAClB,CAAC;AAEF,qEAAqE;AACrE,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAA2B;QAClC,QAAQ,EAAE,GAAG;QACb,WAAW,EAAE,GAAG;KACjB,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG;IACvB,mBAAmB;IACnB,yBAAyB;IACzB,wBAAwB;IACxB,YAAY;IACZ,oBAAoB;IACpB,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,iBAAiB;CAClB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAA2B;QAClC,QAAQ,EAAE,GAAG;QACb,WAAW,EAAE,GAAG;KACjB,CAAC;IAEF,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,KAAK,GAAG,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,mBAAmB,CAAC,GAAG,MAAM,CAAC;QACpC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAejG;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAsChG;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAI1E;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAGlD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAMA,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAejG;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAuChG;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAI1E;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAGlD"}
@@ -1,3 +1,4 @@
1
+ import { redactSecrets } from "./parse.js";
1
2
  function combinedText(stdout, stderr) {
2
3
  return [stdout, stderr].filter(Boolean).join("\n").trim();
3
4
  }
@@ -20,29 +21,30 @@ export function isRetryableError(exitCode, stdout, stderr) {
20
21
  export function checkErrorPatterns(exitCode, stdout, stderr) {
21
22
  if (exitCode === 0)
22
23
  return;
23
- const text = combinedText(stdout, stderr);
24
- if (!text)
24
+ const raw = combinedText(stdout, stderr);
25
+ if (!raw)
25
26
  return;
26
- const lower = text.toLowerCase();
27
+ const lower = raw.toLowerCase();
28
+ const safe = redactSecrets(raw);
27
29
  if (lower.includes("api key")
28
30
  || lower.includes("authentication")
29
31
  || lower.includes("unauthorized")
30
32
  || lower.includes("forbidden")) {
31
- throw new Error(`Claude CLI authentication error. Set ANTHROPIC_API_KEY for bare mode.\n\nDetails: ${text}`);
33
+ throw new Error(`Claude CLI authentication error. Run "claude login" for subscription auth, or set ANTHROPIC_API_KEY + CLAUDE_BRIDGE_USE_API_KEY=1 for API key auth.\n\nDetails: ${safe}`);
32
34
  }
33
35
  if (lower.includes("credit balance is too low")
34
36
  || lower.includes("rate limit")
35
37
  || lower.includes("too many requests")
36
38
  || lower.includes("quota")
37
39
  || lower.includes("overloaded")) {
38
- throw new Error(`Claude API quota or rate-limit error.\n\nDetails: ${text}`);
40
+ throw new Error(`Claude API quota or rate-limit error.\n\nDetails: ${safe}`);
39
41
  }
40
42
  if (lower.includes("connectionrefused")
41
43
  || lower.includes("connection refused")
42
44
  || lower.includes("unable to connect to api")
43
45
  || lower.includes("network")
44
46
  || lower.includes("econnrefused")) {
45
- throw new Error(`Claude API connection error.\n\nDetails: ${text}`);
47
+ throw new Error(`Claude API connection error.\n\nDetails: ${safe}`);
46
48
  }
47
49
  }
48
50
  export function throwIfClaudeError(isError, message) {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,SAAS,YAAY,CAAC,MAAc,EAAE,MAAc;IAClD,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAuB,EAAE,MAAc,EAAE,MAAc;IACtF,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjC,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACxD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,OAAO;QACL,2BAA2B;QAC3B,YAAY;QACZ,mBAAmB;QACnB,OAAO;QACP,YAAY;QACZ,KAAK;QACL,KAAK;KACN,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAuB,EAAE,MAAc,EAAE,MAAc;IACxF,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO;IAE3B,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO;IAElB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAEjC,IACE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;WACtB,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;WAChC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;WAC9B,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAC9B,CAAC;QACD,MAAM,IAAI,KAAK,CACb,qFAAqF,IAAI,EAAE,CAC5F,CAAC;IACJ,CAAC;IAED,IACE,KAAK,CAAC,QAAQ,CAAC,2BAA2B,CAAC;WACxC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;WAC5B,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;WACnC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;WACvB,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC/B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qDAAqD,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,IACE,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;WAChC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC;WACpC,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC;WAC1C,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;WACzB,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EACjC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAgB,EAAE,OAAe;IAClE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAU;IACxC,IAAI,CAAC,YAAY,KAAK;QAAE,OAAO,CAAC,CAAC,OAAO,CAAC;IACzC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,SAAS,YAAY,CAAC,MAAc,EAAE,MAAc;IAClD,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAuB,EAAE,MAAc,EAAE,MAAc;IACtF,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjC,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACxD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,OAAO;QACL,2BAA2B;QAC3B,YAAY;QACZ,mBAAmB;QACnB,OAAO;QACP,YAAY;QACZ,KAAK;QACL,KAAK;KACN,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAuB,EAAE,MAAc,EAAE,MAAc;IACxF,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO;IAE3B,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAEhC,IACE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;WACtB,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;WAChC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;WAC9B,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAC9B,CAAC;QACD,MAAM,IAAI,KAAK,CACb,mKAAmK,IAAI,EAAE,CAC1K,CAAC;IACJ,CAAC;IAED,IACE,KAAK,CAAC,QAAQ,CAAC,2BAA2B,CAAC;WACxC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;WAC5B,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;WACnC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;WACvB,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC/B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qDAAqD,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,IACE,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;WAChC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC;WACpC,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC;WAC1C,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;WACzB,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EACjC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAgB,EAAE,OAAe;IAClE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAU;IACxC,IAAI,CAAC,YAAY,KAAK;QAAE,OAAO,CAAC,CAAC,OAAO,CAAC;IACzC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-mcp-bridge",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "MCP server that wraps Claude Code CLI for query, structured output, and health checks",
5
5
  "author": "Tim Birrell",
6
6
  "license": "MIT",