@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,15 @@
|
|
|
1
|
+
import { GeminiService } from '../services/gemini/index.js';
|
|
2
|
+
export interface LandingPageRequest {
|
|
3
|
+
brief: string;
|
|
4
|
+
companyName?: string;
|
|
5
|
+
primaryColour?: string;
|
|
6
|
+
style?: 'minimal' | 'bold' | 'corporate' | 'startup';
|
|
7
|
+
sections?: string[];
|
|
8
|
+
model?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class GenerateLandingPageTool {
|
|
11
|
+
private geminiService;
|
|
12
|
+
constructor(geminiService: GeminiService);
|
|
13
|
+
execute(request: LandingPageRequest): Promise<string>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=generate-landing-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-landing-page.d.ts","sourceRoot":"","sources":["../../src/tools/generate-landing-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAI5D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAgBD,qBAAa,uBAAuB;IACtB,OAAO,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAE1C,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;CAiD5D"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { GeminiError } from '../utils/error-handler.js';
|
|
2
|
+
import logger from '../utils/logger.js';
|
|
3
|
+
const SYSTEM_PROMPT = `You are an expert front-end developer specialising in high-converting landing pages.
|
|
4
|
+
Generate complete, self-contained HTML with inline CSS and vanilla JavaScript.
|
|
5
|
+
|
|
6
|
+
Requirements:
|
|
7
|
+
- Single HTML file, no external dependencies
|
|
8
|
+
- Responsive mobile-first design
|
|
9
|
+
- Modern CSS (flexbox/grid, CSS variables for theming)
|
|
10
|
+
- Smooth scroll, subtle animations where appropriate
|
|
11
|
+
- Semantic HTML5 elements
|
|
12
|
+
- Accessible (ARIA labels, contrast ratios)
|
|
13
|
+
- No placeholder images — use CSS gradients or SVG shapes instead
|
|
14
|
+
|
|
15
|
+
Output ONLY the raw HTML. No markdown fences, no explanations.`;
|
|
16
|
+
export class GenerateLandingPageTool {
|
|
17
|
+
geminiService;
|
|
18
|
+
constructor(geminiService) {
|
|
19
|
+
this.geminiService = geminiService;
|
|
20
|
+
}
|
|
21
|
+
async execute(request) {
|
|
22
|
+
const style = request.style || 'startup';
|
|
23
|
+
const sections = request.sections?.length
|
|
24
|
+
? request.sections.join(', ')
|
|
25
|
+
: 'hero, features, social proof, call-to-action';
|
|
26
|
+
const prompt = `
|
|
27
|
+
Create a landing page for the following brief:
|
|
28
|
+
|
|
29
|
+
${request.brief}
|
|
30
|
+
|
|
31
|
+
${request.companyName ? `Company/Product name: ${request.companyName}` : ''}
|
|
32
|
+
${request.primaryColour ? `Primary brand colour: ${request.primaryColour}` : ''}
|
|
33
|
+
Design style: ${style}
|
|
34
|
+
Sections to include: ${sections}
|
|
35
|
+
|
|
36
|
+
Generate a complete, production-ready single-file HTML landing page.
|
|
37
|
+
`.trim();
|
|
38
|
+
logger.info('Generating landing page', {
|
|
39
|
+
style,
|
|
40
|
+
briefLength: request.brief.length,
|
|
41
|
+
model: request.model,
|
|
42
|
+
});
|
|
43
|
+
let response;
|
|
44
|
+
try {
|
|
45
|
+
const result = await this.geminiService.chat({
|
|
46
|
+
message: prompt,
|
|
47
|
+
systemPrompt: SYSTEM_PROMPT,
|
|
48
|
+
model: request.model,
|
|
49
|
+
maxTokens: 16384,
|
|
50
|
+
grounding: false,
|
|
51
|
+
});
|
|
52
|
+
response = result.content;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
throw new GeminiError(`Landing page generation failed: ${error.message}`);
|
|
56
|
+
}
|
|
57
|
+
// Strip markdown fences if model includes them despite instructions
|
|
58
|
+
const fenceMatch = response.match(/```(?:html)?\s*([\s\S]+?)```/i);
|
|
59
|
+
const html = fenceMatch ? fenceMatch[1].trim() : response.trim();
|
|
60
|
+
if (!html.toLowerCase().includes('<!doctype') && !html.toLowerCase().includes('<html')) {
|
|
61
|
+
throw new GeminiError('Model did not return valid HTML. Try again or adjust the brief.');
|
|
62
|
+
}
|
|
63
|
+
return html;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=generate-landing-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-landing-page.js","sourceRoot":"","sources":["../../src/tools/generate-landing-page.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAWxC,MAAM,aAAa,GAAG;;;;;;;;;;;;+DAYyC,CAAC;AAEhE,MAAM,OAAO,uBAAuB;IACd;IAApB,YAAoB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAEpD,KAAK,CAAC,OAAO,CAAC,OAA2B;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAM;YACvC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7B,CAAC,CAAC,8CAA8C,CAAC;QAEnD,MAAM,MAAM,GAAG;;;EAGjB,OAAO,CAAC,KAAK;;EAEb,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,yBAAyB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;EACzE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,yBAAyB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE;gBAC/D,KAAK;uBACE,QAAQ;;;CAG9B,CAAC,IAAI,EAAE,CAAC;QAEL,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;YACrC,KAAK;YACL,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;YACjC,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAC3C,OAAO,EAAE,MAAM;gBACf,YAAY,EAAE,aAAa;gBAC3B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS,EAAE,KAAK;gBAChB,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YACH,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,WAAW,CAAC,mCAAoC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,oEAAoE;QACpE,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEjE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvF,MAAM,IAAI,WAAW,CAAC,iEAAiE,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GeminiService } from '../services/gemini/index.js';
|
|
2
|
+
export interface GenerateSVGRequest {
|
|
3
|
+
prompt: string;
|
|
4
|
+
width?: number;
|
|
5
|
+
height?: number;
|
|
6
|
+
style?: 'technical' | 'artistic' | 'minimal' | 'data-viz';
|
|
7
|
+
model?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class GenerateSVGTool {
|
|
10
|
+
private geminiService;
|
|
11
|
+
constructor(geminiService: GeminiService);
|
|
12
|
+
execute(request: GenerateSVGRequest): Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=generate-svg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-svg.d.ts","sourceRoot":"","sources":["../../src/tools/generate-svg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAI5D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmCD,qBAAa,eAAe;IACd,OAAO,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAE1C,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;CA0E5D"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { GeminiError } from '../utils/error-handler.js';
|
|
2
|
+
import logger from '../utils/logger.js';
|
|
3
|
+
const SYSTEM_PROMPT = `You are an expert SVG developer specializing in creating clean, SIMPLE, scalable vector graphics.
|
|
4
|
+
Generate complete, valid SVG code that is self-contained and production-ready.
|
|
5
|
+
|
|
6
|
+
CRITICAL CONSTRAINTS - MUST FOLLOW:
|
|
7
|
+
- Maximum 150 lines of SVG code total
|
|
8
|
+
- Prefer simple shapes (rect, circle, ellipse, line, polygon) over complex paths
|
|
9
|
+
- Use <text> elements for labels - NEVER attempt to draw text with paths
|
|
10
|
+
- Maximum 20 distinct elements (shapes, paths, groups combined)
|
|
11
|
+
- Each <path> should have maximum 10 commands (M, L, C, Q, etc.)
|
|
12
|
+
- For icons/logos: Use 3-5 simple shapes maximum
|
|
13
|
+
- For diagrams: Use rectangles and lines with <text> labels
|
|
14
|
+
- For illustrations: Combine 10-15 basic shapes creatively
|
|
15
|
+
|
|
16
|
+
Technical Requirements:
|
|
17
|
+
- Valid SVG with proper viewBox and namespace declaration
|
|
18
|
+
- Clean, readable code with proper formatting and indentation
|
|
19
|
+
- Use semantic groups (<g>) for logical organization
|
|
20
|
+
- Include <title> and <desc> for accessibility
|
|
21
|
+
- Use inline CSS within <style> tags when needed
|
|
22
|
+
- No external dependencies - all fonts, gradients, patterns inline
|
|
23
|
+
- Prefer solid fills over complex gradients
|
|
24
|
+
- Use appropriate SVG elements (rect, circle, path, polygon, text, etc.)
|
|
25
|
+
|
|
26
|
+
EFFICIENCY RULES:
|
|
27
|
+
- ONE rectangle is better than a path with 4 lines
|
|
28
|
+
- ONE circle is better than a path with arc commands
|
|
29
|
+
- ONE <text> element is better than trying to draw letters
|
|
30
|
+
- Simple gradients (2-3 stops) are acceptable, complex ones are not
|
|
31
|
+
- Reuse elements with <use> and <defs> when possible
|
|
32
|
+
|
|
33
|
+
CRITICAL OUTPUT FORMAT:
|
|
34
|
+
Return ONLY the raw, valid SVG code. Do not wrap it in markdown backticks. Do not include any explanations or conversational text before or after the SVG.`;
|
|
35
|
+
export class GenerateSVGTool {
|
|
36
|
+
geminiService;
|
|
37
|
+
constructor(geminiService) {
|
|
38
|
+
this.geminiService = geminiService;
|
|
39
|
+
}
|
|
40
|
+
async execute(request) {
|
|
41
|
+
const width = request.width || 800;
|
|
42
|
+
const height = request.height || 600;
|
|
43
|
+
const style = request.style || 'technical';
|
|
44
|
+
const styleGuides = {
|
|
45
|
+
technical: 'Clean technical diagram style with clear labels, grid-aligned elements, and professional color scheme (blues, greys). Suitable for architecture diagrams, flowcharts, system designs.',
|
|
46
|
+
artistic: 'Creative, visually striking design with gradients, interesting compositions, and artistic flair. Suitable for logos, illustrations, decorative graphics.',
|
|
47
|
+
minimal: 'Minimalist design with simple shapes, limited color palette (2-3 colors max), and plenty of whitespace. Clean, modern aesthetic.',
|
|
48
|
+
'data-viz': 'Data visualization style with clear axes, legends, labels, and appropriate chart types. Professional presentation quality.'
|
|
49
|
+
};
|
|
50
|
+
const prompt = `
|
|
51
|
+
Create a SIMPLE, ELEGANT SVG graphic for the following request:
|
|
52
|
+
|
|
53
|
+
${request.prompt}
|
|
54
|
+
|
|
55
|
+
Dimensions: ${width}x${height}
|
|
56
|
+
Style: ${style} - ${styleGuides[style]}
|
|
57
|
+
|
|
58
|
+
STRICT CONSTRAINTS:
|
|
59
|
+
- Maximum 150 lines of code total
|
|
60
|
+
- Maximum 20 elements (shapes + paths + groups)
|
|
61
|
+
- Use basic shapes (rect, circle, line) - avoid complex paths
|
|
62
|
+
- Use <text> elements for any text - NEVER draw letters with paths
|
|
63
|
+
- Each path maximum 10 commands
|
|
64
|
+
|
|
65
|
+
Generate a complete, production-ready SVG with viewBox="0 0 ${width} ${height}".
|
|
66
|
+
|
|
67
|
+
Remember: Elegant simplicity beats complex over-engineering. Fewer elements, clearer result.
|
|
68
|
+
`.trim();
|
|
69
|
+
logger.info('Generating SVG', {
|
|
70
|
+
style,
|
|
71
|
+
dimensions: `${width}x${height}`,
|
|
72
|
+
model: request.model,
|
|
73
|
+
});
|
|
74
|
+
let response;
|
|
75
|
+
try {
|
|
76
|
+
const result = await this.geminiService.chat({
|
|
77
|
+
message: prompt,
|
|
78
|
+
systemPrompt: SYSTEM_PROMPT,
|
|
79
|
+
model: request.model || 'gemini-3-flash-preview',
|
|
80
|
+
maxTokens: 8192,
|
|
81
|
+
grounding: false,
|
|
82
|
+
});
|
|
83
|
+
response = result.content;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
throw new GeminiError(`SVG generation failed: ${error.message}`);
|
|
87
|
+
}
|
|
88
|
+
// Strip markdown fences and any extra whitespace/text
|
|
89
|
+
let svg = response.trim();
|
|
90
|
+
// Remove markdown code blocks
|
|
91
|
+
svg = svg.replace(/^```(?:xml|svg|html)?\n/i, '').replace(/\n```$/i, '');
|
|
92
|
+
// If there's still a markdown fence, try more aggressive matching
|
|
93
|
+
const fenceMatch = svg.match(/```(?:svg|xml|html)?\s*([\s\S]+?)```/i);
|
|
94
|
+
if (fenceMatch) {
|
|
95
|
+
svg = fenceMatch[1].trim();
|
|
96
|
+
}
|
|
97
|
+
// Remove any leading/trailing whitespace
|
|
98
|
+
svg = svg.trim();
|
|
99
|
+
// Validate SVG
|
|
100
|
+
if (!svg.toLowerCase().includes('<svg') || !svg.toLowerCase().includes('</svg>')) {
|
|
101
|
+
throw new GeminiError('Model did not return valid SVG. Try again or adjust the prompt.');
|
|
102
|
+
}
|
|
103
|
+
return svg;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=generate-svg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-svg.js","sourceRoot":"","sources":["../../src/tools/generate-svg.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAUxC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2JA+BqI,CAAC;AAE5J,MAAM,OAAO,eAAe;IACN;IAApB,YAAoB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAEpD,KAAK,CAAC,OAAO,CAAC,OAA2B;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC;QACnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;QACrC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC;QAE3C,MAAM,WAAW,GAA2B;YAC1C,SAAS,EAAE,uLAAuL;YAClM,QAAQ,EAAE,0JAA0J;YACpK,OAAO,EAAE,kIAAkI;YAC3I,UAAU,EAAE,4HAA4H;SACzI,CAAC;QAEF,MAAM,MAAM,GAAG;;;EAGjB,OAAO,CAAC,MAAM;;cAEF,KAAK,IAAI,MAAM;SACpB,KAAK,MAAM,WAAW,CAAC,KAAK,CAAC;;;;;;;;;8DASwB,KAAK,IAAI,MAAM;;;CAG5E,CAAC,IAAI,EAAE,CAAC;QAEL,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC5B,KAAK;YACL,UAAU,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE;YAChC,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAC3C,OAAO,EAAE,MAAM;gBACf,YAAY,EAAE,aAAa;gBAC3B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,wBAAwB;gBAChD,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YACH,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,WAAW,CAAC,0BAA2B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,sDAAsD;QACtD,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAE1B,8BAA8B;QAC9B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAEzE,kEAAkE;QAClE,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACtE,IAAI,UAAU,EAAE,CAAC;YACf,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,yCAAyC;QACzC,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,eAAe;QACf,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjF,MAAM,IAAI,WAAW,CAAC,iEAAiE,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { TextContent, ImageContent } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { GeminiService } from '../services/gemini/index.js';
|
|
3
|
+
interface VideoResult {
|
|
4
|
+
videoPath: string;
|
|
5
|
+
mimeType: string;
|
|
6
|
+
duration: number;
|
|
7
|
+
resolution: string;
|
|
8
|
+
aspectRatio: string;
|
|
9
|
+
prompt: string;
|
|
10
|
+
thumbnailPath?: string;
|
|
11
|
+
htmlPlayerPath?: string;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
interface GenerateVideoResult {
|
|
15
|
+
content: (TextContent | ImageContent)[];
|
|
16
|
+
metadata: VideoResult;
|
|
17
|
+
}
|
|
18
|
+
export declare class GenerateVideoTool {
|
|
19
|
+
private geminiService;
|
|
20
|
+
constructor(geminiService: GeminiService);
|
|
21
|
+
execute(args: any): Promise<GenerateVideoResult>;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=generate-video.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-video.d.ts","sourceRoot":"","sources":["../../src/tools/generate-video.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAO5D,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,mBAAmB;IAC3B,OAAO,EAAE,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACxC,QAAQ,EAAE,WAAW,CAAC;CACvB;AAED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAE1C,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAiLvD"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { McpError } from '../utils/error-handler.js';
|
|
2
|
+
import { extractThumbnail, generateVideoPlayerHTML, saveVideoPlayerHTML } from '../utils/video-utils.js';
|
|
3
|
+
import logger from '../utils/logger.js';
|
|
4
|
+
import fs from 'fs/promises';
|
|
5
|
+
export class GenerateVideoTool {
|
|
6
|
+
geminiService;
|
|
7
|
+
constructor(geminiService) {
|
|
8
|
+
this.geminiService = geminiService;
|
|
9
|
+
}
|
|
10
|
+
async execute(args) {
|
|
11
|
+
try {
|
|
12
|
+
logger.info('Starting video generation', {
|
|
13
|
+
prompt: args.prompt.slice(0, 100),
|
|
14
|
+
duration: args.durationSeconds || 8,
|
|
15
|
+
resolution: args.resolution || '1080p'
|
|
16
|
+
});
|
|
17
|
+
const result = await this.geminiService.generateVideo({
|
|
18
|
+
prompt: args.prompt,
|
|
19
|
+
model: args.model,
|
|
20
|
+
aspectRatio: args.aspectRatio,
|
|
21
|
+
resolution: args.resolution,
|
|
22
|
+
durationSeconds: args.durationSeconds,
|
|
23
|
+
generateAudio: args.generateAudio,
|
|
24
|
+
sampleCount: args.sampleCount,
|
|
25
|
+
seed: args.seed,
|
|
26
|
+
outputPath: args.outputPath,
|
|
27
|
+
firstFrameImage: args.firstFrameImage,
|
|
28
|
+
referenceImages: args.referenceImages
|
|
29
|
+
});
|
|
30
|
+
const responseContent = [];
|
|
31
|
+
// Generate summary report
|
|
32
|
+
let report = '# Video Generation Complete\n\n';
|
|
33
|
+
report += `**Prompt:** ${args.prompt}\n\n`;
|
|
34
|
+
report += `**Video Details:**\n`;
|
|
35
|
+
report += `- Duration: ${result.duration} seconds\n`;
|
|
36
|
+
report += `- Resolution: ${result.resolution}\n`;
|
|
37
|
+
report += `- Aspect Ratio: ${result.aspectRatio}\n`;
|
|
38
|
+
report += `- Format: ${result.mimeType}\n`;
|
|
39
|
+
report += `- Audio: ${args.generateAudio !== false ? 'Enabled' : 'Disabled'}\n`;
|
|
40
|
+
if (args.firstFrameImage) {
|
|
41
|
+
report += `- First Frame: Provided (image-to-video mode)\n`;
|
|
42
|
+
}
|
|
43
|
+
if (args.referenceImages?.length) {
|
|
44
|
+
report += `- Reference Images: ${args.referenceImages.length} (${args.referenceImages.map((r) => r.referenceType).join(', ')})\n`;
|
|
45
|
+
}
|
|
46
|
+
report += `\n`;
|
|
47
|
+
// Video file info
|
|
48
|
+
const stats = await fs.stat(result.videoPath);
|
|
49
|
+
const sizeInMB = (stats.size / (1024 * 1024)).toFixed(2);
|
|
50
|
+
report += `**Output:**\n`;
|
|
51
|
+
report += `- Video: \`${result.videoPath}\` (${sizeInMB} MB)\n`;
|
|
52
|
+
// Generate thumbnail if requested
|
|
53
|
+
let thumbnailPath;
|
|
54
|
+
if (args.generateThumbnail !== false) {
|
|
55
|
+
try {
|
|
56
|
+
thumbnailPath = await extractThumbnail({
|
|
57
|
+
videoPath: result.videoPath,
|
|
58
|
+
timeSeconds: 1
|
|
59
|
+
});
|
|
60
|
+
if (thumbnailPath) {
|
|
61
|
+
report += `- Thumbnail: \`${thumbnailPath}\`\n`;
|
|
62
|
+
result.thumbnailPath = thumbnailPath;
|
|
63
|
+
// Include thumbnail as image content for Claude Desktop preview
|
|
64
|
+
try {
|
|
65
|
+
const thumbnailData = await fs.readFile(thumbnailPath);
|
|
66
|
+
const base64Thumbnail = thumbnailData.toString('base64');
|
|
67
|
+
responseContent.push({
|
|
68
|
+
type: 'image',
|
|
69
|
+
data: base64Thumbnail,
|
|
70
|
+
mimeType: 'image/jpeg'
|
|
71
|
+
});
|
|
72
|
+
logger.info('Thumbnail included in response', { path: thumbnailPath });
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
logger.warn('Failed to include thumbnail in response', { error });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
report += `- Thumbnail: ⚠️ Not generated (ffmpeg not available)\n`;
|
|
80
|
+
logger.warn('Thumbnail extraction skipped - ffmpeg not found');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
logger.warn('Thumbnail extraction failed', { error: error.message });
|
|
85
|
+
report += `- Thumbnail: ⚠️ Generation failed\n`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Generate HTML player if requested
|
|
89
|
+
let htmlPlayerPath;
|
|
90
|
+
let htmlPlayerContent;
|
|
91
|
+
if (args.generateHTMLPlayer !== false) {
|
|
92
|
+
try {
|
|
93
|
+
const htmlContent = generateVideoPlayerHTML(result.videoPath, thumbnailPath, {
|
|
94
|
+
prompt: args.prompt,
|
|
95
|
+
duration: result.duration,
|
|
96
|
+
resolution: result.resolution,
|
|
97
|
+
aspectRatio: result.aspectRatio
|
|
98
|
+
});
|
|
99
|
+
htmlPlayerPath = result.videoPath.replace(/\.(mp4|webm)$/, '.html');
|
|
100
|
+
await saveVideoPlayerHTML(htmlContent, htmlPlayerPath);
|
|
101
|
+
htmlPlayerContent = htmlContent; // Store for inline preview
|
|
102
|
+
report += `- HTML Player: \`${htmlPlayerPath}\`\n`;
|
|
103
|
+
report += `\n💡 **Tip:** Video player available in inline preview below.\n`;
|
|
104
|
+
logger.info('HTML player generated', { path: htmlPlayerPath });
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
logger.warn('HTML player generation failed', { error: error.message });
|
|
108
|
+
report += `- HTML Player: ⚠️ Generation failed\n`;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
report += `\n---\n\n`;
|
|
112
|
+
report += `⏱️ **Processing Time:** Video generation took approximately 2-5 minutes\n`;
|
|
113
|
+
report += `🎬 **Model:** Veo 3.1 (Google's latest video generation model)\n`;
|
|
114
|
+
// Add text content first
|
|
115
|
+
responseContent.unshift({
|
|
116
|
+
type: 'text',
|
|
117
|
+
text: report
|
|
118
|
+
});
|
|
119
|
+
logger.info('Video generation completed successfully', {
|
|
120
|
+
videoPath: result.videoPath,
|
|
121
|
+
size: sizeInMB + ' MB',
|
|
122
|
+
hasThumbnail: !!thumbnailPath
|
|
123
|
+
});
|
|
124
|
+
const metadata = {
|
|
125
|
+
videoPath: result.videoPath,
|
|
126
|
+
mimeType: result.mimeType || 'video/mp4',
|
|
127
|
+
duration: args.durationSeconds || 8,
|
|
128
|
+
resolution: args.resolution || '1080p',
|
|
129
|
+
aspectRatio: args.aspectRatio || '16:9',
|
|
130
|
+
prompt: args.prompt,
|
|
131
|
+
thumbnailPath,
|
|
132
|
+
htmlPlayerPath,
|
|
133
|
+
videoHtml: htmlPlayerContent // Include HTML for inline preview
|
|
134
|
+
};
|
|
135
|
+
return {
|
|
136
|
+
content: responseContent,
|
|
137
|
+
metadata
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
logger.error('Video generation failed', {
|
|
142
|
+
error: error.message,
|
|
143
|
+
stack: error.stack
|
|
144
|
+
});
|
|
145
|
+
if (error instanceof McpError) {
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
const errorMessage = error.message || 'Unknown error';
|
|
149
|
+
throw new McpError(`Video generation failed: ${errorMessage}\n\n` +
|
|
150
|
+
`This could be due to:\n` +
|
|
151
|
+
`1. API quota or rate limits exceeded\n` +
|
|
152
|
+
`2. Invalid prompt or parameters\n` +
|
|
153
|
+
`3. Network connectivity issues\n` +
|
|
154
|
+
`4. Model unavailable or overloaded\n\n` +
|
|
155
|
+
`Please try:\n` +
|
|
156
|
+
`- Simplifying your prompt\n` +
|
|
157
|
+
`- Reducing resolution or duration\n` +
|
|
158
|
+
`- Waiting a few moments before retrying\n` +
|
|
159
|
+
`- Checking your API quota at https://aistudio.google.com/`, 'VIDEO_GENERATION_FAILED');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=generate-video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-video.js","sourceRoot":"","sources":["../../src/tools/generate-video.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-prompt-assistant.d.ts","sourceRoot":"","sources":["../../src/tools/image-prompt-assistant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA2tBpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqG/D"}
|