better-gemini-mcp 1.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.

Potentially problematic release.


This version of better-gemini-mcp might be problematic. Click here for more details.

Files changed (88) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/LICENSE.md +13 -0
  3. package/README.md +291 -0
  4. package/dist/constants.d.ts +148 -0
  5. package/dist/constants.d.ts.map +1 -0
  6. package/dist/constants.js +295 -0
  7. package/dist/constants.js.map +1 -0
  8. package/dist/index.d.ts +11 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +280 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/setup/index.d.ts +7 -0
  13. package/dist/setup/index.d.ts.map +1 -0
  14. package/dist/setup/index.js +6 -0
  15. package/dist/setup/index.js.map +1 -0
  16. package/dist/setup/wizard.d.ts +39 -0
  17. package/dist/setup/wizard.d.ts.map +1 -0
  18. package/dist/setup/wizard.js +222 -0
  19. package/dist/setup/wizard.js.map +1 -0
  20. package/dist/tools/analyze-directory.tool.d.ts +8 -0
  21. package/dist/tools/analyze-directory.tool.d.ts.map +1 -0
  22. package/dist/tools/analyze-directory.tool.js +195 -0
  23. package/dist/tools/analyze-directory.tool.js.map +1 -0
  24. package/dist/tools/deep-research.tool.d.ts +8 -0
  25. package/dist/tools/deep-research.tool.d.ts.map +1 -0
  26. package/dist/tools/deep-research.tool.js +153 -0
  27. package/dist/tools/deep-research.tool.js.map +1 -0
  28. package/dist/tools/fetch-chunk.tool.d.ts +8 -0
  29. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
  30. package/dist/tools/fetch-chunk.tool.js +123 -0
  31. package/dist/tools/fetch-chunk.tool.js.map +1 -0
  32. package/dist/tools/health-check.tool.d.ts +8 -0
  33. package/dist/tools/health-check.tool.d.ts.map +1 -0
  34. package/dist/tools/health-check.tool.js +113 -0
  35. package/dist/tools/health-check.tool.js.map +1 -0
  36. package/dist/tools/index.d.ts +16 -0
  37. package/dist/tools/index.d.ts.map +1 -0
  38. package/dist/tools/index.js +35 -0
  39. package/dist/tools/index.js.map +1 -0
  40. package/dist/tools/quick-query.tool.d.ts +8 -0
  41. package/dist/tools/quick-query.tool.d.ts.map +1 -0
  42. package/dist/tools/quick-query.tool.js +154 -0
  43. package/dist/tools/quick-query.tool.js.map +1 -0
  44. package/dist/tools/registry.d.ts +52 -0
  45. package/dist/tools/registry.d.ts.map +1 -0
  46. package/dist/tools/registry.js +95 -0
  47. package/dist/tools/registry.js.map +1 -0
  48. package/dist/tools/validate-paths.tool.d.ts +8 -0
  49. package/dist/tools/validate-paths.tool.d.ts.map +1 -0
  50. package/dist/tools/validate-paths.tool.js +64 -0
  51. package/dist/tools/validate-paths.tool.js.map +1 -0
  52. package/dist/types.d.ts +221 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +5 -0
  55. package/dist/types.js.map +1 -0
  56. package/dist/utils/commandExecutor.d.ts +28 -0
  57. package/dist/utils/commandExecutor.d.ts.map +1 -0
  58. package/dist/utils/commandExecutor.js +105 -0
  59. package/dist/utils/commandExecutor.js.map +1 -0
  60. package/dist/utils/geminiExecutor.d.ts +71 -0
  61. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  62. package/dist/utils/geminiExecutor.js +281 -0
  63. package/dist/utils/geminiExecutor.js.map +1 -0
  64. package/dist/utils/ignorePatterns.d.ts +69 -0
  65. package/dist/utils/ignorePatterns.d.ts.map +1 -0
  66. package/dist/utils/ignorePatterns.js +178 -0
  67. package/dist/utils/ignorePatterns.js.map +1 -0
  68. package/dist/utils/index.d.ts +11 -0
  69. package/dist/utils/index.d.ts.map +1 -0
  70. package/dist/utils/index.js +18 -0
  71. package/dist/utils/index.js.map +1 -0
  72. package/dist/utils/logger.d.ts +39 -0
  73. package/dist/utils/logger.d.ts.map +1 -0
  74. package/dist/utils/logger.js +160 -0
  75. package/dist/utils/logger.js.map +1 -0
  76. package/dist/utils/pathValidator.d.ts +55 -0
  77. package/dist/utils/pathValidator.d.ts.map +1 -0
  78. package/dist/utils/pathValidator.js +137 -0
  79. package/dist/utils/pathValidator.js.map +1 -0
  80. package/dist/utils/responseCache.d.ts +80 -0
  81. package/dist/utils/responseCache.d.ts.map +1 -0
  82. package/dist/utils/responseCache.js +179 -0
  83. package/dist/utils/responseCache.js.map +1 -0
  84. package/dist/utils/responseChunker.d.ts +36 -0
  85. package/dist/utils/responseChunker.d.ts.map +1 -0
  86. package/dist/utils/responseChunker.js +96 -0
  87. package/dist/utils/responseChunker.js.map +1 -0
  88. package/package.json +62 -0
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Fetch Chunk Tool
3
+ * Retrieve a specific chunk of a large response that was previously split
4
+ * (PRD §5.7)
5
+ */
6
+ import { z } from "zod";
7
+ import { ERROR_CODES, ERROR_MESSAGES } from "../constants.js";
8
+ import { getResponse, getChunk, getCacheMetadata, Logger } from "../utils/index.js";
9
+ // ============================================================================
10
+ // Schema
11
+ // ============================================================================
12
+ const fetchChunkSchema = z.object({
13
+ cacheKey: z.string().describe("Cache key returned in initial chunked response"),
14
+ chunkIndex: z
15
+ .number()
16
+ .int()
17
+ .positive()
18
+ .describe("1-based index of chunk to retrieve"),
19
+ });
20
+ // ============================================================================
21
+ // Tool Implementation
22
+ // ============================================================================
23
+ export const fetchChunkTool = {
24
+ name: "fetch_chunk",
25
+ description: "Retrieve continuation of a large response. Use when a previous tool response included 'chunks' metadata indicating more content available. Example: {cacheKey: 'cache_abc123', chunkIndex: 2}",
26
+ zodSchema: fetchChunkSchema,
27
+ category: "utility",
28
+ execute: async (args, _onProgress) => {
29
+ const { cacheKey, chunkIndex } = args;
30
+ Logger.info(`fetch_chunk: Fetching chunk ${chunkIndex} for cacheKey=${cacheKey}`);
31
+ // Validate cacheKey
32
+ if (!cacheKey || typeof cacheKey !== "string") {
33
+ return JSON.stringify({
34
+ error: {
35
+ code: ERROR_CODES.INVALID_ARGUMENT,
36
+ message: "cacheKey must be a non-empty string",
37
+ details: { field: "cacheKey" },
38
+ },
39
+ }, null, 2);
40
+ }
41
+ // Validate chunkIndex
42
+ if (!Number.isInteger(chunkIndex) || chunkIndex < 1) {
43
+ return JSON.stringify({
44
+ error: {
45
+ code: ERROR_CODES.INVALID_ARGUMENT,
46
+ message: "chunkIndex must be a positive integer (1-based)",
47
+ details: { field: "chunkIndex", provided: chunkIndex },
48
+ },
49
+ }, null, 2);
50
+ }
51
+ // Check if cache entry exists
52
+ const cacheEntry = getResponse(cacheKey);
53
+ if (!cacheEntry) {
54
+ Logger.warn(`fetch_chunk: Cache key not found or expired: ${cacheKey}`);
55
+ return JSON.stringify({
56
+ error: {
57
+ code: ERROR_CODES.CACHE_EXPIRED,
58
+ message: ERROR_MESSAGES.CACHE_EXPIRED,
59
+ details: {
60
+ cacheKey,
61
+ nextStep: "Cache expired (1-hour TTL). Re-run the original query to regenerate the response.",
62
+ },
63
+ },
64
+ }, null, 2);
65
+ }
66
+ // Get cache metadata for total chunks
67
+ const metadata = getCacheMetadata(cacheKey);
68
+ if (!metadata) {
69
+ return JSON.stringify({
70
+ error: {
71
+ code: ERROR_CODES.CACHE_EXPIRED,
72
+ message: ERROR_MESSAGES.CACHE_EXPIRED,
73
+ details: {
74
+ cacheKey,
75
+ nextStep: "Cache expired (1-hour TTL). Re-run the original query to regenerate the response.",
76
+ },
77
+ },
78
+ }, null, 2);
79
+ }
80
+ // Validate chunk index is within range
81
+ if (chunkIndex > metadata.totalChunks) {
82
+ Logger.warn(`fetch_chunk: Chunk index ${chunkIndex} out of range (total: ${metadata.totalChunks})`);
83
+ return JSON.stringify({
84
+ error: {
85
+ code: ERROR_CODES.INVALID_CHUNK_INDEX,
86
+ message: ERROR_MESSAGES.INVALID_CHUNK_INDEX,
87
+ details: {
88
+ requestedIndex: chunkIndex,
89
+ totalChunks: metadata.totalChunks,
90
+ nextStep: `Request a chunk index between 1 and ${metadata.totalChunks}`,
91
+ },
92
+ },
93
+ }, null, 2);
94
+ }
95
+ // Get the specific chunk
96
+ const chunk = getChunk(cacheKey, chunkIndex);
97
+ if (!chunk) {
98
+ return JSON.stringify({
99
+ error: {
100
+ code: ERROR_CODES.INTERNAL,
101
+ message: "Failed to retrieve chunk from cache",
102
+ details: { cacheKey, chunkIndex },
103
+ },
104
+ }, null, 2);
105
+ }
106
+ // Build response
107
+ const response = {
108
+ tool: "fetch_chunk",
109
+ cacheKey,
110
+ chunk: {
111
+ index: chunkIndex,
112
+ total: metadata.totalChunks,
113
+ content: chunk.content,
114
+ },
115
+ meta: {
116
+ expiresAt: metadata.expiresAt.toISOString(),
117
+ },
118
+ };
119
+ Logger.info(`fetch_chunk: Successfully retrieved chunk ${chunkIndex}/${metadata.totalChunks}`);
120
+ return JSON.stringify(response, null, 2);
121
+ },
122
+ };
123
+ //# 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":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Health Check Tool
3
+ * Confirm the MCP server is running and validate Gemini CLI setup
4
+ * (PRD §5.6)
5
+ */
6
+ import type { UnifiedTool } from "./registry.js";
7
+ export declare const healthCheckTool: UnifiedTool;
8
+ //# sourceMappingURL=health-check.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-check.tool.d.ts","sourceRoot":"","sources":["../../src/tools/health-check.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA2BjD,eAAO,MAAM,eAAe,EAAE,WA8G7B,CAAC"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Health Check Tool
3
+ * Confirm the MCP server is running and validate Gemini CLI setup
4
+ * (PRD §5.6)
5
+ */
6
+ import { z } from "zod";
7
+ import { SERVER_INFO, ERROR_CODES } from "../constants.js";
8
+ import { isGeminiCLIInstalled, getGeminiVersion, checkGeminiAuth, getProjectRoot, Logger, } from "../utils/index.js";
9
+ // ============================================================================
10
+ // Schema
11
+ // ============================================================================
12
+ const healthCheckSchema = z.object({
13
+ includeDiagnostics: z
14
+ .boolean()
15
+ .optional()
16
+ .default(false)
17
+ .describe("Include detailed diagnostics (Gemini CLI version, auth status, etc.)"),
18
+ });
19
+ // ============================================================================
20
+ // Tool Implementation
21
+ // ============================================================================
22
+ export const healthCheckTool = {
23
+ name: "health_check",
24
+ description: "Verify server status and Gemini CLI configuration. Use for troubleshooting connection issues or confirming setup. Example: {includeDiagnostics: true}",
25
+ zodSchema: healthCheckSchema,
26
+ category: "utility",
27
+ execute: async (args, _onProgress) => {
28
+ const { includeDiagnostics } = args;
29
+ const projectRoot = getProjectRoot();
30
+ Logger.info(`health_check: Starting with includeDiagnostics=${includeDiagnostics}`);
31
+ // Basic health check - just verify the server is running
32
+ const baseResponse = {
33
+ tool: "health_check",
34
+ status: "ok",
35
+ server: {
36
+ name: SERVER_INFO.NAME,
37
+ version: SERVER_INFO.VERSION,
38
+ },
39
+ };
40
+ // If diagnostics not requested, return basic response
41
+ if (!includeDiagnostics) {
42
+ Logger.info("health_check: Basic check completed successfully");
43
+ return JSON.stringify(baseResponse, null, 2);
44
+ }
45
+ // Run diagnostics
46
+ Logger.debug("health_check: Running diagnostics...");
47
+ try {
48
+ // Check Gemini CLI installation
49
+ const geminiOnPath = await isGeminiCLIInstalled();
50
+ // Get version if installed
51
+ let geminiVersion = null;
52
+ if (geminiOnPath) {
53
+ geminiVersion = await getGeminiVersion();
54
+ }
55
+ // Check authentication
56
+ let authConfigured = false;
57
+ let authMethod;
58
+ if (geminiOnPath) {
59
+ const auth = await checkGeminiAuth();
60
+ authConfigured = auth.configured;
61
+ authMethod = auth.method;
62
+ }
63
+ // Build diagnostics response
64
+ const diagnostics = {
65
+ projectRoot,
66
+ geminiOnPath,
67
+ geminiVersion,
68
+ authConfigured,
69
+ readOnlyModeEnforced: true, // We never use --yolo flag
70
+ };
71
+ // Add auth method if available
72
+ if (authMethod) {
73
+ diagnostics.authMethod = authMethod;
74
+ }
75
+ // Add warnings if there are issues
76
+ const warnings = [];
77
+ if (!geminiOnPath) {
78
+ warnings.push("Gemini CLI not found on PATH. Install with: npm install -g @google/gemini-cli");
79
+ }
80
+ if (geminiOnPath && !authConfigured) {
81
+ warnings.push("Gemini CLI authentication not configured. Run 'gemini' and select 'Login with Google'.");
82
+ }
83
+ if (warnings.length > 0) {
84
+ diagnostics.warnings = warnings;
85
+ }
86
+ // Determine overall status
87
+ const status = geminiOnPath && authConfigured ? "ok" : "degraded";
88
+ const response = {
89
+ tool: "health_check",
90
+ status,
91
+ server: {
92
+ name: SERVER_INFO.NAME,
93
+ version: SERVER_INFO.VERSION,
94
+ },
95
+ diagnostics,
96
+ };
97
+ Logger.info(`health_check: Diagnostics completed - status=${status}`);
98
+ return JSON.stringify(response, null, 2);
99
+ }
100
+ catch (error) {
101
+ const errorMessage = error instanceof Error ? error.message : String(error);
102
+ Logger.error(`health_check: Diagnostics failed - ${errorMessage}`);
103
+ return JSON.stringify({
104
+ error: {
105
+ code: ERROR_CODES.INTERNAL,
106
+ message: `Health check failed: ${errorMessage}`,
107
+ details: { phase: "diagnostics" },
108
+ },
109
+ }, null, 2);
110
+ }
111
+ },
112
+ };
113
+ //# sourceMappingURL=health-check.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-check.tool.js","sourceRoot":"","sources":["../../src/tools/health-check.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Tool Registry Exports for Better Gemini MCP Server
3
+ *
4
+ * This file registers all tools and exports registry functions.
5
+ * Tools are imported and added to the toolRegistry array here.
6
+ */
7
+ import { toolRegistry } from "./registry.js";
8
+ export * from "./registry.js";
9
+ export { toolRegistry };
10
+ export { quickQueryTool } from "./quick-query.tool.js";
11
+ export { deepResearchTool } from "./deep-research.tool.js";
12
+ export { analyzeDirectoryTool } from "./analyze-directory.tool.js";
13
+ export { validatePathsTool } from "./validate-paths.tool.js";
14
+ export { healthCheckTool } from "./health-check.tool.js";
15
+ export { fetchChunkTool } from "./fetch-chunk.tool.js";
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AA+B7C,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAE,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Tool Registry Exports for Better Gemini MCP Server
3
+ *
4
+ * This file registers all tools and exports registry functions.
5
+ * Tools are imported and added to the toolRegistry array here.
6
+ */
7
+ import { toolRegistry } from "./registry.js";
8
+ // ============================================================================
9
+ // Tool Imports
10
+ // ============================================================================
11
+ import { quickQueryTool } from "./quick-query.tool.js";
12
+ import { deepResearchTool } from "./deep-research.tool.js";
13
+ import { analyzeDirectoryTool } from "./analyze-directory.tool.js";
14
+ import { validatePathsTool } from "./validate-paths.tool.js";
15
+ import { healthCheckTool } from "./health-check.tool.js";
16
+ import { fetchChunkTool } from "./fetch-chunk.tool.js";
17
+ // ============================================================================
18
+ // Tool Registration
19
+ // ============================================================================
20
+ toolRegistry.push(quickQueryTool, deepResearchTool, analyzeDirectoryTool, validatePathsTool, healthCheckTool, fetchChunkTool);
21
+ // ============================================================================
22
+ // Exports
23
+ // ============================================================================
24
+ // Re-export everything from registry
25
+ export * from "./registry.js";
26
+ // Export the registry for direct access if needed
27
+ export { toolRegistry };
28
+ // Export individual tools for direct access
29
+ export { quickQueryTool } from "./quick-query.tool.js";
30
+ export { deepResearchTool } from "./deep-research.tool.js";
31
+ export { analyzeDirectoryTool } from "./analyze-directory.tool.js";
32
+ export { validatePathsTool } from "./validate-paths.tool.js";
33
+ export { healthCheckTool } from "./health-check.tool.js";
34
+ export { fetchChunkTool } from "./fetch-chunk.tool.js";
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,YAAY,CAAC,IAAI,CACf,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,cAAc,CACf,CAAC;AAEF,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,qCAAqC;AACrC,cAAc,eAAe,CAAC;AAE9B,kDAAkD;AAClD,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,4CAA4C;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Quick Query Tool
3
+ * Send a lightweight research prompt to Gemini CLI for fast analysis
4
+ * Uses flash model for speed (PRD §5.2)
5
+ */
6
+ import type { UnifiedTool } from "./registry.js";
7
+ export declare const quickQueryTool: UnifiedTool;
8
+ //# sourceMappingURL=quick-query.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-query.tool.d.ts","sourceRoot":"","sources":["../../src/tools/quick-query.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAwDjD,eAAO,MAAM,cAAc,EAAE,WAuI5B,CAAC"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Quick Query Tool
3
+ * Send a lightweight research prompt to Gemini CLI for fast analysis
4
+ * Uses flash model for speed (PRD §5.2)
5
+ */
6
+ import { z } from "zod";
7
+ import { ERROR_CODES, ERROR_MESSAGES } from "../constants.js";
8
+ import { executeGeminiCLI, getProjectRoot, checkPromptPathsValid, chunkResponse, needsChunking, cacheResponse, Logger, } from "../utils/index.js";
9
+ // ============================================================================
10
+ // Schema
11
+ // ============================================================================
12
+ const quickQuerySchema = z.object({
13
+ prompt: z.string().describe("Research question or analysis request"),
14
+ focus: z
15
+ .enum(["security", "architecture", "performance", "general"])
16
+ .optional()
17
+ .describe("Optional focus area to guide analysis"),
18
+ responseStyle: z
19
+ .enum(["concise", "normal", "detailed"])
20
+ .optional()
21
+ .default("normal")
22
+ .describe("Desired verbosity of response"),
23
+ });
24
+ // ============================================================================
25
+ // Focus Area Instructions
26
+ // ============================================================================
27
+ const FOCUS_INSTRUCTIONS = {
28
+ security: "Focus on security implications, vulnerabilities, attack vectors, and security best practices.",
29
+ architecture: "Focus on architectural patterns, design decisions, component relationships, and structural concerns.",
30
+ performance: "Focus on performance characteristics, bottlenecks, optimization opportunities, and efficiency.",
31
+ general: "", // No additional focus instructions
32
+ };
33
+ // ============================================================================
34
+ // Response Style Instructions
35
+ // ============================================================================
36
+ const STYLE_INSTRUCTIONS = {
37
+ concise: "Provide a brief, focused response with only essential information.",
38
+ normal: "Provide a balanced response with key details and explanations.",
39
+ detailed: "Provide a comprehensive response with thorough analysis and examples.",
40
+ };
41
+ // ============================================================================
42
+ // Tool Implementation
43
+ // ============================================================================
44
+ export const quickQueryTool = {
45
+ name: "quick_query",
46
+ description: "Analyze code/files quickly using Gemini's large context window. Preferred when questions mention specific files or require reading repository code. Example: {prompt: 'Explain @src/auth.ts security approach', focus: 'security', responseStyle: 'concise'}",
47
+ zodSchema: quickQuerySchema,
48
+ category: "query",
49
+ execute: async (args, onProgress) => {
50
+ const startTime = Date.now();
51
+ const { prompt, focus, responseStyle } = args;
52
+ const projectRoot = getProjectRoot();
53
+ Logger.info(`quick_query: Starting with focus=${focus || "none"}, style=${responseStyle || "normal"}`);
54
+ // Validate prompt
55
+ if (!prompt || prompt.trim().length === 0) {
56
+ return JSON.stringify({
57
+ error: {
58
+ code: ERROR_CODES.INVALID_ARGUMENT,
59
+ message: ERROR_MESSAGES.NO_PROMPT_PROVIDED,
60
+ details: { field: "prompt" },
61
+ },
62
+ }, null, 2);
63
+ }
64
+ // Pre-validate @path references (optional but recommended)
65
+ const pathValidation = checkPromptPathsValid(prompt, projectRoot);
66
+ if (!pathValidation.isValid) {
67
+ return JSON.stringify({
68
+ error: {
69
+ code: ERROR_CODES.PATH_NOT_ALLOWED,
70
+ message: "Invalid @path references in prompt",
71
+ details: {
72
+ invalidPaths: pathValidation.invalidPaths,
73
+ nextStep: "Use validate_paths tool to check which paths are accessible, or adjust paths to be within project root",
74
+ },
75
+ },
76
+ }, null, 2);
77
+ }
78
+ // Build the full prompt with focus and style instructions
79
+ let fullPrompt = prompt;
80
+ if (focus && focus !== "general") {
81
+ fullPrompt = `${FOCUS_INSTRUCTIONS[focus]}\n\n${fullPrompt}`;
82
+ }
83
+ if (responseStyle && responseStyle !== "normal") {
84
+ fullPrompt = `${STYLE_INSTRUCTIONS[responseStyle]}\n\n${fullPrompt}`;
85
+ }
86
+ try {
87
+ // Execute Gemini CLI
88
+ const result = await executeGeminiCLI(fullPrompt, "quick_query", onProgress);
89
+ // Handle chunking if needed
90
+ let answer = result.answer;
91
+ let chunks;
92
+ if (needsChunking(result.answer)) {
93
+ const chunked = chunkResponse(result.answer);
94
+ const cacheKey = cacheResponse(chunked);
95
+ chunks = { cacheKey, current: 1, total: chunked.length };
96
+ answer = chunked[0].content;
97
+ Logger.debug(`quick_query: Response chunked into ${chunked.length} chunks, cacheKey=${cacheKey}`);
98
+ }
99
+ const latencyMs = Date.now() - startTime;
100
+ // Build response
101
+ const response = {
102
+ tool: "quick_query",
103
+ model: result.model,
104
+ focus: focus || "general",
105
+ responseStyle: responseStyle || "normal",
106
+ answer,
107
+ filesAccessed: result.filesAccessed,
108
+ stats: {
109
+ tokensUsed: result.stats.tokensUsed,
110
+ toolCalls: result.stats.toolCalls,
111
+ latencyMs,
112
+ },
113
+ ...(chunks && { chunks }),
114
+ meta: {
115
+ projectRoot,
116
+ truncated: false,
117
+ warnings: chunks ? ["Response chunked due to size. Use fetch_chunk tool to retrieve remaining content."] : [],
118
+ },
119
+ };
120
+ Logger.info(`quick_query: Completed in ${latencyMs}ms`);
121
+ return JSON.stringify(response, null, 2);
122
+ }
123
+ catch (error) {
124
+ const errorMessage = error instanceof Error ? error.message : String(error);
125
+ Logger.error(`quick_query: Failed - ${errorMessage}`);
126
+ // Determine error code and provide recovery hints
127
+ let code = ERROR_CODES.GEMINI_CLI_ERROR;
128
+ let nextStep = "Check server logs for details";
129
+ if (errorMessage.includes("not found") || errorMessage.includes("ENOENT")) {
130
+ code = ERROR_CODES.GEMINI_CLI_NOT_FOUND;
131
+ nextStep = "Install Gemini CLI: npm install -g @google/gemini-cli, or run setup wizard: npx better-gemini-mcp init";
132
+ }
133
+ else if (errorMessage.includes("auth") || errorMessage.includes("login")) {
134
+ code = ERROR_CODES.AUTH_MISSING;
135
+ nextStep = "Authenticate Gemini CLI: run 'gemini' and select 'Login with Google', or set GEMINI_API_KEY environment variable";
136
+ }
137
+ else if (errorMessage.includes("quota")) {
138
+ code = ERROR_CODES.QUOTA_EXCEEDED;
139
+ nextStep = "Quota exhausted after fallback. Wait for quota reset or upgrade plan. Consider using quick_query for lighter tasks.";
140
+ }
141
+ return JSON.stringify({
142
+ error: {
143
+ code,
144
+ message: errorMessage,
145
+ details: {
146
+ tool: "quick_query",
147
+ nextStep,
148
+ },
149
+ },
150
+ }, null, 2);
151
+ }
152
+ },
153
+ };
154
+ //# sourceMappingURL=quick-query.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-query.tool.js","sourceRoot":"","sources":["../../src/tools/quick-query.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Tool Registry for Better Gemini MCP Server
3
+ * Defines the UnifiedTool interface and provides tool execution functionality
4
+ */
5
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
6
+ import type { ZodTypeAny } from "zod";
7
+ import type { ToolArguments, ProgressCallback } from "../types.js";
8
+ /**
9
+ * Unified tool definition interface
10
+ * Each tool in the registry follows this structure
11
+ */
12
+ export interface UnifiedTool {
13
+ /** Tool name (snake_case, e.g., 'quick_query') */
14
+ name: string;
15
+ /** Human-readable description for MCP tools/list */
16
+ description: string;
17
+ /** Zod schema for input validation */
18
+ zodSchema: ZodTypeAny;
19
+ /** Execute the tool with validated arguments */
20
+ execute: (args: ToolArguments, onProgress?: ProgressCallback) => Promise<string>;
21
+ /** Optional category for grouping */
22
+ category?: "query" | "utility";
23
+ }
24
+ /**
25
+ * Registry of all available tools
26
+ * Tools are added to this array in src/tools/index.ts
27
+ */
28
+ export declare const toolRegistry: UnifiedTool[];
29
+ /**
30
+ * Check if a tool exists in the registry
31
+ */
32
+ export declare function toolExists(toolName: string): boolean;
33
+ /**
34
+ * Get MCP Tool definitions from the registry
35
+ * Converts Zod schemas to JSON Schema format for MCP protocol
36
+ */
37
+ export declare function getToolDefinitions(): Tool[];
38
+ /**
39
+ * Execute a tool by name with the given arguments
40
+ * Validates arguments against the tool's Zod schema before execution
41
+ */
42
+ export declare function executeTool(toolName: string, args: ToolArguments, onProgress?: ProgressCallback): Promise<string>;
43
+ /**
44
+ * Get a tool by name from the registry
45
+ */
46
+ export declare function getTool(toolName: string): UnifiedTool | undefined;
47
+ /**
48
+ * Register a new tool in the registry
49
+ * This is an alternative to directly pushing to toolRegistry
50
+ */
51
+ export declare function registerTool(tool: UnifiedTool): void;
52
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,KAAK,CAAC;AAEhD,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAMnE;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IAEb,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IAEpB,sCAAsC;IACtC,SAAS,EAAE,UAAU,CAAC;IAEtB,gDAAgD;IAChD,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAEjF,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAMD;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,WAAW,EAAO,CAAC;AAM9C;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,EAAE,CAsB3C;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,EACnB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAcD;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEjE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAKpD"}