Run 80+ AI models and 80+ processing tools on cnaps.ai with a single natural-language request — directly from Claude.
1. What is the CNAPS.ai MCP Server?
The Model Context Protocol (MCP) is a standardized interface that lets AI assistants call external services and tools directly. Once you connect the CNAPS.ai MCP Server, Claude can build and run CNAPS.ai's image, video, and text pipelines mid-conversation — no dashboard, no manual node-wiring.
Already using ComfyUI? See how to use the Comfy and CNAPS Studio MCP servers together.
💡 Core value Describe what you want in plain language ("upscale this photo 4x", "remove the person in the background", "배경 제거해줘") and the assistant selects the right model(s), wires them into a flow, and runs it for you.
At a glance
Endpoint | https://mcp.cnaps.ai/mcp |
Transport | Streamable HTTP |
Auth | OAuth (CNAPS.ai account) or x-api-key |
Tools | 34 |
Models | 80+ AI models and 80+ processing tools hosted and external |
Client | Claude (Claude.ai and Claude Desktop), n8n, Zapier |
Listed on | MCP Registry ( ai.cnaps/studio) · Smithery · Glama |
Languages | Task descriptions accepted in English, Korean, and others |
2. Quick Start (5 minutes)
Step 1: Connect the MCP Server
Claude.ai (Web)
- Go to Customize → Connectors
- Click + Add → Add custom connector
- Enter the server URL:
https://mcp.cnaps.ai/mcp - Complete authentication with your CNAPS.ai account when prompted. Before you approve. The consent screen shows two things you can't see anywhere else: the redirect host (where you'll be sent back to — if it isn't the assistant you meant to connect, close the window) and an unverified-app warning when it applies. Anyone can build an MCP client against our server; a warning means we haven't verified this one.
Claude Desktop
Add the following to claude_desktop_config.json:
json
{
"mcpServers": {
"cnaps-ai": {
"url": "https://mcp.cnaps.ai/mcp",
"transport": "http"
}
}
}📁 Config file location
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json- Windows:
%APPDATA%\Claude\claude_desktop_config.json
Step 2: Your first run
Once connected, just ask:
💬 "Upscale this image 4x at the highest quality you can."
The assistant will typically:
upload_file()with no arguments → gets an upload link → shows it to youupload_file({ token })→ waits for your upload → returns the file URLsuggest_flow({ task: "upscale image 4x, highest quality" })→ gets the recommended model and parameterscreate_flow({ nodes, parameters, input_files, run: true })→ builds and starts in one callget_flow({ flow_id, view: "status" })→ polls until complete, returns the output URL
3. Tool Reference (34 tools)
The server exposes 34 tools, and the set is identical whether you connect via OAuth or an x-api-key. Workspace API key management is deliberately not among them — keys are created, regenerated, and deleted in the web console only, so an automated agent cannot issue itself a key or delete one your integrations depend on.
3.1 Discovery & planning
Tool | Description |
suggest_flow | Recommended first step for any request. Turns a natural-language task into an ordered model list with parameter recommendations and wiring. Handles parameter inference ("4K" → scale_factor=4). Use this before list_models. Params: task (required), input_type, output_type. |
preview_flow | Checks whether a sequence of models can be wired together and shows the flow that would be produced — without creating anything. Params: nodes (required), include_optional. |
find_compatible_models | Finds models that can connect to a given model. direction: "downstream" (default, what can come AFTER) or "upstream" (what can come BEFORE). Params: model_id (required), direction. |
list_models | Lists/filters the model catalog. Params: category, sub_category, input_type, output_type, tag. |
get_model | Full details for one model: inputs, outputs, parameters, plan requirements. Params: model_id (required). |
get_model_parameters | Configurable parameter schema for one model. Params: model_id (required). |
list_llm_providers | Lists external LLM providers and whether the workspace has API keys configured. No params. |
3.2 Flow creation & editing
Tool | Description |
create_flow | Creates a flow from an ordered list of models. Input/output nodes and connections are generated automatically by matching port types; the original input is shared (fan-out) when several models need it. Set run: true to build and start in the same call. Params: nodes (required), run, name, parameters, connections, input_files, include_optional. |
update_flow | Renames a flow, replaces its tags, and/or updates node parameters — any combination in one call. Node parameters are merged (specify only what changes); tags replace the existing set. Cannot update a running flow. Params: flow_id (required), name, tags, node_updates. Can also pin a node’s result (re-runs reuse it instead of re-executing) and set include_in_fork on input nodes. |
edit_flow | Changes the structure of an existing flow in place: add or remove nodes, swap the model on a node, and connect or disconnect ports. All operations in one call are applied as a batch — either every one lands or none does. Read the flow with get_flow first to get node IDs, and get_model for port layouts before wiring. Params: flow_id (required), operations (required). |
duplicate_flow | Deep copy with fresh state (no results). Params: flow_id (required), name. |
delete_flow | Moves a flow to trash. Restorable. Params: flow_id (required). |
restore_flow | Restores a flow from trash. Params: flow_id (required). |
⚠️update_flowvsedit_flow—update_flowchanges a flow's name, tags, and node parameter values.edit_flowchanges the graph itself: nodes, models, and connections. Neither requires creating a new flow.
3.3 Execution
Tool | Description |
run_flow | Executes a flow once, asynchronously. inputs is a JSON string mapping input node IDs to arrays — file URLs for image/video/sound nodes, text content for text nodes. Params: flow_id (required), inputs. If the run is refused, the response says why. |
run_batch | Runs a flow across multiple input sets. Returns a batch_run_id. Params: flow_id (required), inputs (required). |
get_batch_status | Progress and output URLs for a batch run. Params: batch_run_id (required). |
cancel_flow | Sends a stop signal; the flow halts after the current processing step. Confirm with get_flow(view="status"). Params: flow_id (required). |
3.4 Reading & diagnosing
Tool | Description |
get_flow | Reads a flow. Pick the view that answers your question: "detail" (default — raw nodes, connections, parameters; use this to discover node IDs), "summary" (plain-language description), "status" (execution state and output file URLs and, for nodes still running, what each one is waiting on), "validation" (pre-run problems: trashed, running, missing inputs, disconnected nodes). Params: flow_id (required), view. |
list_flows | Lists flows in the workspace. Params: page, state ("activated" default / "trashed"), search. |
diagnose_error | Analyzes a failed run: root cause, the failing node, a concrete fix, confidence level. Use whenever get_flow(view="status") shows a failure. Params: flow_id (required), error_context. |
optimize_flow | Rule-based performance/cost suggestions (move upscale nodes to the end, avoid resolution overflow, remove redundant processing, swap in better models). Each suggestion carries a structured patch ( move_node, insert_node, replace_model). Advisory only — nothing changes until you apply the patches you want with edit_flow. include_llm_analysis: true adds Haiku analysis (+0.5–1s; default is rule-engine only, ~50ms). Params: flow_id (required), language ("en"/"ko"), include_llm_analysis. |
3.5 Files
Tool | Description |
upload_file | Gets a file into CNAPS.ai. Two paths, chosen by what you pass: (1) user has a public HTTP/HTTPS URL → pass file_url, registered directly; (2) file is on the user's machine → pass nothing, receive an upload link to show them, then call again with the returned token to wait (up to 15 minutes) and get the URLs. Supports png/jpg/webp/RAW/tiff/heic, mp4/mov/webm/mpeg/avi/flv/wmv/3gp, wav/mp3/m4a/aac/ogg/flac, txt. Params: file_url, filename, token. One upload link accepts up to 20 files, dropped all at once or in several batches. |
⚠️ You cannot send bytes from the chat through MCP. Even when the assistant can see an image in the conversation, it must use the link flow.
3.6 Community & templates
Tool | Description |
search_community | Searches publicly shared flows. Params: query, tags, input_type, output_type, sort ("popular" default / "recent" / "most_liked" / "most_forked"), page. |
get_community_post | Post details and engagement stats — preview before forking. Params: post_id (required). |
fork_community_flow | Copies a community flow into your workspace. Params: post_id (required). |
create_community_post | Publishes one of your flows as a community post (snapshot; others can fork it). Params: source_flow_id (required), title (required), content, tags, thumbnail_url. |
list_templates | Lists curated, pre-built flow templates. No params. |
fork_template | Copies a template into your workspace. Params: template_id (required). |
3.7 Account & workspace
Tool | Description |
get_me | Your user profile (ID, email, name). No params. |
get_workspace_info | Workspace subscription plan, member count, seats. No params. |
get_usage | GPU usage percentage, plan limits, reset schedule. No params. |
get_notifications | Notifications (likes, comments, forks, follows, mentions) plus unread count. Cursor-paginated — use next_cursor for subsequent pages. Params: cursor. |
mark_notifications_read | Marks one notification read, or all if notification_id is omitted. Params: notification_id. |
report_issue | Reports a tool failure or point of confusion to the CNAPS.ai team. Params: tool_name (required), error_message (required), plus user_intent, category, severity, attempted_input, steps_taken, retry_count, description, workaround_found, workaround_description, suggested_fix. |
📌 API keys are not managed here. Create, regenerate, and delete workspace API keys in the web console under API Key in the left sidebar. No MCP tool can do this.
4. Core Concepts
4.1 Flows
A flow is the workflow object: a graph of input, model, and output nodes with explicit connections.
You almost never build that graph by hand. Pass create_flow an ordered list of model IDs and it generates the input/output nodes and wires everything by matching port types (a model's image output connects to the next model's image input). The original input is shared via fan-out when several models need it.
javascript
// Shorthand — the common case
create_flow({ nodes: '["SISR-PiSA-SR"]' })
// Full form — when you need explicit node IDs or inline parameters
create_flow({ nodes: '[{"id":1,"type":"ai_model","model_id":"SISR-PiSA-SR","parameters":{"scale_factor":4}}]' })Use the connections parameter only to override the automatic port-type wiring.
parameters is keyed by node ID. The parameters object uses node IDs as keys, not model IDs. When supplying parameter overrides, assign explicit IDs in nodes and use those same IDs in parameters. This also lets you configure multiple nodes that use the same model independently.
4.2 The include_optional decision
Both create_flow and preview_flow take include_optional (default true): every optional model input port also gets its own loader node.
Decide this yourself from the task — don't ask the user.
- Set
falsewhen the goal clearly uses only some modalities (e.g. "summarize this text" on a text+optional-image model → skip the image loader), or when the user'sinput_filescover only the required ports. - Keep
truewhen the goal is genuinely multimodal, when the user supplied inputs for optional ports, or when you're unsure — so no modality is silently dropped.
4.3 Recommended build order
suggest_flow({ task: "..." })— let it pick the models and parameterspreview_flow(optional) — verify wiring if you assembled the model list yourselfcreate_flow({ ..., run: true })— build and start in one callget_flow({ flow_id, view: "status" })— poll untilcompletedorfaileddiagnose_error({ flow_id })— if it failed
4.4 Getting files in
javascript
Resulting URLs go into create_flow's input_files or run_flow's inputs.
4.5 Asynchronous polling
All runs are asynchronous.
javascript
while (true) {
const s = await get_flow({ flow_id, view: "status" })
if (s.state === "completed") break
if (s.state === "failed") { await diagnose_error({ flow_id }); break }
await sleep(3000)
}💡 GPU-heavy models (QWEN Edit, DeblurDiff, SeedVR2, video generation) can take 1–15 minutes.
5. Model Catalog Highlights
The catalog is queryable live — always confirm parameters with get_model_parameters before assuming defaults.
⚠️ Filter bytag, not by an inventedsub_category.sub_categoryvalues are the platform's own strings ("Image Upscaling","Video Upscaling","Object Detection", …). Guessing at a label like"Super Resolution"returns nothing. When in doubt, filter bytag(e.g."super-resolution","deblur","inpainting") or byinput_type/output_type.
Upscaling
Model ID | Scales | Notes |
SISR-PiSA-SR | 2x / 4x | Sharpest of the hosted image upscalers. ~50s typical, ~5GB VRAM. Avoid on inputs >2K. Defaults to 2x — specify scale_factor: 4 explicitly. |
SISR-SMFANet-Plus | 2x / 3x / 4x | Fastest by a wide margin (<0.5M params). ~0.1s at 512px 2x, ~7s at 2048px 4x, under 1.5GB VRAM even at 8192px output. The right choice for large inputs. |
SISR-Swin2SR-Classical | 2x / 4x | Balanced quality/speed. 10–30s. |
SISR-SwinIR-Classical-DIV2K-M | 2x / 3x / 4x / 8x | Widest scale range; 8x is unique to this model. 10–30s. |
VideoUpscaling-SeedVR2-7B | to 4K | Highest video quality. ~16GB VRAM, 5–15 min. |
VideoUpscaling-SeedVR2-3B | to 4K | Lighter/faster than 7B. ~7GB VRAM, 2–5 min. |
VideoUpscaling-FlashVSR-v1.1 | 4x only | Fastest video path. Needs ≥21 frames; input dimensions should be multiples of 32. |
VideoUpscaling-SparkVSR | 2x / 3x / 4x | Accepts an optional high-res reference image — chain SISR-PiSA-SR or an image generator upstream to inject detail. ≤192 frames, ≤1920×1080. |
For every other category (restoration, generation & editing, detection & segmentation, OCR & VLM, video generation, external cloud models, and the supporting tool nodes), query list_models with the appropriate tag or input_type/output_type filter rather than relying on a hardcoded list.
External (cloud) models
llm-claude, llm-openai, llm-gemini, llm-openai-gpt-image, llm-gemini-nano-banana-pro, llm-gemini-veo, llm-gemini-video, llm-gemini-omni, llm-gemini-tts ,llm-gemini-lyriallm-gemini-transcriberequire the corresponding provider's API key on the workspace. Check with list_llm_providers first.
6. Example Recipes
6.1 4x upscale
💬 "Upscale this photo 4x, highest quality."
javascript
create_flow({
nodes: '[{"id":1,"type":"ai_model","model_id":"SISR-PiSA-SR"}]',
parameters: '{"1":{"scale_factor":4}}',
input_files: '["https://storage.../photo.png"]',
run: true
}⚠️ Without an explicitscale_factor: 4,SISR-PiSA-SRstays at its 2x default. ⚠️ On a 2K+ input, useSISR-SMFANet-Plusinstead.
6.2 Background removal
💬 "Cut this person out with a clean transparent background."
javascript
create_flow({
nodes: '[{"id":1,"type":"ai_model","model_id":"Segmentation-BiRefNet"}]',
parameters: '{"1":{"extract_foreground":true}}',
input_files: '["https://storage.../photo.png"]',
run: true
})6.3 Contract OCR → summary (multi-model chain)
💬 "Pull the text from this contract photo and summarize the key clauses in 3 lines."
javascript
The OCR node's text output wires into the LLM node's text input automatically.
6.4 Batch processing
💬 "Upscale all five of these photos the same way."
javascript
// Reuse an existing flow — get its input node ID from get_flow(view: "detail")
run_batch({
flow_id: "my-upscale-flow",
inputs: '{"1001":["https://.../img1.jpg","https://.../img2.jpg"]}'
}) // → batch_run_id
get_batch_status({ batch_run_id })6.5 Start from the community instead of from scratch
javascript
search_community({ query: "background removal", sort: "most_forked" })
get_community_post({ post_id }) // preview
fork_community_flow({ post_id }) // → your own flow_id
run_flow({ flow_id, inputs: '{"1001":["https://..."]}' })7. Tips & Common Mistakes
Model selection cheat sheet
Situation | Model |
Best-quality upscale, input <2K | SISR-PiSA-SR (scale_factor: 4) |
Upscale a large (2K+) image | SISR-SMFANet-Plus |
Balanced upscale | SISR-Swin2SR-Classical |
8x upscale | SISR-SwinIR-Classical-DIV2K-M |
Highest-quality video upscale | VideoUpscaling-SeedVR2-7B |
Fastest 4x video upscale | VideoUpscaling-FlashVSR-v1.1 |
Common mistakes
- ⚠️ Reaching for
list_modelsfirst.suggest_flowhandles model selection and parameter inference — start there. - ⚠️ Expecting
update_flowto change the graph. It changes parameters, name, and tags only — useedit_flowto add, remove, or rewire nodes. Rebuilding withcreate_flowis not necessary. - ⚠️ Calling
update_flowon a running flow. It is rejected —cancel_flowfirst. - ⚠️ Guessing at
sub_categorystrings. Filter bytaginstead. - ⚠️ Trying to pass a chat attachment through MCP. Always use the
upload_filelink flow. - ⚠️ Not specifying
scale_factor—SISR-PiSA-SRstays at 2x. - ⚠️ Running
PiSA-SRorDeblurDiffon 2K+ images — very slow or OOM. - ⚠️ Referencing an
llm-*model without checkinglist_llm_providersfor a configured API key. - ⚠️ Treating
optimize_flowoutput as auto-applied. The patches are advisory — apply them withedit_flow.
8. FAQ
Can I attach an image directly in the chat?
No. MCP cannot transfer file bytes from the chat. Use upload_file — pass file_url if the file already has a public URL, or call it with no arguments to get an upload link.
How do I run the same flow again?
Create it once, then reuse the same flow_id with run_flow. Use run_batch for multiple input sets in one go.
How do I change which models are in a flow?
Use edit_flow with a replace_model operation. Read the flow with get_flow first to get the node ID. edit_flow also adds and removes nodes and rewires ports; update_flow covers parameters, name, and tags only.
A run failed — how do I debug it?
get_flow(view: "status") for the error, then diagnose_error({ flow_id }) for a root cause and suggested fix. Common causes: GPU unavailability, or an input exceeding a model's supported resolution.
How do I add Claude, GPT, or Gemini to a flow?
Register the provider's API key under your avatar → Workspace Settings → Integrations, confirm with list_llm_providers, then reference llm-claude / llm-openai / llm-gemini as a model ID.
Something in this guide is wrong or a tool is confusing.
Ask the assistant to call report_issue — it routes straight to the CNAPS.ai team with the full call context.
9. Managing your connection
Connecting an assistant with OAuth
Technical details. The server supports OAuth 2.1 with dynamic client registration and PKCE (S256), advertised at /.well-known/oauth-protected-resource. Available scopes: models:read, flows:read, flows:write, files:write, batches:read, batches:write, workspace:read, community:write.
When you connect an assistant to CNAPS.ai with OAuth, a consent screen opens. Read it before you approve — it tells you two things you can't see anywhere else:
- The redirect host. Where you will be sent back to after approving. If that host isn't the assistant you meant to connect, stop and close the window.
- An unverified-app warning, when it applies. Anyone can build an MCP client against our server. A warning means we have not verified this one; it does not mean the app is malicious, but it does mean you are trusting it on your own judgment.
Approving gives that app the ability to act on your account — create and run flows, upload and generate content, and consume your usage capacity.
Anything the assistant does counts as you
Under Section 6A of the Terms of Service, an action taken through a connected assistant is treated as your own action: creating, running, or modifying flows, uploading or generating content, incurring usage or charges, or invoking any model. The Prohibited Activities in Section 4 apply to it in full.
That cuts both ways. It means your flows and results are genuinely yours regardless of which interface made them — and it means you are responsible for what a connected assistant does with your account, including charges it runs up. Review what you are approving, and connect only assistants you actually use.
Seeing and removing connected apps
Your connected apps are listed under your avatar → Account Settings → Security → Connected apps. Each row shows the app and its domain, the workspace it can reach, its access scopes (Show all), and when it was last used. Disconnect anything you don't recognize or no longer use.
Disconnecting revokes that app's tokens immediately — its access stops at once, not at the next token expiry. Deleting an OAuth client does the same. Disconnecting stops future requests; it does not undo or delete anything the app already did.
An API key is a separate thing: keys are created, regenerated, and deleted under API Key in the left sidebar, and key management is deliberately not exposed as an MCP tool, so a connected assistant cannot issue itself a key or delete one you depend on.
10. Support & policies
- Questions or issues: support@cnaps.ai
- In-chat reporting: ask Claude to use the report_issue tool
- Privacy Policy · Terms of Service
- Using n8n or Zapier? See Connect CNAPS.ai to n8n and Connect CNAPS.ai to Zapier.
© 2026 CNAPS.ai Inc. · mcp.cnaps.ai · cnaps.ai
