visualgen-mcp
An MCP server that enables Claude Code to generate images and short videos using Google's Gemini API (Imagen 4 for stills, Veo 3.1 for video). It integrates directly into development workflows, allowing AI assistants to create visual assets and reference them in code without context switching.
README
visualgen-mcp
An MCP server that lets Claude Code generate images and short videos via Google's Gemini API (Imagen 4 for stills, Veo 3.1 for video).
Why this exists
I was building websites with Claude Code and kept hitting the same gap. Claude would design a great layout, then say "add your hero image here." I'd go generate one somewhere else, come back, wire it up, iterate, repeat. The context switching was the whole cost. So I built this MCP server to close the loop. Claude writes the prompt, the server hits Veo or Imagen, the file lands in the project directory, and Claude references it in the code it's already writing. One session, no handoffs.
I'm open-sourcing it because other people are solving the same problem, and nobody should have to build this twice.
Demo
Claude Code generating visuals with visualgen-mcp and wiring them into the page.
https://github.com/user-attachments/assets/34d25755-cd4c-47b0-a0cb-056b9ed8b783
What it does
Six tools, exposed over stdio:
submit_video(prompt, model, aspect_ratio, resolution, negative_prompt?, image_path?)— submit a Veo 3.1 job. Returns ajob_idinstantly.check_video(job_id)— poll a job. When the video is ready, the server downloads it and returns the path.list_videos()— list MP4s in the output directory, newest first.generate_image(prompt, model, aspect_ratio, negative_prompt?)— synchronous image generation (typically under 10s). Returns the PNG path.list_images()— list PNGs in the output directory.get_pricing()— return current Gemini rates so Claude can warn you before expensive runs.
What it costs
Gemini API rates as of 2026-04-22. Verify at the official pricing page before production use.
| Model | Cost |
|---|---|
| Veo 3.1 Standard (720p / 1080p) | $0.40 / second |
| Veo 3.1 Standard (4k) | $0.60 / second |
| Veo 3.1 Fast (720p) | $0.10 / second |
| Veo 3.1 Fast (1080p) | $0.12 / second |
| Veo 3.1 Fast (4k) | $0.30 / second |
| Veo 3.1 Lite (720p) | $0.05 / second |
| Veo 3.1 Lite (1080p) | $0.08 / second |
| Imagen 4 Fast | $0.02 / image |
| Imagen 4 Standard | $0.04 / image |
| Imagen 4 Ultra | $0.06 / image |
| Gemini 2.5 Flash Image (Nano Banana) | $0.039 / image |
Install
For end users:
uvx visualgen-mcp
For contributors (from source):
git clone https://github.com/1RaghavM/visualgen-mcp.git
cd visualgen-mcp
uv sync
uv run python -m visualgen_mcp
Configure
Run the interactive setup once. It saves your profile to ~/.config/visualgen-mcp/config.toml (chmod 600) and optionally wires up .mcp.json in the current project directory.
uvx visualgen-mcp init
You'll be prompted for:
- Gemini API key — get one at aistudio.google.com/apikey. Veo requires a paid plan; Imagen and Nano Banana work on the free tier but with stricter rate limits.
- Output directory — where generated PNGs and MP4s land. Defaults to
~/visualgen-output. The server creates it if it doesn't exist, and tool responses return absolute paths so Claude can reference the files in the code it writes. - Default video tier, image model, and aspect ratios — used when Claude calls a tool without specifying these.
Re-run visualgen-mcp init any time to update the profile. Per-project overrides still work: a GEMINI_API_KEY or OUTPUT_DIR set in a local .env file or in .mcp.json's env block takes precedence over the profile.
Use with Claude Code
Either run visualgen-mcp init inside your project (it offers to write this for you), or add this to .mcp.json at the root of your project:
{
"mcpServers": {
"visualgen": {
"command": "uvx",
"args": ["visualgen-mcp"]
}
}
}
The server reads your API key and defaults from ~/.config/visualgen-mcp/config.toml. If you want to override them for a specific project, set GEMINI_API_KEY or OUTPUT_DIR in .mcp.json's env block — env vars take precedence over the profile.
Run /mcp inside Claude Code to confirm the server is connected. You should see visualgen listed with six tools.
The /visualgen skill
The server ships with a Claude Code skill that teaches Claude when to use each tool, how to structure prompts for common web-design asks, and when to confirm costs with you. If you ran visualgen-mcp init, it already offered to install it. Otherwise:
cd your-project
cp -r /path/to/visualgen-mcp/.claude/skills/visualgen ./.claude/skills/visualgen
Once installed, /visualgen hero video, modern SaaS landing, calm mood kicks off the whole pipeline in one shot — Claude picks the template, builds the prompt, submits the job, and wires the returned file into your code. You can also just ask for visuals in natural language — the skill auto-loads whenever Claude is about to call a visualgen-mcp tool.
The skill is opinionated about cost: Veo standard and any image-to-video call always ask you to confirm before spending. Everything else — all image generation plus Veo lite/fast text-to-video — proceeds silently.
Use with other MCP clients
Claude Desktop uses the same pattern. Add an entry under mcpServers in ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows). Any stdio-transport MCP client that supports tool calls works. There is no HTTP or auth layer — the server is intended for local use.
Example session
A real run from a landing-page project. Elided lines marked ....
> Build me a hero video loop for the top of the page. Something that suggests "city at night, calm, slow."
I'll generate that with the visualgen server.
submit_video(
prompt="A slow drone shot over a city skyline at night, warm window lights,
occasional headlights tracing streets below, calm mood, cinematic",
model="fast",
aspect_ratio="16:9",
resolution="1080p"
)
→ { "job_id": "f3c1...", "status": "submitted", "model": "veo-3.1-fast-generate-preview",
"estimated_seconds": 60 }
I'll check back in a minute.
check_video("f3c1...")
→ { "status": "pending", "elapsed_seconds": 25 }
... wait ...
check_video("f3c1...")
→ { "status": "complete",
"path": "/Users/.../landing/generated/veo-fast-20260422T191203Z.mp4",
"duration_seconds": 8.0 }
Writing it into the hero section:
Edit: src/components/Hero.tsx
<video
autoPlay
muted
loop
playsInline
className="absolute inset-0 h-full w-full object-cover"
src="/generated/veo-fast-20260422T191203Z.mp4"
/>
One prompt, one generation, file in the project, code updated.
Tool reference
submit_video
| Param | Type | Default | Notes |
|---|---|---|---|
prompt |
str |
(required) | Video description. |
model |
str |
"fast" |
"lite", "fast", or "standard". |
aspect_ratio |
str |
"16:9" |
"16:9" or "9:16". |
resolution |
str |
"720p" |
"720p", "1080p", "4k". "4k" rejected for "lite". |
negative_prompt |
str | None |
None |
Text describing what to avoid. |
image_path |
str | None |
None |
Absolute path to a PNG/JPEG/WebP starting frame. |
Returns {"job_id": str, "status": "submitted", "model": str, "estimated_seconds": int}.
check_video
| Param | Type | Default |
|---|---|---|
job_id |
str |
(required) |
Returns one of:
{"status": "pending", "elapsed_seconds": int}{"status": "complete", "path": str, "duration_seconds": float}{"status": "failed", "error": str}
list_videos
No parameters. Returns list[{"path": str, "size_bytes": int, "created_at": str}], newest first.
generate_image
| Param | Type | Default | Notes |
|---|---|---|---|
prompt |
str |
(required) | Image description. |
model |
str |
"nano-banana" |
"nano-banana" or "imagen". |
aspect_ratio |
str |
"16:9" |
"1:1", "16:9", "9:16", "4:3", "3:4". |
negative_prompt |
str | None |
None |
Ignored by Nano Banana. |
Returns {"path": str, "model_used": str}.
list_images
No parameters. Returns list[{"path": str, "size_bytes": int, "created_at": str}], newest first.
get_pricing
No parameters. Returns a dict of current rates per model, a last_updated date, and a link to the source. Hardcoded — the server does not call an API for this.
Limits and gotchas
- Veo clips are capped at 8 seconds. This server always requests 8 seconds.
- There is no free tier for Veo. Every successful generation is billed.
- Generated videos are deleted from Google's servers 48 hours after generation. Download them (via
check_video) within that window. - The job store is in-memory. If you restart the server, pending jobs are lost. See the TODO in
src/visualgen_mcp/jobs.pyfor the SQLite migration path. - Some prompts are rejected by Google's content filters. You get
{"status": "failed", ...}back, not a crash. - Nano Banana (
gemini-2.5-flash-image) is faster and cheaper than Imagen 4 but does not accept anegative_prompt. Use Imagen 4 when you need one. list_videosandlist_imagesonly see files inOUTPUT_DIR. They do not recurse or cross directories.
Contributing
See CONTRIBUTING.md.
License
MIT. See LICENSE.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。