# Message drafts



Connected **Gmail**, **Outlook**, and **Slack** accounts let an agent draft a new
plaintext message for a human to review, edit, and send — instead of the agent
sending directly. Email drafts have editable To, Cc, Bcc, Subject, and body;
Slack drafts have an editable destination (an existing channel or DM
conversation, with an optional parent thread) and text. Attachments, email
replies, and scheduled sends are outside this feature, and SMS is not supported.

<Callout title="Scope">
  Creating or editing a draft never sends a message or creates a provider
  mailbox draft. Send is only available to the signed-in human through the
  review card (Web and Mobile) or the HTTP API below — never to the model.
  Connect the relevant [connector](/docs/agents/vaults-and-mcp#connectors)
  before asking an agent to compose one.
</Callout>

## Tools [#tools]

An agent with a connector's send/draft tools enabled gets review tools instead
of tools that send directly:

| Tool                               | Description                                                                                                                                                                                                                                      |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `gmail_send`, `gmail_create_draft` | Create an editable inline email draft instead of sending or creating a mailbox draft. Plain text, new emails only.                                                                                                                               |
| `outlook_create_draft`             | Creates an editable inline email draft. Replaces Outlook's direct send tool.                                                                                                                                                                     |
| `slack_create_draft`               | Creates an editable inline Slack message. Requires an exact channel/DM ID and optional parent thread timestamp, resolved first with Slack's search tools. Replaces Slack's hosted send/draft tools; a read-only Slack selection stays read-only. |
| `message_draft_status`             | Reads a draft's current status and revision. The model should read this rather than assume a message was sent.                                                                                                                                   |
| `update_message_draft`             | Edits a draft's fields at its current revision. It cannot send.                                                                                                                                                                                  |

Custom manifest MCP servers keep their own, separate tool-approval flow and are
unaffected by this feature.

## Review and send [#review-and-send]

The card shows the editable fields and lets the user **Send** or **Discard**.
Each edit and action is checked against the draft's current **revision**;
editing with a stale revision is rejected so concurrent or reloaded clients
never silently overwrite each other. Sending freezes the saved fields and pins
one delivery attempt — retries can't produce a second message.

Because a network or provider error can leave delivery uncertain, Send does not
mean "delivered": drafts move through **Sending** → **Sent** or **Unconfirmed**
(never automatically resent), reconciled against a read-only provider lookup
(for example, Gmail's Sent mailbox, or Slack's conversation history). An
**Unconfirmed** draft can reconnect the same provider account and re-check
delivery without creating a new attempt; connecting a *different* account
can't authorize sending it. Once delivery is confirmed, the agent's turn
continues automatically with the sent content and receipt.

<Callout type="warn" title="Outlook re-authorization">
  Outlook drafts require the delegated `User.Read` scope to pin the sending
  mailbox identity. Accounts connected before this scope was added need to
  reconnect through [Connectors](/docs/agents/vaults-and-mcp#connectors)
  before Outlook drafts work again.
</Callout>

## API [#api]

Drafts live under the owning session and are addressed by the actor/organization
that created them:

| Method | Path                                  | Description                                                                                                                                                                                                                          |
| ------ | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `GET`  | `/v1/sessions/{id}/drafts/{draft_id}` | Get a draft's current fields, status, and revision.                                                                                                                                                                                  |
| `POST` | `/v1/sessions/{id}/drafts/{draft_id}` | Apply an action at an exact `revision`: `edit` (with updated `fields`), `send`, `discard`, `reconcile` (re-check delivery), or `reconnect` (rebind to the reconnected account). Returns `409` on a stale revision or a locked draft. |

A draft's `status` is one of `ready`, `sending`, `sent`, `failed`,
`uncertain` (shown as **Unconfirmed**), or `discarded`. Responses carry
`Cache-Control: private, no-store`.

See [API reference](/docs/agents/api-reference#authentication) for
authentication.
