# Magic Hour (remote · mcp.magichour.ai)

Create and edit images, videos, and audio through Magic Hour's hosted Streamable HTTP MCP server.

- Trust score: 73/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- remote · `mcp.magichour.ai`: 73/100 (this document), [markdown](https://verifymcp.io/servers/magichourhq-magic-hour/mcp.md), [page](https://verifymcp.io/servers/magichourhq-magic-hour/mcp)

## Channel facts

- Endpoint: `https://mcp.magichour.ai/`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.1.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 45 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 70/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 25080 tokens (~545/item across 46 items; 45 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 64/100
  - Stability check failed: schema churn in the 20 days we've observed: 1 tool removals, 0 breaking changes, 0 auth/transport breaks, 2 additions.
- **Tool Coverage**: 95/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 84% of tool parameters carry a description.
  - Structured output schemas are declared (80% of tools); any adoption earns full credit.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "video_projects_delete" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 47 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.
  - Supports UI / widget rendering.

## Install

### How do I install the Magic Hour MCP server?

Magic Hour is a hosted endpoint at https://mcp.magichour.ai/, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http magichourhq-magic-hour 'https://mcp.magichour.ai/'
```

### Cursor

```json
{
  "mcpServers": {
    "magichourhq-magic-hour": {
      "url": "https://mcp.magichour.ai/"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "magichourhq-magic-hour": {
      "type": "http",
      "url": "https://mcp.magichour.ai/"
    }
  }
}
```

### Codex

```toml
[mcp_servers.magichourhq-magic-hour]
url = "https://mcp.magichour.ai/"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "magichourhq-magic-hour": {
      "type": "remote",
      "url": "https://mcp.magichour.ai/",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add magichourhq-magic-hour --url 'https://mcp.magichour.ai/' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  magichourhq-magic-hour:
    url: "https://mcp.magichour.ai/"
```

### Netclaw

```json
{
  "McpServers": {
    "magichourhq-magic-hour": {
      "Transport": "http",
      "Url": "https://mcp.magichour.ai/"
    }
  }
}
```

### Vellum

```bash
assistant mcp add magichourhq-magic-hour -t streamable-http -u 'https://mcp.magichour.ai/'
```

### Other

```json
{
  "mcpServers": {
    "magichourhq-magic-hour": {
      "type": "http",
      "url": "https://mcp.magichour.ai/"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 73, +1)

No change was recorded against any check on this day. Stability & Change Management went from 61 to 64.

### 2026-09-19 (score 72, 0)

- [functional] New tool “saved_items_list”
- [cosmetic] “image_to_video_create_video” reworded the description of “audio”
- [cosmetic] “image_to_video_create_video” reworded the description of “end_seconds”
- [cosmetic] “image_to_video_create_video” reworded the description of “model”
- [cosmetic] “image_to_video_create_video” reworded the description of “resolution”
- [cosmetic] “text_to_video_create_video” reworded the description of “aspect_ratio”
- [cosmetic] “text_to_video_create_video” reworded the description of “audio”
- [cosmetic] “text_to_video_create_video” reworded the description of “end_seconds”
- [cosmetic] “text_to_video_create_video” reworded the description of “model”
- [cosmetic] “text_to_video_create_video” reworded the description of “resolution”

### 2026-09-18 (score 72, +1)

No change was recorded against any check on this day. Stability & Change Management went from 54 to 57.

### 2026-09-17 (score 71, 0)

- [cosmetic] “ai_image_editor_create_image” reworded the description of “model”
- [cosmetic] “ai_image_editor_create_image” reworded the description of “resolution”
- [cosmetic] “ai_image_generator_create_image” reworded the description of “model”
- [cosmetic] “ai_image_generator_create_image” reworded the description of “resolution”

### 2026-09-16 (score 71, +1)

No change was recorded against any check on this day. Stability & Change Management went from 47 to 51.

### 2026-09-13 (score 70, +1)

- [security] The server rewrote its instructions, which are the text every model session reads

### 2026-09-12 (score 69, 0)

- [functional regression] Schema quality: 406 → 540
- [functional improvement] Tool coverage: 79% → 84%
- [cosmetic] “account_retrieve” added an optional parameter “context”
- [cosmetic] “ai_clothes_changer_create_image” added an optional parameter “context”
- [cosmetic] “ai_face_editor_edit_image” added an optional parameter “context”
- [cosmetic] “ai_gif_generator_create_image” added an optional parameter “context”
- [cosmetic] “ai_headshot_generator_create_image” added an optional parameter “context”
- [cosmetic] “ai_image_editor_create_image” added an optional parameter “context”
- [cosmetic] “ai_image_generator_create_image” added an optional parameter “context”
- [cosmetic] “ai_image_upscaler_create_image” added an optional parameter “context”
- [cosmetic] “ai_meme_generator_create_image” added an optional parameter “context”
- [cosmetic] “ai_qr_code_generator_create_image” added an optional parameter “context”
- [cosmetic] “ai_talking_photo_create_talking_photo” added an optional parameter “context”
- [cosmetic] “ai_video_editor_create_video” added an optional parameter “context”
- [cosmetic] “ai_voice_cloner_create_audio” added an optional parameter “context”
- [cosmetic] “ai_voice_generator_create_audio” added an optional parameter “context”
- [cosmetic] “animation_create_video” added an optional parameter “context”
- [cosmetic] “audio_projects_delete” added an optional parameter “context”
- [cosmetic] “audio_projects_retrieve_details” added an optional parameter “context”
- [cosmetic] “audio_to_video_create_video” added an optional parameter “context”
- [cosmetic] “auto_subtitle_generator_create_video” added an optional parameter “context”
- [cosmetic] “body_swap_create_image” added an optional parameter “context”
- [cosmetic] “character_replace_create_video” added an optional parameter “context”
- [cosmetic] “face_detection_detect_faces” added an optional parameter “context”
- [cosmetic] “face_detection_retrieve_details” added an optional parameter “context”
- [cosmetic] “face_swap_create_video” added an optional parameter “context”
- [cosmetic] “face_swap_photo_create_image” added an optional parameter “context”
- [cosmetic] “fetch_audio_download” added an optional parameter “context”
- [cosmetic] “fetch_image_download” added an optional parameter “context”
- [cosmetic] “fetch_video_download” added an optional parameter “context”
- [cosmetic] “head_swap_create_image” added an optional parameter “context”
- [cosmetic] “image_background_remover_create_image” added an optional parameter “context”
- [cosmetic] “image_projects_delete” added an optional parameter “context”
- [cosmetic] “image_projects_retrieve_details” added an optional parameter “context”
- [cosmetic] “image_to_video_create_video” added an optional parameter “context”
- [cosmetic] “lip_sync_create_video” added an optional parameter “context”
- [cosmetic] “photo_colorizer_create_image” added an optional parameter “context”
- [cosmetic] “ping” added an optional parameter “context”
- [cosmetic] “text_to_video_create_video” added an optional parameter “context”
- [cosmetic] “video_assets_generate_presigned_url” added an optional parameter “context”
- [cosmetic] “video_projects_delete” added an optional parameter “context”
- [cosmetic] “video_projects_retrieve_details” added an optional parameter “context”
- [cosmetic] “video_to_video_create_video” added an optional parameter “context”
- [cosmetic] “wait_for_audio_project” added an optional parameter “context”
- [cosmetic] “wait_for_image_project” added an optional parameter “context”
- [cosmetic] “wait_for_video_project” added an optional parameter “context”
- [cosmetic] “ai_image_editor_create_image” reworded the description of “model”
- [cosmetic] “ai_image_editor_create_image” reworded the description of “resolution”
- [cosmetic] “ai_image_generator_create_image” reworded the description of “model”
- [cosmetic] “ai_image_generator_create_image” reworded the description of “resolution”

### 2026-09-11 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 31 to 34.

## MCP tools (45)

### `ping` (~150 tokens)

Check that the Magic Hour MCP server is reachable.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…

Output parameters:

- `result` (string)

### `wait_for_video_project` (~242 tokens)

Poll a video project until it completes, errors, is canceled, or times out. Returns sanitized download fields. Use `exact_download_urls[n]` or `downloads[n].url` exactly as returned; do not shorten it, remove query parameters, or append expiration metadata.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `id` (string, required)
- `include_inline_downloads` (boolean)
- `max_inline_downloads` (integer)
- `poll_interval_seconds` (number)
- `timeout_seconds` (number)

### `wait_for_image_project` (~273 tokens)

Poll an image project until it completes, errors, is canceled, or times out. Returns the final project JSON and, when complete, attempts to inline image downloads for Inspector or compatible clients. Returns sanitized download fields. Use `exact_download_urls[n]` or `downloads[n].url` exactly as returned; do not shorten it, remove query parameters, or append expiration metadata.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `id` (string, required)
- `include_inline_downloads` (boolean)
- `max_bytes_per_download` (integer)
- `max_inline_downloads` (integer)
- `poll_interval_seconds` (number)
- `timeout_seconds` (number)

### `wait_for_audio_project` (~273 tokens)

Poll an audio project until it completes, errors, is canceled, or times out. Returns the final project JSON and, when complete, attempts to inline audio downloads for Inspector or compatible clients. Returns sanitized download fields. Use `exact_download_urls[n]` or `downloads[n].url` exactly as returned; do not shorten it, remove query parameters, or append expiration metadata.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `id` (string, required)
- `include_inline_downloads` (boolean)
- `max_bytes_per_download` (integer)
- `max_inline_downloads` (integer)
- `poll_interval_seconds` (number)
- `timeout_seconds` (number)

### `fetch_image_download` (~216 tokens)

Fetch a image `downloads[n].url` from a completed image project and return it as inline MCP image content for compatible clients. Pass the exact full signed URL from `downloads[n].url` without trimming query parameters; `expires_at` is separate metadata, not part of the URL.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `download_url` (string, required)
- `max_bytes` (integer)

### `fetch_audio_download` (~216 tokens)

Fetch a audio `downloads[n].url` from a completed audio project and return it as inline MCP audio content for compatible clients. Pass the exact full signed URL from `downloads[n].url` without trimming query parameters; `expires_at` is separate metadata, not part of the URL.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `download_url` (string, required)
- `max_bytes` (integer)

### `fetch_video_download` (~217 tokens)

Fetch a video `downloads[n].url` from a completed video project and return it as an embedded MCP binary resource for compatible clients. Pass the exact full signed URL from `downloads[n].url` without trimming query parameters; `expires_at` is separate metadata, not part of the URL.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `download_url` (string, required)
- `max_bytes` (integer)

### `account_retrieve` (~159 tokens)

Get the current credit balance and subscription details of the account that owns the API key.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…

Output parameters:

- `credits` (integer): Credits currently available to spend. Includes subscription credits and any purchased credit packs.
- `email` (string|null): Email address of the account.
- `id` (string): Unique ID of the account that owns the API key.
- `subscription` (object|null): Details of the account's subscription plan. `null` if the account has no subscription, e.g. a free account, an account that only purchased credit packs, or an account on usage-based API pricing. Ref…
- `tier` (string): Subscription tier in effect for the account. `free` if there is no active subscription, including while a subscription is `past_due`.

### `saved_items_list` (~267 tokens)

Returns active saved items owned by the authenticated account, newest first. Each item includes every saved asset with a durable file_path for reuse in compatible generation APIs and a temporary signed URL for previewing or downloading. Filter by type to find characters, references, voices, moodboards, or brand kits. To fetch the next page, pass the response's next_cursor as cursor.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `cursor` (string): Opaque pagination cursor from the previous response's next_cursor.
- `limit` (integer): Maximum number of saved items to return. Defaults to 20.
- `type` (string): Only return saved items of this type.

Output parameters:

- `items` (array)
- `next_cursor` (string|null): Cursor for the next page, or null when there are no more saved items.

### `video_assets_generate_presigned_url` (~559 tokens)

Generates a list of pre-signed upload URLs for the assets required. This API is only necessary if you want to upload to Magic Hour's storage. Refer to the [Input Files Guide](https://docs.magichour.ai/integration/inputs-and-outputs) for more details.

The response array will match the order of items in the request body.

\**Valid file extensions per asset type**:
\- video: mp4, m4v, mov, webm
\- audio: mp3, wav, aac, flac, webm, weba, m4a, opus, ogg, oga, aiff, amr
\- image: png, jpg, jpeg, jfif, heic, heif, webp, avif, jp2, tiff, tif, bmp
\- gif: gif, webp, webm

\> Note: `gif` is only supported for face swap API `video_file_path` field.

Once you receive an upload URL, send a `PUT` request to upload the file directly.

Example:

\```
curl -X PUT --data '@/path/to/file/video.mp4' \
  https://videos.magichour.ai/api-assets/id/video.mp4?<auth params from the API response>
\```

MCP guidance:
\- This only creates presigned upload URLs. For local files, upload the raw bytes to each returned `upload_url` outside the generation call, then pass the matching `file_path` into the create tool.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `items` (array, required): The list of assets to upload. The response array will match the order of items in the request body.

Output parameters:

- `items` (array): The list of upload URLs and file paths for the assets. The response array will match the order of items in the request body. Refer to the [Input Files Guide](https://docs.magichour.ai/integration/inp…

### `face_detection_retrieve_details` (~268 tokens)

Get the details of a face detection task. 

Use this API to get the list of faces detected in the image or video to use in the [face swap photo](https://docs.magichour.ai/api-reference/image-projects/face-swap-photo) or [face swap video](https://docs.magichour.ai/api-reference/video-projects/face-swap-video) API calls for multi-face swaps.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `id` (string, required): The id of the task. This value is returned by the [face detection API](https://docs.magichour.ai/api-reference/files/face-detection#response-id).

Output parameters:

- `credits_charged` (integer): The credits charged for the task.
- `faces` (array): The faces detected in the image or video. The list is populated as faces are detected.
- `id` (string): The id of the task. This value is returned by the [face detection API](https://docs.magichour.ai/api-reference/files/face-detection#response-id).
- `status` (string): The status of the detection.

### `face_detection_detect_faces` (~446 tokens)

Detect faces in an image or video. 
      
Use this API to get the list of faces detected in the image or video to use in the [face swap photo](https://docs.magichour.ai/api-reference/image-projects/face-swap-photo) or [face swap video](https://docs.magichour.ai/api-reference/video-projects/face-swap-video) API calls for multi-face swaps.

Note: Face detection is free to use for the near future. Pricing may change in the future.

MCP guidance:
\- This starts an async face-detection task and returns an `id`. Use the face-detection details endpoint with that id to retrieve detected faces before doing individual face swaps.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Provide the assets for face detection
- `confidence_score` (number): Confidence threshold for filtering detected faces.  * Higher values (e.g., 0.9) include only faces detected with high certainty, reducing false positives.  * Lower values (e.g., 0.3) include more fac…
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…

Output parameters:

- `credits_charged` (integer): The credits charged for the task.
- `id` (string): The id of the task. Use this value in the [get face detection details API](https://docs.magichour.ai/api-reference/files/get-face-detection-details) to get the details of the face detection task.

### `video_projects_retrieve_details` (~340 tokens)

Check the progress of a video project. The `downloads` field is populated after a successful render.
  
\**Statuses**
\- `queued` — waiting to start
\- `rendering` — in progress
\- `complete` — ready; see `downloads`
\- `error` — a failure occurred (see `error`)
\- `canceled` — user canceled
\- `draft` — not used

MCP guidance:
\- Use this after a create tool to poll job status. When status is `complete`, surface the `downloads` URLs to the user; if status is `error`, surface the error message.
\- Each `downloads[n].url` is already the full signed download URL. Use it exactly as returned. Do not shorten it, strip query parameters, or append `expires_at` onto the URL string.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `id` (string, required): Unique ID of the video project. This value is returned by all of the POST APIs that create a video.

Output parameters:

- `created_at` (string)
- `credits_charged` (integer): The amount of credits deducted from your account to generate the video. If the status is not 'complete', this value is an estimate and may be adjusted upon completion based on the actual FPS of the o…
- `downloads` (array)
- `enabled` (boolean): Whether this resource is active. If false, it is deleted.
- `end_seconds` (number): End time of your clip (seconds). Must be greater than start_seconds.
- `error` (object|null): In the case of an error, this object will contain the error encountered during video render
- `fps` (number): Frame rate of the video. If the status is not 'complete', the frame rate is an estimate and will be adjusted when the video completes.
- `height` (integer): The height of the final output video. A value of -1 indicates the height can be ignored.
- `id` (string): Unique ID of the video. Use it with the [Get video Project API](https://docs.magichour.ai/api-reference/video-projects/get-video-details) to fetch status and downloads.
- `name` (string|null): The name of the video.
- `start_seconds` (number): Start time of your clip (seconds). Must be ≥ 0.
- `status` (string): The status of the video. - `draft` - the project was created but has not been submitted for rendering - `queued` - the job is waiting for an available server - `rendering` - the job is being process…
- `type` (string): The type of the video project. Possible values are ANIMATION, AUTO_SUBTITLE, VIDEO_TO_VIDEO, FACE_SWAP, TEXT_TO_VIDEO, IMAGE_TO_VIDEO, LIP_SYNC, TALKING_PHOTO, AVATAR, VIDEO_UPSCALER, VIDEO_EDITOR, C…
- `width` (integer): The width of the final output video. A value of -1 indicates the width can be ignored.

### `video_projects_delete` (~189 tokens)

Permanently delete the rendered video. This action is not reversible, please be sure before deleting.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `id` (string, required): Unique ID of the video project. This value is returned by all of the POST APIs that create a video.

### `ai_talking_photo_create_talking_photo` (~516 tokens)

Create a talking photo from an image and audio or text input.

MCP guidance:
\- This starts an async video generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_video_project` helper with the returned id, or poll the matching `GET /v1/video-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Provide the assets for creating a talking photo
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `end_seconds` (number, required): The end time of the input audio in seconds. Maximum clip length depends on style.generation_mode: realistic 300s, prompted 45s.
- `max_resolution` (integer): Constrains the larger dimension (height or width) of the output video. Allows you to set a lower resolution than your plan's maximum if desired. The value is capped by your plan's max resolution.
- `name` (string): Give your image a custom name for easy identification.
- `start_seconds` (number, required): The start time of the input audio in seconds. Maximum clip length depends on style.generation_mode: realistic 300s, prompted 45s.
- `style` (object): Attributes used to dictate the style of the output

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the video. If the status is not 'complete', this value is an estimate and may be adjusted upon completion based on the actual FPS of the o…
- `id` (string): Unique ID of the video. Use it with the [Get video Project API](https://docs.magichour.ai/api-reference/video-projects/get-video-details) to fetch status and downloads.

### `ai_video_editor_create_video` (~895 tokens)

\**What this API does**

Create the same Video Editor you can make in the browser, but programmatically, so you can automate it, run it at scale, or connect it to your own app or workflow.
    
\**Good for**
\- Automation and batch processing  
\- Adding video editor into apps, pipelines, or tools  

\**How it works (3 steps)**
1\) Upload your inputs (video, image, or audio) with [Generate Upload URLs](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls) and copy the `file_path`.  
2\) Send a request to create a video editor job with the basic fields.  
3\) Check the job status until it's `complete`, then download the result from `downloads`.

\**Key options**
\- Inputs: usually a file, sometimes a YouTube link, depending on project type  
\- Resolution: free users are limited to 576px; higher plans unlock HD and larger sizes  
\- Extra fields: e.g. `face_swap_mode`, `start_seconds`/`end_seconds`, or a text prompt  

\**Cost**  
Credits are only charged for the frames that actually render. You'll see an estimate when the job is queued, and the final total after it's done.

For detailed examples, see the [product page](https://magichour.ai/products/ai-video-editor).

MCP guidance:
\- This starts an async video generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_video_project` helper with the returned id, or poll the matching `GET /v1/video-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first…

Input parameters:

- `assets` (object, required): Provide the assets for video editing.
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `end_seconds` (number, required): End time of your clip in seconds. Must be greater than `start_seconds`. Minimum duration depends on model: `gemini-omni-1.1`: 3s, `ltx-2.3`: 0.5s. Maximum duration depends on model: `gemini-omni-1.1`…
- `model` (string): Editing model. Defaults to `ltx-2.3` for free tier and `gemini-omni-1.1` for paid. `gemini-omni` is deprecated; use `gemini-omni-1.1` instead.
- `name` (string): Give your video a custom name for easy identification.
- `resolution` (string): Output resolution. Defaults to `480p` for free tier and `720p` for paid. `gemini-omni-1.1` and deprecated `gemini-omni` support 720p and 1080p; LTX-2.3 supports 480p, 720p, and 1080p.
- `start_seconds` (number): Start time of your clip (seconds). Must be ≥ 0.
- `style` (object, required)

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the video. If the status is not 'complete', this value is an estimate and may be adjusted upon completion based on the actual FPS of the o…
- `id` (string): Unique ID of the video. Use it with the [Get video Project API](https://docs.magichour.ai/api-reference/video-projects/get-video-details) to fetch status and downloads.

### `animation_create_video` (~510 tokens)

Create a Animation video. The estimated frame cost is calculated based on the `fps` and `end_seconds` input.

MCP guidance:
\- This starts an async video generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_video_project` helper with the returned id, or poll the matching `GET /v1/video-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Provide the assets for animation.
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `end_seconds` (number, required): This value determines the duration of the output video.
- `fps` (number, required): The desire output video frame rate
- `height` (integer, required): The height of the final output video. The maximum height depends on your subscription. Please refer to our [pricing page](https://magichour.ai/pricing) for more details
- `name` (string): Give your video a custom name for easy identification.
- `style` (object, required): Defines the style of the output video
- `width` (integer, required): The width of the final output video. The maximum width depends on your subscription. Please refer to our [pricing page](https://magichour.ai/pricing) for more details

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the video. If the status is not 'complete', this value is an estimate and may be adjusted upon completion based on the actual FPS of the o…
- `id` (string): Unique ID of the video. Use it with the [Get video Project API](https://docs.magichour.ai/api-reference/video-projects/get-video-details) to fetch status and downloads.

### `audio_to_video_create_video` (~730 tokens)

\**What this API does**

Create the same Audio To Video you can make in the browser, but programmatically, so you can automate it, run it at scale, or connect it to your own app or workflow.
    
\**Good for**
\- Automation and batch processing  
\- Adding audio to video into apps, pipelines, or tools  

\**How it works (3 steps)**
1\) Upload your inputs (video, image, or audio) with [Generate Upload URLs](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls) and copy the `file_path`.  
2\) Send a request to create a audio to video job with the basic fields.  
3\) Check the job status until it's `complete`, then download the result from `downloads`.

\**Key options**
\- Inputs: usually a file, sometimes a YouTube link, depending on project type  
\- Resolution: free users are limited to 576px; higher plans unlock HD and larger sizes  
\- Extra fields: e.g. `face_swap_mode`, `start_seconds`/`end_seconds`, or a text prompt  

\**Cost**  
Credits are only charged for the frames that actually render. You'll see an estimate when the job is queued, and the final total after it's done.

For detailed examples, see the [product page](https://magichour.ai/products/audio-to-video).

MCP guidance:
\- This starts an async video generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_video_project` helper with the returned id, or poll the matching `GET /v1/video-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow…

Input parameters:

- `assets` (object, required): Provide the audio file and an optional reference image.
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `end_seconds` (number, required): End time of your clip (seconds). Must be greater than start_seconds.
- `name` (string): Give your video a custom name for easy identification.
- `resolution` (string): Output video resolution. Defaults to `720p` on paid tiers and `480p` on free tiers.
- `start_seconds` (number): Start time of your clip (seconds). Must be ≥ 0.
- `style` (object): Attributes used to dictate the style of the output

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the video. If the status is not 'complete', this value is an estimate and may be adjusted upon completion based on the actual FPS of the o…
- `id` (string): Unique ID of the video. Use it with the [Get video Project API](https://docs.magichour.ai/api-reference/video-projects/get-video-details) to fetch status and downloads.

### `auto_subtitle_generator_create_video` (~560 tokens)

Automatically generate subtitles for your video in multiple languages.

MCP guidance:
\- This starts an async video generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_video_project` helper with the returned id, or poll the matching `GET /v1/video-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Provide the assets for auto subtitle generator
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `end_seconds` (number, required): End time of your clip (seconds). Must be greater than start_seconds.
- `name` (string): Give your video a custom name for easy identification.
- `start_seconds` (number, required): Start time of your clip (seconds). Must be ≥ 0.
- `style` (object, required): Style of the subtitle. At least one of `.style.template` or `.style.custom_config` must be provided.  * If only `.style.template` is provided, default values for the template will be used. * If both…

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the video. If the status is not 'complete', this value is an estimate and may be adjusted upon completion based on the actual FPS of the o…
- `id` (string): Unique ID of the video. Use it with the [Get video Project API](https://docs.magichour.ai/api-reference/video-projects/get-video-details) to fetch status and downloads.

### `character_replace_create_video` (~725 tokens)

\**What this API does**

Create the same Character Replace you can make in the browser, but programmatically, so you can automate it, run it at scale, or connect it to your own app or workflow.
    
\**Good for**
\- Automation and batch processing  
\- Adding character replace into apps, pipelines, or tools  

\**How it works (3 steps)**
1\) Upload your inputs (video, image, or audio) with [Generate Upload URLs](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls) and copy the `file_path`.  
2\) Send a request to create a character replace job with the basic fields.  
3\) Check the job status until it's `complete`, then download the result from `downloads`.

\**Key options**
\- Inputs: usually a file, sometimes a YouTube link, depending on project type  
\- Resolution: free users are limited to 576px; higher plans unlock HD and larger sizes  
\- Extra fields: e.g. `face_swap_mode`, `start_seconds`/`end_seconds`, or a text prompt  

\**Cost**  
Credits are only charged for the frames that actually render. You'll see an estimate when the job is queued, and the final total after it's done.

For detailed examples, see the [product page](https://magichour.ai/products/character-replace).

MCP guidance:
\- This starts an async video generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_video_project` helper with the returned id, or poll the matching `GET /v1/video-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned…

Input parameters:

- `assets` (object, required): Source video and reference character image for the job.
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `end_seconds` (number, required): End time of your clip (seconds). Must be greater than start_seconds.
- `name` (string): Give your video a custom name for easy identification.
- `resolution` (string): Output video resolution. Defaults to 480p, the lowest resolution available on your plan.
- `start_seconds` (number): Start time of your clip (seconds). Must be ≥ 0.
- `style` (object): Optional style controls for replace vs animate mode and subject selection.

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the video. If the status is not 'complete', this value is an estimate and may be adjusted upon completion based on the actual FPS of the o…
- `id` (string): Unique ID of the video. Use it with the [Get video Project API](https://docs.magichour.ai/api-reference/video-projects/get-video-details) to fetch status and downloads.

### `face_swap_create_video` (~718 tokens)

\**What this API does**

Create the same Face Swap you can make in the browser, but programmatically, so you can automate it, run it at scale, or connect it to your own app or workflow.
    
\**Good for**
\- Automation and batch processing  
\- Adding face swap into apps, pipelines, or tools  

\**How it works (3 steps)**
1\) Upload your inputs (video, image, or audio) with [Generate Upload URLs](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls) and copy the `file_path`.  
2\) Send a request to create a face swap job with the basic fields.  
3\) Check the job status until it's `complete`, then download the result from `downloads`.

\**Key options**
\- Inputs: usually a file, sometimes a YouTube link, depending on project type  
\- Resolution: free users are limited to 576px; higher plans unlock HD and larger sizes  
\- Extra fields: e.g. `face_swap_mode`, `start_seconds`/`end_seconds`, or a text prompt  

\**Cost**  
Credits are only charged for the frames that actually render. You'll see an estimate when the job is queued, and the final total after it's done.

For detailed examples, see the [product page](https://magichour.ai/products/face-swap).

MCP guidance:
\- This starts an async video generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_video_project` helper with the returned id, or poll the matching `GET /v1/video-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the r…

Input parameters:

- `assets` (object, required): Provide the assets for face swap. For video, The `video_source` field determines whether `video_file_path` or `youtube_url` field is used
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `end_seconds` (number, required): End time of your clip (seconds). Must be greater than start_seconds.
- `name` (string): Give your video a custom name for easy identification.
- `start_seconds` (number, required): Start time of your clip (seconds). Must be ≥ 0.
- `style` (object): Style of the face swap video.

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the video. If the status is not 'complete', this value is an estimate and may be adjusted upon completion based on the actual FPS of the o…
- `id` (string): Unique ID of the video. Use it with the [Get video Project API](https://docs.magichour.ai/api-reference/video-projects/get-video-details) to fetch status and downloads.

### `image_to_video_create_video` (~2544 tokens)

\**What this API does**

Create the same Image To Video you can make in the browser, but programmatically, so you can automate it, run it at scale, or connect it to your own app or workflow.
    
\**Good for**
\- Automation and batch processing  
\- Adding image to video into apps, pipelines, or tools  

\**How it works (3 steps)**
1\) Upload your inputs (video, image, or audio) with [Generate Upload URLs](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls) and copy the `file_path`.  
2\) Send a request to create a image to video job with the basic fields.  
3\) Check the job status until it's `complete`, then download the result from `downloads`.

\**Key options**
\- Inputs: usually a file, sometimes a YouTube link, depending on project type  
\- Resolution: free users are limited to 576px; higher plans unlock HD and larger sizes  
\- Extra fields: e.g. `face_swap_mode`, `start_seconds`/`end_seconds`, or a text prompt  

\**Cost**  
Credits are only charged for the frames that actually render. You'll see an estimate when the job is queued, and the final total after it's done.

For detailed examples, see the [product page](https://magichour.ai/products/image-to-video).

MCP guidance:
\- This starts an async video generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_video_project` helper with the returned id, or poll the matching `GET /v1/video-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow…

Input parameters:

- `assets` (object, required): Provide the assets for image-to-video. Sora 2 only supports images with an aspect ratio of `9:16` or `16:9`.
- `audio` (boolean): Whether to include audio in the video. Defaults to `false` if not specified. Audio support varies by model: * **`gemini-omni-1.1`**: Not supported * **`kling-2.6`**: Not supported * **`kling-3.0`**:…
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `end_seconds` (number, required): The total duration of the output video in seconds. Supported durations depend on the chosen model: * **`gemini-omni-1.1`**: 3, 4, 5, 6, 7, 8, 9, 10 * **`kling-2.6`**: 5, 10 * **`kling-3.0`**: 3, 4,…
- `model` (string): The AI model to use for video generation. * `default`: uses our currently recommended model for general use. For paid tiers, defaults to `kling-3.0`. For free tiers, it defaults to `ltx-2.5`. * `gem…
- `name` (string): Give your video a custom name for easy identification.
- `resolution` (string): Controls the output video resolution. Defaults to `720p` on paid tiers and `480p` on free tiers. * **`gemini-omni-1.1`**: Supports 360p, 720p, 1080p, 4k. * **`kling-2.6`**: Supports 720p, 1080p. * *…
- `style` (object): Attributed used to dictate the style of the output

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the video. If the status is not 'complete', this value is an estimate and may be adjusted upon completion based on the actual FPS of the o…
- `id` (string): Unique ID of the video. Use it with the [Get video Project API](https://docs.magichour.ai/api-reference/video-projects/get-video-details) to fetch status and downloads.

### `lip_sync_create_video` (~780 tokens)

\**What this API does**

Create the same Lip Sync you can make in the browser, but programmatically, so you can automate it, run it at scale, or connect it to your own app or workflow.
    
\**Good for**
\- Automation and batch processing  
\- Adding lip sync into apps, pipelines, or tools  

\**How it works (3 steps)**
1\) Upload your inputs (video, image, or audio) with [Generate Upload URLs](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls) and copy the `file_path`.  
2\) Send a request to create a lip sync job with the basic fields.  
3\) Check the job status until it's `complete`, then download the result from `downloads`.

\**Key options**
\- Inputs: usually a file, sometimes a YouTube link, depending on project type  
\- Resolution: free users are limited to 576px; higher plans unlock HD and larger sizes  
\- Extra fields: e.g. `face_swap_mode`, `start_seconds`/`end_seconds`, or a text prompt  

\**Cost**  
Credits are only charged for the frames that actually render. You'll see an estimate when the job is queued, and the final total after it's done.

For detailed examples, see the [product page](https://magichour.ai/products/lip-sync).

MCP guidance:
\- This starts an async video generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_video_project` helper with the returned id, or poll the matching `GET /v1/video-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the retur…

Input parameters:

- `assets` (object, required): Provide the assets for lip-sync. For video, The `video_source` field determines whether `video_file_path` or `youtube_url` field is used
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `end_seconds` (number, required): End time of your clip (seconds). Must be greater than start_seconds.
- `max_fps_limit` (number): Defines the maximum FPS (frames per second) for the output video. If the input video's FPS is lower than this limit, the output video will retain the input FPS. This is useful for reducing unnecessar…
- `name` (string): Give your video a custom name for easy identification.
- `start_seconds` (number, required): Start time of your clip (seconds). Must be ≥ 0.
- `style` (object): Attributes used to dictate the style of the output

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the video. If the status is not 'complete', this value is an estimate and may be adjusted upon completion based on the actual FPS of the o…
- `id` (string): Unique ID of the video. Use it with the [Get video Project API](https://docs.magichour.ai/api-reference/video-projects/get-video-details) to fetch status and downloads.

### `text_to_video_create_video` (~2828 tokens)

\**What this API does**

Create the same Text To Video you can make in the browser, but programmatically, so you can automate it, run it at scale, or connect it to your own app or workflow.
    
\**Good for**
\- Automation and batch processing  
\- Adding text to video into apps, pipelines, or tools  

\**How it works (3 steps)**
1\) Upload your inputs (video, image, or audio) with [Generate Upload URLs](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls) and copy the `file_path`.  
2\) Send a request to create a text to video job with the basic fields.  
3\) Check the job status until it's `complete`, then download the result from `downloads`.

\**Key options**
\- Inputs: usually a file, sometimes a YouTube link, depending on project type  
\- Resolution: free users are limited to 576px; higher plans unlock HD and larger sizes  
\- Extra fields: e.g. `face_swap_mode`, `start_seconds`/`end_seconds`, or a text prompt  

\**Cost**  
Credits are only charged for the frames that actually render. You'll see an estimate when the job is queued, and the final total after it's done.

For detailed examples, see the [product page](https://magichour.ai/products/text-to-video).

MCP guidance:
\- This starts an async video generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_video_project` helper with the returned id, or poll the matching `GET /v1/video-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.

Input parameters:

- `aspect_ratio` (string): Determines the aspect ratio of the output video. * **`gemini-omni-1.1`**: Supports 16:9, 9:16. * **`kling-2.6`**: Supports 9:16, 16:9, 1:1. * **`kling-3.0`**: Supports 9:16, 16:9, 1:1. * **`ltx-2.3`…
- `audio` (boolean): Whether to include audio in the video. Defaults to `false` if not specified. Audio support varies by model: * **`gemini-omni-1.1`**: Not supported * **`kling-2.6`**: Not supported * **`kling-3.0`**:…
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `end_seconds` (number, required): The total duration of the output video in seconds. Supported durations depend on the chosen model: * **`gemini-omni-1.1`**: 3, 4, 5, 6, 7, 8, 9, 10 * **`kling-2.6`**: 5, 10 * **`kling-3.0`**: 3, 4,…
- `model` (string): The AI model to use for video generation. * `default`: uses our currently recommended model for general use. For paid tiers, defaults to `kling-3.0`. For free tiers, it defaults to `ltx-2.5`. * `gem…
- `name` (string): Give your video a custom name for easy identification.
- `resolution` (string): Controls the output video resolution. Defaults to `720p` on paid tiers and `480p` on free tiers. * **`gemini-omni-1.1`**: Supports 360p, 720p, 1080p, 4k. * **`kling-2.6`**: Supports 720p, 1080p. * *…
- `style` (object, required)

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the video. If the status is not 'complete', this value is an estimate and may be adjusted upon completion based on the actual FPS of the o…
- `id` (string): Unique ID of the video. Use it with the [Get video Project API](https://docs.magichour.ai/api-reference/video-projects/get-video-details) to fetch status and downloads.

### `video_to_video_create_video` (~780 tokens)

\**What this API does**

Create the same Video To Video you can make in the browser, but programmatically, so you can automate it, run it at scale, or connect it to your own app or workflow.
    
\**Good for**
\- Automation and batch processing  
\- Adding video to video into apps, pipelines, or tools  

\**How it works (3 steps)**
1\) Upload your inputs (video, image, or audio) with [Generate Upload URLs](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls) and copy the `file_path`.  
2\) Send a request to create a video to video job with the basic fields.  
3\) Check the job status until it's `complete`, then download the result from `downloads`.

\**Key options**
\- Inputs: usually a file, sometimes a YouTube link, depending on project type  
\- Resolution: free users are limited to 576px; higher plans unlock HD and larger sizes  
\- Extra fields: e.g. `face_swap_mode`, `start_seconds`/`end_seconds`, or a text prompt  

\**Cost**  
Credits are only charged for the frames that actually render. You'll see an estimate when the job is queued, and the final total after it's done.

For detailed examples, see the [product page](https://magichour.ai/products/video-to-video).

MCP guidance:
\- This starts an async video generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_video_project` helper with the returned id, or poll the matching `GET /v1/video-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow…

Input parameters:

- `assets` (object, required): Provide the assets for video-to-video. For video, The `video_source` field determines whether `video_file_path` or `youtube_url` field is used
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `end_seconds` (number, required): End time of your clip (seconds). Must be greater than start_seconds.
- `fps_resolution` (string): Determines whether the resulting video will have the same frame per second as the original video, or half. * `FULL` - the result video will have the same FPS as the input video * `HALF` - the result…
- `name` (string): Give your video a custom name for easy identification.
- `start_seconds` (number, required): Start time of your clip (seconds). Must be ≥ 0.
- `style` (object, required)

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the video. If the status is not 'complete', this value is an estimate and may be adjusted upon completion based on the actual FPS of the o…
- `id` (string): Unique ID of the video. Use it with the [Get video Project API](https://docs.magichour.ai/api-reference/video-projects/get-video-details) to fetch status and downloads.

### `image_projects_retrieve_details` (~340 tokens)

Check the progress of a image project. The `downloads` field is populated after a successful render.
  
\**Statuses**
\- `queued` — waiting to start
\- `rendering` — in progress
\- `complete` — ready; see `downloads`
\- `error` — a failure occurred (see `error`)
\- `canceled` — user canceled
\- `draft` — not used

MCP guidance:
\- Use this after a create tool to poll job status. When status is `complete`, surface the `downloads` URLs to the user; if status is `error`, surface the error message.
\- Each `downloads[n].url` is already the full signed download URL. Use it exactly as returned. Do not shorten it, strip query parameters, or append `expires_at` onto the URL string.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `id` (string, required): Unique ID of the image project. This value is returned by all of the POST APIs that create an image.

Output parameters:

- `created_at` (string)
- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `downloads` (array)
- `enabled` (boolean): Whether this resource is active. If false, it is deleted.
- `error` (object|null): In the case of an error, this object will contain the error encountered during video render
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.
- `image_count` (integer): Number of images generated
- `name` (string|null): The name of the image.
- `status` (string): The status of the image. - `draft` - the project was created but has not been submitted for rendering - `queued` - the job is waiting for an available server - `rendering` - the job is being process…
- `type` (string): The type of the image project. Possible values are FACE_EDITOR, AI_IMAGE_EDITOR, GENERATIVE_FILL, AI_SELFIE, AI_HEADSHOT, AI_INFLUENCER, AI_IMAGE, AI_MEME, CLOTHES_CHANGER, BACKGROUND_REMOVER, FACE_S…

### `image_projects_delete` (~190 tokens)

Permanently delete the rendered image(s). This action is not reversible, please be sure before deleting.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `id` (string, required): Unique ID of the image project. This value is returned by all of the POST APIs that create an image.

### `ai_clothes_changer_create_image` (~380 tokens)

Change outfits in photos in seconds with just a photo reference. Each photo costs 25 credits.

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Provide the assets for clothes changer
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `name` (string): Give your image a custom name for easy identification.

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `ai_face_editor_edit_image` (~419 tokens)

Edit facial features of an image using AI. Each edit costs 1 frame. The height/width of the output image depends on your subscription. Please refer to our [pricing](https://magichour.ai/pricing) page for more details

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Provide the assets for face editor
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `name` (string): Give your image a custom name for easy identification.
- `style` (object, required): Face editing parameters

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `ai_gif_generator_create_image` (~300 tokens)

Create an AI GIF. Each GIF costs 50 credits.

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `name` (string): Give your gif a custom name for easy identification.
- `output_format` (string): The output file format for the generated animation.
- `style` (object, required)

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `ai_image_editor_create_image` (~1520 tokens)

Edit images with AI.

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `aspect_ratio` (string): The aspect ratio of the output image(s). If not specified, defaults to `auto`.
- `assets` (object, required): Provide the assets for image edit
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `image_count` (number): Number of images to generate. Maximum varies by model. Defaults to 1 if not specified.
- `model` (string): The AI model to use for image editing. Each model has different capabilities and costs. **Models:** - `default` - Use the model we recommend, which will change over time. This is recommended unless…
- `name` (string): Give your image a custom name for easy identification.
- `resolution` (string): Maximum resolution (longest edge) for the output image. **Options:** - `640px` — up to 640px - `1k` — up to 1024px - `2k` — up to 2048px - `4k` — up to 4096px - `auto` — **Deprecated.** Mapped serve…
- `style` (object, required)

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `ai_headshot_generator_create_image` (~382 tokens)

Create an AI headshot. Each headshot costs 50 credits.

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Provide the assets for headshot photo
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `name` (string): Give your image a custom name for easy identification.
- `style` (object)

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `ai_image_generator_create_image` (~1528 tokens)

Create an AI image with advanced model selection and quality controls.

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.

Input parameters:

- `aspect_ratio` (string): The aspect ratio of the output image(s). If not specified, defaults to `1:1` (square).
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `image_count` (integer, required): Number of images to generate. Maximum varies by model.
- `model` (string): The AI model to use for image generation. Each model has different capabilities and costs. **Models:** - `default` - Use the model we recommend, which will change over time. This is recommended unle…
- `name` (string): Give your image a custom name for easy identification.
- `resolution` (string): Maximum resolution (longest edge) for the output image. **Options:** - `640px` — up to 640px - `1k` — up to 1024px - `2k` — up to 2048px - `4k` — up to 4096px - `auto` — **Deprecated.** Mapped serve…
- `style` (object, required): The art style to use for image generation.

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `ai_image_upscaler_create_image` (~483 tokens)

Upscale your image using AI. Each 2x upscale costs 50 credits for balanced/creative modes, and 25 credits for preserve. 4x upscale costs 200 and 100 credits respectively.

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Provide the assets for upscaling
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `name` (string): Give your image a custom name for easy identification.
- `scale_factor` (number, required): How much to scale the image. Must be either 2 or 4.              Note: 4x upscale is only available on Creator, Pro, or Business tier.
- `style` (object): Style settings for the upscale. Use `mode` (`"preserve"`, `"balanced"`, or `"creative"`). Defaults to `"balanced"`.

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `ai_meme_generator_create_image` (~281 tokens)

Create an AI generated meme. Each meme costs 10 credits.

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `name` (string): The name of the meme.
- `style` (object, required)

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `ai_qr_code_generator_create_image` (~300 tokens)

Create an AI QR code. Each QR code costs 0 credits.

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.

Input parameters:

- `content` (string, required): The content of the QR code.
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `name` (string): Give your image a custom name for easy identification.
- `style` (object, required)

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `body_swap_create_image` (~425 tokens)

Swap a person into a scene image using Nano Banana 2 Lite (640px/1k) or Nano Banana 2 (2k/4k). Credits depend on `resolution` (from 50 credits at 640px upward).

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Person image and scene image for body swap
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `name` (string): Give your image a custom name for easy identification.
- `resolution` (string, required): Output resolution. Determines credits charged for the run.

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `face_swap_photo_create_image` (~407 tokens)

Create a face swap photo. Each photo costs 10 credits. The height/width of the output image depends on your subscription. Please refer to our [pricing](https://magichour.ai/pricing) page for more details

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Provide the assets for face swap photo
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `name` (string): Give your image a custom name for easy identification.

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `head_swap_create_image` (~454 tokens)

Swap a head onto a body image. Each image costs 10 credits. Output resolution depends on your subscription; you may set `max_resolution` lower than your plan maximum if desired.

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Provide the body and head images for head swap
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `max_resolution` (integer): Constrains the larger dimension (height or width) of the output. Omit to use the maximum allowed for your plan (capped at 2048px). Values above your plan maximum are clamped down to your plan's maxim…
- `name` (string): Give your image a custom name for easy identification.

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `image_background_remover_create_image` (~372 tokens)

Remove background from image. Each image costs 5 credits.

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Provide the assets for background removal
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `name` (string): Give your image a custom name for easy identification.

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `photo_colorizer_create_image` (~371 tokens)

Colorize image. Each image costs 10 credits.

MCP guidance:
\- This starts an async image generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_image_project` helper with the returned id, or poll the matching `GET /v1/image-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Provide the assets for photo colorization
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `name` (string): Give your image a custom name for easy identification.

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.  If an error occurred while generating the image(s), credits will be refunde…
- `id` (string): Unique ID of the image. Use it with the [Get image Project API](https://docs.magichour.ai/api-reference/image-projects/get-image-details) to fetch status and downloads.

### `audio_projects_retrieve_details` (~340 tokens)

Check the progress of a audio project. The `downloads` field is populated after a successful render.
  
\**Statuses**
\- `queued` — waiting to start
\- `rendering` — in progress
\- `complete` — ready; see `downloads`
\- `error` — a failure occurred (see `error`)
\- `canceled` — user canceled
\- `draft` — not used

MCP guidance:
\- Use this after a create tool to poll job status. When status is `complete`, surface the `downloads` URLs to the user; if status is `error`, surface the error message.
\- Each `downloads[n].url` is already the full signed download URL. Use it exactly as returned. Do not shorten it, strip query parameters, or append `expires_at` onto the URL string.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `id` (string, required): Unique ID of the audio project. This value is returned by all of the POST APIs that create an audio.

Output parameters:

- `created_at` (string)
- `credits_charged` (integer): The amount of credits deducted from your account to generate the audio. We charge credits right when the request is made.  If an error occurred while generating the audio, credits will be refunded a…
- `downloads` (array)
- `enabled` (boolean): Whether this resource is active. If false, it is deleted.
- `error` (object|null): In the case of an error, this object will contain the error encountered during video render
- `id` (string): Unique ID of the audio. Use it with the [Get audio Project API](https://docs.magichour.ai/api-reference/audio-projects/get-audio-details) to fetch status and downloads.
- `name` (string|null): The name of the audio.
- `status` (string): The status of the audio. - `draft` - the project was created but has not been submitted for rendering - `queued` - the job is waiting for an available server - `rendering` - the job is being process…
- `type` (string): The type of the audio project. Possible values are AUDIO_TRANSLATOR, VOICE_GENERATOR, VOICE_CHANGER, VOICE_CLONER, VIDEO_TO_AUDIO, MUSIC_GENERATOR, SOUND_EFFECT_GENERATOR

### `audio_projects_delete` (~191 tokens)

Permanently delete the rendered audio file(s). This action is not reversible, please be sure before deleting.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `id` (string, required): Unique ID of the audio project. This value is returned by all of the POST APIs that create an audio.

### `ai_voice_generator_create_audio` (~302 tokens)

Generate speech from text. Each character costs 0.1 credits. The cost is rounded up to the nearest whole number.

MCP guidance:
\- This starts an async audio generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_audio_project` helper with the returned id, or poll the matching `GET /v1/audio-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.

Input parameters:

- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `name` (string): Give your audio a custom name for easy identification.
- `style` (object, required): The content used to generate speech.

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the audio. We charge credits right when the request is made.  If an error occurred while generating the audio, credits will be refunded a…
- `id` (string): Unique ID of the audio. Use it with the [Get audio Project API](https://docs.magichour.ai/api-reference/audio-projects/get-audio-details) to fetch status and downloads.

### `ai_voice_cloner_create_audio` (~402 tokens)

Clone a voice from an audio sample and generate speech. 
\* Each character costs 0.1 credits. 
\* The cost is rounded up to the nearest whole number

MCP guidance:
\- This starts an async audio generation job and returns `id` plus `credits_charged` immediately. If the user wants the finished result, call the `wait_for_audio_project` helper with the returned id, or poll the matching `GET /v1/audio-projects/{id}` endpoint until status is `complete`, `error`, or `canceled`. Completed projects include `downloads` with direct URLs. The custom wait helper also returns `exact_download_urls` separately from expiration metadata.
\- For `*_file_path` values, prefer an existing Magic Hour file path or a `file_path` returned by the upload-URL endpoint after the file bytes are uploaded. Direct public media URLs may work when they are stable, fetchable, and return raw file bytes, but hotlinked URLs can fail; when in doubt, use the presigned upload flow first and pass the returned `file_path`.

Input parameters:

- `assets` (object, required): Provide the assets for voice cloning.
- `context` (string): Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include,…
- `name` (string): Give your audio a custom name for easy identification.
- `style` (object, required)

Output parameters:

- `credits_charged` (integer): The amount of credits deducted from your account to generate the audio. We charge credits right when the request is made.  If an error occurred while generating the audio, credits will be refunded a…
- `id` (string): Unique ID of the audio. Use it with the [Get audio Project API](https://docs.magichour.ai/api-reference/audio-projects/get-audio-details) to fetch status and downloads.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/magichourhq-magic-hour/mcp#diagnostics

## Score history

- 2026-09-20: 73
- 2026-09-19: 72
- 2026-09-18: 72
- 2026-09-17: 71
- 2026-09-16: 71
- 2026-09-15: 70
- 2026-09-14: 70
- 2026-09-13: 70
- 2026-09-12: 69
- 2026-09-11: 69
- 2026-09-10: 68
- 2026-09-09: 68
- 2026-09-08: 67
- 2026-09-07: 67
- 2026-09-06: 66
- 2026-09-05: 66
- 2026-09-04: 66
- 2026-09-03: 65
- 2026-09-02: 65
- 2026-09-01: 64
- 2026-08-31: 64

## Common questions

### What is the Magic Hour MCP server?

Magic Hour is an MCP server listed in the public MCP registry as io.github.magichourhq/magic-hour. Create and edit images, videos, and audio through Magic Hour's hosted Streamable HTTP MCP server. This page covers its hosted endpoint (https://mcp.magichour.ai/).

### Is the Magic Hour MCP server safe to use?

Magic Hour scores 73 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Magic Hour MCP server expose?

Magic Hour exposes 45 tools: ping, wait_for_video_project, wait_for_image_project, wait_for_audio_project, fetch_image_download, and 40 more. Their descriptions and schemas cost roughly 24,788 tokens of context every time the server is loaded.

### Does the Magic Hour MCP server require authentication?

No. We connected to Magic Hour without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Magic Hour MCP server still maintained?

Magic Hour is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://mcp.magichour.ai/
- Repository: https://github.com/magichourhq/magic-hour-mcp
- Changelog RSS feed: https://verifymcp.io/servers/magichourhq-magic-hour/mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/magichourhq-magic-hour/mcp.json
- HTML version of this page: https://verifymcp.io/servers/magichourhq-magic-hour/mcp
