cargo-orchestration
Make Cargo actually run something, or show what it would run — execute one connector action, run a multi-step workflow, trigger a batch across a whole segment or model, message an AI agent, build or edit a node graph, draw a workflow, tool or play as a diagram, and query the runtime tables (runs, ba
By getcargohq · 6,756 installs
npx skills add getcargohq/cargo-skills --skill cargo-orchestration
Source repository · Upstream listing
Cargo CLI — Orchestration
Runtime operations for the Cargo platform.
What do you want to run?
Fanning out across many records ( action execute batch , batch create )? Sample first. Run 10–20 records, report the observed cost and hit rate, then ask the user to approve the full enrollment — quoting the record count and the credit estimate . See [Create a batch → the sample gate]( the sample gate).
Every node execution costs 0.01 credits — 1 credit per 100 — whatever the node is.
branch , filter , switch , variables and the rest carry no provider price, but
they are not free: the charge is per execution , so a graph's cost has two terms,
(provider cost × records) + (nodes × records ÷ 100) . On step heavy, action light
graphs the second term dominates. It shows up in no per node field — not
executions[].creditsUsedCount , not spans.execution credits used count — only in
billing usage get metrics unit orchestration.executions . Quote both terms in the
approval message ([ ../cargo gtm/references/cost discipline.md ](../cargo gtm/references/cost discipline.md) §1).
Find the action before you hand write the JSON. cargo ai orchestration
action list <keywords searches the integration catalog, Cargo native actions,
workspace tools, and agents in one call — free, runs nothing — and each result
carries a ready to paste action object (with connectorUuid already filled
in), the action's credit costs , and its autocomplete slugs. Narrow with
kind connector native tool agent , integration slug <slug , limit
(no default: omit it and every match comes back). unknown command means the CLI predates it — refresh.
action execute , not node execute , is the default for running something.
node execute is a debug surface for a node that already lives in a workflow:
it requires workflow uuid , release uuid , node , computed config
and context (all five, enforced client side), and it bills like any live
call. If you just want an operation's output — enrich a domain, call a connector
action, invoke a tool or agent — use action execute / action execute batch
with a small action + data payload. Only reach for node execute when
verifying one node's behavior before running the full graph.
Terminology: An orchestration tool is a saved on demand workflow (listed via tool list ). An action is a single operation you execute without building a workflow — it can embed a saved orchestration tool ( kind: "tool" ), call a third party connector ( kind: "connector" ), invoke an AI agent ( kind: "agent" ), or run a built in platform operation ( kind: "native" ).
Composing a node graph? Build it from dedicated actions + expressions, in this order:
1. A dedicated action. Search first with action list <keywords (free): connector
actions, native actions ( agent , modelUpsert , branch , group …), tools.
2. An expression for the glue. It's inline JavaScript in the field that needs the
value: reshaping, payloads, conditions, arrays.
3. HTTP , only if step 1 found no action for that API.
4. A script node , only if the logic can't fit in an expression.
See references/node selection.md .
Show the graph, don't describe it. Before deploying a draft, and whenever
the user asks what a workflow or play does, draw it:
cargo ai orchestration node diagram workflow uuid <uuid format ascii raw
(free, runs nothing; format needs CLI ≥ 1.0.56, the command itself ≥ 1.0.54).
Routing, fallback edges, and which steps bill are what the user is actually
approving, and prose flattens all three. Pick the format by where the output
goes: ascii renders a picture a person can read in a terminal or a chat
reply; mermaid (the default) is source code, correct only when you are
pasting into a PR, a doc, or a page that renders it. Sources, the ASCII legend,
cost marking, and the duplicate slug footgun: references/node diagram.md .
References:
references/examples/actions.md — action execute and execute batch examples
references/examples/tools.md — tool (on demand workflow) examples
references/examples/plays.md — play (segment driven automation) examples
references/examples/agents.md — AI agent chat examples
references/examples/templates.md — pre built workflow templates
references/examples/queries.md — orchestration query execute (ClickHouse: runs/batches/spans/records) SQL examples. For storage query (workspace storage), see the cargo storage skill.
references/examples/segments.md — segment fetch and filter examples
references/nodes.md — full node creation guide (kinds, native actions, expressions, validation, routing)
references/node diagram.md — draw a node graph as a Mermaid flowchart ( node diagram ): every source (workflow / draft / release / run / raw nodes), marking paid nodes, highlighting a failing node, and why diagrams key on uuid rather than slug
references/node selection.md — build from dedicated actions + expressions (action → expression → HTTP → script , in that order): expressions are inline JavaScript, where the logic goes (inline in one field, a shared variables node, or a script ), native actions to prefer over code/HTTP, and expression traps (silent empty paths, ISO strings arriving as Date , testing with expression eval )
references/filter syntax.md — complete filter condition reference
references/polling.md — async polling patterns, error handling, retry strategies
references/response shapes.md — full JSON response structures
references/troubleshooting.md — common errors, plus a "Debugging a workflow run" section for runs that succeed but produce wrong output (wrong branch routing, empty downstream values)
Diagnosing after the fact? For the ordered forensic runbooks built on these surfaces — trace one run, sweep a batch for errors grouped by root cause, profile a play's credit spend — load the [ cargo diagnostics ](../cargo diagnostics/SKILL.md) skill.
Bootstrap
Already signed in ( cargo ai whoami returns a workspace)? Skip to the next section.
Every command prints JSON to stdout; failures exit non zero and print {"error": "...", "status": ..., "body": ...} to stderr (the API's own errorMessage or reason is inside error and body ). Anything that creates a run or a batch is async — pass wait until finished or poll the matching get . When the full skill bundle is installed, [ ../cargo/references/prerequisites.md ](../cargo/references/prerequisites.md) adds the CLI version pin, token scopes, and the admin only surface.
Discover resources first
Most commands require UUIDs. Always discover them before acting.
Plays vs tools: Both are backed by a workflow. A play is a segment driven automation — it reacts to data changes in a segment (records added, updated, removed). A tool is an on demand workflow — triggered manually, via API, or on a cron schedule. Workflows don't have a name field; use play list or tool list to find names and extract the workflowUuid .
Retrieve in the UI: plays live at app.getcargo.io/workspaces/<WORKSPACE UUID /plays/<PLAY UUID and tools at app.getcargo.io/workspaces/<WORKSPACE UUID /tools/<TOOL UUID . Get <WORKSPACE UUID from cargo ai whoami under workspace.uuid .
Designing a new tool or play? Check templates first — they are pre built node graphs for common automation patterns (enrichment pipelines, CRM syncs, lead scoring) and are an excellent starting point. List templates with cargo ai orchestration template list and inspect a specific one with cargo ai orchestration template get <slug . Templates are tagged by kind so you can find ones suited for tools ( "kind":"tool" ) or plays ( "kind":"play" ) right away. See references/examples/templates.md for the full guide.
Compatibility rules:
run create — only works with tool workflows (or no workflowUuid ). Play workflows return playNotCompatible .
batch create — allowed data kinds depend on the workflow type:
Play workflows: filter , recordIds , segment , change . Trigger a play with filter ; segment takes a standalone segment only, never the segmentUuid from play list . file is rejected ( invalidDataKind ), and a filter or recordIds on a model other than the play's is rejected ( modelDoesNotBelongToPlay ).
Tool workflows (or no workflowUuid ): usually file or records ; the model backed kinds are not refused for a tool
Quick reference
Polling async operations
All operations are asynchronous. Either poll until terminal state, or pass wait until finished to block.
action execute returns a run. action execute batch returns a batch. They poll the same way:
Result type Poll command Interval Done when
Run run get <uuid 2s status is success , error , cancelled , or skipped ( run.finishedAt set)
Batch batch get <uuid 5s status is success , error , cancelled , or skipped ( batch.finishedAt set)
Agent message message get <uuid 2s status is success , error , or cancelled
For long running batches (1000+ records), increase the interval to 10 15s after the first minute.
Execute actions
Run a single action — no workflow or node graph needed.
Find it first — action list
Free, executes nothing. All query terms must match (AND); a hit on the action
slug or name ranks above the integration, which ranks above the description.
Returns {query, totalMatches, results[]} where each result carries name ,
description , score , an action object to paste straight into execute /
execute batch / get output schema , the workspace connectors for that
integration, credits (the cost table, when the action bills), and
autocompletes (config fields that need a picked id — a HubSpot object type, a
Slack channel). Returns every match unless you pass limit .
Action kinds: tool , connector , agent , native (plus worker , which calls a hosted worker with workerUuid , method , path ). See references/examples/actions.md for all action kinds, parameters, retry config, response shapes, and end to end examples.
A top level action has no config — omit it. Inputs belong in data /
records ; execute and execute batch take the action with no config key
at all, which is exactly what action list hands back, so its result pastes
straight in. ( "config": {} is still accepted there, harmlessly.)
get output schema takes the same pair. The action object from
action list , plus data when the action's output depends on its inputs —
a HubSpot object type or a target sheet decides which fields come back
( data needs CLI ≥ 1.0.67 ; the config less action works from 1.0.66).
Workflow nodes , an alert's actions , a play's healthAlertActions , and
an agent's or MCP server's actions are where config still lives; that is
a node's configuration, not an action's input.
Unknown inputs are refused before the run; inputs put in config are stripped.
action execute and execute batch check a connector or native action's inputs
against its schema before creating anything (the MCP execute action tools and an
agent's action calls do too): an undeclared key — top level or nested inside a
declared object — fails with invalidData naming it ( Unknown field: secs ; in a
batch Record 1: Unknown field: fields.job titles , and one bad record refuses the
whole batch). Extra top level columns on a batch record still pass, tool actions
are not checked, and inside a workflow node an unknown key is still dropped
silently. A config key is different: the guard that used to answer
A top level action does not use actio