Create and edit images, videos, and audio through Magic Hour's hosted Streamable HTTP MCP server.
One address for any MCP client. No sign-in needed on this server.
10 read11 act23 other
Grouped by tool name. At most: moves money, runs code or commands, deletes data, or sends messages for you.
Odel charges nothing per call. The publisher may charge for its own service.
OpenAPI-backed MCP server for Magic Hour image, video, and audio generation.
At startup, this server reads docs/openapi.json and builds MCP tools with
FastMCP.from_openapi(). The OpenAPI spec supplies endpoint coverage, while
Magic Hour MCP policies add agent-facing guidance for async polling, uploads,
and project downloads.
Docs:
user.md - hosted endpoint user guideintegration-handoff.md - FastAPI mount checklistdocs/detailed-step-by-step-integration.md - full backend integration guidedocs/api-reference.md - generated API referencepip install -e .
python main.py
Local MCP endpoint:
http://127.0.0.1:8000/
This local dev server runs at /, not /mcp. The host app adds /mcp when it mounts the server.
By default, requests go to the production Magic Hour API:
https://api.magichour.ai
Tool discovery is public. Tool calls must include your Magic Hour API key:
Authorization: Bearer <magic_hour_api_key>
Agents can discover the hosted server card at:
https://mcp.magichour.ai/.well-known/mcp/server-card.json
Environment variables:
MAGIC_HOUR_API_BASE_URL=https://api.magichour.ai
MAGIC_HOUR_OPENAPI_PATH=docs/openapi.json
MCP_OAUTH_ISSUER_URL=https://mcp.magichour.ai
MCP_OAUTH_RESOURCE_URL=https://mcp.magichour.ai
Override MAGIC_HOUR_API_BASE_URL to use a mock or another API base:
MAGIC_HOUR_API_BASE_URL=https://api.sideko.dev/v1/mock/magichour/magic-hour/latest python main.py
This server is an OAuth protected resource only. The authorization server is the Magic Hour
web app (https://magichour.ai): users sign in and consent there, and it returns a Magic Hour
API key as the access token, which this server passes through to the API. Production requires
MCP_OAUTH_ISSUER_URL and MCP_OAUTH_RESOURCE_URL. See docs/future-oauth-support.md.
npx @modelcontextprotocol/inspector
Streamable HTTPhttp://127.0.0.1:8000/Authorization: Bearer <magic_hour_api_key>ping.video_assets_generate_presigned_url or another generated tool.Notes:
id and credits_charged immediately.operationId values are normalized to descriptive snake_case tool names./v1/files/upload-urls endpoint is named video_assets_generate_presigned_url. It accepts video, audio, and image items.wait_for_*_project to poll jobs. Use exact_download_urls exactly as
returned; never append expiration metadata.Rebuild and type-check the MCP App UI with cd web && npm ci && npm run build.
Magic Hour does not accept raw file bytes inside tool arguments. The flow is:
video_assets_generate_presigned_urlupload_urlfile_path into the generated creation toolDirect public media URLs may work, but uploaded file_path values are more
reliable. Upload bytes from the caller or a dedicated upload bridge; the hosted
MCP server never reads caller-supplied local filesystem paths. Browser chat needs
a separate upload UI or bridge; see docs/future-chat-ui-handoff.md.
AI Voice Generator exposes and accepts only exact API voice_name strings in
APPROVED_VOICE_NAMES in mcp_magichour/openapi_policies.py. Populate that tuple
with verified approved generic/non-celebrity presets to enable the tool on the
next deployment. No existing upstream voice is assumed safe. An empty allowlist
omits Voice Generator from tool discovery and calls. Voice Cloner is always
excluded from MCP.
The MCP policy removes upstream voice descriptions, defaults, examples and SDK
snippets at startup and when regenerating docs/api-reference.md. Daily OpenAPI
syncs cannot expand the allowlist. Do not edit docs/openapi.json to set MCP
voices: it remains the unmodified upstream API snapshot. The main Magic Hour
product and the public API are unchanged.
MCP Meme Generator exposes only the generic Random template option, keeping
public-figure template names out of its schema.