mail-mcp-server
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": true
} |
| logging | {} |
| prompts | {
"listChanged": true
} |
| resources | {
"subscribe": false,
"listChanged": true
} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| listConnectionsA | List the configured mailboxes. Call first when the mailbox to use is not known yet: name is the value for the 'connection' argument of every other tool, description says what the mailbox is for, configError explains why an entry cannot be used. This reads local configuration without signing in. localDataAvailable indicates a local data directory, not complete or up-to-date mail; use listFolders and syncStatus to inspect coverage. |
| getAttachmentA | Read an attachment's saved extracted text as Markdown, in chunks, with its metadata and local file paths. This reads existing text; it does not convert the file on demand. If text is absent, extracted text is unavailable, not proof that the original attachment is empty. The original may still be available at path; path is absent if the file is missing. Get file from getMessage's attachments[].file or a search hit's snippetAttachmentFile, keeping that message's connection and key. To continue a long text, call this tool again with the same connection, key and file and offset=nextOffset. Stop when there is no nextOffset. |
| getMessageA | Read one locally stored message: headers, a body chunk as Markdown, and an attachment list. nextOffset continues only the body; headers and the attachment list are returned on each call. If body is absent, saved body text is unavailable; inspect state and error rather than assuming the original message was empty. To read an attachment, call getAttachment with the same connection and key, and file=attachments[].file. Use file, not name or path. The list includes files extracted from attached archives and messages; parent is the containing attachment's file. For the conversation, call getThread with the same connection and key. |
| listFoldersA | List locally known folders in one connection, with folder keys, paths and local indexed message counts. Pass a folder's key as folder to listMessages or search; keep the same connection. synced=false means a completed folder sync has not been recorded and messages may be missing. synced=true does not guarantee current mail; use syncStatus for the latest sync's time and outcome. This tool does not discover folders on the server. |
| listMessagesA | Browse locally indexed messages in one folder, newest first, optionally within a date range. Undated messages come last without date bounds and are excluded with bounds. For keyword search use search; for a date range across all folders use search without query. Returns cards without bodies. Pass a card's key and the same connection to getMessage to read it, or to getThread for its conversation. Every stored copy counts separately here; search and getThread group recognized copies. read/flagged describe the last sync observation. |
| searchA | Search locally synced messages in one connection. Choose query and field for text search; optionally restrict by folder and dates. Text results are most relevant first. To list messages by date alone, omit query and supply since or until; results are newest first, without snippets. Subject, body and attachment text support Russian and English word forms; irregular forms and synonyms may be missed. If results are sparse, try fewer words, other forms, synonyms or the other language in separate calls. An empty result does not prove the mail is absent: only synced, indexed content is searched. Read a hit with getMessage using the same connection and the hit's key. Snippets mark matches as word, but may show only part of a match or body context. If a hit has snippetAttachmentFile, read that attachment with getAttachment using the same connection, the hit's key and file=snippetAttachmentFile. Recognized copies are returned once; copies lists other matching keys and folders. total and paging count these groups. |
| syncA | Refresh one connection's local mail copy from the mail server, including new messages, removals, moves and read/flag states. The remote mailbox is not changed. Call when the user needs newer mail than the local copy. Runs in the background; the first sync can take a long time. status=started means launched, not finished. For started or alreadyRunning, check syncStatus with the same connection while state is running; do not call sync again to check progress. lockedByOtherProcess means another process holds the local write lock and this call started no sync. That process may be an offline command; syncStatus reports sync runs only. For refused, relay message to the user and do not retry: after a rejected sign-in, the user must fix the credentials and run mail-sync in a terminal. |
| syncStatusA | Read local progress or the result of the current or last sync; this does not start a sync or contact the mail server. state=running means still working; completed means the run finished; failed means the run stopped with an error; interrupted means the syncing process ended before finishing; never means no sync is recorded. phase is the stage reached; checkingLocal and checkingFolders can take minutes with no folder progress yet. While running, other tools may see incomplete results. Check state to decide whether to keep waiting. The failed count is a count of messages: completed can still have failed>0. Inspect error and signInRejected for a failed run. If signInRejected is true, tell the user to fix credentials and run mail-sync in a terminal; repeated sync calls cannot recover it. Timestamps describe this run, not a guarantee that the local mail is current now. |
| getThreadA | List the locally indexed conversation containing a message, across all folders of one connection. Returns cards without bodies, oldest first, with undated messages last. Only locally indexed messages can appear. Messages are linked by reply headers (Message-ID, In-Reply-To, References), not by subject or participants. Read each message with getMessage using the same connection and that card's key. Recognized copies are returned once, with other keys and folders under copies; total and paging count groups. |
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 9 tools
Each tool has a clearly distinct role: connection discovery, folder browsing, message browsing/reading, search, thread reading, attachment reading, sync, and sync status. The descriptions explicitly disambiguate close pairs like listMessages vs. search and getMessage vs. getThread.
Most tools follow a consistent camelCase verb_noun pattern such as listConnections, getMessage, listFolders, and getThread. The bare verbs search and sync plus syncStatus are minor deviations but still readable and predictable.
Nine tools is well-scoped for a local mail access server. Each tool earns its place by covering a specific part of the browse/read/search/sync workflow.
The set covers the core read-only mail workflow: connections, folders, messages, search, threads, attachments, syncing, and sync status. It lacks compose/send or message mutation operations, but those may be outside the apparent local-copy purpose.