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 185ad8f4adfa21ae055b5bd6f97968d9044480d1
Public contract commit d2ab41fab4088c07c0f6b924fa4f3c63481b936a
Public contract SHA-256 2365c73c2aef7b9f85e8434d8e29ea29f40824bc3a46a72a356155ea328757fc
Captured 2026-10-29T03:35:56.855Z. 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
[]