Skip to main content
Glama
RamboRogers

FAL Image/Video MCP Server

by RamboRogers

ltx_video

Convert images into animated videos by providing a motion description prompt. Specify duration, aspect ratio, and control parameters to generate videos from image inputs.

Instructions

LTX Video - Fast and high-quality image-to-video conversion

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
image_urlYesURL of the input image
promptYesMotion description prompt
durationNoVideo duration in seconds5
aspect_ratioNo16:9
negative_promptNoWhat to avoid in the video
cfg_scaleNoHow closely to follow the prompt

Implementation Reference

  • Handler function that executes the 'ltx_video' tool by calling the FAL.ai endpoint 'fal-ai/ltx-video-13b-distilled/image-to-video', processing input parameters, handling video output including downloads and data URLs.
    private async handleImageToVideo(args: any, model: any) {
      const { 
        image_url, 
        prompt, 
        duration = '5', 
        aspect_ratio = '16:9',
        negative_prompt,
        cfg_scale
      } = args;
    
      try {
        // Configure FAL client lazily with query config override
        configureFalClient(this.currentQueryConfig);
        const inputParams: any = { image_url, prompt };
        
        // Add optional parameters
        if (duration) inputParams.duration = duration;
        if (aspect_ratio) inputParams.aspect_ratio = aspect_ratio;
        if (negative_prompt) inputParams.negative_prompt = negative_prompt;
        if (cfg_scale !== undefined) inputParams.cfg_scale = cfg_scale;
    
        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,
                input_image: image_url,
                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}`);
      }
    }
  • Input schema definition for image-to-video tools, including ltx_video, specifying required image_url and prompt, and optional parameters like duration, aspect_ratio, etc.
    } else if (category === 'imageToVideo') {
      baseSchema.inputSchema.properties = {
        image_url: { type: 'string', description: 'URL of the input image' },
        prompt: { type: 'string', description: 'Motion description prompt' },
        duration: { type: 'string', enum: ['5', '10'], default: '5', description: 'Video duration in seconds' },
        aspect_ratio: { type: 'string', enum: ['16:9', '9:16', '1:1'], default: '16:9' },
        negative_prompt: { type: 'string', description: 'What to avoid in the video' },
        cfg_scale: { type: 'number', default: 0.5, minimum: 0, maximum: 1, description: 'How closely to follow the prompt' }
      };
      baseSchema.inputSchema.required = ['image_url', 'prompt'];
    }
  • src/index.ts:120-120 (registration)
    Registration of the ltx_video tool in the MODEL_REGISTRY.imageToVideo array, defining its ID, endpoint, name, and description.
    { id: 'ltx_video', endpoint: 'fal-ai/ltx-video-13b-distilled/image-to-video', name: 'LTX Video', description: 'Fast and high-quality image-to-video conversion' },
  • src/index.ts:406-408 (registration)
    Dynamic registration of ltx_video tool schema during tools/list response by iterating over imageToVideo models.
    for (const model of MODEL_REGISTRY.imageToVideo) {
      tools.push(this.generateToolSchema(model, 'imageToVideo'));
    }
  • Dispatch logic in CallToolRequestSchema handler that routes 'ltx_video' calls to the handleImageToVideo function based on model ID.
    } else if (MODEL_REGISTRY.imageToVideo.find(m => m.id === name)) {
      return await this.handleImageToVideo(args, model);
    }

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