@joeytheman/gemini-mcp-tool 1.3.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/LICENSE +26 -0
- package/README.md +239 -0
- package/dist/__tests__/ask-gemini.test.d.ts +2 -0
- package/dist/__tests__/ask-gemini.test.d.ts.map +1 -0
- package/dist/__tests__/ask-gemini.test.js +165 -0
- package/dist/__tests__/ask-gemini.test.js.map +1 -0
- package/dist/__tests__/server.test.d.ts +2 -0
- package/dist/__tests__/server.test.d.ts.map +1 -0
- package/dist/__tests__/server.test.js +72 -0
- package/dist/__tests__/server.test.js.map +1 -0
- package/dist/__tests__/tools.test.d.ts +2 -0
- package/dist/__tests__/tools.test.d.ts.map +1 -0
- package/dist/__tests__/tools.test.js +131 -0
- package/dist/__tests__/tools.test.js.map +1 -0
- package/dist/__tests__/utils/changeModeChunker.test.d.ts +2 -0
- package/dist/__tests__/utils/changeModeChunker.test.d.ts.map +1 -0
- package/dist/__tests__/utils/changeModeChunker.test.js +137 -0
- package/dist/__tests__/utils/changeModeChunker.test.js.map +1 -0
- package/dist/__tests__/utils/changeModeParser.test.d.ts +2 -0
- package/dist/__tests__/utils/changeModeParser.test.d.ts.map +1 -0
- package/dist/__tests__/utils/changeModeParser.test.js +254 -0
- package/dist/__tests__/utils/changeModeParser.test.js.map +1 -0
- package/dist/__tests__/utils/changeModeTranslator.test.d.ts +2 -0
- package/dist/__tests__/utils/changeModeTranslator.test.d.ts.map +1 -0
- package/dist/__tests__/utils/changeModeTranslator.test.js +112 -0
- package/dist/__tests__/utils/changeModeTranslator.test.js.map +1 -0
- package/dist/__tests__/utils/chunkCache.test.d.ts +2 -0
- package/dist/__tests__/utils/chunkCache.test.d.ts.map +1 -0
- package/dist/__tests__/utils/chunkCache.test.js +140 -0
- package/dist/__tests__/utils/chunkCache.test.js.map +1 -0
- package/dist/__tests__/utils/commandExecutor.test.d.ts +2 -0
- package/dist/__tests__/utils/commandExecutor.test.d.ts.map +1 -0
- package/dist/__tests__/utils/commandExecutor.test.js +139 -0
- package/dist/__tests__/utils/commandExecutor.test.js.map +1 -0
- package/dist/__tests__/utils/geminiExecutor.test.d.ts +2 -0
- package/dist/__tests__/utils/geminiExecutor.test.d.ts.map +1 -0
- package/dist/__tests__/utils/geminiExecutor.test.js +337 -0
- package/dist/__tests__/utils/geminiExecutor.test.js.map +1 -0
- package/dist/__tests__/utils/responseCache.test.d.ts +2 -0
- package/dist/__tests__/utils/responseCache.test.d.ts.map +1 -0
- package/dist/__tests__/utils/responseCache.test.js +98 -0
- package/dist/__tests__/utils/responseCache.test.js.map +1 -0
- package/dist/__tests__/utils/test-helpers.d.ts +17 -0
- package/dist/__tests__/utils/test-helpers.d.ts.map +1 -0
- package/dist/__tests__/utils/test-helpers.js +50 -0
- package/dist/__tests__/utils/test-helpers.js.map +1 -0
- package/dist/constants.d.ts +96 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +89 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +186 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/ask-gemini.tool.d.ts +3 -0
- package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
- package/dist/tools/ask-gemini.tool.js +65 -0
- package/dist/tools/ask-gemini.tool.js.map +1 -0
- package/dist/tools/brainstorm.tool.d.ts +3 -0
- package/dist/tools/brainstorm.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm.tool.js +147 -0
- package/dist/tools/brainstorm.tool.js.map +1 -0
- package/dist/tools/fetch-chunk.tool.d.ts +3 -0
- package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
- package/dist/tools/fetch-chunk.tool.js +67 -0
- package/dist/tools/fetch-chunk.tool.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +10 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +43 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +81 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +4 -0
- package/dist/tools/simple-tools.d.ts.map +1 -0
- package/dist/tools/simple-tools.js +42 -0
- package/dist/tools/simple-tools.js.map +1 -0
- package/dist/tools/test-tool.example.d.ts +13 -0
- package/dist/tools/test-tool.example.d.ts.map +1 -0
- package/dist/tools/test-tool.example.js +32 -0
- package/dist/tools/test-tool.example.js.map +1 -0
- package/dist/tools/timeout-test.tool.d.ts +3 -0
- package/dist/tools/timeout-test.tool.d.ts.map +1 -0
- package/dist/tools/timeout-test.tool.js +36 -0
- package/dist/tools/timeout-test.tool.js.map +1 -0
- package/dist/utils/changeModeChunker.d.ts +11 -0
- package/dist/utils/changeModeChunker.d.ts.map +1 -0
- package/dist/utils/changeModeChunker.js +89 -0
- package/dist/utils/changeModeChunker.js.map +1 -0
- package/dist/utils/changeModeParser.d.ts +15 -0
- package/dist/utils/changeModeParser.d.ts.map +1 -0
- package/dist/utils/changeModeParser.js +67 -0
- package/dist/utils/changeModeParser.js.map +1 -0
- package/dist/utils/changeModeTranslator.d.ts +8 -0
- package/dist/utils/changeModeTranslator.d.ts.map +1 -0
- package/dist/utils/changeModeTranslator.js +70 -0
- package/dist/utils/changeModeTranslator.js.map +1 -0
- package/dist/utils/chunkCache.d.ts +22 -0
- package/dist/utils/chunkCache.d.ts.map +1 -0
- package/dist/utils/chunkCache.js +161 -0
- package/dist/utils/chunkCache.js.map +1 -0
- package/dist/utils/commandExecutor.d.ts +2 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +79 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/geminiExecutor.d.ts +17 -0
- package/dist/utils/geminiExecutor.d.ts.map +1 -0
- package/dist/utils/geminiExecutor.js +238 -0
- package/dist/utils/geminiExecutor.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +42 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/responseCache.d.ts +33 -0
- package/dist/utils/responseCache.d.ts.map +1 -0
- package/dist/utils/responseCache.js +87 -0
- package/dist/utils/responseCache.js.map +1 -0
- package/dist/utils/timeoutManager.d.ts +2 -0
- package/dist/utils/timeoutManager.d.ts.map +1 -0
- package/dist/utils/timeoutManager.js +2 -0
- package/dist/utils/timeoutManager.js.map +1 -0
- package/package.json +79 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
MIT License (Non-Commercial)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 jamubc (original author)
|
|
4
|
+
Copyright (c) 2026 joeytheman (fork maintainer)
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software for non-commercial purposes only, including without limitation
|
|
9
|
+
the rights to use, copy, modify, merge, publish, and distribute copies of the
|
|
10
|
+
Software, and to permit persons to whom the Software is furnished to do so,
|
|
11
|
+
subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
Commercial use of this software is prohibited without prior written permission
|
|
17
|
+
from the copyright holder. For commercial licensing, please contact the
|
|
18
|
+
copyright holder directly.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
|
|
2
|
+
# Gemini MCP Tool
|
|
3
|
+
|
|
4
|
+
<div align="center">
|
|
5
|
+
|
|
6
|
+
[](https://github.com/joeytheman/gemini-mcp-tool/releases)
|
|
7
|
+
[](https://www.npmjs.com/package/@joeytheman/gemini-mcp-tool)
|
|
8
|
+
[](https://www.npmjs.com/package/@joeytheman/gemini-mcp-tool)
|
|
9
|
+
[](./LICENSE)
|
|
10
|
+
[](https://github.com/joeytheman/gemini-mcp-tool)
|
|
11
|
+
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
> 📚 **[View Full Documentation](https://joeytheman.github.io/gemini-mcp-tool/)** - Search me!, Examples, FAQ, Troubleshooting, Best Practices
|
|
15
|
+
|
|
16
|
+
> **Fork Notice:** This project is a fork of [jamubc/gemini-mcp-tool](https://github.com/jamubc/gemini-mcp-tool), originally created by [jamubc](https://github.com/jamubc). We are grateful to the original author for their foundational work.
|
|
17
|
+
|
|
18
|
+
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.
|
|
19
|
+
|
|
20
|
+
- Ask gemini natural questions, through claude or Brainstorm new ideas in a party of 3!
|
|
21
|
+
|
|
22
|
+
<a href="https://glama.ai/mcp/servers/@joeytheman/gemini-mcp-tool">
|
|
23
|
+
<img width="380" height="200" src="https://glama.ai/mcp/servers/@joeytheman/gemini-mcp-tool/badge" alt="Gemini Tool MCP server" />
|
|
24
|
+
</a>
|
|
25
|
+
|
|
26
|
+
## TLDR: [](#) + [](#)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
**Goal**: Use Gemini's powerful analysis capabilities directly in Claude Code to save tokens and analyze large files.
|
|
30
|
+
|
|
31
|
+
## Prerequisites
|
|
32
|
+
|
|
33
|
+
Before using this tool, ensure you have:
|
|
34
|
+
|
|
35
|
+
1. **[Node.js](https://nodejs.org/)** (v18.0.0 or higher)
|
|
36
|
+
2. **[Google Gemini CLI](https://github.com/google-gemini/gemini-cli)** installed and configured
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
### One-Line Setup
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
claude mcp add gemini-cli -- npx -y @joeytheman/gemini-mcp-tool
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Verify Installation
|
|
46
|
+
|
|
47
|
+
Type `/mcp` inside Claude Code to verify the gemini-cli MCP is active.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
### Alternative: Import from Claude Desktop
|
|
52
|
+
|
|
53
|
+
If you already have it configured in Claude Desktop:
|
|
54
|
+
|
|
55
|
+
1. Add to your Claude Desktop config:
|
|
56
|
+
```json
|
|
57
|
+
"gemini-cli": {
|
|
58
|
+
"command": "npx",
|
|
59
|
+
"args": ["-y", "@joeytheman/gemini-mcp-tool"]
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
2. Import to Claude Code:
|
|
64
|
+
```bash
|
|
65
|
+
claude mcp add-from-claude-desktop
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Configuration
|
|
69
|
+
|
|
70
|
+
Register the MCP server with your MCP client:
|
|
71
|
+
|
|
72
|
+
### For NPX Usage (Recommended)
|
|
73
|
+
|
|
74
|
+
Add this configuration to your Claude Desktop config file:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"mcpServers": {
|
|
79
|
+
"gemini-cli": {
|
|
80
|
+
"command": "npx",
|
|
81
|
+
"args": ["-y", "@joeytheman/gemini-mcp-tool"]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### For Global Installation
|
|
88
|
+
|
|
89
|
+
If you installed globally, use this configuration instead:
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"mcpServers": {
|
|
94
|
+
"gemini-cli": {
|
|
95
|
+
"command": "gemini-mcp"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Optional: Enable Response Caching
|
|
102
|
+
|
|
103
|
+
To enable the LRU response cache for near-instant repeated queries, add the `GEMINI_CACHE_ENABLED` environment variable:
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"mcpServers": {
|
|
108
|
+
"gemini-cli": {
|
|
109
|
+
"command": "npx",
|
|
110
|
+
"args": ["-y", "@joeytheman/gemini-mcp-tool"],
|
|
111
|
+
"env": {
|
|
112
|
+
"GEMINI_CACHE_ENABLED": "true"
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Caching is disabled by default. When enabled, responses are cached with a 30-minute TTL and 10MB max size.
|
|
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`**: Execute Gemini CLI with full feature support including advanced flags, caching, and change mode.
|
|
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-preview`. Use `gemini-3-flash-preview` for faster responses.
|
|
165
|
+
- **`sandbox`** (optional): Set to `true` to run in sandbox mode for safe code execution.
|
|
166
|
+
- **`changeMode`** (optional): Enable structured change mode for edit suggestions that Claude can apply directly.
|
|
167
|
+
- **`yolo`** (optional): Auto-accept all actions (YOLO mode). Use with caution.
|
|
168
|
+
- **`approvalMode`** (optional): Fine-grained approval control: `default`, `auto_edit`, or `yolo`.
|
|
169
|
+
- **`outputFormat`** (optional): Control output format: `text`, `json`, or `stream-json`.
|
|
170
|
+
- **`includeDirectories`** (optional): Additional directories to include in workspace.
|
|
171
|
+
- **`debug`** (optional): Enable verbose logging for troubleshooting.
|
|
172
|
+
- **`promptInteractive`** (optional): Execute prompt and continue in interactive mode.
|
|
173
|
+
- **`extensions`** (optional): Filter specific file extensions.
|
|
174
|
+
- **`resume`** (optional): Resume previous session (use `latest` or session number).
|
|
175
|
+
- **`workingDirectory`** (optional): Working directory to run Gemini from. Use drive root (e.g., 'C:/' or 'D:/') on Windows to access files across drives.
|
|
176
|
+
|
|
177
|
+
- **`brainstorm`**: Generate creative ideas with structured methodologies and domain context.
|
|
178
|
+
- **`prompt`** (required): Brainstorming challenge or question to explore.
|
|
179
|
+
- **`model`** (optional): The Gemini model to use.
|
|
180
|
+
- **`methodology`** (optional): Framework to use: `divergent`, `convergent`, `scamper`, `design-thinking`, `lateral`, or `auto` (default).
|
|
181
|
+
- **`domain`** (optional): Domain context (e.g., 'software', 'business', 'creative', 'research').
|
|
182
|
+
- **`constraints`** (optional): Known limitations or requirements.
|
|
183
|
+
- **`ideaCount`** (optional): Number of ideas to generate (default: 12).
|
|
184
|
+
- **`includeAnalysis`** (optional): Include feasibility and impact analysis (default: true).
|
|
185
|
+
|
|
186
|
+
- **`fetch-chunk`**: Retrieve cached chunks from large changeMode responses.
|
|
187
|
+
- **`cacheKey`** (required): Cache key from initial changeMode response.
|
|
188
|
+
- **`chunkIndex`** (required): Chunk number to retrieve (1-based index).
|
|
189
|
+
|
|
190
|
+
- **`ping`**: Echo test message to verify server connection.
|
|
191
|
+
- **`prompt`** (optional): Message to echo back.
|
|
192
|
+
|
|
193
|
+
- **`Help`**: Display Gemini CLI help information.
|
|
194
|
+
|
|
195
|
+
### Slash Commands (for the User)
|
|
196
|
+
|
|
197
|
+
You can use these commands directly in Claude Code's interface (compatibility with other clients has not been tested).
|
|
198
|
+
|
|
199
|
+
- **/ask-gemini**: Execute Gemini CLI with advanced features and caching.
|
|
200
|
+
- **Example**: `/ask-gemini prompt:@src/ summarize this directory`
|
|
201
|
+
- **With sandbox**: `/ask-gemini prompt:@script.py test this safely sandbox:true`
|
|
202
|
+
- **With change mode**: `/ask-gemini prompt:Refactor this code changeMode:true`
|
|
203
|
+
- **Supports all flags**: yolo, approvalMode, outputFormat, debug, etc.
|
|
204
|
+
|
|
205
|
+
- **/brainstorm**: Generate structured ideas with creative methodologies.
|
|
206
|
+
- **Example**: `/brainstorm prompt:How can we improve user onboarding? methodology:design-thinking domain:software`
|
|
207
|
+
- **Quick use**: `/brainstorm prompt:Ideas for a mobile app feature`
|
|
208
|
+
|
|
209
|
+
- **/fetch-chunk**: Retrieve next chunk of a large changeMode response.
|
|
210
|
+
- **Example**: `/fetch-chunk cacheKey:abc123 chunkIndex:2`
|
|
211
|
+
|
|
212
|
+
- **/Help**: Display Gemini CLI help information.
|
|
213
|
+
- **Example**: `/Help`
|
|
214
|
+
|
|
215
|
+
- **/ping**: Test the MCP server connection.
|
|
216
|
+
- **Example**: `/ping prompt:Hello server!`
|
|
217
|
+
|
|
218
|
+
## Performance Features
|
|
219
|
+
|
|
220
|
+
This MCP server includes several performance optimizations:
|
|
221
|
+
|
|
222
|
+
- **LRU Response Cache** (opt-in): Near-instant responses for repeated queries with 30-minute TTL and 10MB max size. Enable via `GEMINI_CACHE_ENABLED=true` env var.
|
|
223
|
+
- **Efficient Command Execution**: O(n) array buffer performance for large outputs
|
|
224
|
+
- **Smart Chunking**: Large changeMode responses are automatically chunked for better handling
|
|
225
|
+
- **Progress Notifications**: Real-time progress updates during long-running operations
|
|
226
|
+
|
|
227
|
+
## Contributing
|
|
228
|
+
|
|
229
|
+
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.
|
|
230
|
+
|
|
231
|
+
## Acknowledgments
|
|
232
|
+
|
|
233
|
+
This project was originally created by [jamubc](https://github.com/jamubc) and is maintained as a fork by [joeytheman](https://github.com/joeytheman). The original repository can be found at [jamubc/gemini-mcp-tool](https://github.com/jamubc/gemini-mcp-tool).
|
|
234
|
+
|
|
235
|
+
## License
|
|
236
|
+
|
|
237
|
+
This project is licensed under the MIT License (Non-Commercial). Commercial use is prohibited without prior written permission from the original copyright holder. See the [LICENSE](LICENSE) file for full details.
|
|
238
|
+
|
|
239
|
+
**Disclaimer:** This is an unofficial, third-party tool and is not affiliated with, endorsed, or sponsored by Google.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-gemini.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ask-gemini.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
describe('ask-gemini Tool', () => {
|
|
4
|
+
describe('Argument Schema Validation', () => {
|
|
5
|
+
const askGeminiArgsSchema = z.object({
|
|
6
|
+
prompt: z.string().min(1),
|
|
7
|
+
model: z.string().optional(),
|
|
8
|
+
sandbox: z.boolean().default(false),
|
|
9
|
+
changeMode: z.boolean().default(false),
|
|
10
|
+
chunkIndex: z.union([z.number(), z.string()]).optional(),
|
|
11
|
+
chunkCacheKey: z.string().optional(),
|
|
12
|
+
yolo: z.boolean().default(false),
|
|
13
|
+
approvalMode: z.enum(['default', 'auto_edit', 'yolo']).optional(),
|
|
14
|
+
outputFormat: z.enum(['text', 'json', 'stream-json']).optional(),
|
|
15
|
+
includeDirectories: z.union([z.string(), z.array(z.string())]).optional(),
|
|
16
|
+
debug: z.boolean().default(false),
|
|
17
|
+
promptInteractive: z.string().optional(),
|
|
18
|
+
extensions: z.union([z.string(), z.array(z.string())]).optional(),
|
|
19
|
+
resume: z.string().optional(),
|
|
20
|
+
});
|
|
21
|
+
it('should accept valid minimal arguments', () => {
|
|
22
|
+
const result = askGeminiArgsSchema.parse({ prompt: 'test prompt' });
|
|
23
|
+
expect(result.prompt).toBe('test prompt');
|
|
24
|
+
expect(result.sandbox).toBe(false);
|
|
25
|
+
expect(result.changeMode).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
it('should accept all optional flags', () => {
|
|
28
|
+
const result = askGeminiArgsSchema.parse({
|
|
29
|
+
prompt: 'test prompt',
|
|
30
|
+
model: 'gemini-3-flash-preview',
|
|
31
|
+
sandbox: true,
|
|
32
|
+
changeMode: true,
|
|
33
|
+
yolo: true,
|
|
34
|
+
approvalMode: 'auto_edit',
|
|
35
|
+
outputFormat: 'json',
|
|
36
|
+
debug: true,
|
|
37
|
+
});
|
|
38
|
+
expect(result.model).toBe('gemini-3-flash-preview');
|
|
39
|
+
expect(result.sandbox).toBe(true);
|
|
40
|
+
expect(result.changeMode).toBe(true);
|
|
41
|
+
expect(result.yolo).toBe(true);
|
|
42
|
+
expect(result.approvalMode).toBe('auto_edit');
|
|
43
|
+
expect(result.outputFormat).toBe('json');
|
|
44
|
+
expect(result.debug).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
it('should reject missing prompt', () => {
|
|
47
|
+
expect(() => askGeminiArgsSchema.parse({})).toThrow();
|
|
48
|
+
});
|
|
49
|
+
it('should reject empty prompt', () => {
|
|
50
|
+
expect(() => askGeminiArgsSchema.parse({ prompt: '' })).toThrow();
|
|
51
|
+
});
|
|
52
|
+
it('should reject invalid approval mode', () => {
|
|
53
|
+
expect(() => askGeminiArgsSchema.parse({
|
|
54
|
+
prompt: 'test',
|
|
55
|
+
approvalMode: 'invalid',
|
|
56
|
+
})).toThrow();
|
|
57
|
+
});
|
|
58
|
+
it('should reject invalid output format', () => {
|
|
59
|
+
expect(() => askGeminiArgsSchema.parse({
|
|
60
|
+
prompt: 'test',
|
|
61
|
+
outputFormat: 'invalid',
|
|
62
|
+
})).toThrow();
|
|
63
|
+
});
|
|
64
|
+
it('should accept includeDirectories as string', () => {
|
|
65
|
+
const result = askGeminiArgsSchema.parse({
|
|
66
|
+
prompt: 'test',
|
|
67
|
+
includeDirectories: 'src,tests',
|
|
68
|
+
});
|
|
69
|
+
expect(result.includeDirectories).toBe('src,tests');
|
|
70
|
+
});
|
|
71
|
+
it('should accept includeDirectories as array', () => {
|
|
72
|
+
const result = askGeminiArgsSchema.parse({
|
|
73
|
+
prompt: 'test',
|
|
74
|
+
includeDirectories: ['src', 'tests'],
|
|
75
|
+
});
|
|
76
|
+
expect(result.includeDirectories).toEqual(['src', 'tests']);
|
|
77
|
+
});
|
|
78
|
+
it('should accept extensions as string', () => {
|
|
79
|
+
const result = askGeminiArgsSchema.parse({
|
|
80
|
+
prompt: 'test',
|
|
81
|
+
extensions: 'ts,js',
|
|
82
|
+
});
|
|
83
|
+
expect(result.extensions).toBe('ts,js');
|
|
84
|
+
});
|
|
85
|
+
it('should accept extensions as array', () => {
|
|
86
|
+
const result = askGeminiArgsSchema.parse({
|
|
87
|
+
prompt: 'test',
|
|
88
|
+
extensions: ['ts', 'js'],
|
|
89
|
+
});
|
|
90
|
+
expect(result.extensions).toEqual(['ts', 'js']);
|
|
91
|
+
});
|
|
92
|
+
it('should accept resume parameter', () => {
|
|
93
|
+
const result = askGeminiArgsSchema.parse({
|
|
94
|
+
prompt: 'test',
|
|
95
|
+
resume: 'latest',
|
|
96
|
+
});
|
|
97
|
+
expect(result.resume).toBe('latest');
|
|
98
|
+
});
|
|
99
|
+
it('should accept chunkIndex as number', () => {
|
|
100
|
+
const result = askGeminiArgsSchema.parse({
|
|
101
|
+
prompt: 'test',
|
|
102
|
+
chunkIndex: 1,
|
|
103
|
+
});
|
|
104
|
+
expect(result.chunkIndex).toBe(1);
|
|
105
|
+
});
|
|
106
|
+
it('should accept chunkIndex as string', () => {
|
|
107
|
+
const result = askGeminiArgsSchema.parse({
|
|
108
|
+
prompt: 'test',
|
|
109
|
+
chunkIndex: '1',
|
|
110
|
+
});
|
|
111
|
+
expect(result.chunkIndex).toBe('1');
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe('Flag Combinations', () => {
|
|
115
|
+
const askGeminiArgsSchema = z.object({
|
|
116
|
+
prompt: z.string().min(1),
|
|
117
|
+
sandbox: z.boolean().default(false),
|
|
118
|
+
yolo: z.boolean().default(false),
|
|
119
|
+
approvalMode: z.enum(['default', 'auto_edit', 'yolo']).optional(),
|
|
120
|
+
});
|
|
121
|
+
it('should allow sandbox with yolo', () => {
|
|
122
|
+
const result = askGeminiArgsSchema.parse({
|
|
123
|
+
prompt: 'test',
|
|
124
|
+
sandbox: true,
|
|
125
|
+
yolo: true,
|
|
126
|
+
});
|
|
127
|
+
expect(result.sandbox).toBe(true);
|
|
128
|
+
expect(result.yolo).toBe(true);
|
|
129
|
+
});
|
|
130
|
+
it('should allow approvalMode to override yolo', () => {
|
|
131
|
+
const result = askGeminiArgsSchema.parse({
|
|
132
|
+
prompt: 'test',
|
|
133
|
+
yolo: true,
|
|
134
|
+
approvalMode: 'auto_edit',
|
|
135
|
+
});
|
|
136
|
+
expect(result.yolo).toBe(true);
|
|
137
|
+
expect(result.approvalMode).toBe('auto_edit');
|
|
138
|
+
// Note: In actual implementation, approvalMode should take precedence
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe('Error Messages', () => {
|
|
142
|
+
const askGeminiArgsSchema = z.object({
|
|
143
|
+
prompt: z.string().min(1),
|
|
144
|
+
});
|
|
145
|
+
it('should provide clear error for missing prompt', () => {
|
|
146
|
+
try {
|
|
147
|
+
askGeminiArgsSchema.parse({});
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
expect(error.issues[0].path).toContain('prompt');
|
|
151
|
+
expect(error.issues[0].message).toMatch(/required/i);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
it('should provide clear error for empty prompt', () => {
|
|
155
|
+
try {
|
|
156
|
+
askGeminiArgsSchema.parse({ prompt: '' });
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
expect(error.issues[0].path).toContain('prompt');
|
|
160
|
+
expect(error.issues[0].message).toMatch(/at least 1/i);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=ask-gemini.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-gemini.test.js","sourceRoot":"","sources":["../../src/__tests__/ask-gemini.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/server.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeAll } from 'vitest';
|
|
2
|
+
// Track constructor calls manually using plain arrays.
|
|
3
|
+
// vitest's mockReset clears mock.calls between tests, but these arrays persist.
|
|
4
|
+
const serverConstructorCalls = [];
|
|
5
|
+
const stdioTransportConstructorCalls = [];
|
|
6
|
+
const setRequestHandlerCalls = [];
|
|
7
|
+
const mockServerInstance = {
|
|
8
|
+
setRequestHandler: vi.fn((...args) => {
|
|
9
|
+
setRequestHandlerCalls.push(args);
|
|
10
|
+
}),
|
|
11
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
12
|
+
notification: vi.fn(),
|
|
13
|
+
};
|
|
14
|
+
vi.mock('@modelcontextprotocol/sdk/server/index.js', () => ({
|
|
15
|
+
Server: vi.fn((...args) => {
|
|
16
|
+
serverConstructorCalls.push(args);
|
|
17
|
+
return mockServerInstance;
|
|
18
|
+
}),
|
|
19
|
+
}));
|
|
20
|
+
vi.mock('@modelcontextprotocol/sdk/server/stdio.js', () => ({
|
|
21
|
+
StdioServerTransport: vi.fn((...args) => {
|
|
22
|
+
stdioTransportConstructorCalls.push(args);
|
|
23
|
+
return {};
|
|
24
|
+
}),
|
|
25
|
+
}));
|
|
26
|
+
vi.mock('../utils/logger.js', () => ({
|
|
27
|
+
Logger: {
|
|
28
|
+
debug: vi.fn(),
|
|
29
|
+
warn: vi.fn(),
|
|
30
|
+
error: vi.fn(),
|
|
31
|
+
log: vi.fn(),
|
|
32
|
+
toolInvocation: vi.fn(),
|
|
33
|
+
commandExecution: vi.fn(),
|
|
34
|
+
commandComplete: vi.fn(),
|
|
35
|
+
},
|
|
36
|
+
}));
|
|
37
|
+
describe('Gemini MCP Server', () => {
|
|
38
|
+
beforeAll(async () => {
|
|
39
|
+
await import('../index.js');
|
|
40
|
+
});
|
|
41
|
+
describe('Server Initialization', () => {
|
|
42
|
+
it('should create server with correct name and version', () => {
|
|
43
|
+
expect(serverConstructorCalls.length).toBeGreaterThanOrEqual(1);
|
|
44
|
+
const [serverConfig] = serverConstructorCalls[0];
|
|
45
|
+
expect(serverConfig).toHaveProperty('name', 'gemini-cli-mcp');
|
|
46
|
+
expect(serverConfig).toHaveProperty('version');
|
|
47
|
+
});
|
|
48
|
+
it('should register capabilities', () => {
|
|
49
|
+
const [, capabilities] = serverConstructorCalls[0];
|
|
50
|
+
expect(capabilities).toHaveProperty('capabilities');
|
|
51
|
+
expect(capabilities.capabilities).toHaveProperty('tools');
|
|
52
|
+
expect(capabilities.capabilities).toHaveProperty('prompts');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('Request Handlers', () => {
|
|
56
|
+
it('should register at least 4 request handlers', () => {
|
|
57
|
+
expect(setRequestHandlerCalls.length).toBeGreaterThanOrEqual(4);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('Progress Notifications', () => {
|
|
61
|
+
it('should support progress notifications', () => {
|
|
62
|
+
expect(mockServerInstance).toHaveProperty('notification');
|
|
63
|
+
expect(typeof mockServerInstance.notification).toBe('function');
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('Transport Connection', () => {
|
|
67
|
+
it('should create StdioServerTransport', () => {
|
|
68
|
+
expect(stdioTransportConstructorCalls.length).toBeGreaterThanOrEqual(1);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=server.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../src/__tests__/server.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":""}
|