Test action
test_actionRun one action of a connected app for real with the given input, on its own, outside any workflow: records are written, messages sent, and credits spent. A read-only action (find, get or list rows or records, search) is how to look at the person's data in that app, e.g. to check what a form or workflow just wrote to a sheet, instead of asking the person to look. Use it also to check a step works before publishing. Confirm with the user before calling this.
Returns Stepper's result as it came back: { status: "success" | "error" | "async", data, error, descriptions? }. An async action also carries asyncId, and result once it finished. Every call runs the action again, even with identical input. Pass workflow and node (the step's #id) to store a successful output on that step of the draft as its example, as the editor's "Run test action" does: the step must run this app, action and connection; it is checked before anything runs. The answer then carries example: { stored, note, workflow_version?, checks? } (checks: warnings on paths other steps read from this step that the stored output does not offer), and the draft's version changes, so fetch #source again (or pass workflow_version as edit_source's expected) before the next edit. A step that a later step or rule reads needs an example before the workflow can be published over MCP, and its paths can only be checked against one; edit_source and create store the app's own example for an action that has one, so test_action is only needed for the others. status "timeout" means Stepper did not answer in time and the action may still be running: the answer carries a retry_key; call again with the same input and that retry_key to get the attempt's outcome instead of running it twice (marked replayed: true), or status "in_progress" while it still runs. Read the timeout's message for how long the key holds, and never retry without it. error "dispatcher_error" means Stepper failed after the action may have run: it carries a retry_key the same way.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"app": "<app>",
"action": "<action>",
"connection": "<connection>",
"input": "<input>"
},
"name": "test_action"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | The app id, exactly as list({ type: "app" }) returned it. | |
| node | No | With workflow: the #id of the trigger or step in the workflow's draft the example is for. | |
| input | Yes | The parameter values chosen so far, key → value (plain values, not the source forms). Later parameters often depend on earlier ones. | |
| action | Yes | An action key, from fetch on the app. | |
| workflow | No | Optional: a workflow id, as list or fetch returned it, to store the output on one of its steps as that step's example. Needs node too, and write access to the workflow. | |
| retry_key | No | Only to retry after status "timeout", status "in_progress" or error "dispatcher_error": the retry_key that answer returned. Omit it to run the action. | |
| connection | Yes | A connection id for this app, from list({ type: "connection" }) or fetch on the app. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | ||
| error | No | ||
| result | No | ||
| status | No | ||
| asyncId | No | ||
| example | No | ||
| descriptions | No |