@houtini/gemini-mcp 1.0.3 → 1.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.
@@ -0,0 +1,414 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.GeminiDeepResearchTool = void 0;
7
+ const error_handler_1 = require("../utils/error-handler");
8
+ const logger_1 = __importDefault(require("../utils/logger"));
9
+ class GeminiDeepResearchTool {
10
+ geminiService;
11
+ constructor(geminiService) {
12
+ this.geminiService = geminiService;
13
+ }
14
+ getDefinition() {
15
+ return {
16
+ name: 'gemini_deep_research',
17
+ 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]',
18
+ inputSchema: {
19
+ type: 'object',
20
+ properties: {
21
+ research_question: {
22
+ type: 'string',
23
+ description: 'The complex research question or topic to investigate deeply'
24
+ },
25
+ model: {
26
+ type: 'string',
27
+ default: this.geminiService.getDefaultModel(),
28
+ enum: this.geminiService.getAvailableModels(),
29
+ description: 'Model to use for deep research (defaults to latest available)'
30
+ },
31
+ max_iterations: {
32
+ type: 'integer',
33
+ default: 5,
34
+ minimum: 3,
35
+ maximum: 10,
36
+ description: '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)'
37
+ },
38
+ focus_areas: {
39
+ type: 'array',
40
+ items: { type: 'string' },
41
+ description: 'Optional: specific areas to focus the research on'
42
+ }
43
+ },
44
+ required: ['research_question']
45
+ }
46
+ };
47
+ }
48
+ async execute(args) {
49
+ try {
50
+ logger_1.default.info('Starting deep research', {
51
+ question: args.research_question,
52
+ maxIterations: args.max_iterations || 5
53
+ });
54
+ const researchQuestion = args.research_question;
55
+ const maxIterations = Math.min(args.max_iterations || 5, 10);
56
+ const model = args.model || this.geminiService.getDefaultModel();
57
+ const focusAreas = args.focus_areas || [];
58
+ const modelContextWindow = this.geminiService.getModelContextWindow(model);
59
+ const synthesisReserve = Math.floor(modelContextWindow * 0.20);
60
+ const researchBudget = Math.floor(modelContextWindow * 0.75);
61
+ logger_1.default.info('Token budget allocation', {
62
+ model,
63
+ contextWindow: modelContextWindow,
64
+ researchBudget,
65
+ synthesisReserve,
66
+ buffer: modelContextWindow - researchBudget - synthesisReserve
67
+ });
68
+ let report = '# Deep Research Report\n\n';
69
+ report += `## Research Question\n${researchQuestion}\n\n`;
70
+ if (focusAreas.length > 0) {
71
+ report += `## Focus Areas\n${focusAreas.map((area) => `- ${area}`).join('\n')}\n\n`;
72
+ }
73
+ report += '## Research Process\n\n';
74
+ report += '*This research involves multiple iterative searches and analysis steps. Please wait...*\n\n';
75
+ const researchSteps = [];
76
+ let cumulativeTokens = 0;
77
+ report += '### Step 1: Creating Research Plan\n\n';
78
+ // IMPROVED: More explicit planning prompt that forces specific queries
79
+ const planningPrompt = `You are a research assistant. Create a detailed research plan for this question: "${researchQuestion}"
80
+
81
+ ${focusAreas.length > 0 ? `Focus specifically on these areas: ${focusAreas.join(', ')}` : ''}
82
+
83
+ Create EXACTLY ${maxIterations} specific, actionable research queries that will comprehensively answer this question.
84
+
85
+ CRITICAL REQUIREMENTS:
86
+ 1. Each query must be self-contained and include the main topic explicitly
87
+ 2. Each query must be specific enough to guide a Google Search
88
+ 3. Format as a numbered list: "1. [Your specific query here]"
89
+ 4. Do NOT use vague phrases like "the topic", "this aspect", or "it" - always name the specific subject
90
+ 5. Each query should be a complete question or statement that could stand alone
91
+
92
+ Example format for a question about "Impact of electric vehicles on oil industry":
93
+ 1. What is the current global adoption rate of electric vehicles and projected growth through 2030?
94
+ 2. How have major oil companies' stock prices and valuations changed since 2020 in response to EV adoption?
95
+ 3. What strategic pivots are oil companies making to adapt to declining gasoline demand from EVs?
96
+
97
+ Now create ${maxIterations} research queries following this format for the question: "${researchQuestion}"`;
98
+ let planResponse;
99
+ try {
100
+ planResponse = await this.geminiService.chat({
101
+ message: planningPrompt,
102
+ model: model,
103
+ temperature: 0.7,
104
+ maxTokens: 4096,
105
+ grounding: false
106
+ });
107
+ if (planResponse.usageMetadata) {
108
+ cumulativeTokens += planResponse.usageMetadata.totalTokenCount;
109
+ logger_1.default.info('Planning phase tokens', {
110
+ used: planResponse.usageMetadata.totalTokenCount,
111
+ cumulative: cumulativeTokens
112
+ });
113
+ }
114
+ }
115
+ catch (error) {
116
+ logger_1.default.error('Planning phase failed', { error });
117
+ throw new error_handler_1.McpError('Failed to create research plan. The question may be too complex. Try simplifying it.', 'RESEARCH_PLANNING_FAILED');
118
+ }
119
+ report += planResponse.content + '\n\n';
120
+ // IMPROVED: Pass research question to extraction for better fallback
121
+ const researchQueries = this.extractQueries(planResponse.content, maxIterations, researchQuestion);
122
+ report += `### Step 2: Executing Research Queries\n\n`;
123
+ report += `*Conducting ${researchQueries.length} research iterations...*\n\n`;
124
+ let consecutiveFailures = 0;
125
+ for (let i = 0; i < researchQueries.length; i++) {
126
+ const query = researchQueries[i];
127
+ if (cumulativeTokens >= researchBudget) {
128
+ logger_1.default.warn('Approaching token budget, stopping research iterations', {
129
+ cumulative: cumulativeTokens,
130
+ budget: researchBudget
131
+ });
132
+ report += `\n*Note: Research stopped at iteration ${i + 1} due to token budget limits.*\n\n`;
133
+ break;
134
+ }
135
+ logger_1.default.info(`Research iteration ${i + 1}/${researchQueries.length}`, {
136
+ query,
137
+ tokensUsed: cumulativeTokens,
138
+ budget: researchBudget
139
+ });
140
+ report += `#### Research Query ${i + 1}: ${query}\n\n`;
141
+ const contextContent = this.buildSmartContext(researchSteps, researchBudget - cumulativeTokens);
142
+ const searchPrompt = `Research this specific question: "${query}"
143
+
144
+ ${contextContent ? `Context from previous research:\n${contextContent}` : ''}
145
+
146
+ Provide detailed, factual information with specific data points. Use Google Search grounding to find current information.`;
147
+ let searchResponse;
148
+ try {
149
+ searchResponse = await this.geminiService.chat({
150
+ message: searchPrompt,
151
+ model: model,
152
+ temperature: 0.5,
153
+ maxTokens: 8192,
154
+ grounding: true
155
+ });
156
+ if (searchResponse.usageMetadata) {
157
+ cumulativeTokens += searchResponse.usageMetadata.totalTokenCount;
158
+ logger_1.default.info(`Iteration ${i + 1} token usage`, {
159
+ iteration: searchResponse.usageMetadata.totalTokenCount,
160
+ cumulative: cumulativeTokens,
161
+ remaining: researchBudget - cumulativeTokens
162
+ });
163
+ }
164
+ // IMPROVED: Validate that grounding actually occurred
165
+ if (searchResponse.groundingMetadata) {
166
+ const hasSearches = (searchResponse.groundingMetadata.webSearchQueries?.length ?? 0) > 0;
167
+ const hasSupports = (searchResponse.groundingMetadata.groundingSupports?.length ?? 0) > 0;
168
+ if (!hasSearches && !hasSupports) {
169
+ logger_1.default.warn(`Iteration ${i + 1}: Grounding enabled but no searches performed`, {
170
+ query,
171
+ responsePreview: searchResponse.content.substring(0, 200)
172
+ });
173
+ }
174
+ else {
175
+ logger_1.default.info(`Iteration ${i + 1}: Grounding successful`, {
176
+ searchQueries: searchResponse.groundingMetadata.webSearchQueries?.length || 0,
177
+ supports: searchResponse.groundingMetadata.groundingSupports?.length || 0
178
+ });
179
+ }
180
+ }
181
+ else {
182
+ logger_1.default.warn(`Iteration ${i + 1}: No grounding metadata returned`, {
183
+ query,
184
+ groundingRequested: true
185
+ });
186
+ }
187
+ // IMPROVED: Check for generic failure responses
188
+ const responsePreview = searchResponse.content.substring(0, 100).toLowerCase();
189
+ if (responsePreview.includes('please specify') ||
190
+ responsePreview.includes('i need to know') ||
191
+ responsePreview.includes('clarify the topic')) {
192
+ throw new Error('Query was too vague - received generic response requesting clarification');
193
+ }
194
+ consecutiveFailures = 0; // Reset on success
195
+ }
196
+ catch (error) {
197
+ consecutiveFailures++;
198
+ const errorMsg = error.message;
199
+ logger_1.default.error(`Research iteration ${i + 1} failed`, {
200
+ error: errorMsg,
201
+ query,
202
+ consecutiveFailures
203
+ });
204
+ // IMPROVED: Fail fast if queries are systematically failing
205
+ if (consecutiveFailures >= 2 && researchSteps.length === 0) {
206
+ throw new error_handler_1.McpError(`Multiple research queries failing consecutively. This usually means:\n` +
207
+ `1. The queries are too vague (missing context about "${researchQuestion}")\n` +
208
+ `2. Grounding/Google Search may not be available\n` +
209
+ `3. The topic may need to be more specific\n\n` +
210
+ `Last attempted query: "${query}"\n` +
211
+ `Error: ${errorMsg}`, 'RESEARCH_QUERIES_FAILING');
212
+ }
213
+ report += `*Research query ${i + 1} failed: ${errorMsg}*\n\n`;
214
+ continue;
215
+ }
216
+ const sources = this.extractSources(searchResponse.content);
217
+ researchSteps.push({
218
+ query,
219
+ response: searchResponse.content,
220
+ sources,
221
+ usageMetadata: searchResponse.usageMetadata || {
222
+ promptTokenCount: 0,
223
+ candidatesTokenCount: 0,
224
+ totalTokenCount: 0
225
+ }
226
+ });
227
+ report += searchResponse.content + '\n\n';
228
+ }
229
+ if (researchSteps.length === 0) {
230
+ throw new error_handler_1.McpError('All research iterations failed. Possible causes:\n' +
231
+ '1. Research queries were too generic\n' +
232
+ '2. Grounding/Google Search is not responding\n' +
233
+ '3. Network or API issues\n\n' +
234
+ 'Try simplifying the question or checking your internet connection.', 'ALL_ITERATIONS_FAILED');
235
+ }
236
+ report += '### Step 3: Synthesizing Findings\n\n';
237
+ const availableForSynthesis = Math.min(synthesisReserve, modelContextWindow - cumulativeTokens - 10000);
238
+ logger_1.default.info('Synthesis phase', {
239
+ tokensUsed: cumulativeTokens,
240
+ synthesisReserve,
241
+ availableForSynthesis,
242
+ researchStepsCompleted: researchSteps.length
243
+ });
244
+ const synthesisContext = this.buildSynthesisContext(researchSteps, availableForSynthesis);
245
+ const synthesisPrompt = `Based on all the research conducted, synthesize a comprehensive answer to the original question: "${researchQuestion}"
246
+
247
+ Research conducted:
248
+ ${synthesisContext}
249
+
250
+ Create a comprehensive synthesis that:
251
+ 1. Directly answers the research question
252
+ 2. Integrates findings from all research queries
253
+ 3. Highlights key insights and patterns
254
+ 4. Notes any contradictions or gaps
255
+ 5. Provides actionable conclusions
256
+
257
+ Be thorough and well-structured.`;
258
+ let synthesisResponse;
259
+ try {
260
+ synthesisResponse = await this.geminiService.chat({
261
+ message: synthesisPrompt,
262
+ model: model,
263
+ temperature: 0.6,
264
+ maxTokens: 16384,
265
+ grounding: false
266
+ });
267
+ if (synthesisResponse.usageMetadata) {
268
+ cumulativeTokens += synthesisResponse.usageMetadata.totalTokenCount;
269
+ logger_1.default.info('Synthesis tokens', {
270
+ used: synthesisResponse.usageMetadata.totalTokenCount,
271
+ total: cumulativeTokens
272
+ });
273
+ }
274
+ }
275
+ catch (error) {
276
+ logger_1.default.error('Synthesis phase failed', { error });
277
+ report += '*Note: Synthesis phase encountered an error. Individual research findings are provided above.*\n\n';
278
+ synthesisResponse = { content: 'Synthesis unavailable due to technical limitations. Please review the individual research findings above for insights.' };
279
+ }
280
+ report += synthesisResponse.content + '\n\n';
281
+ report += '### Sources Consulted\n\n';
282
+ const allSources = new Set();
283
+ researchSteps.forEach(step => {
284
+ step.sources.forEach(source => allSources.add(source));
285
+ });
286
+ if (allSources.size > 0) {
287
+ Array.from(allSources).forEach((source, i) => {
288
+ report += `${i + 1}. ${source}\n`;
289
+ });
290
+ }
291
+ else {
292
+ report += '*Note: No external sources were cited. This may indicate grounding did not function properly.*\n';
293
+ }
294
+ report += `\n---\n\n*Research completed with ${researchSteps.length} successful iterations using ${model}*\n`;
295
+ report += `*Total tokens used: ${cumulativeTokens.toLocaleString()} / ${modelContextWindow.toLocaleString()} available*\n`;
296
+ report += `*Context window utilization: ${((cumulativeTokens / modelContextWindow) * 100).toFixed(1)}%*\n`;
297
+ logger_1.default.info('Deep research completed successfully', {
298
+ iterations: researchSteps.length,
299
+ totalSources: allSources.size,
300
+ totalTokens: cumulativeTokens,
301
+ contextWindow: modelContextWindow,
302
+ utilization: ((cumulativeTokens / modelContextWindow) * 100).toFixed(1) + '%'
303
+ });
304
+ return (0, error_handler_1.createToolResult)(true, report);
305
+ }
306
+ catch (error) {
307
+ logger_1.default.error('Deep research failed', { error });
308
+ if (error instanceof error_handler_1.McpError) {
309
+ return (0, error_handler_1.createToolResult)(false, error.message, error);
310
+ }
311
+ return (0, error_handler_1.createToolResult)(false, `Deep research failed: ${error.message}. Try reducing max_iterations or simplifying the question.`, error);
312
+ }
313
+ }
314
+ buildSmartContext(steps, maxTokens) {
315
+ if (steps.length === 0)
316
+ return '';
317
+ const ESTIMATED_CHARS_PER_TOKEN = 4;
318
+ const maxChars = maxTokens * ESTIMATED_CHARS_PER_TOKEN * 0.8;
319
+ let context = '';
320
+ let currentLength = 0;
321
+ for (let i = steps.length - 1; i >= 0; i--) {
322
+ const step = steps[i];
323
+ const summaryLength = Math.min(1000, step.response.length);
324
+ const stepSummary = `Query ${i + 1}: ${step.query}\nKey findings: ${step.response.substring(0, summaryLength)}${summaryLength < step.response.length ? '...' : ''}\n\n`;
325
+ if (currentLength + stepSummary.length > maxChars) {
326
+ logger_1.default.info('Context budget reached, including most recent research only', {
327
+ includedSteps: steps.length - i,
328
+ totalSteps: steps.length
329
+ });
330
+ break;
331
+ }
332
+ context = stepSummary + context;
333
+ currentLength += stepSummary.length;
334
+ }
335
+ return context;
336
+ }
337
+ buildSynthesisContext(steps, maxTokens) {
338
+ const ESTIMATED_CHARS_PER_TOKEN = 4;
339
+ const maxCharsPerStep = Math.floor((maxTokens * ESTIMATED_CHARS_PER_TOKEN) / steps.length);
340
+ return steps.map((step, i) => {
341
+ const truncatedResponse = step.response.length > maxCharsPerStep
342
+ ? step.response.substring(0, maxCharsPerStep) + '...'
343
+ : step.response;
344
+ return `Research Query ${i + 1}: ${step.query}\nFindings: ${truncatedResponse}`;
345
+ }).join('\n\n');
346
+ }
347
+ // IMPROVED: Pass research question for context-aware fallback queries
348
+ extractQueries(planText, maxQueries, researchQuestion) {
349
+ const queries = [];
350
+ const lines = planText.split('\n');
351
+ // Try multiple patterns to extract queries
352
+ for (const line of lines) {
353
+ // Pattern 1: Standard numbered list (1. query)
354
+ let match = line.match(/^\d+\.\s*(.+?)(?:\s*[-:]\s*|$)/);
355
+ // Pattern 2: Bold numbered list (**1. query**)
356
+ if (!match) {
357
+ match = line.match(/^\*\*\d+\.\s*(.+?)\*\*/);
358
+ }
359
+ // Pattern 3: Query within bold markdown (**Research Query: query**)
360
+ if (!match) {
361
+ match = line.match(/\*\*Research Query:\s*(.+?)\*\*/i);
362
+ }
363
+ if (match) {
364
+ let query = match[1].trim();
365
+ // Remove any trailing punctuation or markdown
366
+ query = query.replace(/[*_]+$/, '').trim();
367
+ // Clean up query - remove question marks at the end if very long
368
+ if (query.length > 200) {
369
+ const questionMark = query.lastIndexOf('?');
370
+ if (questionMark > 50) {
371
+ query = query.substring(0, questionMark + 1);
372
+ }
373
+ }
374
+ if (query.length > 10 && query.length < 500) {
375
+ queries.push(query);
376
+ }
377
+ }
378
+ }
379
+ // IMPROVED: Use context-aware fallback queries that include the research question
380
+ if (queries.length === 0) {
381
+ logger_1.default.warn('Failed to extract queries from plan, using context-aware fallback queries');
382
+ const fallbackQueries = [
383
+ `Provide comprehensive overview of: ${researchQuestion}`,
384
+ `What are the key aspects and current trends related to: ${researchQuestion}`,
385
+ `What are the recent developments and changes regarding: ${researchQuestion}`,
386
+ `Compare different perspectives and approaches to: ${researchQuestion}`,
387
+ `What are the conclusions and recommendations about: ${researchQuestion}`
388
+ ];
389
+ logger_1.default.info('Using fallback queries with context', {
390
+ researchQuestion: researchQuestion.substring(0, 100),
391
+ fallbackCount: fallbackQueries.length
392
+ });
393
+ return fallbackQueries.slice(0, maxQueries);
394
+ }
395
+ logger_1.default.info('Extracted queries from plan', { count: queries.length, queries });
396
+ return queries.slice(0, maxQueries);
397
+ }
398
+ extractSources(content) {
399
+ const sources = [];
400
+ const urlRegex = /https?:\/\/[^\s)]+/g;
401
+ const matches = content.match(urlRegex);
402
+ if (matches) {
403
+ matches.forEach(url => {
404
+ const cleanUrl = url.replace(/[.,;:]+$/, '');
405
+ if (cleanUrl.length > 10) {
406
+ sources.push(cleanUrl);
407
+ }
408
+ });
409
+ }
410
+ return [...new Set(sources)];
411
+ }
412
+ }
413
+ exports.GeminiDeepResearchTool = GeminiDeepResearchTool;
414
+ //# sourceMappingURL=gemini-deep-research.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-deep-research.js","sourceRoot":"","sources":["../../src/tools/gemini-deep-research.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,6 @@ export declare class GeminiListModelsTool {
4
4
  private geminiService;
5
5
  constructor(geminiService: GeminiService);
6
6
  getDefinition(): Tool;
7
- execute(args: any): Promise<TextContent[]>;
7
+ execute(): Promise<TextContent[]>;
8
8
  }
9
9
  //# sourceMappingURL=gemini-list-models.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-list-models.d.ts","sourceRoot":"","sources":["../../src/tools/gemini-list-models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,qBAAa,oBAAoB;IACnB,OAAO,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAEhD,aAAa,IAAI,IAAI;IAWf,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAqBjD"}
1
+ {"version":3,"file":"gemini-list-models.d.ts","sourceRoot":"","sources":["../../src/tools/gemini-list-models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,qBAAa,oBAAoB;IACnB,OAAO,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAEhD,aAAa,IAAI,IAAI;IAWf,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;CAqBxC"}
@@ -21,7 +21,7 @@ class GeminiListModelsTool {
21
21
  }
22
22
  };
23
23
  }
24
- async execute(args) {
24
+ async execute() {
25
25
  try {
26
26
  logger_1.default.info('Executing gemini_list_models tool');
27
27
  const response = await this.geminiService.listModels();
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-list-models.js","sourceRoot":"","sources":["../../src/tools/gemini-list-models.ts"],"names":[],"mappings":";;;;;;AAEA,0DAA0D;AAC1D,6DAAqC;AAErC,MAAa,oBAAoB;IACX;IAApB,YAAoB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAEpD,aAAa;QACX,OAAO;YACL,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EAAE,qDAAqD;YAClE,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAS;QACrB,IAAI,CAAC;YACH,gBAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAEjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;YAEvD,IAAI,UAAU,GAAG,8BAA8B,CAAC;YAEhD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpC,UAAU,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,WAAW,IAAI,CAAC;YAC9D,CAAC;YAED,UAAU,IAAI,mBAAmB,QAAQ,CAAC,SAAS,EAAE,CAAC;YAEtD,OAAO,IAAA,gCAAgB,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAE5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gBAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACpE,OAAO,IAAA,gCAAgB,EAAC,KAAK,EAAE,yBAA0B,KAAe,CAAC,OAAO,EAAE,EAAE,KAAc,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;CACF;AAnCD,oDAmCC"}
1
+ {"version":3,"file":"gemini-list-models.js","sourceRoot":"","sources":["../../src/tools/gemini-list-models.ts"],"names":[],"mappings":";;;;;;AAEA,0DAA0D;AAC1D,6DAAqC;AAErC,MAAa,oBAAoB;IACX;IAApB,YAAoB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAEpD,aAAa;QACX,OAAO;YACL,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EAAE,qDAAqD;YAClE,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,gBAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAEjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;YAEvD,IAAI,UAAU,GAAG,8BAA8B,CAAC;YAEhD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpC,UAAU,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,WAAW,IAAI,CAAC;YAC9D,CAAC;YAED,UAAU,IAAI,mBAAmB,QAAQ,CAAC,SAAS,EAAE,CAAC;YAEtD,OAAO,IAAA,gCAAgB,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAE5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gBAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACpE,OAAO,IAAA,gCAAgB,EAAC,KAAK,EAAE,yBAA0B,KAAe,CAAC,OAAO,EAAE,EAAE,KAAc,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;CACF;AAnCD,oDAmCC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@houtini/gemini-mcp",
3
- "version": "1.0.3",
3
+ "version": "1.2.0",
4
4
  "description": "Professional Model Context Protocol server for Google Gemini AI models with enterprise-grade features",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -56,18 +56,18 @@
56
56
  "url": "https://github.com/houtini-ai/gemini-mcp/issues"
57
57
  },
58
58
  "dependencies": {
59
- "@google/generative-ai": "^0.21.0",
60
- "@modelcontextprotocol/sdk": "^1.0.0",
59
+ "@google/generative-ai": "^0.24.1",
60
+ "@modelcontextprotocol/sdk": "^1.19.1",
61
61
  "dotenv": "^16.4.5",
62
62
  "winston": "^3.14.0"
63
63
  },
64
64
  "devDependencies": {
65
+ "@types/jest": "^29.5.0",
65
66
  "@types/node": "^22.0.0",
66
- "@typescript-eslint/eslint-plugin": "^8.0.0",
67
- "@typescript-eslint/parser": "^8.0.0",
67
+ "@typescript-eslint/eslint-plugin": "^8.45.0",
68
+ "@typescript-eslint/parser": "^8.45.0",
68
69
  "eslint": "^8.57.0",
69
70
  "jest": "^29.7.0",
70
- "@types/jest": "^29.5.0",
71
71
  "ts-jest": "^29.1.0",
72
72
  "tsx": "^4.16.0",
73
73
  "typescript": "^5.5.0"