episode_camera_group_set
Group episode cameras
Explicitly assigns synchronized camera angles in one editable Episode to a stable camera group: a new opaque group when camera_group_key is omitted, an existing Episode group, or a backfill of the exact key already carried by every selected angle's active Footage-session membership. This changes only camera identity/label projection: synchronization, angle IDs, Program ranges, preview, and render resolution remain unchanged. The revision-guarded receipt retains every prior key and label for reversal.
Surface: Default model and app
Product release eb8538f4a297f331d0399351c1e175bffcd212d2
Public contract commit 20688e11af473a363145ed880d5019c90a7ec1e2
Public contract SHA-256 87a94b85a84dc19245fc03f9b544c70d64bd9f5e08585dcccb38157cace5700d
Captured 2026-10-04T11:55:45.577Z. Review or improve this contract on GitHub.
These blocks show the complete MCP descriptors captured from serving Rails. Security schemes and resource URIs can differ by connected host.
Default model descriptor
{
"name": "episode_camera_group_set",
"title": "Group episode cameras",
"description": "Explicitly assigns synchronized camera angles in one editable Episode to a stable camera group: a new opaque group when camera_group_key is omitted, an existing Episode group, or a backfill of the exact key already carried by every selected angle's active Footage-session membership. This changes only camera identity/label projection: synchronization, angle IDs, Program ranges, preview, and render resolution remain unchanged. The revision-guarded receipt retains every prior key and label for reversal.",
"inputSchema": {
"type": "object",
"properties": {
"episode_id": {
"type": "string",
"description": "Editable Episode public ID."
},
"angle_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 200,
"description": "Angles that share the group."
},
"camera_group_key": {
"type": "string",
"description": "Optional existing group key from this Episode; a new one is created when omitted."
},
"camera_label": {
"type": "string",
"description": "Optional human-facing group label; never used as identity."
},
"expected_revision": {
"type": "integer",
"description": "Current Episode structural revision."
},
"idempotency_key": {
"type": "string",
"description": "Caller-stable retry key for this exact regrouping."
},
"reason": {
"type": "string",
"description": "Required evidence or explicit human instruction supporting the grouping."
}
},
"required": [
"episode_id",
"angle_ids",
"expected_revision",
"idempotency_key",
"reason"
],
"additionalProperties": false
},
"annotations": {
"title": "Group episode cameras",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "noauth"
}
],
"_meta": {
"securitySchemes": [
{
"type": "noauth"
}
],
"ui": {
"visibility": [
"model",
"app"
]
},
"openai/widgetAccessible": true
}
}App descriptor
{
"name": "episode_camera_group_set",
"title": "Group episode cameras",
"description": "Explicitly assigns synchronized camera angles in one editable Episode to a stable camera group: a new opaque group when camera_group_key is omitted, an existing Episode group, or a backfill of the exact key already carried by every selected angle's active Footage-session membership. This changes only camera identity/label projection: synchronization, angle IDs, Program ranges, preview, and render resolution remain unchanged. The revision-guarded receipt retains every prior key and label for reversal.",
"inputSchema": {
"type": "object",
"properties": {
"episode_id": {
"type": "string",
"description": "Editable Episode public ID."
},
"angle_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 200,
"description": "Angles that share the group."
},
"camera_group_key": {
"type": "string",
"description": "Optional existing group key from this Episode; a new one is created when omitted."
},
"camera_label": {
"type": "string",
"description": "Optional human-facing group label; never used as identity."
},
"expected_revision": {
"type": "integer",
"description": "Current Episode structural revision."
},
"idempotency_key": {
"type": "string",
"description": "Caller-stable retry key for this exact regrouping."
},
"reason": {
"type": "string",
"description": "Required evidence or explicit human instruction supporting the grouping."
}
},
"required": [
"episode_id",
"angle_ids",
"expected_revision",
"idempotency_key",
"reason"
],
"additionalProperties": false
},
"annotations": {
"title": "Group episode cameras",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "noauth"
}
],
"_meta": {
"securitySchemes": [
{
"type": "noauth"
}
],
"ui": {
"visibility": [
"model",
"app"
]
},
"openai/widgetAccessible": true
},
"outputSchema": {
"type": "object",
"properties": {
"episode_id": {
"type": "string"
},
"revision": {
"type": "integer"
},
"camera_group_key": {
"type": "string"
},
"camera_label": {
"type": [
"string",
"null"
]
},
"angles": {
"type": "array",
"items": {
"type": "object"
}
},
"prior_anchors": {
"type": "array",
"items": {
"type": "object"
}
},
"audit_receipt_id": {
"type": "string"
},
"already_applied": {
"type": "boolean"
},
"render_stale": {
"type": "boolean"
}
},
"required": [],
"additionalProperties": false
}
}Live Workspace descriptor
{
"name": "episode_camera_group_set",
"title": "Group episode cameras",
"description": "Explicitly assigns synchronized camera angles in one editable Episode to a stable camera group: a new opaque group when camera_group_key is omitted, an existing Episode group, or a backfill of the exact key already carried by every selected angle's active Footage-session membership. This changes only camera identity/label projection: synchronization, angle IDs, Program ranges, preview, and render resolution remain unchanged. The revision-guarded receipt retains every prior key and label for reversal.",
"inputSchema": {
"type": "object",
"properties": {
"episode_id": {
"type": "string",
"description": "Editable Episode public ID."
},
"angle_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 200,
"description": "Angles that share the group."
},
"camera_group_key": {
"type": "string",
"description": "Optional existing group key from this Episode; a new one is created when omitted."
},
"camera_label": {
"type": "string",
"description": "Optional human-facing group label; never used as identity."
},
"expected_revision": {
"type": "integer",
"description": "Current Episode structural revision."
},
"idempotency_key": {
"type": "string",
"description": "Caller-stable retry key for this exact regrouping."
},
"reason": {
"type": "string",
"description": "Required evidence or explicit human instruction supporting the grouping."
}
},
"required": [
"episode_id",
"angle_ids",
"expected_revision",
"idempotency_key",
"reason"
],
"additionalProperties": false
},
"annotations": {
"title": "Group episode cameras",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "noauth"
}
],
"_meta": {
"securitySchemes": [
{
"type": "noauth"
}
]
},
"outputSchema": {
"type": "object",
"properties": {
"episode_id": {
"type": "string"
},
"revision": {
"type": "integer"
},
"camera_group_key": {
"type": "string"
},
"camera_label": {
"type": [
"string",
"null"
]
},
"angles": {
"type": "array",
"items": {
"type": "object"
}
},
"prior_anchors": {
"type": "array",
"items": {
"type": "object"
}
},
"audit_receipt_id": {
"type": "string"
},
"already_applied": {
"type": "boolean"
},
"render_stale": {
"type": "boolean"
},
"workspace_binding": {
"type": "object",
"properties": {
"schema": {
"type": "string",
"enum": [
"bitterclip.workspace-binding.v2"
]
},
"mode": {
"type": "string",
"enum": [
"live_workspace"
]
},
"project_id": {
"type": "string"
},
"target_kind": {
"type": "string",
"enum": [
"episode",
"clip"
]
},
"target_id": {
"type": "string"
},
"revision": {
"type": "integer"
},
"draft_revision": {
"type": "string"
},
"workspace_url": {
"type": "string"
},
"output_id": {
"type": "string"
},
"output_status": {
"type": "string",
"enum": [
"missing",
"stale",
"rendering",
"ready",
"failed"
]
},
"output_revision": {
"type": "integer"
},
"parent_episode_id": {
"type": "string"
}
},
"required": [
"schema",
"mode",
"target_kind",
"target_id",
"revision",
"draft_revision",
"workspace_url",
"output_status"
],
"additionalProperties": false
}
},
"required": [],
"additionalProperties": false
}
}Errors
[
"composition_not_found",
"angle_not_found",
"stale_composition_revision",
"idempotency_conflict",
"invalid_input"
]Examples
[]