{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_fjgakcttjhaz","handle":"filmlab","url":"https://wellknown.network/agents/filmlab","links":{"self":"https://wellknown.network/agents/filmlab/record.json","html":"https://wellknown.network/agents/filmlab","markdown":"https://wellknown.network/agents/filmlab/record.md","api":"https://wellknown.network/api/v1/agents/filmlab","status":"https://wellknown.network/api/v1/agents/filmlab/status","claim":"https://wellknown.network/agents/filmlab/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/filmlab/claim.json","badge":"https://wellknown.network/agents/filmlab/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/filmlab/history","tools":"https://wellknown.network/api/v1/agents/filmlab/tools"},"ard":{"identifier":"urn:air:mcp-lab.thefilmradar.com:server:filmlab","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"FilmLab","summary":"AI film lab for filmmakers: generate and review images/clips with input provenance, cost preflight","description":"AI film lab for filmmakers: generate and review images/clips with input provenance, cost preflight","publisher":{"name":"com.thefilmradar","url":null},"homepage":"https://lab.thefilmradar.com/mcp","repository":null,"version":"1.1.1","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://mcp-lab.thefilmradar.com/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-08-17T06:27:23.320222Z","publishedAt":"2026-08-17T06:27:23.320222Z","registryName":"com.thefilmradar/filmlab"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"content.writing","name":"Writing & Editing","confidence":1,"provenance":"derived"},{"slug":"media.speech-synthesis","name":"Speech Synthesis","confidence":1,"provenance":"derived"},{"slug":"dev.ci-cd","name":"CI/CD & Deploy","confidence":1,"provenance":"derived"},{"slug":"security.identity","name":"Identity & Access","confidence":1,"provenance":"derived"},{"slug":"commerce.ecommerce","name":"E-commerce Operations","confidence":0.992,"provenance":"derived"},{"slug":"automation.workflows","name":"Workflow Automation","confidence":0.977,"provenance":"derived"},{"slug":"media.music","name":"Music & Audio","confidence":0.962,"provenance":"derived"},{"slug":"data.news","name":"News & Feeds","confidence":0.933,"provenance":"derived"}],"categories":["automation","commerce","content","data","dev","media","security"],"language":"en"},"observed":{"status":"live","statusReason":"Responded 6h ago.","lastOkAt":"2026-10-11T04:24:48.310Z","lastProbedAt":"2026-10-11T04:24:48.310Z","statusComputedAt":"2026-10-11T04:26:42.700Z","reliability30d":{"probes":110,"successRate":1,"p50Ms":92,"basis":"mixed","measures":{"availability":"availability (some checks stopped at authentication)","latency":"response time (mixed)","tools":"partially observed","summary":"Some successful checks reached the service and some stopped at an authentication response; figures combine both."},"checks":{"total":109,"ok":109,"authBoundaryOk":79,"serviceOk":30,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-10-11T04:24:48.310Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":460,"error":null,"detail":{"tools":[{"name":"lab_list_projects","description":"List FilmLab projects (id, title, current pipeline stage). Call this first to find a project_id for the other tools. Shows up to 20 items; `total` counts your a"},{"name":"lab_wissen","description":"Use when the person asks a film-craft question: what a term means, which rule or convention applies, how something is usually done in camera, editing, sound or "},{"name":"lab_widerruf","description":"Record a correction in the FilmOS knowledge layer when the user contradicts something you asserted from it. Use this the moment a contradiction is stated — not "},{"name":"lab_playbook","description":"The rules of one working surface, generated from the code: what the surface is, what an agent can trigger itself, what exists but only by hand, and what does no"},{"name":"lab_list_models","description":"The model catalog: what every video or image model can do — resolutions, durations, aspect ratios, audio, reference limits, price per second or per image — grou"},{"name":"lab_regie_techniken","description":"Use when the person asks HOW to stage or shoot a feeling or effect (which angle, movement, framing or light makes a scene feel tense, tender, triumphant, uneasy"},{"name":"lab_whoami","description":"Who is connected: the FilmLab account (email, user id, name, tier, credits) and how this connection signed in (oauth, oauth_geraet, bridge_key, legacy service u"},{"name":"lab_get_state","description":"One call, the whole picture: account (tier, credits, reset), default models with price, jobs in flight, catalog freshness, project count. Pass project_id for th"},{"name":"lab_get_project","description":"Use when the person asks where a project stands: its current stage, what is finished, what comes next, or wants the project's state before continuing. Get a sin"},{"name":"lab_zielgruppe","description":"Read or set a project's audience (zielgruppe) and target markets (zielmaerkte). With project_id only: read. Set zielgruppe 'kinder' or 'jugendliche' whenever th"},{"name":"lab_get_context","description":"Read the accumulated context/output for one pipeline module of a project (e.g. the IDEE, STORYBOARD or SHOTS stage). Needs project_id and module name."},{"name":"lab_get_job","description":"Get the status of a background job by job_id (status is queued|processing|done|failed). Poll this after starting a long-running generate/export. Returns the job"},{"name":"lab_search_catalog","description":"Search the FilmLab universe catalog of AI tools, news and companies. Query must be at least 2 characters. Returns up to 20 matches with a total count."},{"name":"lab_create_project","description":"Create a new FilmLab project. Returns the new project id. Optionally set a title."},{"name":"lab_run_module","description":"Run ONE pipeline module for a project (context is injected from upstream modules + crew agents). SYNCHRONOUS and LLM-heavy: light modules return in seconds; hea"},{"name":"lab_generate","description":"Generate an image on the production pipeline (fal.ai, quota-tracked, persisted to the project's gallery). Waits up to `wait_s` seconds (default 45) for the imag"},{"name":"lab_animate","description":"Animate a completed image into a clip with a video model. Pick the model from lab_list_models; check the price with get_cost or let the user confirm a card via "},{"name":"lab_animate_batch","description":"Animate MANY images into videos in ONE call (max 25 jobs). Prefer this over looping lab_animate: it validates every job BEFORE spending any quota, so an invalid"},{"name":"lab_propose","description":"Propose a generation for the user to confirm: validates the parameters against the catalog, computes the price, and shows a card (widget hosts) or returns the s"},{"name":"lab_run_proposal","description":"Run a proposal exactly as shown — same model, same parameters, same price. Called by the card's button, or by you after the user confirmed. Single use: the prop"},{"name":"lab_list_locations","description":"List location boards, newest first — START HERE to find a `location_id` for lab_generate / lab_animate. Each entry carries its `prompt_prefix_en`: that is the e"},{"name":"lab_get_location","description":"Get ONE location board in full — all descriptive fields plus its reference images and `prompt_prefix_en`. Use it to check what a board actually anchors before g"},{"name":"lab_list_project_locations","description":"Location boards bound to ONE project. Narrower and more correct than lab_list_locations when you already know the project: it cannot leak boards from a differen"},{"name":"lab_create_location","description":"Create a location board. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later anchors every image and clip sho"},{"name":"lab_generate_location_variants","description":"Generate reference images for a location board (costs quota). Without `variants` the backend picks its default set. The images are what makes a board usable as "},{"name":"lab_enrich_location_prefix","description":"Append context to a board's `prompt_prefix_en` (plain string concatenation server-side — no AI call, no quota). Idempotent: context already present in the prefi"},{"name":"lab_restyle_location","description":"Restyle an existing board towards a wish (costs quota) — same place, different look, e.g. 'the same flat, twenty years later'. Changes the board itself, so imag"},{"name":"lab_location_panorama","description":"Generate a 360° equirectangular HDRI panorama of a place (costs quota). Pass loc_id to persist it on that board, so the viewer finds it again; without loc_id it"},{"name":"lab_analyze_location_image","description":"Read a photo and extract location fields from it (Gemini Vision, costs quota). Returns the fields — it does NOT create a board; feed the result into lab_create_"},{"name":"lab_delete_location","description":"DELETE a location board permanently. There is no undo and no soft-archive — the row is removed. Images and clips that were generated with this `location_id` kee"},{"name":"lab_list_characters","description":"List the character sheets in the FilmLab cast register (id, name, age, gender, project_name, prompt_prefix_en). Call this BEFORE lab_generate whenever a person "},{"name":"lab_get_character","description":"Get ONE character sheet in full — every descriptive field plus the three that decide what you can do with it. `prompt_prefix_en` is the text block describing th"},{"name":"lab_create_character","description":"Create a character sheet in the cast register. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later describes "},{"name":"lab_generate_character_reference","description":"Generate the reference sheet for a character — six core views rendered from the sheet's `prompt_prefix_en`: detail (three-quarter close-up, the identity anchor)"},{"name":"lab_get_character_sheet","description":"The character sheet PREPARED FOR PROMPTING: base prefix, the state sheets by name, which reference views exist, and the ready-made sentence to paste into a lab_"},{"name":"lab_cast_gaps","description":"Find people who appear in a project's material (script / cast module) but have NO character sheet yet. Returns up to 6 `missing` entries, each with a name and a"},{"name":"lab_cast_autopopulate","description":"Create character sheets for the people found in a project's material — the writing counterpart to lab_cast_gaps. Creates at most 6 per call and binds each to th"},{"name":"lab_create_sequence","description":"Create a sequence (Stage 9 timeline) inside a project — START HERE to turn generated shots into something the continuity pass can read. The new sequence is EMPT"},{"name":"lab_list_sequences","description":"List a project's sequences, newest first. Use it to find a `seq_id` instead of creating a second sequence for the same cut."},{"name":"lab_get_sequence","description":"Get ONE sequence in full — timeline (the shots in order), audio_tracks, transitions, duration_seconds and render status. Check `timeline` here before starting a"},{"name":"lab_shots","description":"Read the SHOT layer of a sequence — which clips form one shot, which scene it plays in, who is in it, and what the continuity pass found. This is the layer abov"},{"name":"lab_shots_ableiten","description":"Derive the shot layer from what the clips already say about themselves — consecutive clips of the same scene become one shot, and a scene that returns later bec"},{"name":"lab_aufloesung","description":"Break one scene down into a STRUCTURED shot list of 2, 4 or 6 shots — each with shot size, camera angle, purpose and its own ready prompt, plus one shared floor"},{"name":"lab_shots_setzen","description":"State the shot cut yourself: which clips form one shot, what it is called, which scene it plays in. This is the counterpart to lab_shots_ableiten — that one gro"},{"name":"lab_fassungen","description":"Use when the person asks about earlier states of a cut, wants to go back to a previous version, compare versions, name a version, or create a second cut (e.g. a"},{"name":"lab_add_clip","description":"Append a shot to a sequence's timeline. Call it once per shot, in cutting order — `start_time` is computed from the clips already there, so appending in order i"},{"name":"lab_timeline_apply","description":"Write a WHOLE cut into a sequence in one call — clips in order with their lengths, an optional dissolve between them, an optional bed underneath. This is the co"},{"name":"lab_continuity_check","description":"Start the continuity pass over a sequence — every shot is compared against its PREDECESSOR and, with check_references, against the character and location refere"},{"name":"lab_contact_sheet","description":"Build a contact sheet for a generated clip — N frames spread evenly over its runtime, tiled into ONE image — and show it. This is how a clip gets judged at all:"},{"name":"lab_bilder","description":"See a clip at EXACT seconds: up to 12 frames, in the order you list them, tiled into one image and shown. Use it to check what is on screen where you plan a cut"},{"name":"lab_capture","description":"See the CUT at exact seconds of the finished film: up to 12 frames, tiled into one image and shown. Each second is mapped like the export maps it — which clip i"},{"name":"lab_render_frames","description":"See the DELIVERED film: up to 12 frames from the finished export (lab_start_export → lab_get_export status done), tiled into one image and shown. This is the re"},{"name":"lab_feedback","description":"Tell the FilmLab team about a bug or a missing feature — it reaches the people who can fix it, the chat does not. Use art 'fehler' when a tool returned somethin"},{"name":"lab_wellenform","description":"Read the sound of a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key from lab_add_media) as numbers: peak level 0..1 per c"},{"name":"lab_wortzeiten","description":"Every spoken word with its start and end time, for a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key). Use it to cut paus"},{"name":"lab_review_asset","description":"Review generated assets: set verdict (accepted|rejected|pending) and/or selected. Pass ONE id, or `ids` for a bulk review — after a generation run there are usu"},{"name":"lab_auto_lauf","description":"Auto run with a hard spending cap: the person approves ONE run with an upper limit in credits; inside it you may generate without asking per item, but never abo"},{"name":"lab_verkettung","description":"Render several clips as CHAINS: within a scene one after another (continuity), across scenes in parallel (speed) — the plan follows scene_ref of each job in ord"},{"name":"lab_letzter_frame","description":"Extract the LAST frame of a finished clip as a new image (returns image_id, image_url, zu_dunkel). Use it as source_image_id to continue one unbroken take, or a"},{"name":"lab_abgleich","description":"Prompt check of ONE generated image or clip: does the result show what its prompt asked for? The backend first DESCRIBES the result without seeing the prompt, t"},{"name":"lab_review_queue","description":"Browse GENERATED rows (images or videos) — newest first, each with the INPUTS it ran on. Every row carries `inputs[]` (start/reference images, reference videos,"},{"name":"lab_batch_status","description":"Aggregated progress of a video batch started by lab_animate_batch. Returns {total, completed, failed, pending, done, items[]} — poll this ONCE per batch instead"},{"name":"lab_jobs_inflight","description":"Are any FilmLab generations running RIGHT NOW, across ALL projects? Use this before anything that restarts the backend (a deploy recreates the container and kil"},{"name":"lab_job_status","description":"Poll the status of an image or video generation started by lab_generate/lab_animate. There is no single-item status endpoint on the backend — this fetches the p"},{"name":"lab_auto_storyboard","description":"Auto-generate a storyboard from a script: an LLM splits the script into scenes, then one storyboard frame is generated per scene. COSTS CREDITS — every scene is"},{"name":"lab_export_profiles","description":"List the available export delivery profiles (web, social_vertical, social_youtube, streaming_hdr, cinema, master, alpha_prores4444, alpha_png_sequence) and qual"},{"name":"lab_start_export","description":"Start an ASYNC export render of a project sequence. Returns a job_id immediately (status 'queued') — does NOT block. Then poll lab_get_export with that job_id u"},{"name":"lab_prompt_transform","description":"Turn a loose idea into a production-ready image or video prompt — the same Dreamer engine the FilmLab web UI uses (modes: beautify, storyboard, polish, format, "},{"name":"lab_vfx","description":"Run a VFX operation on an image already in the project gallery — the same pipeline the Resolve bridge uses. inpaint (clean plate: what is inside the box disappe"},{"name":"lab_vfx_status","description":"Poll a VFX operation started with lab_vfx. status is pending|processing|done|failed; when done, result_url carries the finished image. Call repeatedly until don"},{"name":"lab_grade","description":"Apply a deterministic colour grade to an image already in the project gallery — no re-generation, no provider, no credits. The look is computed pixel-exact (exp"},{"name":"lab_grade_suggest","description":"Suggest a grade look for a project — read-only, no cost. With image_id, includes the image prompt; without it, uses only the colorist crew brief. Returns a reco"},{"name":"lab_grade_from_resolve","description":"Suggest a FilmLab grade look from a Resolve LUT name or path — read-only, no cost. First call resolve_node_graph_lesen on the local FilmLab bridge (filmlab_brue"},{"name":"lab_depth_map","description":"Create or read a depth map for a project video in FilmLab: use it for fog, depth of field, relighting or occlusion. Near is white, like Resolve's Depth Map. Fre"},{"name":"lab_dossier","description":"Build a dossier of a project's takes: one ZIP with an offline index.html (no external resources) plus the media files, named Project_SceneNN_YYYYMMDD-Tnn.ext. m"},{"name":"lab_get_dossier","description":"Poll a dossier job by job_id (from lab_dossier). status is queued|processing|done|failed. When done, result.archiv_url is a signed https link to the ZIP that lo"},{"name":"lab_get_export","description":"Poll an export render job by job_id (from lab_start_export). status is queued|processing|done|failed; when done, the result (output url) is included. Call repea"},{"name":"lab_list_exports","description":"List past export jobs for a project (each with job_id, status, profile). Returns up to 20 with a total count. Finished rows carry the same signed, login-free re"},{"name":"lab_add_media","description":"Bring your own video, audio or image into a project — not generated, yours. Two ways: `media_url` (a public http(s) address; the server fetches it, max 100 MB) "},{"name":"lab_umzug","description":"Bring Midjourney exports into a project (FilmLab calls this 'Umzug'). Midjourney has no API, so the person downloads their images or ZIP and this tool carries t"},{"name":"lab_referenz_aus_bild","description":"Attach an existing project image (an image_id from lab_umzug, lab_get_job result.bildzeilen or lab_generate) as reference: `ziel: 'figur'` makes it a view of a "},{"name":"lab_herkunft","description":"Declare or list where a project's material comes from: 'eigen' (made by people) or 'ki' (AI-generated or AI-altered). Exports decide the EU AI Act Art. 50 discl"},{"name":"lab_list_assets","description":"List a project's media assets (image/video/audio) with their URLs. Optionally filter by asset_type. Returns up to 20 with a total count. Each row carries its ad"},{"name":"lab_generate_music","description":"Generate a MUSIC track for a project (Stable Audio via fal.ai) — the first step of the rhythm chain, and the only one that costs credits. ASYNCHRONOUS: the call"},{"name":"lab_sfx","description":"Generate or CLEAN UP a SOUND track other than music — sound effects, ambience/atmosphere, dialog, a voiceover, FOLEY scored to an existing clip, or the repair k"},{"name":"lab_list_audio","description":"List a project's generated audio rows, newest first — this is the POLL for lab_generate_music. Read two fields: `metadata.status` ('pending' | 'completed' | 'fa"},{"name":"lab_bind_audio","description":"Bind the project's generated audio to a sequence's tracks — ONE call that does both halves of the job, because doing only the first half silently produces a sil"},{"name":"lab_mix","description":"Set the sound mix of a sequence: per track `volume_db`, `pan`, `mute`, `solo` and `effects`. Every field you send is rendered — the backend rejects what it cann"},{"name":"lab_mix_render","description":"Render the sequence's mixdown, normalised to a loudness target: `broadcast` (EBU R128), `web` or `youtube`. With `auto_preset` it runs the AUTO-MIX instead: it "},{"name":"lab_mix_messen","description":"Measure the RENDERED mix: integrated loudness (LUFS), true peak (dBTP) and loudness range (LU) of the master, measured on the mixdown file itself. Per stem the "},{"name":"lab_grade_clip","description":"Set the colour grade of ONE clip in the edit (Murnau), or of the whole programme with `programm: true`. It is the same grade a colourist sets in Murnau's colour"},{"name":"lab_scopes","description":"Measure ONE clip of the edit as numbers instead of a picture: a frame is rendered through the clip's export path (input profile, grade LUT, secondary correction"},{"name":"lab_look_match","description":"Check the colour CONTINUITY of a scene in the edit (Murnau): every shot is compared with the scene's reference shot (the first, or `referenz_clip_id`) at the SA"},{"name":"lab_ton_durchlauf","description":"Generate SOUND EFFECTS for a whole sequence, shot by shot — Simon Meyer's pass: every shot is muted, padded with black frames up to the model's minimum length, "},{"name":"lab_beatgrid","description":"Measure the TEMPO of the sequence's bound music track and store the beat grid — opens the real file with ffmpeg and analyses it, no guessing and no provider, so"},{"name":"lab_apply_rhythm","description":"Compute the sequence's clip durations from the project's cutting preset and — when the tempo allows it — pull the cut points onto the measured beat grid. WRITES"},{"name":"lab_suggest_durations","description":"Ask what clip durations the project's cutting preset WOULD give a sequence — and change nothing (`angewendet: false`). Use it to see the consequence before lab_"},{"name":"lab_dub","description":"Dub a sequence into another language: either a ready audio track (en_audio_url — e.g. the one lab_dub_tts just produced) OR a cloned voice reading a line of tex"},{"name":"lab_dub_voices","description":"List the ElevenLabs TTS voices available for lab_dub_tts's `voice_id` — this is the EN-dub-track text-to-speech voice list, NOT a project's cloned voices (those"},{"name":"lab_dub_tts","description":"Generate the EN-dub audio track for a sequence via ElevenLabs TTS — SYNCHRONOUS, returns a ready audio_url immediately, no job_id and nothing to poll. Optionall"}],"toolCount":114,"toolsHash":"08663b8462a2e3ad5a7f8ee7c90d04e862481b9a20ef25caa1e89bee6124fd80","serverName":"filmlab-mcp","capabilities":["resources","prompts","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T21:25:33.172Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":340,"error":null,"detail":{"tools":[{"name":"lab_list_projects","description":"List FilmLab projects (id, title, current pipeline stage). Call this first to find a project_id for the other tools. Shows up to 20 items; `total` counts your a"},{"name":"lab_wissen","description":"Use when the person asks a film-craft question: what a term means, which rule or convention applies, how something is usually done in camera, editing, sound or "},{"name":"lab_widerruf","description":"Record a correction in the FilmOS knowledge layer when the user contradicts something you asserted from it. Use this the moment a contradiction is stated — not "},{"name":"lab_playbook","description":"The rules of one working surface, generated from the code: what the surface is, what an agent can trigger itself, what exists but only by hand, and what does no"},{"name":"lab_list_models","description":"The model catalog: what every video or image model can do — resolutions, durations, aspect ratios, audio, reference limits, price per second or per image — grou"},{"name":"lab_regie_techniken","description":"Use when the person asks HOW to stage or shoot a feeling or effect (which angle, movement, framing or light makes a scene feel tense, tender, triumphant, uneasy"},{"name":"lab_whoami","description":"Who is connected: the FilmLab account (email, user id, name, tier, credits) and how this connection signed in (oauth, oauth_geraet, bridge_key, legacy service u"},{"name":"lab_get_state","description":"One call, the whole picture: account (tier, credits, reset), default models with price, jobs in flight, catalog freshness, project count. Pass project_id for th"},{"name":"lab_get_project","description":"Use when the person asks where a project stands: its current stage, what is finished, what comes next, or wants the project's state before continuing. Get a sin"},{"name":"lab_zielgruppe","description":"Read or set a project's audience (zielgruppe) and target markets (zielmaerkte). With project_id only: read. Set zielgruppe 'kinder' or 'jugendliche' whenever th"},{"name":"lab_get_context","description":"Read the accumulated context/output for one pipeline module of a project (e.g. the IDEE, STORYBOARD or SHOTS stage). Needs project_id and module name."},{"name":"lab_get_job","description":"Get the status of a background job by job_id (status is queued|processing|done|failed). Poll this after starting a long-running generate/export. Returns the job"},{"name":"lab_search_catalog","description":"Search the FilmLab universe catalog of AI tools, news and companies. Query must be at least 2 characters. Returns up to 20 matches with a total count."},{"name":"lab_create_project","description":"Create a new FilmLab project. Returns the new project id. Optionally set a title."},{"name":"lab_run_module","description":"Run ONE pipeline module for a project (context is injected from upstream modules + crew agents). SYNCHRONOUS and LLM-heavy: light modules return in seconds; hea"},{"name":"lab_generate","description":"Generate an image on the production pipeline (fal.ai, quota-tracked, persisted to the project's gallery). Waits up to `wait_s` seconds (default 45) for the imag"},{"name":"lab_animate","description":"Animate a completed image into a clip with a video model. Pick the model from lab_list_models; check the price with get_cost or let the user confirm a card via "},{"name":"lab_animate_batch","description":"Animate MANY images into videos in ONE call (max 25 jobs). Prefer this over looping lab_animate: it validates every job BEFORE spending any quota, so an invalid"},{"name":"lab_propose","description":"Propose a generation for the user to confirm: validates the parameters against the catalog, computes the price, and shows a card (widget hosts) or returns the s"},{"name":"lab_run_proposal","description":"Run a proposal exactly as shown — same model, same parameters, same price. Called by the card's button, or by you after the user confirmed. Single use: the prop"},{"name":"lab_list_locations","description":"List location boards, newest first — START HERE to find a `location_id` for lab_generate / lab_animate. Each entry carries its `prompt_prefix_en`: that is the e"},{"name":"lab_get_location","description":"Get ONE location board in full — all descriptive fields plus its reference images and `prompt_prefix_en`. Use it to check what a board actually anchors before g"},{"name":"lab_list_project_locations","description":"Location boards bound to ONE project. Narrower and more correct than lab_list_locations when you already know the project: it cannot leak boards from a differen"},{"name":"lab_create_location","description":"Create a location board. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later anchors every image and clip sho"},{"name":"lab_generate_location_variants","description":"Generate reference images for a location board (costs quota). Without `variants` the backend picks its default set. The images are what makes a board usable as "},{"name":"lab_enrich_location_prefix","description":"Append context to a board's `prompt_prefix_en` (plain string concatenation server-side — no AI call, no quota). Idempotent: context already present in the prefi"},{"name":"lab_restyle_location","description":"Restyle an existing board towards a wish (costs quota) — same place, different look, e.g. 'the same flat, twenty years later'. Changes the board itself, so imag"},{"name":"lab_location_panorama","description":"Generate a 360° equirectangular HDRI panorama of a place (costs quota). Pass loc_id to persist it on that board, so the viewer finds it again; without loc_id it"},{"name":"lab_analyze_location_image","description":"Read a photo and extract location fields from it (Gemini Vision, costs quota). Returns the fields — it does NOT create a board; feed the result into lab_create_"},{"name":"lab_delete_location","description":"DELETE a location board permanently. There is no undo and no soft-archive — the row is removed. Images and clips that were generated with this `location_id` kee"},{"name":"lab_list_characters","description":"List the character sheets in the FilmLab cast register (id, name, age, gender, project_name, prompt_prefix_en). Call this BEFORE lab_generate whenever a person "},{"name":"lab_get_character","description":"Get ONE character sheet in full — every descriptive field plus the three that decide what you can do with it. `prompt_prefix_en` is the text block describing th"},{"name":"lab_create_character","description":"Create a character sheet in the cast register. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later describes "},{"name":"lab_generate_character_reference","description":"Generate the reference sheet for a character — six core views rendered from the sheet's `prompt_prefix_en`: detail (three-quarter close-up, the identity anchor)"},{"name":"lab_get_character_sheet","description":"The character sheet PREPARED FOR PROMPTING: base prefix, the state sheets by name, which reference views exist, and the ready-made sentence to paste into a lab_"},{"name":"lab_cast_gaps","description":"Find people who appear in a project's material (script / cast module) but have NO character sheet yet. Returns up to 6 `missing` entries, each with a name and a"},{"name":"lab_cast_autopopulate","description":"Create character sheets for the people found in a project's material — the writing counterpart to lab_cast_gaps. Creates at most 6 per call and binds each to th"},{"name":"lab_create_sequence","description":"Create a sequence (Stage 9 timeline) inside a project — START HERE to turn generated shots into something the continuity pass can read. The new sequence is EMPT"},{"name":"lab_list_sequences","description":"List a project's sequences, newest first. Use it to find a `seq_id` instead of creating a second sequence for the same cut."},{"name":"lab_get_sequence","description":"Get ONE sequence in full — timeline (the shots in order), audio_tracks, transitions, duration_seconds and render status. Check `timeline` here before starting a"},{"name":"lab_shots","description":"Read the SHOT layer of a sequence — which clips form one shot, which scene it plays in, who is in it, and what the continuity pass found. This is the layer abov"},{"name":"lab_shots_ableiten","description":"Derive the shot layer from what the clips already say about themselves — consecutive clips of the same scene become one shot, and a scene that returns later bec"},{"name":"lab_aufloesung","description":"Break one scene down into a STRUCTURED shot list of 2, 4 or 6 shots — each with shot size, camera angle, purpose and its own ready prompt, plus one shared floor"},{"name":"lab_shots_setzen","description":"State the shot cut yourself: which clips form one shot, what it is called, which scene it plays in. This is the counterpart to lab_shots_ableiten — that one gro"},{"name":"lab_fassungen","description":"Use when the person asks about earlier states of a cut, wants to go back to a previous version, compare versions, name a version, or create a second cut (e.g. a"},{"name":"lab_add_clip","description":"Append a shot to a sequence's timeline. Call it once per shot, in cutting order — `start_time` is computed from the clips already there, so appending in order i"},{"name":"lab_timeline_apply","description":"Write a WHOLE cut into a sequence in one call — clips in order with their lengths, an optional dissolve between them, an optional bed underneath. This is the co"},{"name":"lab_continuity_check","description":"Start the continuity pass over a sequence — every shot is compared against its PREDECESSOR and, with check_references, against the character and location refere"},{"name":"lab_contact_sheet","description":"Build a contact sheet for a generated clip — N frames spread evenly over its runtime, tiled into ONE image — and show it. This is how a clip gets judged at all:"},{"name":"lab_bilder","description":"See a clip at EXACT seconds: up to 12 frames, in the order you list them, tiled into one image and shown. Use it to check what is on screen where you plan a cut"},{"name":"lab_capture","description":"See the CUT at exact seconds of the finished film: up to 12 frames, tiled into one image and shown. Each second is mapped like the export maps it — which clip i"},{"name":"lab_render_frames","description":"See the DELIVERED film: up to 12 frames from the finished export (lab_start_export → lab_get_export status done), tiled into one image and shown. This is the re"},{"name":"lab_feedback","description":"Tell the FilmLab team about a bug or a missing feature — it reaches the people who can fix it, the chat does not. Use art 'fehler' when a tool returned somethin"},{"name":"lab_wellenform","description":"Read the sound of a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key from lab_add_media) as numbers: peak level 0..1 per c"},{"name":"lab_wortzeiten","description":"Every spoken word with its start and end time, for a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key). Use it to cut paus"},{"name":"lab_review_asset","description":"Review generated assets: set verdict (accepted|rejected|pending) and/or selected. Pass ONE id, or `ids` for a bulk review — after a generation run there are usu"},{"name":"lab_auto_lauf","description":"Auto run with a hard spending cap: the person approves ONE run with an upper limit in credits; inside it you may generate without asking per item, but never abo"},{"name":"lab_verkettung","description":"Render several clips as CHAINS: within a scene one after another (continuity), across scenes in parallel (speed) — the plan follows scene_ref of each job in ord"},{"name":"lab_letzter_frame","description":"Extract the LAST frame of a finished clip as a new image (returns image_id, image_url, zu_dunkel). Use it as source_image_id to continue one unbroken take, or a"},{"name":"lab_abgleich","description":"Prompt check of ONE generated image or clip: does the result show what its prompt asked for? The backend first DESCRIBES the result without seeing the prompt, t"},{"name":"lab_review_queue","description":"Browse GENERATED rows (images or videos) — newest first, each with the INPUTS it ran on. Every row carries `inputs[]` (start/reference images, reference videos,"},{"name":"lab_batch_status","description":"Aggregated progress of a video batch started by lab_animate_batch. Returns {total, completed, failed, pending, done, items[]} — poll this ONCE per batch instead"},{"name":"lab_jobs_inflight","description":"Are any FilmLab generations running RIGHT NOW, across ALL projects? Use this before anything that restarts the backend (a deploy recreates the container and kil"},{"name":"lab_job_status","description":"Poll the status of an image or video generation started by lab_generate/lab_animate. There is no single-item status endpoint on the backend — this fetches the p"},{"name":"lab_auto_storyboard","description":"Auto-generate a storyboard from a script: an LLM splits the script into scenes, then one storyboard frame is generated per scene. COSTS CREDITS — every scene is"},{"name":"lab_export_profiles","description":"List the available export delivery profiles (web, social_vertical, social_youtube, streaming_hdr, cinema, master, alpha_prores4444, alpha_png_sequence) and qual"},{"name":"lab_start_export","description":"Start an ASYNC export render of a project sequence. Returns a job_id immediately (status 'queued') — does NOT block. Then poll lab_get_export with that job_id u"},{"name":"lab_prompt_transform","description":"Turn a loose idea into a production-ready image or video prompt — the same Dreamer engine the FilmLab web UI uses (modes: beautify, storyboard, polish, format, "},{"name":"lab_vfx","description":"Run a VFX operation on an image already in the project gallery — the same pipeline the Resolve bridge uses. inpaint (clean plate: what is inside the box disappe"},{"name":"lab_vfx_status","description":"Poll a VFX operation started with lab_vfx. status is pending|processing|done|failed; when done, result_url carries the finished image. Call repeatedly until don"},{"name":"lab_grade","description":"Apply a deterministic colour grade to an image already in the project gallery — no re-generation, no provider, no credits. The look is computed pixel-exact (exp"},{"name":"lab_grade_suggest","description":"Suggest a grade look for a project — read-only, no cost. With image_id, includes the image prompt; without it, uses only the colorist crew brief. Returns a reco"},{"name":"lab_grade_from_resolve","description":"Suggest a FilmLab grade look from a Resolve LUT name or path — read-only, no cost. First call resolve_node_graph_lesen on the local FilmLab bridge (filmlab_brue"},{"name":"lab_depth_map","description":"Create or read a depth map for a project video in FilmLab: use it for fog, depth of field, relighting or occlusion. Near is white, like Resolve's Depth Map. Fre"},{"name":"lab_dossier","description":"Build a dossier of a project's takes: one ZIP with an offline index.html (no external resources) plus the media files, named Project_SceneNN_YYYYMMDD-Tnn.ext. m"},{"name":"lab_get_dossier","description":"Poll a dossier job by job_id (from lab_dossier). status is queued|processing|done|failed. When done, result.archiv_url is a signed https link to the ZIP that lo"},{"name":"lab_get_export","description":"Poll an export render job by job_id (from lab_start_export). status is queued|processing|done|failed; when done, the result (output url) is included. Call repea"},{"name":"lab_list_exports","description":"List past export jobs for a project (each with job_id, status, profile). Returns up to 20 with a total count. Finished rows carry the same signed, login-free re"},{"name":"lab_add_media","description":"Bring your own video, audio or image into a project — not generated, yours. Two ways: `media_url` (a public http(s) address; the server fetches it, max 100 MB) "},{"name":"lab_umzug","description":"Bring Midjourney exports into a project (FilmLab calls this 'Umzug'). Midjourney has no API, so the person downloads their images or ZIP and this tool carries t"},{"name":"lab_referenz_aus_bild","description":"Attach an existing project image (an image_id from lab_umzug, lab_get_job result.bildzeilen or lab_generate) as reference: `ziel: 'figur'` makes it a view of a "},{"name":"lab_herkunft","description":"Declare or list where a project's material comes from: 'eigen' (made by people) or 'ki' (AI-generated or AI-altered). Exports decide the EU AI Act Art. 50 discl"},{"name":"lab_list_assets","description":"List a project's media assets (image/video/audio) with their URLs. Optionally filter by asset_type. Returns up to 20 with a total count. Each row carries its ad"},{"name":"lab_generate_music","description":"Generate a MUSIC track for a project (Stable Audio via fal.ai) — the first step of the rhythm chain, and the only one that costs credits. ASYNCHRONOUS: the call"},{"name":"lab_sfx","description":"Generate or CLEAN UP a SOUND track other than music — sound effects, ambience/atmosphere, dialog, a voiceover, FOLEY scored to an existing clip, or the repair k"},{"name":"lab_list_audio","description":"List a project's generated audio rows, newest first — this is the POLL for lab_generate_music. Read two fields: `metadata.status` ('pending' | 'completed' | 'fa"},{"name":"lab_bind_audio","description":"Bind the project's generated audio to a sequence's tracks — ONE call that does both halves of the job, because doing only the first half silently produces a sil"},{"name":"lab_mix","description":"Set the sound mix of a sequence: per track `volume_db`, `pan`, `mute`, `solo` and `effects`. Every field you send is rendered — the backend rejects what it cann"},{"name":"lab_mix_render","description":"Render the sequence's mixdown, normalised to a loudness target: `broadcast` (EBU R128), `web` or `youtube`. With `auto_preset` it runs the AUTO-MIX instead: it "},{"name":"lab_mix_messen","description":"Measure the RENDERED mix: integrated loudness (LUFS), true peak (dBTP) and loudness range (LU) of the master, measured on the mixdown file itself. Per stem the "},{"name":"lab_grade_clip","description":"Set the colour grade of ONE clip in the edit (Murnau), or of the whole programme with `programm: true`. It is the same grade a colourist sets in Murnau's colour"},{"name":"lab_scopes","description":"Measure ONE clip of the edit as numbers instead of a picture: a frame is rendered through the clip's export path (input profile, grade LUT, secondary correction"},{"name":"lab_look_match","description":"Check the colour CONTINUITY of a scene in the edit (Murnau): every shot is compared with the scene's reference shot (the first, or `referenz_clip_id`) at the SA"},{"name":"lab_ton_durchlauf","description":"Generate SOUND EFFECTS for a whole sequence, shot by shot — Simon Meyer's pass: every shot is muted, padded with black frames up to the model's minimum length, "},{"name":"lab_beatgrid","description":"Measure the TEMPO of the sequence's bound music track and store the beat grid — opens the real file with ffmpeg and analyses it, no guessing and no provider, so"},{"name":"lab_apply_rhythm","description":"Compute the sequence's clip durations from the project's cutting preset and — when the tempo allows it — pull the cut points onto the measured beat grid. WRITES"},{"name":"lab_suggest_durations","description":"Ask what clip durations the project's cutting preset WOULD give a sequence — and change nothing (`angewendet: false`). Use it to see the consequence before lab_"},{"name":"lab_dub","description":"Dub a sequence into another language: either a ready audio track (en_audio_url — e.g. the one lab_dub_tts just produced) OR a cloned voice reading a line of tex"},{"name":"lab_dub_voices","description":"List the ElevenLabs TTS voices available for lab_dub_tts's `voice_id` — this is the EN-dub-track text-to-speech voice list, NOT a project's cloned voices (those"},{"name":"lab_dub_tts","description":"Generate the EN-dub audio track for a sequence via ElevenLabs TTS — SYNCHRONOUS, returns a ready audio_url immediately, no job_id and nothing to poll. Optionall"}],"toolCount":114,"toolsHash":"08663b8462a2e3ad5a7f8ee7c90d04e862481b9a20ef25caa1e89bee6124fd80","serverName":"filmlab-mcp","capabilities":["resources","prompts","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T15:31:02.665Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":212,"error":null,"detail":{"tools":[{"name":"lab_list_projects","description":"List FilmLab projects (id, title, current pipeline stage). Call this first to find a project_id for the other tools. Shows up to 20 items; `total` counts your a"},{"name":"lab_wissen","description":"Use when the person asks a film-craft question: what a term means, which rule or convention applies, how something is usually done in camera, editing, sound or "},{"name":"lab_widerruf","description":"Record a correction in the FilmOS knowledge layer when the user contradicts something you asserted from it. Use this the moment a contradiction is stated — not "},{"name":"lab_playbook","description":"The rules of one working surface, generated from the code: what the surface is, what an agent can trigger itself, what exists but only by hand, and what does no"},{"name":"lab_list_models","description":"The model catalog: what every video or image model can do — resolutions, durations, aspect ratios, audio, reference limits, price per second or per image — grou"},{"name":"lab_regie_techniken","description":"Use when the person asks HOW to stage or shoot a feeling or effect (which angle, movement, framing or light makes a scene feel tense, tender, triumphant, uneasy"},{"name":"lab_whoami","description":"Who is connected: the FilmLab account (email, user id, name, tier, credits) and how this connection signed in (oauth, oauth_geraet, bridge_key, legacy service u"},{"name":"lab_get_state","description":"One call, the whole picture: account (tier, credits, reset), default models with price, jobs in flight, catalog freshness, project count. Pass project_id for th"},{"name":"lab_get_project","description":"Use when the person asks where a project stands: its current stage, what is finished, what comes next, or wants the project's state before continuing. Get a sin"},{"name":"lab_zielgruppe","description":"Read or set a project's audience (zielgruppe) and target markets (zielmaerkte). With project_id only: read. Set zielgruppe 'kinder' or 'jugendliche' whenever th"},{"name":"lab_get_context","description":"Read the accumulated context/output for one pipeline module of a project (e.g. the IDEE, STORYBOARD or SHOTS stage). Needs project_id and module name."},{"name":"lab_get_job","description":"Get the status of a background job by job_id (status is queued|processing|done|failed). Poll this after starting a long-running generate/export. Returns the job"},{"name":"lab_search_catalog","description":"Search the FilmLab universe catalog of AI tools, news and companies. Query must be at least 2 characters. Returns up to 20 matches with a total count."},{"name":"lab_create_project","description":"Create a new FilmLab project. Returns the new project id. Optionally set a title."},{"name":"lab_run_module","description":"Run ONE pipeline module for a project (context is injected from upstream modules + crew agents). SYNCHRONOUS and LLM-heavy: light modules return in seconds; hea"},{"name":"lab_generate","description":"Generate an image on the production pipeline (fal.ai, quota-tracked, persisted to the project's gallery). Waits up to `wait_s` seconds (default 45) for the imag"},{"name":"lab_animate","description":"Animate a completed image into a clip with a video model. Pick the model from lab_list_models; check the price with get_cost or let the user confirm a card via "},{"name":"lab_animate_batch","description":"Animate MANY images into videos in ONE call (max 25 jobs). Prefer this over looping lab_animate: it validates every job BEFORE spending any quota, so an invalid"},{"name":"lab_propose","description":"Propose a generation for the user to confirm: validates the parameters against the catalog, computes the price, and shows a card (widget hosts) or returns the s"},{"name":"lab_run_proposal","description":"Run a proposal exactly as shown — same model, same parameters, same price. Called by the card's button, or by you after the user confirmed. Single use: the prop"},{"name":"lab_list_locations","description":"List location boards, newest first — START HERE to find a `location_id` for lab_generate / lab_animate. Each entry carries its `prompt_prefix_en`: that is the e"},{"name":"lab_get_location","description":"Get ONE location board in full — all descriptive fields plus its reference images and `prompt_prefix_en`. Use it to check what a board actually anchors before g"},{"name":"lab_list_project_locations","description":"Location boards bound to ONE project. Narrower and more correct than lab_list_locations when you already know the project: it cannot leak boards from a differen"},{"name":"lab_create_location","description":"Create a location board. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later anchors every image and clip sho"},{"name":"lab_generate_location_variants","description":"Generate reference images for a location board (costs quota). Without `variants` the backend picks its default set. The images are what makes a board usable as "},{"name":"lab_enrich_location_prefix","description":"Append context to a board's `prompt_prefix_en` (plain string concatenation server-side — no AI call, no quota). Idempotent: context already present in the prefi"},{"name":"lab_restyle_location","description":"Restyle an existing board towards a wish (costs quota) — same place, different look, e.g. 'the same flat, twenty years later'. Changes the board itself, so imag"},{"name":"lab_location_panorama","description":"Generate a 360° equirectangular HDRI panorama of a place (costs quota). Pass loc_id to persist it on that board, so the viewer finds it again; without loc_id it"},{"name":"lab_analyze_location_image","description":"Read a photo and extract location fields from it (Gemini Vision, costs quota). Returns the fields — it does NOT create a board; feed the result into lab_create_"},{"name":"lab_delete_location","description":"DELETE a location board permanently. There is no undo and no soft-archive — the row is removed. Images and clips that were generated with this `location_id` kee"},{"name":"lab_list_characters","description":"List the character sheets in the FilmLab cast register (id, name, age, gender, project_name, prompt_prefix_en). Call this BEFORE lab_generate whenever a person "},{"name":"lab_get_character","description":"Get ONE character sheet in full — every descriptive field plus the three that decide what you can do with it. `prompt_prefix_en` is the text block describing th"},{"name":"lab_create_character","description":"Create a character sheet in the cast register. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later describes "},{"name":"lab_generate_character_reference","description":"Generate the reference sheet for a character — six core views rendered from the sheet's `prompt_prefix_en`: detail (three-quarter close-up, the identity anchor)"},{"name":"lab_get_character_sheet","description":"The character sheet PREPARED FOR PROMPTING: base prefix, the state sheets by name, which reference views exist, and the ready-made sentence to paste into a lab_"},{"name":"lab_cast_gaps","description":"Find people who appear in a project's material (script / cast module) but have NO character sheet yet. Returns up to 6 `missing` entries, each with a name and a"},{"name":"lab_cast_autopopulate","description":"Create character sheets for the people found in a project's material — the writing counterpart to lab_cast_gaps. Creates at most 6 per call and binds each to th"},{"name":"lab_create_sequence","description":"Create a sequence (Stage 9 timeline) inside a project — START HERE to turn generated shots into something the continuity pass can read. The new sequence is EMPT"},{"name":"lab_list_sequences","description":"List a project's sequences, newest first. Use it to find a `seq_id` instead of creating a second sequence for the same cut."},{"name":"lab_get_sequence","description":"Get ONE sequence in full — timeline (the shots in order), audio_tracks, transitions, duration_seconds and render status. Check `timeline` here before starting a"},{"name":"lab_shots","description":"Read the SHOT layer of a sequence — which clips form one shot, which scene it plays in, who is in it, and what the continuity pass found. This is the layer abov"},{"name":"lab_shots_ableiten","description":"Derive the shot layer from what the clips already say about themselves — consecutive clips of the same scene become one shot, and a scene that returns later bec"},{"name":"lab_aufloesung","description":"Break one scene down into a STRUCTURED shot list of 2, 4 or 6 shots — each with shot size, camera angle, purpose and its own ready prompt, plus one shared floor"},{"name":"lab_shots_setzen","description":"State the shot cut yourself: which clips form one shot, what it is called, which scene it plays in. This is the counterpart to lab_shots_ableiten — that one gro"},{"name":"lab_fassungen","description":"Use when the person asks about earlier states of a cut, wants to go back to a previous version, compare versions, name a version, or create a second cut (e.g. a"},{"name":"lab_add_clip","description":"Append a shot to a sequence's timeline. Call it once per shot, in cutting order — `start_time` is computed from the clips already there, so appending in order i"},{"name":"lab_timeline_apply","description":"Write a WHOLE cut into a sequence in one call — clips in order with their lengths, an optional dissolve between them, an optional bed underneath. This is the co"},{"name":"lab_continuity_check","description":"Start the continuity pass over a sequence — every shot is compared against its PREDECESSOR and, with check_references, against the character and location refere"},{"name":"lab_contact_sheet","description":"Build a contact sheet for a generated clip — N frames spread evenly over its runtime, tiled into ONE image — and show it. This is how a clip gets judged at all:"},{"name":"lab_bilder","description":"See a clip at EXACT seconds: up to 12 frames, in the order you list them, tiled into one image and shown. Use it to check what is on screen where you plan a cut"},{"name":"lab_capture","description":"See the CUT at exact seconds of the finished film: up to 12 frames, tiled into one image and shown. Each second is mapped like the export maps it — which clip i"},{"name":"lab_render_frames","description":"See the DELIVERED film: up to 12 frames from the finished export (lab_start_export → lab_get_export status done), tiled into one image and shown. This is the re"},{"name":"lab_feedback","description":"Tell the FilmLab team about a bug or a missing feature — it reaches the people who can fix it, the chat does not. Use art 'fehler' when a tool returned somethin"},{"name":"lab_wellenform","description":"Read the sound of a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key from lab_add_media) as numbers: peak level 0..1 per c"},{"name":"lab_wortzeiten","description":"Every spoken word with its start and end time, for a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key). Use it to cut paus"},{"name":"lab_review_asset","description":"Review generated assets: set verdict (accepted|rejected|pending) and/or selected. Pass ONE id, or `ids` for a bulk review — after a generation run there are usu"},{"name":"lab_auto_lauf","description":"Auto run with a hard spending cap: the person approves ONE run with an upper limit in credits; inside it you may generate without asking per item, but never abo"},{"name":"lab_verkettung","description":"Render several clips as CHAINS: within a scene one after another (continuity), across scenes in parallel (speed) — the plan follows scene_ref of each job in ord"},{"name":"lab_letzter_frame","description":"Extract the LAST frame of a finished clip as a new image (returns image_id, image_url, zu_dunkel). Use it as source_image_id to continue one unbroken take, or a"},{"name":"lab_abgleich","description":"Prompt check of ONE generated image or clip: does the result show what its prompt asked for? The backend first DESCRIBES the result without seeing the prompt, t"},{"name":"lab_review_queue","description":"Browse GENERATED rows (images or videos) — newest first, each with the INPUTS it ran on. Every row carries `inputs[]` (start/reference images, reference videos,"},{"name":"lab_batch_status","description":"Aggregated progress of a video batch started by lab_animate_batch. Returns {total, completed, failed, pending, done, items[]} — poll this ONCE per batch instead"},{"name":"lab_jobs_inflight","description":"Are any FilmLab generations running RIGHT NOW, across ALL projects? Use this before anything that restarts the backend (a deploy recreates the container and kil"},{"name":"lab_job_status","description":"Poll the status of an image or video generation started by lab_generate/lab_animate. There is no single-item status endpoint on the backend — this fetches the p"},{"name":"lab_auto_storyboard","description":"Auto-generate a storyboard from a script: an LLM splits the script into scenes, then one storyboard frame is generated per scene. COSTS CREDITS — every scene is"},{"name":"lab_export_profiles","description":"List the available export delivery profiles (web, social_vertical, social_youtube, streaming_hdr, cinema, master, alpha_prores4444, alpha_png_sequence) and qual"},{"name":"lab_start_export","description":"Start an ASYNC export render of a project sequence. Returns a job_id immediately (status 'queued') — does NOT block. Then poll lab_get_export with that job_id u"},{"name":"lab_prompt_transform","description":"Turn a loose idea into a production-ready image or video prompt — the same Dreamer engine the FilmLab web UI uses (modes: beautify, storyboard, polish, format, "},{"name":"lab_vfx","description":"Run a VFX operation on an image already in the project gallery — the same pipeline the Resolve bridge uses. inpaint (clean plate: what is inside the box disappe"},{"name":"lab_vfx_status","description":"Poll a VFX operation started with lab_vfx. status is pending|processing|done|failed; when done, result_url carries the finished image. Call repeatedly until don"},{"name":"lab_grade","description":"Apply a deterministic colour grade to an image already in the project gallery — no re-generation, no provider, no credits. The look is computed pixel-exact (exp"},{"name":"lab_grade_suggest","description":"Suggest a grade look for a project — read-only, no cost. With image_id, includes the image prompt; without it, uses only the colorist crew brief. Returns a reco"},{"name":"lab_grade_from_resolve","description":"Suggest a FilmLab grade look from a Resolve LUT name or path — read-only, no cost. First call resolve_node_graph_lesen on the local FilmLab bridge (filmlab_brue"},{"name":"lab_depth_map","description":"Create or read a depth map for a project video in FilmLab: use it for fog, depth of field, relighting or occlusion. Near is white, like Resolve's Depth Map. Fre"},{"name":"lab_dossier","description":"Build a dossier of a project's takes: one ZIP with an offline index.html (no external resources) plus the media files, named Project_SceneNN_YYYYMMDD-Tnn.ext. m"},{"name":"lab_get_dossier","description":"Poll a dossier job by job_id (from lab_dossier). status is queued|processing|done|failed. When done, result.archiv_url is a signed https link to the ZIP that lo"},{"name":"lab_get_export","description":"Poll an export render job by job_id (from lab_start_export). status is queued|processing|done|failed; when done, the result (output url) is included. Call repea"},{"name":"lab_list_exports","description":"List past export jobs for a project (each with job_id, status, profile). Returns up to 20 with a total count. Finished rows carry the same signed, login-free re"},{"name":"lab_add_media","description":"Bring your own video, audio or image into a project — not generated, yours. Two ways: `media_url` (a public http(s) address; the server fetches it, max 100 MB) "},{"name":"lab_umzug","description":"Bring Midjourney exports into a project (FilmLab calls this 'Umzug'). Midjourney has no API, so the person downloads their images or ZIP and this tool carries t"},{"name":"lab_referenz_aus_bild","description":"Attach an existing project image (an image_id from lab_umzug, lab_get_job result.bildzeilen or lab_generate) as reference: `ziel: 'figur'` makes it a view of a "},{"name":"lab_herkunft","description":"Declare or list where a project's material comes from: 'eigen' (made by people) or 'ki' (AI-generated or AI-altered). Exports decide the EU AI Act Art. 50 discl"},{"name":"lab_list_assets","description":"List a project's media assets (image/video/audio) with their URLs. Optionally filter by asset_type. Returns up to 20 with a total count. Each row carries its ad"},{"name":"lab_generate_music","description":"Generate a MUSIC track for a project (Stable Audio via fal.ai) — the first step of the rhythm chain, and the only one that costs credits. ASYNCHRONOUS: the call"},{"name":"lab_sfx","description":"Generate or CLEAN UP a SOUND track other than music — sound effects, ambience/atmosphere, dialog, a voiceover, FOLEY scored to an existing clip, or the repair k"},{"name":"lab_list_audio","description":"List a project's generated audio rows, newest first — this is the POLL for lab_generate_music. Read two fields: `metadata.status` ('pending' | 'completed' | 'fa"},{"name":"lab_bind_audio","description":"Bind the project's generated audio to a sequence's tracks — ONE call that does both halves of the job, because doing only the first half silently produces a sil"},{"name":"lab_mix","description":"Set the sound mix of a sequence: per track `volume_db`, `pan`, `mute`, `solo` and `effects`. Every field you send is rendered — the backend rejects what it cann"},{"name":"lab_mix_render","description":"Render the sequence's mixdown, normalised to a loudness target: `broadcast` (EBU R128), `web` or `youtube`. With `auto_preset` it runs the AUTO-MIX instead: it "},{"name":"lab_mix_messen","description":"Measure the RENDERED mix: integrated loudness (LUFS), true peak (dBTP) and loudness range (LU) of the master, measured on the mixdown file itself. Per stem the "},{"name":"lab_grade_clip","description":"Set the colour grade of ONE clip in the edit (Murnau), or of the whole programme with `programm: true`. It is the same grade a colourist sets in Murnau's colour"},{"name":"lab_scopes","description":"Measure ONE clip of the edit as numbers instead of a picture: a frame is rendered through the clip's export path (input profile, grade LUT, secondary correction"},{"name":"lab_look_match","description":"Check the colour CONTINUITY of a scene in the edit (Murnau): every shot is compared with the scene's reference shot (the first, or `referenz_clip_id`) at the SA"},{"name":"lab_ton_durchlauf","description":"Generate SOUND EFFECTS for a whole sequence, shot by shot — Simon Meyer's pass: every shot is muted, padded with black frames up to the model's minimum length, "},{"name":"lab_beatgrid","description":"Measure the TEMPO of the sequence's bound music track and store the beat grid — opens the real file with ffmpeg and analyses it, no guessing and no provider, so"},{"name":"lab_apply_rhythm","description":"Compute the sequence's clip durations from the project's cutting preset and — when the tempo allows it — pull the cut points onto the measured beat grid. WRITES"},{"name":"lab_suggest_durations","description":"Ask what clip durations the project's cutting preset WOULD give a sequence — and change nothing (`angewendet: false`). Use it to see the consequence before lab_"},{"name":"lab_dub","description":"Dub a sequence into another language: either a ready audio track (en_audio_url — e.g. the one lab_dub_tts just produced) OR a cloned voice reading a line of tex"},{"name":"lab_dub_voices","description":"List the ElevenLabs TTS voices available for lab_dub_tts's `voice_id` — this is the EN-dub-track text-to-speech voice list, NOT a project's cloned voices (those"},{"name":"lab_dub_tts","description":"Generate the EN-dub audio track for a sequence via ElevenLabs TTS — SYNCHRONOUS, returns a ready audio_url immediately, no job_id and nothing to poll. Optionall"}],"toolCount":114,"toolsHash":"08663b8462a2e3ad5a7f8ee7c90d04e862481b9a20ef25caa1e89bee6124fd80","serverName":"filmlab-mcp","capabilities":["resources","prompts","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T09:24:51.887Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":184,"error":null,"detail":{"tools":[{"name":"lab_list_projects","description":"List FilmLab projects (id, title, current pipeline stage). Call this first to find a project_id for the other tools. Shows up to 20 items; `total` counts your a"},{"name":"lab_wissen","description":"Use when the person asks a film-craft question: what a term means, which rule or convention applies, how something is usually done in camera, editing, sound or "},{"name":"lab_widerruf","description":"Record a correction in the FilmOS knowledge layer when the user contradicts something you asserted from it. Use this the moment a contradiction is stated — not "},{"name":"lab_playbook","description":"The rules of one working surface, generated from the code: what the surface is, what an agent can trigger itself, what exists but only by hand, and what does no"},{"name":"lab_list_models","description":"The model catalog: what every video or image model can do — resolutions, durations, aspect ratios, audio, reference limits, price per second or per image — grou"},{"name":"lab_regie_techniken","description":"Use when the person asks HOW to stage or shoot a feeling or effect (which angle, movement, framing or light makes a scene feel tense, tender, triumphant, uneasy"},{"name":"lab_whoami","description":"Who is connected: the FilmLab account (email, user id, name, tier, credits) and how this connection signed in (oauth, oauth_geraet, bridge_key, legacy service u"},{"name":"lab_get_state","description":"One call, the whole picture: account (tier, credits, reset), default models with price, jobs in flight, catalog freshness, project count. Pass project_id for th"},{"name":"lab_get_project","description":"Use when the person asks where a project stands: its current stage, what is finished, what comes next, or wants the project's state before continuing. Get a sin"},{"name":"lab_zielgruppe","description":"Read or set a project's audience (zielgruppe) and target markets (zielmaerkte). With project_id only: read. Set zielgruppe 'kinder' or 'jugendliche' whenever th"},{"name":"lab_get_context","description":"Read the accumulated context/output for one pipeline module of a project (e.g. the IDEE, STORYBOARD or SHOTS stage). Needs project_id and module name."},{"name":"lab_get_job","description":"Get the status of a background job by job_id (status is queued|processing|done|failed). Poll this after starting a long-running generate/export. Returns the job"},{"name":"lab_search_catalog","description":"Search the FilmLab universe catalog of AI tools, news and companies. Query must be at least 2 characters. Returns up to 20 matches with a total count."},{"name":"lab_create_project","description":"Create a new FilmLab project. Returns the new project id. Optionally set a title."},{"name":"lab_run_module","description":"Run ONE pipeline module for a project (context is injected from upstream modules + crew agents). SYNCHRONOUS and LLM-heavy: light modules return in seconds; hea"},{"name":"lab_generate","description":"Generate an image on the production pipeline (fal.ai, quota-tracked, persisted to the project's gallery). Waits up to `wait_s` seconds (default 45) for the imag"},{"name":"lab_animate","description":"Animate a completed image into a clip with a video model. Pick the model from lab_list_models; check the price with get_cost or let the user confirm a card via "},{"name":"lab_animate_batch","description":"Animate MANY images into videos in ONE call (max 25 jobs). Prefer this over looping lab_animate: it validates every job BEFORE spending any quota, so an invalid"},{"name":"lab_propose","description":"Propose a generation for the user to confirm: validates the parameters against the catalog, computes the price, and shows a card (widget hosts) or returns the s"},{"name":"lab_run_proposal","description":"Run a proposal exactly as shown — same model, same parameters, same price. Called by the card's button, or by you after the user confirmed. Single use: the prop"},{"name":"lab_list_locations","description":"List location boards, newest first — START HERE to find a `location_id` for lab_generate / lab_animate. Each entry carries its `prompt_prefix_en`: that is the e"},{"name":"lab_get_location","description":"Get ONE location board in full — all descriptive fields plus its reference images and `prompt_prefix_en`. Use it to check what a board actually anchors before g"},{"name":"lab_list_project_locations","description":"Location boards bound to ONE project. Narrower and more correct than lab_list_locations when you already know the project: it cannot leak boards from a differen"},{"name":"lab_create_location","description":"Create a location board. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later anchors every image and clip sho"},{"name":"lab_generate_location_variants","description":"Generate reference images for a location board (costs quota). Without `variants` the backend picks its default set. The images are what makes a board usable as "},{"name":"lab_enrich_location_prefix","description":"Append context to a board's `prompt_prefix_en` (plain string concatenation server-side — no AI call, no quota). Idempotent: context already present in the prefi"},{"name":"lab_restyle_location","description":"Restyle an existing board towards a wish (costs quota) — same place, different look, e.g. 'the same flat, twenty years later'. Changes the board itself, so imag"},{"name":"lab_location_panorama","description":"Generate a 360° equirectangular HDRI panorama of a place (costs quota). Pass loc_id to persist it on that board, so the viewer finds it again; without loc_id it"},{"name":"lab_analyze_location_image","description":"Read a photo and extract location fields from it (Gemini Vision, costs quota). Returns the fields — it does NOT create a board; feed the result into lab_create_"},{"name":"lab_delete_location","description":"DELETE a location board permanently. There is no undo and no soft-archive — the row is removed. Images and clips that were generated with this `location_id` kee"},{"name":"lab_list_characters","description":"List the character sheets in the FilmLab cast register (id, name, age, gender, project_name, prompt_prefix_en). Call this BEFORE lab_generate whenever a person "},{"name":"lab_get_character","description":"Get ONE character sheet in full — every descriptive field plus the three that decide what you can do with it. `prompt_prefix_en` is the text block describing th"},{"name":"lab_create_character","description":"Create a character sheet in the cast register. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later describes "},{"name":"lab_generate_character_reference","description":"Generate the reference sheet for a character — six core views rendered from the sheet's `prompt_prefix_en`: detail (three-quarter close-up, the identity anchor)"},{"name":"lab_get_character_sheet","description":"The character sheet PREPARED FOR PROMPTING: base prefix, the state sheets by name, which reference views exist, and the ready-made sentence to paste into a lab_"},{"name":"lab_cast_gaps","description":"Find people who appear in a project's material (script / cast module) but have NO character sheet yet. Returns up to 6 `missing` entries, each with a name and a"},{"name":"lab_cast_autopopulate","description":"Create character sheets for the people found in a project's material — the writing counterpart to lab_cast_gaps. Creates at most 6 per call and binds each to th"},{"name":"lab_create_sequence","description":"Create a sequence (Stage 9 timeline) inside a project — START HERE to turn generated shots into something the continuity pass can read. The new sequence is EMPT"},{"name":"lab_list_sequences","description":"List a project's sequences, newest first. Use it to find a `seq_id` instead of creating a second sequence for the same cut."},{"name":"lab_get_sequence","description":"Get ONE sequence in full — timeline (the shots in order), audio_tracks, transitions, duration_seconds and render status. Check `timeline` here before starting a"},{"name":"lab_shots","description":"Read the SHOT layer of a sequence — which clips form one shot, which scene it plays in, who is in it, and what the continuity pass found. This is the layer abov"},{"name":"lab_shots_ableiten","description":"Derive the shot layer from what the clips already say about themselves — consecutive clips of the same scene become one shot, and a scene that returns later bec"},{"name":"lab_shots_setzen","description":"State the shot cut yourself: which clips form one shot, what it is called, which scene it plays in. This is the counterpart to lab_shots_ableiten — that one gro"},{"name":"lab_fassungen","description":"Use when the person asks about earlier states of a cut, wants to go back to a previous version, compare versions, name a version, or create a second cut (e.g. a"},{"name":"lab_add_clip","description":"Append a shot to a sequence's timeline. Call it once per shot, in cutting order — `start_time` is computed from the clips already there, so appending in order i"},{"name":"lab_timeline_apply","description":"Write a WHOLE cut into a sequence in one call — clips in order with their lengths, an optional dissolve between them, an optional bed underneath. This is the co"},{"name":"lab_continuity_check","description":"Start the continuity pass over a sequence — every shot is compared against its PREDECESSOR and, with check_references, against the character and location refere"},{"name":"lab_contact_sheet","description":"Build a contact sheet for a generated clip — N frames spread evenly over its runtime, tiled into ONE image — and show it. This is how a clip gets judged at all:"},{"name":"lab_bilder","description":"See a clip at EXACT seconds: up to 12 frames, in the order you list them, tiled into one image and shown. Use it to check what is on screen where you plan a cut"},{"name":"lab_capture","description":"See the CUT at exact seconds of the finished film: up to 12 frames, tiled into one image and shown. Each second is mapped like the export maps it — which clip i"},{"name":"lab_render_frames","description":"See the DELIVERED film: up to 12 frames from the finished export (lab_start_export → lab_get_export status done), tiled into one image and shown. This is the re"},{"name":"lab_feedback","description":"Tell the FilmLab team about a bug or a missing feature — it reaches the people who can fix it, the chat does not. Use art 'fehler' when a tool returned somethin"},{"name":"lab_wellenform","description":"Read the sound of a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key from lab_add_media) as numbers: peak level 0..1 per c"},{"name":"lab_wortzeiten","description":"Every spoken word with its start and end time, for a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key). Use it to cut paus"},{"name":"lab_review_asset","description":"Review generated assets: set verdict (accepted|rejected|pending) and/or selected. Pass ONE id, or `ids` for a bulk review — after a generation run there are usu"},{"name":"lab_auto_lauf","description":"Auto run with a hard spending cap: the person approves ONE run with an upper limit in credits; inside it you may generate without asking per item, but never abo"},{"name":"lab_verkettung","description":"Render several clips as CHAINS: within a scene one after another (continuity), across scenes in parallel (speed) — the plan follows scene_ref of each job in ord"},{"name":"lab_letzter_frame","description":"Extract the LAST frame of a finished clip as a new image (returns image_id, image_url, zu_dunkel). Use it as source_image_id to continue one unbroken take, or a"},{"name":"lab_abgleich","description":"Prompt check of ONE generated image or clip: does the result show what its prompt asked for? The backend first DESCRIBES the result without seeing the prompt, t"},{"name":"lab_review_queue","description":"Browse GENERATED rows (images or videos) — newest first, each with the INPUTS it ran on. Every row carries `inputs[]` (start/reference images, reference videos,"},{"name":"lab_batch_status","description":"Aggregated progress of a video batch started by lab_animate_batch. Returns {total, completed, failed, pending, done, items[]} — poll this ONCE per batch instead"},{"name":"lab_jobs_inflight","description":"Are any FilmLab generations running RIGHT NOW, across ALL projects? Use this before anything that restarts the backend (a deploy recreates the container and kil"},{"name":"lab_job_status","description":"Poll the status of an image or video generation started by lab_generate/lab_animate. There is no single-item status endpoint on the backend — this fetches the p"},{"name":"lab_auto_storyboard","description":"Auto-generate a storyboard from a script: an LLM splits the script into scenes, then one storyboard frame is generated per scene. COSTS CREDITS — every scene is"},{"name":"lab_export_profiles","description":"List the available export delivery profiles (web, social_vertical, social_youtube, streaming_hdr, cinema, master, alpha_prores4444, alpha_png_sequence) and qual"},{"name":"lab_start_export","description":"Start an ASYNC export render of a project sequence. Returns a job_id immediately (status 'queued') — does NOT block. Then poll lab_get_export with that job_id u"},{"name":"lab_prompt_transform","description":"Turn a loose idea into a production-ready image or video prompt — the same Dreamer engine the FilmLab web UI uses (modes: beautify, storyboard, polish, format, "},{"name":"lab_vfx","description":"Run a VFX operation on an image already in the project gallery — the same pipeline the Resolve bridge uses. inpaint (clean plate: what is inside the box disappe"},{"name":"lab_vfx_status","description":"Poll a VFX operation started with lab_vfx. status is pending|processing|done|failed; when done, result_url carries the finished image. Call repeatedly until don"},{"name":"lab_grade","description":"Apply a deterministic colour grade to an image already in the project gallery — no re-generation, no provider, no credits. The look is computed pixel-exact (exp"},{"name":"lab_grade_suggest","description":"Suggest a grade look for a project — read-only, no cost. With image_id, includes the image prompt; without it, uses only the colorist crew brief. Returns a reco"},{"name":"lab_grade_from_resolve","description":"Suggest a FilmLab grade look from a Resolve LUT name or path — read-only, no cost. First call resolve_node_graph_lesen on the local FilmLab bridge (filmlab_brue"},{"name":"lab_depth_map","description":"Create or read a depth map for a project video in FilmLab: use it for fog, depth of field, relighting or occlusion. Near is white, like Resolve's Depth Map. Fre"},{"name":"lab_dossier","description":"Build a dossier of a project's takes: one ZIP with an offline index.html (no external resources) plus the media files, named Project_SceneNN_YYYYMMDD-Tnn.ext. m"},{"name":"lab_get_dossier","description":"Poll a dossier job by job_id (from lab_dossier). status is queued|processing|done|failed. When done, result.archiv_url is a signed https link to the ZIP that lo"},{"name":"lab_get_export","description":"Poll an export render job by job_id (from lab_start_export). status is queued|processing|done|failed; when done, the result (output url) is included. Call repea"},{"name":"lab_list_exports","description":"List past export jobs for a project (each with job_id, status, profile). Returns up to 20 with a total count. Finished rows carry the same signed, login-free re"},{"name":"lab_add_media","description":"Bring your own video, audio or image into a project — not generated, yours. Two ways: `media_url` (a public http(s) address; the server fetches it, max 100 MB) "},{"name":"lab_umzug","description":"Bring Midjourney exports into a project (FilmLab calls this 'Umzug'). Midjourney has no API, so the person downloads their images or ZIP and this tool carries t"},{"name":"lab_referenz_aus_bild","description":"Attach an existing project image (an image_id from lab_umzug, lab_get_job result.bildzeilen or lab_generate) as reference: `ziel: 'figur'` makes it a view of a "},{"name":"lab_herkunft","description":"Declare or list where a project's material comes from: 'eigen' (made by people) or 'ki' (AI-generated or AI-altered). Exports decide the EU AI Act Art. 50 discl"},{"name":"lab_list_assets","description":"List a project's media assets (image/video/audio) with their URLs. Optionally filter by asset_type. Returns up to 20 with a total count. Each row carries its ad"},{"name":"lab_generate_music","description":"Generate a MUSIC track for a project (Stable Audio via fal.ai) — the first step of the rhythm chain, and the only one that costs credits. ASYNCHRONOUS: the call"},{"name":"lab_sfx","description":"Generate or CLEAN UP a SOUND track other than music — sound effects, ambience/atmosphere, dialog, a voiceover, FOLEY scored to an existing clip, or the repair k"},{"name":"lab_list_audio","description":"List a project's generated audio rows, newest first — this is the POLL for lab_generate_music. Read two fields: `metadata.status` ('pending' | 'completed' | 'fa"},{"name":"lab_bind_audio","description":"Bind the project's generated audio to a sequence's tracks — ONE call that does both halves of the job, because doing only the first half silently produces a sil"},{"name":"lab_mix","description":"Set the sound mix of a sequence: per track `volume_db`, `pan`, `mute`, `solo` and `effects`. Every field you send is rendered — the backend rejects what it cann"},{"name":"lab_mix_render","description":"Render the sequence's mixdown, normalised to a loudness target: `broadcast` (EBU R128), `web` or `youtube`. With `auto_preset` it runs the AUTO-MIX instead: it "},{"name":"lab_mix_messen","description":"Measure the RENDERED mix: integrated loudness (LUFS), true peak (dBTP) and loudness range (LU) of the master, measured on the mixdown file itself. Per stem the "},{"name":"lab_grade_clip","description":"Set the colour grade of ONE clip in the edit (Murnau), or of the whole programme with `programm: true`. It is the same grade a colourist sets in Murnau's colour"},{"name":"lab_scopes","description":"Measure ONE clip of the edit as numbers instead of a picture: a frame is rendered through the clip's export path (input profile, grade LUT, secondary correction"},{"name":"lab_look_match","description":"Check the colour CONTINUITY of a scene in the edit (Murnau): every shot is compared with the scene's reference shot (the first, or `referenz_clip_id`) at the SA"},{"name":"lab_ton_durchlauf","description":"Generate SOUND EFFECTS for a whole sequence, shot by shot — Simon Meyer's pass: every shot is muted, padded with black frames up to the model's minimum length, "},{"name":"lab_beatgrid","description":"Measure the TEMPO of the sequence's bound music track and store the beat grid — opens the real file with ffmpeg and analyses it, no guessing and no provider, so"},{"name":"lab_apply_rhythm","description":"Compute the sequence's clip durations from the project's cutting preset and — when the tempo allows it — pull the cut points onto the measured beat grid. WRITES"},{"name":"lab_suggest_durations","description":"Ask what clip durations the project's cutting preset WOULD give a sequence — and change nothing (`angewendet: false`). Use it to see the consequence before lab_"},{"name":"lab_dub","description":"Dub a sequence into another language: either a ready audio track (en_audio_url — e.g. the one lab_dub_tts just produced) OR a cloned voice reading a line of tex"},{"name":"lab_dub_voices","description":"List the ElevenLabs TTS voices available for lab_dub_tts's `voice_id` — this is the EN-dub-track text-to-speech voice list, NOT a project's cloned voices (those"},{"name":"lab_dub_tts","description":"Generate the EN-dub audio track for a sequence via ElevenLabs TTS — SYNCHRONOUS, returns a ready audio_url immediately, no job_id and nothing to poll. Optionall"},{"name":"lab_voice_clone","description":"Clone a voice from real audio or video material into a project (fal.ai minimax voice-clone) — the source for lab_voice_tts and for lab_dub's voice_id+dub_text p"}],"toolCount":113,"toolsHash":"ac5e30530cc39d275aeef0a1c83bcfeb991708e9299928b48c759f3221fef667","serverName":"filmlab-mcp","capabilities":["resources","prompts","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T02:30:15.892Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":152,"error":null,"detail":{"tools":[{"name":"lab_list_projects","description":"List FilmLab projects (id, title, current pipeline stage). Call this first to find a project_id for the other tools. Shows up to 20 items; `total` counts your a"},{"name":"lab_wissen","description":"Use when the person asks a film-craft question: what a term means, which rule or convention applies, how something is usually done in camera, editing, sound or "},{"name":"lab_widerruf","description":"Record a correction in the FilmOS knowledge layer when the user contradicts something you asserted from it. Use this the moment a contradiction is stated — not "},{"name":"lab_playbook","description":"The rules of one working surface, generated from the code: what the surface is, what an agent can trigger itself, what exists but only by hand, and what does no"},{"name":"lab_list_models","description":"The model catalog: what every video or image model can do — resolutions, durations, aspect ratios, audio, reference limits, price per second or per image — grou"},{"name":"lab_regie_techniken","description":"Use when the person asks HOW to stage or shoot a feeling or effect (which angle, movement, framing or light makes a scene feel tense, tender, triumphant, uneasy"},{"name":"lab_whoami","description":"Who is connected: the FilmLab account (email, user id, name, tier, credits) and how this connection signed in (oauth, oauth_geraet, bridge_key, legacy service u"},{"name":"lab_get_state","description":"One call, the whole picture: account (tier, credits, reset), default models with price, jobs in flight, catalog freshness, project count. Pass project_id for th"},{"name":"lab_get_project","description":"Use when the person asks where a project stands: its current stage, what is finished, what comes next, or wants the project's state before continuing. Get a sin"},{"name":"lab_zielgruppe","description":"Read or set a project's audience (zielgruppe) and target markets (zielmaerkte). With project_id only: read. Set zielgruppe 'kinder' or 'jugendliche' whenever th"},{"name":"lab_get_context","description":"Read the accumulated context/output for one pipeline module of a project (e.g. the IDEE, STORYBOARD or SHOTS stage). Needs project_id and module name."},{"name":"lab_get_job","description":"Get the status of a background job by job_id (status is queued|processing|done|failed). Poll this after starting a long-running generate/export. Returns the job"},{"name":"lab_search_catalog","description":"Search the FilmLab universe catalog of AI tools, news and companies. Query must be at least 2 characters. Returns up to 20 matches with a total count."},{"name":"lab_create_project","description":"Create a new FilmLab project. Returns the new project id. Optionally set a title."},{"name":"lab_run_module","description":"Run ONE pipeline module for a project (context is injected from upstream modules + crew agents). SYNCHRONOUS and LLM-heavy: light modules return in seconds; hea"},{"name":"lab_generate","description":"Generate an image on the production pipeline (fal.ai, quota-tracked, persisted to the project's gallery). Waits up to `wait_s` seconds (default 45) for the imag"},{"name":"lab_animate","description":"Animate a completed image into a clip with a video model. Pick the model from lab_list_models; check the price with get_cost or let the user confirm a card via "},{"name":"lab_animate_batch","description":"Animate MANY images into videos in ONE call (max 25 jobs). Prefer this over looping lab_animate: it validates every job BEFORE spending any quota, so an invalid"},{"name":"lab_propose","description":"Propose a generation for the user to confirm: validates the parameters against the catalog, computes the price, and shows a card (widget hosts) or returns the s"},{"name":"lab_run_proposal","description":"Run a proposal exactly as shown — same model, same parameters, same price. Called by the card's button, or by you after the user confirmed. Single use: the prop"},{"name":"lab_list_locations","description":"List location boards, newest first — START HERE to find a `location_id` for lab_generate / lab_animate. Each entry carries its `prompt_prefix_en`: that is the e"},{"name":"lab_get_location","description":"Get ONE location board in full — all descriptive fields plus its reference images and `prompt_prefix_en`. Use it to check what a board actually anchors before g"},{"name":"lab_list_project_locations","description":"Location boards bound to ONE project. Narrower and more correct than lab_list_locations when you already know the project: it cannot leak boards from a differen"},{"name":"lab_create_location","description":"Create a location board. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later anchors every image and clip sho"},{"name":"lab_generate_location_variants","description":"Generate reference images for a location board (costs quota). Without `variants` the backend picks its default set. The images are what makes a board usable as "},{"name":"lab_enrich_location_prefix","description":"Append context to a board's `prompt_prefix_en` (plain string concatenation server-side — no AI call, no quota). Idempotent: context already present in the prefi"},{"name":"lab_restyle_location","description":"Restyle an existing board towards a wish (costs quota) — same place, different look, e.g. 'the same flat, twenty years later'. Changes the board itself, so imag"},{"name":"lab_location_panorama","description":"Generate a 360° equirectangular HDRI panorama of a place (costs quota). Pass loc_id to persist it on that board, so the viewer finds it again; without loc_id it"},{"name":"lab_analyze_location_image","description":"Read a photo and extract location fields from it (Gemini Vision, costs quota). Returns the fields — it does NOT create a board; feed the result into lab_create_"},{"name":"lab_delete_location","description":"DELETE a location board permanently. There is no undo and no soft-archive — the row is removed. Images and clips that were generated with this `location_id` kee"},{"name":"lab_list_characters","description":"List the character sheets in the FilmLab cast register (id, name, age, gender, project_name, prompt_prefix_en). Call this BEFORE lab_generate whenever a person "},{"name":"lab_get_character","description":"Get ONE character sheet in full — every descriptive field plus the three that decide what you can do with it. `prompt_prefix_en` is the text block describing th"},{"name":"lab_create_character","description":"Create a character sheet in the cast register. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later describes "},{"name":"lab_generate_character_reference","description":"Generate the reference sheet for a character — six core views rendered from the sheet's `prompt_prefix_en`: detail (three-quarter close-up, the identity anchor)"},{"name":"lab_get_character_sheet","description":"The character sheet PREPARED FOR PROMPTING: base prefix, the state sheets by name, which reference views exist, and the ready-made sentence to paste into a lab_"},{"name":"lab_cast_gaps","description":"Find people who appear in a project's material (script / cast module) but have NO character sheet yet. Returns up to 6 `missing` entries, each with a name and a"},{"name":"lab_cast_autopopulate","description":"Create character sheets for the people found in a project's material — the writing counterpart to lab_cast_gaps. Creates at most 6 per call and binds each to th"},{"name":"lab_create_sequence","description":"Create a sequence (Stage 9 timeline) inside a project — START HERE to turn generated shots into something the continuity pass can read. The new sequence is EMPT"},{"name":"lab_list_sequences","description":"List a project's sequences, newest first. Use it to find a `seq_id` instead of creating a second sequence for the same cut."},{"name":"lab_get_sequence","description":"Get ONE sequence in full — timeline (the shots in order), audio_tracks, transitions, duration_seconds and render status. Check `timeline` here before starting a"},{"name":"lab_shots","description":"Read the SHOT layer of a sequence — which clips form one shot, which scene it plays in, who is in it, and what the continuity pass found. This is the layer abov"},{"name":"lab_shots_ableiten","description":"Derive the shot layer from what the clips already say about themselves — consecutive clips of the same scene become one shot, and a scene that returns later bec"},{"name":"lab_shots_setzen","description":"State the shot cut yourself: which clips form one shot, what it is called, which scene it plays in. This is the counterpart to lab_shots_ableiten — that one gro"},{"name":"lab_fassungen","description":"Use when the person asks about earlier states of a cut, wants to go back to a previous version, compare versions, name a version, or create a second cut (e.g. a"},{"name":"lab_add_clip","description":"Append a shot to a sequence's timeline. Call it once per shot, in cutting order — `start_time` is computed from the clips already there, so appending in order i"},{"name":"lab_timeline_apply","description":"Write a WHOLE cut into a sequence in one call — clips in order with their lengths, an optional dissolve between them, an optional bed underneath. This is the co"},{"name":"lab_continuity_check","description":"Start the continuity pass over a sequence — every shot is compared against its PREDECESSOR and, with check_references, against the character and location refere"},{"name":"lab_contact_sheet","description":"Build a contact sheet for a generated clip — N frames spread evenly over its runtime, tiled into ONE image — and show it. This is how a clip gets judged at all:"},{"name":"lab_bilder","description":"See a clip at EXACT seconds: up to 12 frames, in the order you list them, tiled into one image and shown. Use it to check what is on screen where you plan a cut"},{"name":"lab_capture","description":"See the CUT at exact seconds of the finished film: up to 12 frames, tiled into one image and shown. Each second is mapped like the export maps it — which clip i"},{"name":"lab_render_frames","description":"See the DELIVERED film: up to 12 frames from the finished export (lab_start_export → lab_get_export status done), tiled into one image and shown. This is the re"},{"name":"lab_feedback","description":"Tell the FilmLab team about a bug or a missing feature — it reaches the people who can fix it, the chat does not. Use art 'fehler' when a tool returned somethin"},{"name":"lab_wellenform","description":"Read the sound of a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key from lab_add_media) as numbers: peak level 0..1 per c"},{"name":"lab_wortzeiten","description":"Every spoken word with its start and end time, for a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key). Use it to cut paus"},{"name":"lab_review_asset","description":"Review generated assets: set verdict (accepted|rejected|pending) and/or selected. Pass ONE id, or `ids` for a bulk review — after a generation run there are usu"},{"name":"lab_auto_lauf","description":"Auto run with a hard spending cap: the person approves ONE run with an upper limit in credits; inside it you may generate without asking per item, but never abo"},{"name":"lab_verkettung","description":"Render several clips as CHAINS: within a scene one after another (continuity), across scenes in parallel (speed) — the plan follows scene_ref of each job in ord"},{"name":"lab_letzter_frame","description":"Extract the LAST frame of a finished clip as a new image (returns image_id, image_url, zu_dunkel). Use it as source_image_id to continue one unbroken take, or a"},{"name":"lab_abgleich","description":"Prompt check of ONE generated image or clip: does the result show what its prompt asked for? The backend first DESCRIBES the result without seeing the prompt, t"},{"name":"lab_review_queue","description":"Browse GENERATED rows (images or videos) — newest first, each with the INPUTS it ran on. Every row carries `inputs[]` (start/reference images, reference videos,"},{"name":"lab_batch_status","description":"Aggregated progress of a video batch started by lab_animate_batch. Returns {total, completed, failed, pending, done, items[]} — poll this ONCE per batch instead"},{"name":"lab_jobs_inflight","description":"Are any FilmLab generations running RIGHT NOW, across ALL projects? Use this before anything that restarts the backend (a deploy recreates the container and kil"},{"name":"lab_job_status","description":"Poll the status of an image or video generation started by lab_generate/lab_animate. There is no single-item status endpoint on the backend — this fetches the p"},{"name":"lab_auto_storyboard","description":"Auto-generate a storyboard from a script: an LLM splits the script into scenes, then one storyboard frame is generated per scene. COSTS CREDITS — every scene is"},{"name":"lab_export_profiles","description":"List the available export delivery profiles (web, social_vertical, social_youtube, streaming_hdr, cinema, master, alpha_prores4444, alpha_png_sequence) and qual"},{"name":"lab_start_export","description":"Start an ASYNC export render of a project sequence. Returns a job_id immediately (status 'queued') — does NOT block. Then poll lab_get_export with that job_id u"},{"name":"lab_prompt_transform","description":"Turn a loose idea into a production-ready image or video prompt — the same Dreamer engine the FilmLab web UI uses (modes: beautify, storyboard, polish, format, "},{"name":"lab_vfx","description":"Run a VFX operation on an image already in the project gallery — the same pipeline the Resolve bridge uses. inpaint (clean plate: what is inside the box disappe"},{"name":"lab_vfx_status","description":"Poll a VFX operation started with lab_vfx. status is pending|processing|done|failed; when done, result_url carries the finished image. Call repeatedly until don"},{"name":"lab_grade","description":"Apply a deterministic colour grade to an image already in the project gallery — no re-generation, no provider, no credits. The look is computed pixel-exact (exp"},{"name":"lab_grade_suggest","description":"Suggest a grade look for a project — read-only, no cost. With image_id, includes the image prompt; without it, uses only the colorist crew brief. Returns a reco"},{"name":"lab_grade_from_resolve","description":"Suggest a FilmLab grade look from a Resolve LUT name or path — read-only, no cost. First call resolve_node_graph_lesen on the local FilmLab bridge (filmlab_brue"},{"name":"lab_depth_map","description":"Create or read a depth map for a project video in FilmLab: use it for fog, depth of field, relighting or occlusion. Near is white, like Resolve's Depth Map. Fre"},{"name":"lab_dossier","description":"Build a dossier of a project's takes: one ZIP with an offline index.html (no external resources) plus the media files, named Project_SceneNN_YYYYMMDD-Tnn.ext. m"},{"name":"lab_get_dossier","description":"Poll a dossier job by job_id (from lab_dossier). status is queued|processing|done|failed. When done, result.archiv_url is a signed https link to the ZIP that lo"},{"name":"lab_get_export","description":"Poll an export render job by job_id (from lab_start_export). status is queued|processing|done|failed; when done, the result (output url) is included. Call repea"},{"name":"lab_list_exports","description":"List past export jobs for a project (each with job_id, status, profile). Returns up to 20 with a total count. Finished rows carry the same signed, login-free re"},{"name":"lab_add_media","description":"Bring your own video, audio or image into a project — not generated, yours. Two ways: `media_url` (a public http(s) address; the server fetches it, max 100 MB) "},{"name":"lab_umzug","description":"Bring Midjourney exports into a project (FilmLab calls this 'Umzug'). Midjourney has no API, so the person downloads their images or ZIP and this tool carries t"},{"name":"lab_referenz_aus_bild","description":"Attach an existing project image (an image_id from lab_umzug, lab_get_job result.bildzeilen or lab_generate) as reference: `ziel: 'figur'` makes it a view of a "},{"name":"lab_herkunft","description":"Declare or list where a project's material comes from: 'eigen' (made by people) or 'ki' (AI-generated or AI-altered). Exports decide the EU AI Act Art. 50 discl"},{"name":"lab_list_assets","description":"List a project's media assets (image/video/audio) with their URLs. Optionally filter by asset_type. Returns up to 20 with a total count. Each row carries its ad"},{"name":"lab_generate_music","description":"Generate a MUSIC track for a project (Stable Audio via fal.ai) — the first step of the rhythm chain, and the only one that costs credits. ASYNCHRONOUS: the call"},{"name":"lab_sfx","description":"Generate or CLEAN UP a SOUND track other than music — sound effects, ambience/atmosphere, dialog, a voiceover, FOLEY scored to an existing clip, or the repair k"},{"name":"lab_list_audio","description":"List a project's generated audio rows, newest first — this is the POLL for lab_generate_music. Read two fields: `metadata.status` ('pending' | 'completed' | 'fa"},{"name":"lab_bind_audio","description":"Bind the project's generated audio to a sequence's tracks — ONE call that does both halves of the job, because doing only the first half silently produces a sil"},{"name":"lab_mix","description":"Set the sound mix of a sequence: per track `volume_db`, `pan`, `mute`, `solo` and `effects`. Every field you send is rendered — the backend rejects what it cann"},{"name":"lab_mix_render","description":"Render the sequence's mixdown, normalised to a loudness target: `broadcast` (EBU R128), `web` or `youtube`. With `auto_preset` it runs the AUTO-MIX instead: it "},{"name":"lab_mix_messen","description":"Measure the RENDERED mix: integrated loudness (LUFS), true peak (dBTP) and loudness range (LU) of the master, measured on the mixdown file itself. Per stem the "},{"name":"lab_grade_clip","description":"Set the colour grade of ONE clip in the edit (Murnau), or of the whole programme with `programm: true`. It is the same grade a colourist sets in Murnau's colour"},{"name":"lab_scopes","description":"Measure ONE clip of the edit as numbers instead of a picture: a frame is rendered through the clip's export path (input profile, grade LUT, secondary correction"},{"name":"lab_look_match","description":"Check the colour CONTINUITY of a scene in the edit (Murnau): every shot is compared with the scene's reference shot (the first, or `referenz_clip_id`) at the SA"},{"name":"lab_ton_durchlauf","description":"Generate SOUND EFFECTS for a whole sequence, shot by shot — Simon Meyer's pass: every shot is muted, padded with black frames up to the model's minimum length, "},{"name":"lab_beatgrid","description":"Measure the TEMPO of the sequence's bound music track and store the beat grid — opens the real file with ffmpeg and analyses it, no guessing and no provider, so"},{"name":"lab_apply_rhythm","description":"Compute the sequence's clip durations from the project's cutting preset and — when the tempo allows it — pull the cut points onto the measured beat grid. WRITES"},{"name":"lab_suggest_durations","description":"Ask what clip durations the project's cutting preset WOULD give a sequence — and change nothing (`angewendet: false`). Use it to see the consequence before lab_"},{"name":"lab_dub","description":"Dub a sequence into another language: either a ready audio track (en_audio_url — e.g. the one lab_dub_tts just produced) OR a cloned voice reading a line of tex"},{"name":"lab_dub_voices","description":"List the ElevenLabs TTS voices available for lab_dub_tts's `voice_id` — this is the EN-dub-track text-to-speech voice list, NOT a project's cloned voices (those"},{"name":"lab_dub_tts","description":"Generate the EN-dub audio track for a sequence via ElevenLabs TTS — SYNCHRONOUS, returns a ready audio_url immediately, no job_id and nothing to poll. Optionall"},{"name":"lab_voice_clone","description":"Clone a voice from real audio or video material into a project (fal.ai minimax voice-clone) — the source for lab_voice_tts and for lab_dub's voice_id+dub_text p"}],"toolCount":113,"toolsHash":"67fca0bd98277a724c485865f618f68f63cc9ab0e2c4bd11707806217db2a4e5","serverName":"filmlab-mcp","capabilities":["resources","prompts","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T19:25:50.531Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":498,"error":null,"detail":{"tools":[{"name":"lab_list_projects","description":"List FilmLab projects (id, title, current pipeline stage). Call this first to find a project_id for the other tools. Shows up to 20 items; `total` counts your a"},{"name":"lab_wissen","description":"Use when the person asks a film-craft question: what a term means, which rule or convention applies, how something is usually done in camera, editing, sound or "},{"name":"lab_widerruf","description":"Record a correction in the FilmOS knowledge layer when the user contradicts something you asserted from it. Use this the moment a contradiction is stated — not "},{"name":"lab_playbook","description":"The rules of one working surface, generated from the code: what the surface is, what an agent can trigger itself, what exists but only by hand, and what does no"},{"name":"lab_list_models","description":"The model catalog: what every video or image model can do — resolutions, durations, aspect ratios, audio, reference limits, price per second or per image — grou"},{"name":"lab_regie_techniken","description":"Use when the person asks HOW to stage or shoot a feeling or effect (which angle, movement, framing or light makes a scene feel tense, tender, triumphant, uneasy"},{"name":"lab_whoami","description":"Who is connected: the FilmLab account (email, user id, name, tier, credits) and how this connection signed in (oauth, oauth_geraet, bridge_key, legacy service u"},{"name":"lab_get_state","description":"One call, the whole picture: account (tier, credits, reset), default models with price, jobs in flight, catalog freshness, project count. Pass project_id for th"},{"name":"lab_get_project","description":"Use when the person asks where a project stands: its current stage, what is finished, what comes next, or wants the project's state before continuing. Get a sin"},{"name":"lab_zielgruppe","description":"Read or set a project's audience (zielgruppe) and target markets (zielmaerkte). With project_id only: read. Set zielgruppe 'kinder' or 'jugendliche' whenever th"},{"name":"lab_get_context","description":"Read the accumulated context/output for one pipeline module of a project (e.g. the IDEE, STORYBOARD or SHOTS stage). Needs project_id and module name."},{"name":"lab_get_job","description":"Get the status of a background job by job_id (status is queued|processing|done|failed). Poll this after starting a long-running generate/export. Returns the job"},{"name":"lab_search_catalog","description":"Search the FilmLab universe catalog of AI tools, news and companies. Query must be at least 2 characters. Returns up to 20 matches with a total count."},{"name":"lab_create_project","description":"Create a new FilmLab project. Returns the new project id. Optionally set a title."},{"name":"lab_run_module","description":"Run ONE pipeline module for a project (context is injected from upstream modules + crew agents). SYNCHRONOUS and LLM-heavy: light modules return in seconds; hea"},{"name":"lab_generate","description":"Generate an image on the production pipeline (fal.ai, quota-tracked, persisted to the project's gallery). Waits up to `wait_s` seconds (default 45) for the imag"},{"name":"lab_animate","description":"Animate a completed image into a clip with a video model. Pick the model from lab_list_models; check the price with get_cost or let the user confirm a card via "},{"name":"lab_animate_batch","description":"Animate MANY images into videos in ONE call (max 25 jobs). Prefer this over looping lab_animate: it validates every job BEFORE spending any quota, so an invalid"},{"name":"lab_propose","description":"Propose a generation for the user to confirm: validates the parameters against the catalog, computes the price, and shows a card (widget hosts) or returns the s"},{"name":"lab_run_proposal","description":"Run a proposal exactly as shown — same model, same parameters, same price. Called by the card's button, or by you after the user confirmed. Single use: the prop"},{"name":"lab_list_locations","description":"List location boards, newest first — START HERE to find a `location_id` for lab_generate / lab_animate. Each entry carries its `prompt_prefix_en`: that is the e"},{"name":"lab_get_location","description":"Get ONE location board in full — all descriptive fields plus its reference images and `prompt_prefix_en`. Use it to check what a board actually anchors before g"},{"name":"lab_list_project_locations","description":"Location boards bound to ONE project. Narrower and more correct than lab_list_locations when you already know the project: it cannot leak boards from a differen"},{"name":"lab_create_location","description":"Create a location board. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later anchors every image and clip sho"},{"name":"lab_generate_location_variants","description":"Generate reference images for a location board (costs quota). Without `variants` the backend picks its default set. The images are what makes a board usable as "},{"name":"lab_enrich_location_prefix","description":"Append context to a board's `prompt_prefix_en` (plain string concatenation server-side — no AI call, no quota). Idempotent: context already present in the prefi"},{"name":"lab_restyle_location","description":"Restyle an existing board towards a wish (costs quota) — same place, different look, e.g. 'the same flat, twenty years later'. Changes the board itself, so imag"},{"name":"lab_location_panorama","description":"Generate a 360° equirectangular HDRI panorama of a place (costs quota). Pass loc_id to persist it on that board, so the viewer finds it again; without loc_id it"},{"name":"lab_analyze_location_image","description":"Read a photo and extract location fields from it (Gemini Vision, costs quota). Returns the fields — it does NOT create a board; feed the result into lab_create_"},{"name":"lab_delete_location","description":"DELETE a location board permanently. There is no undo and no soft-archive — the row is removed. Images and clips that were generated with this `location_id` kee"},{"name":"lab_list_characters","description":"List the character sheets in the FilmLab cast register (id, name, age, gender, project_name, prompt_prefix_en). Call this BEFORE lab_generate whenever a person "},{"name":"lab_get_character","description":"Get ONE character sheet in full — every descriptive field plus the three that decide what you can do with it. `prompt_prefix_en` is the text block describing th"},{"name":"lab_create_character","description":"Create a character sheet in the cast register. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later describes "},{"name":"lab_generate_character_reference","description":"Generate the reference sheet for a character — six core views rendered from the sheet's `prompt_prefix_en`: detail (three-quarter close-up, the identity anchor)"},{"name":"lab_get_character_sheet","description":"The character sheet PREPARED FOR PROMPTING: base prefix, the state sheets by name, which reference views exist, and the ready-made sentence to paste into a lab_"},{"name":"lab_cast_gaps","description":"Find people who appear in a project's material (script / cast module) but have NO character sheet yet. Returns up to 6 `missing` entries, each with a name and a"},{"name":"lab_cast_autopopulate","description":"Create character sheets for the people found in a project's material — the writing counterpart to lab_cast_gaps. Creates at most 6 per call and binds each to th"},{"name":"lab_create_sequence","description":"Create a sequence (Stage 9 timeline) inside a project — START HERE to turn generated shots into something the continuity pass can read. The new sequence is EMPT"},{"name":"lab_list_sequences","description":"List a project's sequences, newest first. Use it to find a `seq_id` instead of creating a second sequence for the same cut."},{"name":"lab_get_sequence","description":"Get ONE sequence in full — timeline (the shots in order), audio_tracks, transitions, duration_seconds and render status. Check `timeline` here before starting a"},{"name":"lab_shots","description":"Read the SHOT layer of a sequence — which clips form one shot, which scene it plays in, who is in it, and what the continuity pass found. This is the layer abov"},{"name":"lab_shots_ableiten","description":"Derive the shot layer from what the clips already say about themselves — consecutive clips of the same scene become one shot, and a scene that returns later bec"},{"name":"lab_shots_setzen","description":"State the shot cut yourself: which clips form one shot, what it is called, which scene it plays in. This is the counterpart to lab_shots_ableiten — that one gro"},{"name":"lab_fassungen","description":"Use when the person asks about earlier states of a cut, wants to go back to a previous version, compare versions, name a version, or create a second cut (e.g. a"},{"name":"lab_add_clip","description":"Append a shot to a sequence's timeline. Call it once per shot, in cutting order — `start_time` is computed from the clips already there, so appending in order i"},{"name":"lab_timeline_apply","description":"Write a WHOLE cut into a sequence in one call — clips in order with their lengths, an optional dissolve between them, an optional bed underneath. This is the co"},{"name":"lab_continuity_check","description":"Start the continuity pass over a sequence — every shot is compared against its PREDECESSOR and, with check_references, against the character and location refere"},{"name":"lab_contact_sheet","description":"Build a contact sheet for a generated clip — N frames spread evenly over its runtime, tiled into ONE image — and show it. This is how a clip gets judged at all:"},{"name":"lab_bilder","description":"See a clip at EXACT seconds: up to 12 frames, in the order you list them, tiled into one image and shown. Use it to check what is on screen where you plan a cut"},{"name":"lab_capture","description":"See the CUT at exact seconds of the finished film: up to 12 frames, tiled into one image and shown. Each second is mapped like the export maps it — which clip i"},{"name":"lab_render_frames","description":"See the DELIVERED film: up to 12 frames from the finished export (lab_start_export → lab_get_export status done), tiled into one image and shown. This is the re"},{"name":"lab_feedback","description":"Tell the FilmLab team about a bug or a missing feature — it reaches the people who can fix it, the chat does not. Use art 'fehler' when a tool returned somethin"},{"name":"lab_wellenform","description":"Read the sound of a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key from lab_add_media) as numbers: peak level 0..1 per c"},{"name":"lab_wortzeiten","description":"Every spoken word with its start and end time, for a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key). Use it to cut paus"},{"name":"lab_review_asset","description":"Review generated assets: set verdict (accepted|rejected|pending) and/or selected. Pass ONE id, or `ids` for a bulk review — after a generation run there are usu"},{"name":"lab_auto_lauf","description":"Auto run with a hard spending cap: the person approves ONE run with an upper limit in credits; inside it you may generate without asking per item, but never abo"},{"name":"lab_verkettung","description":"Render several clips as CHAINS: within a scene one after another (continuity), across scenes in parallel (speed) — the plan follows scene_ref of each job in ord"},{"name":"lab_letzter_frame","description":"Extract the LAST frame of a finished clip as a new image (returns image_id, image_url, zu_dunkel). Use it as source_image_id to continue one unbroken take, or a"},{"name":"lab_abgleich","description":"Prompt check of ONE generated image or clip: does the result show what its prompt asked for? The backend first DESCRIBES the result without seeing the prompt, t"},{"name":"lab_review_queue","description":"Browse GENERATED rows (images or videos) — newest first, each with the INPUTS it ran on. Every row carries `inputs[]` (start/reference images, reference videos,"},{"name":"lab_batch_status","description":"Aggregated progress of a video batch started by lab_animate_batch. Returns {total, completed, failed, pending, done, items[]} — poll this ONCE per batch instead"},{"name":"lab_jobs_inflight","description":"Are any FilmLab generations running RIGHT NOW, across ALL projects? Use this before anything that restarts the backend (a deploy recreates the container and kil"},{"name":"lab_job_status","description":"Poll the status of an image or video generation started by lab_generate/lab_animate. There is no single-item status endpoint on the backend — this fetches the p"},{"name":"lab_auto_storyboard","description":"Auto-generate a storyboard from a script: an LLM splits the script into scenes, then one storyboard frame is generated per scene. COSTS CREDITS — every scene is"},{"name":"lab_export_profiles","description":"List the available export delivery profiles (web, social_vertical, social_youtube, streaming_hdr, cinema, master, alpha_prores4444, alpha_png_sequence) and qual"},{"name":"lab_start_export","description":"Start an ASYNC export render of a project sequence. Returns a job_id immediately (status 'queued') — does NOT block. Then poll lab_get_export with that job_id u"},{"name":"lab_prompt_transform","description":"Turn a loose idea into a production-ready image or video prompt — the same Dreamer engine the FilmLab web UI uses (modes: beautify, storyboard, polish, format, "},{"name":"lab_vfx","description":"Run a VFX operation on an image already in the project gallery — the same pipeline the Resolve bridge uses. inpaint (clean plate: what is inside the box disappe"},{"name":"lab_vfx_status","description":"Poll a VFX operation started with lab_vfx. status is pending|processing|done|failed; when done, result_url carries the finished image. Call repeatedly until don"},{"name":"lab_grade","description":"Apply a deterministic colour grade to an image already in the project gallery — no re-generation, no provider, no credits. The look is computed pixel-exact (exp"},{"name":"lab_grade_suggest","description":"Suggest a grade look for a project — read-only, no cost. With image_id, includes the image prompt; without it, uses only the colorist crew brief. Returns a reco"},{"name":"lab_grade_from_resolve","description":"Suggest a FilmLab grade look from a Resolve LUT name or path — read-only, no cost. First call resolve_node_graph_lesen on the local FilmLab bridge (filmlab_brue"},{"name":"lab_depth_map","description":"Create or read a depth map for a project video in FilmLab: use it for fog, depth of field, relighting or occlusion. Near is white, like Resolve's Depth Map. Fre"},{"name":"lab_dossier","description":"Build a dossier of a project's takes: one ZIP with an offline index.html (no external resources) plus the media files, named Project_SceneNN_YYYYMMDD-Tnn.ext. m"},{"name":"lab_get_dossier","description":"Poll a dossier job by job_id (from lab_dossier). status is queued|processing|done|failed. When done, result.archiv_url is a signed https link to the ZIP that lo"},{"name":"lab_get_export","description":"Poll an export render job by job_id (from lab_start_export). status is queued|processing|done|failed; when done, the result (output url) is included. Call repea"},{"name":"lab_list_exports","description":"List past export jobs for a project (each with job_id, status, profile). Returns up to 20 with a total count. Finished rows carry the same signed, login-free re"},{"name":"lab_add_media","description":"Bring your own video, audio or image into a project — not generated, yours. Two ways: `media_url` (a public http(s) address; the server fetches it, max 100 MB) "},{"name":"lab_herkunft","description":"Declare or list where a project's material comes from: 'eigen' (made by people) or 'ki' (AI-generated or AI-altered). Exports decide the EU AI Act Art. 50 discl"},{"name":"lab_list_assets","description":"List a project's media assets (image/video/audio) with their URLs. Optionally filter by asset_type. Returns up to 20 with a total count. Each row carries its ad"},{"name":"lab_generate_music","description":"Generate a MUSIC track for a project (Stable Audio via fal.ai) — the first step of the rhythm chain, and the only one that costs credits. ASYNCHRONOUS: the call"},{"name":"lab_sfx","description":"Generate or CLEAN UP a SOUND track other than music — sound effects, ambience/atmosphere, dialog, a voiceover, FOLEY scored to an existing clip, or the repair k"},{"name":"lab_list_audio","description":"List a project's generated audio rows, newest first — this is the POLL for lab_generate_music. Read two fields: `metadata.status` ('pending' | 'completed' | 'fa"},{"name":"lab_bind_audio","description":"Bind the project's generated audio to a sequence's tracks — ONE call that does both halves of the job, because doing only the first half silently produces a sil"},{"name":"lab_mix","description":"Set the sound mix of a sequence: per track `volume_db`, `pan`, `mute`, `solo` and `effects`. Every field you send is rendered — the backend rejects what it cann"},{"name":"lab_mix_render","description":"Render the sequence's mixdown, normalised to a loudness target: `broadcast` (EBU R128), `web` or `youtube`. With `auto_preset` it runs the AUTO-MIX instead: it "},{"name":"lab_mix_messen","description":"Measure the RENDERED mix: integrated loudness (LUFS), true peak (dBTP) and loudness range (LU) of the master, measured on the mixdown file itself. Per stem the "},{"name":"lab_grade_clip","description":"Set the colour grade of ONE clip in the edit (Murnau), or of the whole programme with `programm: true`. It is the same grade a colourist sets in Murnau's colour"},{"name":"lab_scopes","description":"Measure ONE clip of the edit as numbers instead of a picture: a frame is rendered through the clip's export path (input profile, grade LUT, secondary correction"},{"name":"lab_look_match","description":"Check the colour CONTINUITY of a scene in the edit (Murnau): every shot is compared with the scene's reference shot (the first, or `referenz_clip_id`) at the SA"},{"name":"lab_ton_durchlauf","description":"Generate SOUND EFFECTS for a whole sequence, shot by shot — Simon Meyer's pass: every shot is muted, padded with black frames up to the model's minimum length, "},{"name":"lab_beatgrid","description":"Measure the TEMPO of the sequence's bound music track and store the beat grid — opens the real file with ffmpeg and analyses it, no guessing and no provider, so"},{"name":"lab_apply_rhythm","description":"Compute the sequence's clip durations from the project's cutting preset and — when the tempo allows it — pull the cut points onto the measured beat grid. WRITES"},{"name":"lab_suggest_durations","description":"Ask what clip durations the project's cutting preset WOULD give a sequence — and change nothing (`angewendet: false`). Use it to see the consequence before lab_"},{"name":"lab_dub","description":"Dub a sequence into another language: either a ready audio track (en_audio_url — e.g. the one lab_dub_tts just produced) OR a cloned voice reading a line of tex"},{"name":"lab_dub_voices","description":"List the ElevenLabs TTS voices available for lab_dub_tts's `voice_id` — this is the EN-dub-track text-to-speech voice list, NOT a project's cloned voices (those"},{"name":"lab_dub_tts","description":"Generate the EN-dub audio track for a sequence via ElevenLabs TTS — SYNCHRONOUS, returns a ready audio_url immediately, no job_id and nothing to poll. Optionall"},{"name":"lab_voice_clone","description":"Clone a voice from real audio or video material into a project (fal.ai minimax voice-clone) — the source for lab_voice_tts and for lab_dub's voice_id+dub_text p"},{"name":"lab_voice_tts","description":"Speak text in a project's cloned voice (via lab_voice_clone) — SYNCHRONOUS, returns a ready audio_url, no job_id. The voice house is whichever one cloned this v"},{"name":"lab_list_voices","description":"List a project's cloned voices (lab_voice_clone results) — id, label, voice house, sample and preview URLs. This is where a `voice_id` for lab_voice_tts or lab_"}],"toolCount":111,"toolsHash":"a4b987243d04a0738350eaddc78c6edb75c8ec6e9d5d883dc8e3288dbcc585f0","serverName":"filmlab-mcp","capabilities":["resources","prompts","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T12:30:09.033Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":394,"error":null,"detail":{"tools":[{"name":"lab_list_projects","description":"List FilmLab projects (id, title, current pipeline stage). Call this first to find a project_id for the other tools. Shows up to 20 items; `total` counts your a"},{"name":"lab_wissen","description":"Use when the person asks a film-craft question: what a term means, which rule or convention applies, how something is usually done in camera, editing, sound or "},{"name":"lab_widerruf","description":"Record a correction in the FilmOS knowledge layer when the user contradicts something you asserted from it. Use this the moment a contradiction is stated — not "},{"name":"lab_playbook","description":"The rules of one working surface, generated from the code: what the surface is, what an agent can trigger itself, what exists but only by hand, and what does no"},{"name":"lab_list_models","description":"The model catalog: what every video or image model can do — resolutions, durations, aspect ratios, audio, reference limits, price per second or per image — grou"},{"name":"lab_regie_techniken","description":"Use when the person asks HOW to stage or shoot a feeling or effect (which angle, movement, framing or light makes a scene feel tense, tender, triumphant, uneasy"},{"name":"lab_whoami","description":"Who is connected: the FilmLab account (email, user id, name, tier, credits) and how this connection signed in (oauth, oauth_geraet, bridge_key, legacy service u"},{"name":"lab_get_state","description":"One call, the whole picture: account (tier, credits, reset), default models with price, jobs in flight, catalog freshness, project count. Pass project_id for th"},{"name":"lab_get_project","description":"Use when the person asks where a project stands: its current stage, what is finished, what comes next, or wants the project's state before continuing. Get a sin"},{"name":"lab_zielgruppe","description":"Read or set a project's audience (zielgruppe) and target markets (zielmaerkte). With project_id only: read. Set zielgruppe 'kinder' or 'jugendliche' whenever th"},{"name":"lab_get_context","description":"Read the accumulated context/output for one pipeline module of a project (e.g. the IDEE, STORYBOARD or SHOTS stage). Needs project_id and module name."},{"name":"lab_get_job","description":"Get the status of a background job by job_id (status is queued|processing|done|failed). Poll this after starting a long-running generate/export. Returns the job"},{"name":"lab_search_catalog","description":"Search the FilmLab universe catalog of AI tools, news and companies. Query must be at least 2 characters. Returns up to 20 matches with a total count."},{"name":"lab_create_project","description":"Create a new FilmLab project. Returns the new project id. Optionally set a title."},{"name":"lab_run_module","description":"Run ONE pipeline module for a project (context is injected from upstream modules + crew agents). SYNCHRONOUS and LLM-heavy: light modules return in seconds; hea"},{"name":"lab_generate","description":"Generate an image on the production pipeline (fal.ai, quota-tracked, persisted to the project's gallery). Waits up to `wait_s` seconds (default 45) for the imag"},{"name":"lab_animate","description":"Animate a completed image into a clip with a video model. Pick the model from lab_list_models; check the price with get_cost or let the user confirm a card via "},{"name":"lab_animate_batch","description":"Animate MANY images into videos in ONE call (max 25 jobs). Prefer this over looping lab_animate: it validates every job BEFORE spending any quota, so an invalid"},{"name":"lab_propose","description":"Propose a generation for the user to confirm: validates the parameters against the catalog, computes the price, and shows a card (widget hosts) or returns the s"},{"name":"lab_run_proposal","description":"Run a proposal exactly as shown — same model, same parameters, same price. Called by the card's button, or by you after the user confirmed. Single use: the prop"},{"name":"lab_list_locations","description":"List location boards, newest first — START HERE to find a `location_id` for lab_generate / lab_animate. Each entry carries its `prompt_prefix_en`: that is the e"},{"name":"lab_get_location","description":"Get ONE location board in full — all descriptive fields plus its reference images and `prompt_prefix_en`. Use it to check what a board actually anchors before g"},{"name":"lab_list_project_locations","description":"Location boards bound to ONE project. Narrower and more correct than lab_list_locations when you already know the project: it cannot leak boards from a differen"},{"name":"lab_create_location","description":"Create a location board. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later anchors every image and clip sho"},{"name":"lab_generate_location_variants","description":"Generate reference images for a location board (costs quota). Without `variants` the backend picks its default set. The images are what makes a board usable as "},{"name":"lab_enrich_location_prefix","description":"Append context to a board's `prompt_prefix_en` (plain string concatenation server-side — no AI call, no quota). Idempotent: context already present in the prefi"},{"name":"lab_restyle_location","description":"Restyle an existing board towards a wish (costs quota) — same place, different look, e.g. 'the same flat, twenty years later'. Changes the board itself, so imag"},{"name":"lab_location_panorama","description":"Generate a 360° equirectangular HDRI panorama of a place (costs quota). Pass loc_id to persist it on that board, so the viewer finds it again; without loc_id it"},{"name":"lab_analyze_location_image","description":"Read a photo and extract location fields from it (Gemini Vision, costs quota). Returns the fields — it does NOT create a board; feed the result into lab_create_"},{"name":"lab_delete_location","description":"DELETE a location board permanently. There is no undo and no soft-archive — the row is removed. Images and clips that were generated with this `location_id` kee"},{"name":"lab_list_characters","description":"List the character sheets in the FilmLab cast register (id, name, age, gender, project_name, prompt_prefix_en). Call this BEFORE lab_generate whenever a person "},{"name":"lab_get_character","description":"Get ONE character sheet in full — every descriptive field plus the three that decide what you can do with it. `prompt_prefix_en` is the text block describing th"},{"name":"lab_create_character","description":"Create a character sheet in the cast register. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later describes "},{"name":"lab_generate_character_reference","description":"Generate the reference sheet for a character — six core views rendered from the sheet's `prompt_prefix_en`: detail (three-quarter close-up, the identity anchor)"},{"name":"lab_get_character_sheet","description":"The character sheet PREPARED FOR PROMPTING: base prefix, the state sheets by name, which reference views exist, and the ready-made sentence to paste into a lab_"},{"name":"lab_cast_gaps","description":"Find people who appear in a project's material (script / cast module) but have NO character sheet yet. Returns up to 6 `missing` entries, each with a name and a"},{"name":"lab_cast_autopopulate","description":"Create character sheets for the people found in a project's material — the writing counterpart to lab_cast_gaps. Creates at most 6 per call and binds each to th"},{"name":"lab_create_sequence","description":"Create a sequence (Stage 9 timeline) inside a project — START HERE to turn generated shots into something the continuity pass can read. The new sequence is EMPT"},{"name":"lab_list_sequences","description":"List a project's sequences, newest first. Use it to find a `seq_id` instead of creating a second sequence for the same cut."},{"name":"lab_get_sequence","description":"Get ONE sequence in full — timeline (the shots in order), audio_tracks, transitions, duration_seconds and render status. Check `timeline` here before starting a"},{"name":"lab_shots","description":"Read the SHOT layer of a sequence — which clips form one shot, which scene it plays in, who is in it, and what the continuity pass found. This is the layer abov"},{"name":"lab_shots_ableiten","description":"Derive the shot layer from what the clips already say about themselves — consecutive clips of the same scene become one shot, and a scene that returns later bec"},{"name":"lab_shots_setzen","description":"State the shot cut yourself: which clips form one shot, what it is called, which scene it plays in. This is the counterpart to lab_shots_ableiten — that one gro"},{"name":"lab_fassungen","description":"Use when the person asks about earlier states of a cut, wants to go back to a previous version, compare versions, name a version, or create a second cut (e.g. a"},{"name":"lab_add_clip","description":"Append a shot to a sequence's timeline. Call it once per shot, in cutting order — `start_time` is computed from the clips already there, so appending in order i"},{"name":"lab_timeline_apply","description":"Write a WHOLE cut into a sequence in one call — clips in order with their lengths, an optional dissolve between them, an optional bed underneath. This is the co"},{"name":"lab_continuity_check","description":"Start the continuity pass over a sequence — every shot is compared against its PREDECESSOR and, with check_references, against the character and location refere"},{"name":"lab_contact_sheet","description":"Build a contact sheet for a generated clip — N frames spread evenly over its runtime, tiled into ONE image — and show it. This is how a clip gets judged at all:"},{"name":"lab_bilder","description":"See a clip at EXACT seconds: up to 12 frames, in the order you list them, tiled into one image and shown. Use it to check what is on screen where you plan a cut"},{"name":"lab_capture","description":"See the CUT at exact seconds of the finished film: up to 12 frames, tiled into one image and shown. Each second is mapped like the export maps it — which clip i"},{"name":"lab_render_frames","description":"See the DELIVERED film: up to 12 frames from the finished export (lab_start_export → lab_get_export status done), tiled into one image and shown. This is the re"},{"name":"lab_feedback","description":"Tell the FilmLab team about a bug or a missing feature — it reaches the people who can fix it, the chat does not. Use art 'fehler' when a tool returned somethin"},{"name":"lab_wellenform","description":"Read the sound of a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key from lab_add_media) as numbers: peak level 0..1 per c"},{"name":"lab_wortzeiten","description":"Every spoken word with its start and end time, for a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key). Use it to cut paus"},{"name":"lab_review_asset","description":"Review generated assets: set verdict (accepted|rejected|pending) and/or selected. Pass ONE id, or `ids` for a bulk review — after a generation run there are usu"},{"name":"lab_auto_lauf","description":"Auto run with a hard spending cap: the person approves ONE run with an upper limit in credits; inside it you may generate without asking per item, but never abo"},{"name":"lab_verkettung","description":"Render several clips as CHAINS: within a scene one after another (continuity), across scenes in parallel (speed) — the plan follows scene_ref of each job in ord"},{"name":"lab_letzter_frame","description":"Extract the LAST frame of a finished clip as a new image (returns image_id, image_url, zu_dunkel). Use it as source_image_id to continue one unbroken take, or a"},{"name":"lab_abgleich","description":"Prompt check of ONE generated image or clip: does the result show what its prompt asked for? The backend first DESCRIBES the result without seeing the prompt, t"},{"name":"lab_review_queue","description":"Browse GENERATED rows (images or videos) — newest first, each with the INPUTS it ran on. Every row carries `inputs[]` (start/reference images, reference videos,"},{"name":"lab_batch_status","description":"Aggregated progress of a video batch started by lab_animate_batch. Returns {total, completed, failed, pending, done, items[]} — poll this ONCE per batch instead"},{"name":"lab_jobs_inflight","description":"Are any FilmLab generations running RIGHT NOW, across ALL projects? Use this before anything that restarts the backend (a deploy recreates the container and kil"},{"name":"lab_job_status","description":"Poll the status of an image or video generation started by lab_generate/lab_animate. There is no single-item status endpoint on the backend — this fetches the p"},{"name":"lab_auto_storyboard","description":"Auto-generate a storyboard from a script: an LLM splits the script into scenes, then one storyboard frame is generated per scene. COSTS CREDITS — every scene is"},{"name":"lab_export_profiles","description":"List the available export delivery profiles (web, social_vertical, social_youtube, streaming_hdr, cinema, master, alpha_prores4444, alpha_png_sequence) and qual"},{"name":"lab_start_export","description":"Start an ASYNC export render of a project sequence. Returns a job_id immediately (status 'queued') — does NOT block. Then poll lab_get_export with that job_id u"},{"name":"lab_prompt_transform","description":"Turn a loose idea into a production-ready image or video prompt — the same Dreamer engine the FilmLab web UI uses (modes: beautify, storyboard, polish, format, "},{"name":"lab_vfx","description":"Run a VFX operation on an image already in the project gallery — the same pipeline the Resolve bridge uses. inpaint (clean plate: what is inside the box disappe"},{"name":"lab_vfx_status","description":"Poll a VFX operation started with lab_vfx. status is pending|processing|done|failed; when done, result_url carries the finished image. Call repeatedly until don"},{"name":"lab_grade","description":"Apply a deterministic colour grade to an image already in the project gallery — no re-generation, no provider, no credits. The look is computed pixel-exact (exp"},{"name":"lab_grade_suggest","description":"Suggest a grade look for a project — read-only, no cost. With image_id, includes the image prompt; without it, uses only the colorist crew brief. Returns a reco"},{"name":"lab_grade_from_resolve","description":"Suggest a FilmLab grade look from a Resolve LUT name or path — read-only, no cost. First call resolve_node_graph_lesen on the local FilmLab bridge (filmlab_brue"},{"name":"lab_depth_map","description":"Create or read a depth map for a project video in FilmLab: use it for fog, depth of field, relighting or occlusion. Near is white, like Resolve's Depth Map. Fre"},{"name":"lab_dossier","description":"Build a dossier of a project's takes: one ZIP with an offline index.html (no external resources) plus the media files, named Project_SceneNN_YYYYMMDD-Tnn.ext. m"},{"name":"lab_get_dossier","description":"Poll a dossier job by job_id (from lab_dossier). status is queued|processing|done|failed. When done, result.archiv_url is a signed https link to the ZIP that lo"},{"name":"lab_get_export","description":"Poll an export render job by job_id (from lab_start_export). status is queued|processing|done|failed; when done, the result (output url) is included. Call repea"},{"name":"lab_list_exports","description":"List past export jobs for a project (each with job_id, status, profile). Returns up to 20 with a total count. Finished rows carry the same signed, login-free re"},{"name":"lab_add_media","description":"Bring your own video, audio or image into a project — not generated, yours. Two ways: `media_url` (a public http(s) address; the server fetches it, max 100 MB) "},{"name":"lab_herkunft","description":"Declare or list where a project's material comes from: 'eigen' (made by people) or 'ki' (AI-generated or AI-altered). Exports decide the EU AI Act Art. 50 discl"},{"name":"lab_list_assets","description":"List a project's media assets (image/video/audio) with their URLs. Optionally filter by asset_type. Returns up to 20 with a total count. Each row carries its ad"},{"name":"lab_generate_music","description":"Generate a MUSIC track for a project (Stable Audio via fal.ai) — the first step of the rhythm chain, and the only one that costs credits. ASYNCHRONOUS: the call"},{"name":"lab_sfx","description":"Generate or CLEAN UP a SOUND track other than music — sound effects, ambience/atmosphere, dialog, a voiceover, FOLEY scored to an existing clip, or the repair k"},{"name":"lab_list_audio","description":"List a project's generated audio rows, newest first — this is the POLL for lab_generate_music. Read two fields: `metadata.status` ('pending' | 'completed' | 'fa"},{"name":"lab_bind_audio","description":"Bind the project's generated audio to a sequence's tracks — ONE call that does both halves of the job, because doing only the first half silently produces a sil"},{"name":"lab_mix","description":"Set the sound mix of a sequence: per track `volume_db`, `pan`, `mute`, `solo` and `effects`. Every field you send is rendered — the backend rejects what it cann"},{"name":"lab_mix_render","description":"Render the sequence's mixdown, normalised to a loudness target: `broadcast` (EBU R128), `web` or `youtube`. With `auto_preset` it runs the AUTO-MIX instead: it "},{"name":"lab_mix_messen","description":"Measure the RENDERED mix: integrated loudness (LUFS), true peak (dBTP) and loudness range (LU) of the master, measured on the mixdown file itself. Per stem the "},{"name":"lab_grade_clip","description":"Set the colour grade of ONE clip in the edit (Murnau), or of the whole programme with `programm: true`. It is the same grade a colourist sets in Murnau's colour"},{"name":"lab_scopes","description":"Measure ONE clip of the edit as numbers instead of a picture: a frame is rendered through the clip's export path (input profile, grade LUT, secondary correction"},{"name":"lab_look_match","description":"Check the colour CONTINUITY of a scene in the edit (Murnau): every shot is compared with the scene's reference shot (the first, or `referenz_clip_id`) at the SA"},{"name":"lab_ton_durchlauf","description":"Generate SOUND EFFECTS for a whole sequence, shot by shot — Simon Meyer's pass: every shot is muted, padded with black frames up to the model's minimum length, "},{"name":"lab_beatgrid","description":"Measure the TEMPO of the sequence's bound music track and store the beat grid — opens the real file with ffmpeg and analyses it, no guessing and no provider, so"},{"name":"lab_apply_rhythm","description":"Compute the sequence's clip durations from the project's cutting preset and — when the tempo allows it — pull the cut points onto the measured beat grid. WRITES"},{"name":"lab_suggest_durations","description":"Ask what clip durations the project's cutting preset WOULD give a sequence — and change nothing (`angewendet: false`). Use it to see the consequence before lab_"},{"name":"lab_dub","description":"Dub a sequence into another language: either a ready audio track (en_audio_url — e.g. the one lab_dub_tts just produced) OR a cloned voice reading a line of tex"},{"name":"lab_dub_voices","description":"List the ElevenLabs TTS voices available for lab_dub_tts's `voice_id` — this is the EN-dub-track text-to-speech voice list, NOT a project's cloned voices (those"},{"name":"lab_dub_tts","description":"Generate the EN-dub audio track for a sequence via ElevenLabs TTS — SYNCHRONOUS, returns a ready audio_url immediately, no job_id and nothing to poll. Optionall"},{"name":"lab_voice_clone","description":"Clone a voice from real audio or video material into a project (fal.ai minimax voice-clone) — the source for lab_voice_tts and for lab_dub's voice_id+dub_text p"},{"name":"lab_voice_tts","description":"Speak text in a project's cloned voice (via lab_voice_clone) — SYNCHRONOUS, returns a ready audio_url, no job_id. The voice house is whichever one cloned this v"},{"name":"lab_list_voices","description":"List a project's cloned voices (lab_voice_clone results) — id, label, voice house, sample and preview URLs. This is where a `voice_id` for lab_voice_tts or lab_"}],"toolCount":111,"toolsHash":"a4b987243d04a0738350eaddc78c6edb75c8ec6e9d5d883dc8e3288dbcc585f0","serverName":"filmlab-mcp","capabilities":["resources","prompts","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T06:22:43.964Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":170,"error":null,"detail":{"tools":[{"name":"lab_list_projects","description":"List FilmLab projects (id, title, current pipeline stage). Call this first to find a project_id for the other tools. Shows up to 20 items; `total` counts your a"},{"name":"lab_wissen","description":"Use when the person asks a film-craft question: what a term means, which rule or convention applies, how something is usually done in camera, editing, sound or "},{"name":"lab_widerruf","description":"Record a correction in the FilmOS knowledge layer when the user contradicts something you asserted from it. Use this the moment a contradiction is stated — not "},{"name":"lab_playbook","description":"The rules of one working surface, generated from the code: what the surface is, what an agent can trigger itself, what exists but only by hand, and what does no"},{"name":"lab_list_models","description":"The model catalog: what every video or image model can do — resolutions, durations, aspect ratios, audio, reference limits, price per second or per image — grou"},{"name":"lab_regie_techniken","description":"Use when the person asks HOW to stage or shoot a feeling or effect (which angle, movement, framing or light makes a scene feel tense, tender, triumphant, uneasy"},{"name":"lab_whoami","description":"Who is connected: the FilmLab account (email, user id, name, tier, credits) and how this connection signed in (oauth, oauth_geraet, bridge_key, legacy service u"},{"name":"lab_get_state","description":"One call, the whole picture: account (tier, credits, reset), default models with price, jobs in flight, catalog freshness, project count. Pass project_id for th"},{"name":"lab_get_project","description":"Use when the person asks where a project stands: its current stage, what is finished, what comes next, or wants the project's state before continuing. Get a sin"},{"name":"lab_zielgruppe","description":"Read or set a project's audience (zielgruppe) and target markets (zielmaerkte). With project_id only: read. Set zielgruppe 'kinder' or 'jugendliche' whenever th"},{"name":"lab_get_context","description":"Read the accumulated context/output for one pipeline module of a project (e.g. the IDEE, STORYBOARD or SHOTS stage). Needs project_id and module name."},{"name":"lab_get_job","description":"Get the status of a background job by job_id (status is queued|processing|done|failed). Poll this after starting a long-running generate/export. Returns the job"},{"name":"lab_search_catalog","description":"Search the FilmLab universe catalog of AI tools, news and companies. Query must be at least 2 characters. Returns up to 20 matches with a total count."},{"name":"lab_create_project","description":"Create a new FilmLab project. Returns the new project id. Optionally set a title."},{"name":"lab_run_module","description":"Run ONE pipeline module for a project (context is injected from upstream modules + crew agents). SYNCHRONOUS and LLM-heavy: light modules return in seconds; hea"},{"name":"lab_generate","description":"Generate an image on the production pipeline (fal.ai, quota-tracked, persisted to the project's gallery). Waits up to `wait_s` seconds (default 45) for the imag"},{"name":"lab_animate","description":"Animate a completed image into a clip with a video model. Pick the model from lab_list_models; check the price with get_cost or let the user confirm a card via "},{"name":"lab_animate_batch","description":"Animate MANY images into videos in ONE call (max 25 jobs). Prefer this over looping lab_animate: it validates every job BEFORE spending any quota, so an invalid"},{"name":"lab_propose","description":"Propose a generation for the user to confirm: validates the parameters against the catalog, computes the price, and shows a card (widget hosts) or returns the s"},{"name":"lab_run_proposal","description":"Run a proposal exactly as shown — same model, same parameters, same price. Called by the card's button, or by you after the user confirmed. Single use: the prop"},{"name":"lab_list_locations","description":"List location boards, newest first — START HERE to find a `location_id` for lab_generate / lab_animate. Each entry carries its `prompt_prefix_en`: that is the e"},{"name":"lab_get_location","description":"Get ONE location board in full — all descriptive fields plus its reference images and `prompt_prefix_en`. Use it to check what a board actually anchors before g"},{"name":"lab_list_project_locations","description":"Location boards bound to ONE project. Narrower and more correct than lab_list_locations when you already know the project: it cannot leak boards from a differen"},{"name":"lab_create_location","description":"Create a location board. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later anchors every image and clip sho"},{"name":"lab_generate_location_variants","description":"Generate reference images for a location board (costs quota). Without `variants` the backend picks its default set. The images are what makes a board usable as "},{"name":"lab_enrich_location_prefix","description":"Append context to a board's `prompt_prefix_en` (plain string concatenation server-side — no AI call, no quota). Idempotent: context already present in the prefi"},{"name":"lab_restyle_location","description":"Restyle an existing board towards a wish (costs quota) — same place, different look, e.g. 'the same flat, twenty years later'. Changes the board itself, so imag"},{"name":"lab_location_panorama","description":"Generate a 360° equirectangular HDRI panorama of a place (costs quota). Pass loc_id to persist it on that board, so the viewer finds it again; without loc_id it"},{"name":"lab_analyze_location_image","description":"Read a photo and extract location fields from it (Gemini Vision, costs quota). Returns the fields — it does NOT create a board; feed the result into lab_create_"},{"name":"lab_delete_location","description":"DELETE a location board permanently. There is no undo and no soft-archive — the row is removed. Images and clips that were generated with this `location_id` kee"},{"name":"lab_list_characters","description":"List the character sheets in the FilmLab cast register (id, name, age, gender, project_name, prompt_prefix_en). Call this BEFORE lab_generate whenever a person "},{"name":"lab_get_character","description":"Get ONE character sheet in full — every descriptive field plus the three that decide what you can do with it. `prompt_prefix_en` is the text block describing th"},{"name":"lab_create_character","description":"Create a character sheet in the cast register. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later describes "},{"name":"lab_generate_character_reference","description":"Generate the reference sheet for a character — six core views rendered from the sheet's `prompt_prefix_en`: detail (three-quarter close-up, the identity anchor)"},{"name":"lab_get_character_sheet","description":"The character sheet PREPARED FOR PROMPTING: base prefix, the state sheets by name, which reference views exist, and the ready-made sentence to paste into a lab_"},{"name":"lab_cast_gaps","description":"Find people who appear in a project's material (script / cast module) but have NO character sheet yet. Returns up to 6 `missing` entries, each with a name and a"},{"name":"lab_cast_autopopulate","description":"Create character sheets for the people found in a project's material — the writing counterpart to lab_cast_gaps. Creates at most 6 per call and binds each to th"},{"name":"lab_create_sequence","description":"Create a sequence (Stage 9 timeline) inside a project — START HERE to turn generated shots into something the continuity pass can read. The new sequence is EMPT"},{"name":"lab_list_sequences","description":"List a project's sequences, newest first. Use it to find a `seq_id` instead of creating a second sequence for the same cut."},{"name":"lab_get_sequence","description":"Get ONE sequence in full — timeline (the shots in order), audio_tracks, transitions, duration_seconds and render status. Check `timeline` here before starting a"},{"name":"lab_shots","description":"Read the SHOT layer of a sequence — which clips form one shot, which scene it plays in, who is in it, and what the continuity pass found. This is the layer abov"},{"name":"lab_shots_ableiten","description":"Derive the shot layer from what the clips already say about themselves — consecutive clips of the same scene become one shot, and a scene that returns later bec"},{"name":"lab_shots_setzen","description":"State the shot cut yourself: which clips form one shot, what it is called, which scene it plays in. This is the counterpart to lab_shots_ableiten — that one gro"},{"name":"lab_fassungen","description":"Use when the person asks about earlier states of a cut, wants to go back to a previous version, compare versions, name a version, or create a second cut (e.g. a"},{"name":"lab_add_clip","description":"Append a shot to a sequence's timeline. Call it once per shot, in cutting order — `start_time` is computed from the clips already there, so appending in order i"},{"name":"lab_timeline_apply","description":"Write a WHOLE cut into a sequence in one call — clips in order with their lengths, an optional dissolve between them, an optional bed underneath. This is the co"},{"name":"lab_continuity_check","description":"Start the continuity pass over a sequence — every shot is compared against its PREDECESSOR and, with check_references, against the character and location refere"},{"name":"lab_contact_sheet","description":"Build a contact sheet for a generated clip — N frames spread evenly over its runtime, tiled into ONE image — and show it. This is how a clip gets judged at all:"},{"name":"lab_bilder","description":"See a clip at EXACT seconds: up to 12 frames, in the order you list them, tiled into one image and shown. Use it to check what is on screen where you plan a cut"},{"name":"lab_capture","description":"See the CUT at exact seconds of the finished film: up to 12 frames, tiled into one image and shown. Each second is mapped like the export maps it — which clip i"},{"name":"lab_render_frames","description":"See the DELIVERED film: up to 12 frames from the finished export (lab_start_export → lab_get_export status done), tiled into one image and shown. This is the re"},{"name":"lab_feedback","description":"Tell the FilmLab team about a bug or a missing feature — it reaches the people who can fix it, the chat does not. Use art 'fehler' when a tool returned somethin"},{"name":"lab_wellenform","description":"Read the sound of a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key from lab_add_media) as numbers: peak level 0..1 per c"},{"name":"lab_wortzeiten","description":"Every spoken word with its start and end time, for a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key). Use it to cut paus"},{"name":"lab_review_asset","description":"Review generated assets: set verdict (accepted|rejected|pending) and/or selected. Pass ONE id, or `ids` for a bulk review — after a generation run there are usu"},{"name":"lab_auto_lauf","description":"Auto run with a hard spending cap: the person approves ONE run with an upper limit in credits; inside it you may generate without asking per item, but never abo"},{"name":"lab_verkettung","description":"Render several clips as CHAINS: within a scene one after another (continuity), across scenes in parallel (speed) — the plan follows scene_ref of each job in ord"},{"name":"lab_letzter_frame","description":"Extract the LAST frame of a finished clip as a new image (returns image_id, image_url, zu_dunkel). Use it as source_image_id to continue one unbroken take, or a"},{"name":"lab_abgleich","description":"Prompt check of ONE generated image or clip: does the result show what its prompt asked for? The backend first DESCRIBES the result without seeing the prompt, t"},{"name":"lab_review_queue","description":"Browse GENERATED rows (images or videos) — newest first, each with the INPUTS it ran on. Every row carries `inputs[]` (start/reference images, reference videos,"},{"name":"lab_batch_status","description":"Aggregated progress of a video batch started by lab_animate_batch. Returns {total, completed, failed, pending, done, items[]} — poll this ONCE per batch instead"},{"name":"lab_jobs_inflight","description":"Are any FilmLab generations running RIGHT NOW, across ALL projects? Use this before anything that restarts the backend (a deploy recreates the container and kil"},{"name":"lab_job_status","description":"Poll the status of an image or video generation started by lab_generate/lab_animate. There is no single-item status endpoint on the backend — this fetches the p"},{"name":"lab_auto_storyboard","description":"Auto-generate a storyboard from a script: an LLM splits the script into scenes, then one storyboard frame is generated per scene. COSTS CREDITS — every scene is"},{"name":"lab_export_profiles","description":"List the available export delivery profiles (web, social_vertical, social_youtube, streaming_hdr, cinema, master, alpha_prores4444, alpha_png_sequence) and qual"},{"name":"lab_start_export","description":"Start an ASYNC export render of a project sequence. Returns a job_id immediately (status 'queued') — does NOT block. Then poll lab_get_export with that job_id u"},{"name":"lab_prompt_transform","description":"Turn a loose idea into a production-ready image or video prompt — the same Dreamer engine the FilmLab web UI uses (modes: beautify, storyboard, polish, format, "},{"name":"lab_vfx","description":"Run a VFX operation on an image already in the project gallery — the same pipeline the Resolve bridge uses. inpaint (clean plate: what is inside the box disappe"},{"name":"lab_vfx_status","description":"Poll a VFX operation started with lab_vfx. status is pending|processing|done|failed; when done, result_url carries the finished image. Call repeatedly until don"},{"name":"lab_grade","description":"Apply a deterministic colour grade to an image already in the project gallery — no re-generation, no provider, no credits. The look is computed pixel-exact (exp"},{"name":"lab_grade_suggest","description":"Suggest a grade look for a project — read-only, no cost. With image_id, includes the image prompt; without it, uses only the colorist crew brief. Returns a reco"},{"name":"lab_grade_from_resolve","description":"Suggest a FilmLab grade look from a Resolve LUT name or path — read-only, no cost. First call resolve_node_graph_lesen on the local FilmLab bridge (filmlab_brue"},{"name":"lab_depth_map","description":"Create or read a depth map for a project video in FilmLab: use it for fog, depth of field, relighting or occlusion. Near is white, like Resolve's Depth Map. Fre"},{"name":"lab_dossier","description":"Build a dossier of a project's takes: one ZIP with an offline index.html (no external resources) plus the media files, named Project_SceneNN_YYYYMMDD-Tnn.ext. m"},{"name":"lab_get_dossier","description":"Poll a dossier job by job_id (from lab_dossier). status is queued|processing|done|failed. When done, result.archiv_url is a signed https link to the ZIP that lo"},{"name":"lab_get_export","description":"Poll an export render job by job_id (from lab_start_export). status is queued|processing|done|failed; when done, the result (output url) is included. Call repea"},{"name":"lab_list_exports","description":"List past export jobs for a project (each with job_id, status, profile). Returns up to 20 with a total count. Finished rows carry the same signed, login-free re"},{"name":"lab_add_media","description":"Bring your own video, audio or image into a project — not generated, yours. Two ways: `media_url` (a public http(s) address; the server fetches it, max 100 MB) "},{"name":"lab_herkunft","description":"Declare or list where a project's material comes from: 'eigen' (made by people) or 'ki' (AI-generated or AI-altered). Exports decide the EU AI Act Art. 50 discl"},{"name":"lab_list_assets","description":"List a project's media assets (image/video/audio) with their URLs. Optionally filter by asset_type. Returns up to 20 with a total count. Each row carries its ad"},{"name":"lab_generate_music","description":"Generate a MUSIC track for a project (Stable Audio via fal.ai) — the first step of the rhythm chain, and the only one that costs credits. ASYNCHRONOUS: the call"},{"name":"lab_sfx","description":"Generate or CLEAN UP a SOUND track other than music — sound effects, ambience/atmosphere, dialog, a voiceover, FOLEY scored to an existing clip, or the repair k"},{"name":"lab_list_audio","description":"List a project's generated audio rows, newest first — this is the POLL for lab_generate_music. Read two fields: `metadata.status` ('pending' | 'completed' | 'fa"},{"name":"lab_bind_audio","description":"Bind the project's generated audio to a sequence's tracks — ONE call that does both halves of the job, because doing only the first half silently produces a sil"},{"name":"lab_mix","description":"Set the sound mix of a sequence: per track `volume_db`, `pan`, `mute`, `solo` and `effects`. Every field you send is rendered — the backend rejects what it cann"},{"name":"lab_mix_render","description":"Render the sequence's mixdown, normalised to a loudness target: `broadcast` (EBU R128), `web` or `youtube`. With `auto_preset` it runs the AUTO-MIX instead: it "},{"name":"lab_mix_messen","description":"Measure the RENDERED mix: integrated loudness (LUFS), true peak (dBTP) and loudness range (LU) of the master, measured on the mixdown file itself. Per stem the "},{"name":"lab_grade_clip","description":"Set the colour grade of ONE clip in the edit (Murnau), or of the whole programme with `programm: true`. It is the same grade a colourist sets in Murnau's colour"},{"name":"lab_scopes","description":"Measure ONE clip of the edit as numbers instead of a picture: a frame is rendered through the clip's export path (input profile, grade LUT, secondary correction"},{"name":"lab_look_match","description":"Check the colour CONTINUITY of a scene in the edit (Murnau): every shot is compared with the scene's reference shot (the first, or `referenz_clip_id`) at the SA"},{"name":"lab_ton_durchlauf","description":"Generate SOUND EFFECTS for a whole sequence, shot by shot — Simon Meyer's pass: every shot is muted, padded with black frames up to the model's minimum length, "},{"name":"lab_beatgrid","description":"Measure the TEMPO of the sequence's bound music track and store the beat grid — opens the real file with ffmpeg and analyses it, no guessing and no provider, so"},{"name":"lab_apply_rhythm","description":"Compute the sequence's clip durations from the project's cutting preset and — when the tempo allows it — pull the cut points onto the measured beat grid. WRITES"},{"name":"lab_suggest_durations","description":"Ask what clip durations the project's cutting preset WOULD give a sequence — and change nothing (`angewendet: false`). Use it to see the consequence before lab_"},{"name":"lab_dub","description":"Dub a sequence into another language: either a ready audio track (en_audio_url — e.g. the one lab_dub_tts just produced) OR a cloned voice reading a line of tex"},{"name":"lab_dub_voices","description":"List the ElevenLabs TTS voices available for lab_dub_tts's `voice_id` — this is the EN-dub-track text-to-speech voice list, NOT a project's cloned voices (those"},{"name":"lab_dub_tts","description":"Generate the EN-dub audio track for a sequence via ElevenLabs TTS — SYNCHRONOUS, returns a ready audio_url immediately, no job_id and nothing to poll. Optionall"},{"name":"lab_voice_clone","description":"Clone a voice from real audio or video material into a project (fal.ai minimax voice-clone) — the source for lab_voice_tts and for lab_dub's voice_id+dub_text p"},{"name":"lab_voice_tts","description":"Speak text in a project's cloned voice (via lab_voice_clone) — SYNCHRONOUS, returns a ready audio_url, no job_id. The voice house is whichever one cloned this v"},{"name":"lab_list_voices","description":"List a project's cloned voices (lab_voice_clone results) — id, label, voice house, sample and preview URLs. This is where a `voice_id` for lab_voice_tts or lab_"}],"toolCount":111,"toolsHash":"a4b987243d04a0738350eaddc78c6edb75c8ec6e9d5d883dc8e3288dbcc585f0","serverName":"filmlab-mcp","capabilities":["resources","prompts","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T00:26:25.439Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":291,"error":null,"detail":{"tools":[{"name":"lab_list_projects","description":"List FilmLab projects (id, title, current pipeline stage). Call this first to find a project_id for the other tools. Shows up to 20 items; `total` counts your a"},{"name":"lab_wissen","description":"Use when the person asks a film-craft question: what a term means, which rule or convention applies, how something is usually done in camera, editing, sound or "},{"name":"lab_widerruf","description":"Record a correction in the FilmOS knowledge layer when the user contradicts something you asserted from it. Use this the moment a contradiction is stated — not "},{"name":"lab_playbook","description":"The rules of one working surface, generated from the code: what the surface is, what an agent can trigger itself, what exists but only by hand, and what does no"},{"name":"lab_list_models","description":"The model catalog: what every video or image model can do — resolutions, durations, aspect ratios, audio, reference limits, price per second or per image — grou"},{"name":"lab_regie_techniken","description":"Use when the person asks HOW to stage or shoot a feeling or effect (which angle, movement, framing or light makes a scene feel tense, tender, triumphant, uneasy"},{"name":"lab_whoami","description":"Who is connected: the FilmLab account (email, user id, name, tier, credits) and how this connection signed in (oauth, oauth_geraet, bridge_key, legacy service u"},{"name":"lab_get_state","description":"One call, the whole picture: account (tier, credits, reset), default models with price, jobs in flight, catalog freshness, project count. Pass project_id for th"},{"name":"lab_get_project","description":"Use when the person asks where a project stands: its current stage, what is finished, what comes next, or wants the project's state before continuing. Get a sin"},{"name":"lab_zielgruppe","description":"Read or set a project's audience (zielgruppe) and target markets (zielmaerkte). With project_id only: read. Set zielgruppe 'kinder' or 'jugendliche' whenever th"},{"name":"lab_get_context","description":"Read the accumulated context/output for one pipeline module of a project (e.g. the IDEE, STORYBOARD or SHOTS stage). Needs project_id and module name."},{"name":"lab_get_job","description":"Get the status of a background job by job_id (status is queued|processing|done|failed). Poll this after starting a long-running generate/export. Returns the job"},{"name":"lab_search_catalog","description":"Search the FilmLab universe catalog of AI tools, news and companies. Query must be at least 2 characters. Returns up to 20 matches with a total count."},{"name":"lab_create_project","description":"Create a new FilmLab project. Returns the new project id. Optionally set a title."},{"name":"lab_run_module","description":"Run ONE pipeline module for a project (context is injected from upstream modules + crew agents). SYNCHRONOUS and LLM-heavy: light modules return in seconds; hea"},{"name":"lab_generate","description":"Generate an image on the production pipeline (fal.ai, quota-tracked, persisted to the project's gallery). Waits up to `wait_s` seconds (default 45) for the imag"},{"name":"lab_animate","description":"Animate a completed image into a clip with a video model. Pick the model from lab_list_models; check the price with get_cost or let the user confirm a card via "},{"name":"lab_animate_batch","description":"Animate MANY images into videos in ONE call (max 25 jobs). Prefer this over looping lab_animate: it validates every job BEFORE spending any quota, so an invalid"},{"name":"lab_propose","description":"Propose a generation for the user to confirm: validates the parameters against the catalog, computes the price, and shows a card (widget hosts) or returns the s"},{"name":"lab_run_proposal","description":"Run a proposal exactly as shown — same model, same parameters, same price. Called by the card's button, or by you after the user confirmed. Single use: the prop"},{"name":"lab_list_locations","description":"List location boards, newest first — START HERE to find a `location_id` for lab_generate / lab_animate. Each entry carries its `prompt_prefix_en`: that is the e"},{"name":"lab_get_location","description":"Get ONE location board in full — all descriptive fields plus its reference images and `prompt_prefix_en`. Use it to check what a board actually anchors before g"},{"name":"lab_list_project_locations","description":"Location boards bound to ONE project. Narrower and more correct than lab_list_locations when you already know the project: it cannot leak boards from a differen"},{"name":"lab_create_location","description":"Create a location board. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later anchors every image and clip sho"},{"name":"lab_generate_location_variants","description":"Generate reference images for a location board (costs quota). Without `variants` the backend picks its default set. The images are what makes a board usable as "},{"name":"lab_enrich_location_prefix","description":"Append context to a board's `prompt_prefix_en` (plain string concatenation server-side — no AI call, no quota). Idempotent: context already present in the prefi"},{"name":"lab_restyle_location","description":"Restyle an existing board towards a wish (costs quota) — same place, different look, e.g. 'the same flat, twenty years later'. Changes the board itself, so imag"},{"name":"lab_location_panorama","description":"Generate a 360° equirectangular HDRI panorama of a place (costs quota). Pass loc_id to persist it on that board, so the viewer finds it again; without loc_id it"},{"name":"lab_analyze_location_image","description":"Read a photo and extract location fields from it (Gemini Vision, costs quota). Returns the fields — it does NOT create a board; feed the result into lab_create_"},{"name":"lab_delete_location","description":"DELETE a location board permanently. There is no undo and no soft-archive — the row is removed. Images and clips that were generated with this `location_id` kee"},{"name":"lab_list_characters","description":"List the character sheets in the FilmLab cast register (id, name, age, gender, project_name, prompt_prefix_en). Call this BEFORE lab_generate whenever a person "},{"name":"lab_get_character","description":"Get ONE character sheet in full — every descriptive field plus the three that decide what you can do with it. `prompt_prefix_en` is the text block describing th"},{"name":"lab_create_character","description":"Create a character sheet in the cast register. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later describes "},{"name":"lab_generate_character_reference","description":"Generate the reference sheet for a character — six core views rendered from the sheet's `prompt_prefix_en`: detail (three-quarter close-up, the identity anchor)"},{"name":"lab_get_character_sheet","description":"The character sheet PREPARED FOR PROMPTING: base prefix, the state sheets by name, which reference views exist, and the ready-made sentence to paste into a lab_"},{"name":"lab_cast_gaps","description":"Find people who appear in a project's material (script / cast module) but have NO character sheet yet. Returns up to 6 `missing` entries, each with a name and a"},{"name":"lab_cast_autopopulate","description":"Create character sheets for the people found in a project's material — the writing counterpart to lab_cast_gaps. Creates at most 6 per call and binds each to th"},{"name":"lab_create_sequence","description":"Create a sequence (Stage 9 timeline) inside a project — START HERE to turn generated shots into something the continuity pass can read. The new sequence is EMPT"},{"name":"lab_list_sequences","description":"List a project's sequences, newest first. Use it to find a `seq_id` instead of creating a second sequence for the same cut."},{"name":"lab_get_sequence","description":"Get ONE sequence in full — timeline (the shots in order), audio_tracks, transitions, duration_seconds and render status. Check `timeline` here before starting a"},{"name":"lab_shots","description":"Read the SHOT layer of a sequence — which clips form one shot, which scene it plays in, who is in it, and what the continuity pass found. This is the layer abov"},{"name":"lab_shots_ableiten","description":"Derive the shot layer from what the clips already say about themselves — consecutive clips of the same scene become one shot, and a scene that returns later bec"},{"name":"lab_shots_setzen","description":"State the shot cut yourself: which clips form one shot, what it is called, which scene it plays in. This is the counterpart to lab_shots_ableiten — that one gro"},{"name":"lab_fassungen","description":"Use when the person asks about earlier states of a cut, wants to go back to a previous version, compare versions, name a version, or create a second cut (e.g. a"},{"name":"lab_add_clip","description":"Append a shot to a sequence's timeline. Call it once per shot, in cutting order — `start_time` is computed from the clips already there, so appending in order i"},{"name":"lab_timeline_apply","description":"Write a WHOLE cut into a sequence in one call — clips in order with their lengths, an optional dissolve between them, an optional bed underneath. This is the co"},{"name":"lab_continuity_check","description":"Start the continuity pass over a sequence — every shot is compared against its PREDECESSOR and, with check_references, against the character and location refere"},{"name":"lab_contact_sheet","description":"Build a contact sheet for a generated clip — N frames spread evenly over its runtime, tiled into ONE image — and show it. This is how a clip gets judged at all:"},{"name":"lab_bilder","description":"See a clip at EXACT seconds: up to 12 frames, in the order you list them, tiled into one image and shown. Use it to check what is on screen where you plan a cut"},{"name":"lab_capture","description":"See the CUT at exact seconds of the finished film: up to 12 frames, tiled into one image and shown. Each second is mapped like the export maps it — which clip i"},{"name":"lab_render_frames","description":"See the DELIVERED film: up to 12 frames from the finished export (lab_start_export → lab_get_export status done), tiled into one image and shown. This is the re"},{"name":"lab_feedback","description":"Tell the FilmLab team about a bug or a missing feature — it reaches the people who can fix it, the chat does not. Use art 'fehler' when a tool returned somethin"},{"name":"lab_wellenform","description":"Read the sound of a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key from lab_add_media) as numbers: peak level 0..1 per c"},{"name":"lab_wortzeiten","description":"Every spoken word with its start and end time, for a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key). Use it to cut paus"},{"name":"lab_review_asset","description":"Review generated assets: set verdict (accepted|rejected|pending) and/or selected. Pass ONE id, or `ids` for a bulk review — after a generation run there are usu"},{"name":"lab_auto_lauf","description":"Auto run with a hard spending cap: the person approves ONE run with an upper limit in credits; inside it you may generate without asking per item, but never abo"},{"name":"lab_verkettung","description":"Render several clips as CHAINS: within a scene one after another (continuity), across scenes in parallel (speed) — the plan follows scene_ref of each job in ord"},{"name":"lab_letzter_frame","description":"Extract the LAST frame of a finished clip as a new image (returns image_id, image_url, zu_dunkel). Use it as source_image_id to continue one unbroken take, or a"},{"name":"lab_abgleich","description":"Prompt check of ONE generated image or clip: does the result show what its prompt asked for? The backend first DESCRIBES the result without seeing the prompt, t"},{"name":"lab_review_queue","description":"Browse GENERATED rows (images or videos) — newest first, each with the INPUTS it ran on. Every row carries `inputs[]` (start/reference images, reference videos,"},{"name":"lab_batch_status","description":"Aggregated progress of a video batch started by lab_animate_batch. Returns {total, completed, failed, pending, done, items[]} — poll this ONCE per batch instead"},{"name":"lab_jobs_inflight","description":"Are any FilmLab generations running RIGHT NOW, across ALL projects? Use this before anything that restarts the backend (a deploy recreates the container and kil"},{"name":"lab_job_status","description":"Poll the status of an image or video generation started by lab_generate/lab_animate. There is no single-item status endpoint on the backend — this fetches the p"},{"name":"lab_auto_storyboard","description":"Auto-generate a storyboard from a script: an LLM splits the script into scenes, then one storyboard frame is generated per scene. COSTS CREDITS — every scene is"},{"name":"lab_export_profiles","description":"List the available export delivery profiles (web, social_vertical, social_youtube, streaming_hdr, cinema, master, alpha_prores4444, alpha_png_sequence) and qual"},{"name":"lab_start_export","description":"Start an ASYNC export render of a project sequence. Returns a job_id immediately (status 'queued') — does NOT block. Then poll lab_get_export with that job_id u"},{"name":"lab_prompt_transform","description":"Turn a loose idea into a production-ready image or video prompt — the same Dreamer engine the FilmLab web UI uses (modes: beautify, storyboard, polish, format, "},{"name":"lab_vfx","description":"Run a VFX operation on an image already in the project gallery — the same pipeline the Resolve bridge uses. inpaint (clean plate: what is inside the box disappe"},{"name":"lab_vfx_status","description":"Poll a VFX operation started with lab_vfx. status is pending|processing|done|failed; when done, result_url carries the finished image. Call repeatedly until don"},{"name":"lab_grade","description":"Apply a deterministic colour grade to an image already in the project gallery — no re-generation, no provider, no credits. The look is computed pixel-exact (exp"},{"name":"lab_grade_suggest","description":"Suggest a grade look for a project — read-only, no cost. With image_id, includes the image prompt; without it, uses only the colorist crew brief. Returns a reco"},{"name":"lab_grade_from_resolve","description":"Suggest a FilmLab grade look from a Resolve LUT name or path — read-only, no cost. First call resolve_node_graph_lesen on the local FilmLab bridge (filmlab_brue"},{"name":"lab_depth_map","description":"Create or read a depth map for a project video in FilmLab: use it for fog, depth of field, relighting or occlusion. Near is white, like Resolve's Depth Map. Fre"},{"name":"lab_dossier","description":"Build a dossier of a project's takes: one ZIP with an offline index.html (no external resources) plus the media files, named Project_SceneNN_YYYYMMDD-Tnn.ext. m"},{"name":"lab_get_dossier","description":"Poll a dossier job by job_id (from lab_dossier). status is queued|processing|done|failed. When done, result.archiv_url is a signed https link to the ZIP that lo"},{"name":"lab_get_export","description":"Poll an export render job by job_id (from lab_start_export). status is queued|processing|done|failed; when done, the result (output url) is included. Call repea"},{"name":"lab_list_exports","description":"List past export jobs for a project (each with job_id, status, profile). Returns up to 20 with a total count. Finished rows carry the same signed, login-free re"},{"name":"lab_add_media","description":"Bring your own video, audio or image into a project — not generated, yours. Two ways: `media_url` (a public http(s) address; the server fetches it, max 100 MB) "},{"name":"lab_herkunft","description":"Declare or list where a project's material comes from: 'eigen' (made by people) or 'ki' (AI-generated or AI-altered). Exports decide the EU AI Act Art. 50 discl"},{"name":"lab_list_assets","description":"List a project's media assets (image/video/audio) with their URLs. Optionally filter by asset_type. Returns up to 20 with a total count. Each row carries its ad"},{"name":"lab_generate_music","description":"Generate a MUSIC track for a project (Stable Audio via fal.ai) — the first step of the rhythm chain, and the only one that costs credits. ASYNCHRONOUS: the call"},{"name":"lab_sfx","description":"Generate or CLEAN UP a SOUND track other than music — sound effects, ambience/atmosphere, dialog, a voiceover, FOLEY scored to an existing clip, or the repair k"},{"name":"lab_list_audio","description":"List a project's generated audio rows, newest first — this is the POLL for lab_generate_music. Read two fields: `metadata.status` ('pending' | 'completed' | 'fa"},{"name":"lab_bind_audio","description":"Bind the project's generated audio to a sequence's tracks — ONE call that does both halves of the job, because doing only the first half silently produces a sil"},{"name":"lab_mix","description":"Set the sound mix of a sequence: per track `volume_db`, `pan`, `mute`, `solo` and `effects`. Every field you send is rendered — the backend rejects what it cann"},{"name":"lab_mix_render","description":"Render the sequence's mixdown, normalised to a loudness target: `broadcast` (EBU R128), `web` or `youtube`. With `auto_preset` it runs the AUTO-MIX instead: it "},{"name":"lab_mix_messen","description":"Measure the RENDERED mix: integrated loudness (LUFS), true peak (dBTP) and loudness range (LU) of the master, measured on the mixdown file itself. Per stem the "},{"name":"lab_grade_clip","description":"Set the colour grade of ONE clip in the edit (Murnau), or of the whole programme with `programm: true`. It is the same grade a colourist sets in Murnau's colour"},{"name":"lab_scopes","description":"Measure ONE clip of the edit as numbers instead of a picture: a frame is rendered through the clip's export path (input profile, grade LUT, secondary correction"},{"name":"lab_look_match","description":"Check the colour CONTINUITY of a scene in the edit (Murnau): every shot is compared with the scene's reference shot (the first, or `referenz_clip_id`) at the SA"},{"name":"lab_ton_durchlauf","description":"Generate SOUND EFFECTS for a whole sequence, shot by shot — Simon Meyer's pass: every shot is muted, padded with black frames up to the model's minimum length, "},{"name":"lab_beatgrid","description":"Measure the TEMPO of the sequence's bound music track and store the beat grid — opens the real file with ffmpeg and analyses it, no guessing and no provider, so"},{"name":"lab_apply_rhythm","description":"Compute the sequence's clip durations from the project's cutting preset and — when the tempo allows it — pull the cut points onto the measured beat grid. WRITES"},{"name":"lab_suggest_durations","description":"Ask what clip durations the project's cutting preset WOULD give a sequence — and change nothing (`angewendet: false`). Use it to see the consequence before lab_"},{"name":"lab_dub","description":"Dub a sequence into another language: either a ready audio track (en_audio_url — e.g. the one lab_dub_tts just produced) OR a cloned voice reading a line of tex"},{"name":"lab_dub_voices","description":"List the ElevenLabs TTS voices available for lab_dub_tts's `voice_id` — this is the EN-dub-track text-to-speech voice list, NOT a project's cloned voices (those"},{"name":"lab_dub_tts","description":"Generate the EN-dub audio track for a sequence via ElevenLabs TTS — SYNCHRONOUS, returns a ready audio_url immediately, no job_id and nothing to poll. Optionall"},{"name":"lab_voice_clone","description":"Clone a voice from real audio or video material into a project (fal.ai minimax voice-clone) — the source for lab_voice_tts and for lab_dub's voice_id+dub_text p"},{"name":"lab_voice_tts","description":"Speak text in a project's cloned voice (via lab_voice_clone) — SYNCHRONOUS, returns a ready audio_url, no job_id. The voice house is whichever one cloned this v"},{"name":"lab_list_voices","description":"List a project's cloned voices (lab_voice_clone results) — id, label, voice house, sample and preview URLs. This is where a `voice_id` for lab_voice_tts or lab_"}],"toolCount":111,"toolsHash":"a4b987243d04a0738350eaddc78c6edb75c8ec6e9d5d883dc8e3288dbcc585f0","serverName":"filmlab-mcp","capabilities":["resources","prompts","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T18:28:14.317Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":289,"error":null,"detail":{"tools":[{"name":"lab_list_projects","description":"List FilmLab projects (id, title, current pipeline stage). Call this first to find a project_id for the other tools. Shows up to 20 items; `total` counts your a"},{"name":"lab_wissen","description":"Ask the FilmOS knowledge layer — measured craft knowledge from vetted sources, with the KNOWN CORRECTIONS first: documented false assumptions plus what is actua"},{"name":"lab_widerruf","description":"Record a correction in the FilmOS knowledge layer when the user contradicts something you asserted from it. Use this the moment a contradiction is stated — not "},{"name":"lab_playbook","description":"The rules of one working surface, generated from the code: what the surface is, what an agent can trigger itself, what exists but only by hand, and what does no"},{"name":"lab_list_models","description":"The model catalog: what every video or image model can do — resolutions, durations, aspect ratios, audio, reference limits, price per second or per image — grou"},{"name":"lab_regie_techniken","description":"Directing techniques: camera angle, framing, composition, movement and lighting, each with the emotional effect it creates (wirkung), when to use it (zweck_de),"},{"name":"lab_whoami","description":"Who is connected: the FilmLab account (email, user id, name, tier, credits) and how this connection signed in (oauth, oauth_geraet, bridge_key, legacy service u"},{"name":"lab_get_state","description":"One call, the whole picture: account (tier, credits, reset), default models with price, jobs in flight, catalog freshness, project count. Pass project_id for th"},{"name":"lab_get_project","description":"Get a single FilmLab project with its full stage state. Needs the project_id (from lab_list_projects)."},{"name":"lab_zielgruppe","description":"Read or set a project's audience (zielgruppe) and target markets (zielmaerkte). With project_id only: read. Set zielgruppe 'kinder' or 'jugendliche' whenever th"},{"name":"lab_get_context","description":"Read the accumulated context/output for one pipeline module of a project (e.g. the IDEE, STORYBOARD or SHOTS stage). Needs project_id and module name."},{"name":"lab_get_job","description":"Get the status of a background job by job_id (status is queued|processing|done|failed). Poll this after starting a long-running generate/export. Returns the job"},{"name":"lab_search_catalog","description":"Search the FilmLab universe catalog of AI tools, news and companies. Query must be at least 2 characters. Returns up to 20 matches with a total count."},{"name":"lab_create_project","description":"Create a new FilmLab project. Returns the new project id. Optionally set a title."},{"name":"lab_run_module","description":"Run ONE pipeline module for a project (context is injected from upstream modules + crew agents). SYNCHRONOUS and LLM-heavy: light modules return in seconds; hea"},{"name":"lab_generate","description":"Generate an image on the production pipeline (fal.ai, quota-tracked, persisted to the project's gallery). Waits up to `wait_s` seconds (default 45) for the imag"},{"name":"lab_animate","description":"Animate a completed image into a clip with a video model. Pick the model from lab_list_models; check the price with get_cost or let the user confirm a card via "},{"name":"lab_animate_batch","description":"Animate MANY images into videos in ONE call (max 25 jobs). Prefer this over looping lab_animate: it validates every job BEFORE spending any quota, so an invalid"},{"name":"lab_propose","description":"Propose a generation for the user to confirm: validates the parameters against the catalog, computes the price, and shows a card (widget hosts) or returns the s"},{"name":"lab_run_proposal","description":"Run a proposal exactly as shown — same model, same parameters, same price. Called by the card's button, or by you after the user confirmed. Single use: the prop"},{"name":"lab_list_locations","description":"List location boards, newest first — START HERE to find a `location_id` for lab_generate / lab_animate. Each entry carries its `prompt_prefix_en`: that is the e"},{"name":"lab_get_location","description":"Get ONE location board in full — all descriptive fields plus its reference images and `prompt_prefix_en`. Use it to check what a board actually anchors before g"},{"name":"lab_list_project_locations","description":"Location boards bound to ONE project. Narrower and more correct than lab_list_locations when you already know the project: it cannot leak boards from a differen"},{"name":"lab_create_location","description":"Create a location board. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later anchors every image and clip sho"},{"name":"lab_generate_location_variants","description":"Generate reference images for a location board (costs quota). Without `variants` the backend picks its default set. The images are what makes a board usable as "},{"name":"lab_enrich_location_prefix","description":"Append context to a board's `prompt_prefix_en` (plain string concatenation server-side — no AI call, no quota). Idempotent: context already present in the prefi"},{"name":"lab_restyle_location","description":"Restyle an existing board towards a wish (costs quota) — same place, different look, e.g. 'the same flat, twenty years later'. Changes the board itself, so imag"},{"name":"lab_location_panorama","description":"Generate a 360° equirectangular HDRI panorama of a place (costs quota). Pass loc_id to persist it on that board, so the viewer finds it again; without loc_id it"},{"name":"lab_analyze_location_image","description":"Read a photo and extract location fields from it (Gemini Vision, costs quota). Returns the fields — it does NOT create a board; feed the result into lab_create_"},{"name":"lab_delete_location","description":"DELETE a location board permanently. There is no undo and no soft-archive — the row is removed. Images and clips that were generated with this `location_id` kee"},{"name":"lab_list_characters","description":"List the character sheets in the FilmLab cast register (id, name, age, gender, project_name, prompt_prefix_en). Call this BEFORE lab_generate whenever a person "},{"name":"lab_get_character","description":"Get ONE character sheet in full — every descriptive field plus the three that decide what you can do with it. `prompt_prefix_en` is the text block describing th"},{"name":"lab_create_character","description":"Create a character sheet in the cast register. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later describes "},{"name":"lab_generate_character_reference","description":"Generate the reference sheet for a character — six core views rendered from the sheet's `prompt_prefix_en`: detail (three-quarter close-up, the identity anchor)"},{"name":"lab_get_character_sheet","description":"The character sheet PREPARED FOR PROMPTING: base prefix, the state sheets by name, which reference views exist, and the ready-made sentence to paste into a lab_"},{"name":"lab_cast_gaps","description":"Find people who appear in a project's material (script / cast module) but have NO character sheet yet. Returns up to 6 `missing` entries, each with a name and a"},{"name":"lab_cast_autopopulate","description":"Create character sheets for the people found in a project's material — the writing counterpart to lab_cast_gaps. Creates at most 6 per call and binds each to th"},{"name":"lab_create_sequence","description":"Create a sequence (Stage 9 timeline) inside a project — START HERE to turn generated shots into something the continuity pass can read. The new sequence is EMPT"},{"name":"lab_list_sequences","description":"List a project's sequences, newest first. Use it to find a `seq_id` instead of creating a second sequence for the same cut."},{"name":"lab_get_sequence","description":"Get ONE sequence in full — timeline (the shots in order), audio_tracks, transitions, duration_seconds and render status. Check `timeline` here before starting a"},{"name":"lab_shots","description":"Read the SHOT layer of a sequence — which clips form one shot, which scene it plays in, who is in it, and what the continuity pass found. This is the layer abov"},{"name":"lab_shots_ableiten","description":"Derive the shot layer from what the clips already say about themselves — consecutive clips of the same scene become one shot, and a scene that returns later bec"},{"name":"lab_shots_setzen","description":"State the shot cut yourself: which clips form one shot, what it is called, which scene it plays in. This is the counterpart to lab_shots_ableiten — that one gro"},{"name":"lab_fassungen","description":"The history and the versions of ONE cut (sequence). Every timeline write (lab_timeline_apply, the editor, the Resolve bridge) first saves the state it replaces;"},{"name":"lab_add_clip","description":"Append a shot to a sequence's timeline. Call it once per shot, in cutting order — `start_time` is computed from the clips already there, so appending in order i"},{"name":"lab_timeline_apply","description":"Write a WHOLE cut into a sequence in one call — clips in order with their lengths, an optional dissolve between them, an optional bed underneath. This is the co"},{"name":"lab_continuity_check","description":"Start the continuity pass over a sequence — every shot is compared against its PREDECESSOR and, with check_references, against the character and location refere"},{"name":"lab_contact_sheet","description":"Build a contact sheet for a generated clip — N frames spread evenly over its runtime, tiled into ONE image — and show it. This is how a clip gets judged at all:"},{"name":"lab_bilder","description":"See a clip at EXACT seconds: up to 12 frames, in the order you list them, tiled into one image and shown. Use it to check what is on screen where you plan a cut"},{"name":"lab_capture","description":"See the CUT at exact seconds of the finished film: up to 12 frames, tiled into one image and shown. Each second is mapped like the export maps it — which clip i"},{"name":"lab_render_frames","description":"See the DELIVERED film: up to 12 frames from the finished export (lab_start_export → lab_get_export status done), tiled into one image and shown. This is the re"},{"name":"lab_feedback","description":"Tell the FilmLab team about a bug or a missing feature — it reaches the people who can fix it, the chat does not. Use art 'fehler' when a tool returned somethin"},{"name":"lab_wellenform","description":"Read the sound of a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key from lab_add_media) as numbers: peak level 0..1 per c"},{"name":"lab_wortzeiten","description":"Every spoken word with its start and end time, for a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key). Use it to cut paus"},{"name":"lab_review_asset","description":"Review generated assets: set verdict (accepted|rejected|pending) and/or selected. Pass ONE id, or `ids` for a bulk review — after a generation run there are usu"},{"name":"lab_auto_lauf","description":"Auto run with a hard spending cap: the person approves ONE run with an upper limit in credits; inside it you may generate without asking per item, but never abo"},{"name":"lab_verkettung","description":"Render several clips as CHAINS: within a scene one after another (continuity), across scenes in parallel (speed) — the plan follows scene_ref of each job in ord"},{"name":"lab_letzter_frame","description":"Extract the LAST frame of a finished clip as a new image (returns image_id, image_url, zu_dunkel). Use it as source_image_id to continue one unbroken take, or a"},{"name":"lab_abgleich","description":"Prompt check of ONE generated image or clip: does the result show what its prompt asked for? The backend first DESCRIBES the result without seeing the prompt, t"},{"name":"lab_review_queue","description":"Browse GENERATED rows (images or videos) — newest first, each with the INPUTS it ran on. Every row carries `inputs[]` (start/reference images, reference videos,"},{"name":"lab_batch_status","description":"Aggregated progress of a video batch started by lab_animate_batch. Returns {total, completed, failed, pending, done, items[]} — poll this ONCE per batch instead"},{"name":"lab_jobs_inflight","description":"Are any FilmLab generations running RIGHT NOW, across ALL projects? Use this before anything that restarts the backend (a deploy recreates the container and kil"},{"name":"lab_job_status","description":"Poll the status of an image or video generation started by lab_generate/lab_animate. There is no single-item status endpoint on the backend — this fetches the p"},{"name":"lab_auto_storyboard","description":"Auto-generate a storyboard from a script: an LLM splits the script into scenes, then one storyboard frame is generated per scene. COSTS CREDITS — every scene is"},{"name":"lab_export_profiles","description":"List the available export delivery profiles (web, social_vertical, social_youtube, streaming_hdr, cinema, master, alpha_prores4444, alpha_png_sequence) and qual"},{"name":"lab_start_export","description":"Start an ASYNC export render of a project sequence. Returns a job_id immediately (status 'queued') — does NOT block. Then poll lab_get_export with that job_id u"},{"name":"lab_prompt_transform","description":"Turn a loose idea into a production-ready image or video prompt — the same Dreamer engine the FilmLab web UI uses (modes: beautify, storyboard, polish, format, "},{"name":"lab_vfx","description":"Run a VFX operation on an image already in the project gallery — the same pipeline the Resolve bridge uses. inpaint (clean plate: what is inside the box disappe"},{"name":"lab_vfx_status","description":"Poll a VFX operation started with lab_vfx. status is pending|processing|done|failed; when done, result_url carries the finished image. Call repeatedly until don"},{"name":"lab_grade","description":"Apply a deterministic colour grade to an image already in the project gallery — no re-generation, no provider, no credits. The look is computed pixel-exact (exp"},{"name":"lab_grade_suggest","description":"Suggest a grade look for a project — read-only, no cost. With image_id, includes the image prompt; without it, uses only the colorist crew brief. Returns a reco"},{"name":"lab_grade_from_resolve","description":"Suggest a FilmLab grade look from a Resolve LUT name or path — read-only, no cost. First call resolve_node_graph_lesen on the local FilmLab bridge (filmlab_brue"},{"name":"lab_depth_map","description":"Create or read a depth map for a project video in FilmLab: use it for fog, depth of field, relighting or occlusion. Near is white, like Resolve's Depth Map. Fre"},{"name":"lab_dossier","description":"Build a dossier of a project's takes: one ZIP with an offline index.html (no external resources) plus the media files, named Project_SceneNN_YYYYMMDD-Tnn.ext. m"},{"name":"lab_get_dossier","description":"Poll a dossier job by job_id (from lab_dossier). status is queued|processing|done|failed. When done, result.archiv_url is a signed https link to the ZIP that lo"},{"name":"lab_get_export","description":"Poll an export render job by job_id (from lab_start_export). status is queued|processing|done|failed; when done, the result (output url) is included. Call repea"},{"name":"lab_list_exports","description":"List past export jobs for a project (each with job_id, status, profile). Returns up to 20 with a total count. Finished rows carry the same signed, login-free re"},{"name":"lab_add_media","description":"Bring your own video, audio or image into a project — not generated, yours. Two ways: `media_url` (a public http(s) address; the server fetches it, max 100 MB) "},{"name":"lab_herkunft","description":"Declare or list where a project's material comes from: 'eigen' (made by people) or 'ki' (AI-generated or AI-altered). Exports decide the EU AI Act Art. 50 discl"},{"name":"lab_list_assets","description":"List a project's media assets (image/video/audio) with their URLs. Optionally filter by asset_type. Returns up to 20 with a total count. Each row carries its ad"},{"name":"lab_generate_music","description":"Generate a MUSIC track for a project (Stable Audio via fal.ai) — the first step of the rhythm chain, and the only one that costs credits. ASYNCHRONOUS: the call"},{"name":"lab_sfx","description":"Generate or CLEAN UP a SOUND track other than music — sound effects, ambience/atmosphere, dialog, a voiceover, FOLEY scored to an existing clip, or the repair k"},{"name":"lab_list_audio","description":"List a project's generated audio rows, newest first — this is the POLL for lab_generate_music. Read two fields: `metadata.status` ('pending' | 'completed' | 'fa"},{"name":"lab_bind_audio","description":"Bind the project's generated audio to a sequence's tracks — ONE call that does both halves of the job, because doing only the first half silently produces a sil"},{"name":"lab_mix","description":"Set the sound mix of a sequence: per track `volume_db`, `pan`, `mute`, `solo` and `effects`. Every field you send is rendered — the backend rejects what it cann"},{"name":"lab_mix_render","description":"Render the sequence's mixdown, normalised to a loudness target: `broadcast` (EBU R128), `web` or `youtube`. With `auto_preset` it runs the AUTO-MIX instead: it "},{"name":"lab_mix_messen","description":"Measure the RENDERED mix: integrated loudness (LUFS), true peak (dBTP) and loudness range (LU) of the master, measured on the mixdown file itself. Per stem the "},{"name":"lab_grade_clip","description":"Set the colour grade of ONE clip in the edit (Murnau), or of the whole programme with `programm: true`. It is the same grade a colourist sets in Murnau's colour"},{"name":"lab_scopes","description":"Measure ONE clip of the edit as numbers instead of a picture: a frame is rendered through the clip's export path (input profile, grade LUT, secondary correction"},{"name":"lab_look_match","description":"Check the colour CONTINUITY of a scene in the edit (Murnau): every shot is compared with the scene's reference shot (the first, or `referenz_clip_id`) at the SA"},{"name":"lab_ton_durchlauf","description":"Generate SOUND EFFECTS for a whole sequence, shot by shot — Simon Meyer's pass: every shot is muted, padded with black frames up to the model's minimum length, "},{"name":"lab_beatgrid","description":"Measure the TEMPO of the sequence's bound music track and store the beat grid — opens the real file with ffmpeg and analyses it, no guessing and no provider, so"},{"name":"lab_apply_rhythm","description":"Compute the sequence's clip durations from the project's cutting preset and — when the tempo allows it — pull the cut points onto the measured beat grid. WRITES"},{"name":"lab_suggest_durations","description":"Ask what clip durations the project's cutting preset WOULD give a sequence — and change nothing (`angewendet: false`). Use it to see the consequence before lab_"},{"name":"lab_dub","description":"Dub a sequence into another language: either a ready audio track (en_audio_url — e.g. the one lab_dub_tts just produced) OR a cloned voice reading a line of tex"},{"name":"lab_dub_voices","description":"List the ElevenLabs TTS voices available for lab_dub_tts's `voice_id` — this is the EN-dub-track text-to-speech voice list, NOT a project's cloned voices (those"},{"name":"lab_dub_tts","description":"Generate the EN-dub audio track for a sequence via ElevenLabs TTS — SYNCHRONOUS, returns a ready audio_url immediately, no job_id and nothing to poll. Optionall"},{"name":"lab_voice_clone","description":"Clone a voice from real audio or video material into a project (fal.ai minimax voice-clone) — the source for lab_voice_tts and for lab_dub's voice_id+dub_text p"},{"name":"lab_voice_tts","description":"Speak text in a project's cloned voice (via lab_voice_clone) — SYNCHRONOUS, returns a ready audio_url, no job_id. The voice house is whichever one cloned this v"},{"name":"lab_list_voices","description":"List a project's cloned voices (lab_voice_clone results) — id, label, voice house, sample and preview URLs. This is where a `voice_id` for lab_voice_tts or lab_"}],"toolCount":111,"toolsHash":"c4a782de5b49208b2dba6355213cc038f2dc2830c0c8000a8b649cdc7758fee2","serverName":"filmlab-mcp","capabilities":["resources","prompts","tools"],"serverVersion":"1.29.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"lab_list_projects","description":"List FilmLab projects (id, title, current pipeline stage). Call this first to find a project_id for the other tools. Shows up to 20 items; `total` counts your a"},{"name":"lab_wissen","description":"Use when the person asks a film-craft question: what a term means, which rule or convention applies, how something is usually done in camera, editing, sound or "},{"name":"lab_widerruf","description":"Record a correction in the FilmOS knowledge layer when the user contradicts something you asserted from it. Use this the moment a contradiction is stated — not "},{"name":"lab_playbook","description":"The rules of one working surface, generated from the code: what the surface is, what an agent can trigger itself, what exists but only by hand, and what does no"},{"name":"lab_list_models","description":"The model catalog: what every video or image model can do — resolutions, durations, aspect ratios, audio, reference limits, price per second or per image — grou"},{"name":"lab_regie_techniken","description":"Use when the person asks HOW to stage or shoot a feeling or effect (which angle, movement, framing or light makes a scene feel tense, tender, triumphant, uneasy"},{"name":"lab_whoami","description":"Who is connected: the FilmLab account (email, user id, name, tier, credits) and how this connection signed in (oauth, oauth_geraet, bridge_key, legacy service u"},{"name":"lab_get_state","description":"One call, the whole picture: account (tier, credits, reset), default models with price, jobs in flight, catalog freshness, project count. Pass project_id for th"},{"name":"lab_get_project","description":"Use when the person asks where a project stands: its current stage, what is finished, what comes next, or wants the project's state before continuing. Get a sin"},{"name":"lab_zielgruppe","description":"Read or set a project's audience (zielgruppe) and target markets (zielmaerkte). With project_id only: read. Set zielgruppe 'kinder' or 'jugendliche' whenever th"},{"name":"lab_get_context","description":"Read the accumulated context/output for one pipeline module of a project (e.g. the IDEE, STORYBOARD or SHOTS stage). Needs project_id and module name."},{"name":"lab_get_job","description":"Get the status of a background job by job_id (status is queued|processing|done|failed). Poll this after starting a long-running generate/export. Returns the job"},{"name":"lab_search_catalog","description":"Search the FilmLab universe catalog of AI tools, news and companies. Query must be at least 2 characters. Returns up to 20 matches with a total count."},{"name":"lab_create_project","description":"Create a new FilmLab project. Returns the new project id. Optionally set a title."},{"name":"lab_run_module","description":"Run ONE pipeline module for a project (context is injected from upstream modules + crew agents). SYNCHRONOUS and LLM-heavy: light modules return in seconds; hea"},{"name":"lab_generate","description":"Generate an image on the production pipeline (fal.ai, quota-tracked, persisted to the project's gallery). Waits up to `wait_s` seconds (default 45) for the imag"},{"name":"lab_animate","description":"Animate a completed image into a clip with a video model. Pick the model from lab_list_models; check the price with get_cost or let the user confirm a card via "},{"name":"lab_animate_batch","description":"Animate MANY images into videos in ONE call (max 25 jobs). Prefer this over looping lab_animate: it validates every job BEFORE spending any quota, so an invalid"},{"name":"lab_propose","description":"Propose a generation for the user to confirm: validates the parameters against the catalog, computes the price, and shows a card (widget hosts) or returns the s"},{"name":"lab_run_proposal","description":"Run a proposal exactly as shown — same model, same parameters, same price. Called by the card's button, or by you after the user confirmed. Single use: the prop"},{"name":"lab_list_locations","description":"List location boards, newest first — START HERE to find a `location_id` for lab_generate / lab_animate. Each entry carries its `prompt_prefix_en`: that is the e"},{"name":"lab_get_location","description":"Get ONE location board in full — all descriptive fields plus its reference images and `prompt_prefix_en`. Use it to check what a board actually anchors before g"},{"name":"lab_list_project_locations","description":"Location boards bound to ONE project. Narrower and more correct than lab_list_locations when you already know the project: it cannot leak boards from a differen"},{"name":"lab_create_location","description":"Create a location board. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later anchors every image and clip sho"},{"name":"lab_generate_location_variants","description":"Generate reference images for a location board (costs quota). Without `variants` the backend picks its default set. The images are what makes a board usable as "},{"name":"lab_enrich_location_prefix","description":"Append context to a board's `prompt_prefix_en` (plain string concatenation server-side — no AI call, no quota). Idempotent: context already present in the prefi"},{"name":"lab_restyle_location","description":"Restyle an existing board towards a wish (costs quota) — same place, different look, e.g. 'the same flat, twenty years later'. Changes the board itself, so imag"},{"name":"lab_location_panorama","description":"Generate a 360° equirectangular HDRI panorama of a place (costs quota). Pass loc_id to persist it on that board, so the viewer finds it again; without loc_id it"},{"name":"lab_analyze_location_image","description":"Read a photo and extract location fields from it (Gemini Vision, costs quota). Returns the fields — it does NOT create a board; feed the result into lab_create_"},{"name":"lab_delete_location","description":"DELETE a location board permanently. There is no undo and no soft-archive — the row is removed. Images and clips that were generated with this `location_id` kee"},{"name":"lab_list_characters","description":"List the character sheets in the FilmLab cast register (id, name, age, gender, project_name, prompt_prefix_en). Call this BEFORE lab_generate whenever a person "},{"name":"lab_get_character","description":"Get ONE character sheet in full — every descriptive field plus the three that decide what you can do with it. `prompt_prefix_en` is the text block describing th"},{"name":"lab_create_character","description":"Create a character sheet in the cast register. The backend derives an English `prompt_prefix_en` from the fields you give — that prefix is what later describes "},{"name":"lab_generate_character_reference","description":"Generate the reference sheet for a character — six core views rendered from the sheet's `prompt_prefix_en`: detail (three-quarter close-up, the identity anchor)"},{"name":"lab_get_character_sheet","description":"The character sheet PREPARED FOR PROMPTING: base prefix, the state sheets by name, which reference views exist, and the ready-made sentence to paste into a lab_"},{"name":"lab_cast_gaps","description":"Find people who appear in a project's material (script / cast module) but have NO character sheet yet. Returns up to 6 `missing` entries, each with a name and a"},{"name":"lab_cast_autopopulate","description":"Create character sheets for the people found in a project's material — the writing counterpart to lab_cast_gaps. Creates at most 6 per call and binds each to th"},{"name":"lab_create_sequence","description":"Create a sequence (Stage 9 timeline) inside a project — START HERE to turn generated shots into something the continuity pass can read. The new sequence is EMPT"},{"name":"lab_list_sequences","description":"List a project's sequences, newest first. Use it to find a `seq_id` instead of creating a second sequence for the same cut."},{"name":"lab_get_sequence","description":"Get ONE sequence in full — timeline (the shots in order), audio_tracks, transitions, duration_seconds and render status. Check `timeline` here before starting a"},{"name":"lab_shots","description":"Read the SHOT layer of a sequence — which clips form one shot, which scene it plays in, who is in it, and what the continuity pass found. This is the layer abov"},{"name":"lab_shots_ableiten","description":"Derive the shot layer from what the clips already say about themselves — consecutive clips of the same scene become one shot, and a scene that returns later bec"},{"name":"lab_aufloesung","description":"Break one scene down into a STRUCTURED shot list of 2, 4 or 6 shots — each with shot size, camera angle, purpose and its own ready prompt, plus one shared floor"},{"name":"lab_shots_setzen","description":"State the shot cut yourself: which clips form one shot, what it is called, which scene it plays in. This is the counterpart to lab_shots_ableiten — that one gro"},{"name":"lab_fassungen","description":"Use when the person asks about earlier states of a cut, wants to go back to a previous version, compare versions, name a version, or create a second cut (e.g. a"},{"name":"lab_add_clip","description":"Append a shot to a sequence's timeline. Call it once per shot, in cutting order — `start_time` is computed from the clips already there, so appending in order i"},{"name":"lab_timeline_apply","description":"Write a WHOLE cut into a sequence in one call — clips in order with their lengths, an optional dissolve between them, an optional bed underneath. This is the co"},{"name":"lab_continuity_check","description":"Start the continuity pass over a sequence — every shot is compared against its PREDECESSOR and, with check_references, against the character and location refere"},{"name":"lab_contact_sheet","description":"Build a contact sheet for a generated clip — N frames spread evenly over its runtime, tiled into ONE image — and show it. This is how a clip gets judged at all:"},{"name":"lab_bilder","description":"See a clip at EXACT seconds: up to 12 frames, in the order you list them, tiled into one image and shown. Use it to check what is on screen where you plan a cut"},{"name":"lab_capture","description":"See the CUT at exact seconds of the finished film: up to 12 frames, tiled into one image and shown. Each second is mapped like the export maps it — which clip i"},{"name":"lab_render_frames","description":"See the DELIVERED film: up to 12 frames from the finished export (lab_start_export → lab_get_export status done), tiled into one image and shown. This is the re"},{"name":"lab_feedback","description":"Tell the FilmLab team about a bug or a missing feature — it reaches the people who can fix it, the chat does not. Use art 'fehler' when a tool returned somethin"},{"name":"lab_wellenform","description":"Read the sound of a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key from lab_add_media) as numbers: peak level 0..1 per c"},{"name":"lab_wortzeiten","description":"Every spoken word with its start and end time, for a clip (video_id), an audio track (audio_id) or an uploaded file (project_id + asset_key). Use it to cut paus"},{"name":"lab_review_asset","description":"Review generated assets: set verdict (accepted|rejected|pending) and/or selected. Pass ONE id, or `ids` for a bulk review — after a generation run there are usu"},{"name":"lab_auto_lauf","description":"Auto run with a hard spending cap: the person approves ONE run with an upper limit in credits; inside it you may generate without asking per item, but never abo"},{"name":"lab_verkettung","description":"Render several clips as CHAINS: within a scene one after another (continuity), across scenes in parallel (speed) — the plan follows scene_ref of each job in ord"},{"name":"lab_letzter_frame","description":"Extract the LAST frame of a finished clip as a new image (returns image_id, image_url, zu_dunkel). Use it as source_image_id to continue one unbroken take, or a"},{"name":"lab_abgleich","description":"Prompt check of ONE generated image or clip: does the result show what its prompt asked for? The backend first DESCRIBES the result without seeing the prompt, t"},{"name":"lab_review_queue","description":"Browse GENERATED rows (images or videos) — newest first, each with the INPUTS it ran on. Every row carries `inputs[]` (start/reference images, reference videos,"},{"name":"lab_batch_status","description":"Aggregated progress of a video batch started by lab_animate_batch. Returns {total, completed, failed, pending, done, items[]} — poll this ONCE per batch instead"},{"name":"lab_jobs_inflight","description":"Are any FilmLab generations running RIGHT NOW, across ALL projects? Use this before anything that restarts the backend (a deploy recreates the container and kil"},{"name":"lab_job_status","description":"Poll the status of an image or video generation started by lab_generate/lab_animate. There is no single-item status endpoint on the backend — this fetches the p"},{"name":"lab_auto_storyboard","description":"Auto-generate a storyboard from a script: an LLM splits the script into scenes, then one storyboard frame is generated per scene. COSTS CREDITS — every scene is"},{"name":"lab_export_profiles","description":"List the available export delivery profiles (web, social_vertical, social_youtube, streaming_hdr, cinema, master, alpha_prores4444, alpha_png_sequence) and qual"},{"name":"lab_start_export","description":"Start an ASYNC export render of a project sequence. Returns a job_id immediately (status 'queued') — does NOT block. Then poll lab_get_export with that job_id u"},{"name":"lab_prompt_transform","description":"Turn a loose idea into a production-ready image or video prompt — the same Dreamer engine the FilmLab web UI uses (modes: beautify, storyboard, polish, format, "},{"name":"lab_vfx","description":"Run a VFX operation on an image already in the project gallery — the same pipeline the Resolve bridge uses. inpaint (clean plate: what is inside the box disappe"},{"name":"lab_vfx_status","description":"Poll a VFX operation started with lab_vfx. status is pending|processing|done|failed; when done, result_url carries the finished image. Call repeatedly until don"},{"name":"lab_grade","description":"Apply a deterministic colour grade to an image already in the project gallery — no re-generation, no provider, no credits. The look is computed pixel-exact (exp"},{"name":"lab_grade_suggest","description":"Suggest a grade look for a project — read-only, no cost. With image_id, includes the image prompt; without it, uses only the colorist crew brief. Returns a reco"},{"name":"lab_grade_from_resolve","description":"Suggest a FilmLab grade look from a Resolve LUT name or path — read-only, no cost. First call resolve_node_graph_lesen on the local FilmLab bridge (filmlab_brue"},{"name":"lab_depth_map","description":"Create or read a depth map for a project video in FilmLab: use it for fog, depth of field, relighting or occlusion. Near is white, like Resolve's Depth Map. Fre"},{"name":"lab_dossier","description":"Build a dossier of a project's takes: one ZIP with an offline index.html (no external resources) plus the media files, named Project_SceneNN_YYYYMMDD-Tnn.ext. m"},{"name":"lab_get_dossier","description":"Poll a dossier job by job_id (from lab_dossier). status is queued|processing|done|failed. When done, result.archiv_url is a signed https link to the ZIP that lo"},{"name":"lab_get_export","description":"Poll an export render job by job_id (from lab_start_export). status is queued|processing|done|failed; when done, the result (output url) is included. Call repea"},{"name":"lab_list_exports","description":"List past export jobs for a project (each with job_id, status, profile). Returns up to 20 with a total count. Finished rows carry the same signed, login-free re"},{"name":"lab_add_media","description":"Bring your own video, audio or image into a project — not generated, yours. Two ways: `media_url` (a public http(s) address; the server fetches it, max 100 MB) "},{"name":"lab_umzug","description":"Bring Midjourney exports into a project (FilmLab calls this 'Umzug'). Midjourney has no API, so the person downloads their images or ZIP and this tool carries t"},{"name":"lab_referenz_aus_bild","description":"Attach an existing project image (an image_id from lab_umzug, lab_get_job result.bildzeilen or lab_generate) as reference: `ziel: 'figur'` makes it a view of a "},{"name":"lab_herkunft","description":"Declare or list where a project's material comes from: 'eigen' (made by people) or 'ki' (AI-generated or AI-altered). Exports decide the EU AI Act Art. 50 discl"},{"name":"lab_list_assets","description":"List a project's media assets (image/video/audio) with their URLs. Optionally filter by asset_type. Returns up to 20 with a total count. Each row carries its ad"},{"name":"lab_generate_music","description":"Generate a MUSIC track for a project (Stable Audio via fal.ai) — the first step of the rhythm chain, and the only one that costs credits. ASYNCHRONOUS: the call"},{"name":"lab_sfx","description":"Generate or CLEAN UP a SOUND track other than music — sound effects, ambience/atmosphere, dialog, a voiceover, FOLEY scored to an existing clip, or the repair k"},{"name":"lab_list_audio","description":"List a project's generated audio rows, newest first — this is the POLL for lab_generate_music. Read two fields: `metadata.status` ('pending' | 'completed' | 'fa"},{"name":"lab_bind_audio","description":"Bind the project's generated audio to a sequence's tracks — ONE call that does both halves of the job, because doing only the first half silently produces a sil"},{"name":"lab_mix","description":"Set the sound mix of a sequence: per track `volume_db`, `pan`, `mute`, `solo` and `effects`. Every field you send is rendered — the backend rejects what it cann"},{"name":"lab_mix_render","description":"Render the sequence's mixdown, normalised to a loudness target: `broadcast` (EBU R128), `web` or `youtube`. With `auto_preset` it runs the AUTO-MIX instead: it "},{"name":"lab_mix_messen","description":"Measure the RENDERED mix: integrated loudness (LUFS), true peak (dBTP) and loudness range (LU) of the master, measured on the mixdown file itself. Per stem the "},{"name":"lab_grade_clip","description":"Set the colour grade of ONE clip in the edit (Murnau), or of the whole programme with `programm: true`. It is the same grade a colourist sets in Murnau's colour"},{"name":"lab_scopes","description":"Measure ONE clip of the edit as numbers instead of a picture: a frame is rendered through the clip's export path (input profile, grade LUT, secondary correction"},{"name":"lab_look_match","description":"Check the colour CONTINUITY of a scene in the edit (Murnau): every shot is compared with the scene's reference shot (the first, or `referenz_clip_id`) at the SA"},{"name":"lab_ton_durchlauf","description":"Generate SOUND EFFECTS for a whole sequence, shot by shot — Simon Meyer's pass: every shot is muted, padded with black frames up to the model's minimum length, "},{"name":"lab_beatgrid","description":"Measure the TEMPO of the sequence's bound music track and store the beat grid — opens the real file with ffmpeg and analyses it, no guessing and no provider, so"},{"name":"lab_apply_rhythm","description":"Compute the sequence's clip durations from the project's cutting preset and — when the tempo allows it — pull the cut points onto the measured beat grid. WRITES"},{"name":"lab_suggest_durations","description":"Ask what clip durations the project's cutting preset WOULD give a sequence — and change nothing (`angewendet: false`). Use it to see the consequence before lab_"},{"name":"lab_dub","description":"Dub a sequence into another language: either a ready audio track (en_audio_url — e.g. the one lab_dub_tts just produced) OR a cloned voice reading a line of tex"},{"name":"lab_dub_voices","description":"List the ElevenLabs TTS voices available for lab_dub_tts's `voice_id` — this is the EN-dub-track text-to-speech voice list, NOT a project's cloned voices (those"},{"name":"lab_dub_tts","description":"Generate the EN-dub audio track for a sequence via ElevenLabs TTS — SYNCHRONOUS, returns a ready audio_url immediately, no job_id and nothing to poll. Optionall"}],"package":null,"toolSurface":{"id":"ts_mha6sf82ucxp","endpointId":"ep_s2subeme39ry","hash":"08663b8462a2e3ad5a7f8ee7c90d04e862481b9a20ef25caa1e89bee6124fd80","toolCount":114,"serverName":"filmlab-mcp","serverVersion":"1.29.0","protocolVersion":"2025-06-18","firstSeenAt":"2026-10-10T15:31:02.675Z","lastSeenAt":"2026-10-11T04:24:48.291Z","observations":3,"toolNames":["lab_list_projects","lab_wissen","lab_widerruf","lab_playbook","lab_list_models","lab_regie_techniken","lab_whoami","lab_get_state","lab_get_project","lab_zielgruppe","lab_get_context","lab_get_job","lab_search_catalog","lab_create_project","lab_run_module","lab_generate","lab_animate","lab_animate_batch","lab_propose","lab_run_proposal","lab_list_locations","lab_get_location","lab_list_project_locations","lab_create_location","lab_generate_location_variants","lab_enrich_location_prefix","lab_restyle_location","lab_location_panorama","lab_analyze_location_image","lab_delete_location","lab_list_characters","lab_get_character","lab_create_character","lab_generate_character_reference","lab_get_character_sheet","lab_cast_gaps","lab_cast_autopopulate","lab_create_sequence","lab_list_sequences","lab_get_sequence","lab_shots","lab_shots_ableiten","lab_aufloesung","lab_shots_setzen","lab_fassungen","lab_add_clip","lab_timeline_apply","lab_continuity_check","lab_contact_sheet","lab_bilder","lab_capture","lab_render_frames","lab_feedback","lab_wellenform","lab_wortzeiten","lab_review_asset","lab_auto_lauf","lab_verkettung","lab_letzter_frame","lab_abgleich","lab_review_queue","lab_batch_status","lab_jobs_inflight","lab_job_status","lab_auto_storyboard","lab_export_profiles","lab_start_export","lab_prompt_transform","lab_vfx","lab_vfx_status","lab_grade","lab_grade_suggest","lab_grade_from_resolve","lab_depth_map","lab_dossier","lab_get_dossier","lab_get_export","lab_list_exports","lab_add_media","lab_umzug","lab_referenz_aus_bild","lab_herkunft","lab_list_assets","lab_generate_music","lab_sfx","lab_list_audio","lab_bind_audio","lab_mix","lab_mix_render","lab_mix_messen","lab_grade_clip","lab_scopes","lab_look_match","lab_ton_durchlauf","lab_beatgrid","lab_apply_rhythm","lab_suggest_durations","lab_dub","lab_dub_voices","lab_dub_tts","lab_voice_clone","lab_voice_tts","lab_list_voices","lab_reference_motion","lab_transform","lab_upscale","lab_layers","lab_location_recon","lab_list_location_scans","lab_diagnose","lab_flow_angebot","lab_flow_starten","lab_flow_status","lab_flow_fortsetzen"],"distinctSurfaces":20},"endpointFacts":[{"id":"ep_s2subeme39ry","url":"https://mcp-lab.thefilmradar.com/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-10-09T19:25:50.545Z","auth":{"observedAt":"2026-10-09T19:25:50.620Z","authRequired":false,"scheme":null,"resourceMetadata":{"url":"https://mcp-lab.thefilmradar.com/.well-known/oauth-protected-resource/mcp","resource":"https://mcp-lab.thefilmradar.com/mcp","authorizationServers":["https://mcp-lab.thefilmradar.com"],"scopesSupported":["filmlab:read","filmlab:write"]},"authorizationServer":{"url":"https://mcp-lab.thefilmradar.com/.well-known/oauth-authorization-server","issuer":"https://mcp-lab.thefilmradar.com","grantTypesSupported":["authorization_code","refresh_token","urn:ietf:params:oauth:grant-type:device_code"],"codeChallengeMethodsSupported":["S256"],"tokenEndpointAuthMethodsSupported":["client_secret_basic","client_secret_post","none"],"dynamicClientRegistration":true,"dpopSigningAlgValuesSupported":[],"clientIdMetadataDocumentSupported":false},"conformance":{"dpop":false,"rfc8414":true,"rfc9728":true,"pkceS256":true,"clientIdMetadataDocument":false,"dynamicClientRegistration":true}},"tls":{"observedAt":"2026-10-09T19:25:50.634Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"thefilmradar.com","issuer":{"commonName":"WE1","organization":"Google Trust Services"},"validFrom":"2026-09-06T21:46:39.000Z","validTo":"2026-12-05T22:46:36.000Z","daysToExpiry":55,"sanCount":3,"fingerprint256":"73:70:27:F8:81:34:4A:1E:04:D1:DB:0C:D7:96:94:93:C8:7E:E5:B8:6D:62:FD:56:BF:2D:4F:C6:66:F6:30:63"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"com.thefilmradar/filmlab","url":"https://registry.modelcontextprotocol.io/v0/servers/com.thefilmradar%2Ffilmlab","firstSeenAt":"2026-09-05T21:20:37.665Z","fetchedAt":"2026-10-09T12:21:50.828Z","normalizedAt":"2026-10-09T12:21:50.828Z"}]},"firstSeenAt":"2026-09-05T21:20:37.665Z","updatedAt":"2026-10-11T04:27:36.571Z"}