open_recording
Open a recording for editing
Use this when the user wants to open, edit, trim, or pick a clip from a specific recording. Opens the recording as an episode (a composition-of-one) in the composite TRANSCRIPT editor — the full transcript (speaker lanes + waveform), where the user selects/trims a range and renders. To recommend clips, first read the episode with episode_read to choose a candidate, then episode_zoom over that range to verify a clean boundary before placing the selection. Use start_line/end_line or start_word_id/end_word_id with transcript_fingerprint to identify the semantic moment; use explicit start_seconds/end_seconds for the actual media boundaries when audio valleys, silence, visual resting points, scene changes, visible payoff, or trailing breath make a better cut than the exact word edge. The server creates suggested Moments shown on the transcript for review, trimming, save/dismiss, and export.
Surface: App-only
Product release 1dce717408a55fac1047e7d779177fa3ef8ede51
Public contract commit 1ce47f7857ae3d9b6933fe83d5c33de3ae5efc64
Public contract SHA-256 241d47d25e4b4c1dae9d2263793874d06fc4ba7bc3c78d4cf2bc63fbb32ed7dc
Captured 2026-09-24T16:39:30.100Z. 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.
App descriptor
{
"name": "open_recording",
"title": "Open a recording for editing",
"description": "Use this when the user wants to open, edit, trim, or pick a clip from a specific recording. Opens the recording as an episode (a composition-of-one) in the composite TRANSCRIPT editor — the full transcript (speaker lanes + waveform), where the user selects/trims a range and renders. To recommend clips, first read the episode with episode_read to choose a candidate, then episode_zoom over that range to verify a clean boundary before placing the selection. Use start_line/end_line or start_word_id/end_word_id with transcript_fingerprint to identify the semantic moment; use explicit start_seconds/end_seconds for the actual media boundaries when audio valleys, silence, visual resting points, scene changes, visible payoff, or trailing breath make a better cut than the exact word edge. The server creates suggested Moments shown on the transcript for review, trimming, save/dismiss, and export.",
"inputSchema": {
"type": "object",
"properties": {
"recording_id": {
"type": "string",
"description": "The recording public ID to open."
},
"project_id": {
"type": "string",
"description": "Optional parent project public ID for context."
},
"selections": {
"type": "array",
"description": "Optional candidate moments to pre-resolve for triage. Use transcript lines or word IDs as semantic anchors. Choose the actual review range from all available evidence; pass explicit start_seconds/end_seconds when pre-roll, trailing breath, visible payoff/resolution, silence, scene timing, or nearby marker evidence makes a better boundary than the exact word edge. The server creates a `suggested` Moment; unresolved selectors come back in selection_results.",
"items": {
"type": "object",
"properties": {
"start_line": {
"type": "integer",
"description": "First numbered transcript line (a line handle from episode_read)."
},
"end_line": {
"type": "integer",
"description": "Last numbered transcript line (a line handle from episode_read)."
},
"start_seconds": {
"type": "number",
"description": "Explicit review-range start in source seconds. When provided with end_seconds, seconds define the actual moment boundary and may intentionally differ from line/word anchors."
},
"end_seconds": {
"type": "number",
"description": "Explicit review-range end in source seconds. Use to include trailing breath, silence, visual payoff, or a marker-backed quiet cut after the last word."
},
"transcript_fingerprint": {
"type": "string",
"description": "Required when selecting by line or word ID; the recording's current line-segmentation fingerprint (from episode_read)."
},
"segmentation_version": {
"type": "string",
"description": "Optional segmentation version for the recording's current line segmentation."
},
"start_word_id": {
"type": "string",
"description": "First word_id anchor (a word handle from episode_zoom)."
},
"end_word_id": {
"type": "string",
"description": "Last word_id anchor (a word handle from episode_zoom)."
},
"title": {
"type": "string",
"description": "Punchy title, <= 8 words."
},
"description": {
"type": "string",
"description": "One sentence on why it's worth clipping."
}
}
}
}
},
"required": [
"recording_id"
],
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"securitySchemes": [
{
"type": "noauth"
}
],
"_meta": {
"securitySchemes": [
{
"type": "noauth"
}
],
"ui": {
"visibility": [
"app"
]
},
"openai/widgetAccessible": true,
"openai/visibility": "private"
},
"outputSchema": {
"type": "object",
"properties": {
"recording": {
"type": "object"
},
"media": {
"type": "object"
},
"composition": {
"type": "object",
"description": "Seeded composition-of-one (the recording as one segment) the transcript editor opens on."
},
"workspace_navigation": {
"type": "object",
"additionalProperties": false,
"required": [
"schema",
"target",
"route"
],
"properties": {
"schema": {
"type": "string",
"enum": [
"bitterclip.workspace-nav.v1"
]
},
"target": {
"type": "object",
"additionalProperties": false,
"required": [
"kind",
"id"
],
"properties": {
"kind": {
"type": "string",
"enum": [
"episode",
"clip"
]
},
"id": {
"type": "string",
"pattern": "^comp_[A-Za-z0-9_-]{1,120}$"
}
}
},
"route": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"mode"
],
"properties": {
"name": {
"type": "string",
"enum": [
"composition"
]
},
"mode": {
"type": "string",
"enum": [
"review"
]
}
}
}
}
},
"editor_document": {
"type": "object",
"description": "Versioned application document consumed by the shared editor."
},
"speaker_legend": {
"type": "array"
},
"speaker_model_context": {
"type": "object",
"description": "Compact speaker identity context shared with the model while the full speaker evidence stays in result metadata."
},
"moments": {
"type": "array"
},
"selection_results": {
"type": [
"array",
"null"
],
"description": "Per-selection outcome when selections were supplied: ok:true with moment_id, or ok:false with a reason (stale_transcript, transcript_fingerprint_required, line not found, start/end word not found) so you can recover by re-reading the episode with episode_read.",
"items": {
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"moment_id": {
"type": "string"
},
"title": {
"type": "string"
},
"start_seconds": {
"type": "number"
},
"end_seconds": {
"type": "number"
},
"start_line": {
"type": "integer"
},
"end_line": {
"type": "integer"
},
"start_word_id": {
"type": "string"
},
"end_word_id": {
"type": "string"
},
"reason": {
"type": "string"
},
"count": {
"type": "integer"
}
},
"required": [
"ok"
]
}
},
"route": {
"type": "object"
}
},
"required": [],
"additionalProperties": false
}
}Errors
[
"recording_not_found",
"episode_changed_during_read",
"invalid_input"
]Examples
[]