@maxanatsko/gemini-mcp-tool 2.0.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 (119) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +230 -0
  3. package/dist/constants.d.ts +153 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +150 -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 +74 -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 +202 -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 +11 -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/review-code.tool.d.ts +3 -0
  32. package/dist/tools/review-code.tool.d.ts.map +1 -0
  33. package/dist/tools/review-code.tool.js +186 -0
  34. package/dist/tools/review-code.tool.js.map +1 -0
  35. package/dist/tools/simple-tools.d.ts +4 -0
  36. package/dist/tools/simple-tools.d.ts.map +1 -0
  37. package/dist/tools/simple-tools.js +32 -0
  38. package/dist/tools/simple-tools.js.map +1 -0
  39. package/dist/tools/test-tool.example.d.ts +13 -0
  40. package/dist/tools/test-tool.example.d.ts.map +1 -0
  41. package/dist/tools/test-tool.example.js +32 -0
  42. package/dist/tools/test-tool.example.js.map +1 -0
  43. package/dist/tools/timeout-test.tool.d.ts +3 -0
  44. package/dist/tools/timeout-test.tool.d.ts.map +1 -0
  45. package/dist/tools/timeout-test.tool.js +32 -0
  46. package/dist/tools/timeout-test.tool.js.map +1 -0
  47. package/dist/utils/askGeminiSessionManager.d.ts +57 -0
  48. package/dist/utils/askGeminiSessionManager.d.ts.map +1 -0
  49. package/dist/utils/askGeminiSessionManager.js +110 -0
  50. package/dist/utils/askGeminiSessionManager.js.map +1 -0
  51. package/dist/utils/brainstormSessionManager.d.ts +67 -0
  52. package/dist/utils/brainstormSessionManager.d.ts.map +1 -0
  53. package/dist/utils/brainstormSessionManager.js +165 -0
  54. package/dist/utils/brainstormSessionManager.js.map +1 -0
  55. package/dist/utils/changeModeChunker.d.ts +11 -0
  56. package/dist/utils/changeModeChunker.d.ts.map +1 -0
  57. package/dist/utils/changeModeChunker.js +89 -0
  58. package/dist/utils/changeModeChunker.js.map +1 -0
  59. package/dist/utils/changeModeParser.d.ts +15 -0
  60. package/dist/utils/changeModeParser.d.ts.map +1 -0
  61. package/dist/utils/changeModeParser.js +67 -0
  62. package/dist/utils/changeModeParser.js.map +1 -0
  63. package/dist/utils/changeModeTranslator.d.ts +8 -0
  64. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  65. package/dist/utils/changeModeTranslator.js +70 -0
  66. package/dist/utils/changeModeTranslator.js.map +1 -0
  67. package/dist/utils/chunkCache.d.ts +22 -0
  68. package/dist/utils/chunkCache.d.ts.map +1 -0
  69. package/dist/utils/chunkCache.js +161 -0
  70. package/dist/utils/chunkCache.js.map +1 -0
  71. package/dist/utils/commandExecutor.d.ts +2 -0
  72. package/dist/utils/commandExecutor.d.ts.map +1 -0
  73. package/dist/utils/commandExecutor.js +74 -0
  74. package/dist/utils/commandExecutor.js.map +1 -0
  75. package/dist/utils/geminiExecutor.d.ts +3 -0
  76. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  77. package/dist/utils/geminiExecutor.js +170 -0
  78. package/dist/utils/geminiExecutor.js.map +1 -0
  79. package/dist/utils/gitStateDetector.d.ts +31 -0
  80. package/dist/utils/gitStateDetector.d.ts.map +1 -0
  81. package/dist/utils/gitStateDetector.js +67 -0
  82. package/dist/utils/gitStateDetector.js.map +1 -0
  83. package/dist/utils/logger.d.ts +13 -0
  84. package/dist/utils/logger.d.ts.map +1 -0
  85. package/dist/utils/logger.js +42 -0
  86. package/dist/utils/logger.js.map +1 -0
  87. package/dist/utils/reviewFormatter.d.ts +35 -0
  88. package/dist/utils/reviewFormatter.d.ts.map +1 -0
  89. package/dist/utils/reviewFormatter.js +198 -0
  90. package/dist/utils/reviewFormatter.js.map +1 -0
  91. package/dist/utils/reviewPromptBuilder.d.ts +35 -0
  92. package/dist/utils/reviewPromptBuilder.d.ts.map +1 -0
  93. package/dist/utils/reviewPromptBuilder.js +146 -0
  94. package/dist/utils/reviewPromptBuilder.js.map +1 -0
  95. package/dist/utils/reviewResponseParser.d.ts +20 -0
  96. package/dist/utils/reviewResponseParser.d.ts.map +1 -0
  97. package/dist/utils/reviewResponseParser.js +149 -0
  98. package/dist/utils/reviewResponseParser.js.map +1 -0
  99. package/dist/utils/reviewSessionCache.d.ts +81 -0
  100. package/dist/utils/reviewSessionCache.d.ts.map +1 -0
  101. package/dist/utils/reviewSessionCache.js +220 -0
  102. package/dist/utils/reviewSessionCache.js.map +1 -0
  103. package/dist/utils/reviewSessionManager.d.ts +52 -0
  104. package/dist/utils/reviewSessionManager.d.ts.map +1 -0
  105. package/dist/utils/reviewSessionManager.js +65 -0
  106. package/dist/utils/reviewSessionManager.js.map +1 -0
  107. package/dist/utils/sessionManager.d.ts +94 -0
  108. package/dist/utils/sessionManager.d.ts.map +1 -0
  109. package/dist/utils/sessionManager.js +374 -0
  110. package/dist/utils/sessionManager.js.map +1 -0
  111. package/dist/utils/sessionSchemas.d.ts +126 -0
  112. package/dist/utils/sessionSchemas.d.ts.map +1 -0
  113. package/dist/utils/sessionSchemas.js +2 -0
  114. package/dist/utils/sessionSchemas.js.map +1 -0
  115. package/dist/utils/timeoutManager.d.ts +2 -0
  116. package/dist/utils/timeoutManager.d.ts.map +1 -0
  117. package/dist/utils/timeoutManager.js +2 -0
  118. package/dist/utils/timeoutManager.js.map +1 -0
  119. package/package.json +71 -0
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;AAqB5C,eAAO,MAAM,aAAa,EAAE,WAsF3B,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { z } from 'zod';
2
+ import { executeGeminiCLI, processChangeModeOutput } from '../utils/geminiExecutor.js';
3
+ import { ERROR_MESSAGES, STATUS_MESSAGES } from '../constants.js';
4
+ import { askGeminiSessionManager } from '../utils/askGeminiSessionManager.js';
5
+ import { extractFilesFromPrompt } from '../utils/reviewPromptBuilder.js';
6
+ import { Logger } from '../utils/logger.js';
7
+ const askGeminiArgsSchema = z.object({
8
+ 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"),
9
+ session: z.string().optional().describe("Session ID for conversation continuity (e.g., 'typescript-learning'). Maintains context across multiple questions."),
10
+ model: z.string().optional().describe("Optional model to use (e.g., 'gemini-2.5-flash'). If not specified, uses the default model (gemini-2.5-pro)."),
11
+ 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"),
12
+ 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"),
13
+ includeHistory: z.boolean().default(true).describe("Include conversation history in context (only applies when session is provided). Default: true"),
14
+ chunkIndex: z.union([z.number(), z.string()]).optional().describe("Which chunk to return (1-based)"),
15
+ chunkCacheKey: z.string().optional().describe("Optional cache key for continuation"),
16
+ });
17
+ export const askGeminiTool = {
18
+ name: "ask-gemini",
19
+ description: "model selection [-m], sandbox [-s], and changeMode:boolean for providing edits",
20
+ zodSchema: askGeminiArgsSchema,
21
+ prompt: {
22
+ description: "Execute 'gemini -p <prompt>' to get Gemini AI's response. Supports enhanced change mode for structured edit suggestions.",
23
+ },
24
+ category: 'gemini',
25
+ execute: async (args, onProgress) => {
26
+ const { prompt, session, model, sandbox, changeMode, includeHistory, chunkIndex, chunkCacheKey } = args;
27
+ if (!prompt?.trim()) {
28
+ throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
29
+ }
30
+ // Handle chunking (existing logic)
31
+ if (changeMode && chunkIndex && chunkCacheKey) {
32
+ return processChangeModeOutput('', chunkIndex, chunkCacheKey, prompt);
33
+ }
34
+ // Session handling
35
+ let sessionData = null;
36
+ let enhancedPrompt = prompt;
37
+ if (session) {
38
+ try {
39
+ sessionData = await askGeminiSessionManager.getOrCreate(session);
40
+ // Build conversation context if history is enabled
41
+ if (includeHistory && sessionData.conversationHistory.length > 0) {
42
+ const historyContext = askGeminiSessionManager.buildConversationContext(sessionData, 3);
43
+ enhancedPrompt = `${historyContext}\n\n# Current Question\n${prompt}`;
44
+ }
45
+ onProgress?.(`📝 Session '${session}' (Round ${sessionData.totalRounds + 1})`);
46
+ }
47
+ catch (error) {
48
+ onProgress?.(`⚠️ Session loading failed: ${error instanceof Error ? error.message : String(error)}`);
49
+ Logger.error(`Failed to load session '${session}': ${error}`);
50
+ // Continue without session
51
+ }
52
+ }
53
+ const result = await executeGeminiCLI(enhancedPrompt, model, !!sandbox, !!changeMode, onProgress);
54
+ // Save to session if provided
55
+ if (session && sessionData) {
56
+ try {
57
+ const contextFiles = extractFilesFromPrompt(prompt);
58
+ askGeminiSessionManager.addRound(sessionData, prompt, result, model || 'gemini-2.5-pro', contextFiles);
59
+ await askGeminiSessionManager.save(sessionData);
60
+ onProgress?.(`💾 Saved to session '${session}' (${sessionData.totalRounds} rounds)`);
61
+ }
62
+ catch (error) {
63
+ onProgress?.(`⚠️ Session save failed: ${error instanceof Error ? error.message : String(error)}`);
64
+ Logger.error(`Failed to save session '${session}': ${error}`);
65
+ // Continue - result is still valid even if session save failed
66
+ }
67
+ }
68
+ if (changeMode) {
69
+ return processChangeModeOutput(result, args.chunkIndex, undefined, prompt);
70
+ }
71
+ return `${STATUS_MESSAGES.GEMINI_RESPONSE}\n${result}`;
72
+ }
73
+ };
74
+ //# 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":"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"}
@@ -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;AAkI5C,eAAO,MAAM,cAAc,EAAE,WA2F5B,CAAC"}
@@ -0,0 +1,202 @@
1
+ import { z } from 'zod';
2
+ import { Logger } from '../utils/logger.js';
3
+ import { executeGeminiCLI } from '../utils/geminiExecutor.js';
4
+ import { brainstormSessionManager } from '../utils/brainstormSessionManager.js';
5
+ function buildBrainstormPrompt(config) {
6
+ const { prompt, methodology, domain, constraints, existingContext, ideaCount, includeAnalysis } = config;
7
+ // Select methodology framework
8
+ let frameworkInstructions = getMethodologyInstructions(methodology, domain);
9
+ let enhancedPrompt = `# BRAINSTORMING SESSION
10
+
11
+ ## Core Challenge
12
+ ${prompt}
13
+
14
+ ## Methodology Framework
15
+ ${frameworkInstructions}
16
+
17
+ ## Context Engineering
18
+ *Use the following context to inform your reasoning:*
19
+ ${domain ? `**Domain Focus:** ${domain} - Apply domain-specific knowledge, terminology, and best practices.` : ''}
20
+ ${constraints ? `**Constraints & Boundaries:** ${constraints}` : ''}
21
+ ${existingContext ? `**Background Context:** ${existingContext}` : ''}
22
+
23
+ ## Output Requirements
24
+ - Generate ${ideaCount} distinct, creative ideas
25
+ - Each idea should be unique and non-obvious
26
+ - Focus on actionable, implementable concepts
27
+ - Use clear, descriptive naming
28
+ - Provide brief explanations for each idea
29
+
30
+ ${includeAnalysis ? `
31
+ ## Analysis Framework
32
+ For each idea, provide:
33
+ - **Feasibility:** Implementation difficulty (1-5 scale)
34
+ - **Impact:** Potential value/benefit (1-5 scale)
35
+ - **Innovation:** Uniqueness/creativity (1-5 scale)
36
+ - **Quick Assessment:** One-sentence evaluation
37
+ ` : ''}
38
+
39
+ ## Format
40
+ Present ideas in a structured format:
41
+
42
+ ### Idea [N]: [Creative Name]
43
+ **Description:** [2-3 sentence explanation]
44
+ ${includeAnalysis ? '**Feasibility:** [1-5] | **Impact:** [1-5] | **Innovation:** [1-5]\n**Assessment:** [Brief evaluation]' : ''}
45
+
46
+ ---
47
+
48
+ **Before finalizing, review the list: remove near-duplicates and ensure each idea satisfies the constraints.**
49
+
50
+ Begin brainstorming session:`;
51
+ return enhancedPrompt;
52
+ }
53
+ /**
54
+ * Returns methodology-specific instructions for structured brainstorming
55
+ */
56
+ function getMethodologyInstructions(methodology, domain) {
57
+ const methodologies = {
58
+ 'divergent': `**Divergent Thinking Approach:**
59
+ - Generate maximum quantity of ideas without self-censoring
60
+ - Build on wild or seemingly impractical ideas
61
+ - Combine unrelated concepts for unexpected solutions
62
+ - Use "Yes, and..." thinking to expand each concept
63
+ - Postpone evaluation until all ideas are generated`,
64
+ 'convergent': `**Convergent Thinking Approach:**
65
+ - Focus on refining and improving existing concepts
66
+ - Synthesize related ideas into stronger solutions
67
+ - Apply critical evaluation criteria
68
+ - Prioritize based on feasibility and impact
69
+ - Develop implementation pathways for top ideas`,
70
+ 'scamper': `**SCAMPER Creative Triggers:**
71
+ - **Substitute:** What can be substituted or replaced?
72
+ - **Combine:** What can be combined or merged?
73
+ - **Adapt:** What can be adapted from other domains?
74
+ - **Modify:** What can be magnified, minimized, or altered?
75
+ - **Put to other use:** How else can this be used?
76
+ - **Eliminate:** What can be removed or simplified?
77
+ - **Reverse:** What can be rearranged or reversed?`,
78
+ 'design-thinking': `**Human-Centered Design Thinking:**
79
+ - **Empathize:** Consider user needs, pain points, and contexts
80
+ - **Define:** Frame problems from user perspective
81
+ - **Ideate:** Generate user-focused solutions
82
+ - **Consider Journey:** Think through complete user experience
83
+ - **Prototype Mindset:** Focus on testable, iterative concepts`,
84
+ 'lateral': `**Lateral Thinking Approach:**
85
+ - Make unexpected connections between unrelated fields
86
+ - Challenge fundamental assumptions
87
+ - Use random word association to trigger new directions
88
+ - Apply metaphors and analogies from other domains
89
+ - Reverse conventional thinking patterns`,
90
+ 'auto': `**AI-Optimized Approach:**
91
+ ${domain ? `Given the ${domain} domain, I'll apply the most effective combination of:` : 'I\'ll intelligently combine multiple methodologies:'}
92
+ - Divergent exploration with domain-specific knowledge
93
+ - SCAMPER triggers and lateral thinking
94
+ - Human-centered perspective for practical value`
95
+ };
96
+ return methodologies[methodology] || methodologies['auto'];
97
+ }
98
+ const brainstormArgsSchema = z.object({
99
+ prompt: z.string().min(1).describe("Primary brainstorming challenge or question to explore"),
100
+ session: z.string().optional().describe("Session ID for tracking ideas across rounds (e.g., 'feature-ideas'). Enables iterative brainstorming with context."),
101
+ model: z.string().optional().describe("Optional model to use (e.g., 'gemini-2.5-flash'). If not specified, uses the default model (gemini-2.5-pro)."),
102
+ methodology: z.enum(['divergent', 'convergent', 'scamper', 'design-thinking', 'lateral', 'auto']).default('auto').describe("Brainstorming framework: 'divergent' (generate many ideas), 'convergent' (refine existing), 'scamper' (systematic triggers), 'design-thinking' (human-centered), 'lateral' (unexpected connections), 'auto' (AI selects best)"),
103
+ domain: z.string().optional().describe("Domain context for specialized brainstorming (e.g., 'software', 'business', 'creative', 'research', 'product', 'marketing')"),
104
+ constraints: z.string().optional().describe("Known limitations, requirements, or boundaries (budget, time, technical, legal, etc.)"),
105
+ existingContext: z.string().optional().describe("Background information, previous attempts, or current state to build upon"),
106
+ ideaCount: z.number().int().positive().default(12).describe("Target number of ideas to generate (default: 10-15)"),
107
+ includeAnalysis: z.boolean().default(true).describe("Include feasibility, impact, and implementation analysis for generated ideas"),
108
+ includeHistory: z.boolean().default(true).describe("Include previously generated ideas in context (only applies when session is provided). Default: true"),
109
+ });
110
+ export const brainstormTool = {
111
+ name: "brainstorm",
112
+ description: "Generate novel ideas with dynamic context gathering. --> Creative frameworks (SCAMPER, Design Thinking, etc.), domain context integration, idea clustering, feasibility analysis, and iterative refinement.",
113
+ zodSchema: brainstormArgsSchema,
114
+ prompt: {
115
+ description: "Generate structured brainstorming prompt with methodology-driven ideation, domain context integration, and analytical evaluation framework",
116
+ },
117
+ category: 'gemini',
118
+ execute: async (args, onProgress) => {
119
+ const { prompt, session, model, methodology = 'auto', domain, constraints, existingContext, ideaCount = 12, includeAnalysis = true, includeHistory = true } = args;
120
+ if (!prompt?.trim()) {
121
+ throw new Error("You must provide a valid brainstorming challenge or question to explore");
122
+ }
123
+ // Session handling
124
+ let sessionData = null;
125
+ let contextualizedExistingContext = existingContext;
126
+ if (session) {
127
+ try {
128
+ sessionData = await brainstormSessionManager.getOrCreate(session, prompt.trim(), methodology, domain, constraints);
129
+ // Build context from previous rounds
130
+ if (includeHistory && sessionData.rounds.length > 0) {
131
+ const previousIdeas = brainstormSessionManager.buildIdeasContext(sessionData, true);
132
+ contextualizedExistingContext = existingContext
133
+ ? `${existingContext}\n\n${previousIdeas}`
134
+ : previousIdeas;
135
+ }
136
+ onProgress?.(`🧠 Session '${session}' (Round ${sessionData.rounds.length + 1})`);
137
+ }
138
+ catch (error) {
139
+ onProgress?.(`⚠️ Session loading failed: ${error instanceof Error ? error.message : String(error)}`);
140
+ Logger.error(`Failed to load session '${session}': ${error}`);
141
+ // Continue without session
142
+ }
143
+ }
144
+ let enhancedPrompt = buildBrainstormPrompt({
145
+ prompt: prompt.trim(),
146
+ methodology: methodology,
147
+ domain: domain,
148
+ constraints: constraints,
149
+ existingContext: contextualizedExistingContext,
150
+ ideaCount: ideaCount,
151
+ includeAnalysis: includeAnalysis
152
+ });
153
+ Logger.debug(`Brainstorm: Using methodology '${methodology}' for domain '${domain || 'general'}'`);
154
+ // Report progress to user
155
+ onProgress?.(`Generating ${ideaCount} ideas via ${methodology} methodology...`);
156
+ // Execute with Gemini
157
+ const result = await executeGeminiCLI(enhancedPrompt, model, false, false, onProgress);
158
+ // Save to session if provided
159
+ if (session && sessionData) {
160
+ try {
161
+ // Parse ideas from response (simple extraction)
162
+ const ideas = parseIdeasFromResponse(result);
163
+ brainstormSessionManager.addRound(sessionData, prompt, result, ideas);
164
+ await brainstormSessionManager.save(sessionData);
165
+ onProgress?.(`💾 Saved to session '${session}' (${sessionData.totalIdeas} total ideas, ${sessionData.activeIdeas} active)`);
166
+ }
167
+ catch (error) {
168
+ onProgress?.(`⚠️ Session save failed: ${error instanceof Error ? error.message : String(error)}`);
169
+ Logger.error(`Failed to save session '${session}': ${error}`);
170
+ // Continue - result is still valid even if session save failed
171
+ }
172
+ }
173
+ return result;
174
+ }
175
+ };
176
+ /**
177
+ * Parses ideas from Gemini's brainstorm response
178
+ * Extracts idea names, descriptions, and scores
179
+ */
180
+ function parseIdeasFromResponse(response) {
181
+ const ideas = [];
182
+ // Pattern: ### Idea [N]: [Name]
183
+ const ideaPattern = /###\s+Idea\s+\d+:\s*(.+?)\n\*\*Description:\*\*\s*(.+?)(?=\n###|\n\*\*Feasibility|\n---|$)/gis;
184
+ let match;
185
+ while ((match = ideaPattern.exec(response)) !== null) {
186
+ const name = match[1].trim();
187
+ const description = match[2].trim();
188
+ // Try to extract scores
189
+ const feasibilityMatch = response.match(new RegExp(`${name}[\\s\\S]{0,300}\\*\\*Feasibility:\\*\\*\\s*(\\d+)`, 'i'));
190
+ const impactMatch = response.match(new RegExp(`${name}[\\s\\S]{0,300}\\*\\*Impact:\\*\\*\\s*(\\d+)`, 'i'));
191
+ const innovationMatch = response.match(new RegExp(`${name}[\\s\\S]{0,300}\\*\\*Innovation:\\*\\*\\s*(\\d+)`, 'i'));
192
+ ideas.push({
193
+ name,
194
+ description,
195
+ feasibility: feasibilityMatch ? parseInt(feasibilityMatch[1], 10) : undefined,
196
+ impact: impactMatch ? parseInt(impactMatch[1], 10) : undefined,
197
+ innovation: innovationMatch ? parseInt(innovationMatch[1], 10) : undefined
198
+ });
199
+ }
200
+ return ideas;
201
+ }
202
+ //# sourceMappingURL=brainstorm.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brainstorm.tool.js","sourceRoot":"","sources":["../../src/tools/brainstorm.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const fetchChunkTool: UnifiedTool;
3
+ //# sourceMappingURL=fetch-chunk.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-chunk.tool.d.ts","sourceRoot":"","sources":["../../src/tools/fetch-chunk.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C,eAAO,MAAM,cAAc,EAAE,WAoE5B,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { z } from 'zod';
2
+ import { getChunks } from '../utils/chunkCache.js';
3
+ import { formatChangeModeResponse, summarizeChangeModeEdits } from '../utils/changeModeTranslator.js';
4
+ import { Logger } from '../utils/logger.js';
5
+ const inputSchema = z.object({
6
+ cacheKey: z.string().describe("The cache key provided in the initial changeMode response"),
7
+ chunkIndex: z.number().min(1).describe("Which chunk to retrieve (1-based index)")
8
+ });
9
+ export const fetchChunkTool = {
10
+ name: 'fetch-chunk',
11
+ description: 'Retrieves cached chunks from a changeMode response. Use this to get subsequent chunks after receiving a partial changeMode response.',
12
+ zodSchema: inputSchema,
13
+ prompt: {
14
+ description: 'Fetch the next chunk of a response',
15
+ arguments: [
16
+ {
17
+ name: 'prompt',
18
+ description: 'fetch-chunk cacheKey=<key> chunkIndex=<number>',
19
+ required: true
20
+ }
21
+ ]
22
+ },
23
+ category: 'utility',
24
+ execute: async (args, onProgress) => {
25
+ const { cacheKey, chunkIndex } = args;
26
+ Logger.toolInvocation('fetch-chunk', args);
27
+ Logger.debug(`Fetching chunk ${chunkIndex} with cache key: ${cacheKey}`);
28
+ // Retrieve cached chunks
29
+ const chunks = getChunks(cacheKey);
30
+ if (!chunks) {
31
+ return `❌ Cache miss: No chunks found for cache key "${cacheKey}".
32
+
33
+ Possible reasons:
34
+ 1. The cache key is incorrect, Have you ran ask-gemini with changeMode enabled?
35
+ 2. The cache has expired (10 minute TTL)
36
+ 3. The MCP server was restarted and the file-based cache was cleared
37
+
38
+ Please re-run the original changeMode request to regenerate the chunks.`;
39
+ }
40
+ // Validate chunk index
41
+ if (chunkIndex < 1 || chunkIndex > chunks.length) {
42
+ return `❌ Invalid chunk index: ${chunkIndex}
43
+
44
+ Available chunks: 1 to ${chunks.length}
45
+ You requested: ${chunkIndex}
46
+
47
+ Please use a valid chunk index.`;
48
+ }
49
+ // Get the requested chunk
50
+ const chunk = chunks[chunkIndex - 1];
51
+ // Format the response
52
+ let result = formatChangeModeResponse(chunk.edits, { current: chunkIndex, total: chunks.length, cacheKey });
53
+ // Add summary for first chunk
54
+ if (chunkIndex === 1 && chunks.length > 1) {
55
+ const allEdits = chunks.flatMap(c => c.edits);
56
+ result = summarizeChangeModeEdits(allEdits, true) + '\n\n' + result;
57
+ }
58
+ Logger.debug(`Returning chunk ${chunkIndex} of ${chunks.length} with ${chunk.edits.length} edits`);
59
+ return result;
60
+ }
61
+ };
62
+ //# sourceMappingURL=fetch-chunk.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-chunk.tool.js","sourceRoot":"","sources":["../../src/tools/fetch-chunk.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AACtG,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;IAC1F,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;CAClF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,sIAAsI;IAEnJ,SAAS,EAAE,WAAW;IAEtB,MAAM,EAAE;QACN,WAAW,EAAE,oCAAoC;QACjD,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gDAAgD;gBAC7D,QAAQ,EAAE,IAAI;aACf;SACF;KACF;IAED,QAAQ,EAAE,SAAS;IAEnB,OAAO,EAAE,KAAK,EAAE,IAAS,EAAE,UAAwC,EAAmB,EAAE;QACtF,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAEtC,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,kBAAkB,UAAU,oBAAoB,QAAQ,EAAE,CAAC,CAAC;QAEzE,yBAAyB;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,gDAAgD,QAAQ;;;;;;;wEAOG,CAAC;QACrE,CAAC;QAED,uBAAuB;QACvB,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YACjD,OAAO,0BAA0B,UAAU;;yBAExB,MAAM,CAAC,MAAM;iBACrB,UAAU;;gCAEK,CAAC;QAC7B,CAAC;QAED,0BAA0B;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAErC,sBAAsB;QACtB,IAAI,MAAM,GAAG,wBAAwB,CACnC,KAAK,CAAC,KAAK,EACX,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CACxD,CAAC;QAEF,8BAA8B;QAC9B,IAAI,UAAU,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,GAAG,wBAAwB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;QACtE,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,mBAAmB,UAAU,OAAO,MAAM,CAAC,MAAM,SAAS,KAAK,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAEnG,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './registry.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAmBA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,11 @@
1
+ // Tool Registry Index - Registers all tools
2
+ import { toolRegistry } from './registry.js';
3
+ import { askGeminiTool } from './ask-gemini.tool.js';
4
+ import { pingTool, helpTool } from './simple-tools.js';
5
+ import { brainstormTool } from './brainstorm.tool.js';
6
+ import { fetchChunkTool } from './fetch-chunk.tool.js';
7
+ import { timeoutTestTool } from './timeout-test.tool.js';
8
+ import { reviewCodeTool } from './review-code.tool.js';
9
+ toolRegistry.push(askGeminiTool, pingTool, helpTool, brainstormTool, fetchChunkTool, timeoutTestTool, reviewCodeTool);
10
+ export * from './registry.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,YAAY,CAAC,IAAI,CACf,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,cAAc,EACd,eAAe,EACf,cAAc,CACf,CAAC;AAEF,cAAc,eAAe,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { Tool, Prompt } from "@modelcontextprotocol/sdk/types.js";
2
+ import { ToolArguments } from "../constants.js";
3
+ import { ZodTypeAny } from "zod";
4
+ export interface UnifiedTool {
5
+ name: string;
6
+ description: string;
7
+ zodSchema: ZodTypeAny;
8
+ prompt?: {
9
+ description: string;
10
+ arguments?: Array<{
11
+ name: string;
12
+ description: string;
13
+ required: boolean;
14
+ }>;
15
+ };
16
+ execute: (args: ToolArguments, onProgress?: (newOutput: string) => void) => Promise<string>;
17
+ category?: 'simple' | 'gemini' | 'utility';
18
+ }
19
+ export declare const toolRegistry: UnifiedTool[];
20
+ export declare function toolExists(toolName: string): boolean;
21
+ export declare function getToolDefinitions(): Tool[];
22
+ export declare function getPromptDefinitions(): Prompt[];
23
+ export declare function executeTool(toolName: string, args: ToolArguments, onProgress?: (newOutput: string) => void): Promise<string>;
24
+ export declare function getPromptMessage(toolName: string, args: Record<string, any>): string;
25
+ //# sourceMappingURL=registry.d.ts.map