Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.
.claude/skills/loulanyue-fal-ai-media/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 158% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 95% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 61% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 89% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 55% | 0% |
Generate images, videos, and audio using fal.ai models via MCP.
fal.ai MCP server must be configured. Add to ~/.claude.json:
json"fal-ai": { "command": "npx", "args": ["-y", "fal-ai-mcp-server"], "env": { "FAL_KEY": "YOUR_FAL_KEY_HERE" } }
Get an API key at fal.ai.
The fal.ai MCP provides these tools:
search — Find available models by keywordfind — Get model details and parametersgenerate — Run a model with parametersresult — Check async generation statusstatus — Check job statuscancel — Cancel a running jobestimate_cost — Estimate generation costmodels — List popular modelsupload — Upload files for use as inputsBest for: quick iterations, drafts, text-to-image, image editing.
generate(
app_id: "fal-ai/nano-banana-2",
input_data: {
"prompt": "a futuristic cityscape at sunset, cyberpunk style",
"image_size": "landscape_16_9",
"num_images": 1,
"seed": 42
}
)Best for: production images, realism, typography, detailed prompts.
generate(
app_id: "fal-ai/nano-banana-pro",
input_data: {
"prompt": "professional product photo of wireless headphones on marble surface, studio lighting",
"image_size": "square",
"num_images": 1,
"guidance_scale": 7.5
}
)| Param | Type | Options | Notes | |-------|------|---------|-------| | prompt | string | required | Describe what you want | | image_size | string | square, portrait_4_3, landscape_16_9, portrait_16_9, landscape_4_3 | Aspect ratio | | num_images | number | 1-4 | How many to generate | | seed | number | any integer | Reproducibility | | guidance_scale | number | 1-20 | How closely to follow the prompt (higher = more literal) |
Use Nano Banana 2 with an input image for inpainting, outpainting, or style transfer:
# First upload the source image
upload(file_path: "/path/to/image.png")
# Then generate with image input
generate(
app_id: "fal-ai/nano-banana-2",
input_data: {
"prompt": "same scene but in watercolor style",
"image_url": "<uploaded_url>",
"image_size": "landscape_16_9"
}
)Best for: text-to-video, image-to-video with high motion quality.
generate(
app_id: "fal-ai/seedance-1-0-pro",
input_data: {
"prompt": "a drone flyover of a mountain lake at golden hour, cinematic",
"duration": "5s",
"aspect_ratio": "16:9",
"seed": 42
}
)Best for: text/image-to-video with native audio generation.
generate(
app_id: "fal-ai/kling-video/v3/pro",
input_data: {
"prompt": "ocean waves crashing on a rocky coast, dramatic clouds",
"duration": "5s",
"aspect_ratio": "16:9"
}
)Best for: video with generated sound, high visual quality.
generate(
app_id: "fal-ai/veo-3",
input_data: {
"prompt": "a bustling Tokyo street market at night, neon signs, crowd noise",
"aspect_ratio": "16:9"
}
)Start from an existing image:
generate(
app_id: "fal-ai/seedance-1-0-pro",
input_data: {
"prompt": "camera slowly zooms out, gentle wind moves the trees",
"image_url": "<uploaded_image_url>",
"duration": "5s"
}
)| Param | Type | Options | Notes | |-------|------|---------|-------| | prompt | string | required | Describe the video | | duration | string | "5s", "10s" | Video length | | aspect_ratio | string | "16:9", "9:16", "1:1" | Frame ratio | | seed | number | any integer | Reproducibility | | image_url | string | URL | Source image for image-to-video |
Text-to-speech with natural, conversational quality.
generate(
app_id: "fal-ai/csm-1b",
input_data: {
"text": "Hello, welcome to the demo. Let me show you how this works.",
"speaker_id": 0
}
)Generate matching audio from video content.
generate(
app_id: "fal-ai/thinksound",
input_data: {
"video_url": "<video_url>",
"prompt": "ambient forest sounds with birds chirping"
}
)For professional voice synthesis, use ElevenLabs directly:
pythonimport os import requests resp = requests.post( "https://api.elevenlabs.io/v1/text-to-speech/<voice_id>", headers={ "xi-api-key": os.environ["ELEVENLABS_API_KEY"], "Content-Type": "application/json" }, json={ "text": "Your text here", "model_id": "eleven_turbo_v2_5", "voice_settings": {"stability": 0.5, "similarity_boost": 0.75} } ) with open("output.mp3", "wb") as f: f.write(resp.content)
If VideoDB is configured, use its generative audio:
python# Voice generation audio = coll.generate_voice(text="Your narration here", voice="alloy") # Music generation music = coll.generate_music(prompt="upbeat electronic background music", duration=30) # Sound effects sfx = coll.generate_sound_effect(prompt="thunder crack followed by rain")
Before generating, check estimated cost:
estimate_cost(
estimate_type: "unit_price",
endpoints: {
"fal-ai/nano-banana-pro": {
"unit_quantity": 1
}
}
)Find models for specific tasks:
search(query: "text to video")
find(endpoint_ids: ["fal-ai/seedance-1-0-pro"])
models()seed for reproducible results when iterating on promptsestimate_cost before running expensive video generationsvideodb — Video processing, editing, and streamingvideo-editing — AI-powered video editing workflowscontent-engine — Content creation for social platforms| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 4,225 | 7,467 | +77% | 1 | 1 | 0% | 710 | 2,591 | +265% | 0 | 0 | — |
case-02 | fail→fail | 8,298 | 8,575 | +3% | 1 | 1 | 0% | 1,405 | 2,886 | +105% | 0 | 0 | — |
case-03 | fail→fail | 4,287 | 8,438 | +97% | 1 | 1 | 0% | 646 | 2,833 | +339% | 0 | 0 | — |
case-04 | fail→fail | 11,427 | 8,780 | -23% | 1 | 1 | 0% | 1,872 | 2,664 | +42% | 0 | 0 | — |
case-05 | fail→pass | 6,774 | 4,420 | -35% | 1 | 1 | 0% | 1,137 | 2,935 | +158% | 0 | 0 | — |
case-06 | fail→pass | 10,779 | 9,774 | -9% | 1 | 1 | 0% | 1,666 | 3,241 | +95% | 0 | 0 | — |
case-07 | fail→pass | 9,628 | 3,044 | -68% | 1 | 1 | 0% | 1,666 | 2,675 | +61% | 0 | 0 | — |
case-08 | fail→fail | 8,327 | 6,414 | -23% | 1 | 1 | 0% | 1,499 | 2,515 | +68% | 0 | 0 | — |
case-09 | pass→fail | 9,309 | 8,229 | -12% | 1 | 1 | 0% | 1,494 | 2,830 | +89% | 0 | 0 | — |
case-10 | fail→pass | 9,675 | 8,387 | -13% | 1 | 1 | 0% | 1,660 | 3,139 | +89% | 0 | 0 | — |
case-11 | pass→pass | 10,984 | 7,840 | -29% | 1 | 1 | 0% | 2,305 | 3,702 | +61% | 0 | 0 | — |
case-12 | fail→pass | 10,318 | 4,016 | -61% | 1 | 1 | 0% | 1,881 | 2,911 | +55% | 0 | 0 | — |
case-13 | pass→pass | 9,026 | 6,727 | -25% | 1 | 1 | 0% | 1,651 | 3,379 | +105% | 0 | 0 | — |
case-14 | fail→fail | 9,023 | 1,819 | -80% | 1 | 1 | 0% | 894 | 2,342 | +162% | 0 | 0 | — |
case-15 | fail→fail | 6,977 | 1,997 | -71% | 1 | 1 | 0% | 1,184 | 2,485 | +110% | 0 | 0 | — |
case-16 | fail→pass | 9,600 | 2,602 | -73% | 1 | 1 | 0% | 1,793 | 2,581 | +44% | 0 | 0 | — |
case-17 | fail→pass | 4,695 | 2,302 | -51% | 1 | 1 | 0% | 752 | 2,531 | +237% | 0 | 0 | — |
case-18 | pass→pass | 6,854 | 2,107 | -69% | 1 | 1 | 0% | 990 | 2,458 | +148% | 0 | 0 | — |
case-19 | pass→pass | 7,064 | 2,095 | -70% | 1 | 1 | 0% | 1,183 | 2,428 | +105% | 0 | 0 | — |
case-20 | pass→pass | 1,892 | 2,836 | +50% | 1 | 1 | 0% | 310 | 2,599 | +738% | 0 | 0 | — |
case-21 | pass→pass | 5,058 | 1,770 | -65% | 1 | 1 | 0% | 868 | 2,404 | +177% | 0 | 0 | — |
case-22 | pass→pass | 9,012 | 2,644 | -71% | 1 | 1 | 0% | 1,590 | 2,618 | +65% | 0 | 0 | — |
case-23 | fail→fail | 5,543 | 2,191 | -60% | 1 | 1 | 0% | 885 | 2,502 | +183% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 20 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +26 percentage points is the difference between those two pass rates over the 20 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.