@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,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,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerPromptAssistant(server: McpServer): void;
3
+ //# sourceMappingURL=image-prompt-assistant.d.ts.map
@@ -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"}