@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.
- package/README.md +314 -834
- package/claude_desktop_config_example.json +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +8 -4
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.d.ts +5 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/image-viewer/image-viewer-app.html +180 -0
- package/dist/image-viewer/src/ui/image-viewer.html +324 -0
- package/dist/index-new.d.ts +3 -0
- package/dist/index-new.d.ts.map +1 -0
- package/dist/index-new.js +7 -0
- package/dist/index-new.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -172
- package/dist/index.js.map +1 -1
- package/dist/landing-page-viewer/src/ui/landing-page-viewer.html +330 -0
- package/dist/services/gemini/export.d.ts +5 -0
- package/dist/services/gemini/export.d.ts.map +1 -0
- package/dist/services/gemini/export.js +5 -0
- package/dist/services/gemini/export.js.map +1 -0
- package/dist/services/gemini/image-service.d.ts +45 -0
- package/dist/services/gemini/image-service.d.ts.map +1 -0
- package/dist/services/gemini/image-service.js +248 -0
- package/dist/services/gemini/image-service.js.map +1 -0
- package/dist/services/gemini/index.d.ts +7 -2
- package/dist/services/gemini/index.d.ts.map +1 -1
- package/dist/services/gemini/index.js +132 -56
- package/dist/services/gemini/index.js.map +1 -1
- package/dist/services/gemini/types.d.ts +32 -0
- package/dist/services/gemini/types.d.ts.map +1 -1
- package/dist/services/gemini/video-service.d.ts +58 -0
- package/dist/services/gemini/video-service.d.ts.map +1 -0
- package/dist/services/gemini/video-service.js +325 -0
- package/dist/services/gemini/video-service.js.map +1 -0
- package/dist/services/media-server.d.ts +28 -0
- package/dist/services/media-server.d.ts.map +1 -0
- package/dist/services/media-server.js +195 -0
- package/dist/services/media-server.js.map +1 -0
- package/dist/svg-viewer/src/ui/svg-viewer.html +325 -0
- package/dist/tools/gemini-chat.d.ts.map +1 -1
- package/dist/tools/gemini-chat.js +7 -1
- package/dist/tools/gemini-chat.js.map +1 -1
- package/dist/tools/gemini-deep-research.d.ts +1 -2
- package/dist/tools/gemini-deep-research.d.ts.map +1 -1
- package/dist/tools/gemini-deep-research.js +11 -51
- package/dist/tools/gemini-deep-research.js.map +1 -1
- package/dist/tools/gemini-help.d.ts +3 -0
- package/dist/tools/gemini-help.d.ts.map +1 -0
- package/dist/tools/gemini-help.js +534 -0
- package/dist/tools/gemini-help.js.map +1 -0
- package/dist/tools/gemini-prompt-assistant.d.ts +20 -0
- package/dist/tools/gemini-prompt-assistant.d.ts.map +1 -0
- package/dist/tools/gemini-prompt-assistant.js +129 -0
- package/dist/tools/gemini-prompt-assistant.js.map +1 -0
- package/dist/tools/generate-landing-page.d.ts +15 -0
- package/dist/tools/generate-landing-page.d.ts.map +1 -0
- package/dist/tools/generate-landing-page.js +66 -0
- package/dist/tools/generate-landing-page.js.map +1 -0
- package/dist/tools/generate-svg.d.ts +14 -0
- package/dist/tools/generate-svg.d.ts.map +1 -0
- package/dist/tools/generate-svg.js +106 -0
- package/dist/tools/generate-svg.js.map +1 -0
- package/dist/tools/generate-video.d.ts +24 -0
- package/dist/tools/generate-video.d.ts.map +1 -0
- package/dist/tools/generate-video.js +163 -0
- package/dist/tools/generate-video.js.map +1 -0
- package/dist/tools/image-prompt-assistant.d.ts +3 -0
- package/dist/tools/image-prompt-assistant.d.ts.map +1 -0
- package/dist/tools/image-prompt-assistant.js +790 -0
- package/dist/tools/image-prompt-assistant.js.map +1 -0
- package/dist/tools/load-image-from-path.d.ts +11 -0
- package/dist/tools/load-image-from-path.d.ts.map +1 -0
- package/dist/tools/load-image-from-path.js +100 -0
- package/dist/tools/load-image-from-path.js.map +1 -0
- package/dist/tools/prompt-library/charts.d.ts +325 -0
- package/dist/tools/prompt-library/charts.d.ts.map +1 -0
- package/dist/tools/prompt-library/charts.js +384 -0
- package/dist/tools/prompt-library/charts.js.map +1 -0
- package/dist/tools/prompt-library/index.d.ts +8 -0
- package/dist/tools/prompt-library/index.d.ts.map +1 -0
- package/dist/tools/prompt-library/index.js +10 -0
- package/dist/tools/prompt-library/index.js.map +1 -0
- package/dist/tools/register-analyze-image.d.ts +3 -0
- package/dist/tools/register-analyze-image.d.ts.map +1 -0
- package/dist/tools/register-analyze-image.js +67 -0
- package/dist/tools/register-analyze-image.js.map +1 -0
- package/dist/tools/register-chat.d.ts +3 -0
- package/dist/tools/register-chat.d.ts.map +1 -0
- package/dist/tools/register-chat.js +71 -0
- package/dist/tools/register-chat.js.map +1 -0
- package/dist/tools/register-deep-research.d.ts +3 -0
- package/dist/tools/register-deep-research.d.ts.map +1 -0
- package/dist/tools/register-deep-research.js +59 -0
- package/dist/tools/register-deep-research.js.map +1 -0
- package/dist/tools/register-describe-image.d.ts +3 -0
- package/dist/tools/register-describe-image.d.ts.map +1 -0
- package/dist/tools/register-describe-image.js +59 -0
- package/dist/tools/register-describe-image.js.map +1 -0
- package/dist/tools/register-image-gen.d.ts +3 -0
- package/dist/tools/register-image-gen.d.ts.map +1 -0
- package/dist/tools/register-image-gen.js +235 -0
- package/dist/tools/register-image-gen.js.map +1 -0
- package/dist/tools/register-landing-page.d.ts +3 -0
- package/dist/tools/register-landing-page.d.ts.map +1 -0
- package/dist/tools/register-landing-page.js +79 -0
- package/dist/tools/register-landing-page.js.map +1 -0
- package/dist/tools/register-list-models.d.ts +3 -0
- package/dist/tools/register-list-models.d.ts.map +1 -0
- package/dist/tools/register-list-models.js +33 -0
- package/dist/tools/register-list-models.js.map +1 -0
- package/dist/tools/register-load-image.d.ts +3 -0
- package/dist/tools/register-load-image.d.ts.map +1 -0
- package/dist/tools/register-load-image.js +66 -0
- package/dist/tools/register-load-image.js.map +1 -0
- package/dist/tools/register-svg.d.ts +3 -0
- package/dist/tools/register-svg.d.ts.map +1 -0
- package/dist/tools/register-svg.js +84 -0
- package/dist/tools/register-svg.js.map +1 -0
- package/dist/tools/register-video.d.ts +3 -0
- package/dist/tools/register-video.d.ts.map +1 -0
- package/dist/tools/register-video.js +118 -0
- package/dist/tools/register-video.js.map +1 -0
- package/dist/tools/register-viewers.d.ts +8 -0
- package/dist/tools/register-viewers.d.ts.map +1 -0
- package/dist/tools/register-viewers.js +89 -0
- package/dist/tools/register-viewers.js.map +1 -0
- package/dist/tools/schemas.d.ts +33 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +39 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/types.d.ts +12 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/ui/image-viewer.d.ts +2 -0
- package/dist/ui/image-viewer.d.ts.map +1 -0
- package/dist/ui/image-viewer.js +42 -0
- package/dist/ui/image-viewer.js.map +1 -0
- package/dist/utils/chart-design-system.d.ts +92 -0
- package/dist/utils/chart-design-system.d.ts.map +1 -0
- package/dist/utils/chart-design-system.js +235 -0
- package/dist/utils/chart-design-system.js.map +1 -0
- package/dist/utils/image-compress.d.ts +9 -0
- package/dist/utils/image-compress.d.ts.map +1 -0
- package/dist/utils/image-compress.js +43 -0
- package/dist/utils/image-compress.js.map +1 -0
- package/dist/utils/image-utils.d.ts +9 -0
- package/dist/utils/image-utils.d.ts.map +1 -0
- package/dist/utils/image-utils.js +257 -0
- package/dist/utils/image-utils.js.map +1 -0
- package/dist/utils/resolve-images.d.ts +29 -0
- package/dist/utils/resolve-images.d.ts.map +1 -0
- package/dist/utils/resolve-images.js +56 -0
- package/dist/utils/resolve-images.js.map +1 -0
- package/dist/utils/tool-wrapper.d.ts +13 -0
- package/dist/utils/tool-wrapper.d.ts.map +1 -0
- package/dist/utils/tool-wrapper.js +22 -0
- package/dist/utils/tool-wrapper.js.map +1 -0
- package/dist/utils/video-utils.d.ts +16 -0
- package/dist/utils/video-utils.d.ts.map +1 -0
- package/dist/utils/video-utils.js +319 -0
- package/dist/utils/video-utils.js.map +1 -0
- package/dist/video-viewer/src/ui/video-viewer.html +310 -0
- package/package.json +21 -7
- package/server.json +30 -29
|
@@ -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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
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
|
|
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 {
|
|
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 {
|
|
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: [
|
|
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
|
-
|
|
233
|
-
await
|
|
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":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|