@osanoai/multicli 1.5.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.
Files changed (118) hide show
  1. package/README.md +209 -0
  2. package/dist/clientFilter.d.ts +5 -0
  3. package/dist/clientFilter.d.ts.map +1 -0
  4. package/dist/clientFilter.js +27 -0
  5. package/dist/clientFilter.js.map +1 -0
  6. package/dist/constants.d.ts +88 -0
  7. package/dist/constants.d.ts.map +1 -0
  8. package/dist/constants.js +90 -0
  9. package/dist/constants.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +205 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/modelCatalog.d.ts +14 -0
  15. package/dist/modelCatalog.d.ts.map +1 -0
  16. package/dist/modelCatalog.js +99 -0
  17. package/dist/modelCatalog.js.map +1 -0
  18. package/dist/tools/ask-claude.tool.d.ts +3 -0
  19. package/dist/tools/ask-claude.tool.d.ts.map +1 -0
  20. package/dist/tools/ask-claude.tool.js +28 -0
  21. package/dist/tools/ask-claude.tool.js.map +1 -0
  22. package/dist/tools/ask-codex.tool.d.ts +3 -0
  23. package/dist/tools/ask-codex.tool.d.ts.map +1 -0
  24. package/dist/tools/ask-codex.tool.js +27 -0
  25. package/dist/tools/ask-codex.tool.js.map +1 -0
  26. package/dist/tools/ask-gemini.tool.d.ts +3 -0
  27. package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
  28. package/dist/tools/ask-gemini.tool.js +36 -0
  29. package/dist/tools/ask-gemini.tool.js.map +1 -0
  30. package/dist/tools/brainstorm-claude.tool.d.ts +3 -0
  31. package/dist/tools/brainstorm-claude.tool.d.ts.map +1 -0
  32. package/dist/tools/brainstorm-claude.tool.js +42 -0
  33. package/dist/tools/brainstorm-claude.tool.js.map +1 -0
  34. package/dist/tools/brainstorm-codex.tool.d.ts +3 -0
  35. package/dist/tools/brainstorm-codex.tool.d.ts.map +1 -0
  36. package/dist/tools/brainstorm-codex.tool.js +42 -0
  37. package/dist/tools/brainstorm-codex.tool.js.map +1 -0
  38. package/dist/tools/brainstorm.tool.d.ts +3 -0
  39. package/dist/tools/brainstorm.tool.d.ts.map +1 -0
  40. package/dist/tools/brainstorm.tool.js +42 -0
  41. package/dist/tools/brainstorm.tool.js.map +1 -0
  42. package/dist/tools/fetch-chunk.tool.d.ts +3 -0
  43. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
  44. package/dist/tools/fetch-chunk.tool.js +58 -0
  45. package/dist/tools/fetch-chunk.tool.js.map +1 -0
  46. package/dist/tools/important-read-now.tool.d.ts +3 -0
  47. package/dist/tools/important-read-now.tool.d.ts.map +1 -0
  48. package/dist/tools/important-read-now.tool.js +31 -0
  49. package/dist/tools/important-read-now.tool.js.map +1 -0
  50. package/dist/tools/index.d.ts +8 -0
  51. package/dist/tools/index.d.ts.map +1 -0
  52. package/dist/tools/index.js +34 -0
  53. package/dist/tools/index.js.map +1 -0
  54. package/dist/tools/registry.d.ts +25 -0
  55. package/dist/tools/registry.d.ts.map +1 -0
  56. package/dist/tools/registry.js +78 -0
  57. package/dist/tools/registry.js.map +1 -0
  58. package/dist/tools/simple-tools.d.ts +8 -0
  59. package/dist/tools/simple-tools.d.ts.map +1 -0
  60. package/dist/tools/simple-tools.js +78 -0
  61. package/dist/tools/simple-tools.js.map +1 -0
  62. package/dist/tools/test-tool.example.d.ts +13 -0
  63. package/dist/tools/test-tool.example.d.ts.map +1 -0
  64. package/dist/tools/test-tool.example.js +32 -0
  65. package/dist/tools/test-tool.example.js.map +1 -0
  66. package/dist/tools/timeout-test.tool.d.ts +3 -0
  67. package/dist/tools/timeout-test.tool.d.ts.map +1 -0
  68. package/dist/tools/timeout-test.tool.js +32 -0
  69. package/dist/tools/timeout-test.tool.js.map +1 -0
  70. package/dist/utils/brainstormPromptBuilder.d.ts +11 -0
  71. package/dist/utils/brainstormPromptBuilder.d.ts.map +1 -0
  72. package/dist/utils/brainstormPromptBuilder.js +93 -0
  73. package/dist/utils/brainstormPromptBuilder.js.map +1 -0
  74. package/dist/utils/changeModeChunker.d.ts +11 -0
  75. package/dist/utils/changeModeChunker.d.ts.map +1 -0
  76. package/dist/utils/changeModeChunker.js +89 -0
  77. package/dist/utils/changeModeChunker.js.map +1 -0
  78. package/dist/utils/changeModeParser.d.ts +15 -0
  79. package/dist/utils/changeModeParser.d.ts.map +1 -0
  80. package/dist/utils/changeModeParser.js +67 -0
  81. package/dist/utils/changeModeParser.js.map +1 -0
  82. package/dist/utils/changeModeTranslator.d.ts +8 -0
  83. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  84. package/dist/utils/changeModeTranslator.js +70 -0
  85. package/dist/utils/changeModeTranslator.js.map +1 -0
  86. package/dist/utils/chunkCache.d.ts +22 -0
  87. package/dist/utils/chunkCache.d.ts.map +1 -0
  88. package/dist/utils/chunkCache.js +147 -0
  89. package/dist/utils/chunkCache.js.map +1 -0
  90. package/dist/utils/claudeExecutor.d.ts +2 -0
  91. package/dist/utils/claudeExecutor.d.ts.map +1 -0
  92. package/dist/utils/claudeExecutor.js +21 -0
  93. package/dist/utils/claudeExecutor.js.map +1 -0
  94. package/dist/utils/cliDetector.d.ts +17 -0
  95. package/dist/utils/cliDetector.d.ts.map +1 -0
  96. package/dist/utils/cliDetector.js +45 -0
  97. package/dist/utils/cliDetector.js.map +1 -0
  98. package/dist/utils/codexExecutor.d.ts +2 -0
  99. package/dist/utils/codexExecutor.d.ts.map +1 -0
  100. package/dist/utils/codexExecutor.js +19 -0
  101. package/dist/utils/codexExecutor.js.map +1 -0
  102. package/dist/utils/commandExecutor.d.ts +2 -0
  103. package/dist/utils/commandExecutor.d.ts.map +1 -0
  104. package/dist/utils/commandExecutor.js +53 -0
  105. package/dist/utils/commandExecutor.js.map +1 -0
  106. package/dist/utils/geminiExecutor.d.ts +3 -0
  107. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  108. package/dist/utils/geminiExecutor.js +126 -0
  109. package/dist/utils/geminiExecutor.js.map +1 -0
  110. package/dist/utils/logger.d.ts +14 -0
  111. package/dist/utils/logger.d.ts.map +1 -0
  112. package/dist/utils/logger.js +56 -0
  113. package/dist/utils/logger.js.map +1 -0
  114. package/dist/utils/timeoutManager.d.ts +2 -0
  115. package/dist/utils/timeoutManager.d.ts.map +1 -0
  116. package/dist/utils/timeoutManager.js +2 -0
  117. package/dist/utils/timeoutManager.js.map +1 -0
  118. package/package.json +68 -0
package/README.md ADDED
@@ -0,0 +1,209 @@
1
+ # Osano AI - Multi CLI MCP
2
+
3
+ **The AI collab no one asked for, but everyone needed.**
4
+
5
+ An MCP server that lets Claude, Gemini, and Codex call each other as tools. Because why argue about which AI is best when you can make them work together?
6
+
7
+ ```
8
+ Claude: "Hey Gemini, what do you think about this code?"
9
+ Gemini: "It's mass. Let me ask Codex for a second opinion."
10
+ Codex: "You're both wrong. Here's the fix."
11
+ ```
12
+
13
+ ## What It Does
14
+
15
+ Multi-CLI sits between your AI clients and bridges them via the [Model Context Protocol](https://modelcontextprotocol.io/). Install it once, and whichever AI you're talking to gains the ability to call the others.
16
+
17
+ - **Claude** can ask Gemini or Codex for help
18
+ - **Gemini** can delegate to Claude or Codex
19
+ - **Codex** can consult Claude or Gemini
20
+ - Each client's own tools are hidden (no talking to yourself, that's weird)
21
+ - Auto-detects which CLIs you have installed — only shows what's available
22
+
23
+ ## Prerequisites
24
+
25
+ You need **Node.js >= 18** and at least **two** of these CLIs installed:
26
+
27
+ | CLI | Install |
28
+ |-----|---------|
29
+ | [Gemini CLI](https://github.com/google-gemini/gemini-cli) | `npm install -g @google/gemini-cli` |
30
+ | [Claude Code](https://docs.anthropic.com/en/docs/claude-code/overview) | `npm install -g @anthropic-ai/claude-code` |
31
+ | [Codex CLI](https://github.com/openai/codex) | `npm install -g @openai/codex` |
32
+
33
+ > Why two? Because one AI talking to itself is a monologue, not a collaboration.
34
+
35
+ ---
36
+
37
+ ## Installation
38
+
39
+ ### Claude Code
40
+
41
+ ```bash
42
+ claude mcp add "Multi-CLI" -- npx -y "Multi-CLI"
43
+ ```
44
+
45
+ That's it. Restart Claude Code and Gemini + Codex tools appear automatically.
46
+
47
+ <details>
48
+ <summary>Claude Desktop (JSON config)</summary>
49
+
50
+ Add to your config file (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
51
+
52
+ ```json
53
+ {
54
+ "mcpServers": {
55
+ "multicli-mcp": {
56
+ "command": "npx",
57
+ "args": ["-y", "multicli-mcp"]
58
+ }
59
+ }
60
+ }
61
+ ```
62
+
63
+ Restart Claude Desktop completely after saving.
64
+ </details>
65
+
66
+ ---
67
+
68
+ ### Gemini CLI
69
+
70
+ ```bash
71
+ gemini mcp add --scope user multicli-mcp npx -y multicli-mcp
72
+ ```
73
+
74
+ Restart the Gemini CLI and Claude + Codex tools will be available.
75
+
76
+ <details>
77
+ <summary>Manual config (~/.gemini/settings.json)</summary>
78
+
79
+ ```json
80
+ {
81
+ "mcpServers": {
82
+ "multicli-mcp": {
83
+ "command": "npx",
84
+ "args": ["-y", "multicli-mcp"]
85
+ }
86
+ }
87
+ }
88
+ ```
89
+ </details>
90
+
91
+ ---
92
+
93
+ ### Codex CLI
94
+
95
+ ```bash
96
+ codex mcp add multicli-mcp -- npx -y multicli-mcp
97
+ ```
98
+
99
+ Restart Codex and Claude + Gemini tools will be available.
100
+
101
+ <details>
102
+ <summary>Manual config (~/.codex/config.toml) or pass --mcp-config</summary>
103
+
104
+ ```bash
105
+ codex --mcp-config mcp.json
106
+ ```
107
+
108
+ Where `mcp.json` contains:
109
+
110
+ ```json
111
+ {
112
+ "mcpServers": {
113
+ "Multi-CLI": {
114
+ "command": "npx",
115
+ "args": ["-y", "multicli"]
116
+ }
117
+ }
118
+ }
119
+ ```
120
+ </details>
121
+
122
+ ---
123
+
124
+ ### Any Other MCP Client
125
+
126
+ Multi-CLI uses standard stdio transport. If your client supports MCP, point it at:
127
+
128
+ ```
129
+ npx -y multicli
130
+ ```
131
+
132
+ ---
133
+
134
+ ## Available Tools
135
+
136
+ Once connected, your AI client gains access to tools for the *other* CLIs (never its own):
137
+
138
+ | Tool | Description |
139
+ |------|-------------|
140
+ | `List Gemini Models` | List available Gemini models and their strengths |
141
+ | `Ask Gemini` | Ask Gemini a question or give it a task |
142
+ | `Fetch Chunk` | Retrieve chunked responses from Gemini |
143
+ | `Gemini Help` | Get Gemini CLI help info |
144
+ | `List Codex Models` | List available Codex models |
145
+ | `Ask Codex` | Ask Codex a question or give it a task |
146
+ | `Codex Help` | Get Codex CLI help info |
147
+ | `List Claude Models` | List available Claude models |
148
+ | `Ask Claude` | Ask Claude a question or give it a task |
149
+ | `Claude Help` | Get Claude Code CLI help info |
150
+
151
+ ## Usage Examples
152
+
153
+ Once installed, just talk naturally to your AI:
154
+
155
+ ```
156
+ "Ask Gemini what it thinks about this architecture"
157
+ "Have Codex review this function for performance issues"
158
+ "Get Claude's opinion on this error message"
159
+ "Use Gemini to analyze @largefile.js"
160
+ ```
161
+
162
+ Or get a second opinion on anything:
163
+
164
+ ```
165
+ "I want three perspectives on how to refactor this module —
166
+ ask Gemini and Codex what they'd do differently"
167
+ ```
168
+
169
+ ## How It Works
170
+
171
+ ```
172
+ ┌─────────────┐ MCP (stdio) ┌──────────────┐ CLI calls ┌─────────────┐
173
+ │ Your AI │ ◄──────────────────► │ Multi-CLI │ ───────────────► │ Other AIs │
174
+ │ Client │ │ server │ │ (CLI tools) │
175
+ └─────────────┘ └──────────────┘ └─────────────┘
176
+
177
+ 1. Your AI client connects to Multi-CLI via MCP
178
+ 2. Multi-CLI detects which CLIs are installed on your system
179
+ 3. It registers tools for the OTHER clients (hides tools for the calling client)
180
+ 4. When a tool is called, Multi-CLI executes the corresponding CLI command
181
+ 5. Results flow back through MCP to your AI client
182
+ ```
183
+
184
+ ## Troubleshooting
185
+
186
+ **"No usable AI CLIs detected"**
187
+ Make sure at least one other CLI is installed and on your PATH:
188
+ ```bash
189
+ which gemini && which codex && which claude
190
+ ```
191
+
192
+ **No tools showing up?**
193
+ If only your own CLI is installed, Multi-CLI hides it (no self-calls). Install a *different* CLI to enable cross-model collaboration.
194
+
195
+ **MCP server not responding?**
196
+ 1. Check that Node.js >= 18 is installed
197
+ 2. Run `npx multicli` directly to see if it starts
198
+ 3. Restart your AI client completely
199
+
200
+ ## Development
201
+
202
+ ```bash
203
+ git clone https://github.com/osanoai/multicli.git
204
+ cd multicli
205
+ npm install
206
+ npm run build
207
+ npm run dev
208
+ ```
209
+
@@ -0,0 +1,5 @@
1
+ import { UnifiedTool } from './tools/registry.js';
2
+ export declare function getExcludedCategory(clientName: string | undefined): UnifiedTool['category'] | undefined;
3
+ export declare function filterToolsForClient(tools: UnifiedTool[], clientName: string | undefined): UnifiedTool[];
4
+ export declare function isToolBlockedForClient(tool: UnifiedTool | undefined, clientName: string | undefined): boolean;
5
+ //# sourceMappingURL=clientFilter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clientFilter.d.ts","sourceRoot":"","sources":["../src/clientFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAalD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,SAAS,CAGvG;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,EAAE,CAKxG;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAI7G"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Client-based tool filtering: hide a client's own tools
3
+ * (no point asking yourself for a second opinion).
4
+ */
5
+ const CLIENT_EXCLUSIONS = {
6
+ 'claude-code': 'claude',
7
+ 'codex-mcp-client': 'codex',
8
+ 'gemini-cli-mcp-client': 'gemini',
9
+ };
10
+ export function getExcludedCategory(clientName) {
11
+ if (!clientName)
12
+ return undefined;
13
+ return CLIENT_EXCLUSIONS[clientName];
14
+ }
15
+ export function filterToolsForClient(tools, clientName) {
16
+ const excluded = getExcludedCategory(clientName);
17
+ if (!excluded)
18
+ return tools;
19
+ return tools.filter(t => t.category !== excluded);
20
+ }
21
+ export function isToolBlockedForClient(tool, clientName) {
22
+ if (!tool)
23
+ return false;
24
+ const excluded = getExcludedCategory(clientName);
25
+ return excluded !== undefined && tool.category === excluded;
26
+ }
27
+ //# sourceMappingURL=clientFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clientFilter.js","sourceRoot":"","sources":["../src/clientFilter.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,MAAM,iBAAiB,GAA4C;IACjE,aAAa,EAAa,QAAQ;IAClC,kBAAkB,EAAQ,OAAO;IACjC,uBAAuB,EAAG,QAAQ;CACnC,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,UAA8B;IAChE,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAoB,EAAE,UAA8B;IACvF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAA6B,EAAE,UAA8B;IAClG,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACjD,OAAO,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,88 @@
1
+ export declare const ERROR_MESSAGES: {
2
+ readonly QUOTA_EXCEEDED: "Quota exceeded for Gemini model requests";
3
+ readonly QUOTA_EXCEEDED_SHORT: "⚠️ Gemini daily quota exceeded. Please try again later.";
4
+ readonly TOOL_NOT_FOUND: "not found in registry";
5
+ readonly NO_PROMPT_PROVIDED: "Please provide a prompt for analysis. Use @ syntax to include files (e.g., '@largefile.js explain what this does') or ask general questions";
6
+ };
7
+ export declare const STATUS_MESSAGES: {
8
+ readonly SANDBOX_EXECUTING: "🔒 Executing CLI command in sandbox mode...";
9
+ readonly GEMINI_RESPONSE: "Gemini response:";
10
+ readonly CODEX_RESPONSE: "Codex response:";
11
+ readonly CLAUDE_RESPONSE: "Claude response:";
12
+ readonly PROCESSING_START: "🔍 Starting analysis (may take 5-15 minutes for large codebases)";
13
+ readonly PROCESSING_CONTINUE: "⏳ Still processing...";
14
+ readonly PROCESSING_COMPLETE: "✅ Analysis completed successfully";
15
+ };
16
+ export declare const PROTOCOL: {
17
+ readonly ROLES: {
18
+ readonly USER: "user";
19
+ readonly ASSISTANT: "assistant";
20
+ };
21
+ readonly CONTENT_TYPES: {
22
+ readonly TEXT: "text";
23
+ };
24
+ readonly STATUS: {
25
+ readonly SUCCESS: "success";
26
+ readonly ERROR: "error";
27
+ readonly FAILED: "failed";
28
+ readonly REPORT: "report";
29
+ };
30
+ readonly NOTIFICATIONS: {
31
+ readonly PROGRESS: "notifications/progress";
32
+ };
33
+ readonly KEEPALIVE_INTERVAL: 25000;
34
+ };
35
+ export declare const CLI: {
36
+ readonly COMMANDS: {
37
+ readonly GEMINI: "gemini";
38
+ readonly CODEX: "codex";
39
+ readonly CLAUDE: "claude";
40
+ readonly ECHO: "echo";
41
+ };
42
+ readonly FLAGS: {
43
+ readonly MODEL: "-m";
44
+ readonly SANDBOX: "-s";
45
+ readonly PROMPT: "-p";
46
+ readonly HELP: "-help";
47
+ };
48
+ readonly SUBCOMMANDS: {
49
+ readonly EXEC: "exec";
50
+ };
51
+ readonly CODEX_FLAGS: {
52
+ readonly MODEL: "-m";
53
+ readonly SANDBOX: "-s";
54
+ readonly APPROVAL: "-a";
55
+ readonly COLOR: "--color";
56
+ readonly FULL_AUTO: "--full-auto";
57
+ readonly SKIP_GIT_CHECK: "--skip-git-repo-check";
58
+ };
59
+ readonly CLAUDE_FLAGS: {
60
+ readonly PRINT: "--print";
61
+ readonly MODEL: "--model";
62
+ readonly OUTPUT_FORMAT: "--output-format";
63
+ readonly PERMISSION_MODE: "--permission-mode";
64
+ readonly MAX_BUDGET: "--max-budget-usd";
65
+ readonly SYSTEM_PROMPT: "--system-prompt";
66
+ readonly TOOLS: "--tools";
67
+ readonly HELP: "--help";
68
+ };
69
+ readonly DEFAULTS: {
70
+ readonly BOOLEAN_TRUE: "true";
71
+ readonly BOOLEAN_FALSE: "false";
72
+ };
73
+ };
74
+ export interface ToolArguments {
75
+ prompt?: string;
76
+ model?: string;
77
+ sandbox?: boolean | string;
78
+ changeMode?: boolean | string;
79
+ chunkIndex?: number | string;
80
+ chunkCacheKey?: string;
81
+ message?: string;
82
+ approvalPolicy?: string;
83
+ permissionMode?: string;
84
+ maxBudgetUsd?: number;
85
+ systemPrompt?: string;
86
+ [key: string]: string | boolean | number | undefined;
87
+ }
88
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC;AAGX,eAAO,MAAM,eAAe;;;;;;;;CASlB,CAAC;AAGX,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;CAuBX,CAAC;AAIX,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CN,CAAC;AAIX,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;CACtD"}
@@ -0,0 +1,90 @@
1
+ // Error messages
2
+ export const ERROR_MESSAGES = {
3
+ QUOTA_EXCEEDED: "Quota exceeded for Gemini model requests",
4
+ QUOTA_EXCEEDED_SHORT: "⚠️ Gemini daily quota exceeded. Please try again later.",
5
+ TOOL_NOT_FOUND: "not found in registry",
6
+ NO_PROMPT_PROVIDED: "Please provide a prompt for analysis. Use @ syntax to include files (e.g., '@largefile.js explain what this does') or ask general questions",
7
+ };
8
+ // Status messages
9
+ export const STATUS_MESSAGES = {
10
+ SANDBOX_EXECUTING: "🔒 Executing CLI command in sandbox mode...",
11
+ GEMINI_RESPONSE: "Gemini response:",
12
+ CODEX_RESPONSE: "Codex response:",
13
+ CLAUDE_RESPONSE: "Claude response:",
14
+ // Timeout prevention messages
15
+ PROCESSING_START: "🔍 Starting analysis (may take 5-15 minutes for large codebases)",
16
+ PROCESSING_CONTINUE: "⏳ Still processing...",
17
+ PROCESSING_COMPLETE: "✅ Analysis completed successfully",
18
+ };
19
+ // MCP Protocol Constants
20
+ export const PROTOCOL = {
21
+ // Message roles
22
+ ROLES: {
23
+ USER: "user",
24
+ ASSISTANT: "assistant",
25
+ },
26
+ // Content types
27
+ CONTENT_TYPES: {
28
+ TEXT: "text",
29
+ },
30
+ // Status codes
31
+ STATUS: {
32
+ SUCCESS: "success",
33
+ ERROR: "error",
34
+ FAILED: "failed",
35
+ REPORT: "report",
36
+ },
37
+ // Notification methods
38
+ NOTIFICATIONS: {
39
+ PROGRESS: "notifications/progress",
40
+ },
41
+ // Timeout prevention
42
+ KEEPALIVE_INTERVAL: 25000, // 25 seconds
43
+ };
44
+ // CLI Constants
45
+ export const CLI = {
46
+ // Command names
47
+ COMMANDS: {
48
+ GEMINI: "gemini",
49
+ CODEX: "codex",
50
+ CLAUDE: "claude",
51
+ ECHO: "echo",
52
+ },
53
+ // Gemini command flags
54
+ FLAGS: {
55
+ MODEL: "-m",
56
+ SANDBOX: "-s",
57
+ PROMPT: "-p",
58
+ HELP: "-help",
59
+ },
60
+ // Codex subcommands
61
+ SUBCOMMANDS: {
62
+ EXEC: "exec",
63
+ },
64
+ // Codex-specific flags
65
+ CODEX_FLAGS: {
66
+ MODEL: "-m",
67
+ SANDBOX: "-s",
68
+ APPROVAL: "-a",
69
+ COLOR: "--color",
70
+ FULL_AUTO: "--full-auto",
71
+ SKIP_GIT_CHECK: "--skip-git-repo-check",
72
+ },
73
+ // Claude Code flags
74
+ CLAUDE_FLAGS: {
75
+ PRINT: "--print",
76
+ MODEL: "--model",
77
+ OUTPUT_FORMAT: "--output-format",
78
+ PERMISSION_MODE: "--permission-mode",
79
+ MAX_BUDGET: "--max-budget-usd",
80
+ SYSTEM_PROMPT: "--system-prompt",
81
+ TOOLS: "--tools",
82
+ HELP: "--help",
83
+ },
84
+ // Default values
85
+ DEFAULTS: {
86
+ BOOLEAN_TRUE: "true",
87
+ BOOLEAN_FALSE: "false",
88
+ },
89
+ };
90
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,iBAAiB;AACjB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc,EAAE,0CAA0C;IAC1D,oBAAoB,EAAE,yDAAyD;IAC/E,cAAc,EAAE,uBAAuB;IACvC,kBAAkB,EAAE,6IAA6I;CACzJ,CAAC;AAEX,kBAAkB;AAClB,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,iBAAiB,EAAE,6CAA6C;IAChE,eAAe,EAAE,kBAAkB;IACnC,cAAc,EAAE,iBAAiB;IACjC,eAAe,EAAE,kBAAkB;IACnC,8BAA8B;IAC9B,gBAAgB,EAAE,kEAAkE;IACpF,mBAAmB,EAAE,uBAAuB;IAC5C,mBAAmB,EAAE,mCAAmC;CAChD,CAAC;AAEX,yBAAyB;AACzB,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,gBAAgB;IAChB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,WAAW;KACvB;IACD,gBAAgB;IAChB,aAAa,EAAE;QACb,IAAI,EAAE,MAAM;KACb;IACD,eAAe;IACf,MAAM,EAAE;QACN,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;KACjB;IACD,uBAAuB;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,wBAAwB;KACnC;IACD,qBAAqB;IACrB,kBAAkB,EAAE,KAAK,EAAE,aAAa;CAChC,CAAC;AAGX,gBAAgB;AAChB,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,gBAAgB;IAChB,QAAQ,EAAE;QACR,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,MAAM;KACb;IACD,uBAAuB;IACvB,KAAK,EAAE;QACL,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,OAAO;KACd;IACD,oBAAoB;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM;KACb;IACD,uBAAuB;IACvB,WAAW,EAAE;QACX,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,aAAa;QACxB,cAAc,EAAE,uBAAuB;KACxC;IACD,oBAAoB;IACpB,YAAY,EAAE;QACZ,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,SAAS;QAChB,aAAa,EAAE,iBAAiB;QAChC,eAAe,EAAE,mBAAmB;QACpC,UAAU,EAAE,kBAAkB;QAC9B,aAAa,EAAE,iBAAiB;QAChC,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,QAAQ;KACf;IACD,iBAAiB;IACjB,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM;QACpB,aAAa,EAAE,OAAO;KACvB;CACO,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,205 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
4
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
6
+ import { PROTOCOL } from "./constants.js";
7
+ import { getToolDefinitions, getPromptDefinitions, executeTool, toolExists, getPromptMessage, toolRegistry, initTools, } from "./tools/index.js";
8
+ import { importantReadNowTool } from './tools/important-read-now.tool.js';
9
+ import { filterToolsForClient, isToolBlockedForClient } from './clientFilter.js';
10
+ const server = new Server({
11
+ name: "Multi-CLI",
12
+ version: "1.5.0",
13
+ }, {
14
+ capabilities: {
15
+ tools: {},
16
+ prompts: {},
17
+ },
18
+ });
19
+ let connectedClientName;
20
+ server.oninitialized = () => {
21
+ const clientInfo = server.getClientVersion();
22
+ connectedClientName = clientInfo?.name;
23
+ };
24
+ let isProcessing = false;
25
+ let currentOperationName = "";
26
+ let latestOutput = "";
27
+ /**
28
+ * @param progressToken The progress token provided by the client
29
+ * @param progress The current progress value
30
+ * @param total Optional total value
31
+ * @param message Optional status message
32
+ */
33
+ async function sendProgressNotification(progressToken, progress, total, message) {
34
+ if (!progressToken)
35
+ return; // Only send if client requested progress
36
+ try {
37
+ const params = {
38
+ progressToken,
39
+ progress
40
+ };
41
+ if (total !== undefined)
42
+ params.total = total; // future cache progress
43
+ if (message)
44
+ params.message = message;
45
+ await server.notification({
46
+ method: PROTOCOL.NOTIFICATIONS.PROGRESS,
47
+ params
48
+ });
49
+ }
50
+ catch {
51
+ // progress notification errors are non-critical
52
+ }
53
+ }
54
+ function startProgressUpdates(operationName, progressToken) {
55
+ isProcessing = true;
56
+ currentOperationName = operationName;
57
+ latestOutput = ""; // Reset latest output
58
+ const progressMessages = [
59
+ `🧠 ${operationName} - Analyzing your request...`,
60
+ `📊 ${operationName} - Processing and generating insights...`,
61
+ `✨ ${operationName} - Creating structured response for your review...`,
62
+ `⏱️ ${operationName} - Large analysis in progress (this is normal for big requests)...`,
63
+ `🔍 ${operationName} - Still working on your request...`,
64
+ ];
65
+ let messageIndex = 0;
66
+ let progress = 0;
67
+ // Send immediate acknowledgment if progress requested
68
+ if (progressToken) {
69
+ sendProgressNotification(progressToken, 0, undefined, // No total - indeterminate progress
70
+ `🔍 Starting ${operationName}`);
71
+ }
72
+ // Keep client alive with periodic updates
73
+ const progressInterval = setInterval(async () => {
74
+ if (isProcessing && progressToken) {
75
+ // Simply increment progress value
76
+ progress += 1;
77
+ // Include latest output if available
78
+ const baseMessage = progressMessages[messageIndex % progressMessages.length];
79
+ const outputPreview = latestOutput.slice(-150).trim(); // Last 150 chars
80
+ const message = outputPreview
81
+ ? `${baseMessage}\n📝 Output: ...${outputPreview}`
82
+ : baseMessage;
83
+ await sendProgressNotification(progressToken, progress, undefined, // No total - indeterminate progress
84
+ message);
85
+ messageIndex++;
86
+ }
87
+ else if (!isProcessing) {
88
+ clearInterval(progressInterval);
89
+ }
90
+ }, PROTOCOL.KEEPALIVE_INTERVAL); // Every 25 seconds
91
+ return { interval: progressInterval, progressToken };
92
+ }
93
+ function stopProgressUpdates(progressData, success = true) {
94
+ const operationName = currentOperationName; // Store before clearing
95
+ isProcessing = false;
96
+ currentOperationName = "";
97
+ clearInterval(progressData.interval);
98
+ // Send final progress notification if client requested progress
99
+ if (progressData.progressToken) {
100
+ sendProgressNotification(progressData.progressToken, 100, 100, success ? `✅ ${operationName} completed successfully` : `❌ ${operationName} failed`);
101
+ }
102
+ }
103
+ // tools/list
104
+ server.setRequestHandler(ListToolsRequestSchema, async (request) => {
105
+ const visible = filterToolsForClient(toolRegistry, connectedClientName);
106
+ if (visible.length === 0) {
107
+ return { tools: getToolDefinitions([importantReadNowTool]) };
108
+ }
109
+ return { tools: getToolDefinitions(visible) };
110
+ });
111
+ // tools/get
112
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
113
+ const toolName = request.params.name;
114
+ // Handle fallback tool (dynamically injected, not in registry)
115
+ if (toolName === importantReadNowTool.name) {
116
+ const result = await importantReadNowTool.execute({});
117
+ return {
118
+ content: [{ type: "text", text: result }],
119
+ isError: false,
120
+ };
121
+ }
122
+ const toolEntry = toolRegistry.find(t => t.name === toolName);
123
+ if (isToolBlockedForClient(toolEntry, connectedClientName)) {
124
+ throw new Error(`Unknown tool: ${toolName}`);
125
+ }
126
+ if (toolExists(toolName)) {
127
+ // Check if client requested progress updates
128
+ const progressToken = request.params._meta?.progressToken;
129
+ // Start progress updates if client requested them
130
+ const progressData = startProgressUpdates(toolName, progressToken);
131
+ try {
132
+ // Get prompt and other parameters from arguments with proper typing
133
+ const args = request.params.arguments || {};
134
+ // Execute the tool using the unified registry with progress callback
135
+ const result = await executeTool(toolName, args, (newOutput) => {
136
+ latestOutput = newOutput;
137
+ });
138
+ // Stop progress updates
139
+ stopProgressUpdates(progressData, true);
140
+ return {
141
+ content: [
142
+ {
143
+ type: "text",
144
+ text: result,
145
+ },
146
+ ],
147
+ isError: false,
148
+ };
149
+ }
150
+ catch (error) {
151
+ // Stop progress updates on error
152
+ stopProgressUpdates(progressData, false);
153
+ const errorMessage = error instanceof Error ? error.message : String(error);
154
+ return {
155
+ content: [
156
+ {
157
+ type: "text",
158
+ text: `Error executing ${toolName}: ${errorMessage}`,
159
+ },
160
+ ],
161
+ isError: true,
162
+ };
163
+ }
164
+ }
165
+ else {
166
+ throw new Error(`Unknown tool: ${request.params.name}`);
167
+ }
168
+ });
169
+ // prompts/list
170
+ server.setRequestHandler(ListPromptsRequestSchema, async (request) => {
171
+ const visible = filterToolsForClient(toolRegistry, connectedClientName);
172
+ return { prompts: getPromptDefinitions(visible) };
173
+ });
174
+ // prompts/get
175
+ server.setRequestHandler(GetPromptRequestSchema, async (request) => {
176
+ const promptName = request.params.name;
177
+ const promptEntry = toolRegistry.find(t => t.name === promptName);
178
+ if (isToolBlockedForClient(promptEntry, connectedClientName)) {
179
+ throw new Error(`Unknown prompt: ${promptName}`);
180
+ }
181
+ const args = request.params.arguments || {};
182
+ const promptMessage = getPromptMessage(promptName, args);
183
+ if (!promptMessage) {
184
+ throw new Error(`Unknown prompt: ${promptName}`);
185
+ }
186
+ return {
187
+ messages: [{
188
+ role: "user",
189
+ content: {
190
+ type: "text",
191
+ text: promptMessage
192
+ }
193
+ }]
194
+ };
195
+ });
196
+ // Start the server
197
+ async function main() {
198
+ await initTools();
199
+ const transport = new StdioServerTransport();
200
+ await server.connect(transport);
201
+ }
202
+ main().catch(() => {
203
+ process.exit(1);
204
+ });
205
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface ModelTier {
2
+ tier: 'fast' | 'balanced' | 'powerful';
3
+ label: string;
4
+ models: string[];
5
+ useWhen: string;
6
+ }
7
+ export interface CLICatalog {
8
+ cli: 'gemini' | 'codex' | 'claude';
9
+ tiers: ModelTier[];
10
+ note: string;
11
+ }
12
+ export declare function getCatalog(cli: 'gemini' | 'codex' | 'claude'): CLICatalog;
13
+ export declare function formatCatalog(cli: 'gemini' | 'codex' | 'claude'): string;
14
+ //# sourceMappingURL=modelCatalog.d.ts.map