Thunderbird MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| mail_searchA | Search the user's mail. Combine
|
| mail_listA | List messages in one folder, newest first by default. Use |
| mail_getA | Read one message.
|
| mail_get_manyA | Read up to 50 messages in one round trip — for triaging a search result. |
| mail_get_sourceA | Fetch a message's raw RFC 5322 source, for header forensics. On IMAP this needs the message to be available offline; the tool says so rather than returning a partial. |
| mail_attachmentsB | List a message's attachments with part names, sizes and content types. |
| mail_save_attachmentA | Write one attachment to a directory on this machine.
|
| mail_markA | Set read/flagged/junk state or adjust tags on one or more messages. Cheap and reversible, so no confirmation is required. Tag keys come from
|
| mail_moveB | Move messages into another folder. On IMAP the move is asynchronous — the tool waits for Thunderbird to confirm before returning, so a following search reflects the change. |
| mail_copyC | Copy messages into another folder, leaving the originals in place. |
| mail_archiveA | Archive messages using each account's configured archive layout. |
| mail_deleteA | Delete messages. Moves to Trash unless A permanent delete cannot be undone from Thunderbird, so prefer the default and let the user empty Trash themselves. |
| mail_tagsA | List the tags defined in Thunderbird, with keys, labels and colours. |
| mail_tag_upsertA | Create a tag, or recolour/rename an existing one.
|
| mail_tag_deleteB | Remove a tag definition. Messages keep the raw keyword but lose the label. |
| folder_listA | List mail folders with their ids and message counts. With no filters this browses: every account's root folder plus one level
below it. Raise Counts come from Thunderbird's own folder database. On IMAP that database can lag until the folder has been selected once in Thunderbird, so treat unread and total counts as close rather than exact. |
| folder_getA | Get one folder: counts, special use, flags and IMAP quota. Use this to re-check a count after a move or a delete; |
| folder_capabilitiesA | Report what may be done to a folder before attempting it. Answers whether the folder can hold messages, take subfolders, be renamed, be deleted, or have messages deleted from it. Worth a call before offering the user a plan that a server would refuse. |
| folder_get_unifiedA | Get the unified folder that spans every account, e.g. all inboxes at once. Its id works anywhere a folder id is accepted, so |
| folder_createC | Create a folder inside another folder, or at the top of an account. |
| folder_renameB | Rename a folder, keeping its messages and subfolders. |
| folder_moveA | Move a folder under a different parent, with its subfolders.
|
| folder_copyA | Copy a folder and its contents under another parent, leaving the original. |
| folder_deleteA | Delete a folder, its subfolders and every message in them. Thunderbird moves the folder to Trash unless it is already inside Trash, in
which case it goes for good. Check |
| folder_mark_readA | Mark every message in a folder as read. There is no per-message undo for this, which is why it asks first. On IMAP the flags are pushed to the server. |
| folder_set_favoriteA | Add or remove a folder from the user's favourites. Cosmetic and reversible — it only affects the folder pane's Favourites view, so it is not gated. Prompting for something this harmless would only train the user to click through the prompts that do matter. |
| folder_empty_trashA | Permanently delete everything in one account's Trash. This is not recoverable from Thunderbird. Give |
| folder_empty_junkA | Permanently delete everything in one account's Junk folder. Subfolders of Junk are emptied but kept, since they are usually filter targets the user set up deliberately. Not recoverable. |
| folder_sync_offlineA | Fetch an IMAP folder's message bodies so they are available offline. This is what |
| folder_compactA | Reclaim the disk space left behind by deleted messages. Deleted mail stays in the message store until the folder is compacted. Pass
|
| mail_sendA | Write a message. Saves a reviewable draft unless
|
| mail_replyA | Reply to a message. Saves a reviewable draft unless Thunderbird derives the recipients, the subject and the quoted original;
|
| mail_forwardB | Forward a message. Saves a reviewable draft unless
|
| mail_draft_saveA | Save a message without sending it, as a draft or a template. Nothing leaves the machine, so this is not gated — a draft is exactly the thing to produce when you want the user to review before anything is sent. A template is the reusable kind: Thunderbird keeps it in Templates and opens a copy when the user picks it. Recipients are optional here, unlike a send. |
| mail_draft_getA | Read a saved draft and its revision without opening a composer. Pass exactly one reference. Protected or oversized drafts return metadata with editable=false; a preview must never be used as a replacement body. Unsaved changes in an open Thunderbird window are not this saved snapshot. |
| mail_draft_updateA | Update the saved draft only if its reviewed revision is still current. Omitted fields stay unchanged; an empty recipient list clears that field.
Body replaces the complete body, including any signature, in its existing
format. Sender identity cannot change. If the user's composer is open,
return DRAFT_BUSY and leave the window for the user to save or close.
Reuse request_key to retrieve an operation without applying it twice.
|
| mail_draft_sendA | Send exactly the saved draft revision the user reviewed, or queue it. A changed or open draft is refused. Reuse request_key after interruption; unknown means sending may have occurred and must not be retried with a new key. mode=later queues in Outbox, not at a scheduled date. |
| mail_compose_openA | Open a populated compose window for the user to finish by hand. The right answer whenever the wording matters more than the automation, or when the user declined a send: they get the draft in front of them with the cursor in it. Nothing is sent or saved, and the user sees the window appear, so this is not gated. |
| mail_send_statusA | List messages sitting in the Outbox, unsent. An empty list is the normal answer. Anything here was queued with
|
| search_globalA | Ranked search of indexed mail, with stable snapshot pagination. Start with |
| search_conversationA | Read a conversation oldest first, across indexed folders and accounts. Start with one message identifier. Continue with only cursor=nextCursor and limit. A snapshot holds at most 1,000 messages and expires after five minutes; a truncated conversation is explicitly reported. |
| search_index_statusA | Whether Thunderbird's global index is enabled, and how far along it is. Call this to explain an empty |
| search_saved_listA | List the saved searches (virtual folders) and what each one matches. |
| search_saved_createA | Create a saved search that appears in the folder pane.
Nothing is copied or moved — a saved search is a stored query. |
| search_saved_updateA | Redefine an existing saved search, by name or uri. Only what you pass is replaced; |
| search_saved_deleteA | Remove a saved search. The messages it listed are not touched. A saved search only stores a query, so deleting one loses the query and nothing else — but the query itself is not recoverable, hence the prompt. |
| tb_operation_statusB | Inspect a queued, completed or uncertain operation without repeating it. |
| tb_operation_listB | List this profile's local, body-free operation history for the last seven days. |
| tb_operation_cancelA | Stop steps not yet started. A send already dispatched cannot be recalled. |
| tb_statusA | Whether Thunderbird is attached, and which halves of the add-on loaded. Answered by the local daemon, so it works when Thunderbird is closed. Call it first whenever another tool reports that it cannot reach Thunderbird. |
| tb_waitA | Block until Thunderbird attaches to the bridge, then report status. Use it after |
| tb_eventsA | Read buffered Thunderbird notifications: new mail, folder and account changes. Continue with |
| tb_diagnosticsA | One report: versions, profile, which capabilities loaded, accounts, indexing. The first thing to fetch when anything behaves oddly. It includes whether this build permits unsigned add-ons and experiment APIs, which is what explains a half-installed bridge, and the message store type per account. |
| tb_consoleA | Recent lines from Thunderbird's error console, newest last. Narrow it with Lines the bridge writes with |
| tb_addonsA | List installed add-ons with their enabled and signature state.
|
| tb_restartA | Restart Thunderbird. Every call in flight fails, including other clients'. The bridge connection drops, so this returns before the restart happens and
the result says nothing about whether it succeeded — wait with |
| mail_batch_previewA | Preview changes to up to 500 messages without changing mail. A plan fixes the exact messages and expires after 15 minutes. Mark changes
read/flagged state and tags; move supports concrete folders in one account.
Any invalid message prevents applying the plan. History and undo metadata
stay local for seven days; message bodies are never stored in the journal.
|
| mail_batch_applyA | Apply a preview once and return its operation id for tb_operation_status. Repeating the same plan returns the existing operation, never a second job. Conflicts are reported per message. An uncertain outcome stops further work. |
| mail_batch_undoA | Undo confirmed batch changes whose touched fields have not changed again. Messages changed by someone else are reported as conflicts. Unknown results are never guessed. Repeating the call returns the existing undo operation. |
| mail_followupsA | Find possible follow-ups using outgoing mail and indexed reply headers. A candidate is not proof that a reply is required. By default inspect the last 30 days for conversations waiting at least seven days. Human replies close a conversation; automatic replies, mailing lists and self-only mail are excluded. Results name their evidence and incomplete coverage. No message is sent and no reminder is created. Continue with only cursor and limit; snapshots expire after five minutes. |
| mail_attachments_planA | Preview attachment downloads from up to 100 selected messages. The existing absolute directory, source attachments and safe collision-free names are frozen for 15 minutes. Filters use filename substrings and exact MIME types, not PDF contents. Limits are 200 attachments, 25 MiB per file and 250 MiB total. Invalid selections must be corrected before saving. |
| mail_attachments_saveB | Save a frozen attachment plan once, without overwriting existing files. Returns an operation id for tb_operation_status. Repeating the same plan returns the existing job. Results identify each source, path and checksum; successfully written files are not automatically deleted on cancellation. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 62 tools
Most tools target distinct resources and actions, and descriptions carefully distinguish overlapping clusters such as mail_search/search_global and mail_send/mail_draft_save/mail_compose_open. However, with 62 tools there is still some potential confusion between adjacent draft/send operations and between single-attachment versus planned batch-attachment saves.
Names consistently use snake_case with domain prefixes such as mail_, folder_, search_, and tb_. There are minor deviations like mail_attachments and mail_tags lacking an action verb, and mail_save_attachment being singular while related tools use attachments_plan/save, but the pattern is generally predictable.
62 tools is far beyond the typical well-scoped MCP surface, even for a full email client. The tools are organized and mostly purposeful, but the set is heavy enough that agents must navigate many adjacent operations and several niche tools could likely be consolidated.
The surface covers mail retrieval, search, composing, replies, forwarding, drafts, folders, moves/copies, deletes, tags, attachments, batch operations, saved searches, diagnostics, and operation tracking. For the apparent mail-focused domain, there are no obvious dead ends in core workflows.