Skip to main content
Glama

mu-mcp: MCP Server for the mu Mail Indexer

PyPI Python GitHub release MCP GitHub license

A Model Context Protocol (MCP) server for querying your local mu mail index. This server enables fast, structured mail search from Claude Desktop and other MCP clients.

Features

  • Stdio MCP server for easy integration

  • Tools: search_emails, view_emails (HTML-only emails converted to text), list_attachments, open_attachment (saves to a temp dir and optionally opens with the default OS viewer), and mu_help for the full mu reference on demand.

  • Small context footprint: a short query guide lives in the tool description; the full man pages are only loaded when the model asks for them.

  • Fast, flexible mail search using the mu index

  • Claude Desktop ready: simple installation and config

  • Python, uv, and MCP SDK based

Related MCP server: Gmail Plugin MCP Server

Installation

Requires mu installed and your mail indexed (mu init + mu index).

With uv installed, run the published package from PyPI without cloning the repository:

uvx mu-mcp

Usage

Run the MCP Server

uvx mu-mcp

The server communicates over stdio; normally your MCP client launches it using the configuration below.

Claude Desktop Integration

Add to your claude_desktop_config.json:

"mcpServers": {
  "email": {
    "command": "uvx",
    "args": ["mu-mcp"]
  }
}

The client needs uvx and mu on its PATH. If it cannot find uvx, use the absolute path returned by which uvx as the command.

Claude Code Integration

claude mcp add email -s user -- uvx mu-mcp

Use -s local instead to enable it only in the current project. Check it with /mcp in a new session.

Query

Ask Claude to find emails, e.g. "Find emails with a PDF attachment that were sent last April and open the PDF", "Show me the email I received from Alice last week", or "Find emails with the subject 'Meeting Notes'".

Development

To run from a local checkout:

git clone https://github.com/danielfleischer/mu-mcp.git
cd mu-mcp
uv sync
uv run mu-mcp
  • Adding a tool to view an email.

  • Adding a tool to find and download attachments.

  • Progressive disclosure of the mu man pages via mu_help.

  • Add a mu-mcp console script and use uvx mu-mcp as the install method.

  • Describe when to use the server in its instructions, including email, inbox, messages, receipts, and attachments.

Future ideas

  • Return attachment text (PDF, DOCX) from open_attachment; Claude Desktop can't read the saved file paths.

  • view_thread: show a whole conversation from one message.

  • find_contacts via mu cfind, to resolve a name to its addresses.

Available Tools

5 tools
list_attachmentsC

List the MIME parts (attachments, inline images, bodies) of one email.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.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 the full disclosure burden. It does not state that this is a read-only, non-destructive enumeration, nor mention ordering, pagination, or behavior on emails with no parts, for a tool that the agent must be able to call safely.

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 efficient sentence with the enumerating verb front-loaded and no filler. It is appropriately sized, though the parenthesis adds clarification at the cost of a slightly denser read.

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?

The presence of an output schema means return values needn't be explained, which offsets some gaps. However, with no annotations and an undocumented required path parameter, the definition is only minimally sufficient for a read tool with ambiguous input.

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 0% and the single parameter "path" is undocumented in both schema and description. "Of one email" hints that path identifies the email, but the format (filesystem path, ID, URI) is left ambiguous, which is a real risk for a required parameter.

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?

States a specific verb (List) and resource (MIME parts: attachments, inline images, bodies) of a single email, and parenthetically disambiguates what a "MIME part" is. It does not distinguish the tool from siblings like open_attachment or view_emails, but the core purpose is unambiguous.

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 when-to-use guidance, no prerequisites, and no mention of alternatives (e.g., open_attachment to fetch the actual content). Usage is only weakly implied by "of one email," so the agent must infer both trigger conditions and relationships to siblings.

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

mu_helpA

Full mu reference, for when the short guide in search_emails isn't enough.

Topics: query (complete query language), fields (live list of fields and flags), find (search options), extract (attachment handling).

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/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 implies a read-only documentation lookup, but never states that explicitly, nor does it describe output size or whether topics can be combined. For a low-risk help tool this is adequate, but it adds little behavioral context beyond the topic list.

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, front-loaded with the purpose and the routing condition, followed by a compact topic legend. No filler.

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?

An output schema exists, so return values need no explanation. For a single-enum documentation tool, the purpose, trigger condition, and value semantics are all covered.

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?

Schema description coverage is 0% and the single parameter is an enum, so the description must supply meaning for the values. It does: each of query, fields, find, and extract is annotated with a parenthetical scope, letting the agent pick the right topic without guessing.

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?

States a specific resource ('full mu reference') and enumerates the four topic areas it covers, so an agent knows exactly what it gets. It also distinguishes itself from search_emails by positioning itself as the deeper version of that tool's short guide.

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?

Gives an explicit trigger condition ('when the short guide in search_emails isn't enough') and names the alternative, so the agent can decide between calling search_emails' inline guide and calling this tool. The inverse condition (short guide suffices) follows directly.

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

open_attachmentA

Save attachments of an email to a temp dir, optionally opening them.

Returns the saved file paths, so their contents can be read afterwards.

Args: path: message file path. pattern: case-sensitive PCRE matched against attachment file names, e.g. .*\.pdf$ or (?i)invoice. Default: all attachments. open_in_viewer: also open each file with the OS default application.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
patternNo.*
open_in_viewerNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully discloses that files land in a temp dir and that open_in_viewer launches the OS default application (a real side effect), but it says nothing about overwrite behavior in the temp dir, permissions, or what happens when no attachment matches.

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?

Front-loaded with the core action, followed by a useful return-value note and a clean Args block. Slightly more verbose than strictly necessary, but every line adds information and nothing is repeated.

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?

An output schema exists, so return-value detail is not required, and the description still notes that file paths come back. All three parameters are explained despite 0% schema coverage. Only the lack of sibling routing and failure-mode context keeps it from a 5.

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 coverage is 0%, so the description must compensate, and it does: path is identified as a message file path, pattern is described as case-sensitive PCRE matched against attachment names with concrete examples and its default, and open_in_viewer is explained as opening each file with the OS default app.

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 a specific verb and resource: save an email's attachments to a temp dir, with optional opening. It is clearly distinct from list_attachments in intent (save/dump vs. list), although it never names that sibling to make the distinction explicit.

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?

Usage is implied rather than stated: 'Returns the saved file paths, so their contents can be read afterwards' hints at the workflow (save, then read). There is no explicit when-to-use/when-not guidance and no pointer to list_attachments or view_emails for the cases where saving is unnecessary.

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

search_emailsA

Search the local mail index with a mu query.

Returns one line per message: date | from | subject | path. Pass the path to view_emails or list_attachments.

Query syntax (quote phrases with double quotes; no shell is involved):

  • Bare words search from/to/cc/subject/body: invoice march

  • Fields: from: to: cc: contact: (any address) subject: body: maildir: (e.g. maildir:/Inbox) list: tag: file: (attachment name) mime: (attachment type, e.g. mime:application/pdf, mime:image/*)

  • Dates: date:2024-04..2024-04, date:2w.. (last 2 weeks), date:..2023, date:today.. (units: h d w m y)

  • Flags: flag:attach flag:unread flag:flagged flag:replied flag:personal flag:list flag:calendar

  • Operators: and, or, not, parentheses; implicit and between terms.

  • Wildcard suffix: budg*. Regex: subject:/re.?port/

  • Names match words in the address too: from:alice, from:amazon

Examples:

  • from:alice date:1w..

  • subject:"meeting notes"

  • mime:application/pdf and date:2025-04..2025-04

  • (from:bank or from:visa) and flag:unread

  • contact:bob and not flag:list

Args: query: the mu query. max_results: cap on returned messages; raise it or narrow the query if the result is cut off. sort: field to sort by. newest_first: reverse sort order (newest/Z first). include_thread: also return other messages from matching threads.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNodate
queryYes
max_resultsNo
newest_firstNo
include_threadNo

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, the description carries the full burden and does disclose key behavior: the exact one-line-per-message return format, the fact that max_results truncation is possible and how to react ('raise it or narrow the query if the result is cut off'), and the semantics of newest_first ('newest/Z first'). It never explicitly states read-only/no-side-effect behavior, but search semantics imply it.

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?

Long but dense: purpose and return format are front-loaded, then the query grammar is organized under tight bullet headings with examples. Every block is load-bearing for a tool whose parameter is a mini-language; nothing reads as filler.

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?

An output schema exists, yet the description still front-loads the return line format, and all five parameters, the query grammar, and the follow-up tools are covered. For a search tool of this complexity, an agent has everything needed to construct a correct call.

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, and it documents all five parameters: query (with a full grammar and examples), max_results (a cap plus the truncation remedy), sort (field to sort by), newest_first (reverse order), and include_thread (also return other messages from matching threads). This is meaningfully more than the bare schema types/defaults.

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?

States a specific verb and resource ('Search the local mail index with a `mu` query') and immediately clarifies the exact return shape (`date | from | subject | path`). It also names the sibling tools that consume the output (view_emails, list_attachments), so an agent can place it in the workflow without opening any schema.

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?

Gives extensive guidance on how to use it (full query grammar, field list, date units, flag list, operators, five concrete examples) and how to chain it to siblings via the returned path. It does not explicitly state when to prefer it over mu_help or when a narrower query is required beyond the truncation note, so it stops short of a full when/when-not statement.

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

view_emailsA

Read emails (headers + body as text) given paths from search_emails.

HTML-only emails are converted to plain text.

Args: paths: message file paths. max_chars: per-message cap on returned text.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYes
max_charsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It does add real value by disclosing the HTML-to-plain-text conversion and the per-message truncation cap, but it is silent on error behavior for invalid paths, whether truncation is signaled to the caller, and whether attachments are included. Useful but incomplete for an annotation-free 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?

Four short lines, front-loaded with purpose and the routing cue before the Args block. Every sentence earns its place with no filler.

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?

An output schema exists, so return-value documentation is not required, and the description covers purpose, input provenance, format conversion, and truncation policy. It is nearly complete for a simple two-parameter read tool; only error/edge-case behavior is unaddressed.

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?

Schema description coverage is 0%, so the description must define both parameters, and it does: 'paths' as message file paths and 'max_chars' as a per-message cap on returned text. The definitions are accurate but terse, and it doesn't explain what happens when the cap is hit (truncation semantics), which is the one behavior an agent would most want clarified.

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?

States a specific verb+resource ('Read emails') and specifies exactly what is returned (headers + body as text). It also anchors the input to the sibling search_emails, so an agent can distinguish it from search_emails, list_attachments and open_attachment without opening any schema.

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?

It explicitly tells the agent where the required 'paths' come from ('given paths from search_emails'), which is the key usage constraint. It does not state when NOT to use it or point to list_attachments/open_attachment for attachment content, so it stops short of full when/when-not guidance.

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. 9 tool updatesv0.6.1
    • Removedget_attachment
    • Removedhealth_check
    • Addedlist_attachments
    • Addedmu_help
    • Addedopen_attachment
    • Removedquery
    • Addedsearch_emails
    • Removedview
    • Addedview_emails
  2. 4 tool updatesv0.3.0
    • First observedget_attachment
    • First observedhealth_check
    • First observedquery
    • First observedview

TDQS

A3.7/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct action: search metadata, view message bodies, list MIME parts, save/open attachments, and read help. Boundaries are clear; no two tools overlap in purpose.

Naming Consistency4/5

Four tools follow a consistent verb_noun snake_case pattern (search_emails, view_emails, list_attachments, open_attachment), but mu_help deviates and list_attachments/open_attachment mix plural/singular. Minor deviations only.

Tool Count5/5

Five tools are well-scoped for a local email search/read server. Each tool earns its place; no bloat or missing essential primitive.

Completeness3/5

Search and view cover the core read path, but open_attachment saves files without any tool to read their contents afterward, creating a dead end for attachment processing. No update/tag operations either, though those may be outside the read-only scope.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    A Model Context Protocol server that provides a seamless email management interface through Claude, allowing users to search, read, and send emails directly through natural language conversations.
    4
    114
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that enables Gmail integration, allowing users to manage emails (send, receive, read, trash, mark as read) directly through MCP clients like Claude Desktop.
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A cross-platform MCP server that provides Claude with email access via IMAP, supporting multiple email providers and account management.
    MIT