@houtini/gemini-mcp 1.4.5 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/README.md +314 -834
  2. package/claude_desktop_config_example.json +1 -0
  3. package/dist/config/index.d.ts.map +1 -1
  4. package/dist/config/index.js +8 -4
  5. package/dist/config/index.js.map +1 -1
  6. package/dist/config/types.d.ts +5 -0
  7. package/dist/config/types.d.ts.map +1 -1
  8. package/dist/image-viewer/image-viewer-app.html +180 -0
  9. package/dist/image-viewer/src/ui/image-viewer.html +324 -0
  10. package/dist/index-new.d.ts +3 -0
  11. package/dist/index-new.d.ts.map +1 -0
  12. package/dist/index-new.js +7 -0
  13. package/dist/index-new.js.map +1 -0
  14. package/dist/index.d.ts +3 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +70 -172
  17. package/dist/index.js.map +1 -1
  18. package/dist/landing-page-viewer/src/ui/landing-page-viewer.html +330 -0
  19. package/dist/services/gemini/export.d.ts +5 -0
  20. package/dist/services/gemini/export.d.ts.map +1 -0
  21. package/dist/services/gemini/export.js +5 -0
  22. package/dist/services/gemini/export.js.map +1 -0
  23. package/dist/services/gemini/image-service.d.ts +45 -0
  24. package/dist/services/gemini/image-service.d.ts.map +1 -0
  25. package/dist/services/gemini/image-service.js +248 -0
  26. package/dist/services/gemini/image-service.js.map +1 -0
  27. package/dist/services/gemini/index.d.ts +7 -2
  28. package/dist/services/gemini/index.d.ts.map +1 -1
  29. package/dist/services/gemini/index.js +132 -56
  30. package/dist/services/gemini/index.js.map +1 -1
  31. package/dist/services/gemini/types.d.ts +32 -0
  32. package/dist/services/gemini/types.d.ts.map +1 -1
  33. package/dist/services/gemini/video-service.d.ts +58 -0
  34. package/dist/services/gemini/video-service.d.ts.map +1 -0
  35. package/dist/services/gemini/video-service.js +325 -0
  36. package/dist/services/gemini/video-service.js.map +1 -0
  37. package/dist/services/media-server.d.ts +28 -0
  38. package/dist/services/media-server.d.ts.map +1 -0
  39. package/dist/services/media-server.js +195 -0
  40. package/dist/services/media-server.js.map +1 -0
  41. package/dist/svg-viewer/src/ui/svg-viewer.html +325 -0
  42. package/dist/tools/gemini-chat.d.ts.map +1 -1
  43. package/dist/tools/gemini-chat.js +7 -1
  44. package/dist/tools/gemini-chat.js.map +1 -1
  45. package/dist/tools/gemini-deep-research.d.ts +1 -2
  46. package/dist/tools/gemini-deep-research.d.ts.map +1 -1
  47. package/dist/tools/gemini-deep-research.js +11 -51
  48. package/dist/tools/gemini-deep-research.js.map +1 -1
  49. package/dist/tools/gemini-help.d.ts +3 -0
  50. package/dist/tools/gemini-help.d.ts.map +1 -0
  51. package/dist/tools/gemini-help.js +534 -0
  52. package/dist/tools/gemini-help.js.map +1 -0
  53. package/dist/tools/gemini-prompt-assistant.d.ts +20 -0
  54. package/dist/tools/gemini-prompt-assistant.d.ts.map +1 -0
  55. package/dist/tools/gemini-prompt-assistant.js +129 -0
  56. package/dist/tools/gemini-prompt-assistant.js.map +1 -0
  57. package/dist/tools/generate-landing-page.d.ts +15 -0
  58. package/dist/tools/generate-landing-page.d.ts.map +1 -0
  59. package/dist/tools/generate-landing-page.js +66 -0
  60. package/dist/tools/generate-landing-page.js.map +1 -0
  61. package/dist/tools/generate-svg.d.ts +14 -0
  62. package/dist/tools/generate-svg.d.ts.map +1 -0
  63. package/dist/tools/generate-svg.js +106 -0
  64. package/dist/tools/generate-svg.js.map +1 -0
  65. package/dist/tools/generate-video.d.ts +24 -0
  66. package/dist/tools/generate-video.d.ts.map +1 -0
  67. package/dist/tools/generate-video.js +163 -0
  68. package/dist/tools/generate-video.js.map +1 -0
  69. package/dist/tools/image-prompt-assistant.d.ts +3 -0
  70. package/dist/tools/image-prompt-assistant.d.ts.map +1 -0
  71. package/dist/tools/image-prompt-assistant.js +790 -0
  72. package/dist/tools/image-prompt-assistant.js.map +1 -0
  73. package/dist/tools/load-image-from-path.d.ts +11 -0
  74. package/dist/tools/load-image-from-path.d.ts.map +1 -0
  75. package/dist/tools/load-image-from-path.js +100 -0
  76. package/dist/tools/load-image-from-path.js.map +1 -0
  77. package/dist/tools/prompt-library/charts.d.ts +325 -0
  78. package/dist/tools/prompt-library/charts.d.ts.map +1 -0
  79. package/dist/tools/prompt-library/charts.js +384 -0
  80. package/dist/tools/prompt-library/charts.js.map +1 -0
  81. package/dist/tools/prompt-library/index.d.ts +8 -0
  82. package/dist/tools/prompt-library/index.d.ts.map +1 -0
  83. package/dist/tools/prompt-library/index.js +10 -0
  84. package/dist/tools/prompt-library/index.js.map +1 -0
  85. package/dist/tools/register-analyze-image.d.ts +3 -0
  86. package/dist/tools/register-analyze-image.d.ts.map +1 -0
  87. package/dist/tools/register-analyze-image.js +67 -0
  88. package/dist/tools/register-analyze-image.js.map +1 -0
  89. package/dist/tools/register-chat.d.ts +3 -0
  90. package/dist/tools/register-chat.d.ts.map +1 -0
  91. package/dist/tools/register-chat.js +71 -0
  92. package/dist/tools/register-chat.js.map +1 -0
  93. package/dist/tools/register-deep-research.d.ts +3 -0
  94. package/dist/tools/register-deep-research.d.ts.map +1 -0
  95. package/dist/tools/register-deep-research.js +59 -0
  96. package/dist/tools/register-deep-research.js.map +1 -0
  97. package/dist/tools/register-describe-image.d.ts +3 -0
  98. package/dist/tools/register-describe-image.d.ts.map +1 -0
  99. package/dist/tools/register-describe-image.js +59 -0
  100. package/dist/tools/register-describe-image.js.map +1 -0
  101. package/dist/tools/register-image-gen.d.ts +3 -0
  102. package/dist/tools/register-image-gen.d.ts.map +1 -0
  103. package/dist/tools/register-image-gen.js +235 -0
  104. package/dist/tools/register-image-gen.js.map +1 -0
  105. package/dist/tools/register-landing-page.d.ts +3 -0
  106. package/dist/tools/register-landing-page.d.ts.map +1 -0
  107. package/dist/tools/register-landing-page.js +79 -0
  108. package/dist/tools/register-landing-page.js.map +1 -0
  109. package/dist/tools/register-list-models.d.ts +3 -0
  110. package/dist/tools/register-list-models.d.ts.map +1 -0
  111. package/dist/tools/register-list-models.js +33 -0
  112. package/dist/tools/register-list-models.js.map +1 -0
  113. package/dist/tools/register-load-image.d.ts +3 -0
  114. package/dist/tools/register-load-image.d.ts.map +1 -0
  115. package/dist/tools/register-load-image.js +66 -0
  116. package/dist/tools/register-load-image.js.map +1 -0
  117. package/dist/tools/register-svg.d.ts +3 -0
  118. package/dist/tools/register-svg.d.ts.map +1 -0
  119. package/dist/tools/register-svg.js +84 -0
  120. package/dist/tools/register-svg.js.map +1 -0
  121. package/dist/tools/register-video.d.ts +3 -0
  122. package/dist/tools/register-video.d.ts.map +1 -0
  123. package/dist/tools/register-video.js +118 -0
  124. package/dist/tools/register-video.js.map +1 -0
  125. package/dist/tools/register-viewers.d.ts +8 -0
  126. package/dist/tools/register-viewers.d.ts.map +1 -0
  127. package/dist/tools/register-viewers.js +89 -0
  128. package/dist/tools/register-viewers.js.map +1 -0
  129. package/dist/tools/schemas.d.ts +33 -0
  130. package/dist/tools/schemas.d.ts.map +1 -0
  131. package/dist/tools/schemas.js +39 -0
  132. package/dist/tools/schemas.js.map +1 -0
  133. package/dist/tools/types.d.ts +12 -0
  134. package/dist/tools/types.d.ts.map +1 -0
  135. package/dist/tools/types.js +2 -0
  136. package/dist/tools/types.js.map +1 -0
  137. package/dist/ui/image-viewer.d.ts +2 -0
  138. package/dist/ui/image-viewer.d.ts.map +1 -0
  139. package/dist/ui/image-viewer.js +42 -0
  140. package/dist/ui/image-viewer.js.map +1 -0
  141. package/dist/utils/chart-design-system.d.ts +92 -0
  142. package/dist/utils/chart-design-system.d.ts.map +1 -0
  143. package/dist/utils/chart-design-system.js +235 -0
  144. package/dist/utils/chart-design-system.js.map +1 -0
  145. package/dist/utils/image-compress.d.ts +9 -0
  146. package/dist/utils/image-compress.d.ts.map +1 -0
  147. package/dist/utils/image-compress.js +43 -0
  148. package/dist/utils/image-compress.js.map +1 -0
  149. package/dist/utils/image-utils.d.ts +9 -0
  150. package/dist/utils/image-utils.d.ts.map +1 -0
  151. package/dist/utils/image-utils.js +257 -0
  152. package/dist/utils/image-utils.js.map +1 -0
  153. package/dist/utils/resolve-images.d.ts +29 -0
  154. package/dist/utils/resolve-images.d.ts.map +1 -0
  155. package/dist/utils/resolve-images.js +56 -0
  156. package/dist/utils/resolve-images.js.map +1 -0
  157. package/dist/utils/tool-wrapper.d.ts +13 -0
  158. package/dist/utils/tool-wrapper.d.ts.map +1 -0
  159. package/dist/utils/tool-wrapper.js +22 -0
  160. package/dist/utils/tool-wrapper.js.map +1 -0
  161. package/dist/utils/video-utils.d.ts +16 -0
  162. package/dist/utils/video-utils.d.ts.map +1 -0
  163. package/dist/utils/video-utils.js +319 -0
  164. package/dist/utils/video-utils.js.map +1 -0
  165. package/dist/video-viewer/src/ui/video-viewer.html +310 -0
  166. package/package.json +21 -7
  167. package/server.json +30 -29
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index-new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-new.d.ts","sourceRoot":"","sources":["../src/index-new.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { dirname, resolve } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ // Default output directory for generated images (relative to package root)
6
+ const DEFAULT_IMAGE_OUTPUT_DIR = resolve(__dirname, '..', 'output');
7
+ //# sourceMappingURL=index-new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-new.js","sourceRoot":"","sources":["../src/index-new.ts"],"names":[],"mappings":";AAYA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAkB,MAAM,MAAM,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAapC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,2EAA2E;AAC3E,MAAM,wBAAwB,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -2,9 +2,11 @@
2
2
  declare class GeminiMcpServer {
3
3
  private server;
4
4
  private geminiService;
5
+ private mediaServer;
6
+ private outputDir;
5
7
  constructor();
6
- private registerTools;
7
8
  start(): Promise<void>;
9
+ shutdown(): void;
8
10
  }
9
11
  export { GeminiMcpServer };
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAYA,cAAM,eAAe;IACnB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,aAAa,CAAgB;;IAyBrC,OAAO,CAAC,aAAa;IAkMf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAsB7B;AAgCD,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAwCA,cAAM,eAAe;IACnB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAS;;IAyBpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD5B,QAAQ,IAAI,IAAI;CAGjB;AAuCD,OAAO,EAAE,eAAe,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -1,15 +1,40 @@
1
1
  #!/usr/bin/env node
2
2
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
- import * as z from 'zod';
4
+ import { dirname, resolve } from 'path';
5
+ import { fileURLToPath } from 'url';
5
6
  import { config, validateConfig } from './config/index.js';
6
7
  import { GeminiService } from './services/gemini/index.js';
7
- import { GeminiDeepResearchTool } from './tools/gemini-deep-research.js';
8
+ import { GeminiImageService } from './services/gemini/image-service.js';
9
+ import { MediaServer } from './services/media-server.js';
8
10
  import logger from './utils/logger.js';
9
- import { McpError, createToolResult } from './utils/error-handler.js';
11
+ import { registerViewers } from './tools/register-viewers.js';
12
+ import { registerGeminiHelp } from './tools/gemini-help.js';
13
+ import { registerPromptAssistant } from './tools/image-prompt-assistant.js';
14
+ import { register as registerChat } from './tools/register-chat.js';
15
+ import { register as registerListModels } from './tools/register-list-models.js';
16
+ import { register as registerDeepResearch } from './tools/register-deep-research.js';
17
+ import { register as registerDescribeImage } from './tools/register-describe-image.js';
18
+ import { register as registerAnalyzeImage } from './tools/register-analyze-image.js';
19
+ import { register as registerLoadImage } from './tools/register-load-image.js';
20
+ import { register as registerImageGen } from './tools/register-image-gen.js';
21
+ import { register as registerLandingPage } from './tools/register-landing-page.js';
22
+ import { register as registerSvg } from './tools/register-svg.js';
23
+ import { register as registerVideo } from './tools/register-video.js';
24
+ const __dirname = dirname(fileURLToPath(import.meta.url));
25
+ const DEFAULT_IMAGE_OUTPUT_DIR = resolve(__dirname, '..', 'output');
26
+ const TOOL_NAMES = [
27
+ 'gemini_chat', 'gemini_list_models', 'gemini_deep_research',
28
+ 'generate_image', 'edit_image', 'describe_image', 'analyze_image',
29
+ 'generate_video',
30
+ 'load_image_from_path', 'generate_landing_page', 'generate_svg',
31
+ 'gemini_help', 'gemini_prompt_assistant',
32
+ ];
10
33
  class GeminiMcpServer {
11
34
  server;
12
35
  geminiService;
36
+ mediaServer;
37
+ outputDir;
13
38
  constructor() {
14
39
  try {
15
40
  validateConfig();
@@ -18,178 +43,16 @@ class GeminiMcpServer {
18
43
  logger.error('Configuration validation failed', { error });
19
44
  process.exit(1);
20
45
  }
21
- this.geminiService = new GeminiService(config.gemini);
46
+ this.geminiService = new GeminiService(config.gemini, config.server.imageOutputDir);
47
+ this.outputDir = config.server.imageOutputDir || DEFAULT_IMAGE_OUTPUT_DIR;
48
+ this.mediaServer = new MediaServer(this.outputDir);
22
49
  this.server = new McpServer({
23
50
  name: config.server.name,
24
51
  version: config.server.version,
25
52
  });
26
- this.registerTools();
27
53
  logger.info('Gemini MCP Server initialized', {
28
54
  serverName: config.server.name,
29
- version: config.server.version
30
- });
31
- }
32
- registerTools() {
33
- // Register gemini_chat tool
34
- this.server.registerTool('gemini_chat', {
35
- title: 'Gemini Chat',
36
- description: 'Chat with Google Gemini models',
37
- inputSchema: {
38
- message: z.string().describe('The message to send'),
39
- model: z.string()
40
- .optional()
41
- .describe('Model to use (defaults to latest available)'),
42
- temperature: z.number()
43
- .min(0.0)
44
- .max(1.0)
45
- .optional()
46
- .default(0.7)
47
- .describe('Controls randomness (0.0 to 1.0)'),
48
- max_tokens: z.number()
49
- .int()
50
- .min(1)
51
- .max(32768)
52
- .optional()
53
- .default(8192)
54
- .describe('Maximum tokens in response'),
55
- system_prompt: z.string()
56
- .optional()
57
- .describe('Optional system instruction'),
58
- grounding: z.boolean()
59
- .optional()
60
- .default(true)
61
- .describe('Enable Google Search grounding for real-time information')
62
- },
63
- outputSchema: {
64
- content: z.string(),
65
- success: z.boolean()
66
- }
67
- }, async ({ message, model, temperature, max_tokens, system_prompt, grounding }) => {
68
- try {
69
- logger.info('Executing gemini_chat tool', {
70
- model,
71
- messageLength: message?.length
72
- });
73
- if (!message) {
74
- throw new McpError('Message is required', 'INVALID_PARAMS');
75
- }
76
- const response = await this.geminiService.chat({
77
- message,
78
- model,
79
- temperature,
80
- maxTokens: max_tokens,
81
- systemPrompt: system_prompt,
82
- grounding
83
- });
84
- return {
85
- content: createToolResult(true, response.content),
86
- structuredContent: { content: response.content, success: true }
87
- };
88
- }
89
- catch (error) {
90
- logger.error('gemini_chat tool execution failed', { error });
91
- const errorMessage = error instanceof McpError
92
- ? error.message
93
- : `Unexpected error: ${error.message}`;
94
- return {
95
- content: createToolResult(false, errorMessage, error),
96
- structuredContent: { content: errorMessage, success: false }
97
- };
98
- }
99
- });
100
- // Register gemini_list_models tool
101
- this.server.registerTool('gemini_list_models', {
102
- title: 'List Gemini Models',
103
- description: 'List available Gemini models and their descriptions',
104
- inputSchema: {},
105
- outputSchema: {
106
- content: z.string(),
107
- success: z.boolean()
108
- }
109
- }, async () => {
110
- try {
111
- logger.info('Executing gemini_list_models tool');
112
- const response = await this.geminiService.listModels();
113
- let modelsInfo = 'Available Gemini Models:\n\n';
114
- for (const model of response.models) {
115
- modelsInfo += `• **${model.name}**: ${model.description}\n`;
116
- }
117
- modelsInfo += `\nLast updated: ${response.timestamp}`;
118
- return {
119
- content: createToolResult(true, modelsInfo),
120
- structuredContent: { content: modelsInfo, success: true }
121
- };
122
- }
123
- catch (error) {
124
- logger.error('gemini_list_models tool execution failed', { error });
125
- const errorMessage = `Error listing models: ${error.message}`;
126
- return {
127
- content: createToolResult(false, errorMessage, error),
128
- structuredContent: { content: errorMessage, success: false }
129
- };
130
- }
131
- });
132
- // Register gemini_deep_research tool
133
- this.server.registerTool('gemini_deep_research', {
134
- title: 'Gemini Deep Research',
135
- description: 'Conduct deep research on complex topics using iterative multi-step analysis with Gemini. This performs multiple searches and synthesizes comprehensive research reports (takes several minutes). [MCP_RECOMMENDED_TIMEOUT_MS: 900000]',
136
- inputSchema: {
137
- research_question: z.string().describe('The complex research question or topic to investigate deeply'),
138
- model: z.string()
139
- .optional()
140
- .describe('Model to use for deep research (defaults to latest available)'),
141
- max_iterations: z.number()
142
- .int()
143
- .min(3)
144
- .max(10)
145
- .optional()
146
- .default(5)
147
- .describe('Number of research iterations (3-10, default 5). Environment guidance: Claude Desktop: use 3-4 (4-min timeout). Agent SDK/IDEs (VSCode, Cursor, Windsurf)/AI platforms (Cline, Roo-Cline): can use 7-10 (longer timeout tolerance)'),
148
- focus_areas: z.array(z.string())
149
- .optional()
150
- .describe('Optional: specific areas to focus the research on')
151
- },
152
- outputSchema: {
153
- content: z.string(),
154
- success: z.boolean()
155
- }
156
- }, async ({ research_question, model, max_iterations, focus_areas }) => {
157
- try {
158
- logger.info('Starting deep research', {
159
- question: research_question,
160
- maxIterations: max_iterations || 5
161
- });
162
- // Create instance and execute (business logic preserved)
163
- const deepResearchTool = new GeminiDeepResearchTool(this.geminiService);
164
- const result = await deepResearchTool.execute({
165
- research_question,
166
- model,
167
- max_iterations,
168
- focus_areas
169
- });
170
- // Result is already TextContent[] from execute method
171
- return {
172
- content: result,
173
- structuredContent: {
174
- content: result[0]?.text || 'Research completed',
175
- success: true
176
- }
177
- };
178
- }
179
- catch (error) {
180
- logger.error('Deep research failed', { error });
181
- const errorMessage = error instanceof McpError
182
- ? error.message
183
- : `Deep research failed: ${error.message}`;
184
- return {
185
- content: createToolResult(false, errorMessage, error),
186
- structuredContent: { content: errorMessage, success: false }
187
- };
188
- }
189
- });
190
- logger.info('Tools registered', {
191
- toolCount: 3,
192
- tools: ['gemini_chat', 'gemini_list_models', 'gemini_deep_research']
55
+ version: config.server.version,
193
56
  });
194
57
  }
195
58
  async start() {
@@ -199,11 +62,37 @@ class GeminiMcpServer {
199
62
  throw new Error('Gemini API key validation failed');
200
63
  }
201
64
  logger.info('Starting Gemini MCP Server...');
65
+ await this.mediaServer.start();
66
+ const ctx = {
67
+ server: this.server,
68
+ geminiService: this.geminiService,
69
+ imageService: new GeminiImageService(config.gemini),
70
+ outputDir: this.outputDir,
71
+ mediaServer: this.mediaServer,
72
+ };
73
+ await registerViewers(this.server, __dirname, this.mediaServer.getPort());
74
+ registerGeminiHelp(this.server);
75
+ registerPromptAssistant(this.server);
76
+ registerChat(ctx);
77
+ registerListModels(ctx);
78
+ registerDeepResearch(ctx);
79
+ registerDescribeImage(ctx);
80
+ registerAnalyzeImage(ctx);
81
+ registerLoadImage(ctx);
82
+ registerImageGen(ctx);
83
+ registerLandingPage(ctx);
84
+ registerSvg(ctx);
85
+ registerVideo(ctx);
86
+ logger.info('Tools registered', {
87
+ toolCount: TOOL_NAMES.length,
88
+ tools: [...TOOL_NAMES],
89
+ });
202
90
  const transport = new StdioServerTransport();
203
91
  await this.server.connect(transport);
204
92
  logger.info('Gemini MCP Server started successfully', {
205
93
  transport: 'stdio',
206
- toolsAvailable: ['gemini_chat', 'gemini_list_models', 'gemini_deep_research']
94
+ toolsAvailable: [...TOOL_NAMES],
95
+ mediaServerPort: this.mediaServer.getPort(),
207
96
  });
208
97
  }
209
98
  catch (error) {
@@ -211,29 +100,38 @@ class GeminiMcpServer {
211
100
  process.exit(1);
212
101
  }
213
102
  }
103
+ shutdown() {
104
+ this.mediaServer.stop();
105
+ }
214
106
  }
107
+ let serverInstance = null;
215
108
  process.on('SIGINT', () => {
216
109
  logger.info('Received SIGINT, shutting down gracefully...');
110
+ serverInstance?.shutdown();
217
111
  process.exit(0);
218
112
  });
219
113
  process.on('SIGTERM', () => {
220
114
  logger.info('Received SIGTERM, shutting down gracefully...');
115
+ serverInstance?.shutdown();
221
116
  process.exit(0);
222
117
  });
223
118
  process.on('uncaughtException', (error) => {
224
119
  logger.error('Uncaught exception', { error });
120
+ serverInstance?.shutdown();
225
121
  process.exit(1);
226
122
  });
227
123
  process.on('unhandledRejection', (reason, promise) => {
228
124
  logger.error('Unhandled promise rejection', { reason, promise });
125
+ serverInstance?.shutdown();
229
126
  process.exit(1);
230
127
  });
231
128
  async function main() {
232
- const server = new GeminiMcpServer();
233
- await server.start();
129
+ serverInstance = new GeminiMcpServer();
130
+ await serverInstance.start();
234
131
  }
235
132
  main().catch(error => {
236
133
  logger.error('Server startup failed', { error });
134
+ serverInstance?.shutdown();
237
135
  process.exit(1);
238
136
  });
239
137
  export { GeminiMcpServer };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}