---
canonical_url: "https://docs.composio.dev/toolkits/descript_mcp"
markdown_url: "https://docs.composio.dev/toolkits/descript_mcp.md"
product: "platform"
version: null
last_updated: null
---

# Descript MCP

Descript MCP lets agents import media, run project-agent workflows, and inspect or manage authorized processing jobs in Descript.

- **Category:** model context protocol
- **Auth:** DCR_OAUTH
- **Composio-managed OAuth available?** No
- **Tools:** 14
- **Triggers:** 0
- **Slug:** `DESCRIPT_MCP`
- **Version:** 20260910_00

## Tools

### Cancel job

**Slug:** `DESCRIPT_MCP_CANCEL_JOB`

Cancel a queued or running job.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `job_id` | string | Yes | UUID of the job to cancel. |

### Export timeline

**Slug:** `DESCRIPT_MCP_EXPORT_TIMELINE`

Export a project composition as a timeline file for import into another DAW/NLE (Premiere, DaVinci Resolve, Final Cut Pro, Pro Tools, Logic, Audition, Reaper). Media files are never bundled — only the timeline/XML/EDL file itself.

Returns immediately with a job_id. Use the wait_for_job tool with the returned job_id to wait for completion; when the job finishes, its result carries a time-limited download_url (valid until download_url_expires_at). Always display the download_url to the user so they can download the file directly. Large exports can take several minutes, so polling avoids connection timeouts.

Formats: edl (Samplitude/Reaper), sesx (Adobe Audition), fcp (Final Cut Pro X .fcpxml), premiere (Premiere Pro XML), davinci_resolve (DaVinci Resolve XML), aaf (Pro Tools/Logic, binary).

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `format` | string ("aaf" | "sesx" | "edl" | "fcp" | "premiere" | "davinci_resolve") | Yes | Timeline file format. |
| `project_id` | string | Yes | UUID of the project to export from. |
| `callback_url` | string | No | Webhook URL for job completion. |
| `strip_spaces` | boolean | No | AAF only. Strip spaces from media filenames for Logic Pro compatibility. Defaults to false. Rejected when true for other formats. |
| `composition_id` | string | No | Composition to export. Accepts a full UUID, a 5-character short ID from the project's Descript URL, or the project's full Descript URL (e.g. https://web.descript.com/{project_id}/{short_id}). Omit to use the first composition. |
| `include_markers` | boolean | No | Include markers in formats that support them (EDL, SESX). Defaults to the format-specific default (true for EDL/SESX/FCP/Premiere/DaVinci, false for AAF). |
| `snap_frame_rates` | boolean | No | Premiere / DaVinci Resolve only. When true, snaps to standard broadcast frame rates (24, 25, 30, 50, 60 + NTSC variants). When false, uses the source frame rate. Defaults to true. Rejected when false for other formats. |
| `create_track_per_file` | boolean | No | Generate one EDL/XML track per source media file rather than per script. Defaults to false. Not supported for fcp (FCPXML); rejected when true. |

### Export transcript

**Slug:** `DESCRIPT_MCP_EXPORT_TRANSCRIPT`

Export a project composition as a transcript document. Formats: txt, markdown, html, rtf, srt. Returns the exported content directly in the response.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `format` | string ("txt" | "markdown" | "html" | "rtf" | "srt") | Yes | Transcript format. |
| `timecodes` | object | No | Timecode options. When provided, timecodes are included in the output. |
| `project_id` | string | Yes | UUID of the project to export from. |
| `composition_id` | string | No | UUID of a specific composition. Omit to use the first composition. |
| `include_markers` | boolean | No | Include markers in transcript. |
| `include_speaker_labels` | string ("off" | "changes" | "every_paragraph") | No | Speaker label mode. off=none, changes=on speaker change, every_paragraph=every paragraph. Defaults to changes. |

### Get drive info

**Slug:** `DESCRIPT_MCP_GET_DRIVE_INFO`

Returns the drive (workspace) connected to the current session, including its ID and name. Use this to confirm which drive your requests will operate on.

### Get project

**Slug:** `DESCRIPT_MCP_GET_PROJECT`

Get a detailed project summary including all media files, compositions, and existing publishes. Returns the project's id, name, drive_id, created_at, updated_at, folder_path (if in a folder), a map of media files (keyed by display path) with type and duration, a list of compositions with id, name, duration, and media type, and a list of existing publishes with share_url, access_level, media_type, and publish time. Use this to inspect a project's contents before editing or importing media, or to retrieve existing share URLs without triggering a republish.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `project_id` | string | Yes | UUID of the project. |

### Import drive media

**Slug:** `DESCRIPT_MCP_IMPORT_DRIVE_MEDIA`

Import media files into the drive media library (not into a project). Use this when the user wants to add files to their media library without creating or editing a project. Supports URL imports and direct file uploads.

DIRECT FILE UPLOAD: Instead of a url, provide content_type (MIME type) and file_size (bytes). The response includes upload_urls — a map of media key → { upload_url, asset_id, artifact_id }. PUT each file to its upload_url with header Content-Type: application/octet-stream.

Returns immediately with a job_id and drive_id. Please use the wait_for_job tool with the returned job_id to wait for the job to complete.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `add_media` | object | Yes | Map of display name → media entry. Keys can include folder paths (e.g. "Recordings/intro.mp4"). Each entry is either a URL import (provide "url") or a direct upload (provide "content_type" and "file_size"). URL imports and direct uploads accept an optional "language" for transcription. |
| `folder_id` | string | No | Target folder ID in the drive media library. |
| `callback_url` | string | No | Webhook URL to receive job completion notification. |

### Import media

**Slug:** `DESCRIPT_MCP_IMPORT_MEDIA`

Import media into a Descript project via URLs (direct links, Google Drive, Dropbox) or direct file upload. Pass URLs as-is. Pass empty add_media ({}) with project_name to create an empty project.

ADDING TO COMPOSITION: When creating a new project, include add_compositions so imported media appears on the timeline — this is the expected default. Only omit add_compositions for new projects when the user explicitly asks to import without adding to the composition. When importing into an existing project, omit add_compositions unless the user requests it, to avoid disrupting existing edits. To append media to an EXISTING composition, use update_compositions (composition_id + append_clips) instead of add_compositions.

DIRECT FILE UPLOAD: Instead of a url, provide content_type (MIME type) and file_size (bytes). The response includes upload_urls — a map of media key → { upload_url, asset_id, artifact_id }. PUT each file to its upload_url with header Content-Type: application/octet-stream. The uploaded file size must match the file_size declared in the request.

Returns immediately with a job_id, project_id, and project_url. Always display the project_url to the user so they can open the project in Descript. Please use the wait_for_job tool with the returned job_id to wait for the job to complete.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `add_media` | object | Yes | Map of display name → media entry. Keys can include folder paths (e.g. "Recordings/intro.mp4") to organize media into folders in the project. Each entry is one of: a URL import (provide "url"), a direct upload (provide "content_type" and "file_size"), or a multitrack sequence (provide "tracks" array). Use exactly one variant per entry. URL imports and direct uploads accept an optional "language" for transcription. |
| `project_id` | string | No | UUID of an existing project. Mutually exclusive with project_name. |
| `folder_name` | string | No | Folder path to place the new project in (e.g. "Clients/Acme/Videos"). Use "/" to separate nested folders. Only valid when creating a new project (no project_id). Existing folders along the path are reused; missing segments are created automatically. Requires team_access to be set to "edit", "comment", or "view" — projects in folders must be accessible to drive members. |
| `team_access` | string ("edit" | "comment" | "view" | "none") | No | Team access for new projects. |
| `callback_url` | string | No | Webhook URL for job completion. |
| `project_name` | string | No | Name for a new project. Mutually exclusive with project_id. |
| `workspace_name` | string | No | Workspace to create the new project in, matched by name (case-insensitive). Only valid when creating a new project (no project_id). Reserved names: "Personal" (private space, requires team_access "none" or omitted) and "General" (shared drive workspace). "General" and custom workspaces require a shared team_access ("edit", "comment", or "view"); defaults to "view" when omitted. Custom workspaces require the caller to be a workspace member. |
| `add_compositions` | array | No | Compositions (timelines) to create from the imported media. Include this when creating a new project so media appears on the timeline. Omit when importing into an existing project unless the user asks to add to the timeline. |
| `update_compositions` | array | No | Append clips to existing compositions in the target project. Requires project_id. |

### List folders

**Slug:** `DESCRIPT_MCP_LIST_FOLDERS`

List folders in the drive. Returns each folder's full path from the drive root. By default lists root-level folders. Pass parent_path to list child folders of a specific parent. Use this to browse the folder hierarchy before filtering projects by folder_path.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `parent_path` | string | No | Parent folder path (e.g. "Clients/Acme"). Returns child folders of this folder. Omit to list root-level folders. |

### List jobs

**Slug:** `DESCRIPT_MCP_LIST_JOBS`

List recent jobs, optionally filtered by project or type. Job states: queued, running, stopped (check result.status), cancelled.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `type` | string ("import/project_media" | "agent" | "publish" | "export/timeline") | No | Filter by job type. |
| `project_id` | string | No | Filter by project UUID. |

### List projects

**Slug:** `DESCRIPT_MCP_LIST_PROJECTS`

List projects accessible to the authenticated user. Returns each project's id, name, created_at, updated_at, and folder_path (if the project is inside a folder). Use this to discover project IDs before editing or importing media. Supports cursor-based pagination — pass the next_cursor from a previous response's pagination field to fetch the next page.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `name` | string | No | Filter projects whose name contains this string (case-insensitive). |
| `sort` | string ("name" | "created_at" | "updated_at" | "last_viewed_at") | No | Sort field (default: created_at). |
| `limit` | number | No | Number of projects per page (1-100, default 20). |
| `cursor` | string | No | Pagination cursor from a previous response's next_cursor. |
| `direction` | string ("asc" | "desc") | No | Sort direction (default: desc). |
| `created_by` | string | No | Filter projects created by this user UUID. Pass `me` to filter by the authenticated user. |
| `folder_path` | string | No | Filter projects by folder path (e.g. "Clients/Acme/Videos"). Use "/" to separate nested folders. Returns only projects directly inside the deepest folder. |
| `created_after` | string | No | Filter projects created after this ISO 8601 timestamp. |
| `updated_after` | string | No | Filter projects updated after this ISO 8601 timestamp. |
| `created_before` | string | No | Filter projects created before this ISO 8601 timestamp. |
| `updated_before` | string | No | Filter projects updated before this ISO 8601 timestamp. |

### Prompt project agent

**Slug:** `DESCRIPT_MCP_PROMPT_PROJECT_AGENT`

Agent Underlord, Descript's built-in AI editor, queries, creates, and edits Descript projects using natural language. Refer to it as Agent Underlord when telling the user what is doing the editing, since that is the name they see in the Descript app. Use project_id for existing projects, project_name to create new ones. Returns immediately with a job_id, project_id, and project_url. Always display the project_url to the user so they can open the project in Descript. Please use the wait_for_job tool with the returned job_id to wait for the job to complete. The response includes a conversation_id — pass it back on subsequent calls to the same project to continue the conversation with full context.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `model` | string | No | AI model override. Omit for default.  Available models:   - auto (cost: medium)   - claude-fable-5 (cost: high)   - claude-opus-4.8 (cost: high)   - claude-opus-4.7 (cost: high)   - claude-opus-4.6 (cost: high)   - claude-sonnet-5 (cost: medium)   - claude-sonnet-4.6 (cost: medium)   - claude-haiku-4.5 (cost: low)  Aliases:   - claude-fable (cost: high) → claude-fable-5 (Tracks stable Anthropic Claude Fable)   - claude-opus (cost: high) → claude-opus-4.8 (Tracks stable Anthropic Claude Opus)   - claude-sonnet (cost: medium) → claude-sonnet-4.6 (Tracks stable Anthropic Claude Sonnet)   - claude-haiku (cost: low) → claude-haiku-4.5 (Tracks stable Anthropic Claude Haiku) |
| `prompt` | string | Yes | Natural language instructions for the agent. |
| `project_id` | string | No | UUID of an existing project to edit. Provide either project_id or project_name, not both. |
| `callback_url` | string | No | Webhook URL for job completion. |
| `project_name` | string | No | Name for a new project to create. Provide either project_id or project_name, not both. |
| `composition_id` | string | No | Composition to target. Accepts a full UUID, a 5-character short ID from the project's Descript URL, or the project's full Descript URL (e.g. https://web.descript.com/{project_id}/{short_id}). Use get_project to find available composition IDs for this project. Omit to target the whole project. |
| `conversation_id` | string | No | Pass the conversation_id returned by the previous call to continue that conversation with full context; omit to start a new conversation. |

### Publish project

**Slug:** `DESCRIPT_MCP_PUBLISH_PROJECT`

Publish a Descript project composition as video or audio, producing a shareable URL. Requires a project_id. Optionally specify a composition_id (defaults to the first composition). Publishing the same composition again automatically reuses the previous share URL, overwriting its content; Video and Audio publishes of the same composition get separate share URLs. If the composition has no video content: omitting media_type publishes it as audio (the result reports media_type="Audio"), while explicitly requesting media_type="Video" fails with a 422. Returns immediately with a job_id. Please use the wait_for_job tool with the returned job_id to wait for the job to complete. When the job completes, always display the share_url and download_url from the result to the user.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `media_type` | string ("Video" | "Audio") | No | Media type of the published output (default "Video"). For an audio-only composition, omit this to auto-publish as audio; explicitly passing "Video" fails with a 422. |
| `project_id` | string | Yes | UUID of the project to publish. |
| `resolution` | string ("480p" | "720p" | "1080p" | "1440p" | "4K") | No | Resolution for the published output (default determined by project). |
| `access_level` | string ("public" | "unlisted" | "drive" | "private") | No | Desired access level for the published share page. Defaults to the drive default. Fails with 403 if the requested level is not permitted by the drive publish settings. |
| `callback_url` | string | No | Webhook URL for job completion. |
| `composition_id` | string | No | Composition to publish. Accepts a full UUID, a 5-character short ID from the project's Descript URL, or the project's full Descript URL (e.g. https://web.descript.com/{project_id}/{short_id}). Use get_project to find available composition IDs for this project. Defaults to the first composition if omitted. |

### Report upload status

**Slug:** `DESCRIPT_MCP_REPORT_UPLOAD_STATUS`

Report that a specific direct upload failed, was aborted, or was abandoned so the import job stops waiting on just that file (other files keep uploading). Use this after a PUT to an upload_url errors ("failed"), the user cancels an in-flight upload ("aborted"), or a file will never be uploaded ("abandoned", e.g. the upload UI was dismissed). media_id is the key from the import request's add_media / upload_urls map.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `detail` | string | No | Optional free-text context (e.g. "HTTP 403 from storage"). |
| `job_id` | string | Yes | ID of the import job that owns the upload. |
| `status` | string ("failed" | "aborted" | "abandoned") | Yes | failed = the PUT errored; aborted = cancelled in flight; abandoned = never attempted. |
| `media_id` | string | Yes | Media key (from the import request's add_media / upload_urls) to report. |

### Wait for job

**Slug:** `DESCRIPT_MCP_WAIT_FOR_JOB`

Wait for a job to complete. Polls for completion by default (840s) and streams progress updates. Set wait_seconds to 0 to return immediately without waiting. Job states: queued, running, stopped, cancelled. A stopped job has a result object — check result.status for "success" or "error". These jobs routinely run for many minutes, so a long wait is normal rather than a stall. If the job is still going when the wait window elapses, the call still succeeds and returns a non-terminal job_state with wait_status "still_running". That is not a failure — call wait_for_job again with the same job_id and keep calling until job_state is "stopped" or "cancelled". While the job is running, progress.label contains a human-readable status (e.g. "Editing script", "Searching web") — display this to the user so they can see what the agent is doing. The response includes project_url — when a composition ID is available in the result, the URL includes a composition short ID suffix so it opens directly to the right composition. Always display project_url to the user. A completed export_timeline job returns a time-limited result.download_url (valid until result.download_url_expires_at); always display this URL to the user so they can download the file directly. For prompt_project_agent jobs, the completed result includes result.conversation_id — save it and pass it back as conversation_id on the next prompt_project_agent call to the same project to continue the conversation.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `job_id` | string | Yes | The job_id returned by import_media, prompt_project_agent, publish_project, or export_timeline. |
| `wait_seconds` | number | No | Seconds to poll for completion (default 840, max 840). Set 0 to return immediately. |
