Run 70+ AI models and 50+ 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.
💡 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 | 33 |
Models | 70+ AI models and 50+ processing tools on-device and external |
Client | Claude (Claude.ai and Claude Desktop) |
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 claude.ai → Settings → Connectors
- Click Add custom connector
- Enter the server URL:
https://mcp.cnaps.ai/mcp- Complete authentication with your CNAPS.ai account when prompted.
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 (33 tools)
The server exposes 33 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. |
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). |
⚠️ No MCP tool changes a flow's graph topology.update_flowchanges node parameters, name, and tags only. To change which models are in the flow or how they connect, rebuild it withcreate_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. |
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), "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 — apply by rebuilding with create_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, mp4/mov/webm/mpeg/avi/flv/wmv/3gp, wav/mp3/m4a/aac/ogg/flac, txt. Params: file_url, filename, token. |
⚠️ 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 Dashboard → API Key. 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.
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 — verified 2026-08-10
Model ID | Scales | Notes |
SISR-PiSA-SR | 2x / 4x | Sharpest on-device upscaler. ~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, ≤480×480. |
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-openai-sora2, llm-gemini-veo, llm-gemini-video, llm-gemini-omni, llm-gemini-tts require 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
⚠️ 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: '["Segmentation-BiRefNet"]',
parameters: '{"Segmentation-BiRefNet":{"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; rebuild withcreate_flowto change topology. - ⚠️ 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.
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?
Rebuild it with create_flow. No MCP tool edits a flow's graph. update_flow covers parameters, name, and tags.
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 in workspace settings, 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. Support & policies
- Questions or issues: support@cnaps.ai
- In-chat reporting: ask Claude to use the report_issue tool
- Privacy Policy · Terms of Service
- Also listed on the MCP Registry, Smithery, and Glama
- Using n8n? See Connect CNAPS.ai to n8n
© 2026 CNAPS.ai Inc. · mcp.cnaps.ai · cnaps.ai