mcpField
U
UnificAlly MCP

UnificAlly MCP

VerifiedFeaturedRemote
unifically.comAI & Agents0Updated 2w ago

About UnificAlly MCP

UnificAlly MCP connects AI assistants to the UnificAlly API for generating and editing media, transcribing audio, and upscaling through a model catalog. It is for users who want these operations available in MCP clients through one API key, with task tracking and spending controls.

Key features

  1. 01Generate video and images
  2. 02Create music, speech, and sound effects
  3. 03Transcribe and clean up audio
  4. 04Edit and extend video
  5. 05Upscale image and video files
  6. 06Track tasks, models, and costs

Use cases

  1. 01Generate an image and then use it as a video starting frame
  2. 02Transcribe audio or create speech from text
  3. 03Check a generation's status or estimate its cost

MCP support

The MCP server exposes UnificAlly API operations as tools for media generation, editing, task management, model discovery, uploads, and cost checks. It supports stdio and Streamable HTTP, including a hosted endpoint.

Configuration

Remote servers need no local install. Pick your client, then copy the config or install in one click.

Endpointhttps://mcp.unifically.com/mcp
Copy install command
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.

All endpoints
Streamable HTTPhttps://mcp.unifically.com/mcpAuth required

Tools

14
ParameterTypeRequiredDescription
promptstringYesText prompt describing the desired video.
modelstringNoModel, as a short alias or full id. Aliases: 'veo' (default), 'veo-quality', 'veo-lite', 'kling', 'kling-omni', 'hailuo', 'seedance', 'grok-video', 'grok-1.5'. Full ids like 'google/veo-3.1-fast' also work. Call list_models for the catalog, and read a model's docs page for its exact parameters.
durationintegerNoVideo length in seconds. Omit for the model's default. Allowed values are per-model.
aspect_ratiostringNoOutput aspect ratio, e.g. '16:9'. Per-model: some accept different sets, some have none.
image_urlstringNoOptional starting frame for image-to-video. This tool maps it to whatever field the chosen model wants, so pass it here rather than the model's own field name. Must be a public https URL — never a local path, never inline base64. For a local file, upload it first with a direct PUT to files.unifically.com/upload and pass the returned file_url.
end_image_urlstringNoOptional final frame (start-frame + end-frame interpolation). Only some models support one. Must be a public https URL — never a local path, never inline base64. For a local file, upload it first with a direct PUT to files.unifically.com/upload and pass the returned file_url.
reference_image_urlsarrayNoOptional reference images for style/subject — each must be a public https URL (upload local files first — never a path or base64). Support, the max count, and whether they combine with a start frame are per-model.
seedintegerNoOptional seed for reproducible output. Same seed + same input gives the same result on supported models.
waitbooleanNoDefault true: wait for the job and return the finished result. Set false to get the task_id back immediately and poll with get_task — use for long jobs (high-quality video, full songs) or when the connection might time out.
callback_urlstringNoOptional webhook URL. When set, the tool returns immediately with the task_id and Unifically POSTs the result to this URL when the task finishes. Webhook body: { task_id, status: 'completed'|'failed', data: { video_url | image_url | audio_url | ... }, error_message? } — note the media arrives under 'data', not 'output'. Use for long jobs instead of waiting.
confirm_costbooleanNoOnly relevant if the operator enabled a spend guard. When a call exceeds the configured confirm threshold it returns a quote; retry with confirm_cost: true to proceed. Safe to ignore otherwise.
provider_optionsobjectNoEscape hatch for model-specific fields not exposed as named parameters (e.g. Kling multi_shots, Flux steps). Merged into the API 'input' payload. Rejected: fields the tool already manages (prompt, media URLs, task_id, ...) and reserved routing/billing/auth keys (model, callback_url, dry_run, api_key, authorization) — switch models with the 'model' parameter, not here. See https://docs.unifically.com for per-model fields.

Details

From the project README

UnificAlly MCP server

npm

An MCP server for the UnificAlly API. It lets an AI assistant generate video, images, music, speech and sound effects, transcribe audio and upscale media through 100+ models (Veo 3.1, Kling, Seedance, Hailuo, Grok Imagine, Nano Banana, Flux, GPT Image, Suno, ElevenLabs, Topaz) with one API key.

It works in any MCP client: Cursor, Claude Desktop, Claude Code, Cline, Windsurf, Zed, ChatGPT Desktop, Goose, n8n and your own code.

Install

  1. Create an API key at https://unifically.com/api-keys. A new account starts with $0.50 of balance to test with.
  2. Add the server to your client config:
{
  "mcpServers": {
    "unifically": {
      "command": "npx",
      "args": ["-y", "@unifically/mcp-server"],
      "env": { "UNIFICALLY_API_KEY": "sk-..." }
    }
  }
}

That block works as is for Cursor (.cursor/mcp.json), Claude Desktop (claude_desktop_config.json), Cline and Windsurf (~/.codeium/windsurf/mcp_config.json). Restart the client after saving.

Claude Code:

claude mcp add unifically -e UNIFICALLY_API_KEY=sk-... -- npx -y @unifically/mcp-server
Other clients

Zed (~/.config/zed/settings.json):

{
  "context_servers": {
    "unifically": {
      "command": { "path": "npx", "args": ["-y", "@unifically/mcp-server"] },
      "env": { "UNIFICALLY_API_KEY": "sk-..." }
    }
  }
}

ChatGPT Desktop: Settings, Connectors, Add MCP server. Command npx -y @unifically/mcp-server, plus the UNIFICALLY_API_KEY variable.

Goose, n8n or anything else that speaks stdio:

UNIFICALLY_API_KEY=sk-... npx -y @unifically/mcp-server

On Windows, if the client says npx not found, use "command": "cmd", "args": ["/c", "npx", "-y", "@unifically/mcp-server"].

There is also a hosted server at https://mcp.unifically.com/mcp for clients that take a URL. See Remote server.

Example

Ask the assistant for something:

Make a 16:9 image of a lighthouse at dusk, then a 6 second video that starts from it.

It calls the tools in order:

{ "name": "generate_image", "arguments": { "prompt": "a lighthouse at dusk, waves, warm light", "aspect_ratio": "16:9" } }
Generated image with google/nano-banana-pro. Result: https://files.unifically.com/image/....png [task_id: 7f3c...]
{ "name": "generate_video", "arguments": { "prompt": "slow push in, waves rolling", "image_url": "https://files.unifically.com/image/....png", "duration": 6 } }

Each generation tool waits for the job and returns the media URL. The structured result looks like this:

{
  task_id: string,
  status: "completed" | "pending" | "processing",
  output: { video_url?, image_url?, audio_url?, image_urls?, audio_urls?, text? },  // when completed
  model: string,
  cost_usd?: number
}

Under the hood each call is one request to the UnificAlly API (POST /v1/tasks with { model, input }, then GET /v1/tasks/{id}), the same one shown in the API docs.

Tools

ToolWhat it doesSpends balance
generate_videoText or image to video (Veo, Kling, Hailuo, Seedance, Grok and more). Optional start and end frames, reference images.yes
generate_imageText to image and image editing (Nano Banana, GPT Image, Flux, Qwen, Kling, Grok, SeeDream).yes
generate_audioText to speech, sound effects, dialogue, transcription (stt), voice change (voice-changer), audio cleanup (voice-isolation).yes
generate_musicSuno: make a song, or cover, extend, add-vocals, add-instrumental or stems an existing track.yes
edit_videoEdit an existing clip from a prompt, or transfer motion onto a subject image (motion-control).yes
upscale_mediaTopaz for any image or video (image_url / video_url), or task_id for the Veo and Grok upscalers.yes
extend_videoExtend a finished Veo (+8 s) or Grok Imagine generation.yes
upload_fileTurn a URL, or a local file on a stdio server, into a public CDN URL.no
get_taskStatus and result of a task by id, optionally waiting for it.no
list_tasksPast tasks, newest first, filtered by status, model, category, provider or time.no
list_resourcesVoice lists for ElevenLabs (default), Kling and Veo.no
list_modelsThe model catalog and aliases.no
dry_run_costThe price of a call without running it.no
check_balanceAccount balance in USD.no

Every tool sets all four MCP hints. The seven tools that spend balance are marked destructiveHint: true and idempotentHint: false, so a client that auto-approves read-only tools still asks before a paid run. Failed generations are not charged.

Supported models, each with its parameters, id and a browser playground:

list_models returns the full live catalog.

How it behaves

  • Every generation tool works from a prompt alone. model is optional and takes short aliases (veo, kling, flux, nano-banana-2, seedance, tts, sfx, stt) or full ids such as google/veo-3.1-fast.
  • Media fields (image_url, image_urls, end_image_url, reference_image_urls, audio_url, video_url) take public https URLs only. A local path or base64 string gets an error that says to upload first.
  • Field names differ between models (Kling's start_frame_url, Veo's start_image_url, Seedance's first_frame_url). You pass image_url and the server renames it. Any field the server has no parameter for goes in provider_options, which also overrides the mapping.
  • The server keeps no copy of each model's allowed durations, resolutions or aspect ratios. The API checks values and returns a 422 that names the fix, at no cost. The server instructions tell the assistant to read the model's page in docs.unifically.com/llms.txt before running a model.
  • Every generation tool also accepts wait, callback_url, provider_options and confirm_cost.
  • Errors come back as one sentence: 401 for a missing or wrong key, 402 for low balance (with a top-up link), 422 with the API's validation message, and a timeout message that tells the assistant to resume with get_task. 429, 5xx and network errors are retried with backoff.
Uploads

Models only read public URLs, so a local file goes to the UnificAlly CDN first.

  1. upload_file { content_type: "image/png" } returns a one-time upload_url and the final file_url. The assistant sends the bytes with curl, without any API key in the shell:

    curl -X PUT '<upload_url>' --data-binary @photo.png
    

    The URL is signed, single use and expires in about 5 minutes. The file keeps full quality.

  2. upload_file { url } imports a file that is already online.

  3. upload_file { file_path } reads the file from disk, only when the server runs locally over stdio.

There is no base64 upload, and the instructions tell the assistant never to send a user's file to another host. Both rules come from real failures: with a base64 size limit, agents shrank users' images to fit, and one agent without a key in its shell uploaded a private photo to a public file host.

Long jobs

High quality video and full songs can take minutes.

  • wait: false returns { task_id, status: "pending" } at once. Poll get_task until status is "completed".
  • callback_url returns at once too, and the API POSTs the result to your webhook.

Any task can be picked up later with get_task.

Spend limits

All off by default. Set them per deployment:

  • UNIFICALLY_CONFIRM_COST_ABOVE=<usd>: a call priced above this returns a quote, and runs only when the assistant retries with confirm_cost: true.
  • UNIFICALLY_MAX_COST_PER_TASK=<usd>: a call priced above this is rejected. confirm_cost does not override it.
  • UNIFICALLY_BLOCKED_MODELS=veo-quality,suno or UNIFICALLY_ALLOWED_MODELS=nano-banana-2,flux,tts: restrict which models can run.
  • UNIFICALLY_DISABLE_GENERATION=true: read-only mode. Browsing, dry_run_cost and check_balance still work.

Environment variables

VariableRequiredDefault
UNIFICALLY_API_KEYstdio onlynone. HTTP callers send their own key. UNIFICALLY_KEY, UNIFICALLY_TOKEN and UNIFICALLY_API_TOKEN also work.
UNIFICALLY_BASE_URLnohttps://api.unifically.com
UNIFICALLY_FILES_BASE_URLnohttps://files.unifically.com
UNIFICALLY_REQUEST_TIMEOUT_MSno60000
UNIFICALLY_MAX_RETRIESno3
UNIFICALLY_POLL_TIMEOUT_MSno600000
UNIFICALLY_POLL_START_MSno2000
UNIFICALLY_POLL_MAX_MSno10000
UNIFICALLY_CONFIRM_COST_ABOVEnooff
UNIFICALLY_MAX_COST_PER_TASKnooff
UNIFICALLY_BLOCKED_MODELSnonone
UNIFICALLY_ALLOWED_MODELSnonone
UNIFICALLY_DISABLE_GENERATIONnofalse
MCP_TRANSPORTnostdio (or http)
UNIFICALLY_HTTP_WAIT_BUDGET_MSno85000, the longest an HTTP call blocks before returning the task_id
PORTnoset by the hosting platform
UNIFICALLY_CORS_ORIGINno*
UNIFICALLY_TRUSTED_PROXIESnoloopback. Also private, exact IPs or CIDRs allowed to send X-Forwarded-For.
UNIFICALLY_TRUST_CF_CONNECTING_IPnofalse
UNIFICALLY_RATE_PER_MINno120 requests per minute, per key and per account
UNIFICALLY_RATE_BURSTno40
UNIFICALLY_PUBLIC_DISCOVERYnotrue. Lets keyless callers run initialize, tools/list, resources/list and ping. Set 0 to require a key for everything.
UNIFICALLY_ANON_RATE_PER_MINno30 keyless requests per minute, per IP
UNIFICALLY_ANON_RATE_BURSTno12

Remote server

MCP_TRANSPORT=http serves Streamable HTTP on /mcp and legacy SSE on GET /sse + POST /messages. The hosted copy runs at https://mcp.unifically.com/mcp.

Each caller sends their own key, so one deployment serves many users and bills each one's own balance:

  1. Authorization: Bearer <key> (recommended)
  2. X-API-Key: <key>
  3. ?api_key=<key> for clients that only take a URL. Query strings can end up in proxy logs, so use a header when you can.
{
  "mcpServers": {
    "unifically": {
      "url": "https://mcp.unifically.com/mcp",
      "headers": { "Authorization": "Bearer sk-..." }
    }
  }
}

For claude.ai (Settings, Connectors, Add custom connector) put the key in the URL: https://mcp.unifically.com/mcp?api_key=sk-.... For stdio-only clients, bridge with mcp-remote:

{
  "mcpServers": {
    "unifically": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.unifically.com/mcp", "--header", "Authorization: Bearer sk-..."]
    }
  }
}

Details of the HTTP mode:

  • Streamable HTTP is stateless, so it scales behind any reverse proxy without sticky sessions.
  • A caller without a key can run initialize, tools/list, resources/list, prompts/list and ping, so registries can read the tool list. Everything else returns 401. Keyless traffic is rate limited per IP and capped at 16 concurrent messages. GET /.well-known/mcp-config returns a JSON Schema for the one required setting (api_key), and GET /.well-known/mcp/server-card.json returns the tool list.
  • Keys are checked against the API, with the result cached, and a per-IP budget limits failed checks. Rate limits apply per key and per account, so extra keys do not raise one account's limit. Batches are capped at 16 messages and bodies at 512 KB.
  • Browser Origin headers are validated against DNS rebinding. MCP clients send none and are unaffected.
  • X-Forwarded-For is trusted only from UNIFICALLY_TRUSTED_PROXIES. The shipped Compose file sets private for its isolated network; do not use that on a shared LAN.
  • A key with zero balance can still check the balance, list and fetch tasks and price a job. It cannot start one (402).
  • GET / returns connect instructions and GET /health is an unauthenticated health check.
Self-hosting

The repo ships a Dockerfile and docker-compose.yml that run the HTTP transport with per-request keys. Put the container behind an HTTPS reverse proxy, point a domain at it and use /health as the health check. Nothing is required in the environment. UNIFICALLY_CONFIRM_COST_ABOVE=1.00 is a sensible default for a shared deployment.

Development

git clone https://github.com/unifically-dev/unifically-mcp.git
cd unifically-mcp
npm install
cp .env.example .env       # add your UNIFICALLY_API_KEY
npm run dev

Inspect the tools interactively:

npx @modelcontextprotocol/inspector npx -y tsx src/index.ts

Tests:

npm test               # build + smoke test
npm run test:vitest    # full suite

Troubleshooting

SymptomFix
spawn npx ENOENTNode is not on PATH. Use absolute paths to node and dist/index.js in the client config.
401 UnauthorizedUNIFICALLY_API_KEY is missing from the client's env block. Restart the client after editing.
402 Payment RequiredTop up at https://unifically.com/payments.
Tool calls hangLong video or full songs: pass wait: false or a callback_url.
Client shows no toolsRun npx @modelcontextprotocol/inspector npx -y @unifically/mcp-server. If the tools show there, the client config JSON is malformed.

Links

License

MIT

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.