@mcp-abap-adt/configurator 0.0.9 → 0.0.11

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
@@ -20,6 +20,8 @@ mcp-conf --client codex --name abap-http --transport http --url http://localhost
20
20
  mcp-conf --client opencode --name abap --transport http --url http://localhost:3000/mcp/stream/http
21
21
  mcp-conf --client kilo --name abap --transport http --url http://localhost:3000/mcp/stream/http
22
22
  mcp-conf --client copilot --name abap --transport http --url http://localhost:3000/mcp/stream/http --header x-mcp-destination=trial
23
+ mcp-conf --client crush --name abap --mcp TRIAL
24
+ mcp-conf --client crush --name abap --transport http --url http://localhost:3000/mcp/stream/http
23
25
  mcp-conf tui
24
26
  ```
25
27
 
@@ -15,6 +15,7 @@ const CLIENTS = [
15
15
  { name: "opencode", message: "OpenCode (kilo)" },
16
16
  { name: "copilot", message: "GitHub Copilot" },
17
17
  { name: "antigravity", message: "Antigravity" },
18
+ { name: "crush", message: "Crush" },
18
19
  ];
19
20
 
20
21
  const HEADER_KEYS = [
package/bin/mcp-conf.js CHANGED
@@ -320,37 +320,33 @@ for (const client of options.clients) {
320
320
  fail("--project is only supported for Claude global config.");
321
321
  }
322
322
  if (options.toggle && scope === "local") {
323
- const localPath = getClaudePath(platform, home, appData, "local");
323
+ const localPath = getClaudePath(home, "local");
324
324
  if (!claudeLocalHasServer(localPath, options.name)) {
325
325
  fail(`Server "${options.name}" not found in ${localPath}.`);
326
326
  }
327
327
  }
328
328
  if (options.list) {
329
329
  listClaudeConfig(
330
- getClaudePath(platform, home, appData, claudeToggleScope),
330
+ getClaudePath(home, claudeToggleScope),
331
331
  options.allProjects,
332
332
  options.projectPath,
333
333
  );
334
334
  } else if (options.show) {
335
335
  showClaudeConfig(
336
- getClaudePath(platform, home, appData, claudeToggleScope),
336
+ getClaudePath(home, claudeToggleScope),
337
337
  options.name,
338
338
  options.allProjects,
339
339
  options.projectPath,
340
340
  );
341
341
  } else if (options.where) {
342
342
  whereClaudeConfig(
343
- getClaudePath(platform, home, appData, claudeToggleScope),
343
+ getClaudePath(home, claudeToggleScope),
344
344
  options.name,
345
345
  options.allProjects,
346
346
  options.projectPath,
347
347
  );
348
348
  } else {
349
- writeClaudeConfig(
350
- getClaudePath(platform, home, appData, claudeToggleScope),
351
- options.name,
352
- serverArgs,
353
- );
349
+ writeClaudeConfig(getClaudePath(home, claudeToggleScope), options.name, serverArgs);
354
350
  }
355
351
  break;
356
352
  }
@@ -445,6 +441,23 @@ for (const client of options.clients) {
445
441
  );
446
442
  }
447
443
  break;
444
+ case "crush":
445
+ requireScope("Crush", ["global", "local"], scope);
446
+ if (options.list) {
447
+ listJsonConfig(getCrushPath(platform, home, userProfile, scope), "crush");
448
+ } else if (options.show) {
449
+ showJsonConfig(getCrushPath(platform, home, userProfile, scope), "crush", options.name);
450
+ } else if (options.where) {
451
+ whereJsonConfig(getCrushPath(platform, home, userProfile, scope), "crush", options.name);
452
+ } else {
453
+ writeJsonConfig(
454
+ getCrushPath(platform, home, userProfile, scope),
455
+ options.name,
456
+ serverArgs,
457
+ "crush",
458
+ );
459
+ }
460
+ break;
448
461
  default:
449
462
  fail(`Unknown client: ${client}`);
450
463
  }
@@ -534,22 +547,10 @@ function getCodexPath(platformValue, homeDir, userProfileDir, scopeValue) {
534
547
  return path.join(homeDir, ".codex", "config.toml");
535
548
  }
536
549
 
537
- function getClaudePath(platformValue, homeDir, appDataDir, scopeValue) {
550
+ function getClaudePath(homeDir, scopeValue) {
538
551
  if (scopeValue === "local") {
539
552
  return path.join(process.cwd(), ".mcp.json");
540
553
  }
541
- if (platformValue === "darwin") {
542
- return path.join(
543
- homeDir,
544
- "Library",
545
- "Application Support",
546
- "Claude",
547
- "claude_desktop_config.json",
548
- );
549
- }
550
- if (platformValue === "win32") {
551
- return path.join(appDataDir, "Claude", "claude_desktop_config.json");
552
- }
553
554
  return path.join(homeDir, ".claude.json");
554
555
  }
555
556
 
@@ -596,6 +597,16 @@ function getWindsurfPath(platformValue, homeDir, userProfileDir) {
596
597
  return path.join(homeDir, ".codeium", "windsurf", "mcp_config.json");
597
598
  }
598
599
 
600
+ function getCrushPath(platformValue, homeDir, userProfileDir, scopeValue) {
601
+ if (scopeValue === "local") {
602
+ return path.join(process.cwd(), ".crush.json");
603
+ }
604
+ if (platformValue === "win32") {
605
+ return path.join(userProfileDir, "AppData", "Local", "crush", "crush.json");
606
+ }
607
+ return path.join(homeDir, ".config", "crush", "crush.json");
608
+ }
609
+
599
610
  function requireScope(clientLabel, allowedScopes, requestedScope) {
600
611
  if (!allowedScopes.includes(requestedScope)) {
601
612
  fail(
@@ -641,13 +652,15 @@ function resolveProjectSelector(data, projectPath) {
641
652
  }
642
653
 
643
654
  function getDefaultDisabled(clientType) {
644
- return ["cline", "codex", "windsurf", "goose", "claude", "opencode"].includes(clientType);
655
+ return ["cline", "codex", "windsurf", "goose", "claude", "opencode", "crush"].includes(
656
+ clientType,
657
+ );
645
658
  }
646
659
 
647
660
  function writeJsonConfig(filePath, serverName, argsArray, clientType) {
648
661
  ensureDir(filePath);
649
662
  const data = readJson(filePath);
650
- if (clientType === "opencode") {
663
+ if (clientType === "opencode" || clientType === "crush") {
651
664
  data.mcp = data.mcp || {};
652
665
  } else if (clientType === "antigravity") {
653
666
  data.mcpServers = data.mcpServers || {};
@@ -664,7 +677,7 @@ function writeJsonConfig(filePath, serverName, argsArray, clientType) {
664
677
  );
665
678
  }
666
679
  const store =
667
- clientType === "opencode"
680
+ clientType === "opencode" || clientType === "crush"
668
681
  ? data.mcp
669
682
  : clientType === "copilot"
670
683
  ? data.servers
@@ -687,7 +700,7 @@ function writeJsonConfig(filePath, serverName, argsArray, clientType) {
687
700
  }
688
701
  if (options.remove) {
689
702
  const store =
690
- clientType === "opencode"
703
+ clientType === "opencode" || clientType === "crush"
691
704
  ? data.mcp
692
705
  : clientType === "copilot"
693
706
  ? data.servers
@@ -700,7 +713,7 @@ function writeJsonConfig(filePath, serverName, argsArray, clientType) {
700
713
  return;
701
714
  }
702
715
  const store =
703
- clientType === "opencode"
716
+ clientType === "opencode" || clientType === "crush"
704
717
  ? data.mcp
705
718
  : clientType === "copilot"
706
719
  ? data.servers
@@ -747,6 +760,30 @@ function writeJsonConfig(filePath, serverName, argsArray, clientType) {
747
760
  writeFile(filePath, JSON.stringify(data, null, 2));
748
761
  return;
749
762
  }
763
+ if (clientType === "crush") {
764
+ if (options.transport === "stdio") {
765
+ store[serverName] = {
766
+ type: "stdio",
767
+ command: options.command,
768
+ args: argsArray,
769
+ timeout: options.timeout,
770
+ disabled: !!(options.disabled || getDefaultDisabled("crush")),
771
+ };
772
+ } else {
773
+ const entry = {
774
+ type: options.transport === "streamableHttp" ? "http" : options.transport,
775
+ url: options.url,
776
+ timeout: options.timeout,
777
+ disabled: !!(options.disabled || getDefaultDisabled("crush")),
778
+ };
779
+ if (Object.keys(options.headers).length > 0) {
780
+ entry.headers = options.headers;
781
+ }
782
+ store[serverName] = entry;
783
+ }
784
+ writeFile(filePath, JSON.stringify(data, null, 2));
785
+ return;
786
+ }
750
787
  if (clientType === "antigravity") {
751
788
  if (options.transport === "stdio") {
752
789
  store[serverName] = {
@@ -1129,7 +1166,7 @@ function writeGooseConfig(filePath, serverName, argsArray) {
1129
1166
  function listJsonConfig(filePath, clientType) {
1130
1167
  const data = readJson(filePath);
1131
1168
  let store;
1132
- if (clientType === "opencode") {
1169
+ if (clientType === "opencode" || clientType === "crush") {
1133
1170
  store = data.mcp || {};
1134
1171
  } else if (clientType === "antigravity") {
1135
1172
  store = data.mcpServers || {};
@@ -1196,7 +1233,7 @@ function claudeLocalHasServer(filePath, serverName) {
1196
1233
  function whereJsonConfig(filePath, clientType, serverName) {
1197
1234
  const data = readJson(filePath);
1198
1235
  let store;
1199
- if (clientType === "opencode") {
1236
+ if (clientType === "opencode" || clientType === "crush") {
1200
1237
  store = data.mcp || {};
1201
1238
  } else if (clientType === "antigravity") {
1202
1239
  store = data.mcpServers || {};
@@ -1264,7 +1301,7 @@ function whereClaudeConfig(filePath, serverName, allProjects, projectPath) {
1264
1301
  function showJsonConfig(filePath, clientType, serverName) {
1265
1302
  const data = readJson(filePath);
1266
1303
  let store;
1267
- if (clientType === "opencode") {
1304
+ if (clientType === "opencode" || clientType === "crush") {
1268
1305
  store = data.mcp || {};
1269
1306
  } else if (clientType === "antigravity") {
1270
1307
  store = data.mcpServers || {};
@@ -1455,6 +1492,11 @@ function inferTransport(clientType, entry, parsedArgs) {
1455
1492
  if (clientType === "antigravity") {
1456
1493
  return entry?.type === "http" ? "http" : "stdio";
1457
1494
  }
1495
+ if (clientType === "crush") {
1496
+ if (entry?.type === "http") return "http";
1497
+ if (entry?.type === "sse") return "sse";
1498
+ return "stdio";
1499
+ }
1458
1500
  if (entry?.type === "streamableHttp" || entry?.type === "http") {
1459
1501
  return "http";
1460
1502
  }
@@ -1635,7 +1677,7 @@ Usage:
1635
1677
  mcp-conf add --client <name> --name <serverName> [--env | --env-path <path> | --mcp <dest>] [options]
1636
1678
 
1637
1679
  Options:
1638
- --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity (repeatable)
1680
+ --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity | crush (repeatable)
1639
1681
  --name <serverName> required MCP server name key
1640
1682
  --env use current shell/session env vars (stdio only)
1641
1683
  --env-path <path> .env path (stdio only)
@@ -1662,7 +1704,7 @@ Usage:
1662
1704
  mcp-conf rm --client <name> --name <serverName> [options]
1663
1705
 
1664
1706
  Options:
1665
- --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity (repeatable)
1707
+ --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity | crush (repeatable)
1666
1708
  --name <serverName> required MCP server name key
1667
1709
  --global write to global user config (default)
1668
1710
  --local write to project config (where supported)
@@ -1681,7 +1723,7 @@ Usage:
1681
1723
  mcp-conf ls --client <name> [options]
1682
1724
 
1683
1725
  Options:
1684
- --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity (repeatable)
1726
+ --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity | crush (repeatable)
1685
1727
  --global write to global user config (default)
1686
1728
  --local write to project config (where supported)
1687
1729
  --all-projects Claude global: list across all projects
@@ -1698,7 +1740,7 @@ Usage:
1698
1740
  mcp-conf enable --client <name> --name <serverName> [options]
1699
1741
 
1700
1742
  Options:
1701
- --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity (repeatable)
1743
+ --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity | crush (repeatable)
1702
1744
  --name <serverName> required MCP server name key
1703
1745
  --global write to global user config (default)
1704
1746
  --local write to project config (where supported)
@@ -1717,7 +1759,7 @@ Usage:
1717
1759
  mcp-conf disable --client <name> --name <serverName> [options]
1718
1760
 
1719
1761
  Options:
1720
- --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity (repeatable)
1762
+ --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity | crush (repeatable)
1721
1763
  --name <serverName> required MCP server name key
1722
1764
  --global write to global user config (default)
1723
1765
  --local write to project config (where supported)
@@ -1736,7 +1778,7 @@ Usage:
1736
1778
  mcp-conf where --client <name> --name <serverName> [options]
1737
1779
 
1738
1780
  Options:
1739
- --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity (repeatable)
1781
+ --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity | crush (repeatable)
1740
1782
  --name <serverName> required MCP server name key
1741
1783
  --global write to global user config (default)
1742
1784
  --local write to project config (where supported)
@@ -1754,7 +1796,7 @@ Usage:
1754
1796
  mcp-conf show --client <name> --name <serverName> [options]
1755
1797
 
1756
1798
  Options:
1757
- --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity (repeatable)
1799
+ --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity | crush (repeatable)
1758
1800
  --name <serverName> required MCP server name key
1759
1801
  --global read from global user config (default)
1760
1802
  --local read from project config (where supported)
@@ -1773,7 +1815,7 @@ Usage:
1773
1815
  mcp-conf update --client <name> --name <serverName> [--env | --env-path <path> | --mcp <dest>] [options]
1774
1816
 
1775
1817
  Options:
1776
- --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity (repeatable)
1818
+ --client <name> cline | codex | claude | goose | cursor | windsurf | opencode | kilo | copilot | antigravity | crush (repeatable)
1777
1819
  --name <serverName> required MCP server name key
1778
1820
  --env use current shell/session env vars (stdio only)
1779
1821
  --env-path <path> .env path (stdio only)
@@ -24,6 +24,8 @@ mcp-conf add --client opencode --name abap --transport http --url http://localho
24
24
  mcp-conf add --client kilo --name abap --transport http --url http://localhost:3000/mcp/stream/http
25
25
  mcp-conf add --client copilot --name abap --transport http --url http://localhost:3000/mcp/stream/http --header x-mcp-destination=trial
26
26
  mcp-conf add --client antigravity --name abap --transport http --url http://localhost:3000/mcp/stream/http
27
+ mcp-conf add --client crush --name abap --mcp TRIAL
28
+ mcp-conf add --client crush --name abap --transport http --url http://localhost:3000/mcp/stream/http
27
29
  mcp-conf tui
28
30
  ```
29
31
 
@@ -49,6 +51,7 @@ Enable MCP:
49
51
  mcp-conf enable --client codex --name abap
50
52
  mcp-conf enable --client cline --name abap
51
53
  mcp-conf enable --client antigravity --name abap
54
+ mcp-conf enable --client crush --name abap
52
55
  ```
53
56
 
54
57
  Remove MCP:
@@ -57,6 +60,7 @@ mcp-conf rm --client codex --name abap
57
60
  mcp-conf rm --client cline --name abap
58
61
  mcp-conf rm --client claude --name abap
59
62
  mcp-conf rm --client antigravity --name abap
63
+ mcp-conf rm --client crush --name abap
60
64
  ```
61
65
 
62
66
  List MCP servers:
@@ -66,6 +70,8 @@ mcp-conf ls --client cline
66
70
  mcp-conf ls --client claude --local
67
71
  mcp-conf ls --client claude --all-projects
68
72
  mcp-conf ls --client antigravity --global
73
+ mcp-conf ls --client crush
74
+ mcp-conf ls --client crush --local
69
75
  ```
70
76
 
71
77
  Find where a server is defined:
@@ -87,7 +93,7 @@ mcp-conf tui
87
93
 
88
94
  Options:
89
95
  - Commands: `add`, `rm`, `ls`, `enable`, `disable`, `where`, `show`, `update`, `tui` (first argument)
90
- - `--client <name>` (repeatable): `cline`, `codex`, `claude`, `goose`, `cursor`, `windsurf`, `opencode` (`kilo` alias), `copilot`, `antigravity`
96
+ - `--client <name>` (repeatable): `cline`, `codex`, `claude`, `goose`, `cursor`, `windsurf`, `opencode` (`kilo` alias), `copilot`, `antigravity`, `crush`
91
97
  - `--env`: use shell/session environment variables (stdio only)
92
98
  - `--env-path <path>`: use a specific `.env` file (stdio only)
93
99
  - `--mcp <destination>`: use service key destination
@@ -95,7 +101,7 @@ Options:
95
101
  - `--transport <type>`: `stdio`, `sse`, or `http` (`http` maps to `streamableHttp`)
96
102
  - `--command <bin>`: command to run (default: `mcp-abap-adt`)
97
103
  - `--global`: write to the global user config (default)
98
- - `--local`: write to the project config (supported by `cursor`, `opencode`/`kilo`, `copilot`, `claude`, `codex`)
104
+ - `--local`: write to the project config (supported by `cursor`, `opencode`/`kilo`, `copilot`, `claude`, `codex`, `crush`)
99
105
  - `--all-projects`: for Claude (global scope), apply `rm/enable/disable/ls/where` across all projects
100
106
  - `--project <path>`: for Claude (global scope), target a specific project path
101
107
  - `--url <http(s)://...>`: required for `sse` and `http`
@@ -113,7 +119,7 @@ Notes:
113
119
  - Claude stores enable/disable state under `enabledMcpServers` and `disabledMcpServers` for each project.
114
120
  - Claude enable/disable always updates `~/.claude.json` (global scope), even if you pass `--local`.
115
121
  - Antigravity HTTP entries use `serverUrl` instead of `url`.
116
- - New entries for Cline, Codex, Windsurf, Goose, Claude, and OpenCode are added **disabled by default**. Use `enable` to turn them on.
122
+ - New entries for Cline, Codex, Windsurf, Goose, Claude, OpenCode, and Crush are added **disabled by default**. Use `enable` to turn them on.
117
123
  - Windsurf follows `disabled` like Cline. The configurator sets `disabled = true` for default-disabled entries.
118
124
  - `enable`/`disable` only work if the server entry already exists. Use add commands with `--env`, `--env-path`, or `--mcp` first.
119
125
  - Non-stdio transports are supported for Cline/Cursor/Windsurf/Claude/Goose. Codex supports `http` (streamable HTTP) but not `sse`.
@@ -138,10 +144,8 @@ Global (default) locations:
138
144
  - Windows: `%USERPROFILE%\.codex\config.toml`
139
145
  - Local (project): `./.codex/config.toml`
140
146
  - **Claude Code (CLI)**:
141
- - Linux default: `~/.claude.json` (per-project entries under `projects.<cwd>.mcpServers`)
142
- - **Claude Desktop**:
143
- - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
144
- - Windows: `%APPDATA%\Claude\claude_desktop_config.json`
147
+ - Linux/macOS: `~/.claude.json` (per-project entries under `projects.<cwd>.mcpServers`)
148
+ - Windows: `%USERPROFILE%\.claude.json`
145
149
  - **Goose**:
146
150
  - Linux/macOS: `~/.config/goose/config.yaml`
147
151
  - Windows: `%APPDATA%\Block\goose\config\config.yaml`
@@ -151,11 +155,16 @@ Global (default) locations:
151
155
  - **Windsurf**:
152
156
  - Linux/macOS: `~/.codeium/windsurf/mcp_config.json`
153
157
  - Windows: `%USERPROFILE%\.codeium\windsurf\mcp_config.json`
158
+ - Note: some Windsurf docs/examples also mention legacy `~/.codeium/mcp_config.json`.
154
159
  - **OpenCode**:
155
160
  - Linux/macOS: `~/.config/opencode/opencode.json`
156
161
  - Windows: `%APPDATA%\opencode\opencode.json`
157
162
  - **Antigravity**:
158
163
  - Linux/macOS: `~/.gemini/antigravity/mcp_config.json`
164
+ - Note: path is community-reported; verify against latest vendor docs.
165
+ - **Crush**:
166
+ - Linux/macOS: `~/.config/crush/crush.json`
167
+ - Windows: `%USERPROFILE%\AppData\Local\crush\crush.json`
159
168
 
160
169
  Local (project) locations:
161
170
  - **Claude Code**:
@@ -168,3 +177,5 @@ Local (project) locations:
168
177
  - Project: `./.vscode/mcp.json` (uses `servers.<name>` entries)
169
178
  - **Antigravity**:
170
179
  - Project: `./.antigravity/mcp.json` (community-reported; not supported yet)
180
+ - **Crush**:
181
+ - Project: `./.crush.json` (uses `mcp.<name>` entries with `disabled: true|false`)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-abap-adt/configurator",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "description": "MCP client configurator for mcp-abap-adt and mcp-abap-adt-proxy",
5
5
  "license": "MIT",
6
6
  "repository": {