pipefy-automations
Use this skill when the user wants to create, read, update, or delete traditional automations (if/then rules) or AI automations (prompt-driven). Covers 16 MCP tools. For AI agents (conversational), see skills/ai-agents/.
How do I install this agent skill?
npx skills add https://github.com/pipefy/ai-toolkit --skill pipefy-automationsIs this agent skill safe to install?
- Gen Agent Trust Hubpass
The skill provides instructions and patterns for managing traditional and AI-driven automations within the Pipefy platform. It follows secure development practices by emphasizing ID discovery, pre-flight validation, and human-in-the-loop patterns. No malicious patterns or security risks were detected.
- Socketpass
No alerts
- Snykwarn
Risk: MEDIUM · 1 issue
What does this agent skill do?
Automations
Traditional automations (if/then rules), AI automations (prompt-driven), task automations, and simulation. 16 MCP tools.
For AI agents (conversational agents with behaviors), see skills/ai-agents/pipefy-ai-agents/SKILL.md.
Traditional automations (rules engine)
| Tool (MCP) | CLI | Purpose |
|---|---|---|
get_automations | pipefy automation list | List all automations for a pipe. |
get_automation | pipefy automation get | Single automation with full rule config — returns event_params and action_params (including aiParams for AI rules). |
create_automation | pipefy automation create | Create an if/then rule. active defaults to true. First-class typed condition (see Conditions); other fields via extra_input. |
update_automation | pipefy automation update | Patch a rule: first-class typed condition (see Conditions) and/or extra_input. |
delete_automation | pipefy automation delete | (Two-step destructive)1 |
simulate_automation | pipefy automation simulate | AI-only dry-run (generate_with_ai action). |
get_automation_events | pipefy automation events list | Available trigger events. |
get_automation_event_attributes | pipefy automation event-attributes | Official field_map.value event-attribute tokens. |
get_automation_actions | pipefy automation actions list | Available action types for a pipe. |
create_send_task_automation | pipefy automation send-task create | Shortcut for send-a-task rules. |
Logs, usage, and job exports for automations live in skills/observability/pipefy-observability/SKILL.md (get_automation_logs, get_automation_logs_by_repo, get_automations_usage, export_automation_jobs, and related tools).
AI automations (prompt-driven)
Consent: create or suggest an AI automation only when the user explicitly asked for AI. If it seems useful but was not requested, ask first — never introduce AI automations without being asked.
| Tool (MCP) | CLI | Purpose |
|---|---|---|
get_ai_automations | pipefy ai-automation list | List AI automations for a pipe. |
get_ai_automation | pipefy ai-automation get | Full config including prompt, fields, condition. |
create_ai_automation | pipefy ai-automation create | Create a prompt-driven automation (requires AI enabled on the pipe). |
update_ai_automation | pipefy ai-automation update | Change name, active, prompt, field_ids, or condition. |
delete_ai_automation | pipefy ai-automation delete | (Two-step destructive)1 |
validate_ai_automation_prompt | pipefy ai-automation validate-prompt | Pre-flight check. Returns {valid, problems, warnings, field_map} — also detects prompt %{id} ∩ field_ids overlap. |
Steps — create an AI automation
-
Discover field
internal_ids for any field referenced in the prompt:get_phase_fields phase_id="<phase_id>" -
Build the prompt with
%{<internal_id>}references. Pipefy silently rejects prompts with no field reference (returns"Input parameters are required.").Important: the
%{...}wrapper and a numeric fieldinternal_idfrom your pipe are required — the exact digits in examples below (e.g.900000101) are fictional placeholders. Discover real IDs viaget_phase_fields/get_start_form_fields; do not copy example numbers from docs. -
Validate the prompt:
validate_ai_automation_prompt pipe_id=67890 prompt="Summarize %{900000101} and comment." field_ids=["900000101"]Returns
valid:true|false,problems,warnings,field_map. Catches mistakes in one read-only call vs 2–3 failed mutation roundtrips. -
Create the automation (only if
valid:true):create_ai_automation pipe_id=67890 trigger_event="card_created" prompt="Summarize %{900000101} and comment." field_ids=["900000101"]
Steps — create a traditional automation
- Discover events for the pipe:
get_automation_events pipe_id=67890. - Discover actions for the pipe:
get_automation_actions pipe_id=67890. (Always discover first; never guesstrigger_id/action_id.) - Confirm event×action compatibility — the chosen
event_idmust appear in the action'striggerEvents(fromget_automation_actions). If it does not, pick another pair; do not callcreate_automationyet. See Event×action compatibility. - Build the rule with the discovered IDs and call
create_automation. - Verify by reading back with
get_automation.
Conditions — gate a rule on field tests
create_automation and update_automation take a first-class condition (CLI: --condition). Do not guess the shape from GraphQL introspection — it is:
{
"expressions": [
{"field_address": "900000101", "operation": "equals", "value": "Done", "structure_id": 0}
],
"expressions_structure": [[0]]
}
field_addressis the fieldinternal_id(numeric, fromget_start_form_fields/get_phase_fields), not the slug. For a connected card's field use<connectorFieldId>.<targetFieldId>.operation(soft enum — any value is passed through, the API validates):equals,not_equals,present,blank,string_contains,string_not_contains,number_greater_than,number_less_than,date_is_today,date_is_yesterday,date_in_current_week,date_in_last_week,date_in_current_month,date_in_last_month,date_in_current_year,date_in_last_year,date_is,date_is_after,date_is_before. Omitvalueforpresent/blank.expressions_structuregroups expressions (bystructure_id) as AND-of-ORs: inner arrays are OR'd, the inner arrays are AND'd —[[0, 1], [2]]is(expr0 OR expr1) AND expr2.
Omit condition to leave a traditional rule unconditional (no default is injected). A condition argument wins over any condition in extra_input.
Steps — update a card field with a dynamic value
Use when the user wants an if/then rule to stamp or copy values onto the triggering card (for example, set a datetime when card_created fires). This is create_automation with action_id: update_card_field and extra_input.action_params.field_map — not the MCP tool update_card_field (that tool uses field slug for one-off card edits).
-
Discover field
internal_ids (digits only — never slug infieldId):get_start_form_fields pipe_id=67890 get_phase_fields phase_id="<phase_id>" -
Discover trigger, action, and event-attribute tokens:
get_automation_events pipe_id=67890 get_automation_actions pipe_id=67890 get_automation_event_attributesFor
update_card_field,acceptedParametersomitsfield_map; use the payload shape below (seedocs/mcp/tools/automations-and-ai.md). Prefervalue_tokenfromget_automation_event_attributeswhen stamping execution time. -
Create disabled (
active=false) so the rule does not fire while you verify:create_automation pipe_id=67890 name="Stamp execution time on new cards" trigger_id=card_created action_id=update_card_field active=false extra_input={"action_params":{"card_id":"%{id}","field_map":[{"fieldId":"<destination_internal_id>","inputMode":"copy_from","value":"%{automation_event_execution_datetime}"}],"fields_map_order":["<destination_internal_id>"]}}Common
valuetokens wheninputModeiscopy_from:%{id}(also use incard_id),%{created_at},%{automation_event_execution_datetime},%{<other_internal_id>}to copy another field. -
Verify persisted config:
get_automation automation_id=<id>Confirm
action_params.field_mapround-tripped. -
Enable when correct:
update_automation automation_id=<id> extra_input={"active":true}
Steps — simulate a traditional automation
simulate_automation is AI-only today (only generate_with_ai action_id is accepted). For non-AI rules, watch get_automation_logs after the trigger fires.
-
Read a working rule first:
get_automation automation_id=<id>— copyevent_paramsandaction_paramsverbatim. -
Simulate with a real sample card:
simulate_automation pipe_id=67890 action_id=generate_with_ai sample_card_id=456 -
Result is async: returns
simulation_id+status:"processing"with nullsimulationResult. No polling tool exists in v0.1 — wait, then re-invokeget_automation_logsorsimulate_automation.
Traditional automation preflight
Event×action compatibility
Before create_automation, confirm the chosen event_id is listed in that action's triggerEvents from get_automation_actions (cross-check with get_automation_events as needed). The API may still accept some incompatible pairs; those rules never fire.
Known dead combo: field_updated + move_single_card — create can succeed and the rule never executes. Do not use this pairing; pick a compatible event (for example card_moved when the action is a move) or a different action for field-update triggers.
Applying a label has no automation action
Hard stop: no action in the catalog applies a label to a card. The action is what is missing, not the trigger: sla_based is in the event catalog, so "when the card goes overdue" is a perfectly good trigger with nothing to attach to. get_automation_actions(pipe_id) is the dynamic source of truth for what a given pipe offers; read it before planning a rule and do not assume a label action exists.
What to do with that intent:
-
Send the intent to the product, not to a script. A label rule belongs in the customer's process, where it keeps firing without anyone driving it. The API and MCP cannot create it, so hand the user a manual step: configure the rule in Pipefy and confirm there what the interface offers for that trigger. State that step in the plan or summary you hand the user, the same way you would for an email template.
-
Offer the rule that does exist, when it fits.
update_card_fieldacceptssla_based, so "when the card goes overdue, stamp a field on the card" is createable throughcreate_automationtoday. A status or flag field carries the same signal as a label and keeps the rule inside the process. Discover a suitable destination field first withget_start_form_fields/get_phase_fields: many pipes have no field named Status, and the automation needs a realinternal_id. Propose it, do not impose it: the user may want the label specifically.sla_basedtakes its parameter asevent_params.kindOfSla, camelCase, even thoughget_automation_eventsreports it askind_of_sla. Values are capitalized:Expired,Late,Overdue. Sending the catalog spelling fails with "Field is not defined on AutomationEventParamsInput". Shape the action with thefield_maprecipe below, includinginputMode. -
update_card(label_ids=[...])is a one-off correction, not automation. It replaces the card's whole label list: include every id that should remain; do not send only the new one. Something has to run the call every time. Nothing persists as process behavior once the session ends. Use it to fix specific cards the user points at, and say so plainly. Do not call it across a set of cards to stand in for the rule, and do not loop it on a schedule: that makes the agent the runtime instead of the process. -
Label CRUD is a different thing.
create_label,update_labelanddelete_labelmanage the label definitions on a pipe (name, color). None of them applies a label to a card, and none of them is the automation action. -
Do not offer an AI automation or agent behavior as the alternative. Some organizations forbid AI in their processes, and the consent rule applies here: propose AI only when the user explicitly asked for it.
field_map destination fieldId
On create_automation, when extra_input.action_params.field_map is present, the SDK checks each fieldId against numeric internal_id values on the action pipe (action_repo_id, default pipe_id). Slug-shaped fieldId values and unknown numeric ids fail before GraphQL with success: false and the offending id. Recovery: get_start_form_fields / get_phase_fields → use internal_id, not slug.
Phase transition (move_single_card)
For move_single_card actions with trigger card_moved, create_automation only validates that the destination phase is reachable from the source via cards_can_be_moved_to_phases (same read-only data as move_card_to_phase). update_automation does not run this check.
If invalid, the tool returns success: false with a text error message listing allowed destination phases by name and id, plus a hint that transition rules are configured in the Pipefy UI only (not editable via API). There is no structured valid_destinations field on this envelope.
Recovery: read the allowed phases in error.message, or call get_phase_allowed_move_targets(phase_id=<source_phase_id>) on the source phase from event_params.to_phase_id, then re-issue create_automation with a permitted destination phase id.
Notification disambiguation
Pick the right tool for "notification" intent:
| User signal words | Tool | Why |
|---|---|---|
| "notificação", "tarefa", "lembrete para alguém validar" | create_send_task_automation | Built-in: handles event_id, task_title, recipients, optional event_params and condition. |
| "enviar e-mail", "responder ao cliente" | send_email_with_template / send_inbox_email (members-email-webhooks) | Email surface, not automations. |
| "webhook", "chamar serviço externo" | create_webhook (members-email-webhooks) | HTTP callback on card events. |
| "automação", "regra if/then" | create_automation | Generic rules engine. |
Do NOT hand-build action_params.taskParams via create_automation when create_send_task_automation is the right tool.
An automation that sends email depends on a template that already exists: template create, edit and delete have no API or MCP path, only the Pipefy UI. When the process needs a new or changed template, state that manual UI step in the plan or summary you give the user.
Agentic + human-in-the-loop pattern
Combine AI automations with task automations so AI handles routine work and humans validate high-impact decisions. The highest-leverage pattern in the catalog.
Example flow:
create_ai_automation: when card enters "Análise", AI fills classification and risk fields automatically.create_send_task_automation: when the AI-filled field is updated, send a task to the manager — "Validate the classification on card [title]".create_automationorcreate_field_condition: when the manager marks "Approved", move the card to the next phase.
Use this pattern for approvals, financial decisions, content publication, and any step where errors have real-world consequences. See also: skills/process-design/ Orchestration patterns.
Success criteria
get_automationreturns the new rule with correct trigger and actions.validate_ai_automation_promptreturnsvalid:truebefore AI automation creation.simulate_automation(AI rules) eventually returns a non-nullsimulationResult.
Failure modes
Automation did not fire / empty logs
get_automation— re-read the rule and itscondition.- Re-check event×action:
event_idmust be in the action'striggerEvents(see Event×action compatibility); known dead pairs never run even when create succeeded. - Empty logs are not proof of a platform outage — the rule may be dormant, inactive, or incompatible.
- Invalid
fieldIdinfield_mapmay fail without updating the card (see below). - Read the tool error payload and required-field / phase-transition hints before concluding "MCP down" or blaming the platform.
Other failure modes
simulate_automationis AI-only. Onlygenerate_with_aiaction_idaccepted. For traditional rules, useget_automation_logsafter the rule fires.- Async simulation result.
simulate_automationreturnssimulation_id+status:"processing"+ nullsimulationResult; no polling tool in v0.1. Wait, then callget_automation_logsor re-invokesimulate_automation. validate_ai_automation_promptreturnsvalid:false. Readproblems(per-field) andwarnings. Most common: prompt missing%{internal_id}reference, orfield_idsoverlap with prompt%{id}tokens.create_automationcycle detection. Same-pipecard_created+create_cardrejected with"This automation can't be created! It would result in an endless card creation cycle."Use a different trigger, target a different pipe, or useupdate_cardinstead.create_automationfails with unknown event/action. Always runget_automation_events+get_automation_actionsfirst; do not guess IDs.- Planned a rule that applies a label. No such action exists in the catalog. The trigger does:
sla_basedis available, so only the label action is missing. See Applying a label has no automation action before offering anything else. - Phase transition error on
move_single_card. Onlycreate_automationpreflights transitions. Read allowed phase ids in the error text or callget_phase_allowed_move_targets, then re-issue with a permitted destination. UI is the only edit surface for transition rules. - Cross-pipe
PERMISSION_DENIED. SA must be member of both source and destination pipes forcreate_connected_card/ cross-pipecreate_card. Recovery:get_pipe_members+invite_members. get_automation_logs_by_reporeturns empty. Pipe has no traditional automation executions; not an error. AI agent executions are separate (seeget_ai_agent_logs).create_send_task_automationfires immediately whenactive=true. Passactive=falsefirst if you want to wire it up before the rule starts firing. The 2026-04-16 orphaned-task incident is the cautionary tale.update_automationAPI asymmetry.create_automationtakes a top-levelactiveparam;update_automationrequiresextra_input={"active": false}. Passactivethroughextra_inputwhen toggling on an existing rule.action_repo_idsemantics. For cross-pipe actions (create_connected_card,create_cardinto another pipe), this is the destination pipe, not the source.- Simulation reuses real rule params. Before simulating, call
get_automationto readevent_paramsandaction_paramsof a working rule and pass them verbatim. Don't hand-craft params. field_mapuses slug infieldId. Preflight rejects non-numericfieldIdbefore GraphQL; slugs (e.g.due_date) used to surface asINTERNAL_SERVER_ERROR. Recovery:get_start_form_fields/get_phase_fields→ useinternal_id.- Unknown
field_mapfieldId.create_automationpreflight fails with the offending id when the destination field is not on the action pipe. Re-discover ids onaction_repo_id(not only the trigger pipe for cross-pipe actions). - Used
update_card_fieldMCP tool for a rule. That tool updates one card by slug; automations needcreate_automation+field_mapwith numericfieldId. - Missing or wrong
card_id. Setaction_params.card_idto"%{id}"for the triggering card; empty/wrong values prevent the intended update. - Token typo in
field_map.value. Typos in%{…}templates leave fields unchanged at runtime. Compare with Automation Event Attributes and a working rule fromget_automation. - Rule runs but field unchanged. Check
get_automation_logs/get_automation_logs_by_repofor execution errors; invalidfieldIdmay fail silently (no card update).
See also
- skills/building/pipefy-building/SKILL.md — intent → domain skill router for build asks.
- skills/ai-agents/pipefy-ai-agents/SKILL.md — conversational agents with behaviors (different from AI automations).
- skills/observability/pipefy-observability/SKILL.md — execution logs and usage stats.
- skills/introspection/pipefy-introspection/SKILL.md — discover trigger and action types via raw schema.
- skills/process-design/pipefy-process-design/SKILL.md — Orchestration patterns (agentic + human validation).
docs/mcp/tools/identifiers.md#field-references-slug-vs-internal_id— canonical map of which tool/argument expects slug vsinternal_idvs uuid vs numeric id (field_addressandfield_map[].fieldIdwant internal_id).
Footnotes
How can the creator link this skill?
Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.
<a href="https://skillzs.dev/skills/pipefy/ai-toolkit/pipefy-automations">View pipefy-automations on skillZs</a>