{"serverId":"mcp-registry/io.scanbimlabs/twinmotion-mcp","tools":[{"name":"tm_export_video","fixed":{"name":"tm_export_video","description":"Prepare a model for an animated walkthrough / video export by verifying the manifest is complete, then starting a secondary Model Derivative job that produces OBJ geometry (suitable for ingestion into offline rendering pipelines, Blender, or Unreal Engine). Also returns the list of available named views so the operator can stitch them into a camera path. Does NOT itself produce an mp4 — video encoding happens in the downstream UE/Twinmotion pipeline.\n\nWhen to use: when a user wants a walkthrough","inputSchema":{"type":"object","required":["project_id","animation_name"],"properties":{"format":{"enum":["mp4","mov","webm"],"type":"string","examples":["mp4","mov"],"description":"Intended final video container (metadata hint for the downstream UE/Twinmotion render step). mp4 = H.264 web-friendly, mov = ProRes for editing, webm = VP9/AV1 for web."},"project_id":{"type":"string","examples":["dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6c2NhbmJpbS12aXotMTcwMDAwMDAwMC9CdWlsZGluZy5ydnQ"],"description":"Base64-URL-safe URN of a fully-translated model (manifest.status must equal 'success'). If status != success, the tool returns status='pending' without starting a job."},"resolution":{"enum":["1920x1080","3840x2160"],"type":"string","examples":["1920x1080","3840x2160"],"description":"Intended final video resolution (metadata hint). 4K (3840x2160) roughly quadruples UE render time vs 1080p."},"animation_name":{"type":"string","examples":["tower_a_lobby_tour","site_flythrough_v2","client_presentation_evening"],"description":"Human-readable label for the walkthrough/animation (used in downstream asset naming; suggest matching the exported video/USD filename base, e.g. 'tower_a_lobby_tour' → tower_a_lobby_tour.mp4 / .fbx / .glb / .usd)."},"duration_seconds":{"type":"number","examples":[15,30,60,120],"description":"Target duration of the final video in seconds (integer). Used only as metadata for the downstream UE Movie Render Queue; this tool does not encode video. Typical: 15–120s."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":567,"tokensAfter":567},{"name":"tm_import_rvt","fixed":{"name":"tm_import_rvt","description":"Import a Revit/BIM model into the Twinmotion visualization pipeline: downloads the source file from a public URL, uploads it to an APS OSS transient bucket, and kicks off an SVF2 + thumbnail translation job. Returns the base64 URN (project_id) used by every other tm_* tool.\n\nWhen to use: when a user wants to prepare a Revit (.rvt), IFC (.ifc), or other BIM/CAD model for real-time visualization in Unreal Engine / Twinmotion — typically the first step before rendering stills, defining scenes, or e","inputSchema":{"type":"object","required":["file_url","file_name"],"properties":{"file_url":{"type":"string","examples":["https://example-cdn.com/projects/office-tower.rvt","https://storage.googleapis.com/bim-uploads/site-model.ifc?X-Goog-Signature=..."],"description":"Public HTTPS URL to download the source BIM/CAD file. Must be reachable without auth from Cloudflare Workers egress. Supports rvt, ifc, nwd, dwg, dgn, 3dm, stp, obj, and other APS-supported formats. Signed URLs (S3/GCS) work if the signature is embedded in the query string."},"file_name":{"type":"string","examples":["Building.rvt","SitePlan.ifc","Factory_v3.nwd","Terrain.dwg"],"description":"Filename with extension used as the OSS object key. Non-alphanumeric characters are sanitized to underscores. Extension drives APS translator selection (.rvt → Revit, .ifc → IFC, etc.). For downstream Twinmotion/UE import, keep the base name meaningful (e.g. 'TowerA_L01-L20.rvt' → later exported as TowerA_L01-L20.fbx / .glb / .usd)."},"lighting_preset":{"enum":["default","natural","studio","evening"],"type":"string","examples":["natural","studio"],"description":"Lighting preset label stored alongside the import — purely metadata for downstream tm_render_image / UE scene setup; does not affect the APS translation itself. 'natural' = daylight sun+sky, 'studio' = neutral 3-point, 'evening' = warm low sun."},"include_materials":{"type":"boolean","examples":[true,false],"description":"If true (default), the translation preserves material/texture data so the derivative is visually meaningful in Twinmotion/UE. Set false only for geometry-only pipelines (faster, smaller derivatives)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":612,"tokensAfter":612},{"name":"tm_list_scenes","fixed":{"name":"tm_list_scenes","description":"Enumerate every 2D/3D view ('scene') baked into the translated model, plus a shallow dump of the model object tree (first 50 top-level nodes across all 3D views), plus the list of completed derivatives (svf2, thumbnail, obj, etc.) available via APS. The canonical discovery tool for anything downstream that needs a view name or GUID.\n\nWhen to use: before tm_render_image (to pick a valid camera_preset), before tm_export_video (to plan a camera path across named views), to audit what was translated","inputSchema":{"type":"object","required":["project_id"],"properties":{"project_id":{"type":"string","examples":["dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6c2NhbmJpbS12aXotMTcwMDAwMDAwMC9CdWlsZGluZy5ydnQ"],"description":"Base64-URL-safe URN of the translated model. Should have manifest.status='success' for full results; if still translating, scene_count may be 0 or partial."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":256,"tokensAfter":256},{"name":"tm_set_environment","fixed":{"name":"tm_set_environment","description":"Configure the visualization environment (weather, time-of-day, surround context) for a previously imported model. Validates the model exists via APS Model Derivative manifest, then stores the environment config in KV (24h TTL) so tm_render_image and tm_export_video can apply it.\n\nWhen to use: after tm_import_rvt completes and the manifest status is 'success' (or in-progress if you just want to pre-stage config), when the user wants to set scene context — e.g. 'render the tower at 17:00 in an urb","inputSchema":{"type":"object","required":["project_id"],"properties":{"weather":{"enum":["clear","cloudy","rainy","sunset","night"],"type":"string","examples":["clear","sunset"],"description":"Weather condition label stored with the scene config. Drives UE sky/atmosphere presets during manual Twinmotion scene authoring."},"project_id":{"type":"string","examples":["dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6c2NhbmJpbS12aXotMTcwMDAwMDAwMC9CdWlsZGluZy5ydnQ"],"description":"Base64-URL-safe URN returned by tm_import_rvt (the `project_id` / `urn` field). This is the Autodesk design URN — NOT an object ID, NOT a bucket key. Format: base64url of 'urn:adsk.objects:os.object:<bucket>/<object>', trailing '=' stripped."},"environment":{"enum":["urban","suburban","natural","industrial","custom"],"type":"string","examples":["urban","natural"],"description":"Surround/context preset for the UE scene. Purely metadata — applied when the operator builds the Twinmotion scene post-FBX-export. 'custom' means the user will supply their own HDRI/backdrop in UE."},"time_of_day":{"type":"string","examples":["08:30","14:30","17:45"],"description":"24-hour clock time as HH:MM. Used for sun position in the UE scene. Default if omitted is '12:00' (noon)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":498,"tokensAfter":498}],"toolsChanged":4,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}