Squall Studio
What this MCP does
Creates and manages AI-generated microdrama projects, scripts, characters, locations, shot assets, video clips, music, and continuity references.
Tools
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['shot_id', 'asset_id'], 'properties': {'shot_id': {'type': 'string', 'description': 'Shot id (episode_shots row) to attach the reference to.'}, 'asset_id': {'type': 'string', 'description': 'Id of an existing image asset in this project.'}, 'guidance': {'type': 'string', 'maxLength': 1000, 'description': 'How the video model should use this reference, e.g. which positions or props to match and what to ignore. Saved on the reference and sent with every later generation of the shot.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['character_id', 'idempotency_key'], 'properties': {'user_notes': {'type': 'string', 'description': 'Extra direction for the image.'}, 'character_id': {'type': 'string', 'description': 'Character id.'}, 'idempotency_key': {'type': 'string', 'pattern': '^[A-Za-z0-9._:-]+$', 'maxLength': 200, 'minLength': 8, 'description': 'Stable key identifying this generation request. Reuse the SAME key when retrying the same request â\x80\x94 the original job is returned and no second charge is made. Use a NEW key when you deliberately want another generation.'}, 'character_look_id': {'type': 'string', 'description': 'Specific look; defaults to the base look.'}, 'reference_image_asset_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Existing asset ids to use as references.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['episode_id', 'idempotency_key'], 'properties': {'episode_id': {'type': 'string', 'description': 'Episode id.'}, 'idempotency_key': {'type': 'string', 'pattern': '^[A-Za-z0-9._:-]+$', 'maxLength': 200, 'minLength': 8, 'description': 'Stable key identifying this generation request. Reuse the SAME key when retrying the same request â\x80\x94 the original job is returned and no second charge is made. Use a NEW key when you deliberately want another generation.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location_id', 'idempotency_key'], 'properties': {'user_notes': {'type': 'string'}, 'location_id': {'type': 'string', 'description': 'Location id.'}, 'idempotency_key': {'type': 'string', 'pattern': '^[A-Za-z0-9._:-]+$', 'maxLength': 200, 'minLength': 8, 'description': 'Stable key identifying this generation request. Reuse the SAME key when retrying the same request â\x80\x94 the original job is returned and no second charge is made. Use a NEW key when you deliberately want another generation.'}, 'reference_image_asset_ids': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['story_idea', 'episode_length_seconds', 'idempotency_key'], 'properties': {'genre': {'type': 'string', 'default': 'Vertical Drama', 'minLength': 1, 'description': 'Genre label.'}, 'language': {'type': 'string', 'default': 'English', 'minLength': 1, 'description': 'Language to write in.'}, 'story_idea': {'type': 'string', 'minLength': 10, 'description': 'The story premise to write from.'}, 'screen_ratio': {'enum': ['9:16', '16:9', '1:1'], 'type': 'string', 'default': '9:16', 'description': 'Aspect ratio.'}, 'visual_style': {'enum': ['Realistic TV Drama', 'Cinematic Romance', '2D Anime', '3D Animated', 'Dark Thriller'], 'type': 'string', 'description': 'Visual style. Defaults to Realistic TV Drama.'}, 'episode_count': {'anyOf': [{'type': 'integer', 'maximum': 3, 'exclusiveMinimum': 0}, {'type': 'null'}], 'default': 3, 'description': 'How many episodes to write. null to let the model choose.'}, 'idempotency_key': {'type': 'string', 'pattern': '^[A-Za-z0-9._:-]+$', 'maxLength': 200, 'minLength': 8, 'description': 'Stable key identifying this generation request. Reuse the SAME key when retrying the same request â\x80\x94 the original job is returned and no second charge is made. Use a NEW key when you deliberately want another generation.'}, 'target_platform': {'enum': ['TikTok', 'Reels', 'YouTube Shorts'], 'type': 'string', 'default': 'TikTok', 'description': 'Platform the episodes are cut for.'}, 'episode_length_seconds': {'anyOf': [{'type': 'integer', 'maximum': 300, 'exclusiveMinimum': 0}, {'type': 'null'}], 'description': 'Target length of each episode, in seconds. null to let the model choose.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['shot_id', 'short_shot_number', 'idempotency_key'], 'properties': {'shot_id': {'type': 'string', 'description': 'Shot id.'}, 'idempotency_key': {'type': 'string', 'pattern': '^[A-Za-z0-9._:-]+$', 'maxLength': 200, 'minLength': 8, 'description': 'Stable key identifying this generation request. Reuse the SAME key when retrying the same request â\x80\x94 the original job is returned and no second charge is made. Use a NEW key when you deliberately want another generation.'}, 'short_shot_number': {'type': 'integer', 'description': 'Short shot number within the shot.'}, 'reference_images_base64': {'type': 'array', 'items': {'type': 'object', 'required': ['filename', 'image_base64'], 'properties': {'filename': {'type': 'string', 'maxLength': 255, 'minLength': 1, 'description': 'File name to send it under, e.g. scene-1-radio-prop.jpg.'}, 'image_base64': {'type': 'string', 'maxLength': 34000000, 'minLength': 1, 'description': 'The image bytes, base64-encoded. No data: URI prefix.'}}, 'additionalProperties': False}, 'maxItems': 3, 'description': 'Images to send as bytes. PNG, JPEG and WebP only; the bytes are sniffed, so the filename extension alone will not get a non-image through. Keep them small â\x80\x94 a 720x1280 JPEG is roughly 40-130KB of base64.'}, 'reference_image_asset_ids': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['shot_id', 'idempotency_key'], 'properties': {'model': {'type': 'string', 'description': 'Video model override.'}, 'shot_id': {'type': 'string', 'description': 'Shot id.'}, 'idempotency_key': {'type': 'string', 'pattern': '^[A-Za-z0-9._:-]+$', 'maxLength': 200, 'minLength': 8, 'description': 'Stable key identifying this generation request. Reuse the SAME key when retrying the same request â\x80\x94 the original job is returned and no second charge is made. Use a NEW key when you deliberately want another generation.'}, 'short_shot_number': {'type': 'integer', 'description': 'Target a specific short shot.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['project_id'], 'properties': {'project_id': {'type': 'string', 'description': 'Project id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['character_id'], 'properties': {'character_id': {'type': 'string', 'description': 'Character id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['character_id'], 'properties': {'character_id': {'type': 'string', 'description': 'Character id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['episode_id'], 'properties': {'episode_id': {'type': 'string', 'description': 'Episode id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['project_id', 'episode_id'], 'properties': {'episode_id': {'type': 'string', 'description': 'Episode id.'}, 'project_id': {'type': 'string', 'description': 'Project id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['episode_id'], 'properties': {'episode_id': {'type': 'string', 'description': 'Episode id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['job_id'], 'properties': {'job_id': {'type': 'string', 'description': 'Job id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location_id'], 'properties': {'location_id': {'type': 'string', 'description': 'Location id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['project_id'], 'properties': {'project_id': {'type': 'string', 'description': 'Project id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['project_id'], 'properties': {'project_id': {'type': 'string', 'description': 'Project id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['project_id'], 'properties': {'project_id': {'type': 'string', 'description': 'Project id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['project_id'], 'properties': {'project_id': {'type': 'string', 'description': 'Project id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['project_id'], 'properties': {'project_id': {'type': 'string', 'description': 'Project id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['project_id', 'episode_id', 'scene_number'], 'properties': {'episode_id': {'type': 'string', 'description': 'Episode id.'}, 'project_id': {'type': 'string', 'description': 'Project id.'}, 'scene_number': {'type': 'integer', 'description': 'Scene number.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['episode_id'], 'properties': {'episode_id': {'type': 'string', 'description': 'Episode id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['project_id'], 'properties': {'project_id': {'type': 'string', 'description': 'Project id.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['shot_id'], 'properties': {'shot_id': {'type': 'string', 'description': 'Shot id (episode_shots row).'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['shot_id', 'asset_id'], 'properties': {'shot_id': {'type': 'string', 'description': 'Shot id (episode_shots row) the reference is attached to.'}, 'asset_id': {'type': 'string', 'description': 'Id of the continuity reference to remove, from list_shot_continuity_references.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location_id', 'patch'], 'properties': {'patch': {'type': 'object', 'properties': {'mood': {'type': ['string', 'null']}, 'name': {'type': 'string', 'minLength': 1}, 'recurring': {'type': 'boolean'}, 'user_prompt': {'type': ['string', 'null']}, 'aspect_ratio': {'type': ['string', 'null']}, 'visual_style': {'type': ['string', 'null']}, 'location_type': {'type': ['string', 'null']}, 'visual_prompt': {'type': 'string', 'minLength': 1}, 'spatial_layout': {'anyOf': [{'type': 'object', 'required': ['layout_summary'], 'properties': {'props': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'zone', 'height', 'description'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'zone': {'type': 'string'}, 'height': {'type': 'string'}, 'movable': {'type': 'boolean', 'default': False}, 'key_prop': {'type': 'boolean'}, 'description': {'type': 'string'}, 'co_located_with': {'type': 'array', 'items': {'type': 'string'}, 'default': []}}, 'additionalProperties': False}, 'default': []}, 'zones': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'description'], 'properties': {'id': {'type': 'string'}, 'adjacent_to': {'type': 'array', 'items': {'type': 'string'}, 'default': []}, 'description': {'type': 'string'}}, 'additionalProperties': False}, 'default': []}, 'layout_summary': {'type': 'string'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'short_description': {'type': ['string', 'null']}, 'appears_in_episodes': {'type': 'array', 'items': {'type': 'integer', 'exclusiveMinimum': 0}}}, 'description': 'Fields to change. Send only what you are changing.', 'additionalProperties': False}, 'location_id': {'type': 'string', 'description': 'Location id to update.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['shot_id', 'patch'], 'properties': {'patch': {'type': 'object', 'properties': {'title': {'anyOf': [{'type': 'string', 'minLength': 1}, {'type': 'null'}]}, 'dialogue': {'type': 'array', 'items': {'type': 'object', 'required': ['character', 'line', 'emotion', 'delivery_note'], 'properties': {'line': {'type': 'string'}, 'emotion': {'type': 'string'}, 'line_id': {'type': 'string'}, 'character': {'type': 'string'}, 'delivery_note': {'type': 'string'}}, 'additionalProperties': False}}, 'location': {'type': ['string', 'null']}, 'shot_size': {'type': ['string', 'null']}, 'characters': {'type': 'array', 'items': {'type': 'string'}}, 'composition': {'type': ['string', 'null']}, 'script_text': {'type': 'string', 'minLength': 1}, 'time_of_day': {'type': ['string', 'null']}, 'camera_angle': {'type': ['string', 'null']}, 'camera_setup': {'anyOf': [{'type': 'object', 'required': ['shot_size', 'subject_movement', 'visual_purpose', 'short_shots'], 'properties': {'shot_size': {'type': 'string'}, 'short_shots': {'type': 'array', 'items': {'type': 'object', 'required': ['shot_number', 'duration_seconds', 'shot_size', 'action', 'subject_movement', 'dialogue_covered', 'visual_purpose'], 'properties': {'action': {'type': 'string'}, 'location': {'type': 'string'}, 'beat_type': {'enum': ['establishing', 'entrance', 'exit', 'movement', 'prop_interaction', 'insert', 'reveal', 'blocking', 'reaction', 'decision', 'dialogue', 'transition', 'cliffhanger'], 'type': 'string'}, 'end_state': {'type': ['string', 'null']}, 'shot_size': {'type': 'string'}, 'shot_number': {'type': 'number'}, 'start_state': {'type': ['string', 'null']}, 'visual_purpose': {'type': 'string'}, 'background_view': {'anyOf': [{'type': 'object', 'required': ['location_name', 'view_name', 'background_description', 'camera_facing', 'continuity_note'], 'properties': {'image_url': {'type': ['string', 'null']}, 'view_name': {'type': 'string'}, 'depth_layout': {'type': ['string', 'null']}, 'camera_facing': {'type': 'string'}, 'location_name': {'type': 'string'}, 'continuity_note': {'type': 'string'}, 'reference_usage': {'type': ['string', 'null']}, 'visible_anchors': {'type': 'array', 'items': {'type': 'string'}}, 'generated_asset_id': {'type': ['string', 'null']}, 'lighting_description': {'type': ['string', 'null']}, 'reference_description': {'type': ['string', 'null']}, 'background_description': {'type': 'string'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'dialogue_covered': {'type': 'array', 'items': {'anyOf': [{'type': 'string'}, {'$ref': '#/properties/patch/properties/dialogue/items'}]}}, 'duration_seconds': {'type': 'number'}, 'spatial_geometry': {'anyOf': [{'type': 'object', 'required': ['location_axis', 'subject_start_zone', 'subject_end_zone', 'subject_travel_direction', 'camera_zone', 'camera_facing_direction', 'camera_subject_relationship', 'background_visible_direction', 'consistency_note'], 'properties': {'camera_zone': {'type': 'string'}, 'location_axis': {'type': 'string'}, 'consistency_note': {'type': 'string'}, 'interaction_axis': {'type': 'string'}, 'subject_end_zone': {'type': 'string'}, 'subject_start_zone': {'type': 'string'}, 'camera_facing_direction': {'type': 'string'}, 'subject_travel_direction': {'type': 'string'}, 'camera_subject_relationship': {'type': 'string'}, 'background_visible_direction': {'type': 'string'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'subject_movement': {'type': 'string'}, 'camera_setup_detail': {'type': 'object', 'required': ['camera_position', 'camera_angle', 'camera_movement'], 'properties': {'camera_angle': {'type': 'string'}, 'camera_movement': {'type': 'string'}, 'camera_position': {'type': 'string'}, 'subject_orientation': {'type': 'string'}, 'subject_orientations': {'type': 'array', 'items': {'type': 'object', 'required': ['subject', 'orientation_to_camera'], 'properties': {'subject': {'type': 'string'}, 'looking_at': {'type': 'string'}, 'orientation_to_camera': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}, 'background_people_description': {'type': ['string', 'null']}, 'post_dialogue_visual_progression': {'type': ['string', 'null']}}, 'additionalProperties': False}}, 'visual_purpose': {'type': 'string'}, 'subject_movement': {'type': 'string'}}, 'additionalProperties': False}, {'type': 'null'}]}, 'scene_purpose': {'type': ['string', 'null']}, 'scene_setting': {'type': ['string', 'null']}, 'subtitle_text': {'type': ['string', 'null']}, 'omit_subtitles': {'type': 'boolean'}, 'audio_direction': {'type': ['string', 'null']}, 'camera_movement': {'type': ['string', 'null']}, 'camera_direction': {'type': ['string', 'null']}, 'duration_seconds': {'type': 'integer', 'maximum': 60, 'minimum': 1}, 'source_scene_number': {'anyOf': [{'type': 'integer', 'minimum': 1}, {'type': 'null'}]}, 'referenced_location_ids': {'type': 'array', 'items': {'type': 'string', 'format': 'uuid'}}, 'referenced_character_ids': {'type': 'array', 'items': {'type': 'string', 'format': 'uuid'}}, 'referenced_character_look_ids': {'type': 'array', 'items': {'type': 'string', 'format': 'uuid'}}}, 'description': 'Fields to change. Send only what you are changing. Edit dialogue via camera_setup.short_shots[].dialogue_covered, not the deprecated `dialogue`.', 'additionalProperties': False}, 'shot_id': {'type': 'string', 'description': 'Shot id (episode_shots row) to update.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['shot_id', 'asset_id', 'guidance'], 'properties': {'shot_id': {'type': 'string', 'description': 'Shot id (episode_shots row) the reference is attached to.'}, 'asset_id': {'type': 'string', 'description': 'Id of the continuity reference to update, from list_shot_continuity_references.'}, 'guidance': {'anyOf': [{'type': 'string', 'maxLength': 1000}, {'type': 'null'}], 'description': 'How the video model should use this reference, e.g. which positions or props to match and what to ignore. Send null or an empty string to clear it.'}}, 'additionalProperties': False}
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['shot_id', 'image_base64', 'filename'], 'properties': {'shot_id': {'type': 'string', 'description': 'Shot id (episode_shots row) to attach the reference to.'}, 'filename': {'type': 'string', 'maxLength': 255, 'minLength': 1, 'description': 'File name to store it under, e.g. scene-1-last-frame.jpg.'}, 'guidance': {'type': 'string', 'maxLength': 1000, 'description': 'How the video model should use this reference, e.g. which positions or props to match and what to ignore. Saved on the reference and sent with every later generation of the shot.'}, 'image_base64': {'type': 'string', 'maxLength': 34000000, 'minLength': 1, 'description': 'The image bytes, base64-encoded. No data: URI prefix.'}}, 'additionalProperties': False}
Recent tool changes
Similar MCP servers
MiOffice — AI-Powered Workspace Studio
Provides browser-based tools for processing PDFs, images, video, and audio, including generation, enhancement, conversion, transc…
BlitzReels Video Editor
Creates and edits short-form videos, including timelines, captions, transitions, AI-generated visuals, music, voiceovers, sound e…
Morpha
Enables creating, animating, and exporting layered short-form video projects.
switch
Enables management and exploration of an account-scoped library of AI-generated images and videos.
framesail
Creates long-form YouTube videos through script generation, storyboarding, visual assets, voiceover, music, scene composition, an…
Magnific
Provides image enhancement and design tools, AI image and audio generation, text-to-speech, creation management, and reusable cre…
Uwear
Supports AI fashion photoshoot production with garments, outfits, avatars, locations, art direction, image generation, backdrops,…
Creative Claw
Generates and edits branded images, video, audio, speech, and 3D-related creative assets, with media processing and reusable them…