cat-gemini-mcp 1.2.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 (75) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +192 -0
  3. package/dist/constants.d.ts +74 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +73 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +188 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/tools/ask-gemini.tool.d.ts +3 -0
  12. package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
  13. package/dist/tools/ask-gemini.tool.js +36 -0
  14. package/dist/tools/ask-gemini.tool.js.map +1 -0
  15. package/dist/tools/brainstorm.tool.d.ts +3 -0
  16. package/dist/tools/brainstorm.tool.d.ts.map +1 -0
  17. package/dist/tools/brainstorm.tool.js +136 -0
  18. package/dist/tools/brainstorm.tool.js.map +1 -0
  19. package/dist/tools/fetch-chunk.tool.d.ts +3 -0
  20. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
  21. package/dist/tools/fetch-chunk.tool.js +62 -0
  22. package/dist/tools/fetch-chunk.tool.js.map +1 -0
  23. package/dist/tools/index.d.ts +2 -0
  24. package/dist/tools/index.d.ts.map +1 -0
  25. package/dist/tools/index.js +10 -0
  26. package/dist/tools/index.js.map +1 -0
  27. package/dist/tools/registry.d.ts +25 -0
  28. package/dist/tools/registry.d.ts.map +1 -0
  29. package/dist/tools/registry.js +80 -0
  30. package/dist/tools/registry.js.map +1 -0
  31. package/dist/tools/simple-tools.d.ts +4 -0
  32. package/dist/tools/simple-tools.d.ts.map +1 -0
  33. package/dist/tools/simple-tools.js +32 -0
  34. package/dist/tools/simple-tools.js.map +1 -0
  35. package/dist/tools/test-tool.example.d.ts +13 -0
  36. package/dist/tools/test-tool.example.d.ts.map +1 -0
  37. package/dist/tools/test-tool.example.js +32 -0
  38. package/dist/tools/test-tool.example.js.map +1 -0
  39. package/dist/tools/timeout-test.tool.d.ts +3 -0
  40. package/dist/tools/timeout-test.tool.d.ts.map +1 -0
  41. package/dist/tools/timeout-test.tool.js +32 -0
  42. package/dist/tools/timeout-test.tool.js.map +1 -0
  43. package/dist/utils/changeModeChunker.d.ts +11 -0
  44. package/dist/utils/changeModeChunker.d.ts.map +1 -0
  45. package/dist/utils/changeModeChunker.js +89 -0
  46. package/dist/utils/changeModeChunker.js.map +1 -0
  47. package/dist/utils/changeModeParser.d.ts +15 -0
  48. package/dist/utils/changeModeParser.d.ts.map +1 -0
  49. package/dist/utils/changeModeParser.js +67 -0
  50. package/dist/utils/changeModeParser.js.map +1 -0
  51. package/dist/utils/changeModeTranslator.d.ts +8 -0
  52. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  53. package/dist/utils/changeModeTranslator.js +70 -0
  54. package/dist/utils/changeModeTranslator.js.map +1 -0
  55. package/dist/utils/chunkCache.d.ts +22 -0
  56. package/dist/utils/chunkCache.d.ts.map +1 -0
  57. package/dist/utils/chunkCache.js +161 -0
  58. package/dist/utils/chunkCache.js.map +1 -0
  59. package/dist/utils/commandExecutor.d.ts +2 -0
  60. package/dist/utils/commandExecutor.d.ts.map +1 -0
  61. package/dist/utils/commandExecutor.js +77 -0
  62. package/dist/utils/commandExecutor.js.map +1 -0
  63. package/dist/utils/geminiExecutor.d.ts +3 -0
  64. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  65. package/dist/utils/geminiExecutor.js +181 -0
  66. package/dist/utils/geminiExecutor.js.map +1 -0
  67. package/dist/utils/logger.d.ts +13 -0
  68. package/dist/utils/logger.d.ts.map +1 -0
  69. package/dist/utils/logger.js +42 -0
  70. package/dist/utils/logger.js.map +1 -0
  71. package/dist/utils/timeoutManager.d.ts +2 -0
  72. package/dist/utils/timeoutManager.d.ts.map +1 -0
  73. package/dist/utils/timeoutManager.js +2 -0
  74. package/dist/utils/timeoutManager.js.map +1 -0
  75. package/package.json +71 -0
package/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ MIT License (Non-Commercial)
2
+
3
+ Copyright (c) 2025 jamubc
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software for non-commercial purposes only, including without limitation
8
+ the rights to use, copy, modify, merge, publish, and distribute copies of the
9
+ Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ Commercial use of this software is prohibited without prior written permission
16
+ from the copyright holder. For commercial licensing, please contact the
17
+ copyright holder directly.
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,192 @@
1
+
2
+ # Gemini MCP Tool
3
+
4
+ <div align="center">
5
+
6
+ [![GitHub Release](https://img.shields.io/github/v/release/jamubc/gemini-mcp-tool?logo=github&label=GitHub)](https://github.com/jamubc/gemini-mcp-tool/releases)
7
+ [![npm version](https://img.shields.io/npm/v/gemini-mcp-tool)](https://www.npmjs.com/package/gemini-mcp-tool)
8
+ [![npm downloads](https://img.shields.io/npm/dt/gemini-mcp-tool)](https://www.npmjs.com/package/gemini-mcp-tool)
9
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
10
+ [![Open Source](https://img.shields.io/badge/Open%20Source-❤️-red.svg)](https://github.com/jamubc/gemini-mcp-tool)
11
+
12
+ </div>
13
+
14
+ > 📚 **[View Full Documentation](https://jamubc.github.io/gemini-mcp-tool/)** - Search me!, Examples, FAQ, Troubleshooting, Best Practices
15
+
16
+ This is a simple Model Context Protocol (MCP) server that allows AI assistants to interact with the [Gemini CLI](https://github.com/google-gemini/gemini-cli). It enables the AI to leverage the power of Gemini's massive token window for large analysis, especially with large files and codebases using the `@` syntax for direction.
17
+
18
+ - Ask gemini natural questions, through claude or Brainstorm new ideas in a party of 3!
19
+
20
+ <a href="https://glama.ai/mcp/servers/@jamubc/gemini-mcp-tool">
21
+ <img width="380" height="200" src="https://glama.ai/mcp/servers/@jamubc/gemini-mcp-tool/badge" alt="Gemini Tool MCP server" />
22
+ </a>
23
+
24
+ ## TLDR: [![Claude](https://img.shields.io/badge/Claude-D97757?logo=claude&logoColor=fff)](#) + [![Google Gemini](https://img.shields.io/badge/Google%20Gemini-886FBF?logo=googlegemini&logoColor=fff)](#)
25
+
26
+
27
+ **Goal**: Use Gemini's powerful analysis capabilities directly in Claude Code to save tokens and analyze large files.
28
+
29
+ ## Prerequisites
30
+
31
+ Before using this tool, ensure you have:
32
+
33
+ 1. **[Node.js](https://nodejs.org/)** (v16.0.0 or higher)
34
+ 2. **[Google Gemini CLI](https://github.com/google-gemini/gemini-cli)** installed and configured
35
+
36
+
37
+ ### One-Line Setup
38
+
39
+ ```bash
40
+ claude mcp add gemini-cli -- npx -y gemini-mcp-tool
41
+ ```
42
+
43
+ ### Verify Installation
44
+
45
+ Type `/mcp` inside Claude Code to verify the gemini-cli MCP is active.
46
+
47
+ ---
48
+
49
+ ### Alternative: Import from Claude Desktop
50
+
51
+ If you already have it configured in Claude Desktop:
52
+
53
+ 1. Add to your Claude Desktop config:
54
+ ```json
55
+ "gemini-cli": {
56
+ "command": "npx",
57
+ "args": ["-y", "gemini-mcp-tool"]
58
+ }
59
+ ```
60
+
61
+ 2. Import to Claude Code:
62
+ ```bash
63
+ claude mcp add-from-claude-desktop
64
+ ```
65
+
66
+ ## Configuration
67
+
68
+ Register the MCP server with your MCP client:
69
+
70
+ ### For NPX Usage (Recommended)
71
+
72
+ Add this configuration to your Claude Desktop config file:
73
+
74
+ ```json
75
+ {
76
+ "mcpServers": {
77
+ "gemini-cli": {
78
+ "command": "npx",
79
+ "args": ["-y", "gemini-mcp-tool"]
80
+ }
81
+ }
82
+ }
83
+ ```
84
+
85
+ ### With Custom Default Model
86
+
87
+ You can set a default model via environment variable to avoid specifying it in every request:
88
+
89
+ ```json
90
+ {
91
+ "mcpServers": {
92
+ "gemini-cli": {
93
+ "command": "npx",
94
+ "args": ["-y", "gemini-mcp-tool"],
95
+ "env": {
96
+ "GEMINI_DEFAULT_MODEL": "gemini-3-flash"
97
+ }
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ Supported environment variables:
104
+ - `GEMINI_DEFAULT_MODEL` - Sets the default Gemini model (e.g., `gemini-3-pro`, `gemini-3-flash`)
105
+ - `DEFAULT_MODEL` - Alternative name for the same setting
106
+
107
+ ### For Global Installation
108
+
109
+ If you installed globally, use this configuration instead:
110
+
111
+ ```json
112
+ {
113
+ "mcpServers": {
114
+ "gemini-cli": {
115
+ "command": "gemini-mcp"
116
+ }
117
+ }
118
+ }
119
+ ```
120
+
121
+ **Configuration File Locations:**
122
+
123
+ - **Claude Desktop**:
124
+ - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
125
+ - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
126
+ - **Linux**: `~/.config/claude/claude_desktop_config.json`
127
+
128
+ After updating the configuration, restart your terminal session.
129
+
130
+ ## Example Workflow
131
+
132
+ - **Natural language**: "use gemini to explain index.html", "understand the massive project using gemini", "ask gemini to search for latest news"
133
+ - **Claude Code**: Type `/gemini-cli` and commands will populate in Claude Code's interface.
134
+
135
+ ## Usage Examples
136
+
137
+ ### With File References (using @ syntax)
138
+
139
+ - `ask gemini to analyze @src/main.js and explain what it does`
140
+ - `use gemini to summarize @. the current directory`
141
+ - `analyze @package.json and tell me about dependencies`
142
+
143
+ ### General Questions (without files)
144
+
145
+ - `ask gemini to search for the latest tech news`
146
+ - `use gemini to explain div centering`
147
+ - `ask gemini about best practices for React development related to @file_im_confused_about`
148
+
149
+ ### Using Gemini CLI's Sandbox Mode (-s)
150
+
151
+ The sandbox mode allows you to safely test code changes, run scripts, or execute potentially risky operations in an isolated environment.
152
+
153
+ - `use gemini sandbox to create and run a Python script that processes data`
154
+ - `ask gemini to safely test @script.py and explain what it does`
155
+ - `use gemini sandbox to install numpy and create a data visualization`
156
+ - `test this code safely: Create a script that makes HTTP requests to an API`
157
+
158
+ ### Tools (for the AI)
159
+
160
+ These tools are designed to be used by the AI assistant.
161
+
162
+ - **`ask-gemini`**: Asks Google Gemini for its perspective. Can be used for general questions or complex analysis of files.
163
+ - **`prompt`** (required): The analysis request. Use the `@` syntax to include file or directory references (e.g., `@src/main.js explain this code`) or ask general questions (e.g., `Please use a web search to find the latest news stories`).
164
+ - **`model`** (optional): The Gemini model to use. Defaults to `gemini-3-pro`. You can specify alternative models like `gemini-3-flash` for faster responses.
165
+ - **`sandbox`** (optional): Set to `true` to run in sandbox mode for safe code execution.
166
+ - **`sandbox-test`**: Safely executes code or commands in Gemini's sandbox environment. Always runs in sandbox mode.
167
+ - **`prompt`** (required): Code testing request (e.g., `Create and run a Python script that...` or `@script.py Run this safely`).
168
+ - **`model`** (optional): The Gemini model to use.
169
+ - **`Ping`**: A simple test tool that echoes back a message.
170
+ - **`Help`**: Shows the Gemini CLI help text.
171
+
172
+ ### Slash Commands (for the User)
173
+
174
+ You can use these commands directly in Claude Code's interface (compatibility with other clients has not been tested).
175
+
176
+ - **/analyze**: Analyzes files or directories using Gemini, or asks general questions.
177
+ - **`prompt`** (required): The analysis prompt. Use `@` syntax to include files (e.g., `/analyze prompt:@src/ summarize this directory`) or ask general questions (e.g., `/analyze prompt:Please use a web search to find the latest news stories`).
178
+ - **/sandbox**: Safely tests code or scripts in Gemini's sandbox environment.
179
+ - **`prompt`** (required): Code testing request (e.g., `/sandbox prompt:Create and run a Python script that processes CSV data` or `/sandbox prompt:@script.py Test this script safely`).
180
+ - **/help**: Displays the Gemini CLI help information.
181
+ - **/ping**: Tests the connection to the server.
182
+ - **`message`** (optional): A message to echo back.
183
+
184
+ ## Contributing
185
+
186
+ Contributions are welcome! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details on how to submit pull requests, report issues, and contribute to the project.
187
+
188
+ ## License
189
+
190
+ This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
191
+
192
+ **Disclaimer:** This is an unofficial, third-party tool and is not affiliated with, endorsed, or sponsored by Google.
@@ -0,0 +1,74 @@
1
+ export declare const LOG_PREFIX = "[GMCPT]";
2
+ export declare const ERROR_MESSAGES: {
3
+ readonly QUOTA_EXCEEDED: "Quota exceeded for quota metric 'Gemini 3 Pro Requests'";
4
+ readonly QUOTA_EXCEEDED_SHORT: "⚠️ Gemini 3 Pro daily quota exceeded. Please retry with model: 'gemini-3-flash'";
5
+ readonly TOOL_NOT_FOUND: "not found in registry";
6
+ 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";
7
+ };
8
+ export declare const STATUS_MESSAGES: {
9
+ readonly QUOTA_SWITCHING: "🚫 Gemini 3 Pro quota exceeded, switching to Flash model...";
10
+ readonly FLASH_RETRY: "⚡ Retrying with Gemini 3 Flash...";
11
+ readonly FLASH_SUCCESS: "✅ Flash model completed successfully";
12
+ readonly SANDBOX_EXECUTING: "🔒 Executing Gemini CLI command in sandbox mode...";
13
+ readonly GEMINI_RESPONSE: "Gemini response:";
14
+ readonly PROCESSING_START: "🔍 Starting analysis (may take 5-15 minutes for large codebases)";
15
+ readonly PROCESSING_CONTINUE: "⏳ Still processing... Gemini is working on your request";
16
+ readonly PROCESSING_COMPLETE: "✅ Analysis completed successfully";
17
+ };
18
+ export declare const MODELS: {
19
+ readonly PRO: "gemini-3-pro";
20
+ readonly FLASH: "gemini-3-flash";
21
+ };
22
+ export declare const PROTOCOL: {
23
+ readonly ROLES: {
24
+ readonly USER: "user";
25
+ readonly ASSISTANT: "assistant";
26
+ };
27
+ readonly CONTENT_TYPES: {
28
+ readonly TEXT: "text";
29
+ };
30
+ readonly STATUS: {
31
+ readonly SUCCESS: "success";
32
+ readonly ERROR: "error";
33
+ readonly FAILED: "failed";
34
+ readonly REPORT: "report";
35
+ };
36
+ readonly NOTIFICATIONS: {
37
+ readonly PROGRESS: "notifications/progress";
38
+ };
39
+ readonly KEEPALIVE_INTERVAL: 25000;
40
+ };
41
+ export declare const CLI: {
42
+ readonly COMMANDS: {
43
+ readonly GEMINI: "gemini";
44
+ readonly ECHO: "echo";
45
+ };
46
+ readonly FLAGS: {
47
+ readonly MODEL: "-m";
48
+ readonly SANDBOX: "-s";
49
+ readonly PROMPT: "-p";
50
+ readonly HELP: "-help";
51
+ };
52
+ readonly DEFAULTS: {
53
+ readonly MODEL: "default";
54
+ readonly BOOLEAN_TRUE: "true";
55
+ readonly BOOLEAN_FALSE: "false";
56
+ };
57
+ };
58
+ export interface ToolArguments {
59
+ prompt?: string;
60
+ model?: string;
61
+ sandbox?: boolean | string;
62
+ changeMode?: boolean | string;
63
+ chunkIndex?: number | string;
64
+ chunkCacheKey?: string;
65
+ message?: string;
66
+ methodology?: string;
67
+ domain?: string;
68
+ constraints?: string;
69
+ existingContext?: string;
70
+ ideaCount?: number;
71
+ includeAnalysis?: boolean;
72
+ [key: string]: string | boolean | number | undefined;
73
+ }
74
+ //# 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,UAAU,YAAY,CAAC;AAGpC,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC;AAGX,eAAO,MAAM,eAAe;;;;;;;;;CAUlB,CAAC;AAGX,eAAO,MAAM,MAAM;;;CAGT,CAAC;AAGX,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;CAuBX,CAAC;AAIX,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;CAmBN,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;IAGjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;CACtD"}
@@ -0,0 +1,73 @@
1
+ // Logging
2
+ export const LOG_PREFIX = "[GMCPT]";
3
+ // Error messages
4
+ export const ERROR_MESSAGES = {
5
+ QUOTA_EXCEEDED: "Quota exceeded for quota metric 'Gemini 3 Pro Requests'",
6
+ QUOTA_EXCEEDED_SHORT: "⚠️ Gemini 3 Pro daily quota exceeded. Please retry with model: 'gemini-3-flash'",
7
+ TOOL_NOT_FOUND: "not found in registry",
8
+ 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",
9
+ };
10
+ // Status messages
11
+ export const STATUS_MESSAGES = {
12
+ QUOTA_SWITCHING: "🚫 Gemini 3 Pro quota exceeded, switching to Flash model...",
13
+ FLASH_RETRY: "⚡ Retrying with Gemini 3 Flash...",
14
+ FLASH_SUCCESS: "✅ Flash model completed successfully",
15
+ SANDBOX_EXECUTING: "🔒 Executing Gemini CLI command in sandbox mode...",
16
+ GEMINI_RESPONSE: "Gemini response:",
17
+ // Timeout prevention messages
18
+ PROCESSING_START: "🔍 Starting analysis (may take 5-15 minutes for large codebases)",
19
+ PROCESSING_CONTINUE: "⏳ Still processing... Gemini is working on your request",
20
+ PROCESSING_COMPLETE: "✅ Analysis completed successfully",
21
+ };
22
+ // Models
23
+ export const MODELS = {
24
+ PRO: "gemini-3-pro",
25
+ FLASH: "gemini-3-flash",
26
+ };
27
+ // MCP Protocol Constants
28
+ export const PROTOCOL = {
29
+ // Message roles
30
+ ROLES: {
31
+ USER: "user",
32
+ ASSISTANT: "assistant",
33
+ },
34
+ // Content types
35
+ CONTENT_TYPES: {
36
+ TEXT: "text",
37
+ },
38
+ // Status codes
39
+ STATUS: {
40
+ SUCCESS: "success",
41
+ ERROR: "error",
42
+ FAILED: "failed",
43
+ REPORT: "report",
44
+ },
45
+ // Notification methods
46
+ NOTIFICATIONS: {
47
+ PROGRESS: "notifications/progress",
48
+ },
49
+ // Timeout prevention
50
+ KEEPALIVE_INTERVAL: 25000, // 25 seconds
51
+ };
52
+ // CLI Constants
53
+ export const CLI = {
54
+ // Command names
55
+ COMMANDS: {
56
+ GEMINI: "gemini",
57
+ ECHO: "echo",
58
+ },
59
+ // Command flags
60
+ FLAGS: {
61
+ MODEL: "-m",
62
+ SANDBOX: "-s",
63
+ PROMPT: "-p",
64
+ HELP: "-help",
65
+ },
66
+ // Default values
67
+ DEFAULTS: {
68
+ MODEL: "default", // Fallback model used when no specific model is provided
69
+ BOOLEAN_TRUE: "true",
70
+ BOOLEAN_FALSE: "false",
71
+ },
72
+ };
73
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,UAAU;AACV,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AAEpC,iBAAiB;AACjB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc,EAAE,yDAAyD;IACzE,oBAAoB,EAAE,iFAAiF;IACvG,cAAc,EAAE,uBAAuB;IACvC,kBAAkB,EAAE,6IAA6I;CACzJ,CAAC;AAEX,kBAAkB;AAClB,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,eAAe,EAAE,6DAA6D;IAC9E,WAAW,EAAE,mCAAmC;IAChD,aAAa,EAAE,sCAAsC;IACrD,iBAAiB,EAAE,oDAAoD;IACvE,eAAe,EAAE,kBAAkB;IACnC,8BAA8B;IAC9B,gBAAgB,EAAE,kEAAkE;IACpF,mBAAmB,EAAE,yDAAyD;IAC9E,mBAAmB,EAAE,mCAAmC;CAChD,CAAC;AAEX,SAAS;AACT,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,GAAG,EAAE,cAAc;IACnB,KAAK,EAAE,gBAAgB;CACf,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,IAAI,EAAE,MAAM;KACb;IACD,gBAAgB;IAChB,KAAK,EAAE;QACL,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,OAAO;KACd;IACD,iBAAiB;IACjB,QAAQ,EAAE;QACR,KAAK,EAAE,SAAS,EAAE,yDAAyD;QAC3E,YAAY,EAAE,MAAM;QACpB,aAAa,EAAE,OAAO;KACvB;CACO,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,188 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { Logger } from "./utils/logger.js";
6
+ import { PROTOCOL } from "./constants.js";
7
+ import { getToolDefinitions, getPromptDefinitions, executeTool, toolExists, getPromptMessage } from "./tools/index.js";
8
+ const server = new Server({
9
+ name: "gemini-cli-mcp",
10
+ version: "1.1.4",
11
+ }, {
12
+ capabilities: {
13
+ tools: {},
14
+ prompts: {},
15
+ notifications: {},
16
+ logging: {},
17
+ },
18
+ });
19
+ let isProcessing = false;
20
+ let currentOperationName = "";
21
+ let latestOutput = "";
22
+ async function sendNotification(method, params) {
23
+ try {
24
+ await server.notification({ method, params });
25
+ }
26
+ catch (error) {
27
+ Logger.error("notification failed: ", error);
28
+ }
29
+ }
30
+ /**
31
+ * @param progressToken The progress token provided by the client
32
+ * @param progress The current progress value
33
+ * @param total Optional total value
34
+ * @param message Optional status message
35
+ */
36
+ async function sendProgressNotification(progressToken, progress, total, message) {
37
+ if (!progressToken)
38
+ return; // Only send if client requested progress
39
+ try {
40
+ const params = {
41
+ progressToken,
42
+ progress
43
+ };
44
+ if (total !== undefined)
45
+ params.total = total; // future cache progress
46
+ if (message)
47
+ params.message = message;
48
+ await server.notification({
49
+ method: PROTOCOL.NOTIFICATIONS.PROGRESS,
50
+ params
51
+ });
52
+ }
53
+ catch (error) {
54
+ Logger.error("Failed to send progress notification:", error);
55
+ }
56
+ }
57
+ function startProgressUpdates(operationName, progressToken) {
58
+ isProcessing = true;
59
+ currentOperationName = operationName;
60
+ latestOutput = ""; // Reset latest output
61
+ const progressMessages = [
62
+ `🧠 ${operationName} - Gemini is analyzing your request...`,
63
+ `📊 ${operationName} - Processing files and generating insights...`,
64
+ `✨ ${operationName} - Creating structured response for your review...`,
65
+ `⏱️ ${operationName} - Large analysis in progress (this is normal for big requests)...`,
66
+ `🔍 ${operationName} - Still working... Gemini takes time for quality results...`,
67
+ ];
68
+ let messageIndex = 0;
69
+ let progress = 0;
70
+ // Send immediate acknowledgment if progress requested
71
+ if (progressToken) {
72
+ sendProgressNotification(progressToken, 0, undefined, // No total - indeterminate progress
73
+ `🔍 Starting ${operationName}`);
74
+ }
75
+ // Keep client alive with periodic updates
76
+ const progressInterval = setInterval(async () => {
77
+ if (isProcessing && progressToken) {
78
+ // Simply increment progress value
79
+ progress += 1;
80
+ // Include latest output if available
81
+ const baseMessage = progressMessages[messageIndex % progressMessages.length];
82
+ const outputPreview = latestOutput.slice(-150).trim(); // Last 150 chars
83
+ const message = outputPreview
84
+ ? `${baseMessage}\n📝 Output: ...${outputPreview}`
85
+ : baseMessage;
86
+ await sendProgressNotification(progressToken, progress, undefined, // No total - indeterminate progress
87
+ message);
88
+ messageIndex++;
89
+ }
90
+ else if (!isProcessing) {
91
+ clearInterval(progressInterval);
92
+ }
93
+ }, PROTOCOL.KEEPALIVE_INTERVAL); // Every 25 seconds
94
+ return { interval: progressInterval, progressToken };
95
+ }
96
+ function stopProgressUpdates(progressData, success = true) {
97
+ const operationName = currentOperationName; // Store before clearing
98
+ isProcessing = false;
99
+ currentOperationName = "";
100
+ clearInterval(progressData.interval);
101
+ // Send final progress notification if client requested progress
102
+ if (progressData.progressToken) {
103
+ sendProgressNotification(progressData.progressToken, 100, 100, success ? `✅ ${operationName} completed successfully` : `❌ ${operationName} failed`);
104
+ }
105
+ }
106
+ // tools/list
107
+ server.setRequestHandler(ListToolsRequestSchema, async (request) => {
108
+ return { tools: getToolDefinitions() };
109
+ });
110
+ // tools/get
111
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
112
+ const toolName = request.params.name;
113
+ if (toolExists(toolName)) {
114
+ // Check if client requested progress updates
115
+ const progressToken = request.params._meta?.progressToken;
116
+ // Start progress updates if client requested them
117
+ const progressData = startProgressUpdates(toolName, progressToken);
118
+ try {
119
+ // Get prompt and other parameters from arguments with proper typing
120
+ const args = request.params.arguments || {};
121
+ Logger.toolInvocation(toolName, request.params.arguments);
122
+ // Execute the tool using the unified registry with progress callback
123
+ const result = await executeTool(toolName, args, (newOutput) => {
124
+ latestOutput = newOutput;
125
+ });
126
+ // Stop progress updates
127
+ stopProgressUpdates(progressData, true);
128
+ return {
129
+ content: [
130
+ {
131
+ type: "text",
132
+ text: result,
133
+ },
134
+ ],
135
+ isError: false,
136
+ };
137
+ }
138
+ catch (error) {
139
+ // Stop progress updates on error
140
+ stopProgressUpdates(progressData, false);
141
+ Logger.error(`Error in tool '${toolName}':`, error);
142
+ const errorMessage = error instanceof Error ? error.message : String(error);
143
+ return {
144
+ content: [
145
+ {
146
+ type: "text",
147
+ text: `Error executing ${toolName}: ${errorMessage}`,
148
+ },
149
+ ],
150
+ isError: true,
151
+ };
152
+ }
153
+ }
154
+ else {
155
+ throw new Error(`Unknown tool: ${request.params.name}`);
156
+ }
157
+ });
158
+ // prompts/list
159
+ server.setRequestHandler(ListPromptsRequestSchema, async (request) => {
160
+ return { prompts: getPromptDefinitions() };
161
+ });
162
+ // prompts/get
163
+ server.setRequestHandler(GetPromptRequestSchema, async (request) => {
164
+ const promptName = request.params.name;
165
+ const args = request.params.arguments || {};
166
+ const promptMessage = getPromptMessage(promptName, args);
167
+ if (!promptMessage) {
168
+ throw new Error(`Unknown prompt: ${promptName}`);
169
+ }
170
+ return {
171
+ messages: [{
172
+ role: "user",
173
+ content: {
174
+ type: "text",
175
+ text: promptMessage
176
+ }
177
+ }]
178
+ };
179
+ });
180
+ // Start the server
181
+ async function main() {
182
+ Logger.debug("init gemini-mcp-tool");
183
+ const transport = new StdioServerTransport();
184
+ await server.connect(transport);
185
+ Logger.debug("gemini-mcp-tool listening on stdio");
186
+ }
187
+ main().catch((error) => { Logger.error("Fatal error:", error); process.exit(1); });
188
+ //# 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,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const askGeminiTool: UnifiedTool;
3
+ //# sourceMappingURL=ask-gemini.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-gemini.tool.d.ts","sourceRoot":"","sources":["../../src/tools/ask-gemini.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAgB5C,eAAO,MAAM,aAAa,EAAE,WAsC3B,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { z } from 'zod';
2
+ import { executeGeminiCLI, processChangeModeOutput } from '../utils/geminiExecutor.js';
3
+ import { ERROR_MESSAGES, STATUS_MESSAGES } from '../constants.js';
4
+ const askGeminiArgsSchema = z.object({
5
+ prompt: z.string().min(1).describe("Analysis request. Use @ syntax to include files (e.g., '@largefile.js explain what this does') or ask general questions"),
6
+ model: z.string().optional().describe("Optional model to use (e.g., 'gemini-3-flash'). If not specified, uses the default model (gemini-3-pro)."),
7
+ sandbox: z.boolean().default(false).describe("Use sandbox mode (-s flag) to safely test code changes, execute scripts, or run potentially risky operations in an isolated environment"),
8
+ changeMode: z.boolean().default(false).describe("Enable structured change mode - formats prompts to prevent tool errors and returns structured edit suggestions that Claude can apply directly"),
9
+ chunkIndex: z.union([z.number(), z.string()]).optional().describe("Which chunk to return (1-based)"),
10
+ chunkCacheKey: z.string().optional().describe("Optional cache key for continuation"),
11
+ });
12
+ export const askGeminiTool = {
13
+ name: "ask-gemini",
14
+ description: "model selection [-m], sandbox [-s], and changeMode:boolean for providing edits",
15
+ zodSchema: askGeminiArgsSchema,
16
+ prompt: {
17
+ description: "Execute 'gemini <prompt>' to get Gemini AI's response. Supports enhanced change mode for structured edit suggestions.",
18
+ },
19
+ category: 'gemini',
20
+ execute: async (args, onProgress) => {
21
+ const { prompt, model, sandbox, changeMode, chunkIndex, chunkCacheKey } = args;
22
+ if (!prompt?.trim()) {
23
+ throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
24
+ }
25
+ if (changeMode && chunkIndex && chunkCacheKey) {
26
+ return processChangeModeOutput('', // empty for cache...
27
+ chunkIndex, chunkCacheKey, prompt);
28
+ }
29
+ const result = await executeGeminiCLI(prompt, model, !!sandbox, !!changeMode, onProgress);
30
+ if (changeMode) {
31
+ return processChangeModeOutput(result, args.chunkIndex, undefined, prompt);
32
+ }
33
+ return `${STATUS_MESSAGES.GEMINI_RESPONSE}\n${result}`; // changeMode false
34
+ }
35
+ };
36
+ //# sourceMappingURL=ask-gemini.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-gemini.tool.js","sourceRoot":"","sources":["../../src/tools/ask-gemini.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACvF,OAAO,EACL,cAAc,EACd,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yHAAyH,CAAC;IAC7J,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0GAA0G,CAAC;IACjJ,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,yIAAyI,CAAC;IACvL,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,+IAA+I,CAAC;IAChM,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACpG,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;CACrF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAgB;IACxC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,gFAAgF;IAC7F,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE;QACN,WAAW,EAAE,uHAAuH;KACrI;IACD,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;QAClC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QAAC,CAAC;QAE5J,IAAI,UAAU,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;YAC9C,OAAO,uBAAuB,CAC5B,EAAE,EAAE,qBAAqB;YACzB,UAAoB,EACpB,aAAuB,EACvB,MAAgB,CACjB,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,MAAgB,EAChB,KAA2B,EAC3B,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,UAAU,EACZ,UAAU,CACX,CAAC;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,uBAAuB,CAC5B,MAAM,EACN,IAAI,CAAC,UAAgC,EACrC,SAAS,EACT,MAAgB,CACjB,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,eAAe,CAAC,eAAe,KAAK,MAAM,EAAE,CAAC,CAAC,mBAAmB;IAC7E,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const brainstormTool: UnifiedTool;
3
+ //# sourceMappingURL=brainstorm.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brainstorm.tool.d.ts","sourceRoot":"","sources":["../../src/tools/brainstorm.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA+H5C,eAAO,MAAM,cAAc,EAAE,WA0C5B,CAAC"}