hedra-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@hedra-mcp-server What video models are available and how much would a 5-second clip cost?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
hedra-mcp-server
An MCP (Model Context Protocol) server for the Hedra v3 API — browse Hedra's model catalog (Seedance, Veo, Kling, GPT Image, Hedra Avatar, ElevenLabs, and more) and submit, poll, and manage generation jobs, all from an MCP client like Claude.
Built against Hedra's public OpenAPI spec (https://www.hedra.com/docs/openapi-v3.json) but not tested against the live API — the environment that built this had no network access to api.hedra.com. Test it against your real key before relying on it (see "Try it" below).
What it does
14 tools across 4 areas:
Models — hedra_list_models, hedra_get_model, hedra_get_model_input_schema, hedra_list_model_voices, hedra_estimate_cost
Jobs — hedra_submit_job, hedra_get_job, hedra_get_job_status, hedra_wait_for_job, hedra_list_jobs, hedra_list_model_jobs
Files — hedra_upload_file (from a local path, a remote URL, or inline base64)
Billing — hedra_get_balance, hedra_get_usage
Not covered (can be added later if you need them): webhook management, log drains, API key rotation. These are account-admin operations rather than day-to-day generation workflow, so they were left out to keep the initial tool surface focused.
Related MCP server: BudgetPixel MCP Server
Setup
Get a Hedra API key. You need a paid Hedra plan. Go to https://www.hedra.com/develop/api-keys, generate a key (format
<key_id>:<secret>), and fund the API wallet at https://www.hedra.com/develop/billing — it starts at $0.00 and is separate from Hedra Studio credits.Install dependencies and build:
npm install npm run buildSet your API key:
export HEDRA_API_KEY="your_key_id:your_secret"
Try it locally (stdio)
This is the easiest way to test — no deployment needed. Works with Claude Code, Claude Desktop, or any MCP client that can launch a local process.
npm startClaude Code / Claude Desktop config (add to your MCP servers config):
{
"mcpServers": {
"hedra": {
"command": "node",
"args": ["/absolute/path/to/hedra-mcp-server/dist/index.js"],
"env": { "HEDRA_API_KEY": "your_key_id:your_secret" }
}
}
}Sanity-check before anything else
Once connected, ask your MCP client to call hedra_get_balance. If that returns your real balance, auth is wired correctly. Then try hedra_list_models with modality: "VIDEO" to confirm the catalog loads.
Deploy remotely (for Claude.ai as a custom connector)
Claude.ai's web/mobile app needs a live HTTPS endpoint — it can't launch a local process. Deploy this server somewhere with a public URL, then add it as a custom connector.
Deploy to any Node host (Fly.io, Render, Railway, a VPS, etc.). Set the environment variables:
HEDRA_API_KEY=your_key_id:your_secretTRANSPORT=httpPORT=3000(or whatever your host expects)
Start command:
npm run build && npm run start:httpVerify it's up:
curl https://your-deployed-host/healthshould return{"status":"ok","server":"hedra-mcp-server"}.Add it in Claude.ai: Settings → Connectors → Add custom connector → enter
https://your-deployed-host/mcpas the URL.
⚠️ Security note: this server has no built-in authentication on the /mcp endpoint beyond the Hedra key baked into its environment — anyone who can reach the URL can spend your Hedra balance. Put it behind your host's access controls (IP allowlist, a reverse-proxy auth layer, etc.) if it's reachable from the open internet, especially since it's tied to a real prepaid wallet.
Typical workflow
1. hedra_list_models(modality="VIDEO") → find seedance-20's id
2. hedra_get_model_input_schema("seedance-20") → see required fields, enums
3. hedra_upload_file(file_path="./start.jpg") → get a handle url (if using image-to-video)
4. hedra_estimate_cost("seedance-20", {...}) → confirm price before spending
5. hedra_submit_job("seedance-20", {...}) → returns job_id
6. hedra_wait_for_job(job_id) → blocks until done, returns outputs[].urlProject structure
src/
index.ts # entry point, transport selection (stdio/http)
constants.ts # timeouts, page sizes, base URL
types.ts # TS types mirroring Hedra's API shapes + HedraApiError
services/
hedra-client.ts # typed fetch wrapper: auth, requests, pagination, uploads
format.ts # error formatting, JSON truncation, tool response helpers
schemas/
common.ts # shared Zod fragments (pagination, media refs, ids)
tools/
models.ts # catalog + schema + cost estimate tools
jobs.ts # submit/get/status/wait/list tools
files.ts # upload tool
billing.ts # balance/usage tools
test/
smoke.mjs # connects via stdio, lists tools, sanity-checks error handlingDevelopment
npm run dev # tsx watch mode against src/index.ts (stdio)
npm run build # tsc -> dist/
node test/smoke.mjs # after building: verify tool registration + error handlingAvailable Tools
14 toolshedra_estimate_costEstimate Hedra Generation CostARead-only
Estimate the cost in USD of running a model with a given input, WITHOUT submitting a job or spending any wallet balance.
Strongly recommended before hedra_submit_job for expensive operations (long videos, 4K, high-duration audio) so the person can approve spend first. Some models cannot be precisely quoted until inputs are measured server-side (e.g. audio-length-dependent avatar video) — in that case the response indicates the price isn't quotable yet and the real cost will be shown if a submit is refused for insufficient balance.
Args:
model_id (string, required): the model's public id.
input (object, required): the same "input" object you'd pass to hedra_submit_job for this model — build it against hedra_get_model_input_schema.
Returns: JSON with the estimated price and currency (fields vary by model; some return {quotable:false} instead).
Examples:
Use when: about to generate a 4K video and want to confirm cost first
Don't use when: the model is cheap/fixed-price and the person hasn't asked about cost
Inputs: input (required), model_id (required).
hedra_get_balanceGet Hedra API Wallet BalanceARead-onlyIdempotent
Get the current spendable balance of the Hedra API wallet — the prepaid USD balance that pays for API generations. This is SEPARATE from Hedra Studio credits; funding one does not fund the other.
Check this before submitting expensive or bulk jobs to confirm there's enough balance, or when a submit was refused with an INSUFFICIENT_BALANCE error.
Returns: JSON {balance, currency}.
Examples:
Use when: about to submit a batch of jobs and want to sanity-check funds first
Use when: a hedra_submit_job call failed with a billing error and you want to confirm the current balance before advising the person
Inputs: no named parameters.
hedra_get_jobGet Hedra Job ResultARead-onlyIdempotent
Fetch the full result envelope for a job, including its outputs (with download URLs and asset_ids) once complete, or its error if it failed.
Use this to retrieve the final generated file's URL, or the failure reason for a FAILED job. For a lighter-weight progress check while a job is still running, use hedra_get_job_status instead — or use hedra_wait_for_job to block until it finishes.
Args:
job_id (string, required): the job id returned by hedra_submit_job (format job_).
Returns: JSON {job_id, model, status, outputs: [{url, asset_id, content_type, ...}], error, created_at, updated_at}. outputs[].url is the downloadable result; outputs[].asset_id can be fed back into another model's input as {"source":"asset","asset_id":...}.
Error Handling:
"Error [NOT_FOUND]: Job not found." — double check the job_id, or that it belongs to this API key's workspace.
Inputs: job_id (required).
hedra_get_job_statusGet Hedra Job StatusARead-onlyIdempotent
Lightweight poll of a job's current status and progress — cheaper than hedra_get_job for repeated polling while a job is still running.
Args:
job_id (string, required): the job id from hedra_submit_job.
Returns: JSON {job_id, status: 'IN_QUEUE'|'IN_PROGRESS'|'COMPLETED'|'FAILED', progress, estimated_completion_at}. Once status is COMPLETED or FAILED, call hedra_get_job for the full result/outputs.
Examples:
Use when: manually polling a long-running job in a loop with your own delay
Don't use when: you just want to wait for completion and get the result in one call (use hedra_wait_for_job instead)
Inputs: job_id (required).
hedra_get_modelGet Hedra Model DetailsARead-onlyIdempotent
Get full catalog details for one Hedra model: display name, modality, description, and any capability metadata Hedra publishes for it.
This gives a human-readable overview. For the exact, machine-typed input parameters needed to submit a job (required fields, enums, media roles), use hedra_get_model_input_schema instead — this tool alone is not enough to construct a valid hedra_submit_job call.
Args:
model_id (string, required): the model's public id from hedra_list_models (e.g. "seedance-20").
Returns: JSON object describing the model.
Error Handling:
Returns "Error [NOT_FOUND]: Model '' not found." if the id doesn't exist — double check with hedra_list_models.
Inputs: model_id (required).
hedra_get_model_input_schemaGet Hedra Model Input SchemaARead-onlyIdempotent
Get the exact, typed JSON Schema for one model's submit "input" object — required fields, enums (e.g. allowed resolutions, aspect ratios, durations), and which fields accept media references (images/videos/audios/start_image/end_image) versus plain text/numbers.
ALWAYS call this before hedra_submit_job for a model you haven't used yet in this session — model input shapes vary significantly (e.g. Seedance uses duration_ms as an enum of fixed values; image models use a "quality" tier instead). Guessing the shape wastes a submit call and API validation is strict.
Args:
model_id (string, required): the model's public id (e.g. "seedance-20").
Returns: A standalone OpenAPI operation object for this model's POST endpoint. The interesting part is components.schemas.Input_ (or similarly named) — its "properties" lists every input field with type, enum, and description; "required" lists which are mandatory.
Examples:
Use when: about to call hedra_submit_job for "seedance-20" and unsure of valid resolutions -> call this first, read the resolution enum
Don't use when: you already fetched this model's schema earlier in the same conversation and nothing has changed
Inputs: model_id (required).
hedra_get_usageGet Hedra API UsageARead-onlyIdempotent
Get API wallet usage/spend history and breakdown.
Returns: JSON with usage details (shape depends on Hedra's current usage report format).
Examples:
Use when: "how much have I spent on the API this month?"
Don't use when: you just want the current balance (use hedra_get_balance instead — cheaper, simpler)
Inputs: no named parameters.
hedra_list_jobsList Hedra JobsARead-onlyIdempotent
List jobs submitted with this API key across all models, most recent activity first, paginated.
Args:
limit (number, optional, default 20, max 100): items per page.
cursor (string, optional): pass the previous response's next_cursor to get the next page; omit for the first page.
Returns: JSON {jobs: [...], next_cursor}. has_more can be inferred from next_cursor being non-null.
Examples:
Use when: "what have I generated recently?" or "find my last few jobs across any model"
Don't use when: you already know the model and want only its jobs (use hedra_list_model_jobs — narrower and often faster)
Inputs: limit, cursor.
hedra_list_model_jobsList Jobs For A Hedra ModelARead-onlyIdempotent
List jobs submitted to one specific model, most recent first, paginated.
Args:
model_id (string, required): the model's public id.
limit (number, optional, default 20, max 100): items per page.
cursor (string, optional): pass the previous response's next_cursor for the next page.
Returns: JSON {jobs: [...], next_cursor}.
Inputs: model_id (required), limit, cursor.
hedra_list_modelsList Hedra ModelsARead-onlyIdempotent
List every AI model available through the Hedra API — image, video, and audio/avatar generation models from partners like ByteDance (Seedance, Seedream), Google (Veo, Imagen), OpenAI (GPT Image), Kling, ElevenLabs, and Hedra's own avatar models.
Use this first to discover a model's public id (e.g. "seedance-20", "veo-31", "hedra-avatar") before calling hedra_get_model_input_schema or hedra_submit_job with it.
Args:
modality ('IMAGE' | 'VIDEO' | 'AUDIO', optional): filter to only models of this output type. Omit to list all.
Returns: JSON with a "models" array, each entry having at least {id, name, modality}.
Examples:
Use when: "What video models can I use?" -> modality="VIDEO"
Use when: "Find the Seedance model id" -> list all, look for name containing "Seedance"
Don't use when: you already know the model id and just need its input schema (use hedra_get_model_input_schema instead)
Inputs: modality.
hedra_list_model_voicesList Voices For A Hedra ModelARead-onlyIdempotent
List the text-to-speech voices a specific model accepts (scoped to that model's voice provider — e.g. ElevenLabs voices differ from Hedra Avatar's own voices).
Use this before submitting a job to a speech or avatar model that takes a voice_id input.
Args:
model_id (string, required): the model's public id (e.g. "hedra-avatar", "elevenlabs-v3").
Returns: JSON with a "voices" array of {id, name, ...}.
Error Handling:
Returns "Error [NOT_FOUND]..." if the model doesn't accept voice input at all.
Inputs: model_id (required).
hedra_submit_jobSubmit A Hedra Generation JobA
Submit a generation job to a Hedra model. This starts real, billed work against the API wallet — always confirm the model and input with the person for anything non-trivial, and consider calling hedra_estimate_cost first for expensive requests.
Submission is asynchronous: this returns immediately with a job_id in IN_QUEUE or IN_PROGRESS status, not the finished result. Follow up with hedra_wait_for_job (simplest) or poll hedra_get_job_status / hedra_get_job yourself.
Before your first call to this tool for a given model in this session, call hedra_get_model_input_schema to get the exact required fields and enums — submitting a malformed input wastes a round trip and Hedra's validation is strict (e.g. Seedance's duration_ms only accepts specific values: 4000, 5000 ... 15000).
For any input field that takes a media reference (images, videos, audios, start_image, end_image, reference audio for voice cloning, etc.), first upload the file with hedra_upload_file and pass {"source":"url","url":} — or reuse a prior job's output with {"source":"asset","asset_id":<from outputs[].asset_id>}.
Args:
model_id (string, required): the model's public id (e.g. "seedance-20").
input (object, required): model-specific input, matching hedra_get_model_input_schema's schema exactly.
webhook (string, optional): HTTPS URL to receive a signed completion webhook instead of polling.
idempotency_key (string, optional): pass the same key on a retried submit to get back the original job's ack instead of creating a duplicate paid job.
Returns: JSON {job_id, model, status, status_url, result_url, estimated_completion_at}.
Error Handling:
"Error [INVALID_ARGUMENT]..." lists every invalid field with the allowed values — fix and resubmit.
"Error [INSUFFICIENT_BALANCE]..." means the API wallet needs funding; the message includes the funding URL and, when quotable, the exact amount short.
"Error [MODERATION_FAILED]..." means an input (often a reference image) was refused by content moderation.
Inputs: input (required), model_id (required), webhook, idempotency_key.
hedra_upload_fileUpload A File To HedraA
Upload a file (image, video, or audio) to Hedra and get back a short-lived presigned URL to use as a media input in hedra_submit_job (e.g. a start_image, a reference image, a voice-cloning audio sample).
Free — works even with $0.00 in the API wallet; funding is only enforced at job submission. The returned url expires 1 hour after upload; if it lapses before you submit, upload again.
Provide EXACTLY ONE source:
file_path: a path readable on the machine running this MCP server.
source_url: an https URL Hedra should fetch and re-upload (a plain external URL is NOT accepted directly by model inputs — it must go through this upload step first).
base64_data + filename: raw bytes inline, for clients that can't provide a local path or URL.
Returns: JSON {url, content_type, expires_at}. Pass this straight into a model's input as {"source":"url","url":} for the appropriate field (per hedra_get_model_input_schema).
Examples:
Use when: about to run an image-to-video model and need to upload the start frame first
Use when: cloning a voice from an audio sample the person uploaded
Don't use when: reusing a previous Hedra generation's output as input — pass {"source":"asset","asset_id":...} directly to hedra_submit_job instead, no re-upload needed
Error Handling:
"Error: file not found at " if file_path doesn't exist on the server's filesystem.
"Error [MODERATION_FAILED]..." can occur later at submit time if the uploaded content is refused, not at upload time.
Inputs: filename, file_path, source_url, base64_data.
hedra_wait_for_jobWait For A Hedra Job To FinishARead-onlyIdempotent
Poll a job until it reaches COMPLETED or FAILED (or the timeout elapses), then return the full result in one call. This is the simplest way to generate-and-wait without managing your own poll loop.
For batches of jobs, call this once per job_id rather than trying to wait on several at once — there is no multi-job wait tool by design, to keep timeout/backoff behavior predictable per job.
Args:
job_id (string, required): the job id from hedra_submit_job.
timeout_ms (number, optional, default 300000/5min, max 1200000/20min): give up and return the last-known status after this many milliseconds if the job hasn't finished.
poll_interval_ms (number, optional, default 4000): delay between status checks.
Returns: JSON {job_id, status, outputs, error, timed_out}. timed_out is true if the timeout elapsed before completion — in that case status reflects the last poll and the job may still finish later; call hedra_get_job again after more time.
Examples:
Use when: "generate this video and tell me when it's ready" -> submit, then wait
Don't use when: doing many jobs in parallel and want to check on all of them periodically yourself (poll hedra_get_job_status per job instead, to avoid blocking on one at a time)
Inputs: job_id (required), timeout_ms, poll_interval_ms.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 14 tools
Each tool targets a distinct resource and action: discovery, upload, schema retrieval, cost estimation, submission, job retrieval, status polling, waiting, listing, and billing. Related job-monitoring tools (get_job, get_job_status, wait_for_job) are clearly differentiated by purpose and response detail, with descriptions explicitly guiding selection.
All tool names follow a consistent snake_case verb_noun pattern (e.g., hedra_list_models, hedra_submit_job, hedra_get_balance). Multi-word objects like get_model_input_schema and list_model_jobs are constructed uniformly, making the tool surface predictable and easy to navigate.
14 tools is well-scoped for a media generation API, covering model discovery, input schema, file upload, cost estimation, job submission, monitoring, listing, and wallet/usage checks. Each tool serves a necessary step in the workflow without unnecessary redundancy.
The tool set covers the full generation lifecycle: discover models, inspect schemas, upload media, estimate cost, submit jobs, wait/poll for completion, retrieve outputs, and list historical jobs. Billing and usage tracking are also included, leaving no critical gaps for the core API workflows.
Maintenance
Related MCP Connectors
Generate images, video, audio and short films with 140+ AI models from any MCP client.
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Generate images, videos and music with model discovery, cost estimates and asynchronous results.
Create and manage AI image and video generations through Quriov's fixed public MCP tools.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with fal.ai AI models through MCP, supporting model discovery, content generation, queue management, and file uploads to the fal.ai platform.MIT
- AlicenseNot gradedqualityDmaintenanceEnables MCP-compatible clients to generate and upscale AI images, videos, music, and sound effects, manage generation jobs, access model catalogs, and track credits.3MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI clients to create images and videos through a hosted remote MCP endpoint with browser OAuth, letting users discover available models and Quick Apps, quote credit costs, upload reference files, submit single or batch generation tasks, and retrieve finished results. It also supports task tracking, retries with consistent request IDs, and ranged downloads, while spending account credits only on actually submitted jobs.MIT
- AlicenseNot gradedqualityAmaintenanceEnables MCP-compatible clients to generate images and videos, synthesize speech, and clone or design voices through integrated AI APIs.635 npmMIT