mu-mcp: MCP Server for the mu Mail Indexer
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),view_thread(reads a conversation from one message),find_contacts(resolves names to email addresses),list_attachments,open_attachment(saves to a temp dir and optionally opens with the default OS viewer), andmu_helpfor the fullmureference 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
muindex - Claude Desktop ready: simple installation and config
- Python, uv, and MCP SDK based
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'".
To read a conversation, pass any message path from search_emails to
view_thread(path). It returns indexed messages oldest first, omits duplicate
Message-IDs, and converts HTML-only bodies to text. The defaults are 30 messages
and 20,000 characters per message; increase max_results or max_chars if the
output is truncated.
Use find_contacts("Alice") to resolve a name before searching. Its pattern is
a case-insensitive regular expression matching names or addresses, such as
@example\.com$. An empty pattern lists contacts. Results default to 30 contacts;
use max_results to change the limit, or personal=True to restrict results to
contacts seen in messages involving your personal addresses configured in mu.
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
muman pages viamu_help. - Add a
mu-mcpconsole script and useuvx mu-mcpas the install method. - Describe when to use the server in its instructions, including email, inbox, messages, receipts, and attachments.
-
view_thread: show a whole conversation from one message. -
find_contactsviamu cfind, to resolve a name to its addresses.
Run the tests with uv run python -m unittest discover -s tests. Integration
tests use an isolated temporary mail index and are skipped if mu is unavailable.
Future ideas
- Return attachment text (PDF, DOCX) from
open_attachment; Claude Desktop can't read the saved file paths.
Metadata
Release files for mu_mcp 0.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mu_mcp-0.7.0.tar.gz | 31.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mu_mcp-0.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 59.5 kB
Release files / mu_mcp-0.7.0.tar.gz
| Download URL | mu_mcp-0.7.0.tar.gz |
|---|---|
| Size | 31.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b36915dc760842742babb6278a13a3dc7fe38c9fbb4e5a7b25c0b20771031a46
|
|
BLAKE2b-256 checksum How to use checksums |
81e9154f332ab9e5221b14dd1db4b2555c30d07661d41e69b419aea30f09b067
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / mu_mcp-0.7.0-py3-none-any.whl
| Download URL | mu_mcp-0.7.0-py3-none-any.whl |
|---|---|
| Size | 28.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f6fe0ad8f6b56e8e2395519d15eb78c5366c706e7af1d88032a943bf8271cf5d
|
|
BLAKE2b-256 checksum How to use checksums |
f62131bc0b2b5c388aa63e576117894e4bb9278c72aedcaa14b28778f301e5e8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|