recordings_request_upload
Request a recording upload grant
Use this when an agent has a local audio or video file and needs to upload it programmatically. Returns a short-lived direct-to-storage upload grant: either a single PUT URL or multipart part URLs. After the agent uploads the bytes, call recordings_finalize_upload with the upload_token and uploaded part ETags if multipart. To add a device file to a Footage session, pass capture_session_id and its optional relative_path. To add camera footage to an existing episode instead, pass target:{type:"episode", id:"comp_..."}, upload_role:"episode_footage", and batch_id/batch_expected_count/batch_index for the batch; the two targets are mutually exclusive.
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": "recordings_request_upload",
"title": "Request a recording upload grant",
"description": "Use this when an agent has a local audio or video file and needs to upload it programmatically. Returns a short-lived direct-to-storage upload grant: either a single PUT URL or multipart part URLs. After the agent uploads the bytes, call recordings_finalize_upload with the upload_token and uploaded part ETags if multipart. To add a device file to a Footage session, pass capture_session_id and its optional relative_path. To add camera footage to an existing episode instead, pass target:{type:\"episode\", id:\"comp_...\"}, upload_role:\"episode_footage\", and batch_id/batch_expected_count/batch_index for the batch; the two targets are mutually exclusive.",
"inputSchema": {
"type": "object",
"properties": {
"filename": {
"type": "string",
"description": "Original filename, such as john-questions.mp4."
},
"byte_size": {
"type": "integer",
"description": "Exact file size in bytes."
},
"content_type": {
"type": "string",
"description": "Media content type, such as video/mp4 or audio/mpeg."
},
"project_id": {
"type": "string",
"description": "Optional project public ID to attach the recording to."
},
"show_slug": {
"type": "string",
"description": "Optional project slug fallback."
},
"title": {
"type": "string",
"description": "Optional recording title."
},
"description": {
"type": "string",
"description": "Optional recording description."
},
"recorded_at": {
"type": "string",
"description": "Optional ISO-8601 recorded timestamp."
},
"captured_at": {
"type": "string",
"description": "Optional ISO-8601 captured timestamp fallback."
},
"last_modified_at": {
"type": "string",
"description": "Optional ISO-8601 local file mtime fallback."
},
"capture_session_id": {
"type": "string",
"description": "Optional Footage-session public ID. The finalized recording joins this session and triggers incremental chronology analysis."
},
"relative_path": {
"type": "string",
"description": "Optional safe device/folder-relative path retained for a Footage-session upload."
},
"target": {
"type": "object",
"description": "Optional upload target. For camera footage, pass {type:\"episode\", id:\"comp_...\"}; no source-addressed target is accepted.",
"properties": {
"type": {
"type": "string",
"enum": [
"episode"
]
},
"id": {
"type": "string",
"description": "Existing episode id to receive the camera footage."
}
},
"required": [
"type",
"id"
]
},
"upload_role": {
"type": "string",
"enum": [
"episode_footage"
],
"description": "Set to episode_footage when the uploaded file is camera footage for target episode."
},
"batch_id": {
"type": "string",
"description": "Shared id for every file added to target episode in one batch."
},
"batch_expected_count": {
"type": "integer",
"description": "How many files this batch contains. Required with upload_role episode_footage."
},
"batch_index": {
"type": "integer",
"description": "This file's 0-based position in the batch. Required with upload_role episode_footage."
}
},
"required": [
"filename",
"byte_size",
"content_type"
],
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
},
"securitySchemes": [
{
"type": "noauth"
}
],
"_meta": {
"securitySchemes": [
{
"type": "noauth"
}
],
"ui": {
"visibility": [
"app"
]
},
"openai/widgetAccessible": true,
"openai/visibility": "private"
},
"outputSchema": {
"type": "object",
"properties": {
"upload_strategy": {
"type": "string",
"enum": [
"single_put",
"multipart"
]
},
"upload_url": {
"type": [
"string",
"null"
],
"description": "Single PUT URL when upload_strategy is single_put."
},
"upload_token": {
"type": "string"
},
"expires_at": {
"type": "string"
},
"headers": {
"type": "object"
},
"part_size": {
"type": [
"integer",
"null"
]
},
"part_count": {
"type": [
"integer",
"null"
]
},
"parts": {
"type": "array",
"description": "Multipart upload part grants when upload_strategy is multipart."
}
},
"required": [],
"additionalProperties": false
}
}Errors
[
"billing_required",
"email_verification_required",
"file_too_large",
"upload_not_configured",
"invalid_input"
]Examples
[]