Skip to main content
Glama

Apple Mail MCP

Python 3.11+ License: GPL v3 macOS MCP Code style: ruff CI

The only Apple Mail MCP server with full-coverage body search — reliable on large mailboxes where AppleScript-based servers timeout. 8 tools for reading, searching, and extracting email content.

Read the docs for the full guide.

Quick Start

pipx install apple-mail-mcp

Add to your MCP client:

{
  "mcpServers": {
    "mail": {
      "command": "apple-mail-mcp"
    }
  }
}
# Requires Full Disk Access for Terminal
# System Settings → Privacy & Security → Full Disk Access → Add Terminal

apple-mail-mcp index --verbose

Configure (Optional)

apple-mail-mcp init   # writes ~/.apple-mail-mcp/config.toml

Writes a commented config file you can edit to set defaults like your primary account or mailbox. Every key has a matching APPLE_MAIL_* env var if you prefer environment-based config. See Configuration for the full schema and precedence rules.

Related MCP server: apple-mail-mcp

Tools

Tool

Purpose

list_accounts()

List email accounts

list_mailboxes(account?)

List mailboxes

get_emails(filter?, limit?)

Get emails — all, unread, flagged, today, last_7_days

get_email(message_id)

Get single email with full content + attachments

search(query, scope?, before?, after?, highlight?)

Search — all, subject, sender, body, attachments

get_email_links(message_id)

Extract links from an email

get_email_attachment(message_id, filename)

Extract attachment content

get_attachment(message_id, filename)

Deprecated — use get_email_attachment()

Performance

Tested against 6 other Apple Mail MCP servers on a real ~73K-message mailbox:

  • Only server with full-coverage body search. Most competitors don't support body search at all; the one that does (BastianZim) live-scans only the 5000 most recent messages — silent miss on anything older. Our FTS5 index covers the entire mailbox.

  • ~3ms single email fetch via disk-first .emlx reading (no JXA round-trip).

  • ~1ms list_accounts and ~5ms 50-email listing via direct Envelope-Index SQLite reads (0.4+) — same path BastianZim/rusty/pl-lyfx use, with JXA as the correctness fallback.

  • ~7ms subject search via FTS5 — competitive with native Rust on the same operation.

  • Reliable across all 6 benchmarked operations on a 73K mailbox; AppleScript-based servers timeout, throw syntax errors, or skip operations they don't support.

Capability Matrix

Configuration

Apple Mail MCP works out of the box. To customize defaults, run apple-mail-mcp init to generate a config.toml template — or use the matching APPLE_MAIL_* environment variables. See the Configuration docs for the full schema and the CLI > env > file > default precedence.

Per-client env overrides via the MCP client's launch config also work:

{
  "mcpServers": {
    "mail": {
      "command": "apple-mail-mcp",
      "args": ["--watch"],
      "env": {
        "APPLE_MAIL_DEFAULT_ACCOUNT": "Work"
      }
    }
  }
}

CLI Usage

All tools are also available as standalone CLI commands (no MCP server needed):

apple-mail-mcp search "quarterly report" --scope subject
apple-mail-mcp search "invoice" --after 2026-01-01 --limit 10
apple-mail-mcp read 12345
apple-mail-mcp emails --filter unread --limit 10
apple-mail-mcp accounts
apple-mail-mcp mailboxes --account Work
apple-mail-mcp extract 12345 invoice.pdf

All commands output JSON. Generate a Claude Code skill for CLI-based access:

apple-mail-mcp integrate claude > ~/.claude/skills/apple-mail.md

Development

git clone https://github.com/imdinu/apple-mail-mcp
cd apple-mail-mcp
uv sync
uv run ruff check src/
uv run pytest

License

GPL-3.0-or-later

Available Tools

7 tools
get_emailsA

Get emails from a mailbox.

Retrieves emails with standard properties: id, subject, sender, date_received, read status, and flagged status.

Args: account: Account name. Uses JXA_MAIL_DEFAULT_ACCOUNT env var or first account if not specified. mailbox: Mailbox name. Uses JXA_MAIL_DEFAULT_MAILBOX env var or "Inbox" if not specified. limit: Maximum number of emails to return (default: 50)

Returns: List of email dictionaries sorted by date (newest first).

Example: >>> get_emails("Work", "INBOX", limit=10) [{"subject": "Meeting tomorrow", "sender": "boss@work.com", ...}, ...]

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
mailboxNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses key behavioral traits: it retrieves emails with specific properties, uses environment variable defaults, sorts by date (newest first), and returns a list. However, it does not mention potential errors, rate limits, or authentication needs, leaving some gaps.

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 well-structured and appropriately sized: a brief purpose statement, details on properties and parameters, return format, and an example. Every sentence adds value without redundancy, and it is front-loaded with the core functionality.

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 the tool's moderate complexity, no annotations, and an output schema (implied by 'Has output schema: true'), the description is largely complete. It covers purpose, parameters, returns, and an example. However, it could improve by addressing sibling tool differentiation or error handling, but the output schema likely handles return values adequately.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate. It fully explains all three parameters (account, mailbox, limit) with semantics, default values, and usage context (e.g., env var fallbacks). This adds significant value beyond the bare schema, making parameters clear and actionable.

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's purpose: 'Get emails from a mailbox' with specific verb ('Get') and resource ('emails'). It distinguishes from siblings like 'get_flagged_emails' or 'get_unread_emails' by indicating it retrieves emails with standard properties, though it could be more explicit about the distinction.

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 by specifying default behaviors (e.g., using environment variables or defaults for account/mailbox) and the limit parameter, but does not explicitly state when to use this tool versus alternatives like 'search_emails' or 'get_todays_emails'. It provides context but lacks explicit guidance on tool selection.

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

get_flagged_emailsA

Get flagged emails from a mailbox.

Args: account: Account name. Uses JXA_MAIL_DEFAULT_ACCOUNT env var or first account if not specified. mailbox: Mailbox name. Uses JXA_MAIL_DEFAULT_MAILBOX env var or "Inbox" if not specified. limit: Maximum number of emails to return (default: 50)

Returns: List of flagged emails sorted by date (newest first).

Example: >>> get_flagged_emails("Work") [{"subject": "Important task", "flagged": true, ...}, ...]

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
mailboxNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses that it returns a sorted list of emails with a default limit, which is useful behavioral context. However, it doesn't mention potential side effects, error conditions, or authentication requirements, leaving gaps for a tool that interacts with mail systems.

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?

The description is well-structured with clear sections (Args, Returns, Example) and front-loaded purpose. It's appropriately sized, though the example could be slightly more concise. Every sentence adds value, with no redundant information.

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 the tool's moderate complexity (3 parameters, no annotations, but has output schema), the description is fairly complete. It covers parameters thoroughly and includes an example, though it could benefit from more behavioral context (e.g., error handling). The output schema existence means return values don't need explanation in the description.

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

Parameters5/5

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

The schema description coverage is 0%, so the description must compensate fully. It does this by explaining all three parameters: 'account' (with env var fallback), 'mailbox' (with env var fallback and default), and 'limit' (with default value). This adds crucial meaning beyond the bare schema.

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 verb 'Get' and resource 'flagged emails from a mailbox', making the purpose explicit. It distinguishes from siblings like 'get_emails' or 'get_unread_emails' by specifying 'flagged' emails, though it doesn't explicitly contrast them in the description text.

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?

The description provides no guidance on when to use this tool versus alternatives like 'search_emails' or 'get_unread_emails'. It mentions default behaviors for parameters but doesn't explain the tool's specific use case context or prerequisites.

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

get_todays_emailsA

Get all emails received today from a mailbox.

Args: account: Account name. Uses JXA_MAIL_DEFAULT_ACCOUNT env var or first account if not specified. mailbox: Mailbox name. Uses JXA_MAIL_DEFAULT_MAILBOX env var or "Inbox" if not specified.

Returns: List of today's emails sorted by date (newest first).

Example: >>> get_todays_emails("Work") [{"subject": "Urgent: Review needed", "sender": "team@work.com", ...}]

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
mailboxNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations provided, the description carries full burden. It discloses the sorting behavior ('sorted by date newest first') and return format ('List of today's emails'), which is valuable. However, it doesn't mention permissions needed, rate limits, pagination, or what happens with invalid account/mailbox values.

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?

Well-structured with purpose statement, parameter explanations, return description, and example. Every sentence earns its place. The information is front-loaded with the core purpose first, followed by details.

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 2 parameters with 0% schema coverage and an output schema exists, the description does an excellent job explaining parameters and return behavior. However, as a read operation with no annotations, it could benefit from mentioning safety (non-destructive) or error handling for completeness.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate fully. It provides detailed semantics for both parameters: account (defaults from env var or first account) and mailbox (defaults from env var or 'Inbox'). The example further clarifies usage. This adds significant value beyond the bare schema.

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 with specific verb ('Get'), resource ('all emails received today'), and scope ('from a mailbox'). It distinguishes from siblings by focusing on today's emails only, unlike get_emails (general), get_flagged_emails, get_unread_emails, or search_emails.

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 clear context about when to use this tool (for today's emails), but doesn't explicitly state when not to use it or name alternatives. It implies usage for today's emails but doesn't compare with siblings like get_emails (date-range) or search_emails (keyword-based).

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

get_unread_emailsA

Get unread emails from a mailbox.

Args: account: Account name. Uses JXA_MAIL_DEFAULT_ACCOUNT env var or first account if not specified. mailbox: Mailbox name. Uses JXA_MAIL_DEFAULT_MAILBOX env var or "Inbox" if not specified. limit: Maximum number of emails to return (default: 50)

Returns: List of unread emails sorted by date (newest first).

Example: >>> get_unread_emails("Work", limit=20) [{"subject": "New message", "read": false, ...}, ...]

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
mailboxNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries full burden and does well by disclosing key behaviors: it's a read operation (implied by 'Get'), describes sorting behavior ('sorted by date newest first'), mentions environment variable fallbacks, and provides a concrete return example. However, it doesn't mention rate limits, authentication needs, or error conditions.

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?

Perfectly structured with clear sections: purpose statement, Args with detailed explanations, Returns specification, and Example. Every sentence adds value, with no wasted words. The information is front-loaded and efficiently organized.

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

Completeness5/5

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

Given the tool's moderate complexity, no annotations, and the presence of an output schema, the description provides excellent completeness. It covers purpose, all parameters with their semantics and defaults, return format, sorting behavior, and includes a practical example. The output schema handles return value details, so the description focuses on operational context.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by explaining all three parameters in detail: account (with env var fallback logic), mailbox (with env var and default logic), and limit (with default value). The Args section adds substantial meaning beyond the bare schema.

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 specific action ('Get unread emails') and resource ('from a mailbox'), distinguishing it from siblings like get_emails (all emails) or get_flagged_emails (different filter). The verb+resource combination is precise and unambiguous.

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 implies usage context through the 'unread' filter and default behaviors, but doesn't explicitly state when to use this tool versus alternatives like search_emails or get_todays_emails. It provides clear default values and environment variable fallbacks, giving practical guidance.

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

list_accountsA

List all configured email accounts in Apple Mail.

Returns: List of account dictionaries with 'name' and 'id' fields.

Example: >>> list_accounts() [{"name": "Work", "id": "abc123"}, {"name": "Personal", "id": "def456"}]

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes the return format (list of dictionaries with 'name' and 'id' fields) and includes an example, which adds useful context. However, it lacks details on potential errors, permissions needed, or any side effects, leaving some behavioral aspects unspecified.

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 well-structured and front-loaded, starting with the core purpose, followed by return details and an example. Every sentence earns its place by providing essential information without redundancy. The example is concise and illustrative, enhancing clarity without verbosity.

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 the tool's simplicity (0 parameters, no annotations, but with an output schema implied by the return description), the description is largely complete. It covers purpose, output format, and includes an example. However, it could improve by addressing potential edge cases or linking to sibling tools for broader context, though the output schema coverage reduces the need for extensive detail.

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 input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately does not discuss parameters, focusing instead on output and examples. This meets the baseline for tools with no parameters, as it avoids unnecessary repetition and adds value through output clarification.

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 verb ('List') and resource ('all configured email accounts in Apple Mail'), making the purpose specific and unambiguous. It distinguishes this tool from sibling tools like list_mailboxes (which lists mailboxes rather than accounts) and various email-fetching tools, establishing clear differentiation.

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 by specifying what it returns (account dictionaries), but does not explicitly state when to use this tool versus alternatives like list_mailboxes or other email-related tools. No guidance is provided on prerequisites, exclusions, or comparative contexts, leaving usage somewhat inferred rather than clearly defined.

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

list_mailboxesA

List all mailboxes for an email account.

Args: account: Account name. Uses JXA_MAIL_DEFAULT_ACCOUNT env var or first account if not specified.

Returns: List of mailbox dictionaries with 'name' and 'unreadCount' fields.

Example: >>> list_mailboxes("Work") [{"name": "INBOX", "unreadCount": 5}, ...]

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It describes the return format and includes an example, which adds value beyond basic functionality. However, it doesn't cover aspects like error handling, performance implications, or authentication needs, leaving some behavioral traits unspecified.

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 well-structured and appropriately sized, with a clear purpose statement, parameter explanation, return details, and an example—all in a concise format. Each sentence adds value without redundancy, making it easy to scan and understand.

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 the tool's low complexity (1 parameter) and the presence of an output schema (implied by the return description), the description is fairly complete. It covers purpose, parameter usage, and return format with an example. However, it could improve by addressing sibling tool differentiation or more behavioral details, but it's adequate for the context.

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 input schema has 0% description coverage, but the description compensates by explaining the 'account' parameter's semantics, including its optional nature and default behavior using environment variables. This adds meaningful context beyond the schema, though it could be more detailed about format or constraints.

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's purpose with a specific verb ('List') and resource ('all mailboxes for an email account'), making it easy to understand what it does. However, it doesn't explicitly differentiate from sibling tools like 'list_accounts', which lists accounts rather than mailboxes, though this distinction is implied by the resource focus.

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 provides some usage context by mentioning the default behavior when the 'account' parameter is not specified, but it doesn't explicitly state when to use this tool versus alternatives like 'get_emails' or 'search_emails'. The implied usage is for listing mailboxes rather than emails, but no clear exclusions or comparisons are given.

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

search_emailsA

Search for emails matching a query string.

Searches in both subject and sender fields (case-insensitive).

Args: query: Search term to look for account: Account name. Uses JXA_MAIL_DEFAULT_ACCOUNT env var or first account if not specified. mailbox: Mailbox name. Uses JXA_MAIL_DEFAULT_MAILBOX env var or "Inbox" if not specified. limit: Maximum number of results (default: 50)

Returns: List of matching emails sorted by date (newest first).

Example: >>> search_emails("invoice", "Work") [{"subject": "Invoice #123", "sender": "billing@vendor.com", ...}]

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
accountNo
mailboxNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description carries full burden and adds valuable behavioral context: it specifies case-insensitive search in subject and sender fields, default values for account/mailbox via environment variables, sorting by date (newest first), and a default limit of 50 results. This covers key operational traits beyond basic functionality.

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 well-structured and appropriately sized: a clear opening statement, followed by search scope details, parameter explanations, return info, and an example. Each sentence adds value without redundancy, and information is front-loaded with the core purpose stated first.

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 no annotations and 0% schema coverage, the description provides substantial context: it explains parameters, behavior, and includes an example. However, it doesn't mention error handling, permissions, or rate limits, which could be relevant for a search tool. The output schema exists, so return values needn't be detailed, but some operational caveats are missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate. It fully explains all 4 parameters: query (search term), account (with env var fallback), mailbox (with env var fallback), and limit (default 50). This adds crucial meaning beyond the bare schema, detailing defaults and environmental dependencies.

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 searches for emails matching a query string, specifying the verb 'search' and resource 'emails'. It distinguishes from siblings by mentioning query-based searching, unlike tools like get_emails or get_unread_emails which likely fetch without filtering. However, it doesn't explicitly contrast with all siblings (e.g., get_flagged_emails).

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 query-based email searches, with an example showing a specific use case. It doesn't explicitly state when to use this tool versus alternatives like get_emails or get_unread_emails, nor does it mention exclusions or prerequisites. The context is clear but lacks explicit guidance on tool selection.

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

TDQS

A3.8/5.0
Disambiguation2/5

Multiple tools have overlapping purposes that could cause confusion. get_emails, get_flagged_emails, get_todays_emails, and get_unread_emails all retrieve emails with different filters, but their boundaries are unclear—an agent might struggle to choose between them when multiple criteria apply. The descriptions help somewhat, but the functional overlap is significant.

Naming Consistency5/5

Tool names follow a consistent verb_noun pattern throughout (e.g., get_emails, list_accounts, search_emails). All tools use snake_case with clear, descriptive names that align with their functions, making the set predictable and easy to understand.

Tool Count5/5

With 7 tools, the count is well-scoped for an email management server. Each tool serves a distinct, useful purpose in the domain (e.g., retrieving emails, listing accounts/mailboxes, searching), and none feel redundant or missing in terms of quantity for the apparent scope.

Completeness2/5

There are significant gaps in the tool surface for email management. The server lacks essential CRUD operations like creating, sending, updating (e.g., marking as read/unread), or deleting emails, which are core to the domain. This will likely cause agent failures when trying to perform common email tasks beyond retrieval and listing.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    MCP server that gives Claude and other MCP hosts full access to Mail.app on macOS — search, read, send, reply, flag, move, and more across all accounts configured in Mail.app.
    24
    98
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A read-only MCP server for Apple Mail on macOS that enables searching and reading emails directly from the local SQLite database, with fast SQL-level filtering and pagination.
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Local MCP server for macOS native apps: Mail, Calendar, Reminders, Notes, Messages, and Contacts. Enables reading and organizing your Mac life through a single stdio process using AppleScript/JXA.
    40
    27
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that drives macOS Mail: read, search, send, organise.
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/imdinu/apple-mail-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server