episode_read
Read an episode
Reads an EPISODE (comp_...) as stitched transcript prose with inline navigation hints, visual evidence, segment manifest, speaker legend (per-speaker word share/talk_seconds — "who spoke how much" is answerable here), and duration/revision. The Program map reports each source-backed occurrence's current caption treatment and each Junction's current Cut, Crossfade, or Produced transition treatment, with a Crossfade's look and, per Junction, the looks the selected renderer draws there (looks; empty where a crossfade can't join). The Camera Program reports exact Episode-local explicit picture decisions—including source-linked synchronized versus continuous picture time—plus access-scoped inherited/automatic intervals the renderer currently selects, so `none` means no local override rather than necessarily base footage. The Picture Program reports bounded exact simultaneous-layout reauthoring segments and Episode-scoped evidence; its continuation also carries `picture_read_token`. Typed opener/outro occurrences include safe current `identity_customization` state. Each footage occurrence and placed photo says it can host picture layers (layer_host) and lists its layers compactly: id, window in its own seconds, the recording_id and kind (photo or video) shown, and placement (full, or box with its frame fractions). A parent Episode read also returns bounded derived-Clip titles and exact reopen handles, so a named existing Clip is found through its likely parent; docs and speaker tools do not list Clip titles. For Project content-evidence asks, transcript_search returns the windows this read takes as `window`. Also ACCEPTS a recording handle (src_...) and reads it as that recording's episode-of-one. All timestamps are EPISODE time unless a field ends in _source. Long transcripts are PAGINATED, in sequence via `page`. Every continuation (page or picture_page after 1) requires the `expected_revision` and `expected_program_digest` its hint prints (plus `picture_read_token` when the hint carries one); a missing or changed pin refuses, and the read restarts at page 1. The pins hold one Program revision and digest (and Picture read token), not the transcript: a retranscription between pages can pass them and show as changed words, and page 1 reflects the current transcript. Transcript words and times are approximate read-only semantic locators; a structural boundary requires source media evidence from a narrow episode_zoom or exact episode_sample_frames projection:"original" samples. Program and angle previews never authorize structural boundaries. This read opens nothing: opening is workspace_open, and saved reviewable Moments are review_points_place with exact Episode-time ranges and the revision returned here. A timestamp named in chat is neither an open nor a saved review point. Returns prose only, never word-level rows. Does not modify anything.
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_read",
"title": "Read an episode",
"description": "Reads an EPISODE (comp_...) as stitched transcript prose with inline navigation hints, visual evidence, segment manifest, speaker legend (per-speaker word share/talk_seconds — \"who spoke how much\" is answerable here), and duration/revision. The Program map reports each source-backed occurrence's current caption treatment and each Junction's current Cut, Crossfade, or Produced transition treatment, with a Crossfade's look and, per Junction, the looks the selected renderer draws there (looks; empty where a crossfade can't join). The Camera Program reports exact Episode-local explicit picture decisions—including source-linked synchronized versus continuous picture time—plus access-scoped inherited/automatic intervals the renderer currently selects, so `none` means no local override rather than necessarily base footage. The Picture Program reports bounded exact simultaneous-layout reauthoring segments and Episode-scoped evidence; its continuation also carries `picture_read_token`. Typed opener/outro occurrences include safe current `identity_customization` state. Each footage occurrence and placed photo says it can host picture layers (layer_host) and lists its layers compactly: id, window in its own seconds, the recording_id and kind (photo or video) shown, and placement (full, or box with its frame fractions). A parent Episode read also returns bounded derived-Clip titles and exact reopen handles, so a named existing Clip is found through its likely parent; docs and speaker tools do not list Clip titles. For Project content-evidence asks, transcript_search returns the windows this read takes as `window`. Also ACCEPTS a recording handle (src_...) and reads it as that recording's episode-of-one. All timestamps are EPISODE time unless a field ends in _source. Long transcripts are PAGINATED, in sequence via `page`. Every continuation (page or picture_page after 1) requires the `expected_revision` and `expected_program_digest` its hint prints (plus `picture_read_token` when the hint carries one); a missing or changed pin refuses, and the read restarts at page 1. The pins hold one Program revision and digest (and Picture read token), not the transcript: a retranscription between pages can pass them and show as changed words, and page 1 reflects the current transcript. Transcript words and times are approximate read-only semantic locators; a structural boundary requires source media evidence from a narrow episode_zoom or exact episode_sample_frames projection:\"original\" samples. Program and angle previews never authorize structural boundaries. This read opens nothing: opening is workspace_open, and saved reviewable Moments are review_points_place with exact Episode-time ranges and the revision returned here. A timestamp named in chat is neither an open nor a saved review point. Returns prose only, never word-level rows. Does not modify anything.",
"inputSchema": {
"type": "object",
"properties": {
"episode_id": {
"type": "string",
"description": "The episode public ID, such as comp_...; a recording src_... handle is also accepted for a recording's episode-of-one."
},
"composition_id": {
"type": "string",
"description": "Backward-compatible alias for episode_id."
},
"window": {
"type": "object",
"description": "Optional EPISODE-time span to read for long episodes. Lines overlapping the window are returned; absent means the whole episode.",
"properties": {
"from": {
"type": "number",
"description": "Window start in episode seconds; absent means an open start."
},
"to": {
"type": "number",
"description": "Window end in episode seconds; absent means an open end."
}
}
},
"page": {
"type": "integer",
"description": "1-indexed page of the transcript prose (default 1). A long transcript is split into M pages so each stays under the host's tool-output size cap; the returned page's header says 'page N of M' and its footer says how to fetch the next. Composes with `window`: `window` picks the time range, `page` paginates that range's prose."
},
"picture_page": {
"type": "integer",
"minimum": 1,
"description": "Independent 1-indexed page of bounded Picture Scene and Picture Evidence summaries. Continuations are the exact ones returned in Picture Program prose."
},
"expected_revision": {
"type": "integer",
"minimum": 0,
"description": "Required on every continuation (page or picture_page after 1): the revision the previous page's continuation hint prints. A changed Episode refuses and the read restarts at page 1."
},
"expected_program_digest": {
"type": "string",
"pattern": "^[0-9a-f]{64}$",
"description": "Required with expected_revision on every continuation: the Program digest the previous page's continuation hint prints. It also moves on a same-revision occurrence change such as align_span; a changed Program refuses and the read restarts at page 1."
},
"picture_read_token": {
"type": "string",
"pattern": "^[0-9a-f]{64}$",
"description": "Required exact media-generation pin returned by Picture Program page 1 when following a Picture or transcript continuation that carries Picture content."
}
},
"required": [],
"additionalProperties": false,
"anyOf": [
{
"required": [
"episode_id"
]
},
{
"required": [
"composition_id"
]
}
]
},
"annotations": {
"title": "Read an episode",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "noauth"
}
],
"_meta": {
"securitySchemes": [
{
"type": "noauth"
}
]
}
}App descriptor
{
"name": "episode_read",
"title": "Read an episode",
"description": "Reads an EPISODE (comp_...) as stitched transcript prose with inline navigation hints, visual evidence, segment manifest, speaker legend (per-speaker word share/talk_seconds — \"who spoke how much\" is answerable here), and duration/revision. The Program map reports each source-backed occurrence's current caption treatment and each Junction's current Cut, Crossfade, or Produced transition treatment, with a Crossfade's look and, per Junction, the looks the selected renderer draws there (looks; empty where a crossfade can't join). The Camera Program reports exact Episode-local explicit picture decisions—including source-linked synchronized versus continuous picture time—plus access-scoped inherited/automatic intervals the renderer currently selects, so `none` means no local override rather than necessarily base footage. The Picture Program reports bounded exact simultaneous-layout reauthoring segments and Episode-scoped evidence; its continuation also carries `picture_read_token`. Typed opener/outro occurrences include safe current `identity_customization` state. Each footage occurrence and placed photo says it can host picture layers (layer_host) and lists its layers compactly: id, window in its own seconds, the recording_id and kind (photo or video) shown, and placement (full, or box with its frame fractions). A parent Episode read also returns bounded derived-Clip titles and exact reopen handles, so a named existing Clip is found through its likely parent; docs and speaker tools do not list Clip titles. For Project content-evidence asks, transcript_search returns the windows this read takes as `window`. Also ACCEPTS a recording handle (src_...) and reads it as that recording's episode-of-one. All timestamps are EPISODE time unless a field ends in _source. Long transcripts are PAGINATED, in sequence via `page`. Every continuation (page or picture_page after 1) requires the `expected_revision` and `expected_program_digest` its hint prints (plus `picture_read_token` when the hint carries one); a missing or changed pin refuses, and the read restarts at page 1. The pins hold one Program revision and digest (and Picture read token), not the transcript: a retranscription between pages can pass them and show as changed words, and page 1 reflects the current transcript. Transcript words and times are approximate read-only semantic locators; a structural boundary requires source media evidence from a narrow episode_zoom or exact episode_sample_frames projection:\"original\" samples. Program and angle previews never authorize structural boundaries. This read opens nothing: opening is workspace_open, and saved reviewable Moments are review_points_place with exact Episode-time ranges and the revision returned here. A timestamp named in chat is neither an open nor a saved review point. Returns prose only, never word-level rows. Does not modify anything.",
"inputSchema": {
"type": "object",
"properties": {
"episode_id": {
"type": "string",
"description": "The episode public ID, such as comp_...; a recording src_... handle is also accepted for a recording's episode-of-one."
},
"composition_id": {
"type": "string",
"description": "Backward-compatible alias for episode_id."
},
"window": {
"type": "object",
"description": "Optional EPISODE-time span to read for long episodes. Lines overlapping the window are returned; absent means the whole episode.",
"properties": {
"from": {
"type": "number",
"description": "Window start in episode seconds; absent means an open start."
},
"to": {
"type": "number",
"description": "Window end in episode seconds; absent means an open end."
}
}
},
"page": {
"type": "integer",
"description": "1-indexed page of the transcript prose (default 1). A long transcript is split into M pages so each stays under the host's tool-output size cap; the returned page's header says 'page N of M' and its footer says how to fetch the next. Composes with `window`: `window` picks the time range, `page` paginates that range's prose."
},
"picture_page": {
"type": "integer",
"minimum": 1,
"description": "Independent 1-indexed page of bounded Picture Scene and Picture Evidence summaries. Continuations are the exact ones returned in Picture Program prose."
},
"expected_revision": {
"type": "integer",
"minimum": 0,
"description": "Required on every continuation (page or picture_page after 1): the revision the previous page's continuation hint prints. A changed Episode refuses and the read restarts at page 1."
},
"expected_program_digest": {
"type": "string",
"pattern": "^[0-9a-f]{64}$",
"description": "Required with expected_revision on every continuation: the Program digest the previous page's continuation hint prints. It also moves on a same-revision occurrence change such as align_span; a changed Program refuses and the read restarts at page 1."
},
"picture_read_token": {
"type": "string",
"pattern": "^[0-9a-f]{64}$",
"description": "Required exact media-generation pin returned by Picture Program page 1 when following a Picture or transcript continuation that carries Picture content."
}
},
"required": [],
"additionalProperties": false,
"anyOf": [
{
"required": [
"episode_id"
]
},
{
"required": [
"composition_id"
]
}
]
},
"annotations": {
"title": "Read an episode",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "noauth"
}
],
"_meta": {
"securitySchemes": [
{
"type": "noauth"
}
]
}
}Live Workspace descriptor
{
"name": "episode_read",
"title": "Read an episode",
"description": "Reads an EPISODE (comp_...) as stitched transcript prose with inline navigation hints, visual evidence, segment manifest, speaker legend (per-speaker word share/talk_seconds — \"who spoke how much\" is answerable here), and duration/revision. The Program map reports each source-backed occurrence's current caption treatment and each Junction's current Cut, Crossfade, or Produced transition treatment, with a Crossfade's look and, per Junction, the looks the selected renderer draws there (looks; empty where a crossfade can't join). The Camera Program reports exact Episode-local explicit picture decisions—including source-linked synchronized versus continuous picture time—plus access-scoped inherited/automatic intervals the renderer currently selects, so `none` means no local override rather than necessarily base footage. The Picture Program reports bounded exact simultaneous-layout reauthoring segments and Episode-scoped evidence; its continuation also carries `picture_read_token`. Typed opener/outro occurrences include safe current `identity_customization` state. Each footage occurrence and placed photo says it can host picture layers (layer_host) and lists its layers compactly: id, window in its own seconds, the recording_id and kind (photo or video) shown, and placement (full, or box with its frame fractions). A parent Episode read also returns bounded derived-Clip titles and exact reopen handles, so a named existing Clip is found through its likely parent; docs and speaker tools do not list Clip titles. For Project content-evidence asks, transcript_search returns the windows this read takes as `window`. Also ACCEPTS a recording handle (src_...) and reads it as that recording's episode-of-one. All timestamps are EPISODE time unless a field ends in _source. Long transcripts are PAGINATED, in sequence via `page`. Every continuation (page or picture_page after 1) requires the `expected_revision` and `expected_program_digest` its hint prints (plus `picture_read_token` when the hint carries one); a missing or changed pin refuses, and the read restarts at page 1. The pins hold one Program revision and digest (and Picture read token), not the transcript: a retranscription between pages can pass them and show as changed words, and page 1 reflects the current transcript. Transcript words and times are approximate read-only semantic locators; a structural boundary requires source media evidence from a narrow episode_zoom or exact episode_sample_frames projection:\"original\" samples. Program and angle previews never authorize structural boundaries. This read opens nothing: opening is workspace_get_link, and saved reviewable Moments are review_points_place with exact Episode-time ranges and the revision returned here. A timestamp named in chat is neither an open nor a saved review point. Returns prose only, never word-level rows. Does not modify anything.",
"inputSchema": {
"type": "object",
"properties": {
"episode_id": {
"type": "string",
"description": "The episode public ID, such as comp_...; a recording src_... handle is also accepted for a recording's episode-of-one."
},
"composition_id": {
"type": "string",
"description": "Backward-compatible alias for episode_id."
},
"window": {
"type": "object",
"description": "Optional EPISODE-time span to read for long episodes. Lines overlapping the window are returned; absent means the whole episode.",
"properties": {
"from": {
"type": "number",
"description": "Window start in episode seconds; absent means an open start."
},
"to": {
"type": "number",
"description": "Window end in episode seconds; absent means an open end."
}
}
},
"page": {
"type": "integer",
"description": "1-indexed page of the transcript prose (default 1). A long transcript is split into M pages so each stays under the host's tool-output size cap; the returned page's header says 'page N of M' and its footer says how to fetch the next. Composes with `window`: `window` picks the time range, `page` paginates that range's prose."
},
"picture_page": {
"type": "integer",
"minimum": 1,
"description": "Independent 1-indexed page of bounded Picture Scene and Picture Evidence summaries. Continuations are the exact ones returned in Picture Program prose."
},
"expected_revision": {
"type": "integer",
"minimum": 0,
"description": "Required on every continuation (page or picture_page after 1): the revision the previous page's continuation hint prints. A changed Episode refuses and the read restarts at page 1."
},
"expected_program_digest": {
"type": "string",
"pattern": "^[0-9a-f]{64}$",
"description": "Required with expected_revision on every continuation: the Program digest the previous page's continuation hint prints. It also moves on a same-revision occurrence change such as align_span; a changed Program refuses and the read restarts at page 1."
},
"picture_read_token": {
"type": "string",
"pattern": "^[0-9a-f]{64}$",
"description": "Required exact media-generation pin returned by Picture Program page 1 when following a Picture or transcript continuation that carries Picture content."
}
},
"required": [],
"additionalProperties": false,
"anyOf": [
{
"required": [
"episode_id"
]
},
{
"required": [
"composition_id"
]
}
]
},
"annotations": {
"title": "Read an episode",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "noauth"
}
],
"_meta": {
"securitySchemes": [
{
"type": "noauth"
}
]
}
}Errors
[
"composition_not_found",
"stale_composition_revision",
"stale_program_digest",
"stale_picture_read",
"invalid_input"
]Examples
[
{
"label": "See a whole episode before clipping it",
"input": {
"episode_id": "comp_..."
}
}
]