Connect CNAPS.ai to Zapier — MCP Integration Guide

Connect CNAPS.ai to Zapier — MCP Integration Guide

CNAPS.ai exposes its entire platform as an MCP server. Zapier's MCP Client integration connects to it, turning all 33 CNAPS.ai tools into Zap actions.

Unlike the n8n integration, where an AI Agent decides which tools to call at runtime, a Zap is deterministic: you choose the tools and their order when you build it. That makes it slower to set up and far more predictable to operate.

This tutorial builds a working example end to end — a five-step Zap that takes an image URL, upscales it 4×, and returns the result.

Time required: about 20 minutes.

What you'll build

Step
Node
Role
1
Zapier Forms
Trigger — you submit an image URL through a form
2
MCP Client → Run Tool
upload_file — registers the image with CNAPS.ai
3
MCP Client → Run Tool
create_flow — builds the flow and starts it
4
Delay by Zapier
Waits for processing to finish
5
MCP Client → Run Tool
get_flow — reads status and the output URL

These step numbers are used throughout this guide. Creating the connection (Part 1) happens before the Zap exists, so it has no step number.

Cost per run: three tasks — one per MCP Client action. Triggers, Delay and Filter steps never use tasks, so steps 1 and 4 are free. (Note that Zapier Agents, mentioned at the end of this guide, is billed against a separate activity quota rather than tasks — see Zapier's task usage guide.)

image

Before you start

1. A CNAPS.ai account. You will authenticate through OAuth in the browser, so log in at cnaps.ai in the same browser before you begin.

2. A Zapier account on a plan that allows more than two steps. Zapier's Free plan is limited to two-step Zaps (one trigger + one action), which is not enough for this tutorial. New accounts get a 14-day free trial of the Professional plan; after it expires you need Professional or higher to keep this Zap running.

3. Note that MCP Client is a beta feature. Zapier labels it "available for use, but still in active development." Field names and screens may differ slightly from the descriptions here.

Authentication: OAuth only

This is the one thing to understand before you start.

Zapier's MCP Client connection form has four fields: Serverurl, Transport, an OAuth toggle, and an optional Bearer Token. There is no custom header field.

CNAPS.ai API keys authenticate through an x-api-key header. With no header field available, you cannot use an API key here — this differs from n8n, where Header Auth is the recommended path. Putting a cnaps_... key in the Bearer Token field returns 401 invalid token, because Bearer is reserved for OAuth tokens.

Use OAuth. CNAPS.ai supports OAuth 2.1 with dynamic client registration and PKCE (S256), which is exactly what Zapier's MCP Client expects. No key to copy, nothing to paste.

Part 1 — Create the connection

Connecting a remote MCP server takes two passes: first you add the MCP Client by Zapier app to your account, then you add your server to it. The button that does the second half is not the one on the main Connections page.

1. Open App connections. Click App connections in the left sidebar of your Zapier home.

Not "MCP servers." The sidebar also has an MCP servers entry marked New. That is Zapier's own MCP server — it exposes Zapier's apps to outside AI clients, the opposite direction from what you want here. Adding CNAPS.ai there will not work.
image

2. Add the app. Click + Create connection, search for MCP Client, and pick MCP Client by Zapier.

image

3. Open it. The app now appears in your connections list. Click into it to open its own page — headed MCP Client by Zapier, with Personal, Shared and Private connection sections.

4. Add your server. Click + Add connection at the top right of that page. A separate connect.zapier.com window opens with the server form.

5. Fill in the form. Zapier's labels are a little idiosyncratic; they read exactly like this:

Field
Value
Serverurl
https://mcp.cnaps.ai/mcp
Transport
Streamable HTTP
OAuth
Yes
Bearer Token
leave empty
image

Transport matters: the CNAPS.ai MCP server speaks streamable HTTP only and has no SSE endpoint, so an SSE selection has nothing to connect to. And with OAuth set to Yes, Zapier ignores the Bearer Token field entirely — its own help text says so.

Click Connect.

A browser window opens for authorization.

Known issue. The authorization window may show "Session expired or invalid. Please try again." even when the connection has succeeded. This is a CNAPS.ai bug, not a Zapier one — the callback has already been processed by the time that screen renders.

Before retrying, go back to the MCP Client by Zapier page and look at the connection list. If you see a connection named cnaps.ai (0.1.0) with status Connected, it worked. That name comes from the MCP server's own initialize response, so its presence means a successful handshake.

If you retried before checking, you may now have two identical connections. Delete one.

Part 2 — Build the Zap

Click + Create in the left sidebar and choose Zap workflows. The editor opens with a Copilot box at the top and an empty Trigger → Action skeleton below it.

Skip Copilot for this build. Describing the workflow in the Copilot box will get you a Zap, but not this one — several fields here take hand-written JSON, and Copilot is unlikely to get them right. More to the point, a Zap you didn't assemble yourself is one you can't adapt later. Build it by hand once and every field will make sense.
image

Step 1 — Add a trigger (Zapier Forms)

Zapier has no equivalent of n8n's chat trigger — no built-in way to type a request and watch it run. Every Zapier trigger watches something and fires when a new item appears. A form is the closest thing to typing into a chat box: you submit it when you want the Zap to run, and you decide what goes in.

Click the Trigger box, search Forms, and pick Zapier Forms. For Trigger event, choose Form Submission Created.

image

Create the form

The Configure tab asks for three things — Form Project, Page, and Form — and all three start empty. That nesting is how Zapier Forms is organized: a project contains pages, and a page contains the form. You can't fill these top-down, because none of them exist yet. Page and Form stay greyed out until there's a project.

Click Create Form instead. Zapier creates a project called Untitled Zap Form and the button changes to Open in Forms. Click that; the form builder opens in a new tab.

image
image

You land on the project dashboard, which shows a Pages section with a single card named Home. Click the Home card to open it.

image

Now choose Blank form. (Copilot will happily build you a form, but it tends to add several fields and you need exactly one — deleting is more work than adding.)

image

Configure the one field

The field settings panel opens on the right:

Setting
Value
Field type
Short text
Label
Image URL
Required
check it
image
While you're here, rename Form title to something you'll recognise later and rename the project from Untitled Zap Form.

Open the Data tab and click Create "Home" Table.

Get the form link

There is no publish button — a Zapier form is live as soon as it exists, and Access & users reads Anyone with the link can access by default. The link sits in the builder's top bar and looks like this:

cmssjzlfx004pmr28vhy4o71z.zapier.app/home

Save that URL somewhere you can reach it — a bookmark is ideal. You'll open it every time you run this Zap, and Zapier gives it no obvious home in the interface.

If you lose it, the path back is:

  1. In the Zap editor, click the ↗ icon on the trigger node (top right of the 1. Form Submission Created card). This opens the form's project dashboard in a new tab — not the form itself, which is the easy mistake here. The address bar reads <project-id>.zapier.app with no page on the end.
  2. Under Pages, click the Home card. That opens the page editor, and the address bar now reads <project-id>.zapier.app/home — the actual form URL.
  3. Click the chain icon beside it to copy.

Point the trigger at it

Back in the Zap tab, fill the three dropdowns top-down: Form ProjectPageForm. Each one unlocks the next.

image

Now test the trigger. Open your form link and submit one:

https://picsum.photos/id/237/320/240.jpg
Use an image host that allows hotlinking. Some hosts — Wikimedia Commons among them — block non-browser user agents and return HTTP 403, which surfaces as an upload_file failure later.

Zapier lists what it finds as Form Submission A, B, and so on. Those names tell you nothing, and the first one is usually a placeholder Zapier generates so you can see the field structure before any real submission exists — so expand the record and check the value. You want the one containing the URL you just submitted.

If nothing matches, click Find new records after submitting the form, then pick the newly arrived record. Then Continue with selected record.

image
Continuing with a placeholder record still lets you configure the remaining steps — the field names are there to map — but step 2 will fail on test, because upload_file gets handed a URL that doesn't resolve. Sorting it out here is cheaper than debugging it two steps later.

Zapier Forms is free on every plan, and form steps don't count toward your task quota.

Step 2 — Register the image (upload_file)

Click the Action box, search MCP Client, and pick MCP Client by Zapier.

Zapier shows a blue panel here asking whether you're looking for Zapier MCP. You aren't — that's the server product again, pointing the other way. Ignore it.
image

Setup

  • Action Event: Run Tool
  • Account: your cnaps.ai (0.1.0) connection

Configure

  • Tool: Upload File (upload_file)

If the tool dropdown loads, you're connected. You'll see the full CNAPS.ai catalog in alphabetical order, from Cancel Flow to Upload File33 tools at the time of writing, displayed under human-readable names rather than their IDs. (The catalog grows; if your list is longer, that's fine.)

image

Leave Handle errors and Parse content on True, and Filter result on structuredContent. Parse content is what turns the response into individually mappable fields; without it you get one blob of JSON text.

Fill in the Options

Picking a tool reveals an Options section holding that tool's inputs. Zapier labels each one with the description from the tool schema rather than its name, so you won't see file_url anywhere on screen. For upload_file the three boxes are, in order:

What the screen says
The field
Public URL to download the file from…
file_url
Optional output filename…
filename
Upload session token from a previous upload_file call…
upload_token

Only the first one matters here, and you point it at the form field rather than typing a URL — that's what "mapping" means throughout this guide, and it's how the Zap ends up processing whatever anyone submits instead of one fixed image.

Click the + beside the first box. A data picker opens on the left. Type image url in its search box, and under 1. Form Submission Created you'll see an entry named Form Data: Image URL with a value shown beneath it.

image

That value is whatever you submitted through the form a moment ago. Check that it matches — if it shows something you don't recognise, the trigger test picked up a placeholder record, and you should go back and select the real one.

Click the entry.

The box now holds a blue chip reading 1. Form Data: Image URL with the value previewed beside it, and the Options header turns green. A chip, not pasted text, is what you're aiming for.

Leave filename empty (it's taken from the URL) and upload_token empty — that one is for browser uploads, where the user has no URL to give you.

Test the step. The response contains a urls array with a cdn.cnaps.ai/raw/mcp/... link, plus filename, size, mime type, and dimensions. You'll map that URL into the next step.

image

Step 3 — Build and run the flow (create_flow)

Add another MCP Client → Run Tool action. Set Tool to Create Flow.

image

As in step 2, the Options section labels each box with its schema description rather than its name, and this tool has seven of them. Only one is required, and it sits fifth. Working top to bottom, they are:

#
The box begins…
Field
Value
1
JSON array of explicit connections…
connections
leave empty
2
Whether to auto-generate input nodes…
include_optional
True
3
JSON array of inputs for the generated input nodes…
input_files
[" + chip from step 2 + "]
4
Name for the new flow…
name
4x Upscale (Zapier)
5
JSON array of models IN ORDER… ⭐
nodes
["SISR-PiSA-SR"]
6
JSON object of parameter overrides…
parameters
{"SISR-PiSA-SR":{"scale_factor":4}}
7
Start the flow immediately after creating it…
run
True
Scroll down before you start typing. The single required field — nodes, marked with a red asterisk — sits below four optional ones. It's easy to fill in the top of the form, hit a wall at "To continue, finish required fields," and not see why.
image

Items 2 and 7 are radio buttons; the rest are text. Four things to get right here.

These fields take JSON as text. nodes, parameters, and input_files are typed as strings in the tool schema, so Zapier renders plain text boxes. You type the brackets and quotes yourself. Omitting them produces a validation error.

Wrap the mapping in brackets — and don't paste the URL. For input_files, click + and insert the Structured Content Urls field from step 2, then type [" before the chip and "] after it. When it's right, the brackets and quotes show as plain black text with a single blue chip between them.

It is tempting to copy the cdn.cnaps.ai/... URL out of step 2's test result and paste it here instead. That passes the test — and then processes that same image forever, no matter what anyone submits to the form. The chip you mapped in step 2 has to be carried through here, or the chain breaks at exactly this point.

Use the real model ID. The model is commonly called PiSA-SR, but its catalog ID is SISR-PiSA-SR. To find the ID and recommended parameters for any other task, call suggest_flow — it accepts plain language and returns model IDs with parameters already set.

Don't skip parameters. scale_factor defaults to 2, and the only valid values are 2 and 4. Leave the field empty and the flow runs successfully at 2× — no error, just a 640×480 output instead of 1280×960. This is the quietest way to get a "wrong" result out of this Zap.

Setting run to True starts the flow in the same call, so no separate run_flow step is needed.

Test the step. The response contains the new flow's id and a web_url pointing at CNAPS Studio.

Zapier's Options panel can drop values when you switch between the collapsed key-value view and the expanded per-field view. Fill the fields, then go straight to Test without toggling views.

Step 4 — Wait (Delay by Zapier)

Add a Delay by Zapier action, event Delay For, set to 2 minutes.

image
image

A Zap runs in a straight line. There is no loop, so it cannot poll until the flow finishes — it waits a fixed interval and checks once. Two minutes is comfortable for a 4× upscale of a small image, which typically completes in well under a minute.

The delay does not apply when you test. Zapier skips Delay steps during editor tests and manual test runs; only live runs actually wait. This matters in Part 3 — plan for it rather than being surprised by status: running.

Step 5 — Read the result (get_flow)

Add a final MCP Client → Run Tool action. Set Tool to Get Flow.

image
Field
Value
flow_id
mapped Structured Content Id from step 3
view
status

Two traps in this one short step.

Do not search the mapping picker for flow_id. The create_flow response includes a next_step field — guidance written for AI agents — whose text contains the literal string flow_id="...". Searching flow_id returns those guidance sentences and not the value you want. The actual ID lives in a field named id, which surfaces in Zapier as Structured Content Id. Map that.

Set view to status. Left empty it defaults to detail, which returns the flow's node graph. Execution state and output file URLs appear only in the status view.

If Structured Content Id doesn't appear in the picker, Zapier is showing a stale field list. Re-test step 3, or click Refresh fields, then come back.

Part 3 — Publish and verify

Click Publish. The Zap has to be on before a form submission can reach it, so this comes first — there's nothing to submit to until it's live.

image
image

Then open your form link, paste an image URL, and submit.

image
Don't verify with Test run. Zapier skips the Delay during a test, so step 5 fires while CNAPS.ai is still working and reports status: running. That's the delay being skipped, not a failure. If you do end up there, wait a minute and test step 5 on its own — its Data out will show the finished state.

Watch the run in Zap history (left sidebar, or the clock icon beside Undo in the editor). Your run appears immediately, marked Delayed — that's step 4 counting down. After the two minutes it flips to Success.

image
image

Open the run and check step 5's Data out. The top-level status reads completed, and the finished image is further down: the response carries a nodes array, one entry per node in the flow, and the Image-Viewer node holds the result.

Open that path URL. The input was 320×240; the output is 1280×960 — if it's 640×480, parameters didn't take (see step 3).

image

Input (320x240)

image

Output (1280x960)

image
image

You can also open the web_url from step 3 to see the generated flow in CNAPS Studio, where you can edit and re-run it like any other flow.

If the run failed

A completed Zap does not mean a completed flow. If step 5 reports a failed status, the Zap's own history will still look green.

  • Read the error text in step 5's Data out first — it usually names the node that failed.
  • For anything unclear, open the flow's web_url in CNAPS Studio, or ask Claude — connected to the same MCP server — to run diagnose_error on the flow ID. It names the failing node and suggests a fix.
  • To be told about failures rather than discovering them, add a Filter by Zapier step after step 5 (continue only when status is not completed) followed by an email or Slack action. Filters don't consume tasks.

Gotchas, collected

Every one of these came up while building the Zap in this tutorial.

Symptom
Cause
Fix
401 invalid token
API key entered under Bearer Token
Use OAuth; API keys don't work in Zapier
No way to enter a server URL after adding MCP Client
+ Create connection only adds the app
Open the app, then click + Add connection on its own page
Added CNAPS.ai under MCP servers and nothing works
That sidebar item is Zapier's own MCP server, not a client
Use App connections instead
"Session expired or invalid" on the CNAPS.ai authorize screen
Known CNAPS.ai bug; callback already processed
Check the MCP Client by Zapier page — the connection is probably live
Tool list empty, or connection fails
Transport set to SSE
Change to Streamable HTTP
Can't configure the action
Trigger not filled in
Fill in the trigger first; Zapier blocks actions until it's set
Can't add a third step at all
Free plan allows two-step Zaps only
Use the 14-day Professional trial, or upgrade
Stuck on "To continue, finish required fields"
nodes is below the optional fields
Scroll down; fill starred fields first
Validation error on nodes / parameters / input_files
Missing brackets or quotes
These are string fields; type the JSON yourself
input_files rejected
Bare mapping with no array wrapper
Type [" and "] around the chip
Output is 640×480, not 1280×960
parameters left empty; scale_factor defaulted to 2
Set {"SISR-PiSA-SR":{"scale_factor":4}}
Searching flow_id returns sentences, not a value
next_step guidance text contains flow_id=
Map Structured Content Id instead
Mapping field missing from the picker
Stale field list
Re-test the previous step, or click Refresh fields
Test shows status: running
Delay is skipped when testing
Re-test step 5 alone after a minute, or check a live run
upload_file fails with HTTP 403
Image host blocks bot user agents
Use a host that permits hotlinking
Every run processes the same image
file_url hardcoded instead of mapped
Map the Image URL field from step 1
Live form shows no input box
New fields default to Hidden
Uncheck Hidden in field settings, then tick Required
Form Project / Page / Form dropdowns all empty
The project doesn't exist yet
Click Create Form, then Open in Forms
New form missing from the dropdown
Cached field list — it was made in another tab
Refresh fields from the ⋮ menu
Setup required banner on the form; can't find a publish button
Form has no data destination, and there is no publish button
Data tab → Create "Home" Table; the link is the URL in the builder's top bar
Step 2 fails on a URL you never submitted
Trigger test used a placeholder record
Expand records before selecting; Find new records after a real submission
Can't find the form again from the Zap
The ↗ icon opens the project dashboard, not the form
Bookmark the form URL; otherwise dashboard → Home → copy from the address bar

How this differs from n8n

Both integrations reach the same CNAPS.ai server. What differs is who decides what to call.

Model choice happens at build time, not run time. In n8n, the agent called suggest_flow and picked PiSA-SR itself from one sentence of user input. In a Zap, you hardcode SISR-PiSA-SR when you build it. suggest_flow is still useful — but as a design-time lookup, not a step in the Zap. Including it would add a call whose output nothing reads.

There is no polling loop. The n8n agent called get_flow repeatedly until the run finished. A Zap waits a fixed delay and checks once. For long-running or variable-length jobs, budget generously, or split the work across two Zaps.

Mapping is manual. The n8n agent passed the upload_file result into create_flow without being told to. In Zapier you wire each field by hand. This is the main source of setup friction — and the main source of predictability once it's done.

Choose accordingly. Use Zapier when the pipeline is fixed and you want it to run the same way every time, with Zapier's retries, run history, and 9,000-app ecosystem around it. Use n8n when the input is open-ended and you want a model deciding which CNAPS.ai tools to call.

If you do want agent-style behaviour inside Zapier, the same MCP Client connection can be attached to Zapier Agents, which selects tools autonomously the way the n8n AI Agent does.

Server reference

Endpoint
https://mcp.cnaps.ai/mcp
Transport
Streamable HTTP (no SSE endpoint)
Protocol
MCP 2025-06-18; 2024-11-05 also accepted
Auth in Zapier
OAuth 2.1 only (x-api-key header unavailable in this client)
Sessions
Stateful — the MCP Client node preserves Mcp-Session-Id for you

OAuth 2.1 uses 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.

Tool catalog — all 33 tools

Flowscreate_flow, get_flow, update_flow, delete_flow, duplicate_flow, restore_flow, list_flows, preview_flow, optimize_flow, suggest_flow, run_flow, cancel_flow

Batchesrun_batch, get_batch_status

Modelslist_models, get_model, get_model_parameters, find_compatible_models, list_llm_providers

Filesupload_file

Templates & communitylist_templates, fork_template, search_community, get_community_post, create_community_post, fork_community_flow

Account & workspaceget_me, get_workspace_info, get_usage, get_notifications, mark_notifications_read

Supportdiagnose_error, report_issue

Run Tool vs Run Read-Only Tool

This tutorial uses the Run Tool action for all three calls, which is the simplest thing that works. Zapier's MCP Client also offers Run Read-Only Tool as a search step, plus a New Tool Result trigger.

For read-only calls like get_flow, list_flows or list_models, the search step is the more idiomatic fit. Zapier also bills searches differently: a search set to proceed if nothing is found uses one task, while a search set not to proceed uses none. If you build a Zap that reads CNAPS.ai state often, that distinction is worth the extra wiring.

Next steps

  • Add a file-upload field to the form, or swap the trigger for Google Drive — New File in Folder, so people can submit images instead of URLs
  • Add an email field to the form and an email action after step 5, so the finished image goes back to whoever submitted it
  • Swap create_flow for run_flow against a flow you've already built and tuned in CNAPS Studio — fewer fields to fill, and the flow stays editable in one place
  • Add run_batch and get_batch_status to process many files per run
  • Attach the same connection to Zapier Agents for runtime tool selection
  • Chain the output URL into any of Zapier's other apps — post it to Slack, attach it to a Notion page, drop it in Google Drive

For the full tool reference and example recipes, see the CNAPS.ai MCP Server — User Guide or connect the same server to n8n or Claude directly.