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. Ordinary composition browsing is episodes_list, and searching what was SAID is transcript_search. Read-only.

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": "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. 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."
      },
      "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; app hydration callers may receive up to 50 in one call)."
      },
      "cursor": {
        "type": "string",
        "description": "Opaque continuation returned as next_cursor by the previous page of this listing. Continuing requires the same query and project_id; without cursor the listing restarts from the newest recordings. 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. 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."
      },
      "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; app hydration callers may receive up to 50 in one call)."
      },
      "cursor": {
        "type": "string",
        "description": "Opaque continuation returned as next_cursor by the previous page of this listing. Continuing requires the same query and project_id; without cursor the listing restarts from the newest recordings. 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. 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."
      },
      "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; app hydration callers may receive up to 50 in one call)."
      },
      "cursor": {
        "type": "string",
        "description": "Opaque continuation returned as next_cursor by the previous page of this listing. Continuing requires the same query and project_id; without cursor the listing restarts from the newest recordings. 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_..."
    }
  }
]