Skip to main content
Glama
Receipt Sweep

Receipt Sweep

by saranya-ms

πŸ“§ Receipt Sweep

An MCP server + Claude skill that connects to your email inbox, finds receipts and invoices, and builds a categorized spending spreadsheet β€” all powered by AI.

How it works

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     IMAP      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     MCP      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Your Email  │◄────────────►│  Receipt Sweep    │◄────────────►│  Claude   β”‚
β”‚  (Gmail,     β”‚   App        β”‚  MCP Server       β”‚   tools      β”‚  (AI)     β”‚
β”‚   Yahoo,     β”‚   Password   β”‚                   β”‚              β”‚           β”‚
β”‚   Outlook)   β”‚              β”‚  β€’ search_emails  β”‚              β”‚ Extracts  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚  β€’ read_email     β”‚              β”‚ amounts,  β”‚
                              β”‚  β€’ save_attachmentβ”‚              β”‚ categoriesβ”‚
                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚ & builds  β”‚
                                                                 β”‚ .xlsx     β”‚
                                                                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  1. You install the MCP server and skill

  2. You pick your provider, date range and options, then give your email address and an App Password (never stored)

  3. Claude connects via IMAP and searches every folder for receipts

  4. Claude reads each email, including HTML-only and PDF receipts, and extracts dates, amounts and store names

  5. Claude builds a formatted Excel spreadsheet and an offline dashboard with categories and totals

Related MCP server: email-mcp

Supported email providers

Provider

IMAP Host

Auth

Gmail

imap.gmail.com

App Password

Yahoo Mail

imap.mail.yahoo.com

App Password

Outlook / Hotmail

outlook.office365.com

Password or App Password

iCloud Mail

imap.mail.me.com

App-Specific Password

Custom

Any IMAP server

Password

Before you start

Do these once, before installing:

  1. Install uv. The plugin starts its server with uv, a small Python tool runner. It also downloads a suitable Python for you if needed.

    macOS / Linux:

    curl -LsSf https://astral.sh/uv/install.sh | sh

    Windows (PowerShell):

    powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

    Open a new terminal and check it with uv --version.

  2. Fully quit and reopen Claude (Desktop or Claude Code) after installing uv. Apps read your PATH when they start, so a Claude that was already running can't find uv, and the server fails with a "Connection closed" error.

  3. Create an App Password for the email account you want to sweep, using the links in Supported email providers. It's a separate password just for this tool, not your normal login. Gmail needs 2-Step Verification turned on first.

Installation

The quickest path is the Claude plugin. The install scripts further down are the manual route for Claude Desktop.

In the Claude desktop app: open Settings β†’ Plugins, click + Add, add the marketplace saranya-ms/receipt-sweep, then install Receipt Sweep from From marketplaces you added.

In Claude Code (terminal):

/plugin marketplace add saranya-ms/receipt-sweep
/plugin install receipt-sweep@receipt-sweep

Either way this installs the MCP server and the receipt-sweep skill together. Plugins load when a session starts, so start a new session, then say "Sweep my email for receipts."

Install scripts (Claude Desktop)

macOS / Linux

git clone https://github.com/saranya-ms/receipt-sweep.git
cd receipt-sweep
./install.sh

Windows

git clone https://github.com/saranya-ms/receipt-sweep.git
cd receipt-sweep
.\install.ps1

What the installer does

The script route needs Python 3.10+ and git, but not uv.

  1. Checks for Python 3.10+

  2. Creates a virtual environment in .venv/

  3. Installs the MCP server package

  4. Registers the server in your Claude Desktop config

Manual installation

If you prefer to install manually:

# Create and activate a venv
python3 -m venv .venv
source .venv/bin/activate  # or .venv\Scripts\activate on Windows

# Install the package
pip install -e .

# Add to your Claude Desktop config (claude_desktop_config.json):
# {
#   "mcpServers": {
#     "receipt-sweep": {
#       "command": "/path/to/receipt-sweep/.venv/bin/receipt-sweep-mcp",
#       "args": []
#     }
#   }
# }

Usage

After installation, start a new session and say:

"Sweep my email for receipts"

Claude sets things up in two quick steps:

  1. A few choices in one go: your email provider, how far back to look (last 30 days, last 3 months, this year, or since your last sweep), whether to count out-of-pocket spending or full receipt totals, and where to save the files.

  2. Your email address and App Password. Claude shows the steps to create an App Password for your provider. Spaces in it are fine; Claude removes them.

Then it connects, sweeps every folder, and confirms what it's doing before it starts.

The spreadsheet it produces

Sheet 1 β€” Receipts: Every transaction with Date, Store, Category, Amount, Currency, and Notes

Sheet 2 β€” Summary: Spending totals by category

Sheet 3 β€” Notes: What was searched, what was excluded, and a Needs review list of any orders whose amount couldn't be read automatically

Plus β€” an offline HTML dashboard: a self-contained .html file with KPI tiles, a spending-by-category chart, a month-by-month chart, top merchants, and a sortable transaction table. It renders entirely in the browser with no internet connection β€” all charts are inline SVG and there are no external requests.

Out-of-pocket amounts

By default, amounts are what you actually paid. When a receipt is split, for example a massage billed partly to an insurance or benefits plan, only your own payment is counted, and the full total and who covered the rest go in the Notes column. Choose full receipt totals at the start if you'd rather track the gross amount.

Receipts it can read

  • Plain-text and HTML emails. Some stores (Old Navy, Gap and others) put the order total only in the HTML version of the email; Claude reads whichever version has it.

  • PDF receipts. When the email just says "your receipt is attached", Claude reads the total straight from the PDF.

Incremental sweeps

Each run can save its state so the next run picks up where it left off β€” no duplicate scanning.

MCP Tools provided

Tool

Description

list_email_providers

Show supported providers and App Password instructions

connect_email

Connect to an inbox via IMAP

disconnect_email

Close the connection

connection_status

Check the connection is alive (reconnects if it dropped) and show the server version

list_folders

List all mailbox folders

search_emails

Search one folder by sender, subject, date range

read_email

Read the full content of an email

read_pdf_attachment

Read the text of a PDF receipt attached to an email

save_attachment

Download a PDF or other attachment

search_all_folders

Search across every folder at once

Security & privacy

  • App Passwords only β€” the server never sees your real password

  • No storage β€” credentials are held in memory for the session only (so a dropped connection can reconnect automatically); nothing is written to disk. The App Password you type is visible in your Claude conversation, so revoke it after a sweep if you prefer

  • Read-only β€” the server opens mailboxes in read-only mode; it never modifies, moves, or deletes emails

  • Local β€” the MCP server runs on your machine; email data never leaves your computer except to Claude for AI processing

  • Revocable β€” you can revoke the App Password at any time from your email provider's security settings

Privacy Policy

Receipt Sweep runs entirely on your own machine.

  • Data collection β€” The server reads only the mailbox data you ask it to: email headers, bodies, and attachments returned by your IMAP searches. It collects no analytics, telemetry, or usage data.

  • Usage & storage β€” Your email address and App Password are held in memory for the session only (to reconnect automatically if the connection drops) and are never written to disk. Email content is passed to Claude solely to extract receipt data at your request.

  • Third-party sharing β€” Nothing is sent to the author or any other third party. Data leaves your machine only to (a) your email provider over TLS/IMAP and (b) Claude, for the AI processing you initiate.

  • Data retention β€” No credentials or email data are retained after the session ends. Spreadsheets and dashboards are written only to the location you choose.

  • Contact β€” Questions or issues: https://github.com/saranya-ms/receipt-sweep/issues

Requirements

  • uv for the plugin install path (it provides Python automatically), or Python 3.10+ for the install scripts

  • Claude Desktop or Claude Code

  • An email account with IMAP access and an App Password

Troubleshooting

Symptom

Fix

Server shows "Connection closed" / the tools aren't available

uv isn't installed or Claude can't see it. Install uv, fully quit and reopen Claude, then start a new session.

Plugin installed but Claude doesn't use it

Plugins load at session start. Start a new session.

"Login failed"

Use an App Password, not your regular password. Check for typos, or create a new one. Gmail needs 2-Step Verification on first.

Plugin manager shows an old name, icon, or "no plugin in this marketplace" right after an update

The app cached the marketplace. Remove and re-add the marketplace, or wait a few minutes (GitHub caches the files briefly) and restart Claude.

An order shows up under Needs review

Its amount wasn't readable in the email or its PDF. Open the email, then add the amount yourself or tell Claude.

Claude says the server is outdated, Old Navy/Gap totals come back empty, or parallel reads fail with EOF

You're running an old copy of the plugin. The Claude desktop app / claude.ai and the Claude Code CLI each keep their own copy, and they update separately. Update Receipt Sweep in the one you're using, then start a new session. The connect_email reply ends with (receipt-sweep server vX.Y.Z); no tag means a version older than 1.2.1.

Saving the spreadsheet fails with "permission denied" or "resource busy"

The file is open in Excel (or OneDrive is still syncing it). Close it and ask Claude to try again; Claude saves a -UPDATED.xlsx copy beside it if it can't.

Distribute as a plugin

This repo is also a Claude plugin and its own marketplace (.claude-plugin/). Users install it with the two /plugin commands in Installation.

Submit it to Anthropic's directory

To list it in the public directory (installable from claude.ai and Cowork, and synced into Claude Code):

  1. Validate locally: claude plugin validate ./ --strict.

  2. From a paid Claude plan, open claude.ai/directory/manage β†’ Submit new β†’ Plugin. The portal reads the listing fields from .claude-plugin/plugin.json and the Privacy Policy section above.

  3. Anthropic auto-scans the submission for policy compliance and lists it as a Community plugin; some submissions also get a human review. Track status in the portal.

License

MIT

Available Tools

10 tools
connect_emailA

Connect to an email inbox via IMAP.

Args: provider: Provider name ('gmail', 'yahoo', 'outlook', 'icloud') or a raw IMAP hostname (e.g. 'imap.example.com'). email_address: The full email address to sign into. app_password: An App Password for the account (NOT the regular password). See list_email_providers() for how to create one.

Returns a status message. The connection persists for subsequent tool calls.

NameRequiredDescriptionDefault
providerYes
app_passwordYes
email_addressYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations declare write-ish (readOnlyHint=false) but non-destructive behavior. The description adds genuinely useful context beyond that: the connection persists across subsequent calls, an app password is required rather than the account password, and list_email_providers explains how to obtain one. It doesn't cover auth failures, retry behavior, or what happens when reconnecting an already-connected account.

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 one-line purpose followed by compact per-argument notes; no filler sentences. The Args-style formatting is slightly verbose for three parameters but every line carries information the agent needs.

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 the return value need not be detailed, and the description's 'returns a status message' is a reasonable pointer. For a stateful connection tool the description covers the essentials (persistence, credential type, provider source); only failure modes and reconnect semantics 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 coverage is 0%, so the description carries the full burden, and it does: provider accepts either a known provider name (enumeration supplied, which the schema lacks) or a raw IMAP hostname with an example, email_address is the full sign-in address, and app_password is explicitly not the regular password. This is meaningful semantics the schema alone cannot provide.

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 and resource plus the transport ('Connect to an email inbox via IMAP'), which is enough to separate it from siblings like disconnect_email and connection_status. It stops short of explicitly contrasting with those siblings, but the action 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 Guidelines3/5

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

Implied usage: the note that 'the connection persists for subsequent tool calls' tells the agent this is a prerequisite for the read/search tools, and the app_password hint points to list_email_providers. There is no explicit when-not-to-use or a named alternative, so guidance remains inferred rather than stated.

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

connection_statusA
Read-only

Check whether an email connection is active, and report the server version.

Sends a NOOP so a socket the mail server has silently closed is noticed (and re-opened) here rather than on the next search or read.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, but the description adds real behavioral context beyond them: it performs a network NOOP and can re-open a closed socket, a side effect an agent would not infer from the annotation. No auth requirements or failure behavior are described.

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 short sentences, front-loaded with the primary purpose, and the second sentence exists solely to explain the non-obvious NOOP behavior. 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 values need not be explained, and the description covers the essential behavior for a simple status check. It stops short of covering error/failure semantics, but the core is complete.

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 takes zero parameters, so the schema is trivially complete and there is nothing for the description to compensate for. Baseline for a 0-param tool.

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 ('Check whether an email connection is active') plus a secondary output ('report the server version'). Easily distinguished from siblings connect_email, disconnect_email, and the read/search tools.

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?

Explains the motivating scenario clearly β€” using it so a silently-closed socket surfaces here rather than on the next search or read. It does not explicitly name an alternative tool or a when-not-to-use condition, so it falls just short of the top band.

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

disconnect_emailA

Disconnect from the current email inbox.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the agent knows this mutates session state without being destructive. The description adds only the 'current' scoping detail; it does not say whether stored credentials or configuration are retained, or whether reconnection is required afterward.

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?

A single short sentence with zero waste, front-loading the action and the target resource. Nothing extraneous and nothing buried.

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?

With no parameters, an output schema present, and annotations covering the safety profile, the description is nearly complete for this tool. The only gap is post-disconnect state (what happens to the connection/session), which is a minor omission.

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 takes zero parameters, so there is no parameter semantics for the description to carry. Baseline of 4 applies.

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 (disconnect) and resource (the current email inbox), which is enough for an agent to distinguish it from connect_email or connection_status. It does not explicitly name the sibling tools it complements, so it stops short of a 5.

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?

There is no when-to-use or when-not-to-use guidance, no prerequisites, and no reference to alternatives such as connect_email or connection_status. The intent is inferable from the name alone, but the description provides no routing help.

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

list_email_providersA
Read-only

List supported email providers and their setup instructions.

Call this first to show the user which providers are supported and how to generate an App Password for their provider.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes this is a safe, side-effect-free read. The description adds that the output contains setup instructions and App Password guidance, but since an output schema exists, most return-content disclosure is already covered by structured data, leaving only modest added value.

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 short sentences, front-loaded with the action and the reason to call it first. Every phrase earns its place and nothing is repeated.

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?

For a no-argument read-only listing tool with an output schema and annotation coverage, the description supplies everything an agent needs: what it returns and when to reach for it.

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 takes zero parameters, which is the baseline-4 case. There is nothing for the description to clarify beyond what the empty schema already conveys.

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 and resource ('List supported email providers') plus what it returns ('their setup instructions'), so the agent knows exactly what this produces. It does not name a sibling for contrast, though 'Call this first' implicitly positions it before connect_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?

Gives clear sequencing guidance ('Call this first to show the user which providers are supported') and states the user-facing purpose (generating an App Password). There is no explicit when-not or named alternative, but for a zero-param informational tool the context is sufficient to disambiguate from connect_email/connection_status.

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

list_foldersA
Read-only

List all folders/labels in the connected mailbox.

Returns folder names that can be passed to search_emails and read_email.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

readOnlyHint=true already tells the agent this is a safe read, so the bar is lower; the description usefully adds that the output is a folder-name vocabulary consumed by search/read tools. It says nothing about pagination, folder hierarchies, or error behavior for a disconnected mailbox.

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 short sentences, front-loaded with the action and followed immediately by why the agent cares about the result. Zero 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 details are out of scope, and a parameterless read-only tool needs little else. The one missing piece is how it relates to the sibling search_all_folders, which the agent must infer.

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 takes zero parameters, so per the rubric the baseline is 4; nothing in the schema needs elaboration and the description correctly does not invent any.

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 and resource ('List all folders/labels in the connected mailbox'), and clarifies the returned values feed search_emails and read_email. It does not explicitly differentiate itself from the sibling search_all_folders, so it falls short of a 5.

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 downstream hint ('names that can be passed to search_emails and read_email') implies a discovery use case, but there is no explicit when-to-use/when-not guidance and no mention of the likely alternative search_all_folders.

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

read_emailA
Read-only

Read the full content of a specific email.

Args: message_id: The message ID from search_emails results. folder: The folder the message is in (must match the search).

Returns the email's date, sender, subject, body text, and a list of any attachments (with filenames and sizes). The body is taken from whichever of the plain-text or HTML parts contains the order details. If has_pdf is true and the body has no amount, call read_pdf_attachment.

NameRequiredDescriptionDefault
folderNoINBOX
message_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true, so the safety profile is covered. The description adds useful behavior beyond that: the folder must match the search, the body is pulled from whichever part contains the order details, and a conditional hand-off to read_pdf_attachment. It does not mention pagination or error behavior, but the added context is meaningful.

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-loads the purpose, then parameters, then return behavior in a compact block with no filler. The references to 'order details' and 'amount' are narrowly domain-specific and slightly muddy a generic email reader, but overall it is tight and well-ordered.

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 values need not be enumerated, yet the description still summarizes the returned fields and explains source-selection of the body. Combined with the annotation-carried safety profile, an agent has nearly everything needed to call it correctly.

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 carries the burden and largely compensates: message_id is sourced from search_emails, and folder is described with the constraint that it 'must match the search' (beyond the schema's plain default of INBOX). Both parameters gain semantic meaning not present in the 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?

States a specific verb and resource ('Read the full content of a specific email') and implicitly differentiates from siblings by naming search_emails as the source of message_id and read_pdf_attachment as a follow-up. An agent can tell this is the single-message full-content reader, distinct from the search/list tools.

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?

Explains how to obtain the input ('message_id from search_emails results') and gives an explicit conditional branch to an alternative tool ('if has_pdf is true and the body has no amount, call read_pdf_attachment'). It lacks an explicit when-not-to-use statement, but the routing guidance is concrete.

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

read_pdf_attachmentA
Read-only

Extract the text of a PDF attachment, such as an emailed receipt.

Use this when read_email lists a PDF attachment and the body only says something like "your receipt is attached".

Args: message_id: The message ID from search_emails results. filename: The PDF's filename (from read_email's attachments list). folder: The folder the message is in.

Returns the PDF's text, or an error message.

NameRequiredDescriptionDefault
folderNoINBOX
filenameYes
message_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

readOnlyHint=true already establishes the safe-read profile, so the description's burden is lighter. It adds modest behavioral context – that failures surface as 'an error message' and that the args must be sourced from prior tool results – but says nothing about size limits, scanned/image PDFs, or parsing behavior beyond the text return already covered by the output schema.

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?

Front-loaded with purpose, then usage, then a compact Args block. Nothing is padded and each block is one to two lines.

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?

With readOnlyHint covering safety and an output schema covering return values, the description only needs to supply purpose, trigger, and parameter sourcing – all of which are present. An agent has everything required to call this tool correctly.

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 carry all parameter meaning, and it does: every one of the three args is documented, and two of them name their provenance ('message ID from search_emails results', 'filename from read_email's attachments list'). This is meaningfully more than the bare schema property 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 gives a specific verb + resource ('Extract the text of a PDF attachment') and grounds it with a concrete example ('an emailed receipt'). It implicitly differentiates from read_email by describing the extraction step, but never distinguishes itself from the sibling save_attachment, which also operates on attachments.

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 states a clear trigger condition: use this when read_email lists a PDF attachment but the body only says something like 'your receipt is attached'. That is a concrete when-to-use rule, though it gives no explicit when-not or alternative (e.g. when to use save_attachment instead).

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

save_attachmentA

Download an email attachment and save it to disk.

Args: message_id: The message ID from search_emails results. filename: The attachment filename (from read_email's attachments list). save_path: Local file path to save the attachment to. folder: The folder the message is in.

Returns the path to the saved file, or an error message.

NameRequiredDescriptionDefault
folderNoINBOX
filenameYes
save_pathYes
message_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description adds that it writes to disk and that it returns the saved path or an error, but it omits meaningful write-side behavior: whether an existing file at save_path is overwritten, whether the directory must exist, and any permission requirements.

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 purpose sentence is front-loaded and the Args list is compact and scannable, with no filler. The docs-style block is slightly longer than a prose alternative would be, but it earns its space given 0% schema coverage.

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?

With an output schema present, the description needn't detail return values (it still notes the path/error return), and annotations cover the safety profile. The main residual gap is write-behavior detail such as overwrite semantics, but the core inputs and provenance are complete.

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 carries the parameter burden, and it does so by explaining all four params including the otherwise-undocumented 'folder' as 'the folder the message is in'. It adds provenance for message_id and filename, though it does not disclose the INBOX default for folder.

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 first sentence names a specific verb and resource ('Download an email attachment and save it to disk'), which cleanly distinguishes it from siblings like read_email and read_pdf_attachment that read rather than persist. An agent can select this tool without inspecting the 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?

The Args block embeds the workflow by stating where inputs come from β€” message_id 'from search_emails results' and filename 'from read_email's attachments list' β€” which tells the agent the prerequisite calls. However, it never states when to prefer this over read_pdf_attachment or any exclusion/prerequisite failure condition.

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

search_all_foldersA
Read-only

Search across ALL folders in the mailbox (inbox, spam, trash, archive, custom folders).

Same parameters as search_emails but runs the search in every folder. Returns results grouped by folder, plus any folders that could not be searched. Slower but thorough.

NameRequiredDescriptionDefault
since_dateNo
before_dateNo
from_addressNo
body_or_subjectNo
limit_per_folderNo
subject_containsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description carries the behavioral burden and does it well: it discloses the performance cost ('slower'), the return shape (grouped by folder), and partial-failure handling ('folders that could not be searched'). It does not mention any connection/auth prerequisite, which siblings like connect_email suggest may exist.

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 sentences, each earning its place: scope, sibling differentiation, return shape, and performance tradeoff, with the scope constraint front-loaded. No redundancy or 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 the description needn't explain return values, yet it usefully summarizes grouping and partial failures. The remaining gap is the absence of any prerequisite/auth or rate-limit context for a tool that fans out across every mailbox folder.

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 0% across 6 parameters with only titles, so the description must compensate and mostly does not. 'Same parameters as search_emails' is a useful cross-reference but forces the agent to open another tool's schema; it gives no format or semantics for since_date/before_date, body_or_subject, or how limit_per_folder interacts with the per-folder grouping.

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 (search across ALL folders in the mailbox) and enumerates the folder scope (inbox, spam, trash, archive, custom). It explicitly distinguishes itself from the sibling search_emails by noting it runs the search in every folder rather than one.

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?

'Same parameters as search_emails but runs the search in every folder' names the alternative and the condition that selects this one. 'Slower but thorough' conveys the cost/benefit tradeoff, though it stops short of an explicit 'use search_emails when you know the folder' exclusion.

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

search_emailsA
Read-only

Search for emails in a folder.

Args: folder: Mailbox folder to search (default 'INBOX'). Use list_folders() to see all available folders. Common: INBOX, Sent, Trash, [Gmail]/All Mail, Bulk (Yahoo spam), Archive. from_address: Filter by sender email address. subject_contains: Filter by text in the subject line. body_or_subject: Search for text in the subject OR body. since_date: Only emails on or after this date (YYYY-MM-DD). before_date: Only emails before this date (YYYY-MM-DD). limit: Max results to return (default 50, newest first).

Returns a JSON list of {id, date, from, subject} for matching emails. Use read_email() with the id to get the full content.

NameRequiredDescriptionDefault
limitNo
folderNoINBOX
since_dateNo
before_dateNo
from_addressNo
body_or_subjectNo
subject_containsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

readOnlyHint=true already establishes the safe-read profile, and the description adds genuinely useful context beyond it: default limit of 50 returned newest-first, the exact result fields ({id, date, from, subject}), and the follow-up path via read_email(). It does not discuss pagination beyond the limit or rate limits, keeping it short of a 5.

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 purpose sentence, then a scannable Args block, then the return shape and follow-up hint. The args block is long but earns its place given 0% schema coverage; only minor trimming would be possible without losing 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?

For a 7-parameter read tool with an output schema, the description covers the gaps that matter: folder discovery, date formats, result fields, and the read_email follow-up. The one missing piece is an explicit cross-reference to search_all_folders for cross-folder queries.

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 carry all parameter meaning, and it does: every one of the 7 params is explained, including the folder default and example values, the YYYY-MM-DD date formats, and limit's default and ordering. This fully compensates for the empty schema descriptions.

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 and resource ('Search for emails in a folder') and scopes it to a single folder, which implicitly contrasts with the sibling search_all_folders. However, it never names that sibling, so the distinction is left for the agent to infer from names alone.

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 concrete routing context: directs to list_folders() to discover folders and to read_email() with the id for full content. It does not explicitly state when to prefer search_all_folders over this single-folder tool, so the alternative is only implied.

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. 10 tool updatesv0.1.0
    • First observedconnect_email
    • First observedconnection_status
    • First observeddisconnect_email
    • First observedlist_email_providers
    • First observedlist_folders
    • First observedread_email
    • First observedread_pdf_attachment
    • First observedsave_attachment
    • First observedsearch_all_folders
    • First observedsearch_emails

TDQS

A4/5.0

Scored across 10 tools

Disambiguation4/5

Most tools target clearly distinct operations (connect vs. search vs. read vs. attachment handling). The main overlap is search_emails vs. search_all_folders, and connect_email vs. connection_status, but the descriptions clearly differentiate scope and intent.

Naming Consistency4/5

Nearly all tools use a consistent snake_case verb_noun pattern (connect_email, search_emails, read_email, save_attachment). The noun-only connection_status is a minor deviation but still readable and unambiguous.

Tool Count5/5

Ten tools is well-scoped for an email/receipt-sweeping server, covering connection lifecycle, discovery, search, reading, and attachments without redundancy.

Completeness4/5

The surface covers the full read-side lifecycle: connect/disconnect/status, provider and folder discovery, single- and all-folder search, message reading, and PDF/attachment extraction. Missing write operations (delete, move, mark) are outside the stated receipt-extraction purpose.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables Claude to interact with email accounts via IMAP and SMTP, providing tools for searching, reading, sending, and managing emails across multiple providers.
    40
    1,013 npm
    115
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables Claude to read, search, draft, send, flag, and move email across multiple IMAP/SMTP mailboxes while keeping credentials local.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables Claude Code to manage email inboxes via IMAP, including reading, categorizing, phishing detection, archiving, junking, and sending emails with user permission.
    -
  • A
    license
    A
    quality
    C
    maintenance
    Enables Claude to read, manage, and send email from any IMAP mailbox over plain IMAP and SMTP, including hosting-company and self-hosted mail servers. It provides tools for searching, reading, moving, deleting, and composing messages while built-in safety rules prevent unintended changes.
    12
    MIT