> ## Documentation Index
> Fetch the complete documentation index at: https://docs.videodb.io/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP Tools Reference

> Every tool exposed by the hosted VideoDB MCP server, grouped by toolset, with its kind, inputs and prerequisites.

The hosted VideoDB MCP server at `https://mcp.videodb.io/mcp` exposes 89 tools, grouped into toolsets by what they operate on. Every tool is annotated with a kind, which is how a client knows whether the call changes your account and whether to ask you first.

| Kind        | Meaning                                                             |
| ----------- | ------------------------------------------------------------------- |
| read        | No change to your account. Lists, lookups, search and ask.          |
| create      | Makes something new: assets, indexes, streams, jobs.                |
| update      | Changes something that exists: renames, status toggles, visibility. |
| destructive | Deletes.                                                            |

## IDs and conventions

| Prefix | Object           |
| ------ | ---------------- |
| `m-`   | Video            |
| `a-`   | Audio            |
| `img-` | Image            |
| `rts-` | Real-time stream |
| `c-`   | Collection       |

Every ID input takes one of those prefixed forms: `video_id` is an `m-` ID, `audio_id` an `a-` ID, `image_id` an `img-` ID, `rtstream_id` an `rts-` ID, `collection_id` a `c-` ID. `media_id` accepts a video or an audio ID. Every account has a collection named `default`, so leaving `collection_id` out sends the call there.

Reading the Inputs column: a plain name is required, a trailing `?` means optional, and `?=value` is the default the server applies when you omit it. Tools with more than eight inputs show the first six, and a full table of every field follows the toolset table.

* Inputs and outputs are snake\_case.
* A write that runs long returns `{"status": "processing", ...}` with a `retry_with` field naming the read tool that shows the finished result.
* Large lists are capped. A capped result carries `truncated: true` and `total`.

## collections

Collections hold your media. Account usage and invoices live here too.

| Tool                | Kind        | Inputs                                                          | What it does                                                                          |
| ------------------- | ----------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| `list_collections`  | read        | none                                                            | List all collections in the account with IDs, names, descriptions and visibility.     |
| `get_collection`    | read        | `collection_id?=default`                                        | Get one collection's ID, name, description and public/private visibility.             |
| `create_collection` | create      | `name`, `description?=""`, `is_public?=false`                   | Create a new collection to organize videos.                                           |
| `update_collection` | update      | `collection_id?=default`, `name?`, `description?`, `is_public?` | Rename a collection, change its description, or switch it between public and private. |
| `delete_collection` | destructive | `collection_id`                                                 | Permanently delete a collection and everything in it.                                 |
| `get_account_usage` | read        | none                                                            | Get the account's current usage and billing summary.                                  |
| `list_invoices`     | read        | none                                                            | List the account's invoices (first 200; `truncated` is set when more exist).          |

## media

List, fetch, upload, rename and delete videos, audio and images, plus thumbnails, signed download URLs and transcoding.

| Tool                     | Kind        | Inputs                                                                                                               | What it does                                                                                                                                                 |
| ------------------------ | ----------- | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `list_assets`            | read        | `collection_id?`, `asset_type?`, `name_pattern?`, `min_duration?`, `max_duration?`, `min_size?`, +5 more (see below) | List videos, audio and images together in one paginated result, filtered by type, name pattern, duration or file size, and sorted by name, duration or size. |
| `list_videos`            | read        | `collection_id?=default`                                                                                             | List videos in a collection: IDs, names, durations, and playable stream/player URLs.                                                                         |
| `list_audios`            | read        | `collection_id?=default`                                                                                             | List audio files in a collection: IDs, names, durations and sizes.                                                                                           |
| `list_images`            | read        | `collection_id?=default`                                                                                             | List images in a collection: IDs, names and URLs.                                                                                                            |
| `get_video`              | read        | `video_id`, `collection_id?=default`                                                                                 | Get metadata for one video: name, duration, thumbnail, stream URL, and a player URL for watching it in a browser.                                            |
| `get_audio`              | read        | `audio_id`, `collection_id?=default`                                                                                 | Get metadata for one audio file: name, duration and size.                                                                                                    |
| `get_image`              | read        | `image_id`, `collection_id?=default`                                                                                 | Get metadata for one image: name and URL.                                                                                                                    |
| `upload_media`           | create      | `url`, `collection_id?=default`, `name?`, `description?`, `media_type?`, `callback_url?`                             | Upload a video, audio file or image from a public URL (direct file links and YouTube URLs both work).                                                        |
| `search_youtube`         | read        | `query`, `result_threshold?=10`, `duration?=medium`                                                                  | Search YouTube and return titles, URLs and metadata, useful for finding URLs to pass to `upload_media`.                                                      |
| `search_videos_by_title` | read        | `collection_id?=default`, `query`                                                                                    | Find videos in a collection whose title matches a natural-language query.                                                                                    |
| `update_video`           | update      | `video_id`, `collection_id?=default`, `name`                                                                         | Update a video's display name.                                                                                                                               |
| `generate_thumbnail`     | create      | `video_id`, `collection_id?=default`, `time_seconds?`                                                                | Get the default thumbnail of a video, or generate one from a specific timestamp (in seconds).                                                                |
| `list_thumbnails`        | read        | `video_id`, `collection_id?=default`                                                                                 | List every thumbnail image generated for a video, with image IDs and URLs.                                                                                   |
| `get_media_download_url` | read        | `media_id`, `collection_id?=default`                                                                                 | Get a signed, time-limited download URL for an audio file (`a-`) or image (`img-`).                                                                          |
| `transcode_media`        | create      | `source`, `callback_url`, `mode?=economy`, `resolution?`, `quality?`, `framerate?`, +3 more (see below)              | Start a transcode job for a video at a public URL: change resolution, quality, framerate or aspect ratio, or mute audio.                                     |
| `get_transcode_status`   | read        | `job_id`                                                                                                             | Get the status and output of a transcode job started by `transcode_media`.                                                                                   |
| `delete_video`           | destructive | `video_id`, `collection_id?=default`                                                                                 | Permanently delete a video from a collection.                                                                                                                |
| `delete_audio`           | destructive | `audio_id`, `collection_id?=default`                                                                                 | Permanently delete an audio file from a collection.                                                                                                          |
| `delete_image`           | destructive | `image_id`, `collection_id?=default`                                                                                 | Permanently delete an image from a collection.                                                                                                               |
| `remove_video_storage`   | destructive | `video_id`, `collection_id?=default`                                                                                 | Delete the stored media bytes of a video while keeping its record, indexes and transcripts.                                                                  |

#### `list_assets` inputs

| Field           | Type                                             | Required                  | What it is                                                                                  |
| --------------- | ------------------------------------------------ | ------------------------- | ------------------------------------------------------------------------------------------- |
| `collection_id` | `string`                                         | no                        | Scope to one collection. Omitted = every collection in the account.                         |
| `asset_type`    | `('video' \| 'audio' \| 'image')[]`              | no                        | Asset types to include. Omitted = all three.                                                |
| `name_pattern`  | `string`                                         | no                        | Case-insensitive regular expression matched against the asset name, e.g. 'keynote\|demo'.   |
| `min_duration`  | `number`                                         | no                        | Minimum duration in seconds (videos and audio).                                             |
| `max_duration`  | `number`                                         | no                        | Maximum duration in seconds (videos and audio).                                             |
| `min_size`      | `number`                                         | no                        | Minimum file size in bytes.                                                                 |
| `max_size`      | `number`                                         | no                        | Maximum file size in bytes.                                                                 |
| `sort_by`       | `'created_at' \| 'name' \| 'duration' \| 'size'` | no (default `created_at`) | Field to sort on. created\_at is newest-first per type only, since rows carry no timestamp. |
| `sort_order`    | `'desc' \| 'asc'`                                | no (default `desc`)       | Sort direction.                                                                             |
| `page`          | `number`                                         | no (default `1`)          | Page number (1-based).                                                                      |
| `page_size`     | `number`                                         | no (default `100`)        | Items per page.                                                                             |

#### `transcode_media` inputs

| Field          | Type                       | Required               | What it is                                                                |
| -------------- | -------------------------- | ---------------------- | ------------------------------------------------------------------------- |
| `source`       | `string`                   | yes                    | Public, downloadable URL of the source video.                             |
| `callback_url` | `string`                   | yes                    | Webhook URL VideoDB calls when the job finishes (required).               |
| `mode`         | `'economy' \| 'lightning'` | no (default `economy`) | economy = cheaper/slower, lightning = faster.                             |
| `resolution`   | `number`                   | no                     | Output height in pixels, e.g. 720 or 1080 (max 4K).                       |
| `quality`      | `number`                   | no                     | Encoder CRF quality, lower = better (default 23).                         |
| `framerate`    | `number`                   | no                     | Output frames per second.                                                 |
| `aspect_ratio` | `string`                   | no                     | Output aspect ratio, e.g. "16:9", "9:16", "1:1".                          |
| `resize_mode`  | `'crop' \| 'fit' \| 'pad'` | no                     | How to reach aspect\_ratio: crop edges, fit (letterbox) or pad with bars. |
| `mute`         | `boolean`                  | no                     | Strip the audio track.                                                    |

**Notes**

* `get_media_download_url` covers audio and images only. For a video, render it with `download_stream`.
* Uploads take a public URL. Local file paths are not supported.
* A write that runs long comes back as `status: "processing"` with a `retry_with`: `upload_media` names `list_videos`, `generate_thumbnail` names `list_thumbnails`, `transcode_media` names `get_transcode_status`.

## transcripts

Speech to text, plus translation of what comes back.

| Tool                   | Kind   | Inputs                                                                                                                      | What it does                                                                                                                 |
| ---------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `get_transcript`       | read   | `media_id?`, `video_id?`, `collection_id?=default`, `timestamped?=false`, `start?`, `end?`, `segmenter?`, `segment_length?` | Get the transcript of a video or audio file, as plain text or with timestamped segments (per word, sentence or time window). |
| `generate_transcript`  | create | `media_id?`, `video_id?`, `collection_id?=default`, `force?=false`, `language_code?`                                        | Transcribe a video or audio file, optionally forcing a fresh transcription or hinting the spoken language.                   |
| `translate_transcript` | create | `video_id`, `collection_id?=default`, `language`, `additional_notes?`, `callback_url?`                                      | Translate a video's transcript into another language and return the translated segments.                                     |

**Prerequisites**

* `translate_transcript` needs an existing transcript. Run `get_transcript` or `generate_transcript` first. It works on videos only.
* `get_transcript` and `generate_transcript` accept either `media_id` or `video_id`. Give exactly one.
* While a transcription is still running, both come back as `status: "processing"` with `retry_with: get_transcript`.

## indexing

Two pipelines: the v1 spoken-word and scene indexes, and the v2 flow where `understand_video` extracts artifacts and `create_index` turns one analyzer's output into a searchable index.

| Tool                   | Kind        | Inputs                                                                                                                   | What it does                                                                                                                                              |
| ---------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `index_spoken_words`   | create      | `video_id`, `collection_id?=default`, `language_code?`, `force?=false`, `segmentation_type?`, `callback_url?`            | Transcribe and index everything spoken in a video so it becomes searchable with `search_video` / `search_collection` (v1 index).                          |
| `index_scenes`         | create      | `video_id`, `collection_id?=default`, `prompt?`, `name?`, `batch_type?=shot`, `batch_value?`, +3 more (see below)        | Visually index a video (v1 scene index): samples frames per shot or per time window and describes what is on screen, so visual moments become searchable. |
| `list_scene_indexes`   | read        | `video_id`, `collection_id?=default`                                                                                     | List the visual (scene) indexes that exist for a video, with IDs, names and status.                                                                       |
| `get_scene_index`      | read        | `video_id`, `collection_id?=default`, `scene_index_id`                                                                   | Return the per-scene records (start, end, description) of one visual scene index.                                                                         |
| `delete_scene_index`   | destructive | `video_id`, `collection_id?=default`, `scene_index_id`                                                                   | Permanently delete one visual scene index of a video. The video is kept.                                                                                  |
| `understand_video`     | create      | `video_id`, `collection_id?=default`, `analyzers`, `segmentation?`, `callback_url?`                                      | Run one or more analyzers over a video to extract artifacts: transcript, scene descriptions, on-screen text, objects, brands, activities, locations.      |
| `get_understanding`    | read        | `video_id`, `collection_id?=default`, `understanding_id`                                                                 | Get the status of one understanding run and of each analyzer in it (pending, running, done, failed).                                                      |
| `list_understandings`  | read        | `video_id`, `collection_id?=default`                                                                                     | List every understanding run of a video with its status and analyzers.                                                                                    |
| `delete_understanding` | destructive | `video_id`, `collection_id?=default`, `understanding_id`                                                                 | Permanently delete an understanding run and its stored analyzer artifacts. Indexes built from it keep their own data.                                     |
| `get_analyzer_output`  | read        | `video_id`, `collection_id?=default`, `understanding_id`, `analyzer_name?`, `analyzer_id?`                               | Return the raw artifact one analyzer produced, such as transcript segments or per-scene descriptions with start/end.                                      |
| `create_index`         | create      | `video_id`, `collection_id?=default`, `understanding_id`, `analyzer_name?`, `analyzer_id?`, `name?`, +3 more (see below) | Build a retrieval-ready index from one analyzer's output of an understanding run.                                                                         |
| `get_index`            | read        | `video_id`, `collection_id?=default`, `index_id?`, `name?`                                                               | Get one v2 index manifest by ID or name: status (building/ready/failed), record count, capabilities and field schema.                                     |
| `list_indexes`         | read        | `video_id`, `collection_id?=default`, `use_for?`                                                                         | List the v2 indexes of a video (ID, name, status, capabilities, record count).                                                                            |
| `delete_index`         | destructive | `video_id`, `collection_id?=default`, `index_id`                                                                         | Permanently delete a v2 index. The video and understanding artifacts are kept.                                                                            |
| `get_index_records`    | read        | `video_id`, `collection_id?=default`, `index_id`, `limit?=20`, `cursor?`                                                 | Page through the records stored in a v2 index (scene\_id, start, end, data).                                                                              |

#### `index_scenes` inputs

| Field           | Type               | Required               | What it is                                                                                             |
| --------------- | ------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------ |
| `video_id`      | `string`           | yes                    | VideoDB video ID (starts with m-).                                                                     |
| `collection_id` | `string`           | no (default `default`) | VideoDB collection ID. Defaults to "default" (every account has one).                                  |
| `prompt`        | `string`           | no                     | Instruction for how to describe scenes.                                                                |
| `name`          | `string`           | no                     | Name for this scene index.                                                                             |
| `batch_type`    | `'shot' \| 'time'` | no (default `shot`)    | Split by detected shots or fixed time windows.                                                         |
| `batch_value`   | `number`           | no                     | Shot threshold (default 20) or window seconds (default 10).                                            |
| `frame_count`   | `number`           | no (default `1`)       | Frames sampled per scene.                                                                              |
| `model_name`    | `string`           | no                     | Vision model tier or name used to describe scenes, e.g. 'basic', 'pro', 'ultra'. Omit for the default. |
| `callback_url`  | `string`           | no                     | Optional webhook URL VideoDB calls when the job finishes (makes the call return immediately).          |

#### `create_index` inputs

| Field              | Type                                       | Required               | What it is                                                                                                          |
| ------------------ | ------------------------------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------- |
| `video_id`         | `string`                                   | yes                    | VideoDB video ID (starts with m-).                                                                                  |
| `collection_id`    | `string`                                   | no (default `default`) | VideoDB collection ID. Defaults to "default" (every account has one).                                               |
| `understanding_id` | `string`                                   | yes                    | Understanding run ID (from understand\_video / list\_understandings).                                               |
| `analyzer_name`    | `string`                                   | no                     | Analyzer name inside the run, e.g. 'transcript', 'scene', 'objects'. Give this or analyzer\_id.                     |
| `analyzer_id`      | `string`                                   | no                     | Analyzer ID (an\_...). Give this or analyzer\_name.                                                                 |
| `name`             | `string`                                   | no                     | Index name; used by semantic\_search index\_names and get\_index.                                                   |
| `use_for`          | `('semantic' \| 'query' \| 'aggregate')[]` | no                     | Retrieval capabilities: semantic (embeddings), query (filter/sort), aggregate (group/count).                        |
| `fields`           | `object`                                   | no                     | Per-field capabilities, e.g. `{description:['semantic'], label:['filter','aggregate']}`. Omit for VideoDB defaults. |
| `callback_url`     | `string`                                   | no                     | Optional webhook URL VideoDB calls when the job finishes (makes the call return immediately).                       |

**Prerequisites**

* `create_index` needs an `understand_video` run whose analyzer has finished. Check with `get_understanding`.
* `create_index` and `get_analyzer_output` accept either `analyzer_name` or `analyzer_id`. Give exactly one.
* An index declares what it can serve through `use_for`. The values are `semantic`, `query` and `aggregate`, and they map to the search tools below.
* `understand_video` takes `analyzers` as a list of objects, `[{type: "spoken_words"}, {type: "vlm", prompt: "Describe the scene"}]`, and `segmentation` as `{type: "time", seconds: 5}` or `{type: "shot", threshold: 30}`.
* A write that runs long comes back as `status: "processing"` with a `retry_with`: `index_spoken_words` names `search_video`, `index_scenes` names `list_scene_indexes`, `understand_video` names `get_understanding`, `create_index` names `get_index`.

## search

Moment search and question answering, over one video or a whole collection.

| Tool                | Kind | Inputs                                                                                                                   | What it does                                                                                                      |
| ------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
| `search_video`      | read | `video_id`, `collection_id?=default`, `query`, `search_type?`, `index_type?`, `result_threshold?`, +5 more (see below)   | Search within one video and get matching moments with start/end timestamps, text and relevance scores.            |
| `search_collection` | read | `collection_id?=default`, `query`, `index_type?`, `result_threshold?`, `top_k?`, `mode?`, `include_clip?`, `session_id?` | Search every indexed video in a collection and get matching moments grouped by video, with timestamps and scores. |
| `ask_video`         | read | `video_id`, `collection_id?=default`, `question`, `top_k?`, `mode?`, `include_sources?`                                  | Answer a natural-language question from one video's indexed content.                                              |
| `ask_collection`    | read | `collection_id?=default`, `question`, `top_k?`, `mode?`, `include_sources?`                                              | Answer a natural-language question from every indexed video in a collection.                                      |
| `semantic_search`   | read | `collection_id?=default`, `video_id?`, `query`, `index_names?`, `index_ids?`, `top_k?`, +3 more (see below)              | Vector search over one or more indexes in a video or across a collection.                                         |
| `query_index`       | read | `collection_id?=default`, `video_id?`, `index_name?`, `index_id?`, `filter?`, `sort?`, `limit?`, `return_fields?`        | Structured filter and sort over one index in a video or across a collection.                                      |
| `aggregate_index`   | read | `collection_id?=default`, `video_id?`, `index_name?`, `index_id?`, `group_by?`, `metric?`, +3 more (see below)           | Counts, groups and facets over one index in a video or across a collection.                                       |

#### `search_video` inputs

| Field              | Type                        | Required               | What it is                                                                                                  |
| ------------------ | --------------------------- | ---------------------- | ----------------------------------------------------------------------------------------------------------- |
| `video_id`         | `string`                    | yes                    | VideoDB video ID (starts with m-).                                                                          |
| `collection_id`    | `string`                    | no (default `default`) | VideoDB collection ID. Defaults to "default" (every account has one).                                       |
| `query`            | `string`                    | yes                    | What to look for, e.g. 'moments where pricing is discussed'.                                                |
| `search_type`      | `'semantic' \| 'keyword'`   | no                     | Legacy: semantic (default) or keyword matching. Keyword works on videos only.                               |
| `index_type`       | `'spoken_word' \| 'scene'`  | no                     | Legacy: index to search, spoken\_word (default) or scene.                                                   |
| `result_threshold` | `number`                    | no                     | Legacy: max results (default 5).                                                                            |
| `scene_index_id`   | `string`                    | no                     | Legacy: search one scene index (from list\_scene\_indexes).                                                 |
| `top_k`            | `number`                    | no                     | v2: maximum moments to return.                                                                              |
| `mode`             | `'default' \| 'deepsearch'` | no                     | v2: default = single-step planned retrieval; deepsearch = multi-step investigation with follow-up sessions. |
| `include_clip`     | `boolean`                   | no                     | v2: also return a playable clip for each moment.                                                            |
| `session_id`       | `string`                    | no                     | v2: continue a deepsearch session (session\_id from a previous response). Only valid with mode=deepsearch.  |

#### `semantic_search` inputs

| Field             | Type                           | Required               | What it is                                                                                                                   |
| ----------------- | ------------------------------ | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `collection_id`   | `string`                       | no (default `default`) | VideoDB collection ID. Defaults to "default" (every account has one).                                                        |
| `video_id`        | `string`                       | no                     | VideoDB video ID (starts with m-). Omit to run against the whole collection.                                                 |
| `query`           | `string`                       | yes                    | Natural-language query.                                                                                                      |
| `index_names`     | `string[]`                     | no                     | Restrict to these index names.                                                                                               |
| `index_ids`       | `string[]`                     | no                     | Restrict to these index IDs.                                                                                                 |
| `top_k`           | `number`                       | no                     | Max moments to return (default 10).                                                                                          |
| `score_threshold` | `number`                       | no                     | Minimum similarity score.                                                                                                    |
| `filter`          | `object[] \| object`           | no                     | Structured filter over index fields, e.g. `[{"field": "label", "op": "==", "value": "phone"}]` or `{"activity": "walking"}`. |
| `return_fields`   | `string \| string[] \| object` | no                     | Index fields to hydrate into each moment's metadata; "all" for everything.                                                   |

#### `aggregate_index` inputs

| Field           | Type                 | Required               | What it is                                                                                                                   |
| --------------- | -------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `collection_id` | `string`             | no (default `default`) | VideoDB collection ID. Defaults to "default" (every account has one).                                                        |
| `video_id`      | `string`             | no                     | VideoDB video ID (starts with m-). Omit to run against the whole collection.                                                 |
| `index_name`    | `string`             | no                     | Index name (from list\_indexes).                                                                                             |
| `index_id`      | `string`             | no                     | Index ID (from list\_indexes).                                                                                               |
| `group_by`      | `string`             | no                     | Aggregatable field to group by; dotted paths allowed, e.g. frames.detections.label.                                          |
| `metric`        | `string`             | no                     | count (default), or sum(field), avg(field), min(field), max(field).                                                          |
| `filter`        | `object[] \| object` | no                     | Structured filter over index fields, e.g. `[{"field": "label", "op": "==", "value": "phone"}]` or `{"activity": "walking"}`. |
| `sort`          | `string \| array`    | no                     | Sort order, e.g. \[\["start", "asc"]].                                                                                       |
| `limit`         | `number`             | no                     | Max groups (default 100).                                                                                                    |

**Prerequisites**

* `search_video` and `search_collection` read the v1 indexes: spoken-word search needs `index_spoken_words`, and `index_type='scene'` needs `index_scenes`.
* `ask_video` and `ask_collection` need v2 indexes built by `create_index`.
* `semantic_search`, `query_index` and `aggregate_index` need an index built by `create_index` whose `use_for` includes `semantic`, `query` and `aggregate` respectively. Each takes `index_name` or `index_id`, and each runs over one video with `video_id` or the whole collection without it.
* `filter` takes `[{"field": "label", "op": "==", "value": "phone"}]` or the shorthand `{"activity": "walking"}`. `sort` takes `[["start", "asc"]]`. `return_fields` takes a field name, a list of them, or `"all"`.

## streams

Cut, stitch, subtitle and reframe videos into playable streams, then render them to MP4.

| Tool                    | Kind   | Inputs                                                                                                                         | What it does                                                                                                                                                     |
| ----------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `generate_clip`         | create | `video_id`, `collection_id?=default`, `timeline`                                                                               | Cut a clip, or a supercut of several segments, from a single video without re-encoding.                                                                          |
| `compile_clips`         | create | `clips`                                                                                                                        | Stitch moments from one or more videos into a single new stream.                                                                                                 |
| `add_subtitles`         | create | `video_id`, `collection_id?=default`, `font_name?`, `font_size?`, `primary_colour?`, `secondary_colour?`, +17 more (see below) | Burn subtitles into a video from its transcript.                                                                                                                 |
| `create_highlight_clip` | create | `video_id`, `collection_id?=default`, `prompt`, `content_type?=spoken`, `model_name?=basic`                                    | Pick the moments of a video that match a natural-language prompt and compile them into one stream.                                                               |
| `reframe_video`         | create | `video_id`, `collection_id?=default`, `start?`, `end?`, `target?=vertical`, `mode?=smart`, `callback_url?`                     | Re-crop a video, or a segment of it, to a new aspect ratio (vertical, square, landscape or custom dimensions) and save it as a new video in the same collection. |
| `download_stream`       | create | `stream_url`, `name`                                                                                                           | Render any VideoDB stream URL into a downloadable MP4 file.                                                                                                      |

#### `add_subtitles` inputs

| Field              | Type                                                                                                                                                    | Required               | What it is                                                                                                                              |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| `video_id`         | `string`                                                                                                                                                | yes                    | VideoDB video ID (starts with m-).                                                                                                      |
| `collection_id`    | `string`                                                                                                                                                | no (default `default`) | VideoDB collection ID. Defaults to "default" (every account has one).                                                                   |
| `font_name`        | `string`                                                                                                                                                | no                     | Font family, default Arial.                                                                                                             |
| `font_size`        | `number`                                                                                                                                                | no                     | Font size, default 18.                                                                                                                  |
| `primary_colour`   | `string`                                                                                                                                                | no                     | Text colour. ASS colour string \&HAABBGGRR (alpha, blue, green, red hex), e.g. \&H00FFFFFF is opaque white. Default white.              |
| `secondary_colour` | `string`                                                                                                                                                | no                     | Secondary (karaoke) colour. ASS colour string \&HAABBGGRR (alpha, blue, green, red hex), e.g. \&H00FFFFFF is opaque white.              |
| `outline_colour`   | `string`                                                                                                                                                | no                     | Outline colour. ASS colour string \&HAABBGGRR (alpha, blue, green, red hex), e.g. \&H00FFFFFF is opaque white. Default black.           |
| `back_colour`      | `string`                                                                                                                                                | no                     | Background/shadow colour. ASS colour string \&HAABBGGRR (alpha, blue, green, red hex), e.g. \&H00FFFFFF is opaque white. Default black. |
| `bold`             | `boolean`                                                                                                                                               | no                     | Bold text.                                                                                                                              |
| `italic`           | `boolean`                                                                                                                                               | no                     | Italic text.                                                                                                                            |
| `underline`        | `boolean`                                                                                                                                               | no                     | Underlined text.                                                                                                                        |
| `strike_out`       | `boolean`                                                                                                                                               | no                     | Strike-through text.                                                                                                                    |
| `scale_x`          | `number`                                                                                                                                                | no                     | Horizontal scale factor, default 1.0.                                                                                                   |
| `scale_y`          | `number`                                                                                                                                                | no                     | Vertical scale factor, default 1.0.                                                                                                     |
| `spacing`          | `number`                                                                                                                                                | no                     | Extra spacing between letters in pixels, default 0.                                                                                     |
| `angle`            | `number`                                                                                                                                                | no                     | Rotation angle in degrees, default 0.                                                                                                   |
| `border_style`     | `'no_border' \| 'opaque_box' \| 'outline'`                                                                                                              | no                     | Border style, default outline.                                                                                                          |
| `outline`          | `number`                                                                                                                                                | no                     | Outline thickness in pixels, default 1.                                                                                                 |
| `shadow`           | `number`                                                                                                                                                | no                     | Shadow depth in pixels, default 0.                                                                                                      |
| `alignment`        | `'bottom_left' \| 'bottom_center' \| 'bottom_right' \| 'middle_left' \| 'middle_center' \| 'middle_right' \| 'top_left' \| 'top_center' \| 'top_right'` | no                     | Position of the subtitles on the frame, default bottom\_center.                                                                         |
| `margin_l`         | `number`                                                                                                                                                | no                     | Left margin in pixels, default 10.                                                                                                      |
| `margin_r`         | `number`                                                                                                                                                | no                     | Right margin in pixels, default 10.                                                                                                     |
| `margin_v`         | `number`                                                                                                                                                | no                     | Vertical margin in pixels, default 10.                                                                                                  |

**Prerequisites**

* `add_subtitles` needs `index_spoken_words` on the video first.
* `download_stream` takes a stream URL from `generate_clip`, `compile_clips`, `add_subtitles`, `create_highlight_clip` or `get_video`.
* `generate_clip` takes `timeline` as `[start_seconds, end_seconds]` pairs, `[[10, 25], [60, 90]]`. `compile_clips` takes `clips` as a list of objects in playback order.
* `reframe_video` takes `target` as a preset (`vertical`, `square`, `landscape`) or an explicit `{width, height}`. It comes back as `status: "processing"` with `retry_with: list_videos`.

## editor

Multi-track timeline rendering. Tracks hold clips, and each clip carries a video, image, audio, text or caption asset.

| Tool                       | Kind   | Inputs                                 | What it does                                                        |
| -------------------------- | ------ | -------------------------------------- | ------------------------------------------------------------------- |
| `render_timeline`          | create | `tracks`, `background?`, `resolution?` | Render a multi-track editor timeline into a new stream in one call. |
| `download_timeline_render` | create | `stream_url`                           | Request an MP4 download of a stream produced by `render_timeline`.  |

**Notes**

* A caption asset with `src: "auto"` pulls from the video's spoken-word index. On an unindexed video the render succeeds with no captions, so run `index_spoken_words` first.
* Text assets sized with `width`/`height` keep those dimensions only under `fit: "contain"`. The default `fit: "crop"` upscales the text box to fill the frame.
* `tracks` carries the whole edit. It is a list of track objects, each holding its clips and their assets.

## rtstream

Ingest live RTSP, RTMP and HLS streams, index them continuously, search them, and get alerts on events. All timestamps are Unix seconds.

| Tool                                 | Kind   | Inputs                                                                                                            | What it does                                                                                                                                                              |
| ------------------------------------ | ------ | ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `connect_rtstream`                   | create | `url`, `name`, `collection_id?=default`, `media_types?=["video"]`, `sample_rate?`, `store?`, `enable_transcript?` | Register a live RTSP/RTMP/HLS stream with VideoDB and start ingesting it.                                                                                                 |
| `list_rtstreams`                     | read   | `limit?=10`, `offset?=0`, `status?`, `name?`, `ordering?`                                                         | List real-time streams in the account with IDs, names, status and media types.                                                                                            |
| `get_rtstream`                       | read   | `rtstream_id`                                                                                                     | Get one real-time stream: name, status, sample rate, media types, creation time.                                                                                          |
| `set_rtstream_status`                | update | `rtstream_id`, `action`                                                                                           | Start (connect) or stop (disconnect) ingestion of a real-time stream.                                                                                                     |
| `get_rtstream_stream`                | read   | `rtstream_id`, `start`, `end`                                                                                     | Generate a playable stream and player URL for a time window of a real-time stream.                                                                                        |
| `export_rtstream_recording`          | create | `rtstream_id`, `name?`                                                                                            | Export the latest completed recording of a real-time stream as a regular VideoDB video or audio asset.                                                                    |
| `get_rtstream_transcript`            | read   | `rtstream_id`, `page?=1`, `page_size?=100`, `start?`, `end?`, `since?`                                            | Read the real-time transcript of a stream.                                                                                                                                |
| `set_rtstream_transcript_status`     | update | `rtstream_id`, `action`, `mode?=graceful`, `engine?`                                                              | Start or stop real-time transcription on a stream.                                                                                                                        |
| `index_rtstream_scenes`              | create | `rtstream_id`, `prompt?`, `window_seconds?`, `frame_count?`, `model_name?`, `name?`                               | Start a continuous visual index on a real-time stream: every `window_seconds`, `frame_count` frames are described with the prompt.                                        |
| `index_rtstream_audio`               | create | `rtstream_id`, `prompt?`, `segmenter?`, `segment_value?`, `model_name?`, `name?`, `auto_start_transcript?=true`   | Start a continuous spoken-word index on a real-time stream: the live transcript is chunked by segmenter and summarized with the prompt.                                   |
| `list_rtstream_scene_indexes`        | read   | `rtstream_id`                                                                                                     | List the scene (visual and audio) indexes on a real-time stream with their IDs, prompts and status.                                                                       |
| `get_rtstream_scenes`                | read   | `rtstream_id`, `scene_index_id`, `start?`, `end?`, `page?=1`, `page_size?=100`                                    | Read the records a scene index has produced so far (Unix-second start/end plus description).                                                                              |
| `set_rtstream_scene_index_status`    | update | `rtstream_id`, `scene_index_id`, `action`                                                                         | Resume or pause a scene index on a real-time stream.                                                                                                                      |
| `search_rtstream`                    | read   | `rtstream_id`, `query`, `index_type?`, `scene_index_id?`, `result_threshold?`, `score_threshold?`                 | Semantic search over the indexed records of a real-time stream.                                                                                                           |
| `create_event`                       | create | `event_prompt`, `label`                                                                                           | Define a reusable event, a natural-language condition such as "a person enters the restricted area", that alerts can watch for on any stream index.                       |
| `list_events`                        | read   | none                                                                                                              | List the events defined on the account (ID, label, prompt).                                                                                                               |
| `create_rtstream_alert`              | create | `rtstream_id`, `index_id`, `index_kind?=scene_index`, `event_id`, `callback_url`                                  | Attach an event to a stream index so VideoDB POSTs to `callback_url` each time the event is detected in a new window.                                                     |
| `list_rtstream_alerts`               | read   | `rtstream_id`, `index_id`, `index_kind?=scene_index`                                                              | List the alerts attached to a stream index, with their event, callback and enabled state.                                                                                 |
| `set_rtstream_alert_status`          | update | `rtstream_id`, `index_id`, `index_kind?=scene_index`, `alert_id`, `action`                                        | Enable or disable an alert on a stream index without deleting it.                                                                                                         |
| `understand_rtstream`                | create | `rtstream_id`, `prompt`, `window_seconds?=5`, `frame_count?=2`, `output_name?=scene`, `store?=true`               | Start a continuous vision-model analysis on a real-time stream: every `window_seconds`, `frame_count` frames are analyzed with the prompt and stored under `output_name`. |
| `list_rtstream_understandings`       | read   | `rtstream_id`                                                                                                     | List the continuous understanding jobs on a real-time stream with their status, segmentation, analyzers and output descriptors.                                           |
| `set_rtstream_understanding_status`  | update | `rtstream_id`, `understanding_id`, `action`                                                                       | Resume or pause a continuous understanding job on a real-time stream.                                                                                                     |
| `get_rtstream_understanding_records` | read   | `rtstream_id`, `understanding_id`, `start`, `end`, `output?=scene`, `page?=1`, `page_size?=100`                   | Read the analysis records an understanding produced for a Unix-second time range (start and end required).                                                                |
| `create_rtstream_index`              | create | `rtstream_id`, `understanding_id`, `output?=scene`, `name?`, `use_for?`                                           | Materialize an understanding output into a continuously updated searchable index.                                                                                         |
| `list_rtstream_indexes`              | read   | `rtstream_id`                                                                                                     | List the understanding-backed indexes on a real-time stream with their status, source understanding and capabilities.                                                     |
| `set_rtstream_index_status`          | update | `rtstream_id`, `index_id`, `action`                                                                               | Resume or pause an understanding-backed index on a real-time stream.                                                                                                      |
| `get_rtstream_index_records`         | read   | `rtstream_id`, `index_id`, `start?`, `end?`, `page?=1`, `page_size?=100`                                          | Read the records materialized into an understanding-backed index, optionally limited to a Unix-second start/end window.                                                   |

**Prerequisites**

* Everything here starts with `connect_rtstream`. Indexes, understandings and alerts attach to a stream that is already connected and ingesting.
* `get_rtstream_transcript` needs transcription running, started either by `connect_rtstream` with `enable_transcript` or by `set_rtstream_transcript_status`.
* `search_rtstream` needs a scene index or an understanding-backed index on the stream.
* `create_rtstream_index` needs an `understand_rtstream` job started with `store=true`.
* `create_rtstream_alert` needs an event from `create_event` and an index to attach it to. Alerts cannot be deleted, only disabled with `set_rtstream_alert_status`.
* `list_rtstreams` is account-scoped, not per collection. Each row carries its own `collection_id`.
* Alert tools take `index_kind` to say which index the `index_id` belongs to: `scene_index` for one built by `index_rtstream_scenes` or `index_rtstream_audio`, `index` for one built by `create_rtstream_index`.
* A write that runs long comes back as `status: "processing"` with a `retry_with`: `connect_rtstream` names `list_rtstreams`, `export_rtstream_recording` names `get_video`, `index_rtstream_scenes` and `index_rtstream_audio` name `list_rtstream_scene_indexes`, `understand_rtstream` names `list_rtstream_understandings`, `create_rtstream_index` names `list_rtstream_indexes`, `create_event` names `list_events`, `create_rtstream_alert` names `list_rtstream_alerts`.

## meetings

Send a recorder bot into a meeting and collect the recording.

| Tool             | Kind   | Inputs                                                                                                                      | What it does                                                                                                                                                  |
| ---------------- | ------ | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `record_meeting` | create | `meeting_url`, `collection_id?=default`, `bot_name?`, `bot_image_url?`, `meeting_title?`, `time_zone?=UTC`, `callback_url?` | Send a VideoDB recorder bot to a Zoom, Google Meet or Microsoft Teams meeting URL.                                                                            |
| `get_meeting`    | read   | `meeting_id`, `collection_id?=default`                                                                                      | Get the state of a recorder bot: status (initializing, joined, processing, done), the recorded `video_id` once done, and the speaker timeline when available. |

**Prerequisites**

* `record_meeting` comes back as soon as the bot is dispatched, with `status: "processing"` and `retry_with: get_meeting`. Poll `get_meeting` until `status` is `done`. Only then does `video_id` have a value.

## Not exposed

| Feature                                                                                      | Why not                                                                                                             |
| -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| AI generation: image, music, sound effect, voice and video generation, dubbing, voice clones | Excluded by connector policy. Use the SDKs.                                                                         |
| Text generation                                                                              | The client is already a language model.                                                                             |
| Local-path uploads and `play()`                                                              | These need your filesystem or a browser on your machine.                                                            |
| Desktop capture, capture sessions and their client tokens                                    | Capture runs through a native binary on your machine over a long-lived connection. A remote server cannot drive it. |

For generation, use the [generative media guides](/pages/act/generative-media/index). For desktop capture and local files, use [VideoDB Agent Skills](/pages/getting-started/agent-skills), which run on your machine.

<CardGroup cols={3}>
  <Card icon="plug" href="/pages/mcp/index" title="MCP Server">
    What the hosted server is and what it connects to
  </Card>

  <Card icon="link" href="/pages/mcp/connect" title="Connect a Client">
    Add the server to Claude, Cursor and other MCP clients
  </Card>

  <Card icon="diagram-project" href="/pages/mcp/workflows" title="Workflows">
    End-to-end recipes built from these tools
  </Card>
</CardGroup>
