---
title: "Drafts"
description: "Unsent messages saved in the mailbox."
url: "https://openemail.uk/docs/mcp/tools/drafts"
area: "MCP server"
category: "Tools"
---

# Drafts

Unsent messages saved in the mailbox.

## Drafts tools

| Tool | What it does |
| --- | --- |
| listDrafts | The drafts, most recently saved first, each with its subject, recipients and sender. `query` searches them. |
| getDraft | One draft in full: its sender, recipients, subject, the thread it replies to, its attachments and its body. |
| createDraft | Save a new draft without sending it. Every field is optional, and `threadId` makes it a reply. |
| updateDraft | Change fields on a draft. A field you leave out keeps its value, and a list replaces the saved one whole. |
| deleteDraft | Delete a draft for good. It does not go to the Bin. |

> Reading needs “Read drafts” (`drafts:read`) and saving, changing or deleting needs “Create and edit drafts” (`drafts:write`). A client limited to some addresses sees only the drafts from them, and a draft it saves needs a `from` it may send as.

> In the app’s chat, saving, changing and deleting a draft ask first unless you asked for them.

## Reference

### `listDrafts`

The unsent drafts in the mailbox, most recently saved first, each with its id, subject, recipients and sender. query searches the subject, the sender and the start of the body. When more follow, the last line gives a pageToken: call again with the same query and that pageToken.

- Scopes: `drafts:read`.
- The app's assistant runs it without asking.
- Toolkit: `drafts`.

**Inputs**

- `query` (`string`)
- `limit` (`integer`, at least 1, at most 100)
- `pageToken` (`string`)

Also available in: API [`GET /drafts`](https://openemail.uk/docs/api/reference/drafts#get-drafts); SDK [`drafts.list()`](https://openemail.uk/docs/sdk/reference/drafts#list), [`drafts.listAll()`](https://openemail.uk/docs/sdk/reference/drafts#listAll), [`drafts.iterate()`](https://openemail.uk/docs/sdk/reference/drafts#iterate).

### `getDraft`

One draft in full: its sender, recipients, subject, the thread it replies to, the names of its attachments and its body as saved. Take the id from listDrafts.

- Scopes: `drafts:read`.
- The app's assistant runs it without asking.
- Toolkit: `drafts`.

**Inputs**

- `draftId` (`string`, required, not empty)

Also available in: API [`GET /drafts/{id}`](https://openemail.uk/docs/api/reference/drafts#get-drafts-id); SDK [`drafts.get()`](https://openemail.uk/docs/sdk/reference/drafts#get).

### `createDraft`

Save a new draft without sending it, as the composer does when you close it. Every field is optional, and html wins over text when both are given. from is the address it will be sent as, and threadId makes it a reply to that thread. sendEmail with the draft id sends it later.

- Scopes: `drafts:write`.
- The app's assistant asks first unless you asked for it.
- Toolkit: `drafts`.

**Inputs**

- `to` (`string[]`)
- `cc` (`string[]`)
- `bcc` (`string[]`)
- `subject` (`string`, up to 998 characters)
- `html` (`string`, up to 1000000 characters)
- `text` (`string`, up to 1000000 characters)
- `from` (`string`)
- `threadId` (`string`)

Also available in: API [`PATCH /drafts/{id}`](https://openemail.uk/docs/api/reference/drafts#patch-drafts-id), [`POST /drafts`](https://openemail.uk/docs/api/reference/drafts#post-drafts); SDK [`drafts.update()`](https://openemail.uk/docs/sdk/reference/drafts#update), [`drafts.create()`](https://openemail.uk/docs/sdk/reference/drafts#create).

### `updateDraft`

Change fields on a saved draft. A field you leave out keeps its value, and a list you give replaces the saved one whole, so to with one address drops the others. from null clears the sender. Take the id from listDrafts.

- Scopes: `drafts:write`.
- The app's assistant asks first unless you asked for it.
- Toolkit: `drafts`.

**Inputs**

- `draftId` (`string`, required, not empty)
- `to` (`string[]`)
- `cc` (`string[]`)
- `bcc` (`string[]`)
- `subject` (`string`, up to 998 characters)
- `html` (`string`, up to 1000000 characters)
- `text` (`string`, up to 1000000 characters)
- `from` (`string`, nullable)
- `threadId` (`string`)

Also available in: API [`PATCH /drafts/{id}`](https://openemail.uk/docs/api/reference/drafts#patch-drafts-id), [`POST /drafts`](https://openemail.uk/docs/api/reference/drafts#post-drafts); SDK [`drafts.update()`](https://openemail.uk/docs/sdk/reference/drafts#update), [`drafts.create()`](https://openemail.uk/docs/sdk/reference/drafts#create).

### `deleteDraft`

Delete a draft for good. It does not go to the Bin and cannot be brought back. Take the id from listDrafts.

- Scopes: `drafts:write`.
- The app's assistant asks first unless you asked for it.
- Toolkit: `drafts`.

**Inputs**

- `draftId` (`string`, required, not empty)

Also available in: API [`DELETE /drafts/{id}`](https://openemail.uk/docs/api/reference/drafts#delete-drafts-id); SDK [`drafts.delete()`](https://openemail.uk/docs/sdk/reference/drafts#delete).
