Default model tools

recordings_list

List recordings

Lists standalone recordings (raw source media): the drawer, not the editorial unit. Use this for source/ingest/readiness asks ("latest searchable session", "what uploads are ready?") or to inspect and select recordings inside a project (project_id). A Project reel whose footage spans separate recordings rather than one parent Episode is one episode_create with recording_id ranges and no derived_from_id; recording_sample_frames inspects recording pixels without an Episode. `query` matches title, project, or who is in it ("the latest with Andrew" matches Andrew as a speaker). PAGINATED, newest first: one call returns up to 20 rows and says when more exist; the returned next_cursor (with the same query/project_id) continues it as `cursor`. One listing walk reaches at most the newest 50 recordings — anything older is reachable only by narrowing with query or project_id, and the result states which case applies. Model rows carry both the exact tool-only recording_id and the episode-of-one episode_id, plus captured_at, searchability status/notes, and a compact indexed description. For latest-session asks, the newest `searchability_status:"searchable"` row is the latest searchable session; episode_pending means the Recording may not have an Episode-of-one, not that direct source-time frame inspection must wait. Photos: project_id with media_kind:"photo" lists a Project's Photos and Live Photos as compact rows, up to 100 per page and 500 per listing, each with capture time and offset, Live length, size and shape, description and legible text, plus subject focus, near-duplicate group, sharpness and exposure when preparation recorded them. order:"oldest_first" lists in capture order; photos sharing a similar group are near-duplicates, such as a burst. See one with recording_sample_frames times [0], and place them with episode_create photo rows or episode_edit occurrence.insert. Ordinary composition browsing is episodes_list, and searching what was SAID is transcript_search. Read-only.

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": "recordings_list",
  "title": "List recordings",
  "description": "Lists standalone recordings (raw source media): the drawer, not the editorial unit. Use this for source/ingest/readiness asks (\"latest searchable session\", \"what uploads are ready?\") or to inspect and select recordings inside a project (project_id). A Project reel whose footage spans separate recordings rather than one parent Episode is one episode_create with recording_id ranges and no derived_from_id; recording_sample_frames inspects recording pixels without an Episode. `query` matches title, project, or who is in it (\"the latest with Andrew\" matches Andrew as a speaker). PAGINATED, newest first: one call returns up to 20 rows and says when more exist; the returned next_cursor (with the same query/project_id) continues it as `cursor`. One listing walk reaches at most the newest 50 recordings — anything older is reachable only by narrowing with query or project_id, and the result states which case applies. Model rows carry both the exact tool-only recording_id and the episode-of-one episode_id, plus captured_at, searchability status/notes, and a compact indexed description. For latest-session asks, the newest `searchability_status:\"searchable\"` row is the latest searchable session; episode_pending means the Recording may not have an Episode-of-one, not that direct source-time frame inspection must wait. Photos: project_id with media_kind:\"photo\" lists a Project's Photos and Live Photos as compact rows, up to 100 per page and 500 per listing, each with capture time and offset, Live length, size and shape, description and legible text, plus subject focus, near-duplicate group, sharpness and exposure when preparation recorded them. order:\"oldest_first\" lists in capture order; photos sharing a similar group are near-duplicates, such as a burst. See one with recording_sample_frames times [0], and place them with episode_create photo rows or episode_edit occurrence.insert. Ordinary composition browsing is episodes_list, and searching what was SAID is transcript_search. Read-only.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "Optional case-insensitive filter — returns only recordings whose TITLE, a composited SOURCE TITLE, or a diarized SPEAKER NAME contains this text (substring). The filter scans the FULL catalog before the newest-50 listing window applies, so it also reaches recordings a bare walk cannot. Each kept recording carries a `match_reason` (\"title\" / \"source: …\" / \"speaker: …\") explaining why. Composes with project_id, limit, and cursor. It finds a recording by who is in it or what it's called, e.g. query: \"Andrew\"."
      },
      "project_id": {
        "type": "string",
        "description": "Optional project public ID — scope the list to a single project's recordings."
      },
      "media_kind": {
        "type": "string",
        "enum": [
          "photo",
          "live_photo",
          "video"
        ],
        "description": "Optional kind filter applied before the listing window: photo lists Photos and Live Photos, live_photo only Live Photos, video only time-based Recordings."
      },
      "captured_after": {
        "type": "string",
        "description": "Optional ISO 8601 date or date-time; keeps what was captured at or after it (a Recording without capture evidence dates by its upload)."
      },
      "captured_before": {
        "type": "string",
        "description": "Optional ISO 8601 date or date-time; keeps what was captured before it."
      },
      "order": {
        "type": "string",
        "enum": [
          "newest_first",
          "oldest_first"
        ],
        "description": "Listing order by capture time. Default newest_first; oldest_first reads a trip in the order it happened."
      },
      "limit": {
        "type": "integer",
        "description": "Rows per page. Default 20, which is also the model-context page ceiling (a larger value still pages at 20 with a next_cursor to continue). A photo listing defaults to and caps at 100 rows per page and walks up to 500; a Project-scoped app hydration listing walks up to 500 as well."
      },
      "cursor": {
        "type": "string",
        "description": "Opaque continuation returned as next_cursor by the previous page of this listing. Continuing requires the same query, project_id and filters; without cursor the listing restarts from the first row. Only a returned cursor is valid."
      },
      "result_profile": {
        "type": "string",
        "enum": [
          "app",
          "model"
        ],
        "description": "Caller profile. \"app\" (widgets/apps) keeps full structured rows for hydration; \"model\" returns the complete row story as prose only. Absent means the server default."
      }
    },
    "required": [],
    "additionalProperties": false
  },
  "annotations": {
    "title": "List recordings",
    "readOnlyHint": true,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ],
    "ui": {
      "visibility": [
        "model",
        "app"
      ]
    },
    "openai/widgetAccessible": true
  }
}

App descriptor

{
  "name": "recordings_list",
  "title": "List recordings",
  "description": "Lists standalone recordings (raw source media): the drawer, not the editorial unit. Use this for source/ingest/readiness asks (\"latest searchable session\", \"what uploads are ready?\") or to inspect and select recordings inside a project (project_id). A Project reel whose footage spans separate recordings rather than one parent Episode is one episode_create with recording_id ranges and no derived_from_id; recording_sample_frames inspects recording pixels without an Episode. `query` matches title, project, or who is in it (\"the latest with Andrew\" matches Andrew as a speaker). PAGINATED, newest first: one call returns up to 20 rows and says when more exist; the returned next_cursor (with the same query/project_id) continues it as `cursor`. One listing walk reaches at most the newest 50 recordings — anything older is reachable only by narrowing with query or project_id, and the result states which case applies. Model rows carry both the exact tool-only recording_id and the episode-of-one episode_id, plus captured_at, searchability status/notes, and a compact indexed description. For latest-session asks, the newest `searchability_status:\"searchable\"` row is the latest searchable session; episode_pending means the Recording may not have an Episode-of-one, not that direct source-time frame inspection must wait. Photos: project_id with media_kind:\"photo\" lists a Project's Photos and Live Photos as compact rows, up to 100 per page and 500 per listing, each with capture time and offset, Live length, size and shape, description and legible text, plus subject focus, near-duplicate group, sharpness and exposure when preparation recorded them. order:\"oldest_first\" lists in capture order; photos sharing a similar group are near-duplicates, such as a burst. See one with recording_sample_frames times [0], and place them with episode_create photo rows or episode_edit occurrence.insert. Ordinary composition browsing is episodes_list, and searching what was SAID is transcript_search. Read-only.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "Optional case-insensitive filter — returns only recordings whose TITLE, a composited SOURCE TITLE, or a diarized SPEAKER NAME contains this text (substring). The filter scans the FULL catalog before the newest-50 listing window applies, so it also reaches recordings a bare walk cannot. Each kept recording carries a `match_reason` (\"title\" / \"source: …\" / \"speaker: …\") explaining why. Composes with project_id, limit, and cursor. It finds a recording by who is in it or what it's called, e.g. query: \"Andrew\"."
      },
      "project_id": {
        "type": "string",
        "description": "Optional project public ID — scope the list to a single project's recordings."
      },
      "media_kind": {
        "type": "string",
        "enum": [
          "photo",
          "live_photo",
          "video"
        ],
        "description": "Optional kind filter applied before the listing window: photo lists Photos and Live Photos, live_photo only Live Photos, video only time-based Recordings."
      },
      "captured_after": {
        "type": "string",
        "description": "Optional ISO 8601 date or date-time; keeps what was captured at or after it (a Recording without capture evidence dates by its upload)."
      },
      "captured_before": {
        "type": "string",
        "description": "Optional ISO 8601 date or date-time; keeps what was captured before it."
      },
      "order": {
        "type": "string",
        "enum": [
          "newest_first",
          "oldest_first"
        ],
        "description": "Listing order by capture time. Default newest_first; oldest_first reads a trip in the order it happened."
      },
      "limit": {
        "type": "integer",
        "description": "Rows per page. Default 20, which is also the model-context page ceiling (a larger value still pages at 20 with a next_cursor to continue). A photo listing defaults to and caps at 100 rows per page and walks up to 500; a Project-scoped app hydration listing walks up to 500 as well."
      },
      "cursor": {
        "type": "string",
        "description": "Opaque continuation returned as next_cursor by the previous page of this listing. Continuing requires the same query, project_id and filters; without cursor the listing restarts from the first row. Only a returned cursor is valid."
      },
      "result_profile": {
        "type": "string",
        "enum": [
          "app",
          "model"
        ],
        "description": "Caller profile. \"app\" (widgets/apps) keeps full structured rows for hydration; \"model\" returns the complete row story as prose only. Absent means the server default."
      }
    },
    "required": [],
    "additionalProperties": false
  },
  "annotations": {
    "title": "List recordings",
    "readOnlyHint": true,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ],
    "ui": {
      "visibility": [
        "model",
        "app"
      ]
    },
    "openai/widgetAccessible": true
  }
}

Live Workspace descriptor

{
  "name": "recordings_list",
  "title": "List recordings",
  "description": "Lists standalone recordings (raw source media): the drawer, not the editorial unit. Use this for source/ingest/readiness asks (\"latest searchable session\", \"what uploads are ready?\") or to inspect and select recordings inside a project (project_id). A Project reel whose footage spans separate recordings rather than one parent Episode is one episode_create with recording_id ranges and no derived_from_id; recording_sample_frames inspects recording pixels without an Episode. `query` matches title, project, or who is in it (\"the latest with Andrew\" matches Andrew as a speaker). PAGINATED, newest first: one call returns up to 20 rows and says when more exist; the returned next_cursor (with the same query/project_id) continues it as `cursor`. One listing walk reaches at most the newest 50 recordings — anything older is reachable only by narrowing with query or project_id, and the result states which case applies. Model rows carry both the exact tool-only recording_id and the episode-of-one episode_id, plus captured_at, searchability status/notes, and a compact indexed description. For latest-session asks, the newest `searchability_status:\"searchable\"` row is the latest searchable session; episode_pending means the Recording may not have an Episode-of-one, not that direct source-time frame inspection must wait. Photos: project_id with media_kind:\"photo\" lists a Project's Photos and Live Photos as compact rows, up to 100 per page and 500 per listing, each with capture time and offset, Live length, size and shape, description and legible text, plus subject focus, near-duplicate group, sharpness and exposure when preparation recorded them. order:\"oldest_first\" lists in capture order; photos sharing a similar group are near-duplicates, such as a burst. See one with recording_sample_frames times [0], and place them with episode_create photo rows or episode_edit occurrence.insert. Ordinary composition browsing is episodes_list, and searching what was SAID is transcript_search. Read-only.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "Optional case-insensitive filter — returns only recordings whose TITLE, a composited SOURCE TITLE, or a diarized SPEAKER NAME contains this text (substring). The filter scans the FULL catalog before the newest-50 listing window applies, so it also reaches recordings a bare walk cannot. Each kept recording carries a `match_reason` (\"title\" / \"source: …\" / \"speaker: …\") explaining why. Composes with project_id, limit, and cursor. It finds a recording by who is in it or what it's called, e.g. query: \"Andrew\"."
      },
      "project_id": {
        "type": "string",
        "description": "Optional project public ID — scope the list to a single project's recordings."
      },
      "media_kind": {
        "type": "string",
        "enum": [
          "photo",
          "live_photo",
          "video"
        ],
        "description": "Optional kind filter applied before the listing window: photo lists Photos and Live Photos, live_photo only Live Photos, video only time-based Recordings."
      },
      "captured_after": {
        "type": "string",
        "description": "Optional ISO 8601 date or date-time; keeps what was captured at or after it (a Recording without capture evidence dates by its upload)."
      },
      "captured_before": {
        "type": "string",
        "description": "Optional ISO 8601 date or date-time; keeps what was captured before it."
      },
      "order": {
        "type": "string",
        "enum": [
          "newest_first",
          "oldest_first"
        ],
        "description": "Listing order by capture time. Default newest_first; oldest_first reads a trip in the order it happened."
      },
      "limit": {
        "type": "integer",
        "description": "Rows per page. Default 20, which is also the model-context page ceiling (a larger value still pages at 20 with a next_cursor to continue). A photo listing defaults to and caps at 100 rows per page and walks up to 500; a Project-scoped app hydration listing walks up to 500 as well."
      },
      "cursor": {
        "type": "string",
        "description": "Opaque continuation returned as next_cursor by the previous page of this listing. Continuing requires the same query, project_id and filters; without cursor the listing restarts from the first row. Only a returned cursor is valid."
      },
      "result_profile": {
        "type": "string",
        "enum": [
          "app",
          "model"
        ],
        "description": "Caller profile. \"app\" (widgets/apps) keeps full structured rows for hydration; \"model\" returns the complete row story as prose only. Absent means the server default."
      }
    },
    "required": [],
    "additionalProperties": false
  },
  "annotations": {
    "title": "List recordings",
    "readOnlyHint": true,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ]
  }
}

Errors

[]

Examples

[
  {
    "label": "List recent recordings",
    "input": {
      "limit": 10
    }
  },
  {
    "label": "Find a recording by speaker or title",
    "input": {
      "query": "Andrew"
    }
  },
  {
    "label": "List the recordings in a project",
    "input": {
      "project_id": "proj_..."
    }
  },
  {
    "label": "List a Project's photos in capture order",
    "input": {
      "project_id": "proj_...",
      "media_kind": "photo",
      "order": "oldest_first"
    }
  }
]