Skip to main content
Glama
RamboRogers

FAL Image/Video MCP Server

by RamboRogers

luma_ray2_image

Convert images into videos by describing motion. Upload an image, specify movement, and generate videos in various durations and aspect ratios.

Instructions

Luma Ray 2 I2V - Latest Luma image-to-video

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

  • Core execution handler for the luma_ray2_image tool. Configures FAL client, calls the specific endpoint, processes video output with downloads/data URLs, and returns formatted result.
    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 luma_ray2_image, specifying parameters like image_url, prompt, duration, 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:119-127 (registration)
    MODEL_REGISTRY definition registering luma_ray2_image with its endpoint and metadata, used for tool discovery and dispatch.
    imageToVideo: [
      { 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' },
      { id: 'kling_master_image', endpoint: 'fal-ai/kling-video/v2.1/master/image-to-video', name: 'Kling 2.1 Master I2V', description: 'Premium image-to-video conversion' },
      { id: 'pixverse_image', endpoint: 'fal-ai/pixverse/v4.5/image-to-video', name: 'Pixverse V4.5 I2V', description: 'Advanced image-to-video' },
      { id: 'wan_pro_image', endpoint: 'fal-ai/wan-pro/image-to-video', name: 'Wan Pro I2V', description: 'Professional image animation' },
      { id: 'hunyuan_image', endpoint: 'fal-ai/hunyuan-video-image-to-video', name: 'Hunyuan I2V', description: 'Open-source image-to-video' },
      { id: 'vidu_image', endpoint: 'fal-ai/vidu/image-to-video', name: 'Vidu I2V', description: 'High-quality image animation' },
      { id: 'luma_ray2_image', endpoint: 'fal-ai/luma-dream-machine/ray-2/image-to-video', name: 'Luma Ray 2 I2V', description: 'Latest Luma image-to-video' }
    ]
  • src/index.ts:404-408 (registration)
    Registration logic in list_tools handler that dynamically creates the tool schema for luma_ray2_image using generateToolSchema.
      tools.push(this.generateToolSchema(model, 'textToVideo'));
    }
    for (const model of MODEL_REGISTRY.imageToVideo) {
      tools.push(this.generateToolSchema(model, 'imageToVideo'));
    }
  • Dispatch logic in CallToolRequestSchema handler that identifies luma_ray2_image as imageToVideo category and calls the appropriate handler.
    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);
    }
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It mentions 'Latest Luma image-to-video' but doesn't describe what the tool actually does behaviorally - whether it generates, processes, or transforms videos, what the output looks like, latency expectations, rate limits, or authentication requirements. For a complex video generation tool, this is inadequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise with just 7 words, front-loading the core functionality ('Luma Ray 2 I2V'). There's zero wasted text, though this conciseness comes at the cost of completeness. Every word earns its place in communicating the essential tool identity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex video generation tool with 6 parameters, no annotations, and no output schema, the description is severely incomplete. It doesn't explain what the tool returns, how to interpret results, error conditions, or behavioral characteristics. The high parameter count and lack of structured metadata require more descriptive context than provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high at 83%, providing good documentation for most parameters. The description adds no parameter information beyond what's in the schema, so it doesn't compensate for the 17% gap or enhance understanding of parameters like 'cfg_scale' or 'negative_prompt'. Baseline 3 is appropriate given the schema does most of the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states this is an 'image-to-video' tool using 'Luma Ray 2' technology, which specifies both the action (convert image to video) and the resource (image). However, it doesn't differentiate from sibling tools like 'luma_ray2' (text-to-video) or 'ltx_video' (another video generation tool), missing explicit sibling distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. With many sibling tools for image/video generation (e.g., flux_dev, hunyuan_image, luma_ray2, ltx_video), there's no indication of this tool's specific use case, prerequisites, or comparison to other options.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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