@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.
Files changed (123) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +239 -0
  3. package/dist/__tests__/ask-gemini.test.d.ts +2 -0
  4. package/dist/__tests__/ask-gemini.test.d.ts.map +1 -0
  5. package/dist/__tests__/ask-gemini.test.js +165 -0
  6. package/dist/__tests__/ask-gemini.test.js.map +1 -0
  7. package/dist/__tests__/server.test.d.ts +2 -0
  8. package/dist/__tests__/server.test.d.ts.map +1 -0
  9. package/dist/__tests__/server.test.js +72 -0
  10. package/dist/__tests__/server.test.js.map +1 -0
  11. package/dist/__tests__/tools.test.d.ts +2 -0
  12. package/dist/__tests__/tools.test.d.ts.map +1 -0
  13. package/dist/__tests__/tools.test.js +131 -0
  14. package/dist/__tests__/tools.test.js.map +1 -0
  15. package/dist/__tests__/utils/changeModeChunker.test.d.ts +2 -0
  16. package/dist/__tests__/utils/changeModeChunker.test.d.ts.map +1 -0
  17. package/dist/__tests__/utils/changeModeChunker.test.js +137 -0
  18. package/dist/__tests__/utils/changeModeChunker.test.js.map +1 -0
  19. package/dist/__tests__/utils/changeModeParser.test.d.ts +2 -0
  20. package/dist/__tests__/utils/changeModeParser.test.d.ts.map +1 -0
  21. package/dist/__tests__/utils/changeModeParser.test.js +254 -0
  22. package/dist/__tests__/utils/changeModeParser.test.js.map +1 -0
  23. package/dist/__tests__/utils/changeModeTranslator.test.d.ts +2 -0
  24. package/dist/__tests__/utils/changeModeTranslator.test.d.ts.map +1 -0
  25. package/dist/__tests__/utils/changeModeTranslator.test.js +112 -0
  26. package/dist/__tests__/utils/changeModeTranslator.test.js.map +1 -0
  27. package/dist/__tests__/utils/chunkCache.test.d.ts +2 -0
  28. package/dist/__tests__/utils/chunkCache.test.d.ts.map +1 -0
  29. package/dist/__tests__/utils/chunkCache.test.js +140 -0
  30. package/dist/__tests__/utils/chunkCache.test.js.map +1 -0
  31. package/dist/__tests__/utils/commandExecutor.test.d.ts +2 -0
  32. package/dist/__tests__/utils/commandExecutor.test.d.ts.map +1 -0
  33. package/dist/__tests__/utils/commandExecutor.test.js +139 -0
  34. package/dist/__tests__/utils/commandExecutor.test.js.map +1 -0
  35. package/dist/__tests__/utils/geminiExecutor.test.d.ts +2 -0
  36. package/dist/__tests__/utils/geminiExecutor.test.d.ts.map +1 -0
  37. package/dist/__tests__/utils/geminiExecutor.test.js +337 -0
  38. package/dist/__tests__/utils/geminiExecutor.test.js.map +1 -0
  39. package/dist/__tests__/utils/responseCache.test.d.ts +2 -0
  40. package/dist/__tests__/utils/responseCache.test.d.ts.map +1 -0
  41. package/dist/__tests__/utils/responseCache.test.js +98 -0
  42. package/dist/__tests__/utils/responseCache.test.js.map +1 -0
  43. package/dist/__tests__/utils/test-helpers.d.ts +17 -0
  44. package/dist/__tests__/utils/test-helpers.d.ts.map +1 -0
  45. package/dist/__tests__/utils/test-helpers.js +50 -0
  46. package/dist/__tests__/utils/test-helpers.js.map +1 -0
  47. package/dist/constants.d.ts +96 -0
  48. package/dist/constants.d.ts.map +1 -0
  49. package/dist/constants.js +89 -0
  50. package/dist/constants.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +186 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/tools/ask-gemini.tool.d.ts +3 -0
  56. package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
  57. package/dist/tools/ask-gemini.tool.js +65 -0
  58. package/dist/tools/ask-gemini.tool.js.map +1 -0
  59. package/dist/tools/brainstorm.tool.d.ts +3 -0
  60. package/dist/tools/brainstorm.tool.d.ts.map +1 -0
  61. package/dist/tools/brainstorm.tool.js +147 -0
  62. package/dist/tools/brainstorm.tool.js.map +1 -0
  63. package/dist/tools/fetch-chunk.tool.d.ts +3 -0
  64. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
  65. package/dist/tools/fetch-chunk.tool.js +67 -0
  66. package/dist/tools/fetch-chunk.tool.js.map +1 -0
  67. package/dist/tools/index.d.ts +2 -0
  68. package/dist/tools/index.d.ts.map +1 -0
  69. package/dist/tools/index.js +10 -0
  70. package/dist/tools/index.js.map +1 -0
  71. package/dist/tools/registry.d.ts +43 -0
  72. package/dist/tools/registry.d.ts.map +1 -0
  73. package/dist/tools/registry.js +81 -0
  74. package/dist/tools/registry.js.map +1 -0
  75. package/dist/tools/simple-tools.d.ts +4 -0
  76. package/dist/tools/simple-tools.d.ts.map +1 -0
  77. package/dist/tools/simple-tools.js +42 -0
  78. package/dist/tools/simple-tools.js.map +1 -0
  79. package/dist/tools/test-tool.example.d.ts +13 -0
  80. package/dist/tools/test-tool.example.d.ts.map +1 -0
  81. package/dist/tools/test-tool.example.js +32 -0
  82. package/dist/tools/test-tool.example.js.map +1 -0
  83. package/dist/tools/timeout-test.tool.d.ts +3 -0
  84. package/dist/tools/timeout-test.tool.d.ts.map +1 -0
  85. package/dist/tools/timeout-test.tool.js +36 -0
  86. package/dist/tools/timeout-test.tool.js.map +1 -0
  87. package/dist/utils/changeModeChunker.d.ts +11 -0
  88. package/dist/utils/changeModeChunker.d.ts.map +1 -0
  89. package/dist/utils/changeModeChunker.js +89 -0
  90. package/dist/utils/changeModeChunker.js.map +1 -0
  91. package/dist/utils/changeModeParser.d.ts +15 -0
  92. package/dist/utils/changeModeParser.d.ts.map +1 -0
  93. package/dist/utils/changeModeParser.js +67 -0
  94. package/dist/utils/changeModeParser.js.map +1 -0
  95. package/dist/utils/changeModeTranslator.d.ts +8 -0
  96. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  97. package/dist/utils/changeModeTranslator.js +70 -0
  98. package/dist/utils/changeModeTranslator.js.map +1 -0
  99. package/dist/utils/chunkCache.d.ts +22 -0
  100. package/dist/utils/chunkCache.d.ts.map +1 -0
  101. package/dist/utils/chunkCache.js +161 -0
  102. package/dist/utils/chunkCache.js.map +1 -0
  103. package/dist/utils/commandExecutor.d.ts +2 -0
  104. package/dist/utils/commandExecutor.d.ts.map +1 -0
  105. package/dist/utils/commandExecutor.js +79 -0
  106. package/dist/utils/commandExecutor.js.map +1 -0
  107. package/dist/utils/geminiExecutor.d.ts +17 -0
  108. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  109. package/dist/utils/geminiExecutor.js +238 -0
  110. package/dist/utils/geminiExecutor.js.map +1 -0
  111. package/dist/utils/logger.d.ts +13 -0
  112. package/dist/utils/logger.d.ts.map +1 -0
  113. package/dist/utils/logger.js +42 -0
  114. package/dist/utils/logger.js.map +1 -0
  115. package/dist/utils/responseCache.d.ts +33 -0
  116. package/dist/utils/responseCache.d.ts.map +1 -0
  117. package/dist/utils/responseCache.js +87 -0
  118. package/dist/utils/responseCache.js.map +1 -0
  119. package/dist/utils/timeoutManager.d.ts +2 -0
  120. package/dist/utils/timeoutManager.d.ts.map +1 -0
  121. package/dist/utils/timeoutManager.js +2 -0
  122. package/dist/utils/timeoutManager.js.map +1 -0
  123. package/package.json +79 -0
@@ -0,0 +1,33 @@
1
+ import { GeminiCLIOptions } from './geminiExecutor.js';
2
+ /**
3
+ * Whether LRU response caching is enabled.
4
+ * Opt-in via environment variable GEMINI_CACHE_ENABLED=true.
5
+ * Defaults to false — users must explicitly enable caching.
6
+ */
7
+ export declare const isCacheEnabled: () => boolean;
8
+ /**
9
+ * Generate a cache key from prompt and options
10
+ */
11
+ export declare function generateCacheKey(prompt: string, options: GeminiCLIOptions): string;
12
+ /**
13
+ * Get cached response if available
14
+ */
15
+ export declare function getCachedResponse(cacheKey: string): string | undefined;
16
+ /**
17
+ * Cache a response
18
+ */
19
+ export declare function cacheResponse(cacheKey: string, response: string): void;
20
+ /**
21
+ * Clear the entire cache
22
+ */
23
+ export declare function clearCache(): void;
24
+ /**
25
+ * Get cache statistics
26
+ */
27
+ export declare function getCacheStats(): {
28
+ size: number;
29
+ maxSize: number;
30
+ calculatedSize: number;
31
+ maxCalculatedSize: number;
32
+ };
33
+ //# sourceMappingURL=responseCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseCache.d.ts","sourceRoot":"","sources":["../../src/utils/responseCache.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAAO,OACW,CAAC;AAwB9C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAkBlF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGtE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAGjC;AAED;;GAEG;AACH,wBAAgB,aAAa;;;;;EAO5B"}
@@ -0,0 +1,87 @@
1
+ import { LRUCache } from 'lru-cache';
2
+ import { createHash } from 'crypto';
3
+ import { Logger } from './logger.js';
4
+ /**
5
+ * Whether LRU response caching is enabled.
6
+ * Opt-in via environment variable GEMINI_CACHE_ENABLED=true.
7
+ * Defaults to false — users must explicitly enable caching.
8
+ */
9
+ export const isCacheEnabled = () => process.env.GEMINI_CACHE_ENABLED === 'true';
10
+ /**
11
+ * LRU Cache for Gemini API responses
12
+ * Caches responses to identical prompts with identical options
13
+ *
14
+ * Benefits:
15
+ * - Near-instant responses for repeated queries
16
+ * - Reduces API quota consumption
17
+ * - 30-minute TTL ensures fresh data
18
+ * - 10MB max size prevents memory bloat
19
+ *
20
+ * Disabled by default. Enable via GEMINI_CACHE_ENABLED=true env var.
21
+ */
22
+ const responseCache = new LRUCache({
23
+ max: 100, // Cache up to 100 recent responses
24
+ ttl: 1000 * 60 * 30, // 30 minutes
25
+ maxSize: 10 * 1024 * 1024, // 10MB max cache size
26
+ sizeCalculation: (value) => value.length,
27
+ dispose: (value, key) => {
28
+ Logger.debug(`Cache evicted: ${key.substring(0, 16)}...`);
29
+ }
30
+ });
31
+ /**
32
+ * Generate a cache key from prompt and options
33
+ */
34
+ export function generateCacheKey(prompt, options) {
35
+ // Create deterministic hash of prompt + options
36
+ const cacheInput = JSON.stringify({
37
+ prompt,
38
+ model: options.model,
39
+ sandbox: options.sandbox,
40
+ changeMode: options.changeMode,
41
+ yolo: options.yolo,
42
+ approvalMode: options.approvalMode,
43
+ outputFormat: options.outputFormat,
44
+ includeDirectories: options.includeDirectories,
45
+ debug: options.debug,
46
+ promptInteractive: options.promptInteractive,
47
+ extensions: options.extensions,
48
+ resume: options.resume
49
+ });
50
+ return createHash('sha256').update(cacheInput).digest('hex');
51
+ }
52
+ /**
53
+ * Get cached response if available
54
+ */
55
+ export function getCachedResponse(cacheKey) {
56
+ const cached = responseCache.get(cacheKey);
57
+ if (cached) {
58
+ Logger.debug(`Cache hit: ${cacheKey.substring(0, 16)}...`);
59
+ }
60
+ return cached;
61
+ }
62
+ /**
63
+ * Cache a response
64
+ */
65
+ export function cacheResponse(cacheKey, response) {
66
+ responseCache.set(cacheKey, response);
67
+ Logger.debug(`Cached response: ${cacheKey.substring(0, 16)}... (${response.length} bytes)`);
68
+ }
69
+ /**
70
+ * Clear the entire cache
71
+ */
72
+ export function clearCache() {
73
+ responseCache.clear();
74
+ Logger.debug('Response cache cleared');
75
+ }
76
+ /**
77
+ * Get cache statistics
78
+ */
79
+ export function getCacheStats() {
80
+ return {
81
+ size: responseCache.size,
82
+ maxSize: responseCache.max,
83
+ calculatedSize: responseCache.calculatedSize,
84
+ maxCalculatedSize: responseCache.maxSize
85
+ };
86
+ }
87
+ //# sourceMappingURL=responseCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseCache.js","sourceRoot":"","sources":["../../src/utils/responseCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAY,EAAE,CAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM,CAAC;AAE9C;;;;;;;;;;;GAWG;AACH,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAiB;IACjD,GAAG,EAAE,GAAG,EAAG,mCAAmC;IAC9C,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,EAAG,aAAa;IACnC,OAAO,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAG,sBAAsB;IAClD,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM;IACxC,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAAyB;IACxE,gDAAgD;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,MAAM;QACN,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,cAAc,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,QAAgB;IAC9D,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,CAAC,KAAK,CAAC,oBAAoB,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,QAAQ,CAAC,MAAM,SAAS,CAAC,CAAC;AAC9F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,aAAa,CAAC,KAAK,EAAE,CAAC;IACtB,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,aAAa,CAAC,IAAI;QACxB,OAAO,EAAE,aAAa,CAAC,GAAG;QAC1B,cAAc,EAAE,aAAa,CAAC,cAAc;QAC5C,iBAAiB,EAAE,aAAa,CAAC,OAAO;KACzC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=timeoutManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeoutManager.d.ts","sourceRoot":"","sources":["../../src/utils/timeoutManager.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=timeoutManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeoutManager.js","sourceRoot":"","sources":["../../src/utils/timeoutManager.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "@joeytheman/gemini-mcp-tool",
3
+ "version": "1.3.0",
4
+ "description": "MCP server for Gemini CLI integration",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "gemini-mcp": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "start": "node dist/index.js",
13
+ "dev": "tsc && node dist/index.js",
14
+ "test": "vitest run",
15
+ "test:watch": "vitest watch",
16
+ "test:coverage": "vitest run --coverage",
17
+ "lint": "tsc --noEmit",
18
+ "contribute": "tsx src/contribute.ts",
19
+ "prepare": "npm run build",
20
+ "prepublishOnly": "echo '⚠️ Remember to test locally first!' && npm run build",
21
+ "docs:dev": "vitepress dev docs",
22
+ "docs:build": "vitepress build docs",
23
+ "docs:preview": "vitepress preview docs"
24
+ },
25
+ "keywords": [
26
+ "mcp",
27
+ "modelcontextprotocol",
28
+ "gemini",
29
+ "cli",
30
+ "ai",
31
+ "llm"
32
+ ],
33
+ "author": "joeytheman",
34
+ "license": "SEE LICENSE IN LICENSE",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/joeytheman/gemini-mcp-tool.git"
38
+ },
39
+ "bugs": {
40
+ "url": "https://github.com/joeytheman/gemini-mcp-tool/issues"
41
+ },
42
+ "homepage": "https://github.com/joeytheman/gemini-mcp-tool#readme",
43
+ "engines": {
44
+ "node": ">=18.0.0"
45
+ },
46
+ "files": [
47
+ "dist/",
48
+ "README.md",
49
+ "LICENSE"
50
+ ],
51
+ "dependencies": {
52
+ "@modelcontextprotocol/sdk": "^1.25.3",
53
+ "chalk": "^5.0.0",
54
+ "d3-shape": "^3.2.0",
55
+ "inquirer": "^9.0.0",
56
+ "lru-cache": "^11.2.4",
57
+ "prismjs": "^1.30.0",
58
+ "zod": "^3.25.76",
59
+ "zod-to-json-schema": "^3.24.6"
60
+ },
61
+ "devDependencies": {
62
+ "@types/inquirer": "^9.0.0",
63
+ "@types/node": "^20.0.0",
64
+ "@vitest/coverage-v8": "^2.1.8",
65
+ "archiver": "^7.0.1",
66
+ "mermaid": "^11.12.2",
67
+ "tsx": "^4.0.0",
68
+ "typescript": "^5.0.0",
69
+ "vitepress": "^1.6.4",
70
+ "vitepress-plugin-mermaid": "^2.0.17",
71
+ "vitest": "^2.1.8"
72
+ },
73
+ "publishConfig": {
74
+ "access": "public"
75
+ },
76
+ "overrides": {
77
+ "esbuild": ">=0.25.0"
78
+ }
79
+ }