{
  "data": {
    "a": {
      "slug": "magic-hour-mcp",
      "name": "Magic Hour MCP",
      "vendor": "Magic Hour AI, Inc.",
      "vendorUrl": "https://magichour.ai",
      "kind": "mcp",
      "category": "video-generation",
      "summary": "Magic Hour MCP is a hosted server with 50 tools that create and edit images and video, from text-to-video, lip sync and face swap to upscaling, subtitles and music, billed in Magic Hour credits.",
      "url": "https://www.anchorterminal.com/tools/magic-hour-mcp",
      "markdownUrl": "https://www.anchorterminal.com/tools/magic-hour-mcp.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/magic-hour-mcp.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/magic-hour-mcp.json",
      "dns": "magic-hour-mcp.grade.anchorterminal.com",
      "repo": "https://github.com/magichourhq/magic-hour-mcp",
      "transports": [
        "streamable-http"
      ],
      "remoteUrl": "https://mcp.magichour.ai/",
      "packages": [],
      "auth": "mixed",
      "authNotes": "Tool discovery is public. Calls need a Magic Hour API key as a Bearer token (Claude Code, Codex CLI, Manus), or OAuth sign-in through the Claude and ChatGPT connectors.",
      "pricing": "freemium",
      "pricingNotes": "Paid plans from $12 a month billed yearly ($19 monthly) with 144,000 credits a year and API access; one-time credit packs without a subscription. A free account gets 400 sign-up credits, and some public tools work without an account; API access is listed on paid plans (checked 2026-11-07).",
      "priceSummary": "Freemium",
      "where": "hosted",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 on the MCP docs or pricing page (checked 2026-11-07).",
        "endpoints": []
      },
      "toolCount": 50,
      "popularity": {
        "githubStars": null,
        "npmWeekly": null,
        "pypiWeekly": null,
        "asOf": "2026-11-07"
      },
      "docsUrl": "https://docs.magichour.ai/integration/model-context-protocol",
      "llmsTxt": "https://docs.magichour.ai/llms.txt",
      "registryName": "io.github.magichourhq/magic-hour",
      "capabilities": [
        "video.generate",
        "video.image-to-video",
        "video.edit",
        "image.generate",
        "image.edit",
        "image.upscale",
        "music.generate"
      ],
      "tags": [
        "official",
        "hosted",
        "mcp",
        "remote-mcp",
        "api-key",
        "oauth",
        "freemium",
        "status-page",
        "llms-txt",
        "mcp-registry",
        "annotated-tools"
      ],
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 50.7,
        "grade": "D",
        "agentReady": false,
        "rank": 1054,
        "ranked": true,
        "rankOf": 1513,
        "categoryRank": 11,
        "methodology": "0.7",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 55,
          "maintenance": 75,
          "payments": 15,
          "reliability": 35,
          "schema": 82,
          "security": 45,
          "transparency": 58
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-11-07"
        },
        "negative": 0,
        "verdict": "Magic Hour's MCP server exposes its whole image and video toolkit, lip sync, face swap, upscaling and text-to-video, with typed schemas built from its OpenAPI file and every tool annotated. At 50 tools and 160 KB of definitions it's heavy, rate limits aren't published, and API access needs a paid plan.",
        "bestFor": "Agents making short-form video and images, from talking photos and ads to lip-synced translations, on a credit plan.",
        "strengths": [
          "50 tools with typed JSON Schema built from the OpenAPI specification",
          "Every tool annotated; deletes marked destructive",
          "A workflow guide and wait tools for long generation jobs",
          "Prompts, uploads and outputs aren't used for training",
          "Tool discovery works without a key"
        ],
        "weaknesses": [
          "About 160 KB of tool definitions",
          "No published rate limits or error docs",
          "API access sits on paid plans",
          "Face swap and head swap tools need care with consent"
        ],
        "agentNotes": [
          "Call get_workflow_guide first to pick the right tool",
          "Use the wait_for_* tools instead of polling project status yourself",
          "Check credits with get_account_info before long video jobs",
          "Only swap faces or voices of people who consented"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "D",
            "methodology": "0.7",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 50.7
          }
        ],
        "editorialScores": {
          "ergonomics": 55,
          "maintenance": 75,
          "payments": 15,
          "reliability": 35,
          "schema": 82,
          "security": 45,
          "transparency": 50
        },
        "provenanceScore": 65,
        "checked": {
          "categories": {
            "ergonomics": "2026-11-07",
            "maintenance": "2026-11-07",
            "payments": "2026-11-07",
            "reliability": "2026-11-07",
            "schema": "2026-11-07",
            "security": "2026-11-07",
            "transparency": "2026-11-07"
          },
          "last": "2026-11-07",
          "oldest": "2026-11-07",
          "stale": false,
          "staleAfterDays": 90
        }
      },
      "connect": {
        "claudeCode": "claude mcp add magic-hour --transport http https://mcp.magichour.ai/ --header \"Authorization: Bearer $MAGIC_HOUR_API_KEY\"",
        "config": {
          "mcpServers": {
            "magic-hour": {
              "headers": {
                "Authorization": "Bearer YOUR_MAGIC_HOUR_API_KEY"
              },
              "url": "https://mcp.magichour.ai/"
            }
          }
        }
      },
      "letme": {
        "capability": "https://letme.dev/video.generate",
        "tool": "https://letme.dev/magic-hour-mcp"
      },
      "area": "content",
      "provenance": {
        "legalEntity": "Magic Hour AI, Inc.",
        "domain": "magichour.ai",
        "domainRegistered": "",
        "domainNote": "Not looked up: RDAP isn't requested under the 1 November 2026 rules.",
        "endpointOnVendorDomain": true,
        "terms": "https://magichour.ai/terms-of-service",
        "privacy": "https://magichour.ai/privacy-policy",
        "statusPage": "https://status.magichour.ai",
        "changelog": "https://docs.magichour.ai/changelog",
        "securityTxt": "none",
        "checked": "2026-11-07",
        "notes": [
          "Terms revised 3 October 2026 naming Magic Hour AI, Inc."
        ],
        "score": 65
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/magic-hour-mcp.json",
      "live": {
        "slug": "magic-hour-mcp",
        "probe": {
          "target": "https://mcp.magichour.ai/",
          "method": "mcp-initialize",
          "lastAt": "2026-11-09T01:53:11.435821114Z",
          "lastOk": true,
          "lastStatus": 200,
          "lastMs": 172,
          "lastNote": "initialize answered",
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 147,
          "p95ms24h": 248,
          "samples24h": 244,
          "samples30d": 316,
          "days": [
            {
              "date": "2026-11-07",
              "probes": 53,
              "ok": 53
            },
            {
              "date": "2026-11-08",
              "probes": 243,
              "ok": 243
            },
            {
              "date": "2026-11-09",
              "probes": 20,
              "ok": 20
            }
          ],
          "since": "2026-11-07T00:00:00Z"
        },
        "vendorStatus": {
          "page": "https://status.magichour.ai",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-11-08T17:49:35.111061828Z"
        },
        "versions": [
          {
            "registry": "mcp-registry",
            "name": "io.github.magichourhq/magic-hour",
            "version": "0.1.1",
            "seenAt": "2026-11-08T18:37:59.431193162Z"
          }
        ],
        "githubStars": 9,
        "securityTxt": {
          "url": "https://magichour.ai/.well-known/security.txt",
          "state": "none",
          "checkedAt": "2026-11-08T16:03:09.715594663Z"
        },
        "llmsTxt": {
          "url": "https://docs.magichour.ai/llms.txt",
          "ok": true,
          "status": 200,
          "checkedAt": "2026-11-08T15:36:29.760109739Z"
        },
        "domain": {
          "domain": "magichour.ai",
          "registered": "2023-01-22",
          "source": "https://rdap.identitydigital.services/rdap/domain/magichour.ai",
          "checkedAt": "2026-11-08T15:03:14.089825607Z"
        },
        "pages": [
          {
            "url": "https://docs.magichour.ai/changelog",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-11-08T14:57:53.344528691Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "c3644592448b"
          },
          {
            "url": "https://magichour.ai/privacy-policy",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-11-08T15:05:05.75247883Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "d73d8401d16b"
          },
          {
            "url": "https://magichour.ai/terms-of-service",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-11-08T15:05:08.226810371Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "3a7947689c53"
          }
        ],
        "mcpTools": {
          "url": "https://mcp.magichour.ai/",
          "checkedAt": "2026-11-08T01:59:41.284011643Z",
          "status": "ok",
          "protocol": "2025-11-25",
          "tools": [
            {
              "name": "get_workflow_guide",
              "title": "Choose a media workflow",
              "description": "Returns required inputs, ordered steps, example requests and review criteria for eight supported Magic Hour workflows. Use when planning a generation, not to run one. Requires authentication but does not check account eligibility or spend credits.",
              "inputSchema": {
                "additionalProperties": false,
                "properties": {
                  "workflow": {
                    "enum": [
                      "video-face-swap",
                      "image-editor",
                      "image-to-video",
                      "video-generator",
                      "lip-sync",
                      "ugc-ads",
                      "talking-photo",
                      "media-apis"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "workflow"
                ],
                "type": "object"
              },
              "outputSchema": {
                "additionalProperties": true,
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true
              }
            },
            {
              "name": "upload_chatgpt_image",
              "title": "Upload attached image",
              "description": "Uploads a PNG, JPEG or WebP image attached in ChatGPT to the connected Magic Hour account. Use this for native ChatGPT photo attachments instead of asking the chat's file runtime to PUT bytes to get_upload_urls. Pass the returned file_path to the existing image or video generation tool. Accepts one image up to 20 MiB. Does not generate media or spend generation credits.",
              "inputSchema": {
                "additionalProperties": false,
                "properties": {
                  "image": {
                    "description": "The native attached image. ChatGPT supplies download_url and file_id; direct MCP callers must supply that file object, not a bare file ID, filename or local path.",
                    "properties": {
                      "download_url": {
                        "type": "string"
                      },
                      "file_id": {
                        "type": "string"
                      },
                      "file_name": {
                        "default": "",
                        "type": "string"
                      },
                      "mime_type": {
                        "default": "",
                        "type": "string"
                      }
                    },
                    "required": [
                      "download_url",
                      "file_id"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "image"
                ],
                "type": "object"
              },
              "outputSchema": {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Upload attached image"
              }
            },
            {
              "name": "upload_chatgpt_media",
              "title": "Upload attached media",
              "description": "Uploads one native ChatGPT attachment to the connected Magic Hour account: PNG/JPEG/WebP images, MP4/MOV/WebM video, or MP3/WAV/M4A/FLAC/Ogg/WebM audio, up to 20 MiB. Set media_type to the attachment's actual kind, not the requested output: image, video or audio. For multiple references, call separately and keep each returned file_path paired with the intended input. Pass the real attachment through the file parameter; a bare file ID, filename or chat-local path is not the raw MCP file object. Does not generate media or spend generation credits.",
              "inputSchema": {
                "additionalProperties": false,
                "properties": {
                  "file": {
                    "properties": {
                      "download_url": {
                        "type": "string"
                      },
                      "file_id": {
                        "type": "string"
                      },
                      "file_name": {
                        "default": "",
                        "type": "string"
                      },
                      "mime_type": {
                        "default": "",
                        "type": "string"
                      }
                    },
                    "required": [
                      "download_url",
                      "file_id"
                    ],
                    "type": "object"
                  },
                  "media_type": {
                    "enum": [
                      "video",
                      "image",
                      "audio"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "file",
                  "media_type"
                ],
                "type": "object"
              },
              "outputSchema": {
                "additionalProperties": {
                  "type": "string"
                },
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Upload attached media"
              }
            },
            {
              "name": "ping",
              "title": "Ping",
              "description": "Checks that the Magic Hour server is reachable. Use for connectivity troubleshooting; it does not validate API credentials or account access. Makes no media or project changes.",
              "inputSchema": {
                "additionalProperties": false,
                "properties": {},
                "type": "object"
              },
              "outputSchema": {
                "properties": {
                  "result": {
                    "type": "string"
                  }
                },
                "required": [
                  "result"
                ],
                "type": "object",
                "x-fastmcp-wrap-result": true
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true,
                "title": "Ping"
              }
            },
            {
              "name": "wait_for_video_project",
              "title": "Wait for Video Project",
              "description": "Polls a video project until it completes, errors, is canceled or times out. Use with the id returned by a video create tool. Read-only; returns download URLs when complete. After a timeout, resume with the same id rather than creating another generation. Use signed download URLs exactly as returned. Does not inline video content.",
              "inputSchema": {
                "additionalProperties": false,
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "include_inline_downloads": {
                    "default": false,
                    "type": "boolean"
                  },
                  "max_inline_downloads": {
                    "default": 0,
                    "type": "integer"
                  },
                  "poll_interval_seconds": {
                    "default": 2,
                    "type": "number"
                  },
                  "timeout_seconds": {
                    "default": 300,
                    "type": "number"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true,
                "title": "Wait for Video Project"
              }
            },
            {
              "name": "wait_for_image_project",
              "title": "Wait for Image Project",
              "description": "Polls an image project until it completes, errors, is canceled or times out. Use with the id returned by an image create tool. Read-only; returns the project and download URLs, with optional inline image previews sharing an 8 MiB total limit. After a timeout, resume with the same id rather than creating another generation. Use signed download URLs exactly as returned.",
              "inputSchema": {
                "additionalProperties": false,
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "include_inline_downloads": {
                    "default": true,
                    "type": "boolean"
                  },
                  "max_bytes_per_download": {
                    "default": 8388608,
                    "type": "integer"
                  },
                  "max_inline_downloads": {
                    "default": 4,
                    "type": "integer"
                  },
                  "poll_interval_seconds": {
                    "default": 2,
                    "type": "number"
                  },
                  "timeout_seconds": {
                    "default": 180,
                    "type": "number"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true,
                "title": "Wait for Image Project"
              }
            },
            {
              "name": "wait_for_audio_project",
              "title": "Wait for Audio Project",
              "description": "Polls an audio project until it completes, errors, is canceled or times out. Use with the id returned by an audio create tool. Read-only; returns the project and download URLs, with optional inline audio previews sharing an 8 MiB total limit. After a timeout, resume with the same id rather than creating another generation. Use signed download URLs exactly as returned.",
              "inputSchema": {
                "additionalProperties": false,
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "include_inline_downloads": {
                    "default": true,
                    "type": "boolean"
                  },
                  "max_bytes_per_download": {
                    "default": 8388608,
                    "type": "integer"
                  },
                  "max_inline_downloads": {
                    "default": 4,
                    "type": "integer"
                  },
                  "poll_interval_seconds": {
                    "default": 2,
                    "type": "number"
                  },
                  "timeout_seconds": {
                    "default": 180,
                    "type": "number"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true,
                "title": "Wait for Audio Project"
              }
            },
            {
              "name": "fetch_image_download",
              "title": "Fetch Image Download",
              "description": "Fetch a completed project's image as inline MCP image content for compatible clients. Use the exact signed download URL, including query parameters. Requires HTTPS at the configured Magic Hour media host. Read-only; limited to 8 MiB, or a smaller requested max_bytes. Use the signed URL directly for larger files.",
              "inputSchema": {
                "additionalProperties": false,
                "properties": {
                  "download_url": {
                    "type": "string"
                  },
                  "max_bytes": {
                    "default": 8388608,
                    "type": "integer"
                  }
                },
                "required": [
                  "download_url"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true,
                "title": "Fetch Image Download"
              }
            },
            {
              "name": "fetch_audio_download",
              "title": "Fetch Audio Download",
              "description": "Fetch a completed project's audio as inline MCP audio content for compatible clients. Use the exact signed download URL, including query parameters. Requires HTTPS at the configured Magic Hour media host. Read-only; limited to 8 MiB, or a smaller requested max_bytes. Use the signed URL directly for larger files.",
              "inputSchema": {
                "additionalProperties": false,
                "properties": {
                  "download_url": {
                    "type": "string"
                  },
                  "max_bytes": {
                    "default": 8388608,
                    "type": "integer"
                  }
                },
                "required": [
                  "download_url"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true,
                "title": "Fetch Audio Download"
              }
            },
            {
              "name": "fetch_video_download",
              "title": "Fetch Video Download",
              "description": "Fetch a completed project's video as an embedded MCP binary resource for compatible clients. Use the exact signed download URL, including query parameters. Requires HTTPS at the configured Magic Hour media host. Read-only; limited to 8 MiB, or a smaller requested max_bytes. Use the signed URL directly for larger files.",
              "inputSchema": {
                "additionalProperties": false,
                "properties": {
                  "download_url": {
                    "type": "string"
                  },
                  "max_bytes": {
                    "default": 8388608,
                    "type": "integer"
                  }
                },
                "required": [
                  "download_url"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true,
                "title": "Fetch Video Download"
              }
            },
            {
              "name": "get_account_info",
              "title": "Get account info",
              "description": "Returns credit balance and subscription details for the connected account. Use to inspect account information before choosing generation settings. Use tier, not the subscription name or credit balance, for plan access. Read-only; this is not a request-specific cost quote or model-eligibility check.",
              "inputSchema": {
                "properties": {},
                "required": [],
                "type": "object"
              },
              "outputSchema": {
                "properties": {
                  "credits": {
                    "description": "Credits currently available to spend. Includes subscription credits and any purchased credit packs.",
                    "example": 12500,
                    "minimum": 0,
                    "type": "integer"
                  },
                  "email": {
                    "description": "Email address of the account.",
                    "example": "user@example.com",
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "id": {
                    "description": "Unique ID of the account that owns the API key.",
                    "example": "cuid-example",
                    "type": "string"
                  },
                  "subscription": {
                    "description": "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.\n\nReflects the plan currently configured on the subscription. If a plan change is scheduled, `tier` stays on the current plan until the next payment succeeds, so `tier` and `name` can briefly disagree.",
                    "properties": {
                      "billing_interval": {
                        "description": "How often the subscription is billed. `null` if unknown.",
                        "enum": [
                          "month",
                          "year",
                          null
                        ],
                        "example": "month",
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "cancel_at_period_end": {
                        "description": "Whether the subscription is scheduled to end at `current_period_end` instead of renewing. The subscription stays usable until then.",
                        "example": false,
                        "type": "boolean"
                      },
                      "current_period_end": {
                        "description": "End of the current billing period, in ISO 8601 format. The subscription renews at this time, or ends if `cancel_at_period_end` is `true`.",
                        "example": "2026-10-01T00:00:00.000Z",
                        "format": "date-time",
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "discount": {
                        "description": "Discount applied to the subscription. `null` if no discount is applied.",
                        "properties": {
                          "amount_off": {
                            "description": "Fixed amount taken off `price.amount` each billing interval, in the smallest unit of the currency. `null` if the discount is a percentage.",
                            "type": [
                              "integer",
                              "null"
                            ]
                          },
                          "percent_off": {
                            "description": "Percentage taken off `price.amount` each billing interval. `null` if the discount is a fixed amount.",
                            "example": 20,
                            "type": [
                              "number",
                              "null"
                            ]
                          }
                        },
                        "required": [
                          "percent_off",
                          "amount_off"
                        ],
                        "type": [
                          "object",
                          "null"
                        ]
                      },
                      "name": {
                        "description": "Name of the current subscription plan, e.g. `Creator`, `Pro`, `Pro Plus`, `Business`. `null` if the plan cannot be determined. Use `tier` for a machine-readable value.",
                        "example": "Pro",
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "price": {
                        "properties": {
                          "amount": {
                            "description": "Price charged per billing interval, in the smallest unit of the currency (e.g. 4900 is $49.00 for `usd`). Discounts are not applied.",
                            "example": 4900,
                            "minimum": 0,
                            "type": "integer"
                          },
                          "currency": {
                            "description": "Three-letter ISO 4217 currency code, lowercase.",
                            "example": "usd",
                            "type": "string"
                          }
                        },
                        "required": [
                          "amount",
                          "currency"
                        ],
                        "type": "object"
                      },
                      "status": {
                        "description": "Status of the subscription.\n- `active`: payments are up to date.\n- `past_due`: the latest payment failed. `tier` is `free` until payment succeeds. The subscription is canceled if payment keeps failing.",
                        "enum": [
                          "active",
                          "past_due"
                        ],
                        "example": "active",
                        "type": "string"
                      }
                    },
                    "required": [
                      "name",
                      "status",
                      "price",
                      "discount",
                      "billing_interval",
                      "current_period_end",
                      "cancel_at_period_end"
                    ],
                    "type": [
                      "object",
                      "null"
                    ]
                  },
                  "tier": {
                    "description": "Subscription tier in effect for the account. `free` if there is no active subscription, including while a subscription is `past_due`.",
                    "enum": [
                      "free",
                      "creator",
                      "pro",
                      "business"
                    ],
                    "example": "pro",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "email",
                  "tier",
                  "credits",
                  "subscription"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true,
                "title": "Get account info"
              }
            },
            {
              "name": "list_saved_items",
              "title": "List saved items",
              "description": "Lists the account's active saved characters, references, voice recordings, moodboards and brand kits, newest first. Reusable paths are in each item's assets[].file_path; temporary signed URLs support preview/download. Read-only; pass next_cursor as cursor for the next page.",
              "inputSchema": {
                "properties": {
                  "cursor": {
                    "description": "Opaque pagination cursor from the previous response's next_cursor.",
                    "minLength": 1,
                    "type": "string"
                  },
                  "limit": {
                    "default": 20,
                    "description": "Maximum number of saved items to return. Defaults to 20.",
                    "example": 20,
                    "maximum": 100,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "type": {
                    "description": "Only return saved items of this type.",
                    "enum": [
                      "character",
                      "reference",
                      "voice",
                      "moodboard",
                      "brand_kit"
                    ],
                    "example": "character",
                    "type": "string"
                  }
                },
                "required": [],
                "type": "object"
              },
              "outputSchema": {
                "properties": {
                  "items": {
                    "items": {
                      "properties": {
                        "assets": {
                          "items": {
                            "properties": {
                              "file_path": {
                                "description": "Durable asset path. Pass it to a compatible API asset field without uploading it again.",
                                "example": "saved-items/user-id/item-id/image.png",
                                "type": "string"
                              },
                              "is_primary": {
                                "description": "Whether this asset is the saved item's primary asset.",
                                "example": true,
                                "type": "boolean"
                              },
                              "media_kind": {
                                "description": "Media type of the asset.",
                                "enum": [
                                  "IMAGE",
                                  "VIDEO",
                                  "AUDIO"
                                ],
                                "example": "IMAGE",
                                "type": "string"
                              },
                              "url": {
                                "description": "Signed URL for previewing or downloading the asset. Expires after 24 hours.",
                                "format": "uri",
                                "type": "string"
                              },
                              "url_expires_at": {
                                "description": "When the signed URL expires. The saved asset and file_path do not expire.",
                                "example": "2026-09-17T00:00:00.000Z",
                                "format": "date-time",
                                "type": "string"
                              }
                            },
                            "required": [
                              "file_path",
                              "media_kind",
                              "is_primary",
                              "url",
                              "url_expires_at"
                            ],
                            "type": "object"
                          },
                          "type": "array"
                        },
                        "id": {
                          "description": "Unique ID of the saved item.",
                          "example": "cuid-example",
                          "type": "string"
                        },
                        "name": {
                          "description": "User-provided name of the saved item.",
                          "example": "Alex",
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "type": {
                          "description": "Saved item type.",
                          "enum": [
                            "character",
                            "reference",
                            "voice",
                            "moodboard",
                            "brand_kit"
                          ],
                          "example": "character",
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "type",
                        "name",
                        "assets"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  },
                  "next_cursor": {
                    "description": "Cursor for the next page, or null when there are no more saved items.",
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "items",
                  "next_cursor"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true,
                "title": "List saved items"
              }
            },
            {
              "name": "get_upload_urls",
              "title": "Get upload URLs",
              "description": "Creates presigned upload URL and file-path pairs for local media. Use when a generation needs a file the user has locally: upload raw bytes to the returned upload_url, then pass its file_path to the create tool. Does not upload file bytes or start a generation.",
              "inputSchema": {
                "properties": {
                  "items": {
                    "description": "The list of assets to upload. The response array will match the order of items in the request body.",
                    "example": [
                      {
                        "extension": "mp4",
                        "type": "video"
                      },
                      {
                        "extension": "mp3",
                        "type": "audio"
                      }
                    ],
                    "items": {
                      "properties": {
                        "extension": {
                          "description": "The extension of the file to upload. Do not include the dot (.) before the extension. Possible extensions are mp4,m4v,mov,webm,mp3,wav,aac,flac,webm,weba,m4a,opus,ogg,oga,aiff,amr,png,jpg,jpeg,jpe,jfif,heic,heif,webp,avif,jp2,tiff,tif,bmp,gif,webp,webm",
                          "example": "mp4",
                          "pattern": "^[a-z0-9]+$",
                          "type": "string"
                        },
                        "type": {
                          "description": "The type of asset to upload. Possible types are video, audio, image",
                          "enum": [
                            "video",
                            "audio",
                            "image"
                          ],
                          "example": "video",
                          "type": "string"
                        }
                      },
                      "required": [
                        "type",
                        "extension"
                      ],
                      "type": "object"
                    },
                    "minItems": 1,
                    "type": "array"
                  }
                },
                "required": [
                  "items"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "items": {
                    "description": "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/inputs-and-outputs) for more details.",
                    "example": [
                      {
                        "expires_at": "2024-07-25T16:56:21.932Z",
                        "file_path": "api-assets/id/video.mp4",
                        "upload_url": "https://videos.magichour.ai/api-assets/id/video.mp4?auth-value=1234567890"
                      },
                      {
                        "expires_at": "2024-07-25T16:56:21.932Z",
                        "file_path": "api-assets/id/audio.mp3",
                        "upload_url": "https://videos.magichour.ai/api-assets/id/audio.mp3?auth-value=1234567890"
                      }
                    ],
                    "items": {
                      "properties": {
                        "expires_at": {
                          "description": "when the upload url expires, and will need to request a new one.",
                          "example": "2024-07-21T17:32:28Z",
                          "format": "date-time",
                          "type": "string"
                        },
                        "file_path": {
                          "description": "this value is used in APIs that needs assets, such as image_file_path, video_file_path, and audio_file_path",
                          "example": "video/id/1234.mp4",
                          "type": "string"
                        },
                        "upload_url": {
                          "description": "Used to upload the file to storage, send a PUT request with the file as data to upload.",
                          "example": "https://videos.magichour.ai/id/video.mp4?auth-value=1234567890",
                          "format": "uri",
                          "type": "string"
                        }
                      },
                      "required": [
                        "upload_url",
                        "expires_at",
                        "file_path"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "items"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": false,
                "title": "Get upload URLs"
              }
            },
            {
              "name": "get_face_detection_results",
              "title": "Get face detection results",
              "description": "Returns a face-detection job's status and detected faces. Use with the id from detect_faces to inspect progress and choose face mappings before a selected-face swap. Read-only; faces may populate while processing.",
              "inputSchema": {
                "properties": {
                  "id": {
                    "description": "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).",
                    "example": "uuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "outputSchema": {
                "properties": {
                  "credits_charged": {
                    "description": "The credits charged for the task.",
                    "example": 0,
                    "type": "integer"
                  },
                  "faces": {
                    "description": "The faces detected in the image or video. The list is populated as faces are detected.",
                    "example": [
                      {
                        "path": "api-assets/id/0-0.png",
                        "url": "https://videos.magichour.ai/api-assets/id/0-0.png"
                      }
                    ],
                    "items": {
                      "properties": {
                        "path": {
                          "description": "The path to the face image. This should be used in face swap photo/video API calls as `.assets.face_mappings.original_face`",
                          "example": "api-assets/id/0-0.png",
                          "type": "string"
                        },
                        "url": {
                          "description": "The url to the face image. This is used to render the image in your applications.",
                          "example": "https://videos.magichour.ai/api-assets/id/0-0.png",
                          "type": "string"
                        }
                      },
                      "required": [
                        "path",
                        "url"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  },
                  "id": {
                    "description": "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).",
                    "example": "uuid-example",
                    "type": "string"
                  },
                  "status": {
                    "description": "The status of the detection.",
                    "enum": [
                      "queued",
                      "rendering",
                      "complete",
                      "error"
                    ],
                    "example": "complete",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged",
                  "status",
                  "faces"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true,
                "title": "Get face detection results"
              }
            },
            {
              "name": "detect_faces",
              "title": "Detect faces",
              "description": "Starts an asynchronous face-detection task for a supplied image or video and returns its id and charge information. Use before a selected-face swap, then retrieve its status and detected faces with get_face_detection_results. Current API documentation describes detection as free; pricing may change.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for face detection",
                    "properties": {
                      "target_file_path": {
                        "description": "This is the image or video where the face will be detected. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "type": "string"
                      }
                    },
                    "required": [
                      "target_file_path"
                    ],
                    "type": "object"
                  },
                  "confidence_score": {
                    "default": 0.5,
                    "description": "Confidence threshold for filtering detected faces. \n* Higher values (e.g., 0.9) include only faces detected with high certainty, reducing false positives. \n* Lower values (e.g., 0.3) include more faces, but may increase the chance of incorrect detections.",
                    "example": 0.5,
                    "maximum": 1,
                    "minimum": 0,
                    "multipleOf": 0.05,
                    "type": "number"
                  }
                },
                "required": [
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "properties": {
                  "credits_charged": {
                    "description": "The credits charged for the task.",
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "uuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Detect faces"
              }
            },
            {
              "name": "get_video_project",
              "title": "Get video project",
              "description": "Returns a video project's status and, once complete, its download URLs. Use to check progress with the id from a video create tool. Read-only.",
              "inputSchema": {
                "properties": {
                  "id": {
                    "description": "Unique ID of the video project. This value is returned by all of the POST APIs that create a video.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "created_at": {
                    "format": "date-time",
                    "type": "string"
                  },
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "downloads": {
                    "items": {
                      "description": "The download url and expiration date of the image project",
                      "properties": {
                        "expires_at": {
                          "example": "2024-10-19T05:16:19.027Z",
                          "format": "date-time",
                          "type": "string"
                        },
                        "url": {
                          "example": "https://videos.magichour.ai/id/output.mp4",
                          "format": "uri",
                          "type": "string"
                        }
                      },
                      "required": [
                        "url",
                        "expires_at"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  },
                  "enabled": {
                    "description": "Whether this resource is active. If false, it is deleted.",
                    "type": "boolean"
                  },
                  "end_seconds": {
                    "description": "End time of your clip (seconds). Must be greater than start_seconds.",
                    "example": 5,
                    "format": "float",
                    "minimum": 0.1,
                    "type": "number"
                  },
                  "error": {
                    "description": "In the case of an error, this object will contain the error encountered during video render",
                    "properties": {
                      "code": {
                        "description": "An error code to indicate why a failure happened.",
                        "example": "no_source_face",
                        "type": "string"
                      },
                      "message": {
                        "description": "Details on the reason why a failure happened.",
                        "example": "Please use an image with a detectable face",
                        "type": "string"
                      }
                    },
                    "required": [
                      "message",
                      "code"
                    ],
                    "type": [
                      "object",
                      "null"
                    ]
                  },
                  "fps": {
                    "description": "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.",
                    "example": 30,
                    "type": "number"
                  },
                  "height": {
                    "description": "The height of the final output video. A value of -1 indicates the height can be ignored.",
                    "example": 960,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  },
                  "name": {
                    "description": "The name of the video.",
                    "example": "Example Name",
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "start_seconds": {
                    "description": "Start time of your clip (seconds). Must be ≥ 0.",
                    "example": 0,
                    "format": "float",
                    "minimum": 0,
                    "type": "number"
                  },
                  "status": {
                    "description": "The status of the video.\n\n- `draft` - the project was created but has not been submitted for rendering\n- `queued` - the job is waiting for an available server\n- `rendering` - the job is being processed; the `video.started` webhook event fires when rendering begins\n- `complete` - the job finished successfully; fires `video.completed`\n- `error` - the job failed during processing; fires `video.errored`\n- `canceled` - the job was manually canceled (for example from the Magic Hour web app)\n\n**Note:** `rendering`, `complete`, and `error` have matching webhook events; `canceled` does not - a canceled job emits no webhook event, so poll this endpoint to detect cancellation.",
                    "enum": [
                      "draft",
                      "queued",
                      "rendering",
                      "complete",
                      "error",
                      "canceled"
                    ],
                    "example": "complete",
                    "type": "string"
                  },
                  "type": {
                    "description": "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, CHARACTER_REPLACE, VIDEO_COLORIZER, VIDEO_WATERMARK_REMOVER, VIDEO_COLOR_GRADER, VIDEO_TRANSLATOR, MUSIC_VIDEO, EXTEND, AUDIO_TO_VIDEO, VIDEO_EXPANDER, UGC_AD",
                    "example": "FACE_SWAP",
                    "type": "string"
                  },
                  "width": {
                    "description": "The width of the final output video. A value of -1 indicates the width can be ignored.",
                    "example": 512,
                    "type": "integer"
                  }
                },
                "required": [
                  "id",
                  "name",
                  "status",
                  "type",
                  "created_at",
                  "width",
                  "height",
                  "enabled",
                  "start_seconds",
                  "end_seconds",
                  "credits_charged",
                  "fps",
                  "error",
                  "downloads"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true,
                "title": "Get video project"
              }
            },
            {
              "name": "delete_video_project",
              "title": "Delete video project",
              "description": "Deletes the video project and attempts to delete its completed output. Cannot be undone; confirm with the user first.",
              "inputSchema": {
                "properties": {
                  "id": {
                    "description": "Unique ID of the video project. This value is returned by all of the POST APIs that create a video.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": true,
                "openWorldHint": false,
                "readOnlyHint": false,
                "title": "Delete video project"
              }
            },
            {
              "name": "create_talking_photo",
              "title": "Create talking photo",
              "description": "Use only with the user's own likeness or content they are authorized to use. Do not use for impersonation, deception, sexual content, or content involving minors.\n\nAnimates a still portrait so it speaks an existing audio recording. Use with a portrait photo and an audio file; text alone is not accepted and this tool does not synthesize speech. Starts a background job that costs credits; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for creating a talking photo",
                    "properties": {
                      "audio_file_path": {
                        "description": "The audio file to sync with the image. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.mp3",
                        "minLength": 1,
                        "type": "string"
                      },
                      "image_file_path": {
                        "description": "The source image to animate. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "image_file_path",
                      "audio_file_path"
                    ],
                    "type": "object"
                  },
                  "end_seconds": {
                    "description": "The end time of the input audio in seconds. Maximum clip length depends on style.generation_mode: realistic 300s, prompted 60s.",
                    "example": 5,
                    "format": "float",
                    "minimum": 0.1,
                    "type": "number"
                  },
                  "name": {
                    "default": "Talking Photo - dateTime",
                    "description": "Give your video a custom name for easy identification.",
                    "example": "My Talking Photo video",
                    "type": "string"
                  },
                  "resolution": {
                    "description": "Output preset. Overrides `max_resolution`. Defaults to 480p in prompted mode; realistic mode uses the mapped plan maximum.",
                    "enum": [
                      "480p",
                      "720p"
                    ],
                    "example": "480p",
                    "type": "string"
                  },
                  "start_seconds": {
                    "description": "The start time of the input audio in seconds. Maximum clip length depends on style.generation_mode: realistic 300s, prompted 60s.",
                    "example": 0,
                    "format": "float",
                    "minimum": 0,
                    "type": "number"
                  },
                  "style": {
                    "description": "Attributes used to dictate the style of the output",
                    "properties": {
                      "generation_mode": {
                        "default": "realistic",
                        "description": "Controls motion style. `realistic` animates the supplied portrait; `prompted` also accepts a scene prompt. Deprecated aliases remain supported: `pro` and `stable` select `realistic`; `standard` and `expressive` select `prompted`.",
                        "enum": [
                          "realistic",
                          "prompted",
                          "pro",
                          "standard",
                          "stable",
                          "expressive"
                        ],
                        "example": "realistic",
                        "type": "string"
                      },
                      "prompt": {
                        "description": "A text prompt to guide the generation. Only applicable when generation_mode is `prompted`.\nThis field is ignored for other modes.",
                        "example": "A person smiling and speaking naturally to the camera",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "start_seconds",
                  "end_seconds",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Create talking photo"
              }
            },
            {
              "name": "create_spoken_ad_video",
              "title": "Create spoken ad video",
              "description": "Creates a creator-style spoken ad video from a prepared image and a text script. Use when the image is ready and the dialogue should be generated from text. Starts a background job that costs credits; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "additionalProperties": false,
                    "properties": {
                      "image_file_path": {
                        "description": "Prepared image to animate. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/image.jpg",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "image_file_path"
                    ],
                    "type": "object"
                  },
                  "end_seconds": {
                    "description": "Video duration in seconds. Supported values by model:\n* kling-3.0: 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 seconds.\n* ltx-2.5: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60 seconds.\n* veo3.1: 4, 6, 8, 15, 22, 29, 36, 43, 50, 57, 64, 71, 78, 85, 92, 99, 106, 113, 120, 127, 134, 141 seconds.\nFree plans are limited to 5 seconds unless a credit pack has been purchased.",
                    "example": 4,
                    "minimum": 1,
                    "type": "number"
                  },
                  "model": {
                    "description": "Defaults to kling-3.0 on paid plans and ltx-2.5 on free plans.",
                    "enum": [
                      "kling-3.0",
                      "ltx-2.5",
                      "veo3.1"
                    ],
                    "type": "string"
                  },
                  "resolution": {
                    "description": "Defaults to 720p on paid plans and 480p on free plans. Unsupported model/resolution combinations and resolutions unavailable for your plan are rejected.",
                    "enum": [
                      "480p",
                      "720p",
                      "1080p"
                    ],
                    "type": "string"
                  },
                  "script": {
                    "description": "The words the actor should speak. Character limits apply after trimming:\n* kling-3.0: 2304 characters.\n* ltx-2.5: 1804 characters.\n* veo3.1: 2500 characters.\nLTX and Kling dialogue wrappers count toward their model prompt limit.",
                    "example": "Meet your new everyday essential.",
                    "minLength": 1,
                    "type": "string"
                  }
                },
                "required": [
                  "assets",
                  "script",
                  "end_seconds"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Create spoken ad video"
              }
            },
            {
              "name": "edit_video",
              "title": "Edit video",
              "description": "Edits the appearance or content of a supplied video segment using a text prompt. Use with a source video, the requested changes and the clip end time. Starts a background job that costs credits; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for video editing.",
                    "properties": {
                      "video_file_path": {
                        "description": "The video to edit. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.mp4",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "video_file_path"
                    ],
                    "type": "object"
                  },
                  "end_seconds": {
                    "description": "End time of your clip in seconds. Must be greater than `start_seconds`. Allowed duration depends on model: `gemini-omni-1.1`: 3-10s, `wan-3.0`: 2-15s, `ltx-2.5`: 0.5-60s (30s at 1080p).",
                    "example": 5,
                    "format": "float",
                    "minimum": 0.1,
                    "type": "number"
                  },
                  "model": {
                    "description": "Editing model. Defaults to LTX 2.5 for free tier and `gemini-omni-1.1` for paid. `wan-3.0` requires a paid tier. `gemini-omni` is deprecated; use `gemini-omni-1.1` instead.",
                    "enum": [
                      "gemini-omni-1.1",
                      "wan-3.0",
                      "ltx-2.5",
                      "gemini-omni",
                      "ltx-2.3"
                    ],
                    "example": "ltx-2.5",
                    "type": "string"
                  },
                  "name": {
                    "default": "Video Editor - dateTime",
                    "description": "Give your video a custom name for easy identification.",
                    "example": "My Video Editor video",
                    "type": "string"
                  },
                  "resolution": {
                    "description": "Output resolution. Defaults to `480p` for free tier and `720p` for paid. Supported per model: `gemini-omni-1.1`: 720p, 1080p; `wan-3.0`: 480p, 720p, 1080p; `ltx-2.5`: 480p, 720p, 1080p.",
                    "enum": [
                      "480p",
                      "720p",
                      "1080p"
                    ],
                    "example": "480p",
                    "type": "string"
                  },
                  "start_seconds": {
                    "default": 0,
                    "description": "Start time of your clip (seconds). Must be ≥ 0.",
                    "example": 0,
                    "format": "float",
                    "minimum": 0,
                    "type": "number"
                  },
                  "style": {
                    "properties": {
                      "prompt": {
                        "description": "The prompt used to edit the video.",
                        "example": "Change the car color to blue",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "prompt"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "end_seconds",
                  "style",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Edit video"
              }
            },
            {
              "name": "translate_video",
              "title": "Translate video",
              "description": "Translates speech in a supplied video segment into a supported target language. Starts a background job that costs credits; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Source video for the translation job.",
                    "properties": {
                      "video_file_path": {
                        "description": "Source video containing the speech to translate. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.mp4",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "video_file_path"
                    ],
                    "type": "object"
                  },
                  "end_seconds": {
                    "description": "End time of your clip (seconds). Must be greater than start_seconds. The clip must be 1-30 seconds long.",
                    "example": 5,
                    "format": "float",
                    "minimum": 0.1,
                    "type": "number"
                  },
                  "name": {
                    "default": "Video Translator - dateTime",
                    "description": "Give your video a custom name for easy identification.",
                    "example": "My Video Translator video",
                    "type": "string"
                  },
                  "resolution": {
                    "description": "Output video resolution. Defaults to 480p. 720p and 1080p require a paid plan.",
                    "enum": [
                      "480p",
                      "720p",
                      "1080p"
                    ],
                    "example": "480p",
                    "type": "string"
                  },
                  "start_seconds": {
                    "default": 0,
                    "description": "Start time of your clip (seconds). Must be ≥ 0.",
                    "example": 0,
                    "format": "float",
                    "minimum": 0,
                    "type": "number"
                  },
                  "target_language": {
                    "description": "Language to translate the video's speech into.",
                    "enum": [
                      "English",
                      "Chinese (Simplified)",
                      "Hindi",
                      "Spanish",
                      "Arabic",
                      "French",
                      "Afrikaans",
                      "Bengali",
                      "Bulgarian",
                      "Catalan",
                      "Croatian",
                      "Czech",
                      "Danish",
                      "Dutch",
                      "Estonian",
                      "Finnish",
                      "German",
                      "Greek",
                      "Gujarati",
                      "Hebrew",
                      "Hungarian",
                      "Indonesian",
                      "Italian",
                      "Japanese",
                      "Kannada",
                      "Kazakh",
                      "Korean",
                      "Latvian",
                      "Lithuanian",
                      "Malay",
                      "Malayalam",
                      "Marathi",
                      "Norwegian",
                      "Persian",
                      "Polish",
                      "Portuguese",
                      "Punjabi",
                      "Romanian",
                      "Russian",
                      "Serbian",
                      "Slovak",
                      "Slovenian",
                      "Swahili",
                      "Swedish",
                      "Tamil",
                      "Telugu",
                      "Thai",
                      "Chinese (Traditional)",
                      "Turkish",
                      "Ukrainian",
                      "Urdu",
                      "Vietnamese",
                      "Welsh"
                    ],
                    "example": "Spanish",
                    "type": "string"
                  }
                },
                "required": [
                  "end_seconds",
                  "target_language",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Translate video"
              }
            },
            {
              "name": "upscale_video",
              "title": "Upscale video",
              "description": "Upscales a supplied video segment to a selected output resolution while preserving its aspect ratio. Starts a background job that costs credits; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Source video for the upscale job.",
                    "properties": {
                      "video_file_path": {
                        "description": "Video to upscale. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.mp4",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "video_file_path"
                    ],
                    "type": "object"
                  },
                  "end_seconds": {
                    "description": "End time of your clip (seconds). Must be greater than start_seconds.",
                    "example": 5,
                    "format": "float",
                    "minimum": 0.1,
                    "type": "number"
                  },
                  "name": {
                    "default": "Video Upscaler - dateTime",
                    "description": "Give your video a custom name for easy identification.",
                    "example": "My Video Upscaler video",
                    "type": "string"
                  },
                  "resolution": {
                    "description": "Output resolution. `720p` and `1080p` set the output's short side, `2k` and `4k` its long side; the aspect ratio is kept. Requires a paid plan.",
                    "enum": [
                      "720p",
                      "1080p",
                      "2k",
                      "4k"
                    ],
                    "example": "1080p",
                    "type": "string"
                  },
                  "start_seconds": {
                    "default": 0,
                    "description": "Start time of your clip (seconds). Must be ≥ 0.",
                    "example": 0,
                    "format": "float",
                    "minimum": 0,
                    "type": "number"
                  }
                },
                "required": [
                  "end_seconds",
                  "resolution",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Upscale video"
              }
            },
            {
              "name": "create_animation",
              "title": "Create animation",
              "description": "Creates a stylized animated video with art and camera settings, using a custom prompt or an audio-derived prompt mode. Can use an initial image and audio. Credits depend on frame rate and duration; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for animation.",
                    "example": {
                      "audio_file_path": "api-assets/id/1234.mp3",
                      "audio_source": "file",
                      "image_file_path": "api-assets/id/1234.png"
                    },
                    "properties": {
                      "audio_file_path": {
                        "description": "The path of the input audio. This field is required if `audio_source` is `file`. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.mp3",
                        "minLength": 1,
                        "type": "string"
                      },
                      "audio_source": {
                        "description": "Optionally add an audio source if you'd like to incorporate audio into your video",
                        "enum": [
                          "none",
                          "file",
                          "youtube"
                        ],
                        "example": "file",
                        "type": "string"
                      },
                      "image_file_path": {
                        "description": "An initial image to use a the first frame of the video. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "minLength": 1,
                        "type": "string"
                      },
                      "youtube_url": {
                        "description": "Using a youtube video as the input source. This field is required if `audio_source` is `youtube`",
                        "format": "uri",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "audio_source"
                    ],
                    "type": "object"
                  },
                  "end_seconds": {
                    "description": "This value determines the duration of the output video.",
                    "example": 5,
                    "format": "float",
                    "minimum": 0.1,
                    "type": "number"
                  },
                  "fps": {
                    "description": "The desire output video frame rate",
                    "example": 12,
                    "minimum": 1,
                    "type": "number"
                  },
                  "height": {
                    "description": "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",
                    "example": 512,
                    "minimum": 64,
                    "type": "integer"
                  },
                  "name": {
                    "default": "Animation - dateTime",
                    "description": "Give your video a custom name for easy identification.",
                    "example": "My Animation video",
                    "type": "string"
                  },
                  "style": {
                    "description": "Defines the style of the output video",
                    "properties": {
                      "art_style": {
                        "description": "The art style used to create the output video",
                        "enum": [
                          "Custom",
                          "Painterly Illustration",
                          "Vibrant Matte Illustration",
                          "Traditional Watercolor",
                          "Cyberpunk",
                          "Ink and Watercolor Portrait",
                          "Intricate Abstract Lines Portrait",
                          "3D Render",
                          "Old School Comic",
                          "Bold Colored Illustration",
                          "Synthwave",
                          "Minimal Cold Futurism",
                          "Futuristic Anime",
                          "Cinematic Miyazaki",
                          "Studio Ghibli Film Still",
                          "Soft Delicate Matte Portrait",
                          "Cinematic Landscape",
                          "Landscape Painting",
                          "Photograph",
                          "Jackson Pollock",
                          "Cubist",
                          "Abstract Minimalist",
                          "Impressionism",
                          "Van Gogh",
                          "Woodcut",
                          "Oil Painting",
                          "Vintage Japanese Anime",
                          "Pixar",
                          "Cosmic",
                          "Pixel Art",
                          "Fantasy",
                          "Arcane",
                          "Sin City",
                          "Double Exposure",
                          "Painted Cityscape",
                          "90s Streets",
                          "Overgrown",
                          "Postapocalyptic",
                          "Spooky",
                          "Miniatures",
                          "Low Poly",
                          "Art Deco",
                          "Inkpunk",
                          "Dark Graphic Illustration",
                          "Dark Watercolor",
                          "Faded Illustration",
                          "Directed by AI"
                        ],
                        "example": "Painterly Illustration",
                        "type": "string"
                      },
                      "art_style_custom": {
                        "description": "Describe custom art style. This field is required if `art_style` is `Custom`",
                        "example": "Watercolor painting with soft pastel colors",
                        "type": "string"
                      },
                      "camera_effect": {
                        "description": "The camera effect used to create the output video",
                        "enum": [
                          "Simple Zoom Out",
                          "Simple Zoom In",
                          "Bounce Out",
                          "Spin Bounce",
                          "Rolling Bounces",
                          "Rise and Climb",
                          "Dramatic Zoom In",
                          "Dramatic Zoom Out",
                          "Sway Out",
                          "Boost Zoom In",
                          "Boost Zoom Out",
                          "Heartbeat",
                          "Bounce in Place",
                          "Earthquake Bounce",
                          "Slice Bounce",
                          "Bounce In And Out",
                          "Jump",
                          "Road Trip",
                          "Traverse",
                          "Rubber Band",
                          "Rodeo",
                          "Accelerate",
                          "Speed of Light",
                          "Drift Spin",
                          "Vertigo",
                          "Cog in the Machine",
                          "Quadrant",
                          "Tron",
                          "Pusher",
                          "Roll In",
                          "Hesitate In",
                          "Zoom In - Audio Sync",
                          "Pulse - Audio Sync",
                          "Aggressive Zoom In - Audio Sync",
                          "Roll In - Audio Sync",
                          "Zoom Out - Audio Sync",
                          "Aggressive Zoom Out - Audio Sync",
                          "Sway Out - Audio Sync",
                          "Bounce and Spin - Audio Sync",
                          "Zoom In and Spin - Audio Sync",
                          "Vertigo - Audio Sync",
                          "Bounce Out - Audio Sync",
                          "Earthquake Bounce - Audio Sync",
                          "Pusher - Audio Sync",
                          "Evolve - Audio Sync",
                          "Devolve - Audio Sync",
                          "Slideshow",
                          "Pan Left",
                          "Pan Right",
                          "Tilt Up",
                          "Tilt Down",
                          "Directed by AI"
                        ],
                        "example": "Simple Zoom In",
                        "type": "string"
                      },
                      "prompt": {
                        "description": "The prompt used for the video. Prompt is required if `prompt_type` is `custom`. Otherwise this value is ignored",
                        "example": "Cyberpunk city",
                        "type": "string"
                      },
                      "prompt_type": {
                        "description": "\n* `custom` - Use your own prompt for the video.\n* `use_lyrics` - Use the lyrics of the audio to create the prompt. If this option is selected, then `assets.audio_source` must be `file` or `youtube`.\n* `ai_choose` - Let AI write the prompt. If this option is selected, then `assets.audio_source` must be `file` or `youtube`.",
                        "enum": [
                          "custom",
                          "use_lyrics",
                          "ai_choose"
                        ],
                        "example": "custom",
                        "type": "string"
                      },
                      "transition_speed": {
                        "description": "Change determines how quickly the video's content changes across frames. \n* Higher = more rapid transitions.\n* Lower = more stable visual experience.",
                        "example": 5,
                        "maximum": 10,
                        "minimum": 1,
                        "type": "integer"
                      }
                    },
                    "required": [
                      "art_style",
                      "camera_effect",
                      "prompt_type",
                      "transition_speed"
                    ],
                    "type": "object"
                  },
                  "width": {
                    "description": "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",
                    "example": 512,
                    "minimum": 64,
                    "type": "integer"
                  }
                },
                "required": [
                  "fps",
                  "end_seconds",
                  "height",
                  "width",
                  "style",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Create animation"
              }
            },
            {
              "name": "create_video_from_audio",
              "title": "Create video from audio",
              "description": "Generates an audio-guided video from a supplied audio track, with an optional starting image and visual prompt. Starts a background job that costs credits; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the audio file and an optional reference image.",
                    "properties": {
                      "audio_file_path": {
                        "description": "The path of the audio file. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.mp3",
                        "minLength": 1,
                        "type": "string"
                      },
                      "image_file_path": {
                        "description": "Reference image for the initial frame of the video. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "audio_file_path"
                    ],
                    "type": "object"
                  },
                  "end_seconds": {
                    "description": "End time of your clip (seconds). Must be greater than start_seconds.",
                    "example": 5,
                    "format": "float",
                    "minimum": 0.1,
                    "type": "number"
                  },
                  "name": {
                    "default": "Audio To Video - dateTime",
                    "description": "Give your video a custom name for easy identification.",
                    "example": "My Audio To Video video",
                    "type": "string"
                  },
                  "resolution": {
                    "description": "Output video resolution. Defaults to `720p` on paid tiers and `480p` on free tiers.",
                    "enum": [
                      "480p",
                      "720p",
                      "1080p"
                    ],
                    "example": "480p",
                    "type": "string"
                  },
                  "start_seconds": {
                    "default": 0,
                    "description": "Start time of your clip (seconds). Must be ≥ 0.",
                    "example": 0,
                    "format": "float",
                    "minimum": 0,
                    "type": "number"
                  },
                  "style": {
                    "description": "Attributes used to dictate the style of the output",
                    "properties": {
                      "prompt": {
                        "description": "Prompt to guide the visual style of the video.",
                        "example": "Car driving through a city",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "end_seconds",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Create video from audio"
              }
            },
            {
              "name": "add_subtitles_to_video",
              "title": "Add subtitles to video",
              "description": "Adds automatically generated subtitles to a supplied video segment using a subtitle preset or custom text styling. Starts a background job that costs credits; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for auto subtitle generator",
                    "properties": {
                      "video_file_path": {
                        "description": "This is the video used to add subtitles. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.mp4",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "video_file_path"
                    ],
                    "type": "object"
                  },
                  "end_seconds": {
                    "description": "End time of your clip (seconds). Must be greater than start_seconds.",
                    "example": 5,
                    "format": "float",
                    "minimum": 0.1,
                    "type": "number"
                  },
                  "name": {
                    "default": "Auto Subtitle - dateTime",
                    "description": "Give your video a custom name for easy identification.",
                    "example": "My Auto Subtitle video",
                    "type": "string"
                  },
                  "start_seconds": {
                    "description": "Start time of your clip (seconds). Must be ≥ 0.",
                    "example": 0,
                    "format": "float",
                    "minimum": 0,
                    "type": "number"
                  },
                  "style": {
                    "description": "Style of the subtitle. At least one of `.style.template` or `.style.custom_config` must be provided. \n* If only `.style.template` is provided, default values for the template will be used.\n* If both are provided, the fields in `.style.custom_config` will be used to overwrite the fields in `.style.template`.\n* If only `.style.custom_config` is provided, then all fields in `.style.custom_config` will be used.\n\nTo use custom config only, the following `custom_config` params are required:\n* `.style.custom_config.font`\n* `.style.custom_config.text_color`\n* `.style.custom_config.vertical_position`\n* `.style.custom_config.horizontal_position`\n",
                    "properties": {
                      "custom_config": {
                        "description": "Custom subtitle configuration.",
                        "properties": {
                          "font": {
                            "description": "Font name from Google Fonts. Not all fonts support all languages or character sets. \nWe recommend verifying language support and appearance directly on https://fonts.google.com before use.",
                            "example": "Noto Sans",
                            "type": "string"
                          },
                          "font_size": {
                            "description": "Font size in pixels. If not provided, the font size is automatically calculated based on the video resolution.",
                            "example": 24,
                            "type": "number"
                          },
                          "font_style": {
                            "description": "Font style (e.g., normal, italic, bold)",
                            "example": "normal",
                            "type": "string"
                          },
                          "highlighted_text_color": {
                            "description": "Color used to highlight the current spoken text",
                            "example": "#FFD700",
                            "type": "string"
                          },
                          "horizontal_position": {
                            "description": "Horizontal alignment of the text (e.g., left, center, right)",
                            "example": "center",
                            "type": "string"
                          },
                          "stroke_color": {
                            "description": "Stroke (outline) color of the text",
                            "example": "#000000",
                            "type": "string"
                          },
                          "stroke_width": {
                            "description": "Width of the text stroke in pixels. If `stroke_color` is provided, but `stroke_width` is not, the `stroke_width` will be calculated automatically based on the font size.",
                            "example": 1,
                            "type": "number"
                          },
                          "text_color": {
                            "description": "Primary text color in hex format",
                            "example": "#FFFFFF",
                            "type": "string"
                          },
                          "vertical_position": {
                            "description": "Vertical alignment of the text (e.g., top, center, bottom)",
                            "example": "bottom",
                            "type": "string"
                          }
                        },
                        "type": "object"
                      },
                      "template": {
                        "description": "Preset subtitle templates. Please visit https://magichour.ai/create/auto-subtitle-generator to see the style of the existing templates.",
                        "enum": [
                          "karaoke",
                          "cinematic",
                          "minimalist",
                          "highlight"
                        ],
                        "example": "karaoke",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "start_seconds",
                  "end_seconds",
                  "assets",
                  "style"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Add subtitles to video"
              }
            },
            {
              "name": "replace_character_in_video",
              "title": "Replace character in video",
              "description": "Use only with the user's own likeness or content they are authorized to use. Do not use for impersonation, deception, sexual content, or content involving minors.\n\nReplaces a subject in a video with a character from a reference image, or transfers the video's motion onto that character. Starts a background job that costs credits; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Source video and reference character image for the job.",
                    "properties": {
                      "image_file_path": {
                        "description": "Reference character image used as the replacement or animation target. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/5678.png",
                        "minLength": 1,
                        "type": "string"
                      },
                      "video_file_path": {
                        "description": "Source video containing the subject to replace or animate. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.mp4",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "video_file_path",
                      "image_file_path"
                    ],
                    "type": "object"
                  },
                  "end_seconds": {
                    "description": "End time of your clip (seconds). Must be greater than start_seconds.",
                    "example": 5,
                    "format": "float",
                    "minimum": 0.1,
                    "type": "number"
                  },
                  "model": {
                    "default": "wan-animate",
                    "description": "Model to use. Defaults to `wan-animate`.\n\n* **`wan-animate`**: 480p, 720p. Supports `points` subject selection.\n* **`kling-3.0`**: 720p, 1080p. Clips of 3–10 seconds in `replace` mode or 3–30 seconds in `animate` mode. Picks the main person automatically, so `points` are rejected.\n* **`minimax-h3`**: 480p, 720p, 1080p. Clips of 1–60 seconds in `replace` mode or 1–60 seconds in `animate` mode. Subject `points` are `replace`-only; `animate` with `selection_mode` `point` returns 422, and with `auto` or no `selection_mode` the points are ignored.",
                    "enum": [
                      "wan-animate",
                      "kling-3.0",
                      "minimax-h3"
                    ],
                    "example": "wan-animate",
                    "type": "string"
                  },
                  "name": {
                    "default": "Character Replace - dateTime",
                    "description": "Give your video a custom name for easy identification.",
                    "example": "My Character Replace video",
                    "type": "string"
                  },
                  "resolution": {
                    "description": "Output video resolution. Must be supported by `model`. Defaults to the lowest resolution available on your plan for that model.",
                    "enum": [
                      "480p",
                      "720p",
                      "1080p"
                    ],
                    "example": "480p",
                    "type": "string"
                  },
                  "start_seconds": {
                    "default": 0,
                    "description": "Start time of your clip (seconds). Must be ≥ 0.",
                    "example": 0,
                    "format": "float",
                    "minimum": 0,
                    "type": "number"
                  },
                  "style": {
                    "description": "Optional style controls for replace vs animate mode and subject selection.",
                    "example": {
                      "mode": "replace",
                      "selection_mode": "auto"
                    },
                    "properties": {
                      "mode": {
                        "description": "Processing mode. `replace` swaps the detected subject with your reference character. `animate` transfers motion from the video onto your character image.",
                        "enum": [
                          "replace",
                          "animate"
                        ],
                        "example": "replace",
                        "type": "string"
                      },
                      "points": {
                        "description": "On-frame markers for manual subject selection. Required when `selection_mode` is `point`. Ignored when `selection_mode` is `auto` or omitted. Rejected for models without subject selection (supported by `wan-animate`, `minimax-h3`). `minimax-h3` subject `points` are `replace`-only; `animate` with `selection_mode` `point` returns 422, and with `auto` or no `selection_mode` the points are ignored.",
                        "items": {
                          "properties": {
                            "position_x": {
                              "description": "Horizontal pixel coordinate in the source video frame at `time_seconds`, measured from the left edge.",
                              "example": 320,
                              "minimum": 0,
                              "type": "integer"
                            },
                            "position_y": {
                              "description": "Vertical pixel coordinate in the source video frame at `time_seconds`, measured from the top edge.",
                              "example": 180,
                              "minimum": 0,
                              "type": "integer"
                            },
                            "time_seconds": {
                              "description": "Timestamp on the source video timeline in seconds. Uses the same clock as `start_seconds` and `end_seconds`.",
                              "example": 2.5,
                              "format": "float",
                              "minimum": 0,
                              "type": "number"
                            }
                          },
                          "required": [
                            "position_x",
                            "position_y",
                            "time_seconds"
                          ],
                          "type": "object"
                        },
                        "type": "array"
                      },
                      "prompt": {
                        "description": "Optional direction. Supported by kling-3.0, minimax-h3.",
                        "maxLength": 2000,
                        "type": "string"
                      },
                      "selection_mode": {
                        "description": "How to locate the subject in the source video. `auto` detects a person automatically. `point` uses your `points` to mark the subject and is supported by `wan-animate`, `minimax-h3`. `minimax-h3` subject `points` are `replace`-only; `animate` with `selection_mode` `point` returns 422, and with `auto` or no `selection_mode` the points are ignored. Defaults to `auto`.",
                        "enum": [
                          "auto",
                          "point"
                        ],
                        "example": "auto",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "end_seconds",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Replace character in video"
              }
            },
            {
              "name": "swap_face_in_video",
              "title": "Swap face in video",
              "description": "Use only with the user's own likeness or content they are authorized to use. Do not use for impersonation, deception, sexual content, or content involving minors.\n\nSwaps faces in an existing video: all faces with a reference image, or selected faces using detect_faces results. Starts a background job that costs credits; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for face swap. For video, The `video_source` field determines whether `video_file_path` or `youtube_url` field is used",
                    "example": {
                      "face_swap_mode": "all-faces",
                      "image_file_path": "api-assets/id/1234.png",
                      "video_file_path": "api-assets/id/1234.mp4",
                      "video_source": "file"
                    },
                    "properties": {
                      "face_mappings": {
                        "description": "This is the array of face mappings used for multiple face swap. The value is required if `face_swap_mode` is `individual-faces`.",
                        "example": [
                          {
                            "new_face": "api-assets/id/1234.png",
                            "original_face": "api-assets/id/0-0.png"
                          }
                        ],
                        "items": {
                          "properties": {
                            "new_face": {
                              "description": "The face image that will be used to replace the face in the `original_face`. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                              "example": "api-assets/id/1234.png",
                              "type": "string"
                            },
                            "original_face": {
                              "description": "The face detected from the image in `target_file_path`. The file name is in the format of `\u003cface_frame\u003e-\u003cface_index\u003e.png`. This value is corresponds to the response in the [face detection API](https://docs.magichour.ai/api-reference/files/get-face-detection-details).\n\n* The face_frame is the frame number of the face in the target image. For images, the frame number is always 0.\n* The face_index is the index of the face in the target image, starting from 0 going left to right.",
                              "example": "api-assets/id/0-0.png",
                              "type": "string"
                            }
                          },
                          "required": [
                            "original_face",
                            "new_face"
                          ],
                          "type": "object"
                        },
                        "maxItems": 5,
                        "type": "array"
                      },
                      "face_swap_mode": {
                        "default": "all-faces",
                        "description": "Choose which faces to swap. `all-faces` uses one source image for all detected faces (`image_file_path` required). `individual-faces` uses exact `face_mappings`.",
                        "enum": [
                          "all-faces",
                          "individual-faces"
                        ],
                        "example": "all-faces",
                        "type": "string"
                      },
                      "image_file_path": {
                        "description": "The path of the input image with the face to be swapped.  The value is required if `face_swap_mode` is `all-faces`.\n\nThis value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "type": "string"
                      },
                      "video_file_path": {
                        "description": "Your video file. Required if `video_source` is `file`. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.mp4",
                        "type": "string"
                      },
                      "video_source": {
                        "description": "Choose your video source.",
                        "enum": [
                          "file",
                          "youtube"
                        ],
                        "example": "file",
                        "type": "string"
                      },
                      "youtube_url": {
                        "description": "YouTube URL (required if `video_source` is `youtube`).",
                        "format": "uri",
                        "type": "string"
                      }
                    },
                    "required": [
                      "video_source"
                    ],
                    "type": "object"
                  },
                  "end_seconds": {
                    "description": "End time of your clip (seconds). Must be greater than start_seconds.",
                    "example": 5,
                    "format": "float",
                    "minimum": 0.1,
                    "type": "number"
                  },
                  "name": {
                    "default": "Face Swap - dateTime",
                    "description": "Give your video a custom name for easy identification.",
                    "example": "My Face Swap video",
                    "type": "string"
                  },
                  "start_seconds": {
                    "description": "Start time of your clip (seconds). Must be ≥ 0.",
                    "example": 0,
                    "format": "float",
                    "minimum": 0,
                    "type": "number"
                  },
                  "style": {
                    "description": "Style of the face swap video.",
                    "example": {
                      "version": "default"
                    },
                    "properties": {
                      "version": {
                        "description": "Select face-swap version `v1` or `v2`. `default` uses the server-selected version, which may change over time.",
                        "enum": [
                          "v1",
                          "v2",
                          "default"
                        ],
                        "example": "default",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "start_seconds",
                  "end_seconds",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Swap face in video"
              }
            },
            {
              "name": "create_video_from_image",
              "title": "Create video from image",
              "description": "Animates a supplied image into a video using motion instructions and available model options. Starts a background job that costs credits; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for image-to-video.",
                    "properties": {
                      "end_image_file_path": {
                        "description": "The image to use as the last frame of the video.\n\n* **`gemini-omni-1.1`**: Supports 360p, 720p, 1080p, 4k.\n* **`kling-2.6`**: Supports 1080p.\n* **`kling-3.0`**: Supports 720p, 1080p, 4k.\n* **`kling-4.0`**: Supports 720p, 1080p.\n* **`ltx-2.5`**: Supports 480p, 720p, 1080p.\n* **`minimax-h3`**: Supports 480p, 720p, 1080p.\n* **`seedance-1.5`**: Supports 480p, 720p, 1080p.\n* **`seedance-2.0`**: Supports 480p, 720p, 1080p, 4k.\n* **`seedance-2.0-fast`**: Supports 480p, 720p.\n* **`seedance-2.0-mini`**: Supports 480p, 720p.\n* **`seedance-2.5`**: Supports 480p, 720p, 1080p.\n* **`veo3.1`**: Supports 720p, 1080p. Requires a duration of 8 seconds or less.\n* **`veo3.1-lite`**: Supports 720p, 1080p. Requires a duration of 8 seconds or less.\n* **`wan-2.2`**: Not supported\n* **`wan-3.0`**: Supports 480p, 720p, 1080p.\n\nThis value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "minLength": 1,
                        "type": "string"
                      },
                      "image_file_path": {
                        "description": "The path of the image file. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "image_file_path"
                    ],
                    "type": "object"
                  },
                  "audio": {
                    "description": "Whether to include audio in the video. Defaults to `false` if not specified.\n\nAudio support varies by model:\n* **`gemini-omni-1.1`**: Not supported\n* **`kling-2.6`**: Not supported\n* **`kling-3.0`**: Toggle-able: audio adds extra credits when enabled\n* **`kling-4.0`**: Toggle-able: no additional credits for audio\n* **`ltx-2.5`**: Toggle-able: no additional credits for audio\n* **`minimax-h3`**: Toggle-able: no additional credits for audio\n* **`seedance-1.5`**: Toggle-able: audio adds extra credits when enabled\n* **`seedance-2.0`**: Toggle-able: no additional credits for audio\n* **`seedance-2.0-fast`**: Toggle-able: no additional credits for audio\n* **`seedance-2.0-mini`**: Toggle-able: no additional credits for audio\n* **`seedance-2.5`**: Toggle-able: no additional credits for audio\n* **`veo3.1`**: Toggle-able: audio adds extra credits when enabled\n* **`veo3.1-lite`**: Toggle-able: audio adds extra credits when enabled\n* **`wan-2.2`**: Not supported\n* **`wan-3.0`**: Toggle-able: no additional credits for audio\n",
                    "example": true,
                    "type": "boolean"
                  },
                  "end_seconds": {
                    "description": "The total duration of the output video in seconds. Supported durations depend on the chosen model:\n\n* **`gemini-omni-1.1`**: any integer from 3 to 10\n* **`kling-2.6`**: 5, 10\n* **`kling-3.0`**: any integer from 3 to 15\n* **`kling-4.0`**: any integer from 3 to 30\n* **`ltx-2.5`**: any integer from 1 to 60\n* **`minimax-h3`**: any integer from 1 to 30\n* **`seedance-1.5`**: any integer from 4 to 12\n* **`seedance-2.0`**: any integer from 4 to 15\n* **`seedance-2.0-fast`**: any integer from 4 to 15\n* **`seedance-2.0-mini`**: any integer from 4 to 15\n* **`seedance-2.5`**: any integer from 4 to 30\n* **`veo3.1`**: 4, 6, 8, 16, 24, 32, 40, 48, 56\n* **`veo3.1-lite`**: 4, 6, 8, 16, 24, 32, 40, 48, 56\n* **`wan-2.2`**: 3, 4, 5, 6, 7, 8, 9, 10, 15\n* **`wan-3.0`**: any integer from 2 to 30\n",
                    "example": 5,
                    "format": "float",
                    "maximum": 60,
                    "minimum": 1,
                    "type": "number"
                  },
                  "model": {
                    "default": "default",
                    "description": "The video generation model. With `default`, paid tiers use `kling-3.0` and Free uses `ltx-2.5`. Duration, resolution, audio and reference support depend on the selected model. When no model was requested, use `default` rather than choosing a named premium model; omit an unrequested resolution so the API resolves it for the account. Preserve explicit settings and required input capabilities. Deprecated model values ending in `-audio` enable `audio`.",
                    "enum": [
                      "default",
                      "minimax-h3",
                      "kling-4.0",
                      "kling-3.0",
                      "ltx-2.5",
                      "wan-2.2",
                      "seedance-2.5",
                      "wan-3.0",
                      "seedance-2.0-mini",
                      "veo3.1",
                      "veo3.1-lite",
                      "seedance-2.0",
                      "kling-2.6",
                      "gemini-omni-1.1",
                      "seedance-2.0-fast",
                      "seedance-1.5",
                      "sora-2",
                      "ltx-2.3",
                      "ltx-2",
                      "kling-2.5",
                      "kling-1.6",
                      "seedance",
                      "kling-2.5-audio",
                      "veo3.1-audio"
                    ],
                    "example": "ltx-2.5",
                    "type": "string"
                  },
                  "name": {
                    "default": "Image To Video - dateTime",
                    "description": "Give your video a custom name for easy identification.",
                    "example": "My Image To Video video",
                    "type": "string"
                  },
                  "resolution": {
                    "description": "Controls the output video resolution. Defaults to `720p` on paid tiers and `480p` on free tiers.\n\n* **`gemini-omni-1.1`**: Supports 360p, 720p, 1080p, 4k.\n* **`kling-2.6`**: Supports 720p, 1080p.\n* **`kling-3.0`**: Supports 720p, 1080p, 4k.\n* **`kling-4.0`**: Supports 720p, 1080p.\n* **`ltx-2.5`**: Supports 480p, 720p, 1080p.\n* **`minimax-h3`**: Supports 480p, 720p, 1080p.\n* **`seedance-1.5`**: Supports 480p, 720p, 1080p.\n* **`seedance-2.0`**: Supports 480p, 720p, 1080p, 4k.\n* **`seedance-2.0-fast`**: Supports 480p, 720p.\n* **`seedance-2.0-mini`**: Supports 480p, 720p.\n* **`seedance-2.5`**: Supports 480p, 720p, 1080p.\n* **`veo3.1`**: Supports 720p, 1080p.\n* **`veo3.1-lite`**: Supports 720p, 1080p.\n* **`wan-2.2`**: Supports 480p, 720p, 1080p.\n* **`wan-3.0`**: Supports 480p, 720p, 1080p.\n",
                    "enum": [
                      "360p",
                      "480p",
                      "720p",
                      "1080p",
                      "4k"
                    ],
                    "example": "480p",
                    "type": "string"
                  },
                  "style": {
                    "description": "Attributed used to dictate the style of the output",
                    "properties": {
                      "prompt": {
                        "description": "The prompt used for the video.",
                        "example": "a dog running",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "end_seconds",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Create video from image"
              }
            },
            {
              "name": "create_lip_sync_video",
              "title": "Create lip sync video",
              "description": "Use only with the user's own likeness or content they are authorized to use. Do not use for impersonation, deception, sexual content, or content involving minors.\n\nAdjusts an existing video's lip movements to match supplied replacement audio. For a still portrait plus audio, use create_talking_photo. Starts a background job that costs credits; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for lip-sync. For video, The `video_source` field determines whether `video_file_path` or `youtube_url` field is used",
                    "example": {
                      "audio_file_path": "api-assets/id/1234.mp3",
                      "video_file_path": "api-assets/id/1234.mp4",
                      "video_source": "file"
                    },
                    "properties": {
                      "audio_file_path": {
                        "description": "The path of the audio file. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.mp3",
                        "minLength": 1,
                        "type": "string"
                      },
                      "video_file_path": {
                        "description": "Your video file. Required if `video_source` is `file`. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.mp4",
                        "type": "string"
                      },
                      "video_source": {
                        "description": "Choose your video source.",
                        "enum": [
                          "file",
                          "youtube"
                        ],
                        "example": "file",
                        "type": "string"
                      },
                      "youtube_url": {
                        "description": "YouTube URL (required if `video_source` is `youtube`).",
                        "format": "uri",
                        "type": "string"
                      }
                    },
                    "required": [
                      "audio_file_path",
                      "video_source"
                    ],
                    "type": "object"
                  },
                  "end_seconds": {
                    "description": "End time of your clip (seconds). Must be greater than start_seconds.",
                    "example": 5,
                    "format": "float",
                    "minimum": 0.1,
                    "type": "number"
                  },
                  "max_fps_limit": {
                    "description": "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 unnecessary frame usage in scenarios where high FPS is not required.",
                    "example": 12,
                    "minimum": 1,
                    "type": "number"
                  },
                  "name": {
                    "default": "Lip Sync - dateTime",
                    "description": "Give your video a custom name for easy identification.",
                    "example": "My Lip Sync video",
                    "type": "string"
                  },
                  "start_seconds": {
                    "description": "Start time of your clip (seconds). Must be ≥ 0.",
                    "example": 0,
                    "format": "float",
                    "minimum": 0,
                    "type": "number"
                  },
                  "style": {
                    "description": "Attributes used to dictate the style of the output",
                    "properties": {
                      "generation_mode": {
                        "default": "lite",
                        "description": "Select the lip-sync mode. `lite` costs 1 credit per video frame. `standard` costs 1 credit per video frame; `pro` costs 2. Both `standard` and `pro` require visible mouth movement in the opening seconds of the input video. `pro` requires a Creator, Pro or Business tier. For a still image, including a static image saved as video, use `create_talking_photo` with the original image and audio.",
                        "enum": [
                          "lite",
                          "standard",
                          "pro"
                        ],
                        "example": "lite",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "start_seconds",
                  "end_seconds",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Create lip sync video"
              }
            },
            {
              "name": "create_video_from_text",
              "title": "Create video from text",
              "description": "Generates a video from a text prompt, with optional supported reference inputs and model settings. To animate an existing starting image, use create_video_from_image. Starts a background job that costs credits; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "aspect_ratio": {
                    "description": "Provide `aspect_ratio` to set the video’s aspect ratio. Determines the aspect ratio of the output video.\n\n* **`gemini-omni-1.1`**: Supports 16:9, 9:16.\n* **`kling-2.6`**: Supports 9:16, 16:9, 1:1.\n* **`kling-3.0`**: Supports 9:16, 16:9, 1:1.\n* **`kling-4.0`**: Supports 9:16, 16:9, 1:1.\n* **`ltx-2.5`**: Supports 9:16, 16:9, 1:1.\n* **`minimax-h3`**: Supports 16:9, 9:16, 1:1.\n* **`seedance-1.5`**: Supports 9:16, 16:9, 1:1.\n* **`seedance-2.0`**: Supports 9:16, 16:9, 1:1.\n* **`seedance-2.0-fast`**: Supports 9:16, 16:9, 1:1.\n* **`seedance-2.0-mini`**: Supports 9:16, 16:9, 1:1.\n* **`seedance-2.5`**: Supports 9:16, 16:9, 1:1.\n* **`veo3.1`**: Supports 9:16, 16:9.\n* **`veo3.1-lite`**: Supports 9:16, 16:9.\n* **`wan-2.2`**: Supports 9:16, 16:9, 1:1.\n* **`wan-3.0`**: Supports 16:9, 9:16, 1:1.\n",
                    "enum": [
                      "16:9",
                      "9:16",
                      "1:1"
                    ],
                    "example": "16:9",
                    "type": "string"
                  },
                  "audio": {
                    "description": "Whether to include audio in the video. Defaults to `false` if not specified.\n\nAudio support varies by model:\n* **`gemini-omni-1.1`**: Not supported\n* **`kling-2.6`**: Not supported\n* **`kling-3.0`**: Toggle-able: audio adds extra credits when enabled\n* **`kling-4.0`**: Toggle-able: no additional credits for audio\n* **`ltx-2.5`**: Toggle-able: no additional credits for audio\n* **`minimax-h3`**: Toggle-able: no additional credits for audio\n* **`seedance-1.5`**: Toggle-able: audio adds extra credits when enabled\n* **`seedance-2.0`**: Toggle-able: no additional credits for audio\n* **`seedance-2.0-fast`**: Toggle-able: no additional credits for audio\n* **`seedance-2.0-mini`**: Toggle-able: no additional credits for audio\n* **`seedance-2.5`**: Toggle-able: no additional credits for audio\n* **`veo3.1`**: Toggle-able: audio adds extra credits when enabled\n* **`veo3.1-lite`**: Toggle-able: audio adds extra credits when enabled\n* **`wan-2.2`**: Not supported\n* **`wan-3.0`**: Toggle-able: no additional credits for audio\n",
                    "example": true,
                    "type": "boolean"
                  },
                  "end_seconds": {
                    "description": "The total duration of the output video in seconds. Supported durations depend on the chosen model:\n\n* **`gemini-omni-1.1`**: any integer from 3 to 10\n* **`kling-2.6`**: 5, 10\n* **`kling-3.0`**: any integer from 3 to 15\n* **`kling-4.0`**: any integer from 3 to 30\n* **`ltx-2.5`**: any integer from 1 to 60\n* **`minimax-h3`**: any integer from 1 to 30\n* **`seedance-1.5`**: any integer from 4 to 12\n* **`seedance-2.0`**: any integer from 4 to 15\n* **`seedance-2.0-fast`**: any integer from 4 to 15\n* **`seedance-2.0-mini`**: any integer from 4 to 15\n* **`seedance-2.5`**: any integer from 4 to 30\n* **`veo3.1`**: 4, 6, 8, 16, 24, 32, 40, 48, 56\n* **`veo3.1-lite`**: 4, 6, 8, 16, 24, 32, 40, 48, 56\n* **`wan-2.2`**: 3, 4, 5, 6, 7, 8, 9, 10, 15\n* **`wan-3.0`**: any integer from 2 to 30\n",
                    "example": 5,
                    "format": "float",
                    "maximum": 60,
                    "minimum": 1,
                    "type": "number"
                  },
                  "model": {
                    "default": "default",
                    "description": "The video generation model. With `default`, paid tiers use `kling-3.0` and Free uses `ltx-2.5`. Duration, resolution, audio and reference support depend on the selected model. When no model was requested, use `default` rather than choosing a named premium model; omit an unrequested resolution so the API resolves it for the account. Preserve explicit settings and required input capabilities. Deprecated model values ending in `-audio` enable `audio`.",
                    "enum": [
                      "default",
                      "minimax-h3",
                      "kling-4.0",
                      "kling-3.0",
                      "ltx-2.5",
                      "wan-2.2",
                      "seedance-2.5",
                      "wan-3.0",
                      "seedance-2.0-mini",
                      "veo3.1",
                      "veo3.1-lite",
                      "seedance-2.0",
                      "kling-2.6",
                      "gemini-omni-1.1",
                      "seedance-2.0-fast",
                      "seedance-1.5",
                      "sora-2",
                      "ltx-2.3",
                      "ltx-2",
                      "kling-2.5",
                      "kling-1.6",
                      "seedance",
                      "kling-2.5-audio",
                      "veo3.1-audio"
                    ],
                    "example": "ltx-2.5",
                    "type": "string"
                  },
                  "name": {
                    "default": "Text To Video - dateTime",
                    "description": "Give your video a custom name for easy identification.",
                    "example": "My Text To Video video",
                    "type": "string"
                  },
                  "references": {
                    "description": "Reference media for video generation. Name references without @ and refer to them as @name in style.prompt. Maximum 10 references total.\n\nSupported models and reference media:\n* **`gemini-omni-1.1`**: Supports images, videos. Up to 10 references.\n* **`kling-3.0`**: Supports images, videos.\n* **`kling-4.0`**: Supports images, videos. Up to 10 references.\n* **`minimax-h3`**: Supports images, videos, audio. Video references must be 2–15 seconds each and 15 seconds combined, and are used in full.\n* **`seedance-2.0`**: Supports images, videos, audio.\n* **`seedance-2.0-fast`**: Supports images, videos, audio.\n* **`seedance-2.0-mini`**: Supports images, videos, audio.\n* **`seedance-2.5`**: Supports images, videos, audio.\n* **`veo3.1`**: Supports images. Up to 3 references. Requires `end_seconds` of 8.\n* **`wan-3.0`**: Supports images, videos, audio.",
                    "items": {
                      "properties": {
                        "file_path": {
                          "description": "This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                          "example": "api-assets/id/1234.png",
                          "minLength": 1,
                          "type": "string"
                        },
                        "name": {
                          "example": "hero",
                          "pattern": "^[A-Za-z][\\w-]*$",
                          "type": "string"
                        }
                      },
                      "required": [
                        "name",
                        "file_path"
                      ],
                      "type": "object"
                    },
                    "maxItems": 10,
                    "minItems": 1,
                    "type": "array"
                  },
                  "resolution": {
                    "description": "Controls the output video resolution. Defaults to `720p` on paid tiers and `480p` on free tiers.\n\n* **`gemini-omni-1.1`**: Supports 360p, 720p, 1080p, 4k.\n* **`kling-2.6`**: Supports 720p, 1080p.\n* **`kling-3.0`**: Supports 720p, 1080p, 4k.\n* **`kling-4.0`**: Supports 720p, 1080p.\n* **`ltx-2.5`**: Supports 480p, 720p, 1080p.\n* **`minimax-h3`**: Supports 480p, 720p, 1080p.\n* **`seedance-1.5`**: Supports 480p, 720p, 1080p.\n* **`seedance-2.0`**: Supports 480p, 720p, 1080p, 4k.\n* **`seedance-2.0-fast`**: Supports 480p, 720p.\n* **`seedance-2.0-mini`**: Supports 480p, 720p.\n* **`seedance-2.5`**: Supports 480p, 720p, 1080p.\n* **`veo3.1`**: Supports 720p, 1080p.\n* **`veo3.1-lite`**: Supports 720p, 1080p.\n* **`wan-2.2`**: Supports 480p, 720p, 1080p.\n* **`wan-3.0`**: Supports 480p, 720p, 1080p.\n",
                    "enum": [
                      "360p",
                      "480p",
                      "720p",
                      "1080p",
                      "4k"
                    ],
                    "example": "480p",
                    "type": "string"
                  },
                  "style": {
                    "properties": {
                      "prompt": {
                        "description": "The prompt used for the video.",
                        "example": "a dog running",
                        "maxLength": 20000,
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "prompt"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "end_seconds",
                  "style"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Create video from text"
              }
            },
            {
              "name": "restyle_video",
              "title": "Restyle video",
              "description": "Restyles an existing video clip with an art-style preset or a custom prompt. Supports v1/v2 presets, not v3. Starts a background job that costs credits; returns a project id for wait_for_video_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for video-to-video. For video, The `video_source` field determines whether `video_file_path` or `youtube_url` field is used",
                    "example": {
                      "video_file_path": "api-assets/id/1234.mp4",
                      "video_source": "file"
                    },
                    "properties": {
                      "video_file_path": {
                        "description": "Your video file. Required if `video_source` is `file`. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.mp4",
                        "type": "string"
                      },
                      "video_source": {
                        "description": "Choose your video source.",
                        "enum": [
                          "file",
                          "youtube"
                        ],
                        "example": "file",
                        "type": "string"
                      },
                      "youtube_url": {
                        "description": "YouTube URL (required if `video_source` is `youtube`).",
                        "format": "uri",
                        "type": "string"
                      }
                    },
                    "required": [
                      "video_source"
                    ],
                    "type": "object"
                  },
                  "end_seconds": {
                    "description": "End time of your clip (seconds). Must be greater than start_seconds.",
                    "example": 5,
                    "format": "float",
                    "minimum": 0.1,
                    "type": "number"
                  },
                  "fps_resolution": {
                    "default": "HALF",
                    "description": "Determines whether the resulting video will have the same frame per second as the original video, or half.\n* `FULL` - the result video will have the same FPS as the input video\n* `HALF` - the result video will have half the FPS as the input video",
                    "enum": [
                      "FULL",
                      "HALF"
                    ],
                    "example": "HALF",
                    "type": "string"
                  },
                  "name": {
                    "default": "Video To Video - dateTime",
                    "description": "Give your video a custom name for easy identification.",
                    "example": "My Video To Video video",
                    "type": "string"
                  },
                  "start_seconds": {
                    "description": "Start time of your clip (seconds). Must be ≥ 0.",
                    "example": 0,
                    "format": "float",
                    "minimum": 0,
                    "type": "number"
                  },
                  "style": {
                    "properties": {
                      "art_style": {
                        "enum": [
                          "Minecraft",
                          "Watercolor",
                          "Pixel",
                          "Retro Sci-Fi",
                          "Lego",
                          "Origami",
                          "Ghost",
                          "Sub-Zero",
                          "Studio Ghibli",
                          "Comic",
                          "Impressionism",
                          "Master Chief",
                          "Solid Snake",
                          "Street Fighter",
                          "Hologram",
                          "GTA",
                          "Clay",
                          "Mystique",
                          "Dragonball Z",
                          "Mario",
                          "Samurai",
                          "Spartan",
                          "Boba Fett",
                          "3D Render",
                          "Airbender",
                          "Android",
                          "Anime Warrior",
                          "Armored Knight",
                          "Assassin's Creed",
                          "Avatar",
                          "Black Spiderman",
                          "Bold Anime",
                          "Celestial Skin",
                          "Chinese Swordsmen",
                          "Cyberpunk",
                          "Cypher",
                          "Dark Fantasy",
                          "Future Bot",
                          "Futuristic Fantasy",
                          "Ghibli Anime",
                          "Gundam",
                          "Illustration",
                          "Ink",
                          "Ink Poster",
                          "Jinx",
                          "Knight",
                          "Link",
                          "Marble",
                          "Mech",
                          "Naruto",
                          "Neon Dream",
                          "No Art Style",
                          "Oil Painting",
                          "On Fire",
                          "Painterly Anime",
                          "Pixar",
                          "Power Armor",
                          "Power Ranger",
                          "Radiant Anime",
                          "Realistic Anime",
                          "Realistic Pixar",
                          "Retro Anime",
                          "Samurai Bot",
                          "Sharp Anime",
                          "Soft Anime",
                          "Starfield",
                          "The Void",
                          "Tomb Raider",
                          "Underwater",
                          "Van Gogh",
                          "Viking",
                          "Western Anime",
                          "Wu Kong",
                          "Wuxia Anime",
                          "Zelda"
                        ],
                        "example": "Minecraft",
                        "type": "string"
                      },
                      "model": {
                        "default": "default",
                        "description": "Select a listed rendering model for the art style. `default` uses the selected art style's default model.",
                        "enum": [
                          "Dreamshaper",
                          "Absolute Reality",
                          "Flat 2D Anime",
                          "Soft Anime",
                          "Kaywaii",
                          "Western Anime",
                          "3D Anime",
                          "default"
                        ],
                        "example": "default",
                        "type": "string"
                      },
                      "prompt": {
                        "description": "The prompt used for the video. Prompt is required if `prompt_type` is `custom` or `append_default`. If `prompt_type` is `default`, then the `prompt` value passed will be ignored.",
                        "example": "A cinematic scene with warm lighting",
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "prompt_type": {
                        "default": "default",
                        "description": "`default` uses the art style's preset prompt and ignores `prompt`. `custom` uses the supplied `prompt`; v1 still adds its LoRA prompt to apply the art style. `append_default` appends the preset prompt to the supplied `prompt`.",
                        "enum": [
                          "default",
                          "custom",
                          "append_default"
                        ],
                        "example": "default",
                        "type": "string"
                      },
                      "version": {
                        "default": "default",
                        "description": "Select restyling version `v1` or `v2`. `default` uses the selected art style's default version. Some styles default to v3, which this API does not support. For `Studio Ghibli`, explicitly set `version` to `v2` for its supported preset.",
                        "enum": [
                          "v1",
                          "v2",
                          "default"
                        ],
                        "example": "default",
                        "type": "string"
                      }
                    },
                    "required": [
                      "art_style"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "start_seconds",
                  "end_seconds",
                  "style",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "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 output video. \n\nIf video generation fails, credits will be refunded, and this field will be updated to include the refund.",
                    "example": 450,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Restyle video"
              }
            },
            {
              "name": "get_image_project",
              "title": "Get image project",
              "description": "Returns an image project's status and, once complete, its download URLs. Use to check progress with the id from an image create tool. Read-only.",
              "inputSchema": {
                "properties": {
                  "id": {
                    "description": "Unique ID of the image project. This value is returned by all of the POST APIs that create an image.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "created_at": {
                    "format": "date-time",
                    "type": "string"
                  },
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 5,
                    "type": "integer"
                  },
                  "downloads": {
                    "items": {
                      "description": "The download url and expiration date of the image project",
                      "properties": {
                        "expires_at": {
                          "example": "2024-10-19T05:16:19.027Z",
                          "format": "date-time",
                          "type": "string"
                        },
                        "url": {
                          "example": "https://videos.magichour.ai/id/output.png",
                          "format": "uri",
                          "type": "string"
                        }
                      },
                      "required": [
                        "url",
                        "expires_at"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  },
                  "enabled": {
                    "description": "Whether this resource is active. If false, it is deleted.",
                    "type": "boolean"
                  },
                  "error": {
                    "description": "In the case of an error, this object will contain the error encountered during video render",
                    "properties": {
                      "code": {
                        "description": "An error code to indicate why a failure happened.",
                        "example": "no_source_face",
                        "type": "string"
                      },
                      "message": {
                        "description": "Details on the reason why a failure happened.",
                        "example": "Please use an image with a detectable face",
                        "type": "string"
                      }
                    },
                    "required": [
                      "message",
                      "code"
                    ],
                    "type": [
                      "object",
                      "null"
                    ]
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  },
                  "image_count": {
                    "description": "Number of images generated",
                    "example": 1,
                    "type": "integer"
                  },
                  "name": {
                    "description": "The name of the image.",
                    "example": "Example Name",
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "status": {
                    "description": "The status of the image.\n\n- `draft` - the project was created but has not been submitted for rendering\n- `queued` - the job is waiting for an available server\n- `rendering` - the job is being processed; the `image.started` webhook event fires when rendering begins\n- `complete` - the job finished successfully; fires `image.completed`\n- `error` - the job failed during processing; fires `image.errored`\n- `canceled` - the job was manually canceled (for example from the Magic Hour web app)\n\n**Note:** `rendering`, `complete`, and `error` have matching webhook events; `canceled` does not - a canceled job emits no webhook event, so poll this endpoint to detect cancellation.",
                    "enum": [
                      "draft",
                      "queued",
                      "rendering",
                      "complete",
                      "error",
                      "canceled"
                    ],
                    "example": "complete",
                    "type": "string"
                  },
                  "type": {
                    "description": "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_SWAP, IMAGE_UPSCALER, IMAGE_ENHANCER, AI_GIF, QR_CODE, PHOTO_EDITOR, PHOTO_COLORIZER, IMAGE_COLOR_GRADER, HEAD_SWAP, BODY_SWAP, STORYBOARD, IMAGE_EXPANDER",
                    "example": "AI_IMAGE",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "name",
                  "status",
                  "image_count",
                  "type",
                  "created_at",
                  "enabled",
                  "credits_charged",
                  "downloads",
                  "error"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true,
                "title": "Get image project"
              }
            },
            {
              "name": "delete_image_project",
              "title": "Delete image project",
              "description": "Deletes the image project and attempts to delete its completed output. Cannot be undone; confirm with the user first.",
              "inputSchema": {
                "properties": {
                  "id": {
                    "description": "Unique ID of the image project. This value is returned by all of the POST APIs that create an image.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": true,
                "openWorldHint": false,
                "readOnlyHint": false,
                "title": "Delete image project"
              }
            },
            {
              "name": "change_clothes_in_photo",
              "title": "Change clothes in photo",
              "description": "Use only with the user's own likeness or content they are authorized to use. Do not use for impersonation, deception, sexual content, or content involving minors.\n\nChanges clothing in a person photo using a supplied garment reference image. Costs 25 credits. Starts a background job; returns a project id for wait_for_image_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for clothes changer",
                    "properties": {
                      "garment_file_path": {
                        "description": "The image of the outfit. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/outfit.png",
                        "minLength": 1,
                        "type": "string"
                      },
                      "garment_type": {
                        "description": "Type of clothing item to swap. If not provided, swaps the entire outfit. \n* `upper_body` - for shirts/jackets \n* `lower_body` - for pants/skirts \n* `dresses` - for entire outfit (deprecated, use `entire_outfit` instead) \n* `entire_outfit` - for entire outfit",
                        "enum": [
                          "entire_outfit",
                          "upper_body",
                          "lower_body",
                          "dresses"
                        ],
                        "example": "entire_outfit",
                        "type": "string"
                      },
                      "person_file_path": {
                        "description": "The image with the person. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/model.png",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "person_file_path",
                      "garment_file_path"
                    ],
                    "type": "object"
                  },
                  "name": {
                    "default": "Clothes Changer - dateTime",
                    "description": "Give your image a custom name for easy identification.",
                    "example": "My Clothes Changer image",
                    "type": "string"
                  }
                },
                "required": [
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 25,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Change clothes in photo"
              }
            },
            {
              "name": "edit_face_in_photo",
              "title": "Edit face in photo",
              "description": "Adjusts facial expression, pose and gaze in a supplied photo using numeric controls. Costs 1 credit per edit; output size depends on the subscription tier. Starts a background job; returns a project id for wait_for_image_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for face editor",
                    "properties": {
                      "image_file_path": {
                        "description": "This is the image whose face will be edited. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "image_file_path"
                    ],
                    "type": "object"
                  },
                  "name": {
                    "default": "Face Editor - dateTime",
                    "description": "Give your image a custom name for easy identification.",
                    "example": "My Face Editor image",
                    "type": "string"
                  },
                  "style": {
                    "description": "Face editing parameters",
                    "properties": {
                      "enhance_face": {
                        "default": false,
                        "description": "Enhance face features",
                        "example": false,
                        "type": "boolean"
                      },
                      "eye_gaze_horizontal": {
                        "default": 0,
                        "description": "Horizontal eye gaze (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      },
                      "eye_gaze_vertical": {
                        "default": 0,
                        "description": "Vertical eye gaze (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      },
                      "eye_open_ratio": {
                        "default": 0,
                        "description": "Eye open ratio (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      },
                      "eyebrow_direction": {
                        "default": 0,
                        "description": "Eyebrow direction (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      },
                      "head_pitch": {
                        "default": 0,
                        "description": "Head pitch (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      },
                      "head_roll": {
                        "default": 0,
                        "description": "Head roll (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      },
                      "head_yaw": {
                        "default": 0,
                        "description": "Head yaw (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      },
                      "lip_open_ratio": {
                        "default": 0,
                        "description": "Lip open ratio (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      },
                      "mouth_grim": {
                        "default": 0,
                        "description": "Mouth grim (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      },
                      "mouth_position_horizontal": {
                        "default": 0,
                        "description": "Horizontal mouth position (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      },
                      "mouth_position_vertical": {
                        "default": 0,
                        "description": "Vertical mouth position (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      },
                      "mouth_pout": {
                        "default": 0,
                        "description": "Mouth pout (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      },
                      "mouth_purse": {
                        "default": 0,
                        "description": "Mouth purse (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      },
                      "mouth_smile": {
                        "default": 0,
                        "description": "Mouth smile (-100 to 100), in increments of 5",
                        "example": 0,
                        "maximum": 100,
                        "minimum": -100,
                        "multipleOf": 5,
                        "type": "number"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "assets",
                  "style"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 1,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Edit face in photo"
              }
            },
            {
              "name": "create_gif_or_short_video",
              "title": "Create GIF or short video",
              "description": "Generates a short animation from a text prompt, with GIF, MP4 or WebM output. Costs 50 credits. Starts a background job; returns a project id for wait_for_image_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "name": {
                    "default": "Ai Gif - dateTime",
                    "description": "Give your gif a custom name for easy identification.",
                    "example": "My Ai Gif gif",
                    "type": "string"
                  },
                  "output_format": {
                    "default": "gif",
                    "description": "The output file format for the generated animation.",
                    "enum": [
                      "gif",
                      "mp4",
                      "webm"
                    ],
                    "example": "gif",
                    "type": "string"
                  },
                  "style": {
                    "properties": {
                      "prompt": {
                        "description": "The prompt used for the GIF.",
                        "example": "Cute dancing cat, pixel art",
                        "maxLength": 500,
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "prompt"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "style"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 50,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": false,
                "title": "Create GIF or short video"
              }
            },
            {
              "name": "edit_image",
              "title": "Edit image",
              "description": "Edits one or more supplied images using a text prompt. For prompt-only creation use generate_image. Costs credits; returns a project id for wait_for_image_project. Model eligibility depends on the account plan. Read get_account_info first; do not assume an API default is eligible. For a Free account with no requested model, flux-2-klein at 640px with image_count=1 is an available option when it supports the supplied inputs and requested edit. Check the current model's input limits; never drop references or change an explicit model, resolution or count to fit this option. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "aspect_ratio": {
                    "description": "The aspect ratio of the output image(s). If not specified, defaults to `auto`.",
                    "enum": [
                      "auto",
                      "16:9",
                      "9:16",
                      "4:3",
                      "3:2",
                      "1:1",
                      "4:5",
                      "2:3"
                    ],
                    "example": "1:1",
                    "type": "string"
                  },
                  "assets": {
                    "description": "Provide the assets for image edit",
                    "properties": {
                      "image_file_paths": {
                        "description": "The image(s) used in the edit, maximum of 10 images. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": [
                          "api-assets/id/1234.png",
                          "api-assets/id/1235.png"
                        ],
                        "items": {
                          "minLength": 1,
                          "type": "string"
                        },
                        "maxItems": 10,
                        "type": "array"
                      }
                    },
                    "type": "object"
                  },
                  "image_count": {
                    "default": 1,
                    "description": "Number of images to generate. Maximum varies by model. Defaults to 1 if not specified.",
                    "enum": [
                      1,
                      4,
                      9,
                      16
                    ],
                    "example": 1,
                    "type": "number"
                  },
                  "model": {
                    "description": "The AI model to use for image editing. Each model has different capabilities and costs.\n\n**Models:**\n- `default` - Uses the server-selected default model, which may change over time.\n- `flux-2-klein` - from 5 credits/image\n  - Supported resolutions: 640px, 1k, 2k\n  - Available for tiers: free, creator, pro, business\n  - Max additional input images: 5\n- `gpt-image-2` - from 50 credits/image\n  - Supported resolutions: 640px, 1k, 2k, 4k\n  - Available for tiers: creator, pro, business\n  - Max additional input images: 9\n- `gpt-image-2.5-flare` - from 100 credits/image\n  - Supported resolutions: 640px, 1k, 2k, 4k\n  - Available for tiers: creator, pro, business\n  - Max additional input images: 9\n- `krea-2` - from 10 credits/image\n  - Supported resolutions: 640px, 1k\n  - Available for tiers: free, creator, pro, business\n  - Max additional input images: 1\n- `nano-banana` - from 50 credits/image\n  - Supported resolutions: 640px, 1k\n  - Available for tiers: creator, pro, business\n  - Max additional input images: 9\n- `nano-banana-2` - from 100 credits/image\n  - Supported resolutions: 640px, 1k, 2k, 4k\n  - Available for tiers: creator, pro, business\n  - Max additional input images: 9\n- `nano-banana-2-lite` - from 50 credits/image\n  - Supported resolutions: 640px, 1k\n  - Available for tiers: creator, pro, business\n  - Max additional input images: 9\n- `nano-banana-2.1` - from 50 credits/image\n  - Supported resolutions: 640px, 1k, 2k, 4k\n  - Available for tiers: creator, pro, business\n  - Max additional input images: 9\n- `nano-banana-pro` - from 150 credits/image\n  - Supported resolutions: 1k, 2k, 4k\n  - Available for tiers: creator, pro, business\n  - Max additional input images: 9\n- `qwen-edit` - from 10 credits/image\n  - Supported resolutions: 640px, 1k, 2k\n  - Available for tiers: free, creator, pro, business\n  - Max additional input images: 2\n- `qwen-image-2.1` - from 10 credits/image\n  - Supported resolutions: 640px, 1k, 2k\n  - Available for tiers: free, creator, pro, business\n  - Max additional input images: 2\n- `seedream-v4` - from 40 credits/image\n  - Supported resolutions: 640px, 1k, 2k, 4k\n  - Available for tiers: creator, pro, business\n  - Max additional input images: 9\n- `seedream-v4.5` - from 50 credits/image\n  - Supported resolutions: 640px, 1k, 2k, 4k\n  - Available for tiers: creator, pro, business\n  - Max additional input images: 9\n- `seedream-v5-pro` - from 75 credits/image\n  - Supported resolutions: 640px, 1k, 2k\n  - Available for tiers: creator, pro, business\n  - Max additional input images: 9\n",
                    "enum": [
                      "default",
                      "qwen-image-2.1",
                      "gpt-image-2",
                      "nano-banana-2",
                      "flux-2-klein",
                      "nano-banana-pro",
                      "seedream-v5-pro",
                      "seedream-v4.5",
                      "nano-banana-2.1",
                      "qwen-edit",
                      "nano-banana-2-lite",
                      "krea-2",
                      "gpt-image-2.5-flare",
                      "seedream-v4",
                      "nano-banana"
                    ],
                    "example": "flux-2-klein",
                    "type": "string"
                  },
                  "name": {
                    "default": "Ai Image Editor - dateTime",
                    "description": "Give your image a custom name for easy identification.",
                    "example": "My Ai Image Editor image",
                    "type": "string"
                  },
                  "resolution": {
                    "description": "Maximum resolution (longest edge) for the output image.\n\n**Options:**\n- `640px` — up to 640px\n- `1k` — up to 1024px\n- `2k` — up to 2048px\n- `4k` — up to 4096px\n- `auto` — **Deprecated.** Mapped server-side from your subscription tier to the best matching resolution the model supports\n\n**Per-model support:**\n- `flux-2-klein` - 640px, 1k, 2k\n- `gpt-image-2` - 640px, 1k, 2k, 4k\n- `gpt-image-2.5-flare` - 640px, 1k, 2k, 4k\n- `krea-2` - 640px, 1k\n- `nano-banana` - 640px, 1k\n- `nano-banana-2` - 640px, 1k, 2k, 4k\n- `nano-banana-2-lite` - 640px, 1k\n- `nano-banana-2.1` - 640px, 1k, 2k, 4k\n- `nano-banana-pro` - 1k, 2k, 4k\n- `qwen-edit` - 640px, 1k, 2k\n- `qwen-image-2.1` - 640px, 1k, 2k\n- `seedream-v4` - 640px, 1k, 2k, 4k\n- `seedream-v4.5` - 640px, 1k, 2k, 4k\n- `seedream-v5-pro` - 640px, 1k, 2k\n\nNote: Resolution availability depends on the model and your subscription tier.",
                    "enum": [
                      "auto",
                      "640px",
                      "1k",
                      "2k",
                      "4k"
                    ],
                    "example": "640px",
                    "type": "string"
                  },
                  "style": {
                    "properties": {
                      "prompt": {
                        "description": "The prompt used to edit the image.",
                        "example": "Give me sunglasses",
                        "maxLength": 15000,
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "prompt"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "style",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 5,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Edit image"
              }
            },
            {
              "name": "generate_headshot",
              "title": "Generate headshot",
              "description": "Creates a headshot from a supplied photo containing one detectable face, with optional appearance instructions. Costs 50 credits. Starts a background job; returns a project id for wait_for_image_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for headshot photo",
                    "properties": {
                      "image_file_path": {
                        "description": "The image used to generate the headshot. This image must contain one detectable face. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "image_file_path"
                    ],
                    "type": "object"
                  },
                  "name": {
                    "default": "Ai Headshot - dateTime",
                    "description": "Give your image a custom name for easy identification.",
                    "example": "My Ai Headshot image",
                    "type": "string"
                  },
                  "style": {
                    "properties": {
                      "prompt": {
                        "description": "Prompt used to guide the style of your headshot. We recommend omitting the prompt unless you want to customize your headshot. You can visit [AI headshot generator](https://magichour.ai/create/ai-headshot-generator) to view an example of a good prompt used for our 'Professional' style.",
                        "example": "Professional studio headshot with soft lighting and a neutral background",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 50,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Generate headshot"
              }
            },
            {
              "name": "generate_image",
              "title": "Generate image",
              "description": "Generates one or more images from a text prompt, with model, output size and image count options. Costs credits; returns a project id for wait_for_image_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "aspect_ratio": {
                    "description": "The aspect ratio of the output image(s). If not specified, defaults to `1:1` (square).",
                    "enum": [
                      "1:1",
                      "16:9",
                      "9:16"
                    ],
                    "example": "1:1",
                    "type": "string"
                  },
                  "image_count": {
                    "description": "Number of images to generate. Maximum varies by model.",
                    "example": 1,
                    "maximum": 16,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "model": {
                    "description": "When the user has not requested a model, use `default` rather than selecting a premium model. Preserve an explicit model. The AI model to use for image generation. Each model has different capabilities and costs.\n\n**Models:**\n- `default` - Uses the server-selected default model, which may change over time.\n- `flux-2-klein` - from 5 credits/image\n  - Supported resolutions: 640px, 1k, 2k\n  - Available for tiers: free, creator, pro, business\n  - Image count allowed: 1\n- `flux-schnell` - from 5 credits/image\n  - Supported resolutions: 640px, 1k, 2k\n  - Available for tiers: free, creator, pro, business\n  - Image count allowed: 1, 2, 3, 4\n- `gpt-image-2` - from 50 credits/image\n  - Supported resolutions: 640px, 1k, 2k, 4k\n  - Available for tiers: creator, pro, business\n  - Image count allowed: 1, 2, 3, 4\n- `gpt-image-2.5-flare` - from 100 credits/image\n  - Supported resolutions: 640px, 1k, 2k, 4k\n  - Available for tiers: creator, pro, business\n  - Image count allowed: 1, 2, 3, 4\n- `krea-2` - from 10 credits/image\n  - Supported resolutions: 640px, 1k\n  - Available for tiers: free, creator, pro, business\n  - Image count allowed: 1\n- `nano-banana` - from 50 credits/image\n  - Supported resolutions: 640px, 1k\n  - Available for tiers: creator, pro, business\n  - Image count allowed: 1, 2, 3, 4\n- `nano-banana-2` - from 100 credits/image\n  - Supported resolutions: 640px, 1k, 2k, 4k\n  - Available for tiers: creator, pro, business\n  - Image count allowed: 1, 4, 9, 16\n- `nano-banana-2-lite` - from 50 credits/image\n  - Supported resolutions: 640px, 1k\n  - Available for tiers: creator, pro, business\n  - Image count allowed: 1, 2, 3, 4\n- `nano-banana-2.1` - from 50 credits/image\n  - Supported resolutions: 640px, 1k, 2k, 4k\n  - Available for tiers: creator, pro, business\n  - Image count allowed: 1, 4, 9, 16\n- `nano-banana-pro` - from 150 credits/image\n  - Supported resolutions: 1k, 2k, 4k\n  - Available for tiers: creator, pro, business\n  - Image count allowed: 1, 4, 9, 16\n- `qwen-image-2.1` - from 10 credits/image\n  - Supported resolutions: 640px, 1k, 2k\n  - Available for tiers: free, creator, pro, business\n  - Image count allowed: 1, 2, 3, 4\n- `seedream-v4` - from 40 credits/image\n  - Supported resolutions: 640px, 1k, 2k, 4k\n  - Available for tiers: creator, pro, business\n  - Image count allowed: 1, 2, 3, 4\n- `seedream-v5-pro` - from 75 credits/image\n  - Supported resolutions: 640px, 1k, 2k\n  - Available for tiers: creator, pro, business\n  - Image count allowed: 1, 2, 3, 4\n- `z-image-turbo` - from 5 credits/image\n  - Supported resolutions: 640px, 1k, 2k\n  - Available for tiers: free, creator, pro, business\n  - Image count allowed: 1, 2, 3, 4\n\n**Deprecated Enum Values:**\n- `seedream` - Use `seedream-v4` instead.\n",
                    "enum": [
                      "default",
                      "z-image-turbo",
                      "gpt-image-2",
                      "qwen-image-2.1",
                      "flux-2-klein",
                      "nano-banana-2",
                      "nano-banana-2.1",
                      "nano-banana-pro",
                      "krea-2",
                      "seedream-v5-pro",
                      "nano-banana-2-lite",
                      "gpt-image-2.5-flare",
                      "seedream-v4",
                      "nano-banana",
                      "flux-schnell",
                      "seedream"
                    ],
                    "example": "z-image-turbo",
                    "type": "string"
                  },
                  "name": {
                    "default": "Ai Image - dateTime",
                    "description": "Give your image a custom name for easy identification.",
                    "example": "My Ai Image image",
                    "type": "string"
                  },
                  "resolution": {
                    "default": "auto",
                    "description": "Maximum resolution (longest edge) for the output image.\n\n**Options:**\n- `640px` — up to 640px\n- `1k` — up to 1024px\n- `2k` — up to 2048px\n- `4k` — up to 4096px\n- `auto` — **Deprecated.** Mapped server-side from your subscription tier to the best matching resolution the model supports\n\n**Per-model support:**\n- `flux-2-klein` - 640px, 1k, 2k\n- `flux-schnell` - 640px, 1k, 2k\n- `gpt-image-2` - 640px, 1k, 2k, 4k\n- `gpt-image-2.5-flare` - 640px, 1k, 2k, 4k\n- `krea-2` - 640px, 1k\n- `nano-banana` - 640px, 1k\n- `nano-banana-2` - 640px, 1k, 2k, 4k\n- `nano-banana-2-lite` - 640px, 1k\n- `nano-banana-2.1` - 640px, 1k, 2k, 4k\n- `nano-banana-pro` - 1k, 2k, 4k\n- `qwen-image-2.1` - 640px, 1k, 2k\n- `seedream-v4` - 640px, 1k, 2k, 4k\n- `seedream-v5-pro` - 640px, 1k, 2k\n- `z-image-turbo` - 640px, 1k, 2k\n\nNote: Resolution availability depends on the model and your subscription tier.",
                    "enum": [
                      "auto",
                      "640px",
                      "1k",
                      "2k",
                      "4k"
                    ],
                    "example": "640px",
                    "type": "string"
                  },
                  "style": {
                    "description": "The art style to use for image generation.",
                    "properties": {
                      "prompt": {
                        "description": "The prompt used for the image(s).",
                        "example": "Cool image",
                        "minLength": 1,
                        "type": "string"
                      },
                      "tool": {
                        "default": "general",
                        "description": "The art style to use for image generation. Defaults to 'general' if not provided.",
                        "enum": [
                          "ai-anime-generator",
                          "ai-art-generator",
                          "ai-background-generator",
                          "ai-character-generator",
                          "ai-face-generator",
                          "ai-fashion-generator",
                          "ai-icon-generator",
                          "ai-illustration-generator",
                          "ai-interior-design-generator",
                          "ai-landscape-generator",
                          "ai-logo-generator",
                          "ai-manga-generator",
                          "ai-outfit-generator",
                          "ai-pattern-generator",
                          "ai-photo-generator",
                          "ai-sketch-generator",
                          "ai-tattoo-generator",
                          "album-cover-generator",
                          "animated-characters-generator",
                          "architecture-generator",
                          "book-cover-generator",
                          "comic-book-generator",
                          "dark-fantasy-ai",
                          "disney-ai-generator",
                          "dnd-ai-art-generator",
                          "emoji-generator",
                          "fantasy-map-generator",
                          "graffiti-generator",
                          "movie-poster-generator",
                          "optical-illusion-generator",
                          "pokemon-generator",
                          "south-park-character-generator",
                          "superhero-generator",
                          "thumbnail-maker",
                          "general"
                        ],
                        "example": "ai-anime-generator",
                        "type": "string"
                      }
                    },
                    "required": [
                      "prompt"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "image_count",
                  "style"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 5,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": false,
                "title": "Generate image"
              }
            },
            {
              "name": "upscale_image",
              "title": "Upscale image",
              "description": "Upscales a supplied image 2x or 4x. Cost depends on scale and mode (25-200 credits); returns a project id for wait_for_image_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for upscaling",
                    "properties": {
                      "image_file_path": {
                        "description": "The image to upscale. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n. The maximum input image size is 4096x4096px.",
                        "example": "api-assets/id/1234.png",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "image_file_path"
                    ],
                    "type": "object"
                  },
                  "name": {
                    "default": "Image Upscaler - dateTime",
                    "description": "Give your image a custom name for easy identification.",
                    "example": "My Image Upscaler image",
                    "type": "string"
                  },
                  "scale_factor": {
                    "description": "How much to scale the image. Must be either 2 or 4.\n            \nNote: 4x upscale is only available on Creator, Pro, or Business tier.",
                    "example": 2,
                    "type": "number"
                  },
                  "style": {
                    "default": {},
                    "description": "Style settings for the upscale. Use `mode` (`\"preserve\"`, `\"balanced\"`, or `\"creative\"`). Defaults to `\"balanced\"`.",
                    "example": {
                      "mode": "preserve"
                    },
                    "properties": {
                      "mode": {
                        "description": "The upscaling mode. `\"preserve\"` uses the fast pro pipeline (1× credit multiplier). `\"balanced\"` and `\"creative\"` use the creative pipeline (2× credit multiplier). `\"pro\"` is deprecated and maps to `\"preserve\"`. Defaults to `\"balanced\"`.",
                        "enum": [
                          "pro",
                          "preserve",
                          "balanced",
                          "creative"
                        ],
                        "example": "preserve",
                        "type": "string"
                      },
                      "prompt": {
                        "description": "A prompt to guide the final image. Only used when mode is `creative`.",
                        "example": "Enhance fine details and keep the image natural",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "scale_factor",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 25,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Upscale image"
              }
            },
            {
              "name": "create_meme",
              "title": "Create meme",
              "description": "Creates a meme from a topic and template selection. Costs 10 credits. Starts a background job; returns a project id for wait_for_image_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "name": {
                    "description": "The name of the meme.",
                    "example": "My Funny Meme",
                    "type": "string"
                  },
                  "style": {
                    "properties": {
                      "searchWeb": {
                        "default": false,
                        "description": "Whether to search the web for meme content.",
                        "example": false,
                        "type": "boolean"
                      },
                      "template": {
                        "description": "Select a random meme template.",
                        "enum": [
                          "Random"
                        ],
                        "type": "string"
                      },
                      "topic": {
                        "description": "The topic of the meme.",
                        "example": "When the code finally works",
                        "maxLength": 200,
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "topic",
                      "template"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "style"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 10,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Create meme"
              }
            },
            {
              "name": "create_qr_code",
              "title": "Create QR code",
              "description": "Creates a stylized QR code from supplied text or a URL and an art-style description. Currently costs 0 credits. Starts a background job; returns a project id for wait_for_image_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "content": {
                    "description": "The content of the QR code.",
                    "example": "https://magichour.ai",
                    "type": "string"
                  },
                  "name": {
                    "default": "Qr Code - dateTime",
                    "description": "Give your image a custom name for easy identification.",
                    "example": "My Qr Code image",
                    "type": "string"
                  },
                  "style": {
                    "properties": {
                      "art_style": {
                        "description": "To use our templates, pass in one of Watercolor, Cyberpunk City, Ink Landscape, Interior Painting, Japanese Street, Mech, Minecraft, Picasso Painting, Game Map, Spaceship, Chinese Painting, Winter Village, or pass any custom art style.",
                        "example": "Watercolor",
                        "type": "string"
                      }
                    },
                    "required": [
                      "art_style"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "content",
                  "style"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 0,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": false,
                "title": "Create QR code"
              }
            },
            {
              "name": "place_person_in_scene",
              "title": "Place person in scene",
              "description": "Use only with the user's own likeness or content they are authorized to use. Do not use for impersonation, deception, sexual content, or content involving minors.\n\nPlaces a person from one supplied photo into a supplied scene image. Cost depends on resolution (from 50 credits at 640px); returns a project id for wait_for_image_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Person image and scene image for body swap",
                    "properties": {
                      "person_file_path": {
                        "description": "Image of the person to place into the scene. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "minLength": 1,
                        "type": "string"
                      },
                      "scene_file_path": {
                        "description": "Original scene image (background). This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/5678.png",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "person_file_path",
                      "scene_file_path"
                    ],
                    "type": "object"
                  },
                  "name": {
                    "default": "Body Swap - dateTime",
                    "description": "Give your image a custom name for easy identification.",
                    "example": "My Body Swap image",
                    "type": "string"
                  },
                  "resolution": {
                    "description": "Output resolution. Determines credits charged for the run.",
                    "enum": [
                      "640px",
                      "1k",
                      "2k",
                      "4k"
                    ],
                    "example": "640px",
                    "type": "string"
                  }
                },
                "required": [
                  "resolution",
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 50,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Place person in scene"
              }
            },
            {
              "name": "swap_face_in_photo",
              "title": "Swap face in photo",
              "description": "Use only with the user's own likeness or content they are authorized to use. Do not use for impersonation, deception, sexual content, or content involving minors.\n\nSwaps faces in a supplied photo using a source face image or selected face mappings. Costs 10 credits; output size depends on subscription. Returns a project id for wait_for_image_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for face swap photo",
                    "example": {
                      "face_swap_mode": "all-faces",
                      "source_file_path": "api-assets/id/1234.png",
                      "target_file_path": "api-assets/id/1234.png"
                    },
                    "properties": {
                      "face_mappings": {
                        "description": "This is the array of face mappings used for multiple face swap. The value is required if `face_swap_mode` is `individual-faces`.",
                        "example": [
                          {
                            "new_face": "api-assets/id/1234.png",
                            "original_face": "api-assets/id/0-0.png"
                          }
                        ],
                        "items": {
                          "properties": {
                            "new_face": {
                              "description": "The face image that will be used to replace the face in the `original_face`. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                              "example": "api-assets/id/1234.png",
                              "type": "string"
                            },
                            "original_face": {
                              "description": "The face detected from the image in `target_file_path`. The file name is in the format of `\u003cface_frame\u003e-\u003cface_index\u003e.png`. This value is corresponds to the response in the [face detection API](https://docs.magichour.ai/api-reference/files/get-face-detection-details).\n\n* The face_frame is the frame number of the face in the target image. For images, the frame number is always 0.\n* The face_index is the index of the face in the target image, starting from 0 going left to right.",
                              "example": "api-assets/id/0-0.png",
                              "type": "string"
                            }
                          },
                          "required": [
                            "original_face",
                            "new_face"
                          ],
                          "type": "object"
                        },
                        "maxItems": 5,
                        "type": "array"
                      },
                      "face_swap_mode": {
                        "default": "all-faces",
                        "description": "Choose which faces to swap. `all-faces` uses one source image for all detected faces (`source_file_path` required). `individual-faces` uses exact `face_mappings`.",
                        "enum": [
                          "all-faces",
                          "individual-faces"
                        ],
                        "example": "all-faces",
                        "type": "string"
                      },
                      "source_file_path": {
                        "description": "This is the image from which the face is extracted. The value is required if `face_swap_mode` is `all-faces`.\n\nThis value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "minLength": 1,
                        "type": "string"
                      },
                      "target_file_path": {
                        "description": "This is the image where the face from the source image will be placed. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "target_file_path"
                    ],
                    "type": "object"
                  },
                  "name": {
                    "default": "Face Swap - dateTime",
                    "description": "Give your image a custom name for easy identification.",
                    "example": "My Face Swap image",
                    "type": "string"
                  }
                },
                "required": [
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 10,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Swap face in photo"
              }
            },
            {
              "name": "swap_head_in_photo",
              "title": "Swap head in photo",
              "description": "Use only with the user's own likeness or content they are authorized to use. Do not use for impersonation, deception, sexual content, or content involving minors.\n\nSwaps a head from a supplied image onto a supplied body image. Costs 10 credits; returns a project id for wait_for_image_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the body and head images for head swap",
                    "properties": {
                      "body_file_path": {
                        "description": "Image that receives the swapped head. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "minLength": 1,
                        "type": "string"
                      },
                      "head_file_path": {
                        "description": "Image of the head to place on the body. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/5678.png",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "body_file_path",
                      "head_file_path"
                    ],
                    "type": "object"
                  },
                  "max_resolution": {
                    "description": "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 maximum.",
                    "example": 1024,
                    "type": "integer"
                  },
                  "name": {
                    "default": "Head Swap - dateTime",
                    "description": "Give your image a custom name for easy identification.",
                    "example": "My Head Swap image",
                    "type": "string"
                  }
                },
                "required": [
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 10,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Swap head in photo"
              }
            },
            {
              "name": "remove_image_background",
              "title": "Remove image background",
              "description": "Removes an image's background, optionally replacing it with another supplied image. Costs 5 credits. Starts a background job; returns a project id for wait_for_image_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for background removal",
                    "properties": {
                      "background_image_file_path": {
                        "description": "The image used as the new background for the image_file_path. This image will be resized to match the image in image_file_path. Please make sure the resolution between the images are similar.\n\nThis value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "type": "string"
                      },
                      "image_file_path": {
                        "description": "The image to remove the background. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "type": "string"
                      }
                    },
                    "required": [
                      "image_file_path"
                    ],
                    "type": "object"
                  },
                  "name": {
                    "default": "Background Remover - dateTime",
                    "description": "Give your image a custom name for easy identification.",
                    "example": "My Background Remover image",
                    "type": "string"
                  }
                },
                "required": [
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 5,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Remove image background"
              }
            },
            {
              "name": "colorize_photo",
              "title": "Colorize photo",
              "description": "Colorizes a black-and-white or faded photo. Costs 10 credits; returns a project id for wait_for_image_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "assets": {
                    "description": "Provide the assets for photo colorization",
                    "properties": {
                      "image_file_path": {
                        "description": "The image used to generate the colorized image. This value is either\n- a direct URL to the file. The URL path must end in a supported file extension.\n- `file_path` field from the response of the [upload urls API](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls).\n\nSee the [file upload guide](https://docs.magichour.ai/api-reference/files/generate-asset-upload-urls#input-file) for details.\n",
                        "example": "api-assets/id/1234.png",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "image_file_path"
                    ],
                    "type": "object"
                  },
                  "name": {
                    "default": "Photo Colorizer - dateTime",
                    "description": "Give your image a custom name for easy identification.",
                    "example": "My Photo Colorizer image",
                    "type": "string"
                  }
                },
                "required": [
                  "assets"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the image. We charge credits right when the request is made. \n\nIf an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.",
                    "example": 10,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": true,
                "readOnlyHint": false,
                "title": "Colorize photo"
              }
            },
            {
              "name": "get_audio_project",
              "title": "Get audio project",
              "description": "Returns an audio project's status and, once complete, its download URLs. Use to check progress with the id from an audio create tool. Read-only.",
              "inputSchema": {
                "properties": {
                  "id": {
                    "description": "Unique ID of the audio project. This value is returned by all of the POST APIs that create an audio.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "created_at": {
                    "format": "date-time",
                    "type": "string"
                  },
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the audio. We charge credits right when the request is made. \n\nIf an error occurred while generating the audio, credits will be refunded and this field will be updated to include the refund.",
                    "example": 2,
                    "type": "integer"
                  },
                  "downloads": {
                    "items": {
                      "description": "The download url and expiration date of the audio project",
                      "properties": {
                        "expires_at": {
                          "example": "2024-10-19T05:16:19.027Z",
                          "format": "date-time",
                          "type": "string"
                        },
                        "url": {
                          "example": "https://videos.magichour.ai/id/output.wav",
                          "format": "uri",
                          "type": "string"
                        }
                      },
                      "required": [
                        "url",
                        "expires_at"
                      ],
                      "type": "object"
                    },
                    "type": "array"
                  },
                  "enabled": {
                    "description": "Whether this resource is active. If false, it is deleted.",
                    "type": "boolean"
                  },
                  "error": {
                    "description": "In the case of an error, this object will contain the error encountered during video render",
                    "properties": {
                      "code": {
                        "description": "An error code to indicate why a failure happened.",
                        "example": "no_source_face",
                        "type": "string"
                      },
                      "message": {
                        "description": "Details on the reason why a failure happened.",
                        "example": "Please use an image with a detectable face",
                        "type": "string"
                      }
                    },
                    "required": [
                      "message",
                      "code"
                    ],
                    "type": [
                      "object",
                      "null"
                    ]
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  },
                  "name": {
                    "description": "The name of the audio.",
                    "example": "Example Name",
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "status": {
                    "description": "The status of the audio.\n\n- `draft` - the project was created but has not been submitted for rendering\n- `queued` - the job is waiting for an available server\n- `rendering` - the job is being processed; the `audio.started` webhook event fires when rendering begins\n- `complete` - the job finished successfully; fires `audio.completed`\n- `error` - the job failed during processing; fires `audio.errored`\n- `canceled` - the job was manually canceled (for example from the Magic Hour web app)\n\n**Note:** `rendering`, `complete`, and `error` have matching webhook events; `canceled` does not - a canceled job emits no webhook event, so poll this endpoint to detect cancellation.",
                    "enum": [
                      "draft",
                      "queued",
                      "rendering",
                      "complete",
                      "error",
                      "canceled"
                    ],
                    "example": "complete",
                    "type": "string"
                  },
                  "type": {
                    "description": "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",
                    "example": "VOICE_GENERATOR",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "name",
                  "status",
                  "type",
                  "created_at",
                  "enabled",
                  "credits_charged",
                  "downloads",
                  "error"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": true,
                "title": "Get audio project"
              }
            },
            {
              "name": "delete_audio_project",
              "title": "Delete audio project",
              "description": "Deletes the audio project and attempts to delete its completed output. Cannot be undone; confirm with the user first.",
              "inputSchema": {
                "properties": {
                  "id": {
                    "description": "Unique ID of the audio project. This value is returned by all of the POST APIs that create an audio.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": true,
                "openWorldHint": false,
                "readOnlyHint": false,
                "title": "Delete audio project"
              }
            },
            {
              "name": "generate_music",
              "title": "Generate music",
              "description": "Generates music from a description, with optional custom lyrics or instrumental-only output. Costs 1 credit per requested second; returns a project id for wait_for_audio_project. Before choosing settings, read get_account_info and the current parameter constraints. A listed model, resolution, duration or count is not necessarily available together or on this account. Preserve explicit requirements and all supplied inputs; explain a genuine block instead of submitting an incompatible request. Account balance alone does not prove a request is affordable.",
              "inputSchema": {
                "properties": {
                  "duration": {
                    "description": "Requested track duration in seconds, from 15 to 300. Determines credits charged.",
                    "example": 120,
                    "maximum": 300,
                    "minimum": 15,
                    "type": "integer"
                  },
                  "name": {
                    "default": "AI Music Generator",
                    "description": "Give your audio a custom name for easy identification.",
                    "example": "My Music Generator audio",
                    "type": "string"
                  },
                  "style": {
                    "additionalProperties": false,
                    "properties": {
                      "instrumental": {
                        "default": false,
                        "description": "Generate music without vocals. When true, lyrics is ignored.",
                        "example": false,
                        "type": "boolean"
                      },
                      "lyrics": {
                        "description": "Custom lyrics. Omit or leave blank for AI-generated lyrics when instrumental is false.",
                        "example": "City lights are fading...",
                        "type": "string"
                      },
                      "prompt": {
                        "description": "Describe the song, including genre, mood, and instruments.",
                        "example": "Dreamy synthwave with warm bass and soft vocals",
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "prompt"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "duration",
                  "style"
                ],
                "type": "object"
              },
              "outputSchema": {
                "description": "Success",
                "properties": {
                  "credits_charged": {
                    "description": "The amount of credits deducted from your account to generate the audio. We charge credits right when the request is made. \n\nIf an error occurred while generating the audio, credits will be refunded and this field will be updated to include the refund.",
                    "example": 120,
                    "type": "integer"
                  },
                  "id": {
                    "description": "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.",
                    "example": "cuid-example",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "credits_charged"
                ],
                "type": "object"
              },
              "annotations": {
                "destructiveHint": false,
                "openWorldHint": false,
                "readOnlyHint": false,
                "title": "Generate music"
              }
            }
          ],
          "schemaTokens": 42254,
          "changedAt": "2026-11-08T01:59:41.284011643Z",
          "check": {
            "checker": "anchor-check/1.0",
            "totalTokens": 42254,
            "counts": {
              "error": 0,
              "note": 1,
              "warn": 52
            },
            "findings": [
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "create_gif_or_short_video",
                "message": "1 parameter without a description: style",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "create_meme",
                "message": "1 parameter without a description: style",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "create_qr_code",
                "message": "1 parameter without a description: style",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "create_spoken_ad_video",
                "message": "1 parameter without a description: assets",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "create_video_from_text",
                "message": "1 parameter without a description: style",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "edit_image",
                "message": "1 parameter without a description: style",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "edit_video",
                "message": "1 parameter without a description: style",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "fetch_audio_download",
                "message": "none of its 2 parameters has a description",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "fetch_image_download",
                "message": "none of its 2 parameters has a description",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "fetch_video_download",
                "message": "none of its 2 parameters has a description",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "generate_headshot",
                "message": "1 parameter without a description: style",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "generate_music",
                "message": "1 parameter without a description: style",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "get_workflow_guide",
                "message": "its one parameter, workflow, has no description",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "restyle_video",
                "message": "2 parameters without a description: style, style.art_style",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "upload_chatgpt_media",
                "message": "none of its 2 parameters has a description",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "wait_for_audio_project",
                "message": "none of its 6 parameters has a description",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "wait_for_image_project",
                "message": "none of its 6 parameters has a description",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC11",
                "severity": "warn",
                "tool": "wait_for_video_project",
                "message": "none of its 5 parameters has a description",
                "fix": "Describe each one: format, units, an example, and what happens when it's left out."
              },
              {
                "rule": "TC14",
                "severity": "warn",
                "tool": "create_animation",
                "message": "allowed values are in the description, not an enum: assets.audio_file_path",
                "fix": "Move them into enum."
              },
              {
                "rule": "TC14",
                "severity": "warn",
                "tool": "create_lip_sync_video",
                "message": "allowed values are in the description, not an enum: assets.video_file_path",
                "fix": "Move them into enum."
              },
              {
                "rule": "TC14",
                "severity": "warn",
                "tool": "create_video_from_image",
                "message": "allowed values are in the description, not an enum: assets.end_image_file_path",
                "fix": "Move them into enum."
              },
              {
                "rule": "TC14",
                "severity": "warn",
                "tool": "restyle_video",
                "message": "allowed values are in the description, not an enum: assets.video_file_path",
                "fix": "Move them into enum."
              },
              {
                "rule": "TC14",
                "severity": "warn",
                "tool": "swap_face_in_photo",
                "message": "allowed values are in the description, not an enum: assets.face_mappings[].new_face, assets.source_file_path",
                "fix": "Move them into enum."
              },
              {
                "rule": "TC14",
                "severity": "warn",
                "tool": "swap_face_in_video",
                "message": "allowed values are in the description, not an enum: assets.face_mappings[].new_face, assets.image_file_path, assets.video_file_path",
                "fix": "Move them into enum."
              },
              {
                "rule": "TC18",
                "severity": "warn",
                "tool": "remove_image_background",
                "message": "destructiveHint is false but the name says \"remove\"",
                "fix": "If it deletes, overwrites or moves money, destructiveHint should be true."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "create_meme",
                "message": "described almost the same as remove_image_background (83% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "create_video_from_audio",
                "message": "described almost the same as create_video_from_text (83% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "create_video_from_image",
                "message": "described almost the same as remove_image_background (80% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "delete_image_project",
                "message": "described almost the same as delete_audio_project (85% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "delete_video_project",
                "message": "described almost the same as delete_image_project (85% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "delete_video_project",
                "message": "described almost the same as delete_audio_project (85% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "fetch_audio_download",
                "message": "described almost the same as fetch_video_download (82% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "fetch_image_download",
                "message": "described almost the same as fetch_audio_download (94% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "fetch_image_download",
                "message": "described almost the same as fetch_video_download (82% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "get_image_project",
                "message": "described almost the same as get_audio_project (86% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "get_video_project",
                "message": "described almost the same as get_image_project (86% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "get_video_project",
                "message": "described almost the same as get_audio_project (86% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "replace_character_in_video",
                "message": "described almost the same as swap_face_in_video (82% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "replace_character_in_video",
                "message": "described almost the same as change_clothes_in_photo (82% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "replace_character_in_video",
                "message": "described almost the same as swap_head_in_photo (81% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "swap_face_in_photo",
                "message": "described almost the same as swap_head_in_photo (80% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "swap_face_in_video",
                "message": "described almost the same as change_clothes_in_photo (83% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "swap_face_in_video",
                "message": "described almost the same as swap_head_in_photo (80% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC21",
                "severity": "warn",
                "tool": "wait_for_image_project",
                "message": "described almost the same as wait_for_audio_project (94% of the same words)",
                "fix": "Say in each description when to use it instead of the other."
              },
              {
                "rule": "TC22",
                "severity": "warn",
                "tool": "create_animation",
                "message": "the definition is about 1,860 tokens",
                "fix": "Trim the description and parameter docs, or split the tool."
              },
              {
                "rule": "TC22",
                "severity": "warn",
                "tool": "create_video_from_image",
                "message": "the definition is about 1,920 tokens",
                "fix": "Trim the description and parameter docs, or split the tool."
              },
              {
                "rule": "TC22",
                "severity": "warn",
                "tool": "create_video_from_text",
                "message": "the definition is about 2,064 tokens",
                "fix": "Trim the description and parameter docs, or split the tool."
              },
              {
                "rule": "TC22",
                "severity": "warn",
                "tool": "edit_image",
                "message": "the definition is about 1,807 tokens",
                "fix": "Trim the description and parameter docs, or split the tool."
              },
              {
                "rule": "TC22",
                "severity": "warn",
                "tool": "generate_image",
                "message": "the definition is about 1,830 tokens",
                "fix": "Trim the description and parameter docs, or split the tool."
              },
              {
                "rule": "TC22",
                "severity": "warn",
                "tool": "replace_character_in_video",
                "message": "the definition is about 1,632 tokens",
                "fix": "Trim the description and parameter docs, or split the tool."
              },
              {
                "rule": "TC22",
                "severity": "warn",
                "tool": "swap_face_in_video",
                "message": "the definition is about 1,508 tokens",
                "fix": "Trim the description and parameter docs, or split the tool."
              },
              {
                "rule": "TC23",
                "severity": "warn",
                "message": "50 tools, about 40,540 tokens of definitions",
                "fix": "Split the server by job, or offer a smaller default toolset (a read-only set, or a search-then-call pattern)."
              },
              {
                "rule": "TC24",
                "severity": "note",
                "message": "9 of 50 tools have no outputSchema",
                "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
              }
            ]
          }
        },
        "updatedAt": "2026-11-09T01:53:11.435821114Z"
      },
      "streak": {
        "days": 2,
        "from": "2026-11-07",
        "sinceWatching": true,
        "best": 2
      }
    },
    "answer": "sync. labs MCP server and Magic Hour MCP score within a point of each other on agent readiness, 51.5 (D) and 50.7 (D). Magic Hour MCP leads on security \u0026 auth and transparency \u0026 trust.",
    "b": {
      "slug": "sync-labs-mcp",
      "name": "sync. labs MCP server",
      "vendor": "Synchronicity Labs (sync.)",
      "vendorUrl": "https://sync.so",
      "kind": "mcp",
      "category": "video-generation",
      "summary": "sync. labs' open-source MCP server lets an agent lip-sync video to new audio or a script, dub it into other languages with matching lips, and manage generations, hosted with OAuth for web clients or run locally with an API key.",
      "url": "https://www.anchorterminal.com/tools/sync-labs-mcp",
      "markdownUrl": "https://www.anchorterminal.com/tools/sync-labs-mcp.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/sync-labs-mcp.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/sync-labs-mcp.json",
      "dns": "sync-labs-mcp.grade.anchorterminal.com",
      "repo": "https://github.com/synchronicity-labs/mcp-server",
      "license": "MIT",
      "transports": [
        "streamable-http"
      ],
      "remoteUrl": "https://mcp.sync.so/mcp",
      "packages": [],
      "auth": "mixed",
      "authNotes": "OAuth for Claude Web and ChatGPT, tied to the active sync. organisation. Local and editor setups run @sync.so/mcp-server with a SYNC_API_KEY.",
      "pricing": "paid",
      "pricingNotes": "Plans from $5 a month (hobbyist) to $49 and up, plus usage per second of video (for example $5 a month plus $0.05 a second); dubbing audio $0.10 a second, text-to-speech $0.004 a second. A free try for videos up to a minute (checked 2026-11-07).",
      "priceSummary": "Paid",
      "where": "hosted",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 on the MCP docs or pricing page (checked 2026-11-07).",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": null,
        "npmWeekly": null,
        "pypiWeekly": null,
        "asOf": "2026-11-07"
      },
      "docsUrl": "https://sync.so/docs/plugins-and-extensions/mcp-server",
      "llmsTxt": "https://sync.so/llms.txt",
      "registryName": "io.github.synchronicity-labs/mcp-server",
      "capabilities": [
        "video.edit",
        "video.audio",
        "translation.dubbing"
      ],
      "tags": [
        "official",
        "hosted",
        "mcp",
        "remote-mcp",
        "oauth",
        "api-key",
        "paid",
        "status-page",
        "open-source",
        "llms-txt",
        "mcp-registry"
      ],
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 51.5,
        "grade": "D",
        "agentReady": false,
        "rank": 1027,
        "ranked": true,
        "rankOf": 1513,
        "categoryRank": 10,
        "methodology": "0.7",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 55,
          "maintenance": 75,
          "payments": 30,
          "reliability": 43,
          "schema": 81,
          "security": 38,
          "transparency": 44
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-11-07"
        },
        "negative": 0,
        "verdict": "sync. labs' MCP server is open source, generated from its API spec with workflow tools on top, and released often, with clear per-second prices for lip sync and dubbing. Security and data handling are thinly documented, and there's no read-only mode.",
        "bestFor": "Agents that lip-sync or dub video into other languages.",
        "strengths": [
          "Open source under MIT, with tests and CI",
          "Tools generated from the public API spec, so they track the API",
          "Per-second prices published",
          "OAuth for web clients, API key locally",
          "Frequent tagged releases"
        ],
        "weaknesses": [
          "No read-only mode",
          "Data handling and security programme not documented in the pages read",
          "Only a short free try"
        ],
        "agentNotes": [
          "Get an estimate before long generations",
          "Dub or lip-sync only voices and faces the user has the right to use",
          "Check the active organisation before connecting with OAuth"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "D",
            "methodology": "0.7",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 51.5
          }
        ],
        "editorialScores": {
          "ergonomics": 55,
          "maintenance": 75,
          "payments": 30,
          "reliability": 43,
          "schema": 81,
          "security": 38,
          "transparency": 40
        },
        "provenanceScore": 48,
        "checked": {
          "categories": {
            "ergonomics": "2026-11-07",
            "maintenance": "2026-11-07",
            "payments": "2026-11-07",
            "reliability": "2026-11-07",
            "schema": "2026-11-07",
            "security": "2026-11-07",
            "transparency": "2026-11-07"
          },
          "last": "2026-11-07",
          "oldest": "2026-11-07",
          "stale": false,
          "staleAfterDays": 90
        }
      },
      "connect": {
        "claudeCode": "claude mcp add sync-labs --transport http https://mcp.sync.so/mcp",
        "config": {
          "mcpServers": {
            "sync-labs": {
              "url": "https://mcp.sync.so/mcp"
            }
          }
        }
      },
      "letme": {
        "capability": "https://letme.dev/video.edit",
        "tool": "https://letme.dev/sync-labs-mcp"
      },
      "area": "content",
      "unitPrices": [
        {
          "item": "Lip sync video (hobbyist)",
          "unit": "video-second",
          "usd": 0.05,
          "note": "Plus $5 a month plan"
        },
        {
          "item": "Dubbing audio",
          "unit": "video-second",
          "usd": 0.1
        }
      ],
      "provenance": {
        "legalEntity": "Synchronicity Labs",
        "domain": "sync.so",
        "domainRegistered": "",
        "domainNote": "Not looked up: RDAP isn't requested under the 1 November 2026 rules.",
        "endpointOnVendorDomain": true,
        "terms": "",
        "privacy": "",
        "statusPage": "https://status.sync.so",
        "changelog": "",
        "securityTxt": "none",
        "checked": "2026-11-07",
        "notes": [
          "The repository is MIT. Terms and privacy weren't read."
        ],
        "score": 48
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/sync-labs-mcp.json",
      "live": {
        "slug": "sync-labs-mcp",
        "probe": {
          "target": "https://mcp.sync.so/mcp",
          "method": "mcp-initialize",
          "lastAt": "2026-11-09T01:53:27.625626708Z",
          "lastOk": true,
          "lastStatus": 401,
          "lastMs": 336,
          "lastNote": "asks for credentials",
          "authRequired": true,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 347,
          "p95ms24h": 413,
          "samples24h": 244,
          "samples30d": 316,
          "days": [
            {
              "date": "2026-11-07",
              "probes": 53,
              "ok": 53
            },
            {
              "date": "2026-11-08",
              "probes": 243,
              "ok": 243
            },
            {
              "date": "2026-11-09",
              "probes": 20,
              "ok": 20
            }
          ],
          "since": "2026-11-07T00:00:00Z"
        },
        "vendorStatus": {
          "page": "https://status.sync.so",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-11-08T17:50:28.402438199Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "synchronicity-labs/mcp-server",
            "version": "v0.2.4",
            "released": "2026-11-06",
            "seenAt": "2026-11-08T01:42:21.359553936Z"
          },
          {
            "registry": "mcp-registry",
            "name": "io.github.synchronicity-labs/mcp-server",
            "version": "0.2.4",
            "seenAt": "2026-11-08T18:37:59.431193162Z"
          }
        ],
        "githubStars": 1,
        "securityTxt": {
          "url": "https://sync.so/.well-known/security.txt",
          "state": "none",
          "checkedAt": "2026-11-08T16:04:33.794951985Z"
        },
        "llmsTxt": {
          "url": "https://sync.so/llms.txt",
          "ok": true,
          "status": 200,
          "checkedAt": "2026-11-08T15:37:34.91534668Z"
        },
        "domain": {
          "domain": "sync.so",
          "checkedAt": "2026-11-08T14:55:05.227601203Z"
        },
        "mcpTools": {
          "url": "https://mcp.sync.so/mcp",
          "checkedAt": "2026-11-08T02:02:03.960904151Z",
          "status": "auth",
          "note": "asks for credentials before listing its tools",
          "changedAt": "2026-11-08T02:02:03.960904151Z"
        },
        "updatedAt": "2026-11-09T01:53:27.625626708Z"
      },
      "streak": {
        "days": 2,
        "from": "2026-11-07",
        "sinceWatching": true,
        "best": 2
      }
    },
    "edges": [
      {
        "by": 15,
        "category": "payments",
        "leads": "sync-labs-mcp",
        "name": "Payments \u0026 pricing",
        "reasons": {
          "a": "No machine payment protocol (0). Plan and credit-pack prices public, per-tool credit costs not read (10). 400 sign-up credits with no card, but API access sits on paid plans (5 of 20). A person signs up for a key in a browser (0). Tool discovery is open, but calls need a key (0). 0 + 10 + 5 + 0 = 15.",
          "b": "No machine payment protocol (0). Per-second prices published (20). A free try for short videos (10 of 20). A person signs up (0). 0 + 20 + 10 + 0 = 30."
        },
        "scores": {
          "a": 15,
          "b": 30
        }
      },
      {
        "by": 14,
        "category": "transparency",
        "leads": "magic-hour-mcp",
        "name": "Transparency \u0026 trust",
        "reasons": {
          "a": "Closed service under terms naming Magic Hour AI, Inc., revised 3 October 2026 (15). The privacy policy says prompts, uploads and outputs aren't sold or used to train models, for free and paid accounts, and MCP requests are handled the same way; retention periods aren't given (20 of 30). No deprecation policy found (5 of 20). Subprocessors not read (10 of 20, model providers named in tool docs). 15 + 20 + 5 + 10 = 50.",
          "b": "MIT open source (30). Data handling not read (5 of 30). No deprecation policy; earlier tool names documented as superseded (5 of 20). Subprocessors not found (0). 30 + 5 + 5 + 0 = 40."
        },
        "scores": {
          "a": 58,
          "b": 44
        }
      },
      {
        "by": 8,
        "category": "reliability",
        "leads": "sync-labs-mcp",
        "name": "Reliability",
        "reasons": {
          "a": "Status page at status.magichour.ai, all services online, with maintenance and previous incidents sections; no MCP component read (15). Incident history not read (5). No API rate limits found (0). No retry guidance found; wait_for_* tools poll long jobs (5 of 15). No SLA found (0). Not labelled beta (10). 15 + 5 + 0 + 5 + 0 + 10 = 35.",
          "b": "Status page at status.sync.so with maintenance and previous incidents (20). History not read (5). No MCP limits found (0). The source has abort-signal handling and recovery guidance for long jobs (8 of 15). No SLA found (0). Version 0.2.4, not labelled beta (10). 20 + 5 + 0 + 8 + 0 + 10 = 43."
        },
        "scores": {
          "a": 35,
          "b": 43
        }
      },
      {
        "by": 7,
        "category": "security",
        "leads": "magic-hour-mcp",
        "name": "Security \u0026 auth",
        "reasons": {
          "a": "API keys as Bearer tokens or OAuth through the Claude and ChatGPT connectors (20 of 30). Destructive deletes are annotated; no read-only key (8 of 20). Tools return generated media, not third-party text (10). No audit log found (0). No security.txt or certifications found; face and voice tools come with policy limits in the terms (7 of 20). 20 + 8 + 10 + 0 + 7 = 45.",
          "b": "OAuth per organisation, or an API key in the environment (22 of 30). No read-only mode (3 of 20). Media in and out, no third-party text (10). No audit log found (0). No security programme found (3 of 20). 22 + 3 + 10 + 0 + 3 = 38."
        },
        "scores": {
          "a": 45,
          "b": 38
        }
      }
    ],
    "facts": [
      {
        "a": "MCP server",
        "b": "MCP server",
        "name": "Kind"
      },
      {
        "a": "Magic Hour AI, Inc.",
        "b": "Synchronicity Labs (sync.)",
        "name": "Vendor"
      },
      {
        "a": "https://mcp.magichour.ai/",
        "b": "https://mcp.sync.so/mcp",
        "name": "Hosted endpoint"
      },
      {
        "a": "Streamable HTTP",
        "b": "Streamable HTTP",
        "name": "Transports"
      },
      {
        "a": "OAuth or key",
        "b": "OAuth or key",
        "name": "Auth"
      },
      {
        "a": "Freemium",
        "b": "Paid",
        "name": "Pricing"
      },
      {
        "a": "no",
        "b": "no",
        "name": "x402"
      },
      {
        "a": "none",
        "b": "MIT",
        "name": "Licence"
      },
      {
        "a": "50",
        "b": "none",
        "name": "Tools exposed"
      },
      {
        "a": "no",
        "b": "no",
        "name": "Read-only variant documented"
      },
      {
        "a": "yes",
        "b": "yes",
        "name": "llms.txt"
      },
      {
        "a": "io.github.magichourhq/magic-hour",
        "b": "io.github.synchronicity-labs/mcp-server",
        "name": "MCP registry"
      },
      {
        "a": "not read yet",
        "b": "no document linked",
        "name": "Terms last updated"
      },
      {
        "a": "not read yet",
        "b": "no document linked",
        "name": "Privacy policy last updated"
      }
    ],
    "faq": [
      {
        "answer": "sync. labs MCP server and Magic Hour MCP score within a point of each other on agent readiness, 51.5 (D) and 50.7 (D). Magic Hour MCP leads on security \u0026 auth and transparency \u0026 trust.",
        "question": "Which is better for AI agents, Magic Hour MCP or sync. labs MCP server?"
      },
      {
        "answer": "Both take an API key or an OAuth sign-in.",
        "question": "Do Magic Hour MCP and sync. labs MCP server need an API key?"
      },
      {
        "answer": "Yes. Magic Hour MCP has a hosted endpoint at https://mcp.magichour.ai/ and sync. labs MCP server at https://mcp.sync.so/mcp.",
        "question": "Can an agent call Magic Hour MCP and sync. labs MCP server without installing anything?"
      },
      {
        "answer": "No open-source release is listed for Magic Hour MCP. sync. labs MCP server is open source (MIT).",
        "question": "Are Magic Hour MCP and sync. labs MCP server open source?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": [
          "Security \u0026 auth, 45 against 38",
          "Transparency \u0026 trust, 58 against 44"
        ],
        "also": null,
        "goodFor": "Agents making short-form video and images, from talking photos and ads to lip-synced translations, on a credit plan.",
        "slug": "magic-hour-mcp",
        "watchFor": "About 160 KB of tool definitions"
      },
      {
        "aheadOn": [
          "Reliability, 43 against 35",
          "Payments \u0026 pricing, 30 against 15"
        ],
        "also": [
          "Open source"
        ],
        "goodFor": "Agents that lip-sync or dub video into other languages.",
        "slug": "sync-labs-mcp",
        "watchFor": "No read-only mode"
      }
    ],
    "history": null,
    "job": {
      "capability": "video.edit",
      "name": "Video edit"
    },
    "others": [
      {
        "json": "https://www.anchorterminal.com/compare/alibaba-wan-vs-magic-hour-mcp.json",
        "title": "Alibaba Wan (Model Studio) vs Magic Hour MCP",
        "url": "https://www.anchorterminal.com/compare/alibaba-wan-vs-magic-hour-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/fal-video-vs-magic-hour-mcp.json",
        "title": "fal video models vs Magic Hour MCP",
        "url": "https://www.anchorterminal.com/compare/fal-video-vs-magic-hour-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/framefields-vs-magic-hour-mcp.json",
        "title": "framefields vs Magic Hour MCP",
        "url": "https://www.anchorterminal.com/compare/framefields-vs-magic-hour-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/google-veo-vs-magic-hour-mcp.json",
        "title": "Google Veo vs Magic Hour MCP",
        "url": "https://www.anchorterminal.com/compare/google-veo-vs-magic-hour-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/higgsfield-vs-magic-hour-mcp.json",
        "title": "Higgsfield API vs Magic Hour MCP",
        "url": "https://www.anchorterminal.com/compare/higgsfield-vs-magic-hour-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/hyperframes-vs-magic-hour-mcp.json",
        "title": "HyperFrames vs Magic Hour MCP",
        "url": "https://www.anchorterminal.com/compare/hyperframes-vs-magic-hour-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/kling-vs-magic-hour-mcp.json",
        "title": "Kling AI API vs Magic Hour MCP",
        "url": "https://www.anchorterminal.com/compare/kling-vs-magic-hour-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/luma-vs-magic-hour-mcp.json",
        "title": "Luma AI API vs Magic Hour MCP",
        "url": "https://www.anchorterminal.com/compare/luma-vs-magic-hour-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-minimax-video.json",
        "title": "Magic Hour MCP vs MiniMax Video API",
        "url": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-minimax-video"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-openai-sora.json",
        "title": "Magic Hour MCP vs OpenAI Sora API",
        "url": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-openai-sora"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-pika.json",
        "title": "Magic Hour MCP vs Pika API",
        "url": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-pika"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-pixverse.json",
        "title": "Magic Hour MCP vs PixVerse API",
        "url": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-pixverse"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-popcraft-mcp.json",
        "title": "Magic Hour MCP vs Popcraft MCP",
        "url": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-popcraft-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-replicate-video.json",
        "title": "Magic Hour MCP vs Replicate video models",
        "url": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-replicate-video"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-runway.json",
        "title": "Magic Hour MCP vs Runway API",
        "url": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-runway"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-seedance-on-byteplus-modelark.json",
        "title": "Magic Hour MCP vs Seedance on BytePlus ModelArk",
        "url": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-seedance-on-byteplus-modelark"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-vidu.json",
        "title": "Magic Hour MCP vs Vidu API",
        "url": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-vidu"
      },
      {
        "json": "https://www.anchorterminal.com/compare/alibaba-wan-vs-sync-labs-mcp.json",
        "title": "Alibaba Wan (Model Studio) vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/alibaba-wan-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/clueso-video-vs-magic-hour-mcp.json",
        "title": "Clueso vs Magic Hour MCP",
        "url": "https://www.anchorterminal.com/compare/clueso-video-vs-magic-hour-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/clueso-video-vs-sync-labs-mcp.json",
        "title": "Clueso vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/clueso-video-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/fal-video-vs-sync-labs-mcp.json",
        "title": "fal video models vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/fal-video-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/framefields-vs-sync-labs-mcp.json",
        "title": "framefields vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/framefields-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/higgsfield-vs-sync-labs-mcp.json",
        "title": "Higgsfield API vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/higgsfield-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/kling-vs-sync-labs-mcp.json",
        "title": "Kling AI API vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/kling-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/luma-vs-sync-labs-mcp.json",
        "title": "Luma AI API vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/luma-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/minimax-video-vs-sync-labs-mcp.json",
        "title": "MiniMax Video API vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/minimax-video-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/pika-vs-sync-labs-mcp.json",
        "title": "Pika API vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/pika-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/pixverse-vs-sync-labs-mcp.json",
        "title": "PixVerse API vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/pixverse-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/replicate-video-vs-sync-labs-mcp.json",
        "title": "Replicate video models vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/replicate-video-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/runway-vs-sync-labs-mcp.json",
        "title": "Runway API vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/runway-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/seedance-on-byteplus-modelark-vs-sync-labs-mcp.json",
        "title": "Seedance on BytePlus ModelArk vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/seedance-on-byteplus-modelark-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/google-veo-vs-sync-labs-mcp.json",
        "title": "Google Veo vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/google-veo-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/openai-sora-vs-sync-labs-mcp.json",
        "title": "OpenAI Sora API vs sync. labs MCP server",
        "url": "https://www.anchorterminal.com/compare/openai-sora-vs-sync-labs-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/sync-labs-mcp-vs-vidu.json",
        "title": "sync. labs MCP server vs Vidu API",
        "url": "https://www.anchorterminal.com/compare/sync-labs-mcp-vs-vidu"
      }
    ],
    "panel": null,
    "scores": [
      {
        "by": 8,
        "edge": "sync-labs-mcp",
        "key": "reliability",
        "magic-hour-mcp": 35,
        "name": "Reliability",
        "sync-labs-mcp": 43,
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 1,
        "edge": "magic-hour-mcp",
        "key": "schema",
        "magic-hour-mcp": 82,
        "name": "Schema \u0026 documentation",
        "sync-labs-mcp": 81,
        "weight": 13
      },
      {
        "by": 0,
        "edge": "",
        "key": "ergonomics",
        "magic-hour-mcp": 55,
        "name": "Agent ergonomics",
        "sync-labs-mcp": 55,
        "weight": 13
      },
      {
        "by": 7,
        "edge": "magic-hour-mcp",
        "key": "security",
        "magic-hour-mcp": 45,
        "name": "Security \u0026 auth",
        "sync-labs-mcp": 38,
        "weight": 14
      },
      {
        "by": 15,
        "edge": "sync-labs-mcp",
        "key": "payments",
        "magic-hour-mcp": 15,
        "name": "Payments \u0026 pricing",
        "sync-labs-mcp": 30,
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 0,
        "edge": "",
        "key": "maintenance",
        "magic-hour-mcp": 75,
        "name": "Maintenance \u0026 community",
        "sync-labs-mcp": 75,
        "weight": 7
      },
      {
        "by": 14,
        "edge": "magic-hour-mcp",
        "key": "transparency",
        "magic-hour-mcp": 58,
        "name": "Transparency \u0026 trust",
        "sync-labs-mcp": 44,
        "weight": 7
      }
    ],
    "summary": "sync. labs MCP server and Magic Hour MCP score within a point of each other on agent readiness, 51.5 (D) and 50.7 (D). Magic Hour MCP leads on security \u0026 auth and transparency \u0026 trust. Both do video edit.",
    "tasks": null,
    "tutorials": [],
    "verdicts": {
      "magic-hour-mcp": "Magic Hour's MCP server exposes its whole image and video toolkit, lip sync, face swap, upscaling and text-to-video, with typed schemas built from its OpenAPI file and every tool annotated. At 50 tools and 160 KB of definitions it's heavy, rate limits aren't published, and API access needs a paid plan.",
      "sync-labs-mcp": "sync. labs' MCP server is open source, generated from its API spec with workflow tools on top, and released often, with clear per-second prices for lip sync and dubbing. Security and data handling are thinly documented, and there's no read-only mode."
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-sync-labs-mcp",
    "json": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-sync-labs-mcp.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-sync-labs-mcp.md",
    "mcp": "https://www.anchorterminal.com/mcp",
    "slim": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-sync-labs-mcp.min.md"
  },
  "markdown": "sync. labs MCP server and Magic Hour MCP score within a point of each other on agent readiness, 51.5 (D) and 50.7 (D). Magic Hour MCP leads on security \u0026 auth and transparency \u0026 trust. Both do video edit.\n\n- Magic Hour MCP: grade D, 50.7/100, rank #1054 of 1513. Markdown https://www.anchorterminal.com/tools/magic-hour-mcp.md · JSON https://www.anchorterminal.com/api/v1/tools/magic-hour-mcp.json\n- sync. labs MCP server: grade D, 51.5/100, rank #1027 of 1513. Markdown https://www.anchorterminal.com/tools/sync-labs-mcp.md · JSON https://www.anchorterminal.com/api/v1/tools/sync-labs-mcp.json\n- Best video generation for AI agents: https://www.anchorterminal.com/best/video-generation/index.md\n- All 183 video comparisons: https://www.anchorterminal.com/compare/video-generation/index.md\n\n## Which one, for what\n\n### Magic Hour MCP (D)\n\nGood for: Agents making short-form video and images, from talking photos and ads to lip-synced translations, on a credit plan.\n\nAhead on:\n- Security \u0026 auth, 45 against 38\n- Transparency \u0026 trust, 58 against 44\n\nWatch for: About 160 KB of tool definitions\n\n### sync. labs MCP server (D)\n\nGood for: Agents that lip-sync or dub video into other languages.\n\nAhead on:\n- Reliability, 43 against 35\n- Payments \u0026 pricing, 30 against 15\n\nAlso in its favour:\n- Open source\n\nWatch for: No read-only mode\n\n\n## Why the edge\n\n### Payments \u0026 pricing: sync. labs MCP server +15\n\n- Magic Hour MCP (15): No machine payment protocol (0). Plan and credit-pack prices public, per-tool credit costs not read (10). 400 sign-up credits with no card, but API access sits on paid plans (5 of 20). A person signs up for a key in a browser (0). Tool discovery is open, but calls need a key (0). 0 + 10 + 5 + 0 = 15.\n- sync. labs MCP server (30): No machine payment protocol (0). Per-second prices published (20). A free try for short videos (10 of 20). A person signs up (0). 0 + 20 + 10 + 0 = 30.\n\n### Transparency \u0026 trust: Magic Hour MCP +14\n\n- Magic Hour MCP (58): Closed service under terms naming Magic Hour AI, Inc., revised 3 October 2026 (15). The privacy policy says prompts, uploads and outputs aren't sold or used to train models, for free and paid accounts, and MCP requests are handled the same way; retention periods aren't given (20 of 30). No deprecation policy found (5 of 20). Subprocessors not read (10 of 20, model providers named in tool docs). 15 + 20 + 5 + 10 = 50.\n- sync. labs MCP server (44): MIT open source (30). Data handling not read (5 of 30). No deprecation policy; earlier tool names documented as superseded (5 of 20). Subprocessors not found (0). 30 + 5 + 5 + 0 = 40.\n\n### Reliability: sync. labs MCP server +8\n\n- Magic Hour MCP (35): Status page at status.magichour.ai, all services online, with maintenance and previous incidents sections; no MCP component read (15). Incident history not read (5). No API rate limits found (0). No retry guidance found; wait_for_* tools poll long jobs (5 of 15). No SLA found (0). Not labelled beta (10). 15 + 5 + 0 + 5 + 0 + 10 = 35.\n- sync. labs MCP server (43): Status page at status.sync.so with maintenance and previous incidents (20). History not read (5). No MCP limits found (0). The source has abort-signal handling and recovery guidance for long jobs (8 of 15). No SLA found (0). Version 0.2.4, not labelled beta (10). 20 + 5 + 0 + 8 + 0 + 10 = 43.\n\n### Security \u0026 auth: Magic Hour MCP +7\n\n- Magic Hour MCP (45): API keys as Bearer tokens or OAuth through the Claude and ChatGPT connectors (20 of 30). Destructive deletes are annotated; no read-only key (8 of 20). Tools return generated media, not third-party text (10). No audit log found (0). No security.txt or certifications found; face and voice tools come with policy limits in the terms (7 of 20). 20 + 8 + 10 + 0 + 7 = 45.\n- sync. labs MCP server (38): OAuth per organisation, or an API key in the environment (22 of 30). No read-only mode (3 of 20). Media in and out, no third-party text (10). No audit log found (0). No security programme found (3 of 20). 22 + 3 + 10 + 0 + 3 = 38.\n\n## Score by category\n\n| Category | Weight | Magic Hour MCP | sync. labs MCP server | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 35 | 43 | sync. labs MCP server +8 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 82 | 81 | Magic Hour MCP +1 |\n| Agent ergonomics | 13% (16.2 this run) | 55 | 55 | even |\n| Security \u0026 auth | 14% (17.5 this run) | 45 | 38 | Magic Hour MCP +7 |\n| Payments \u0026 pricing | 10% (12.5 this run) | 15 | 30 | sync. labs MCP server +15 |\n| Task success | 10%, pending | pending | pending | not scored in this run |\n| Maintenance \u0026 community | 7% (8.8 this run) | 75 | 75 | even |\n| Transparency \u0026 trust | 7% (8.8 this run) | 58 | 44 | Magic Hour MCP +14 |\n| Negative events | ≤15 | 0 | 0 | |\n| **Total** | | **50.7 · D** | **51.5 · D** | |\n\n## Facts side by side\n\n| Fact | Magic Hour MCP | sync. labs MCP server |\n| --- | --- | --- |\n| Kind | MCP server | MCP server |\n| Vendor | Magic Hour AI, Inc. | Synchronicity Labs (sync.) |\n| Hosted endpoint | `https://mcp.magichour.ai/` | `https://mcp.sync.so/mcp` |\n| Transports | Streamable HTTP | Streamable HTTP |\n| Auth | OAuth or key | OAuth or key |\n| Pricing | Freemium | Paid |\n| x402 | no | no |\n| Licence | none | MIT |\n| Tools exposed | 50 | none |\n| Read-only variant documented | no | no |\n| llms.txt | yes | yes |\n| MCP registry | `io.github.magichourhq/magic-hour` | `io.github.synchronicity-labs/mcp-server` |\n| Terms last updated | not read yet | no document linked |\n| Privacy policy last updated | not read yet | no document linked |\n\n## Verdicts\n\n**Magic Hour MCP.** Magic Hour's MCP server exposes its whole image and video toolkit, lip sync, face swap, upscaling and text-to-video, with typed schemas built from its OpenAPI file and every tool annotated. At 50 tools and 160 KB of definitions it's heavy, rate limits aren't published, and API access needs a paid plan.\n\n**sync. labs MCP server.** sync. labs' MCP server is open source, generated from its API spec with workflow tools on top, and released often, with clear per-second prices for lip sync and dubbing. Security and data handling are thinly documented, and there's no read-only mode.\n\n## Before you call either\n\n### Magic Hour MCP\n\n1. Call get_workflow_guide first to pick the right tool\n2. Use the wait_for_* tools instead of polling project status yourself\n3. Check credits with get_account_info before long video jobs\n4. Only swap faces or voices of people who consented\n\n### sync. labs MCP server\n\n1. Get an estimate before long generations\n2. Dub or lip-sync only voices and faces the user has the right to use\n3. Check the active organisation before connecting with OAuth\n\n## Questions\n\n### Which is better for AI agents, Magic Hour MCP or sync. labs MCP server?\n\nsync. labs MCP server and Magic Hour MCP score within a point of each other on agent readiness, 51.5 (D) and 50.7 (D). Magic Hour MCP leads on security \u0026 auth and transparency \u0026 trust.\n\n### Do Magic Hour MCP and sync. labs MCP server need an API key?\n\nBoth take an API key or an OAuth sign-in.\n\n### Can an agent call Magic Hour MCP and sync. labs MCP server without installing anything?\n\nYes. Magic Hour MCP has a hosted endpoint at https://mcp.magichour.ai/ and sync. labs MCP server at https://mcp.sync.so/mcp.\n\n### Are Magic Hour MCP and sync. labs MCP server open source?\n\nNo open-source release is listed for Magic Hour MCP. sync. labs MCP server is open source (MIT).\n\n\n## For agents\n\n- This comparison as JSON: https://www.anchorterminal.com/compare/magic-hour-mcp-vs-sync-labs-mcp.json, and with the fewest tokens: https://www.anchorterminal.com/compare/magic-hour-mcp-vs-sync-labs-mcp.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"magic-hour-mcp\", \"b\": \"sync-labs-mcp\"}`. From a terminal: `anchor compare magic-hour-mcp sync-labs-mcp`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/magic-hour-mcp.json and https://www.anchorterminal.com/api/v1/tools/sync-labs-mcp.json\n\n## Other comparisons with Magic Hour MCP or sync. labs MCP server\n\n- [Alibaba Wan (Model Studio) vs Magic Hour MCP](https://www.anchorterminal.com/compare/alibaba-wan-vs-magic-hour-mcp.md)\n- [fal video models vs Magic Hour MCP](https://www.anchorterminal.com/compare/fal-video-vs-magic-hour-mcp.md)\n- [framefields vs Magic Hour MCP](https://www.anchorterminal.com/compare/framefields-vs-magic-hour-mcp.md)\n- [Google Veo vs Magic Hour MCP](https://www.anchorterminal.com/compare/google-veo-vs-magic-hour-mcp.md)\n- [Higgsfield API vs Magic Hour MCP](https://www.anchorterminal.com/compare/higgsfield-vs-magic-hour-mcp.md)\n- [HyperFrames vs Magic Hour MCP](https://www.anchorterminal.com/compare/hyperframes-vs-magic-hour-mcp.md)\n- [Kling AI API vs Magic Hour MCP](https://www.anchorterminal.com/compare/kling-vs-magic-hour-mcp.md)\n- [Luma AI API vs Magic Hour MCP](https://www.anchorterminal.com/compare/luma-vs-magic-hour-mcp.md)\n- [Magic Hour MCP vs MiniMax Video API](https://www.anchorterminal.com/compare/magic-hour-mcp-vs-minimax-video.md)\n- [Magic Hour MCP vs OpenAI Sora API](https://www.anchorterminal.com/compare/magic-hour-mcp-vs-openai-sora.md)\n- [Magic Hour MCP vs Pika API](https://www.anchorterminal.com/compare/magic-hour-mcp-vs-pika.md)\n- [Magic Hour MCP vs PixVerse API](https://www.anchorterminal.com/compare/magic-hour-mcp-vs-pixverse.md)\n- [Magic Hour MCP vs Popcraft MCP](https://www.anchorterminal.com/compare/magic-hour-mcp-vs-popcraft-mcp.md)\n- [Magic Hour MCP vs Replicate video models](https://www.anchorterminal.com/compare/magic-hour-mcp-vs-replicate-video.md)\n- [Magic Hour MCP vs Runway API](https://www.anchorterminal.com/compare/magic-hour-mcp-vs-runway.md)\n- [Magic Hour MCP vs Seedance on BytePlus ModelArk](https://www.anchorterminal.com/compare/magic-hour-mcp-vs-seedance-on-byteplus-modelark.md)\n- [Magic Hour MCP vs Vidu API](https://www.anchorterminal.com/compare/magic-hour-mcp-vs-vidu.md)\n- [Alibaba Wan (Model Studio) vs sync. labs MCP server](https://www.anchorterminal.com/compare/alibaba-wan-vs-sync-labs-mcp.md)\n- [Clueso vs Magic Hour MCP](https://www.anchorterminal.com/compare/clueso-video-vs-magic-hour-mcp.md)\n- [Clueso vs sync. labs MCP server](https://www.anchorterminal.com/compare/clueso-video-vs-sync-labs-mcp.md)\n- [fal video models vs sync. labs MCP server](https://www.anchorterminal.com/compare/fal-video-vs-sync-labs-mcp.md)\n- [framefields vs sync. labs MCP server](https://www.anchorterminal.com/compare/framefields-vs-sync-labs-mcp.md)\n- [Higgsfield API vs sync. labs MCP server](https://www.anchorterminal.com/compare/higgsfield-vs-sync-labs-mcp.md)\n- [Kling AI API vs sync. labs MCP server](https://www.anchorterminal.com/compare/kling-vs-sync-labs-mcp.md)\n- [Luma AI API vs sync. labs MCP server](https://www.anchorterminal.com/compare/luma-vs-sync-labs-mcp.md)\n- [MiniMax Video API vs sync. labs MCP server](https://www.anchorterminal.com/compare/minimax-video-vs-sync-labs-mcp.md)\n- [Pika API vs sync. labs MCP server](https://www.anchorterminal.com/compare/pika-vs-sync-labs-mcp.md)\n- [PixVerse API vs sync. labs MCP server](https://www.anchorterminal.com/compare/pixverse-vs-sync-labs-mcp.md)\n- [Replicate video models vs sync. labs MCP server](https://www.anchorterminal.com/compare/replicate-video-vs-sync-labs-mcp.md)\n- [Runway API vs sync. labs MCP server](https://www.anchorterminal.com/compare/runway-vs-sync-labs-mcp.md)\n- [Seedance on BytePlus ModelArk vs sync. labs MCP server](https://www.anchorterminal.com/compare/seedance-on-byteplus-modelark-vs-sync-labs-mcp.md)\n- [Google Veo vs sync. labs MCP server](https://www.anchorterminal.com/compare/google-veo-vs-sync-labs-mcp.md)\n- [OpenAI Sora API vs sync. labs MCP server](https://www.anchorterminal.com/compare/openai-sora-vs-sync-labs-mcp.md)\n- [sync. labs MCP server vs Vidu API](https://www.anchorterminal.com/compare/sync-labs-mcp-vs-vidu.md)\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "attributionRequired": true,
    "credit": "CC BY 4.0, credit Anchor Terminal and link the page or API address you took it from (https://www.anchorterminal.com/terms/#data)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-11-09",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.7",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run",
    "terms": "https://www.anchorterminal.com/terms/#data"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Compare",
        "url": "https://www.anchorterminal.com/compare/"
      },
      {
        "name": "Magic Hour MCP vs sync. labs MCP server",
        "url": ""
      }
    ],
    "description": "sync. labs and Magic Hour MCP score within a point of each other for video edit, 51.5 and 50.7 out of 100. Prices, MCP, x402, uptime and agent notes side by side.",
    "facts": [
      "Magic Hour MCP D 50.7",
      "sync. labs MCP server D 51.5",
      "scores"
    ],
    "h1": "Magic Hour MCP vs sync. labs MCP server",
    "image": "https://www.anchorterminal.com/assets/og/default.png",
    "path": "/compare/magic-hour-mcp-vs-sync-labs-mcp",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Magic Hour MCP vs sync. labs for AI agents in 2026: scores and prices",
    "toc": null,
    "updated": "2026-11-08",
    "url": "https://www.anchorterminal.com/compare/magic-hour-mcp-vs-sync-labs-mcp"
  },
  "tokens": {
    "markdown": 3150,
    "slim": 780
  },
  "version": 1
}
