Skip to main content
Glama
RamboRogers

FAL Image/Video MCP Server

by RamboRogers

veo3

Generate videos from text prompts using Google DeepMind's Veo 3 model with configurable duration and aspect ratios for creative content production.

Instructions

Veo 3 - Google DeepMind's latest with speech and audio

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
promptYesText prompt for video generation
durationNo
aspect_ratioNo16:9

Implementation Reference

  • src/index.ts:110-118 (registration)
    MODEL_REGISTRY.textToVideo array registers the 'veo3' tool with its endpoint and metadata. This registry is used for tool listing and dispatching.
    textToVideo: [
      { id: 'veo3', endpoint: 'fal-ai/veo3', name: 'Veo 3', description: 'Google DeepMind\'s latest with speech and audio' },
      { id: 'kling_master_text', endpoint: 'fal-ai/kling-video/v2.1/master/text-to-video', name: 'Kling 2.1 Master', description: 'Premium text-to-video with motion fluidity' },
      { id: 'pixverse_text', endpoint: 'fal-ai/pixverse/v4.5/text-to-video', name: 'Pixverse V4.5', description: 'Advanced text-to-video generation' },
      { id: 'magi', endpoint: 'fal-ai/magi', name: 'Magi', description: 'Creative video generation' },
      { id: 'luma_ray2', endpoint: 'fal-ai/luma-dream-machine/ray-2', name: 'Luma Ray 2', description: 'Latest Luma Dream Machine' },
      { id: 'wan_pro_text', endpoint: 'fal-ai/wan-pro/text-to-video', name: 'Wan Pro', description: 'Professional video effects' },
      { id: 'vidu_text', endpoint: 'fal-ai/vidu/q1/text-to-video', name: 'Vidu Q1', description: 'High-quality text-to-video' }
    ],
  • Dynamic schema generation for textToVideo tools like 'veo3', defining input parameters: prompt (required), duration, aspect_ratio.
    } else if (category === 'textToVideo') {
      baseSchema.inputSchema.properties = {
        prompt: { type: 'string', description: 'Text prompt for video generation' },
        duration: { type: 'number', default: 5, minimum: 1, maximum: 30 },
        aspect_ratio: { type: 'string', enum: ['16:9', '9:16', '1:1', '4:3', '3:4'], default: '16:9' },
      };
      baseSchema.inputSchema.required = ['prompt'];
    } else if (category === 'imageToVideo') {
  • Core handler function for all textToVideo tools including 'veo3'. Calls fal.subscribe on the model endpoint, processes video output with downloads and data URLs.
    private async handleTextToVideo(args: any, model: any) {
      const { prompt, duration = 5, aspect_ratio = '16:9' } = args;
    
      try {
        // Configure FAL client lazily with query config override
        configureFalClient(this.currentQueryConfig);
        const inputParams: any = { prompt };
        
        if (duration) inputParams.duration = duration;
        if (aspect_ratio) inputParams.aspect_ratio = aspect_ratio;
    
        const result = await fal.subscribe(model.endpoint, { input: inputParams });
        const videoData = result.data as FalVideoResult;
        const videoProcessed = await downloadAndProcessVideo(videoData.video.url, model.id);
    
        return {
          content: [
            {
              type: 'text',
              text: JSON.stringify({
                model: model.name,
                id: model.id,
                endpoint: model.endpoint,
                prompt,
                video: {
                  url: videoData.video.url,
                  localPath: videoProcessed.localPath,
                  ...(videoProcessed.dataUrl && { dataUrl: videoProcessed.dataUrl }),
                  width: videoData.video.width,
                  height: videoData.video.height,
                },
                metadata: inputParams,
                download_path: DOWNLOAD_PATH,
                data_url_settings: {
                  enabled: ENABLE_DATA_URLS,
                  max_size_mb: Math.round(MAX_DATA_URL_SIZE / 1024 / 1024),
                },
                autoopen_settings: {
                  enabled: AUTOOPEN,
                  note: AUTOOPEN ? "Files automatically opened with default application" : "Auto-open disabled"
                },
              }, null, 2),
            },
          ],
        };
      } catch (error) {
        throw new Error(`${model.name} generation failed: ${error}`);
      }
    }
  • Dispatch logic in CallToolRequestSchema handler routes 'veo3' calls to handleTextToVideo based on MODEL_REGISTRY lookup.
    const model = getModelById(name);
    if (!model) {
      throw new McpError(
        ErrorCode.MethodNotFound,
        `Unknown model: ${name}`
      );
    }
    
    // Determine category and handle accordingly
    if (MODEL_REGISTRY.imageGeneration.find(m => m.id === name)) {
      return await this.handleImageGeneration(args, model);
    } else if (MODEL_REGISTRY.textToVideo.find(m => m.id === name)) {
      return await this.handleTextToVideo(args, model);
    } else if (MODEL_REGISTRY.imageToVideo.find(m => m.id === name)) {
      return await this.handleImageToVideo(args, model);
    }
  • src/index.ts:402-405 (registration)
    Tool registration in ListToolsRequestSchema dynamically adds 'veo3' to the tools list using generateToolSchema.
    }
    for (const model of MODEL_REGISTRY.textToVideo) {
      tools.push(this.generateToolSchema(model, 'textToVideo'));
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/RamboRogers/fal-image-video-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server