Skip to main content
Glama
nurked

imail-mcp

by nurked

imail-mcp

πŸ‡·πŸ‡Ί ДокумСнтация Π½Π° русском: README.ru.md

An MCP server that connects Claude (Cowork / Claude Code / Claude Desktop) to your email so it can read, search, send, and organize your mail β€” directly from a conversation.

Runs as a resident background service (launchd) with a web admin UI, serving all your Claude clients over one Streamable HTTP endpoint β€” or as a classic per-client stdio server. iCloud Mail is the first supported provider; the internals are written against a provider-agnostic interface, so Gmail / Microsoft 365 adapters can be added later without touching a single tool.


Highlights

  • πŸ–₯️ Runs as a service β€” one long-lived process (launchd LaunchAgent, auto-start at login, auto-restart) shared by every MCP client over Streamable HTTP; stdio mode still works for per-client setups.

  • 🌐 Web admin UI β€” connect/disconnect Apple accounts, check live connection status, copy ready-made client configs, tail the service log β€” all at http://127.0.0.1:4577, localhost-only.

  • πŸ‘₯ Multiple accounts β€” connect several iCloud accounts; every tool takes an optional account parameter.

  • πŸ“₯ Read & search β€” folders, search with paging, full messages and whole threads, bulk fetch up to 20 full messages per call, attachments.

  • βœ‰οΈ Send & reply β€” compose, reply, reply-all, forward with correct threading headers.

  • πŸ—‚οΈ Organize, in bulk β€” move / archive / delete / flag up to 200 messages per call as a single IMAP command.

  • πŸ”’ Credentials stay local β€” account passwords and the service's access token live in the macOS Keychain, never in a plaintext file or env var.

  • πŸ›‘ Never sends silently β€” Claude must preview an email and get your approval first; on clients that support MCP elicitation, the server additionally asks you to confirm in-app before anything is sent.


Related MCP server: macos-mail-mcp

The Mac app

The nicest way to run imail-mcp is the menu-bar app in app/: a signed, notarizable iMail MCP.app that bundles the whole service as a self-contained binary (no Node required), shows live status in the menu bar, opens the control panel in its own window, and starts at login. Build it with cd app && npm install && npm run tauri build, then drag the .app from app/src-tauri/target/release/bundle/macos/ into /Applications. On first launch it takes over from the CLI-installed launchd service automatically.

Everything below β€” the CLI service, stdio mode, tools, security model β€” works the same with or without the app; the app is just a shell that owns the service process.

Quick start (CLI, no app)

Requires Node.js β‰₯ 18 and macOS.

git clone git@github.com:nurked/icloud-mail-mcp.git
cd icloud-mail-mcp
npm install
npm run build
node dist/index.js service install   # register + start the background service
node dist/index.js ui                # open the admin UI in your browser

In the admin UI:

  1. Accounts tab β€” connect your iCloud account (see the app-specific password note below). The login is verified live over IMAP, then stored in your Keychain.

  2. Clients tab β€” copy the ready-made one-liner for Claude Code, or the JSON block for Claude Desktop. Done.

Installing globally (npm link or npm i -g .) gives you the imail-mcp command used in the examples below; otherwise use node dist/index.js <command>.

CLI reference

imail-mcp                      stdio MCP server (for per-client mcpServers configs)
imail-mcp serve [--port N]     run the HTTP service in the foreground
imail-mcp ui                   open the admin UI (authenticated) in your browser
imail-mcp service install      install + start the launchd LaunchAgent
imail-mcp service status       show whether the service is installed/running
imail-mcp service uninstall    stop and remove the LaunchAgent

Default port: 4577. Logs: ~/Library/Logs/imail-mcp/imail-mcp.log.

Generating the app-specific password

Apple does not offer OAuth for iCloud Mail β€” the only supported path is IMAP/SMTP with an app-specific password (every iCloud account has 2FA):

  1. Open appleid.apple.com β†’ Sign-In and Security β†’ App-Specific Passwords.

  2. Click Generate an app-specific password, name it imail-mcp.

  3. Paste the 16-character password into the admin UI.


Wire it into Claude

Preferred β€” the shared service (copy the exact command, with your token filled in, from the admin UI's Clients tab):

claude mcp add --transport http imail http://127.0.0.1:4577/mcp \
  --header "Authorization: Bearer <token>"

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "imail": {
      "type": "http",
      "url": "http://127.0.0.1:4577/mcp",
      "headers": { "Authorization": "Bearer <token>" }
    }
  }
}

Fallback β€” per-client stdio (each client spawns its own process; no service needed):

{
  "mcpServers": {
    "imail": { "command": "node", "args": ["/absolute/path/to/dist/index.js"] }
  }
}

Security model

  • The HTTP service binds to 127.0.0.1 only and validates the Host header (DNS-rebinding protection, plus the MCP SDK's own check).

  • The /mcp endpoint requires a bearer token, generated on first run and stored in the Keychain β€” without it, other local processes can't read or send your mail through the service.

  • The admin UI uses a one-time token URL (imail-mcp ui) exchanged for an HttpOnly, SameSite=Strict session cookie; mutating API calls additionally require a custom header (CSRF).

  • Sending tools are gated three ways: prompt discipline (preview first), tool annotations (destructiveHint on sends/deletes), and elicitation β€” on supporting clients the server asks you to confirm each send in-app, and a declined confirmation returns sent: false.


Tools

Tool

What it does

list_accounts

Connected accounts and their live connection status

list_mailboxes

Folders with IMAP paths and special-use roles

search_messages

Search by from / to / subject / text / date / unread, with limit + offset paging

get_message

Full headers, text + HTML body, attachment metadata

get_messages

Bulk fetch up to 20 full messages in one call (missing UIDs reported, not fatal)

get_thread

The whole conversation, oldest β†’ newest

download_attachment

Save an attachment to a temp file; returns path + resource link

compose_preview

Build an email for review β€” does not send

send_email

Send now (after your approval; elicitation-confirmed where supported)

save_draft

Put it in Drafts for you to send yourself

reply

Reply / reply-all, threading headers set from the original

forward

Forward to new recipients with a quoted header

move_message / bulk_move

Move one / up to 200 messages

set_flags / bulk_set_flags

Read/unread, flag/unflag β€” one / up to 200

archive_message / bulk_archive

Move to Archive β€” one / up to 200

delete_message / bulk_delete

Move to Trash (expunge if already there) β€” one / up to 200

Every tool takes an optional account parameter (omit when only one account is connected). Bulk operations execute as a single IMAP command (UID set), not N round-trips. All tools declare MCP tool annotations (read-only / destructive / idempotent hints) and output schemas (structured content), per the 2025-06-18+ MCP spec.


How it works

Claude Code ─┐
Claude Desktop ──  Streamable HTTP (127.0.0.1:4577/mcp, bearer token)
Cowork β”€β”˜        β”‚
                 β–Ό
      imail-mcp service (launchd)  ──IMAP (imap.mail.me.com:993)──▢  iCloud
        β”‚  admin UI at /           └─SMTP (smtp.mail.me.com:587)──▢  iCloud
        └─ credentials + token ◀── macOS Keychain
           account registry     ◀── ~/Library/Application Support/imail-mcp/
  • IMAP (imapflow) reads and organizes; SMTP (nodemailer) sends; bodies are parsed with mailparser.

  • A shared provider pool keeps one live IMAP connection per account, with keepalive and transparent reconnect (dead sockets retry once).

  • Connections are lazy β€” adding the server to Claude doesn't touch your mailbox until you actually use it.

  • Built on MCP SDK 1.x (spec line 2025-06-18 / 2025-11-25). The transport layer is isolated in src/http/, so migrating to the stateless 2026-07-28 spec / SDK v2 is a contained change.

Project layout

src/
  index.ts              CLI: stdio server, serve, ui, service subcommands
  mcp.ts                MCP server factory: tools, schemas, annotations, elicitation
  bin/setup.ts          `imail-mcp-setup` β€” foreground service + admin UI (legacy entry)
  accounts/
    registry.ts         non-secret account registry (accounts.json)
    pool.ts             provider pool: lazy connect, keepalive, add/remove accounts
  auth/
    keychain.ts         Keychain storage: per-account credentials + HTTP token
  http/
    server.ts           HTTP service: /mcp (session map), /auth, /api, admin UI
    ui.ts               admin UI page (no framework, no build step)
  service/
    launchd.ts          LaunchAgent install/uninstall/status
  providers/
    types.ts            provider-agnostic MailProvider contract
    icloud.ts           iCloud IMAP/SMTP implementation (incl. bulk ops)

Adding another provider

The tools only ever talk to the MailProvider interface, so a new backend is one new file:

  1. Implement MailProvider (see src/providers/types.ts) in a new file under src/providers/.

  2. Wire it up in src/accounts/pool.ts.

The tools stay unchanged.


Troubleshooting

  • "No mail accounts are connected" β€” open the admin UI (imail-mcp ui) and connect an account on the Accounts tab.

  • "Login failed" when connecting β€” make sure you used an app-specific password, not your normal Apple ID password.

  • imail-mcp ui says the service isn't answering β€” start it: imail-mcp service install (persistent) or imail-mcp serve (foreground).

  • Port already in use β€” pass --port N to serve / service install, and update your client configs accordingly.

  • Upgrading from ≀0.1 β€” the old single-account Keychain entry is migrated automatically on first run; existing stdio client configs keep working.

  • Service logs β€” ~/Library/Logs/imail-mcp/imail-mcp.log (also shown in the admin UI's Service tab).


License

PolyForm Noncommercial License 1.0.0 β€” this is source-available, not OSI open source.

  • βœ… Free for any noncommercial purpose β€” personal use, study, research, hobby projects, and use by nonprofits, schools, and government bodies.

  • βœ… You may read, modify, and redistribute it; the copyright notice must stay intact, so your work is always credited.

  • πŸ’Ό Commercial use requires a separate license. If you want to use imail-mcp to make money β€” in a product, a paid service, or inside a for-profit company β€” contact Investment Fidelity Company at ceo@investmentfidelity.company to arrange a commercial license.

See LICENSE.md for the full terms.

Available Tools

14 tools
archive_messageArchive messageC

Move a message to the Archive mailbox.

ParametersJSON Schema
NameRequiredDescriptionDefault
mailboxYes
uidYes

TDQS

C2.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description does not disclose side effects (e.g., whether the message is removed from the original mailbox), required permissions, or idempotency. Since no annotations are provided, the description carries the full burden and fails to convey behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

While the description is very short (one sentence), it is under-specified and lacks essential information. Conciseness should not come at the expense of completeness; key details about parameters and behavior are missing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and two undocumented parameters, the description is severely incomplete. The agent lacks critical information to use this tool correctly, such as parameter semantics and side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, and the tool description provides no explanation of the 'mailbox' or 'uid' parameters. The agent receives no help understanding what values to use or their format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (move a message to Archive mailbox) and identifies the resource (message) and destination (Archive mailbox). However, it does not distinguish this from sibling tool 'move_message', which could also move to the Archive mailbox.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like 'move_message' or 'delete_message'. The description lacks context about prerequisites or appropriate scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compose_previewCompose preview (does NOT send)A

Build an email and return it for the user to review. Does not send or save anything. Use this first, then send_email after the user approves.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRecipient email addresses.
ccNo
bccNo
subjectYes
textNoPlain-text body.
htmlNoHTML body.
attachmentsNo
inReplyToNoMessage-ID being replied to.
referencesNo

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description discloses no side effects (doesn't send or save) but lacks details on return value format and any limitations. Without annotations, more behavioral context (e.g., how preview is returned) would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose and key constraint (does not send), no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 9 parameters and no output schema, the description is minimal. It doesn't specify how the preview is returned or guide parameter usage (e.g., html vs text). More detail would increase completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 44%, and description adds no further parameter explanation beyond what schema provides. For the described parameters, it adds no new meaning; for undocumented parameters, it offers no guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Title and description clearly state the tool builds an email for review and does not send. It uses a specific verb 'build' and resource 'email', and contrasts with sibling 'send_email'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Does not send or save anything' and 'Use this first, then send_email after the user approves', providing clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_messageDelete messageC

Move a message to Trash (or expunge it if it is already in Trash).

ParametersJSON Schema
NameRequiredDescriptionDefault
mailboxYes
uidYes

TDQS

C2.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals that the tool has two behaviors depending on message state (move to trash or expunge). However, no annotations exist, and it does not disclose permissions, side effects, or reversibility details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that efficiently conveys the core action. No unnecessary words, but could benefit from expanded context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Lacks information about return values, error conditions, or any post-action state. For a tool with no output schema, the description should provide more completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, and the description does not explain what 'mailbox' or 'uid' represent. Parameter semantics are entirely absent beyond the schema field names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool moves a message to Trash or expunges it if already in Trash. It distinguishes from sibling tools like 'archive_message' by specifying destructive action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like 'archive_message' or 'move_message'. The description lacks context for decision-making.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_attachmentDownload attachmentA

Save an attachment to a local temp file and return its path. Get the attachmentId from get_message.

ParametersJSON Schema
NameRequiredDescriptionDefault
mailboxYes
uidYes
attachmentIdYesAttachment id from get_message.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses the key behavior (saving to a temp file and returning path) but omits details on temp file lifecycle, permission requirements, or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words, essential information front-loaded. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, so description should cover return value; it says 'return its path' but lacks format/type details. No mention of failure scenarios. Adequate for basic use but leaves gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% (only attachmentId has a description). The description adds meaning for attachmentId (source from get_message) but provides no additional info for mailbox or uid, leaving them underspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verb 'save' and resource 'attachment', clearly states the output (path), and references the source of attachmentId. It is distinct from sibling tools as no other tool handles attachment downloads.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly suggests retrieving attachmentId from get_message, providing a usage hint. However, it does not explicitly state when to use this tool vs alternatives, but no alternatives exist among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forwardForward a messageB

Forward an existing message to new recipients. Only call after explicit user approval.

ParametersJSON Schema
NameRequiredDescriptionDefault
mailboxYes
uidYes
toYes
ccNo
noteNoOptional note to prepend.

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that the tool requires user approval before calling, but it does not specify side effects such as whether the message is actually sent or if the original message is marked as forwarded. This is minimally adequate but lacks depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise with two short sentences. The first sentence states the core purpose, and the second provides a critical constraint. No unnecessary words are present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations, output schema, and limited parameter coverage, the description is incomplete. It does not mention return values, prerequisites (e.g., that the message must be fetched or that uid and mailbox are required), error conditions, or what happens after forwarding (e.g., sends immediately vs. drafts).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 20% schema description coverage (only the 'note' parameter has a description), the description adds no explanation for parameters like mailbox, uid, to, or cc. The description text does not define these fields, making it difficult for an agent to provide correct values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Forward an existing message to new recipients'), which is a specific verb+resource combination. It effectively distinguishes itself from sibling tools like reply, send_email, and save_draft by specifying that it forwards an already existing message.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a critical usage guideline: 'Only call after explicit user approval.' However, it does not provide any context about when to use this tool versus alternatives (e.g., when to forward vs. reply or send as new email), which limits its helpfulness for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_messageGet messageA

Fetch a full message: headers, text + HTML body, and attachment metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
mailboxYesMailbox the message is in.
uidYesMessage UID within that mailbox.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must disclose behavior. It states what is fetched but not side effects, safety (read-only), or rate limits. Adequate but could be more transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, concise, front-loaded with verb and resource. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple fetch tool with 2 parameters and no output schema, the description adequately covers purpose and scope. Could mention return format or permissions, but not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear parameter descriptions. Description adds no extra semantic value beyond schema; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'Fetch' and resource 'full message' with explicit components (headers, text+HTML body, attachment metadata). Distinguishes from sibling tools like get_thread or list_mailboxes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or alternatives guidance. The purpose implies usage for retrieving full message content, but lacks contrast with sibling tools like get_thread or search_messages.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_threadGet threadB

Fetch the conversation a message belongs to, ordered oldest to newest.

ParametersJSON Schema
NameRequiredDescriptionDefault
mailboxYes
uidYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals the ordering behavior ('ordered oldest to newest') but does not disclose whether the operation is read-only, whether it includes the original message, or any side effects. With no annotations, more behavioral context is needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, no wasted words. However, given the lack of other structured information, the description could be slightly expanded without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, no annotations, and no parameter descriptions, the description is incomplete. It does not explain return format, error cases, or how the parameters relate to the thread retrieval.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description does not explain what 'mailbox' or 'uid' represent. The description adds no meaning beyond the parameter names, leaving the agent to infer their purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'Fetch', the resource 'conversation a message belongs to', and the ordering 'oldest to newest'. It distinguishes from sibling tools like get_message (which fetches a single message) by implying the tool retrieves the full thread.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., get_message for single messages, search_messages for finding messages). No prerequisites or exclusions mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_mailboxesList mailboxesA

List all mailboxes/folders with their IMAP paths and roles.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden for behavioral disclosure. It only states the basic purpose without revealing details such as whether the operation is read-only, any authentication requirements, or the response format. The description lacks sufficient behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence that conveys the essential purpose without any unnecessary words or redundancy. It is highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and no output schema, the description is reasonably complete. It specifies what the list includes (IMAP paths and roles). However, it could briefly mention the typical use case (e.g., for folder navigation) or return structure, but overall it covers the core.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, and schema description coverage is 100% (since there are none). Per guidelines, baseline is 4 for zero parameters. The description adds no additional parameter information, which is acceptable as there are none to document.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all mailboxes/folders with IMAP paths and roles. It uses a specific verb 'List' and resource 'mailboxes/folders', and adds details about the output (IMAP paths, roles). This distinguishes it from sibling tools which focus on message operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide explicit guidance on when to use this tool versus alternatives. However, context with sibling tools (all message operations) implies it is the only tool for listing mailbox structure. No when-not-to-use or prerequisite information is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_messageMove messageC

Move a message to another mailbox.

ParametersJSON Schema
NameRequiredDescriptionDefault
mailboxYes
uidYes
targetMailboxYes

TDQS

C2.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Only states basic action without disclosing side effects, permissions, or error conditions. Lacks behavioral depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise but under-specified. One sentence provides bare minimum, lacking necessary detail for effective tool usage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 3 required parameters with no schema descriptions or output schema, the description fails to provide sufficient information for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and description does not explain any parameters (mailbox, uid, targetMailbox). Agent must guess meaning from parameter names alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the verb 'move' and resource 'message' clearly. However, it does not differentiate from sibling tools like archive_message, which also involves moving messages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. Lacks context about prerequisites, when not to use, or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

replyReply to a messageA

Reply to an existing message. Set replyAll for reply-all. Like send_email, only call after explicit user approval. Threading headers are set automatically from the original.

ParametersJSON Schema
NameRequiredDescriptionDefault
mailboxYes
uidYes
replyAllNo
textNo
htmlNo
attachmentsNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses automatic threading headers and requirement for user approval. However, with no annotations, could detail more about mutation and permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with action, no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 6 parameters and no output schema or error handling described, the description is too minimal for an agent to fully understand invocation and results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and description adds no meaning for mailbox, uid, text, html, attachments. Only mentions replyAll briefly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it replies to an existing message, distinguishing from siblings like forward and send_email.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to call only after explicit user approval, and mentions replyAll for reply-all. Does not specify when not to use or alternatives beyond the sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_draftSave draftA

Save an email to the Drafts mailbox so the user can review and send it themselves. Does not send.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRecipient email addresses.
ccNo
bccNo
subjectYes
textNoPlain-text body.
htmlNoHTML body.
attachmentsNo
inReplyToNoMessage-ID being replied to.
referencesNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. Description notes the non-sending behavior, but omits other behavioral traits like attachment handling, draft storage location, or server-side persistence.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no fluff, directly informative. Ideal length for a tool with clear purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, no description of return value or error conditions. For a complex tool with 9 parameters, the description is insufficient for an agent to use it confidently without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is low (44%) and description adds no additional information beyond the schema. For example, the 'subject' parameter is required but undocumented, and 'cc'/'bcc' lack descriptions. The description should compensate for this gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool saves a draft and notably clarifies it does not send the email, distinguishing it from sibling tools like send_email and compose_preview.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Does not send', implying use when the user wants to review later. However, it does not provide guidance on when to use alternatives like compose_preview, forward, or reply.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_messagesSearch messagesA

Search a mailbox. All filters are optional and combined with AND. Returns summaries, newest first.

ParametersJSON Schema
NameRequiredDescriptionDefault
mailboxNoMailbox path; default "INBOX".
fromNoMatch sender.
toNoMatch recipient.
subjectNoMatch subject.
textNoFree-text match in the message.
sinceNoISO date β€” on/after.
beforeNoISO date β€” before.
unreadOnlyNoOnly unread messages.
limitNoMax results (default 25).

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It states it returns summaries sorted newest first, which is helpful but omits any disclosure of authentication needs, rate limits, or safety guarantees. The tool is read-only, but the description does not explicitly confirm non-destructiveness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise at three short sentences, with no filler or redundant information. Every sentence adds value: function, filtering behavior, and output ordering. It is well-structured and easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 9 parameters and no output schema or annotations, the description covers the core functionality and filtering behavior. However, it lacks mention of default limits (e.g., limit defaults to 25) or read-only nature, leaving some gaps in completeness for an agent to fully understand expected behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description adds that filters are combined with AND, but this is a minor addition. No extra semantic detail is provided beyond the schema's parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches a mailbox, which is a specific verb-resource combination. It distinguishes from siblings like get_message or list_mailboxes by focusing on search with filters, and no other sibling tool has search in its name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions that all filters are optional and combined with AND, which provides basic usage context. However, it does not explicitly state when to use this tool over alternatives (e.g., get_message for single messages, list_mailboxes for mailbox listing), nor does it provide exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_emailSend emailB

Send an email NOW. Only call after the user has explicitly approved sending (ideally after a compose_preview).

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRecipient email addresses.
ccNo
bccNo
subjectYes
textNoPlain-text body.
htmlNoHTML body.
attachmentsNo
inReplyToNoMessage-ID being replied to.
referencesNo

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must cover behavioral traits. It only says 'Send an email NOW' implying immediate action, but does not disclose potential side effects (e.g., irreversibility), authentication requirements, rate limits, or what happens on success/failure. More transparency is needed for a tool that performs a real-world action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and a clear usage condition. No filler or redundancy. However, it could include more useful details without becoming overly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (9 parameters, no output schema, no annotations), the description is insufficient. It lacks details on return values, constraints (e.g., attachment limits), error handling, or post-send behavior. The context signals indicate high complexity, but the description does not address it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 44%. The description adds no parameter-level information beyond the schema, which already describes some parameters (to, text, html, attachments' path and contentBase64, inReplyTo). Undocumented parameters like cc, bcc, subject, and attachment properties remain unclear. The description should compensate for schema gaps but does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Send an email NOW,' which is a clear verb+resource. It distinguishes from sibling tools like compose_preview, save_draft, reply, and forward that deal with email composition or other actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: 'Only call after the user has explicitly approved sending (ideally after a compose_preview).' This tells when to use and suggests a prerequisite (compose_preview). However, it does not mention when not to use or alternative tools for other email actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_flagsSet flagsB

Mark a message read/unread and/or flagged/unflagged.

ParametersJSON Schema
NameRequiredDescriptionDefault
mailboxYes
uidYes
seenNotrue=read, false=unread.
flaggedNotrue=flag, false=unflag.

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully disclose behavioral traits. It does not mention side effects (e.g., whether the operation is reversible), authentication needs, rate limits, or any constraints. This is an insufficient disclosure for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, succinct sentence that conveys the core function without any extraneous words. It is well-structured and immediately understandable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of an output schema, annotations, and only partial parameter descriptions, the description is too sparse. It does not explain return values, error handling, prerequisites, or the effect of not supplying optional parameters. A mutation tool like this requires more context for safe and correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50% (the boolean parameters seen and flagged have descriptions, but mailbox and uid do not). The description repeats the boolean usage without adding new information. It does not explain the mailbox and uid parameters, failing to compensate for the schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: marking a message read/unread and/or flagged/unflagged. It uses specific verbs (mark) and resources (message) and effectively distinguishes from sibling tools like archive_message or delete_message.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for toggling read/flag status but does not provide explicit when-to-use or when-not-to-use guidance, nor does it mention alternatives like using archive_message for moving messages. It is minimally adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updatesv0.1.0
    • First observedarchive_message
    • First observedcompose_preview
    • First observeddelete_message
    • First observeddownload_attachment
    • First observedforward
    • First observedget_message
    • First observedget_thread
    • First observedlist_mailboxes
    • First observedmove_message
    • First observedreply
    • First observedsave_draft
    • First observedsearch_messages
    • First observedsend_email
    • First observedset_flags

TDQS

B3.4/5.0

Scored across 14 tools

Disambiguation5/5

Each tool targets a distinct email operation (e.g., archive vs delete vs move, compose vs send vs save draft, forward vs reply). No two tools have overlapping purposes.

Naming Consistency4/5

Most tools follow verb_noun pattern (e.g., archive_message, delete_message). 'forward' and 'reply' are just verbs, which is a minor inconsistency but still clear.

Tool Count5/5

14 tools cover essential email operations (send, receive, manage folders, flags, attachments, threads) without being excessive.

Completeness4/5

Covers major email lifecycle (send, receive, delete, move, flag, search, thread). Minor gaps: no direct edit draft or empty trash, but key workflows are supported.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    An MCP server that connects Claude to iCloud Mail for reading, searching, sending, and organizing emails through natural language. It supports advanced management tasks like bulk operations, mailbox organization, and automated rules for inbox maintenance.
    69
    13 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    An MCP server for Apple Mail that enables Claude to read, search, manage, and compose emails via AppleScript.
    20
    56 npm
    1
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol (MCP) server that enables Claude Desktop to interact with iCloud email accounts. This server provides full email functionality including reading, sending, and managing emails through your iCloud account.
    1
    -
  • A
    license
    A
    quality
    A
    maintenance
    An MCP server that provides programmatic access to Apple Mail, enabling AI assistants like Claude to read, send, search, and manage emails on macOS.
    25
    MIT