> ## Documentation Index
> Fetch the complete documentation index at: https://developer.lofty.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Confirmation tiers

> The confirm_token protocol, and the threshold set per action rather than per tool.

Confirmation is one protocol, learned once: a write past its risk threshold returns `needsConfirmation: true` with a single-use `confirm_token`, valid five minutes and bound to a hash of the arguments. A token issued for two recipients cannot be replayed for two hundred.

```json Response when confirmation is required theme={null}
{
  "needsConfirmation": true,
  "confirm_token": "3f9c1e2a-...",
  "summary": "Permanently delete 3 lead(s): 100001, 100002, 100003.",
  "expires_in_seconds": 300
}
```

If your client supports MCP **elicitation**, the prompt is raised in your own interface and you answer there. If it doesn't, replay the *identical* call with `confirm_token` added within five minutes.

## Tiers

The threshold is set **per action, not per tool** — [`manage_leads`](/mcp/tools/manage-leads) alone spans "add a note" and "delete a lead", three orders of magnitude apart in consequence. Confirming everything trains people to click through; confirming nothing eventually loses data.

| Tier               | Actions                                                                                                                                                                            | Rule                                                                                                                                                                                                 |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Always**         | `trash`, `delete_note`, `delete_manual_log`, `manage_tasks.delete`, all of `send_message` / `notify_agent` / `manage_webhooks`, `deactivate_agent`, `add_agent`, `sync_brokermint` | Irreversible, externally visible, or affects other people. A `send_message` confirmation must show the recipient count and the full rendered body.                                                   |
| **Over threshold** | `create`, `update`, `add_to_pool`, `create_plan_tasks`, all of `manage_transactions`                                                                                               | Confirms past 10 affected records, showing a count and a sample by name.                                                                                                                             |
| **Never**          | `add_note`, `add_manual_log`, `add_activity`, `add_inquiry`, `update_property`, `manage_tasks.create`/`update`/`complete`, `mute`, `unmute`, all of `generate_lead_insight`        | Additive, reversible, and scoped to a single lead — `mute` reverses with `unmute` ([`manage_sales_agent`](/mcp/tools/manage-sales-agent)), a note or manual log can be deleted, a task un-completed. |
| **Its own case**   | `assign`                                                                                                                                                                           | Changes ownership and is visible to the new owner, but is a high-frequency daily action. Confirms by default, configurable per connection; `preview: true` never confirms.                           |
