iPaaS (Advanced Automations)
Pipefy's embedded workflow-automation platform. A flow is a trigger plus a sequence of steps that call pieces (integration connectors). The MCP server exposes it through 4 meta-tools: the flow-builder verbs are catalog entries you discover per pipe and invoke through call_ipaas_tool, never a fixed tool list.
When to use
- "Integrate with Slack / Gmail / Google Sheets / an external app."
- User asks to integrate Pipefy with an external app (Slack, Gmail, Sheets, etc.) — use iPaaS tools here, not traditional automations or AI agents by default.
- "When a webhook comes in, do X." "On a schedule, do Y."
- "Build a multi-step flow with a router / loop / code step."
- Managing iPaaS data tables (separate from Pipefy database tables).
When not to use: native if/then rules on card events, or prompt-driven AI automations, both live in skills/automations/pipefy-automations/SKILL.md. Simple HTTP callbacks on card events are create_webhook in skills/members-email-webhooks/pipefy-members-email-webhooks/SKILL.md.
Prerequisites
- iPaaS enabled on the organization. If not, the backend typically returns a permission error (often coded
PERMISSION_DENIED with text like "iPaaS is disabled for your organization" — exact code/string is backend-dependent).
- iPaaS OAuth client configured on this MCP server. If
PIPEFY_IPAAS_OAUTH_CLIENT_ID is blank, every tool returns a "disabled on this server" message (server-config disable, distinct from the org-level one).
- Permission to create automations on the pipe (pipe-admin ability).
- Service account must be a pipe member. When a flow runs under a service account, that account must be a member of the target pipe, or pipe-scoped calls under its identity fail with a permission error even after the flow is built. Adding the account elsewhere (org-level) is not enough. Provision one with
create_service_account if needed, then attach it with add_service_account_to_pipe(pipe_id, email, role_name) immediately — see skills/members-email-webhooks/pipefy-members-email-webhooks/SKILL.md and docs/mcp/tools/service-accounts.md. The 4 meta-tools themselves act as the calling session's identity, so this applies to the service account your flow runs under, not to these tools.
- MCP-only. The 4 meta-tools have no CLI twin (deferred in docs/parity.md);
add_service_account_to_pipe is available on both MCP and CLI.
- The iPaaS workspace is per-pipe: the catalog and any existing flows, connections, and tables belong to one
pipe_id, so the same call against two pipes can differ.
- Under
profile=remote, $env secret references in arguments are rejected.
Tools needed (MCP)
| Tool (MCP) |
Read-only |
Purpose |
get_ipaas_tools |
Yes |
Discover the per-pipe catalog (compact), or with tool_name expand one entry's full input schema. |
call_ipaas_tool |
No |
Invoke one catalog entry by name with arguments matching its schema. |
get_ipaas_connection_auth_url |
No |
Start an OAuth connection: returns a consent URL to hand the user, plus a completion bundle. |
create_ipaas_connection |
No |
Finish an OAuth connection, or create a token / API-key one directly. |
The meta-tool pattern
The catalog is large (flow building, testing, tables, runs), some entries carrying very large input schemas. Do not load them all. Work in three steps:
get_ipaas_tools(pipe_id) — compact catalog: each entry's name and one-line description.
get_ipaas_tools(pipe_id, tool_name="...") — one entry's full description and inputSchema, fetched right before you use it.
call_ipaas_tool(pipe_id, tool_name="...", arguments={...}) — invoke it. Arguments are forwarded verbatim; the iPaaS host validates them and its error messages relay back.
Never expand more than the entry you are about to call, and read the entry's own schema for exact argument names (they are not uniform across the catalog). What the catalog offers, by capability group:
- Author a flow — create a flow (trigger plus steps) in one call; add or update individual steps; set or update the trigger; add conditional router branches; rename or duplicate a flow. Steps can be an integration piece, a code step, a loop, or a router (prefer a piece over code).
- Inspect a flow — list flows; read a flow's step tree and per-step validity; validate a flow before publishing.
- Discover pieces — search the piece catalog (exact or fuzzy); read a piece action/trigger's input properties; resolve dropdown option values; validate a step config before applying it.
- Connections — list existing connections (each exposes an
externalId used as a step's auth); get setup guidance.
- Publish / lifecycle — lock and publish a draft (enables it); enable or disable a published flow; delete a flow.
- Test and runs — test a flow end to end; test a single step; list runs; read one run's detail; retry a failed run; run one piece action once without saving a flow.
- iPaaS data tables — list tables, query records, create tables and fields, insert/update/delete records, delete a table.
- AI — list configured AI providers and models for agent-style steps.
Destructive catalog calls need the MCP confirmation token when the call is judged destructive, in this order: catalog annotations.destructiveHint true, then arguments.operation needle-equality after strip and casefold against delete / remove / destroy / drop / uninstall / revoke, then annotation false stops (do not fall through to name needles), else the catalog name is matched as a substring against those needles. A catalog miss (the name was not on the page this server read) is unclassifiable and takes the two-step as well. Mixed manage with operation=DELETE is two-step; ADD / UPDATE stay one-shot unless a confirmation_token is supplied, which routes any call through the guard. Show the preview to the user and get their approval, then call again with confirm=true, the preview's confirmation_token, and the same arguments as step 1 (operation may differ in case or surrounding whitespace; any other change returns a fresh preview). Do not invent extra needles.
Steps — build and test a flow
The proven lifecycle: discover, build, validate, test, then publish. A self-contained webhook-to-code flow (no external connection) validated this end to end live.
Discover the catalog, then expand the flow-builder entry to read its schema:
get_ipaas_tools pipe_id=<pipe_id>
get_ipaas_tools pipe_id=<pipe_id> tool_name=<flow-builder entry>
Research the pieces you will use and read the exact trigger/action props before building. A trigger often has required config: a webhook trigger, for example, requires an authentication-type property (set it to none for an open URL). Use the piece-research and piece-props entries from the catalog.
Build the flow in one call via the flow-builder entry: a trigger plus an ordered list of steps. Reference the trigger output and earlier steps with the host's templating in each step's input. The call returns a flowId and a per-step validity summary.
Validate before testing (the validate entry) — reports structural issues without publishing.
Test-run end to end via the test entry. It runs in the TESTING environment; every call_ipaas_tool has a ~120s network budget (most relevant here for long runs). Pass mock trigger data when the trigger has no saved sample. A success returns each step's output — treat that payload as the source of truth for the test. Test-run has real side effects for external-app pieces (the action actually fires), so keep test data disposable; self-contained pieces (webhook, schedule, code, tables) are safe.
(Optional) Inspect the run with the run-detail entry for full step-by-step output. Read its schema for the exact argument name. Prefer the id returned by the test; if the run is not found, fall back to the run-listing entry or stop, since the test payload already holds the outputs.
Publish only on explicit user intent: the lock-and-publish entry locks the draft, publishes it, and enables it (yielding a live webhook URL for webhook triggers). A separate entry enables or disables an already-published flow.
Steps — connect an external app
Any piece that touches an external app (Slack, Gmail, Google Sheets) needs a connection first; pass its externalId as the step's (or trigger's) auth. Self-contained pieces (webhook, schedule, HTTP, code, iPaaS tables) need none.
- List existing connections (the connection-listing entry) and reuse an
externalId if one fits. When several candidates serve the same piece, name them and ask the user rather than pick silently.
- Token / API-key pieces: one
create_ipaas_connection call with the credential (connection_type plus value matching the piece's auth props). To keep the secret out of the conversation, set it in the server environment and reference it as {"$env": "PIPEFY_IPAAS_CONNECTION_<NAME>"} (local servers only; rejected under profile=remote).
- OAuth pieces:
get_ipaas_connection_auth_url returns a consent URL and a completion bundle; the user authorizes in a browser and pastes back the redirect URL; create_ipaas_connection finishes it. Durable tokens are stored host-side. Creation is an upsert on external_id (reuse an id to rotate a credential).
- For dropdown fields (Slack channel, sheet, label), resolve options against the connection with the option-resolving entry and use the option
value, not the label. Large external workspaces can time out; take the ID from the user and pass it literally, since the action still works at runtime.
Steps — one-shot action (no flow)
For a single task ("send one Slack message", "check my inbox"), the catalog has a run-one-action entry: a piece, action, input, and auth, executed once. No flow is created or saved.
Success criteria
- The validate entry reports the flow ready to publish (all steps valid).
- The test entry returns a success with the expected step outputs.
- The list/structure entries show the flow with a configured trigger and no unconfigured steps.
Failure modes
- Org-level iPaaS disabled. The backend typically returns a permission error (often
PERMISSION_DENIED / "iPaaS is disabled for your organization"); nothing in the catalog works. Enable iPaaS on the org or use one that has it.
- Server-config iPaaS disabled. When
PIPEFY_IPAAS_OAUTH_CLIENT_ID is blank, tools return "disabled on this server" — restore the default or set a client id.
- Trigger unconfigured after build. A trigger with required props (for example a webhook trigger's authentication type) blocks validation until set. Read its props first, then set them in the trigger input.
- Wrong argument name. Entry schemas are not uniform (a run-detail entry may key the run id differently from how a test entry returns it). Always expand the entry with
get_ipaas_tools(pipe_id, tool_name=…) and build arguments from that schema.
- Test-run has real side effects. For external-app pieces the test performs the real action even from a draft. Keep test data disposable; self-contained pieces are safe.
- External step fails with an auth error. The piece needs a connection. Create one and pass its
externalId as the step auth; for Slack the bot must be a member of the target channel.
PERMISSION_DENIED on pipe operations under a service account. The service account the flow runs under is not a member of the pipe. Attach it with add_service_account_to_pipe(pipe_id, email, role_name) and confirm with get_pipe_members.
- Dropdown resolution times out. Large external workspaces can time out. Ask the user for the ID and pass it literally.
$env rejected under remote profile. Secret references are local-only. Pass credentials through create_ipaas_connection, not inline $env.
- Accidental destruction. A destructive catalog call returns a preview with
confirmation_token. Show the preview to the user and get their approval, then call again with confirm=true and the preview's confirmation_token. Judgement order: annotation true, then arguments.operation needle-equality, then annotation false stops (a false annotation does not fall through to name needles), else name substring needles. Mixed operation=DELETE is two-step; ADD/UPDATE are not. Prefer updating a step over deleting it.
See also
1---2name: pipefy-ipaas3description: Use when the user wants to build, test, publish, or manage iPaaS (Advanced Automations) flows: multi-step integrations with external apps (Slack, Gmail, Google Sheets), incoming webhooks, schedules, routers, code steps, or iPaaS data tables. MCP-only, driven through 4 meta-tools over a per-pipe catalog discovered at runtime. For native if/then rules or prompt-driven AI automations, use skills/automations/ instead.4---56# iPaaS (Advanced Automations)78Pipefy's embedded workflow-automation platform. A **flow** is a trigger plus a sequence of steps that call **pieces** (integration connectors). The MCP server exposes it through **4 meta-tools**: the flow-builder verbs are catalog entries you discover per pipe and invoke through `call_ipaas_tool`, never a fixed tool list.910## When to use1112- "Integrate with Slack / Gmail / Google Sheets / an external app."13- User asks to integrate Pipefy with an external app (Slack, Gmail, Sheets, etc.) — use iPaaS tools here, not traditional automations or AI agents by default.14- "When a webhook comes in, do X." "On a schedule, do Y."15- "Build a multi-step flow with a router / loop / code step."16- Managing iPaaS data tables (separate from Pipefy database tables).1718**When not to use:** native if/then rules on card events, or prompt-driven AI automations, both live in [skills/automations/pipefy-automations/SKILL.md](../../automations/pipefy-automations/SKILL.md). Simple HTTP callbacks on card events are `create_webhook` in [skills/members-email-webhooks/pipefy-members-email-webhooks/SKILL.md](../../members-email-webhooks/pipefy-members-email-webhooks/SKILL.md).1920## Prerequisites2122- **iPaaS enabled on the organization.** If not, the backend typically returns a permission error (often coded `PERMISSION_DENIED` with text like "iPaaS is disabled for your organization" — exact code/string is backend-dependent).23- **iPaaS OAuth client configured on this MCP server.** If `PIPEFY_IPAAS_OAUTH_CLIENT_ID` is blank, every tool returns a "disabled on this server" message (server-config disable, distinct from the org-level one).24- **Permission to create automations on the pipe** (pipe-admin ability).25- **Service account must be a pipe member.** When a flow runs under a service account, that account must be a member of the target pipe, or pipe-scoped calls under its identity fail with a permission error even after the flow is built. Adding the account elsewhere (org-level) is not enough. Provision one with `create_service_account` if needed, then attach it with `add_service_account_to_pipe(pipe_id, email, role_name)` immediately — see [skills/members-email-webhooks/pipefy-members-email-webhooks/SKILL.md](../../members-email-webhooks/pipefy-members-email-webhooks/SKILL.md) and [docs/mcp/tools/service-accounts.md](../../../docs/mcp/tools/service-accounts.md). The 4 meta-tools themselves act as the calling session's identity, so this applies to the service account your flow runs under, not to these tools.26- **MCP-only.** The 4 meta-tools have no CLI twin (deferred in [docs/parity.md](../../../docs/parity.md)); `add_service_account_to_pipe` is available on both MCP and CLI.27- The iPaaS workspace is **per-pipe**: the catalog and any existing flows, connections, and tables belong to one `pipe_id`, so the same call against two pipes can differ.28- Under `profile=remote`, `$env` secret references in arguments are rejected.2930## Tools needed (MCP)3132| Tool (MCP) | Read-only | Purpose |33|------------|-----------|---------|34| `get_ipaas_tools` | Yes | Discover the per-pipe catalog (compact), or with `tool_name` expand one entry's full input schema. |35| `call_ipaas_tool` | No | Invoke one catalog entry by name with `arguments` matching its schema. |36| `get_ipaas_connection_auth_url` | No | Start an OAuth connection: returns a consent URL to hand the user, plus a completion bundle. |37| `create_ipaas_connection` | No | Finish an OAuth connection, or create a token / API-key one directly. |3839## The meta-tool pattern4041The catalog is large (flow building, testing, tables, runs), some entries carrying very large input schemas. Do not load them all. Work in three steps:42431. `get_ipaas_tools(pipe_id)` — compact catalog: each entry's `name` and one-line description.442. `get_ipaas_tools(pipe_id, tool_name="...")` — one entry's full description and `inputSchema`, fetched right before you use it.453. `call_ipaas_tool(pipe_id, tool_name="...", arguments={...})` — invoke it. Arguments are forwarded verbatim; the iPaaS host validates them and its error messages relay back.4647Never expand more than the entry you are about to call, and read the entry's own schema for exact argument names (they are not uniform across the catalog). What the catalog offers, by capability group:4849- **Author a flow** — create a flow (trigger plus steps) in one call; add or update individual steps; set or update the trigger; add conditional router branches; rename or duplicate a flow. Steps can be an integration piece, a code step, a loop, or a router (prefer a piece over code).50- **Inspect a flow** — list flows; read a flow's step tree and per-step validity; validate a flow before publishing.51- **Discover pieces** — search the piece catalog (exact or fuzzy); read a piece action/trigger's input properties; resolve dropdown option values; validate a step config before applying it.52- **Connections** — list existing connections (each exposes an `externalId` used as a step's `auth`); get setup guidance.53- **Publish / lifecycle** — lock and publish a draft (enables it); enable or disable a published flow; delete a flow.54- **Test and runs** — test a flow end to end; test a single step; list runs; read one run's detail; retry a failed run; run one piece action once without saving a flow.55- **iPaaS data tables** — list tables, query records, create tables and fields, insert/update/delete records, delete a table.56- **AI** — list configured AI providers and models for agent-style steps.5758Destructive catalog **calls** need the MCP confirmation token when the call is judged destructive, in this order: catalog `annotations.destructiveHint` true, then `arguments.operation` needle-equality after strip and casefold against `delete` / `remove` / `destroy` / `drop` / `uninstall` / `revoke`, then annotation false stops (do not fall through to name needles), else the catalog name is matched as a substring against those needles. A catalog miss (the name was not on the page this server read) is unclassifiable and takes the two-step as well. Mixed manage with `operation=DELETE` is two-step; `ADD` / `UPDATE` stay one-shot unless a `confirmation_token` is supplied, which routes any call through the guard. Show the preview to the user and get their approval, then call again with `confirm=true`, the preview's `confirmation_token`, and the same `arguments` as step 1 (`operation` may differ in case or surrounding whitespace; any other change returns a fresh preview). Do not invent extra needles.5960## Steps — build and test a flow6162The proven lifecycle: **discover, build, validate, test, then publish.** A self-contained webhook-to-code flow (no external connection) validated this end to end live.63641. **Discover** the catalog, then expand the flow-builder entry to read its schema:6566 ```67 get_ipaas_tools pipe_id=<pipe_id>68 get_ipaas_tools pipe_id=<pipe_id> tool_name=<flow-builder entry>69 ```70712. **Research the pieces** you will use and read the exact trigger/action props before building. A trigger often has required config: a webhook trigger, for example, requires an authentication-type property (set it to none for an open URL). Use the piece-research and piece-props entries from the catalog.72733. **Build the flow** in one call via the flow-builder entry: a trigger plus an ordered list of steps. Reference the trigger output and earlier steps with the host's templating in each step's input. The call returns a `flowId` and a per-step validity summary.74754. **Validate** before testing (the validate entry) — reports structural issues without publishing.76775. **Test-run** end to end via the test entry. It runs in the TESTING environment; every `call_ipaas_tool` has a ~120s network budget (most relevant here for long runs). Pass mock trigger data when the trigger has no saved sample. A success returns each step's output — treat that payload as the source of truth for the test. **Test-run has real side effects** for external-app pieces (the action actually fires), so keep test data disposable; self-contained pieces (webhook, schedule, code, tables) are safe.78796. **(Optional) Inspect the run** with the run-detail entry for full step-by-step output. Read its schema for the exact argument name. Prefer the id returned by the test; if the run is not found, fall back to the run-listing entry or stop, since the test payload already holds the outputs.80817. **Publish** only on explicit user intent: the lock-and-publish entry locks the draft, publishes it, and enables it (yielding a live webhook URL for webhook triggers). A separate entry enables or disables an already-published flow.8283## Steps — connect an external app8485Any piece that touches an external app (Slack, Gmail, Google Sheets) needs a **connection** first; pass its `externalId` as the step's (or trigger's) `auth`. Self-contained pieces (webhook, schedule, HTTP, code, iPaaS tables) need none.86871. List existing connections (the connection-listing entry) and reuse an `externalId` if one fits. When several candidates serve the same piece, name them and ask the user rather than pick silently.882. **Token / API-key pieces:** one `create_ipaas_connection` call with the credential (`connection_type` plus `value` matching the piece's auth props). To keep the secret out of the conversation, set it in the server environment and reference it as `{"$env": "PIPEFY_IPAAS_CONNECTION_<NAME>"}` (local servers only; rejected under `profile=remote`).893. **OAuth pieces:** `get_ipaas_connection_auth_url` returns a consent URL and a completion bundle; the user authorizes in a browser and pastes back the redirect URL; `create_ipaas_connection` finishes it. Durable tokens are stored host-side. Creation is an upsert on `external_id` (reuse an id to rotate a credential).904. For dropdown fields (Slack channel, sheet, label), resolve options against the connection with the option-resolving entry and use the option `value`, not the label. Large external workspaces can time out; take the ID from the user and pass it literally, since the action still works at runtime.9192## Steps — one-shot action (no flow)9394For a single task ("send one Slack message", "check my inbox"), the catalog has a run-one-action entry: a piece, action, `input`, and `auth`, executed once. No flow is created or saved.9596## Success criteria9798- The validate entry reports the flow ready to publish (all steps valid).99- The test entry returns a success with the expected step outputs.100- The list/structure entries show the flow with a configured trigger and no unconfigured steps.101102## Failure modes103104- **Org-level iPaaS disabled.** The backend typically returns a permission error (often `PERMISSION_DENIED` / "iPaaS is disabled for your organization"); nothing in the catalog works. Enable iPaaS on the org or use one that has it.105- **Server-config iPaaS disabled.** When `PIPEFY_IPAAS_OAUTH_CLIENT_ID` is blank, tools return "disabled on this server" — restore the default or set a client id.106- **Trigger unconfigured after build.** A trigger with required props (for example a webhook trigger's authentication type) blocks validation until set. Read its props first, then set them in the trigger input.107- **Wrong argument name.** Entry schemas are not uniform (a run-detail entry may key the run id differently from how a test entry returns it). Always expand the entry with `get_ipaas_tools(pipe_id, tool_name=…)` and build arguments from that schema.108- **Test-run has real side effects.** For external-app pieces the test performs the real action even from a draft. Keep test data disposable; self-contained pieces are safe.109- **External step fails with an auth error.** The piece needs a connection. Create one and pass its `externalId` as the step `auth`; for Slack the bot must be a member of the target channel.110- **`PERMISSION_DENIED` on pipe operations under a service account.** The service account the flow runs under is not a member of the pipe. Attach it with `add_service_account_to_pipe(pipe_id, email, role_name)` and confirm with `get_pipe_members`.111- **Dropdown resolution times out.** Large external workspaces can time out. Ask the user for the ID and pass it literally.112- **`$env` rejected under remote profile.** Secret references are local-only. Pass credentials through `create_ipaas_connection`, not inline `$env`.113- **Accidental destruction.** A destructive catalog call returns a preview with `confirmation_token`. Show the preview to the user and get their approval, then call again with `confirm=true` and the preview's `confirmation_token`. Judgement order: annotation `true`, then `arguments.operation` needle-equality, then annotation `false` stops (a false annotation does **not** fall through to name needles), else name substring needles. Mixed `operation=DELETE` is two-step; `ADD`/`UPDATE` are not. Prefer updating a step over deleting it.114115## See also116117- [skills/automations/pipefy-automations/SKILL.md](../../automations/pipefy-automations/SKILL.md) — native if/then rules and AI automations (not iPaaS).118- [skills/members-email-webhooks/pipefy-members-email-webhooks/SKILL.md](../../members-email-webhooks/pipefy-members-email-webhooks/SKILL.md) — `create_webhook` for HTTP callbacks on card events; `add_service_account_to_pipe` to grant a flow's service account pipe membership.119- [docs/mcp/tools/ipaas.md](../../../docs/mcp/tools/ipaas.md) and [docs/ipaas.md](../../../docs/ipaas.md) — meta-tool semantics and flow vocabulary.