varg
AI video, image, speech and music generation — Kling, Seedance, Veo, Sora, Flux, ElevenLabs via one hosted MCP server (OAuth) or npx @vargai/mcp.
Hosted MCP Server
npx add-mcp 'https://mcp.varg.ai/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
MCP Server
Connect Claude, ChatGPT, VS Code, Cursor, and other AI tools to varg.ai
Connect your AI tools to varg.ai for image, video, speech, and music generation — no code required. The varg MCP server gives any MCP-compatible client the full varg catalog — every model, every option — with inline media previews.
Connect
Connect via Custom Connectors on [claude.ai](https://claude.ai).<Steps>
<Step title="Open connectors">
Go to [Settings → Connectors](https://claude.ai/customize/connectors) in Claude.
</Step>
<Step title="Add custom connector">
Click **+** → **Add custom connector**, then paste:
```
https://mcp.varg.ai/mcp
```
</Step>
<Step title="Authorize">
Click **Add**. A browser window opens — log in to your varg.ai account and click **Approve**. You're connected.
</Step>
</Steps>
Add to your `claude_desktop_config.json`:Tip
Available on Free, Pro, Max, Team, and Enterprise plans. Free users are limited to one custom connector.
```json theme={null}
{
"mcpServers": {
"varg": {
"url": "https://mcp.varg.ai/mcp"
}
}
}
```
Restart Claude Desktop. A browser window opens — log in and click **Approve**.
Connect via Custom Connectors on [chatgpt.com](https://chatgpt.com).Info
On macOS, the config file is at
~/Library/Application Support/Claude/claude_desktop_config.json.
<Steps>
<Step title="Open connectors">
Go to [Settings → Connectors](https://chatgpt.com/settings/connectors) in ChatGPT.
</Step>
<Step title="Add custom connector">
Click **Add custom connector**, then enter the server URL:
```
https://mcp.varg.ai/mcp
```
For **Registration method**, select **DCR** (Dynamic Client Registration). Leave Client ID and Client Secret blank.
</Step>
<Step title="Authorize">
Click **Add**. A browser window opens — log in to your varg.ai account and click **Approve**. You're connected.
</Step>
</Steps>
Add the remote MCP server to your project's `.mcp.json`:Tip
Available on Free, Plus, Pro, and Team plans. You can also use varg via the OpenAI Responses API by passing
server_urldirectly.
```json theme={null}
{
"mcpServers": {
"varg": {
"type": "http",
"url": "https://mcp.varg.ai/mcp"
}
}
}
```
Or add via the CLI:
```bash theme={null}
claude mcp add --transport http varg https://mcp.varg.ai/mcp
```
Claude Code will prompt you to authorize on first use.
Add to `.vscode/mcp.json` in your project:Info
For local mode without OAuth, use
npx @vargai/mcpwith stdio transport instead. See the Claude Code setup guide for the full skill installation.
```json theme={null}
{
"servers": {
"varg": {
"url": "https://mcp.varg.ai/mcp"
}
}
}
```
Or add globally via command line:
```bash theme={null}
code --add-mcp '{"name":"varg","url":"https://mcp.varg.ai/mcp"}'
```
VS Code will prompt you to authorize on first use.
Add to `.cursor/mcp.json` in your project:
```json theme={null}
{
"mcpServers": {
"varg": {
"url": "https://mcp.varg.ai/mcp"
}
}
}
```
Cursor will prompt you to authorize on first use.
Run the MCP server locally via stdio — no remote connection needed:
```bash theme={null}
npx @vargai/mcp
```
Uses your API key from `~/.varg/credentials` or `VARG_API_KEY` env var.
Log in first if you haven't:
```bash theme={null}
bunx vargai login
```
On the consent screen you also pick which account this connection works in — your personal one or a team. Each client you connect keeps its own. See Which account it works in.
Available tools
Generation
Start here. One tool per thing you want, with defaults chosen for you — describe the result and you get it in a single call.
| Tool | Description |
|---|---|
generate_image | An image from a description. Pass reference_image to edit an existing one instead |
generate_video | A video from a prompt, from an image (from_image), or from footage (from_video). Set with_audio for native sound |
generate_speech | Text to speech, in any language |
analyze_video | Watch a video by URL and get a structured report: summary, timeline with timestamps, transcript, on-screen text. 6¢, repeats are cached and free |
search_voices | Find a voice by name, by metadata, or by describing one (intent: "warm female narrator") |
generate_video({ prompt: "a fox in snow, cinematic", duration: 5, aspect_ratio: "16:9" })
Images and speech are fast, so they block until ready. Video returns a job_id immediately — pass wait: true to block instead.
The full catalog
The tools above cover the common cases with one model each. varg has hundreds, and each accepts its own options; a fixed tool per capability could only ever expose the fields they all share. So anything model-specific goes through the registry, where your assistant discovers the catalog at the moment it needs it.
| Tool | Description |
|---|---|
list_tools | List capabilities: image, video, speech, music, transcription, ffmpeg, render, pipeline |
get_tool | Get the input schema for a capability — with model set, the exact schema for that model, including provider-specific options |
call_tool | Run a capability. Returns a job id immediately; pass wait: true to block until the result is ready |
call_tool({
tool: "video",
input: { model: "kling-v3", prompt: "a fox in snow", duration: 5, aspect_ratio: "16:9" }
})
Your assistant calls list_tools once, get_tool when it needs a model's specifics, then call_tool. A model added to varg shows up immediately — there is no MCP release to wait for.
Jobs
| Tool | Description |
|---|---|
get_job | Check a job and collect its result |
list_jobs | List your recent jobs |
cancel_job | Stop a running job before it spends more credits |
Rendering and templates
| Tool | Description |
|---|---|
render_video | Render a multi-scene video from TSX using varg's component library |
find_templates | Browse and search published templates, or list your own with mine: true |
get_template | Get a template's details and TSX source |
use_template | Render a template as-is |
delete_template | Withdraw one of your own templates |
Note
Templates render as published — there is no variable substitution. To customise one, read its source with
get_template, edit the TSX, and pass it torender_video.
Catalog and cost
| Tool | Description |
|---|---|
list_models | All models across capabilities, with routes and price estimates |
estimate_cost | Price a generation before running it |
search_presets | Find voices and other presets. Describe what you want (intent: "warm female narrator") for ranked suggestions |
check_balance | Remaining credits on the account this connection works in |
Files and folders
| Tool | Description |
|---|---|
upload_file | Upload from a URL or base64 and get a hosted URL |
list_files / get_file / delete_file | Manage your files |
get_lineage | Recover how a file was made — job, tool, model, and exact input |
list_workspaces / create_workspace | Folders to keep a session's output together |
Folders belong to one account, so list_workspaces returns the ones in whichever team the connection works in. A personal folder is not visible from a team connection, and the reverse.
Teams
| Tool | Description |
|---|---|
list_teams | The teams you can work in, and which one this connection uses |
get_current_team | Where this connection is working right now, and whether that is still valid |
set_team | Point this connection at a team, or back at your personal account |
See Which account it works in.
Which account it works in
Each connection is bound to one account — your personal one, or a team you belong to. Generations are billed to that account's balance and files land in its library.
The binding is per connection, not per user. Claude Desktop, Cursor, and VS Code each register separately, so each gets its own. One agent can work in Marketing while another works in Product.
You choose when you connect. The consent screen has a Works in picker listing your teams, defaulting to your personal account; if you are in no teams, it shows Personal and there is nothing to pick.
To change it later, ask the assistant:
"switch to the Marketing team" → set_team
"which team are you working in?" → get_current_team
set_team takes effect immediately, including for work already running, and is remembered for future sessions. It chooses among teams you are already in — it cannot grant you access to a new one. It also takes an optional workspace_id, the folder new output is filed into when a call does not name one. Settings → Connected Apps shows each connection's account read-only.
Note
If you are removed from a team a connection is bound to, that connection stops running anything and says so. It does not quietly fall back to your personal account — that would spend the wrong balance. Use
list_teamsandset_teamto move it, or ask a team owner to restore your membership.
Info
This applies to OAuth connections. In local stdio mode (
npx @vargai/mcp) the account is whichever one your API key belongs to.
How it works
Your AI tool (Claude, ChatGPT, VS Code, Cursor)
│
│ OAuth 2.1 + PKCE
▼
mcp.varg.ai (MCP server — resource server)
│
│ your access token, forwarded
▼
api.varg.ai (varg API, /v2)
│
▼
AI providers (fal, ElevenLabs, Higgsfield, HeyGen, PiAPI, etc.)
Connecting for the first time runs a standard OAuth 2.1 authorization code flow with PKCE:
- Your client discovers the authorization server from
mcp.varg.ai - It registers itself automatically — no client id to copy
- You log in to varg.ai, pick which account it works in, and approve on a consent screen
- Your client receives a short-lived access token and a refresh token, and renews on its own
No API key is created. The connection is a grant you can see and revoke under Settings → Connected Apps, separately from any API keys you manage yourself. Revoking stops the client renewing; whatever token it holds expires shortly after.
A connected app can generate media and spend credits from the account it is bound to. It cannot create API keys, change your account settings, or reach admin functions — those are restricted to your own signed-in sessions. Membership is re-checked on every request, so a connection bound to a team you have left can spend nothing.
Inline media previews
generate_image, generate_video, generate_speech, call_tool, get_job, render_video, and use_template return an inline preview in your chat. It shows progress while the job runs, then picks a player from the result:
- Images — displayed inline with click-to-open fullscreen
- Videos — embedded player with play/pause controls
- Audio — compact player with progress bar and seek
Multi-output jobs (an ffmpeg slice, a multi-image model) preview the first file and report how many others there are.
These work in Claude Desktop, claude.ai, and VS Code (via MCP Apps). In clients without MCP Apps support the tools still return the result URLs as normal text.
Pricing
varg uses a credit system. 1 credit = $0.01 USD.
| Generation | Credits | Cost |
|---|---|---|
| Image (Flux Schnell) | 5 | $0.05 |
| Image (Flux Pro) | 10 | $0.10 |
| Image (Nano Banana Pro) | 5 | $0.05 |
| Image (Recraft v3) | 10 | $0.10 |
| Image (Recraft v4 Pro) | 30 | $0.30 |
| Image (Grok Imagine) | 3 | $0.03 |
| Video (Kling v3, 5s) | 150 | $1.50 |
| Video (Kling v3 Standard, 5s) | 100 | $1.00 |
| Video (Wan 2.5, 5s) | 80 | $0.80 |
| Video (Minimax, 5s) | 80 | $0.80 |
| Video (Seedance 2, 5s) | 250 | $2.50 |
| Video (LTX-2, 5s) | 50 | $0.50 |
| Speech (ElevenLabs v3) | 25 | $0.25 |
| Speech (ElevenLabs Turbo) | 20 | $0.20 |
| Music | 30 | $0.30 |
| Lipsync (Sync v2 Pro) | 80 | $0.80 |
| Lipsync (OmniHuman) | 100 | $1.00 |
| Transcription (Whisper) | 10 | $0.10 |
| Transcription (Groq Whisper Turbo) | 3 | $0.03 |
| FFmpeg Trim | 5 | $0.05 |
| FFmpeg Resize | 5 | $0.05 |
| FFmpeg Slice | 5 | $0.05 |
| FFmpeg (custom command) | 5 | $0.05 |
| Probe Media | 5 | $0.05 |
Cached results are free. Use check_balance to see the remaining credits of the account the connection works in.
This documentation is built and hosted on Mintlify, a developer documentation platform.