RunComfy MCP
fficial remote MCP server for RunComfy's Serverless API (ComfyUI): manage GPU deployments and run async image/video inference.
Documentation
RunComfy MCP
MCP server for the RunComfy Serverless API (ComfyUI). Manage deployments, run inference, and retrieve results from AI assistants like Claude, Cursor, and Windsurf.
Endpoint: https://mcp.runcomfy.com/mcp
Docs: docs.runcomfy.com/mcp
What it does
10 tools that mirror docs.runcomfy.com/serverless 1:1:
| Category | Tools |
|---|---|
| Deployment management | list_deployments, get_deployment, create_deployment, update_deployment, delete_deployment |
| Inference | submit_request, get_request_status, get_request_result, cancel_request |
| Advanced | call_instance_proxy |
Quick setup
Claude Code
claude mcp add runcomfy \
--transport streamable-http \
https://mcp.runcomfy.com/mcp \
--header "Authorization: Bearer <YOUR_RUNCOMFY_TOKEN>"
Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"runcomfy": {
"url": "https://mcp.runcomfy.com/mcp",
"headers": {
"Authorization": "Bearer <YOUR_RUNCOMFY_TOKEN>"
}
}
}
}
Windsurf
Add to Windsurf Settings > MCP:
{
"mcpServers": {
"runcomfy": {
"serverUrl": "https://mcp.runcomfy.com/mcp",
"headers": {
"Authorization": "Bearer <YOUR_RUNCOMFY_TOKEN>"
}
}
}
}
Get your API token from your Profile page.
Architecture
MCP Client ──Bearer token──> Cloudflare Worker (/mcp)
│
▼
Cloudflare Container
(Python FastMCP app)
│
▼
api.runcomfy.net
(using caller's token)
- Cloudflare Worker (
src/index.ts) — thin proxy: CORS, body size check, forwards the caller's token to the container. No auth logic —api.runcomfy.nethandles authentication. - Python container (
server.py) — FastMCP app with 10 tools. Uses the caller's token (forwarded viax-runcomfy-user-tokenheader) for all outbound API calls. Each user sees only their own deployments. - Cloudflare Container auto-starts on first request, sleeps after 10 minutes idle.
Project layout
src/index.ts Cloudflare Worker entrypoint
server.py MCP tool definitions (10 tools)
runcomfy_client.py RunComfy API client (serverless endpoints)
container_app.py ASGI middleware (request IDs, token forwarding)
container_entrypoint.py Uvicorn startup
container_runtime.py Env validation, structured logging
wrangler.jsonc Cloudflare Worker + Container config
Dockerfile Container image
.env.example Local dev config
Local development
# Python 3.11+
python3.11 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# Set RUNCOMFY_API_KEY in .env
python -m container_entrypoint
Local endpoints:
http://127.0.0.1:8000/healthzhttp://127.0.0.1:8000/mcp
In local mode (no Worker), the Python app uses RUNCOMFY_API_KEY from .env for all outbound calls.
Deploy
Requires Cloudflare Workers Paid plan with Containers enabled.
npm install
# Set the API key secret (one-time)
npx wrangler secret put RUNCOMFY_API_KEY
# Deploy
CLOUDFLARE_ACCOUNT_ID=<your-account-id> npx wrangler deploy
The MCP endpoint goes live at https://mcp.runcomfy.com/mcp (custom domain configured in wrangler.jsonc).
Environment variables
Worker secrets (set via wrangler secret put)
| Name | Required | Description |
|---|---|---|
RUNCOMFY_API_KEY | Yes | Fallback API key for the container |
Worker vars (in wrangler.jsonc)
| Name | Default | Description |
|---|---|---|
CONTAINER_INSTANCE_NAME | runcomfy-unified | Durable Object instance name |
CONTAINER_STARTUP_TIMEOUT_MS | 15000 | Max wait for container start |
CONTAINER_PORT_READY_TIMEOUT_MS | 30000 | Max wait for port ready |
MCP_MAX_BODY_BYTES | 1048576 | Max request body size |
RUNCOMFY_SERVERLESS_BASE_URL | https://api.runcomfy.net | Serverless API base URL |
Local dev (.env file)
| Name | Required | Description |
|---|---|---|
RUNCOMFY_API_KEY | Yes | Your RunComfy API token |
RUNCOMFY_SERVERLESS_BASE_URL | No | Override base URL (default: https://api.runcomfy.net) |
RUNCOMFY_MCP_MOUNT_PREFIX | No | Path prefix for MCP mount (default: empty) |