get_action_status
Read the current status of a pending or past action by its ID. Use as a polling fallback when your MCP client doesn't render notifications/resources/updated for picnic://action/{action_id}, or to re-sync state after a disconnect.
Side-effect: when called on a broadcast or submitted action, this tool opportunistically queries the bundler/RPC for the userOp receipt and may advance status to executed or failed (and populate tx_hash + block_number) before returning. Best-effort and never throws — but it means this tool isn't strictly read-only.
Required scope: read:actions
Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
action_id | string | yes | ID of an action returned by transfer, swap, or any of the card_* tools. The action must belong to the same user + OAuth client that created it. |
Returns:
| Field | Type | Description |
|---|---|---|
action_id | string | Echoed back. |
type | string | One of "transfer", "swap", "cardFreeze", "cardUnfreeze", "cardLimitSet". |
status | string | Current status — see enum below. |
summary | string | Human-readable summary the user saw on the sign page. |
chain_id | number | Chain the action targets. |
smart_account | string | Smart account address the action operates on. |
tx_hash | string | null | On-chain tx hash. null until reconciliation lands the receipt. |
user_op_hash | string | null | The 4337 userOpHash. Computed at proposal time and present on every action from then on (including proposed/expired actions that never broadcast). Don't infer "this action broadcast" from user_op_hash being present — check broadcast_at or status instead. |
block_number | number | null | Block where the tx confirmed. Populated alongside tx_hash. |
error | string | null | Error message if the action ended in failed, or if the bundler RPC returned an error during submission (in which case status may still be submitted while reconciliation runs). |
created_at | date | When the action tool created the pending action. |
expires_at | date | TTL deadline for signing. |
signed_at | date | null | When the user signed (status moved to signed). |
broadcast_at | date | null | When the bundler accepted the userOp (status moved to broadcast). |
executed_at | date | null | When the on-chain receipt landed. |
status_history | array | Audit trail of every status transition. |
status_history[].status | string | Status at this entry (same enum as the top-level status). |
status_history[].timestamp | date | When the transition happened. |
status_history[].detail | string | null | Optional context, e.g. an error message attached to a failed transition. |
Status enum:
| Status | Meaning |
|---|---|
proposed | Created by the action tool, awaiting user signature. |
signed | User has signed; the sign endpoint is submitting the action. |
submitted | The userOp is being handed to the bundler RPC (or, for card actions, the downstream Gnosis Pay API). Persists transiently or until reconciliation if the RPC errored mid-flight. |
broadcast | Bundler accepted, user_op_hash known, awaiting on-chain receipt. |
executed | Mined successfully on-chain. |
failed | On-chain revert. |
expired | TTL elapsed before the user signed. |
rejected | User declined at the sign page. |
Errors:
Action not found: …— theaction_iddoesn't exist (or it's been retained beyond the 24-hour window).Action does not belong to the authenticated user/Action belongs to a different OAuth client— the action was created by a different user/agent.- Scope errors — caller is missing
read:actions.
Example prompt:
"Did my swap go through?" — agent calls
get_action_statuswith the most recent action_id.