Skip to main content
Glama
as-j

Fastmail MCP Server

by as-j

Fastmail MCP Server

A Model Context Protocol (MCP) server for Fastmail email, enabling AI assistants to read inbox mail, search messages, page through large result sets, send and reply to email, and manage drafts.

Tool descriptions are written as routing hints for MCP clients, so prompts like "check email", "read my inbox", "reply to this email", and "save a draft" map more reliably to the right Fastmail tools.

Features

Core Email Operations

  • List mailboxes and get mailbox statistics

  • List, search, and filter emails with advanced criteria

  • Get specific emails by ID with full content

  • Send emails (text and HTML) with proper draft/sent handling

  • Reply to emails with proper threading (In-Reply-To, References headers)

  • Create and save email drafts (with or without threading)

  • Email management: mark read/unread, delete, move between folders

Advanced Email Features

  • Attachment Handling: List and download email attachments

  • Threading Support: Get complete conversation threads

  • Advanced Search: Multi-criteria filtering (sender, date range, attachments, read status)

  • Bulk Operations: Process multiple emails simultaneously

  • Statistics & Analytics: Account summaries and mailbox statistics

Label vs Move Operations

  • move_email/bulk_move: Replaces ALL mailboxes for an email (folder behavior)

  • add_labels/remove_labels: Adds/removes SPECIFIC mailboxes while preserving others (label behavior)

Identity & Account Management

  • List available sending identities

  • Account summary with comprehensive statistics

Related MCP server: Fastmail MCP Server

Setup

Prerequisites

  • Node.js 18+

  • A Fastmail account with API access

  • Fastmail API token

Installation

  1. Clone or download this repository

  2. Install dependencies:

    npm install
  3. Build the project:

    npm run build

Configuration

  1. Get your Fastmail API token:

    • Log in to Fastmail web interface

    • Go to Settings β†’ Privacy & Security

    • Find "Connected apps & API tokens" section

    • Click "Manage API tokens"

    • Click "New API token"

    • Copy the generated token

  2. Set environment variables:

    export FASTMAIL_API_TOKEN="your_api_token_here"
    # Optional: customize base URL (defaults to https://api.fastmail.com)
    export FASTMAIL_BASE_URL="https://api.fastmail.com"

Running the Server

Start the MCP server:

npm start

For development with auto-reload:

npm run dev

Remote HTTP Mode for ChatGPT / Hosted MCP

You can also run the server as a private remote MCP endpoint by setting MCP_PATH. This mode is intended for a small number of trusted clients that all use the same Fastmail account.

export FASTMAIL_API_TOKEN="your_api_token_here"
export MCP_PATH="replace-with-a-long-random-secret-path"
export PORT="3000"

# Optional operational limits
export MCP_MAX_SESSIONS="10"
export MCP_SESSION_TTL_MS="900000"
export MCP_REAP_INTERVAL_MS="60000"
export MCP_MAX_BODY_BYTES="1048576"

npm start

Behavior in HTTP mode:

  • The server is single-tenant: every MCP session uses the same Fastmail token from the environment.

  • Stateless sessionless POST requests are the default hosted path; most remote MCP clients do not need to send mcp-session-id.

  • ChatGPT-compatible auth is expected to happen at the infrastructure layer, not via OAuth in this server.

  • Do not assume ChatGPT will send arbitrary custom bearer tokens to your MCP endpoint.

  • Protect the endpoint with a high-entropy MCP_PATH, and optionally add reverse-proxy controls such as IP allowlists if they fit your deployment.

  • If a client opts into explicit stateful sessions, they are isolated in-process, expire after idle timeout, and are capped by MCP_MAX_SESSIONS.

  • Oversized bodies are rejected and invalid session requests return structured JSON-RPC errors.

Run via npx (GitHub)

Default to main branch:

FASTMAIL_API_TOKEN="your_token" FASTMAIL_BASE_URL="https://api.fastmail.com" \
  npx --yes github:MadLlama25/fastmail-mcp fastmail-mcp

Windows PowerShell:

$env:FASTMAIL_API_TOKEN="your_token"
$env:FASTMAIL_BASE_URL="https://api.fastmail.com"
npx --yes github:MadLlama25/fastmail-mcp fastmail-mcp

Pin to a tagged release:

FASTMAIL_API_TOKEN="your_token" \
  npx --yes github:MadLlama25/fastmail-mcp@v1.7.1 fastmail-mcp

Install as a Claude Desktop Extension (DXT)

You can install this server as a Desktop Extension for Claude Desktop using the packaged .dxt file.

  1. Build and pack:

    npm run build
    npx @anthropic-ai/dxt pack

    This produces fastmail-mcp.dxt in the project root.

  2. Install into Claude Desktop:

    • Open the .dxt file, or drag it into Claude Desktop

    • When prompted:

      • Fastmail API Token: paste your token (stored encrypted by Claude)

      • Fastmail Base URL: leave blank to use https://api.fastmail.com (default)

  3. Use any of the tools (e.g. get_recent_emails).

Available Tools (28 Total)

🎯 Most Popular Tools:

  • check_function_availability: Check what's available and get setup guidance

  • test_bulk_operations: Safely test bulk operations with dry-run mode

  • send_email: Full-featured email sending with proper draft/sent handling

  • advanced_search: Powerful multi-criteria email filtering

  • get_recent_emails: Quick access to recent emails from any mailbox, especially for prompts like "check email"

  • Paged email tools now return items, total, has_more, and next_offset so agents can fetch more only when needed.

Email Tools

  • list_mailboxes: Get all mailboxes in your account

  • list_emails: List emails from a specific mailbox or all mailboxes

    • Parameters: mailboxId (optional), limit (default: 20), offset (default: 0)

  • get_email: Get a specific email by ID

    • Parameters: emailId (required)

  • send_email: Send an email (supports threading via optional inReplyTo and references headers)

    • Parameters: to (required array), cc (optional array), bcc (optional array), from (optional), mailboxId (optional), subject (required), textBody (optional), htmlBody (optional), inReplyTo (optional array), references (optional array)

  • reply_email: Reply to an existing email with proper threading headers (automatically builds In-Reply-To and References)

    • Parameters: originalEmailId (required), to (optional array, defaults to original sender), cc (optional array), bcc (optional array), from (optional), textBody (optional), htmlBody (optional)

  • save_draft: Save an email as a draft without sending (supports threading headers for reply drafts)

    • Parameters: to (required array), cc (optional array), bcc (optional array), from (optional), subject (required), textBody (optional), htmlBody (optional), inReplyTo (optional array), references (optional array)

  • create_draft: Create a minimal email draft (at least one of to/subject/body required)

    • Parameters: to (optional array), cc (optional array), bcc (optional array), from (optional), mailboxId (optional), subject (optional), textBody (optional), htmlBody (optional)

  • search_emails: Search emails by content

    • Parameters: query (required), limit (default: 20), offset (default: 0)

  • get_recent_emails: Get the most recent emails from a mailbox (inspired by JMAP-Samples top-ten)

    • Parameters: limit (default: 10, max: 50), mailboxName (default: 'inbox'), offset (default: 0)

  • mark_email_read: Mark an email as read or unread

    • Parameters: emailId (required), read (default: true)

  • delete_email: Delete an email (move to trash)

    • Parameters: emailId (required)

  • move_email: Move an email to a different mailbox (replaces all mailboxes)

    • Parameters: emailId (required), targetMailboxId (required)

  • add_labels: Add labels (mailboxes) to an email without removing existing ones

    • Parameters: emailId (required), mailboxIds (required array)

  • remove_labels: Remove specific labels (mailboxes) from an email

    • Parameters: emailId (required), mailboxIds (required array)

Advanced Email Features

  • get_email_attachments: Get list of attachments for an email

    • Parameters: emailId (required)

  • download_attachment: Download an email attachment. If savePath is provided, saves the file to disk and returns the file path and size. Otherwise returns a download URL.

    • Parameters: emailId (required), attachmentId (required), savePath (optional)

  • advanced_search: Advanced email search with multiple criteria

    • Parameters: query (optional), from (optional), to (optional), subject (optional), hasAttachment (optional), isUnread (optional), mailboxId (optional), after (optional), before (optional), limit (default: 20), offset (default: 0)

  • get_thread: Get all emails in a conversation thread

    • Parameters: threadId (required)

Email Statistics & Analytics

  • get_mailbox_stats: Get statistics for a mailbox (unread count, total emails, etc.)

    • Parameters: mailboxId (optional, defaults to all mailboxes)

  • get_account_summary: Get overall account summary with statistics

Bulk Operations

  • bulk_mark_read: Mark multiple emails as read/unread

    • Parameters: emailIds (required array), read (default: true)

  • bulk_move: Move multiple emails to a mailbox

    • Parameters: emailIds (required array), targetMailboxId (required)

  • bulk_delete: Delete multiple emails (move to trash)

    • Parameters: emailIds (required array)

  • bulk_add_labels: Add labels to multiple emails simultaneously

    • Parameters: emailIds (required array), mailboxIds (required array)

  • bulk_remove_labels: Remove labels from multiple emails simultaneously

    • Parameters: emailIds (required array), mailboxIds (required array)

Identity & Testing Tools

  • list_identities: List sending identities (email addresses that can be used for sending)

  • check_function_availability: Check which functions are available based on account permissions (includes setup guidance)

  • test_bulk_operations: Safely test bulk operations with dry-run mode

    • Parameters: dryRun (default: true), limit (default: 3)

API Information

This server uses the JMAP (JSON Meta Application Protocol) API provided by Fastmail. JMAP is a modern, efficient alternative to IMAP for email access.

Inspired by Fastmail JMAP-Samples

Many features in this MCP server are inspired by the official Fastmail JMAP-Samples repository, including:

  • Recent emails retrieval (based on top-ten example)

  • Email management operations

  • Efficient chained JMAP method calls

Authentication

The server uses bearer token authentication with Fastmail's API. API tokens provide secure access without exposing your main account password.

Rate Limits

Fastmail applies rate limits to API requests. The server handles standard rate limiting, but excessive requests may be throttled.

Development

Project Structure

src/
β”œβ”€β”€ index.ts              # Startup entrypoint (stdio or HTTP mode)
β”œβ”€β”€ mcp-server.ts         # MCP server factory and tool handlers
β”œβ”€β”€ http-server.ts        # Streamable HTTP session management and limits
β”œβ”€β”€ auth.ts              # Authentication handling
└── jmap-client.ts       # JMAP client wrapper with paginated email queries

Building

npm run build

Development Mode

npm run dev

License

MIT

Contributing

Contributions are welcome! Please ensure that:

  1. Code follows the existing style

  2. All functions are properly typed

  3. Error handling is implemented

  4. Documentation is updated for new features

Troubleshooting

Common Issues

  1. Authentication Errors: Ensure your API token is valid and has the necessary permissions

  2. Missing Dependencies: Run npm install to ensure all dependencies are installed

  3. Build Errors: Check that TypeScript compilation completes without errors using npm run build

  4. Unexpectedly Large Search Results: Use limit and offset, then follow next_offset only when has_more is true

  5. HTTP Session Errors: Prefer sessionless POST requests first; mcp-session-id is only needed for explicit stateful-session flows

  6. Too Many Concurrent Clients: Increase MCP_MAX_SESSIONS or wait for idle sessions to expire if you are using explicit stateful sessions and the server returns "maximum concurrent MCP sessions reached"

Email Tools Failing with Serialization Errors?

If get_email, list_emails, search_emails, or advanced_search fail with "content serialization" or "Cannot read properties of undefined" errors, upgrade to v1.7.1+. This was caused by incomplete JMAP response validation that surfaced after the MCP SDK v1.x upgrade added stricter result checking.

Testing Your Setup

Use the built-in testing tools:

  • check_function_availability: See what's available and get setup help

  • test_bulk_operations: Safely test bulk operations without making changes

For more detailed error information, check the console output when running the server.

Privacy & Security

  • API tokens are stored encrypted by Claude Desktop when installed via the DXT and are never logged by this server.

  • The server avoids logging raw errors and sensitive data (tokens, email addresses, identities, attachment names/blobIds) in error messages.

  • Tool responses may include your email metadata/content by design (e.g., listing emails) but internal identifiers and credentials are not disclosed beyond what Fastmail returns for the requested data.

  • If you encounter errors, messages are sanitized and summarized to prevent leaking personal information.

  • In remote HTTP mode, this server is designed for a single shared Fastmail account, not for multi-tenant per-user isolation.

  • Remote HTTP mode does not implement OAuth and does not rely on custom bearer-token auth from ChatGPT; secure it with a secret path and network/proxy controls appropriate for your deployment.

Available Tools

28 tools
add_labelsA
Idempotent

Add one or more mailbox labels to an email without removing existing ones. Use when the user wants to tag or categorize a message while keeping its current mailbox membership. Do not use to relocate an email into a single destination mailbox; use move_email.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email to add labels to
mailboxIdsYesArray of mailbox IDs to add as labels

TDQS

A4.4/5.0
Behavior4/5

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

Annotations provide safety profile (non-destructive, idempotent). Description adds additive behavior detail ('without removing existing ones'), which is beyond annotations. No contradictions.

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

Conciseness5/5

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

Three sentences with no wasted words. Action, usage, and exclusion are front-loaded, making it easy for an agent to parse quickly.

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 tool with no output schema, description adequately explains the operation (additive labels) and provides usage context. Could mention return type or confirmation, but not strictly necessary.

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

Parameters3/5

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

Schema coverage is 100% with descriptions for both parameters. Description does not add any additional parameter semantics beyond what schema already provides.

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

Purpose5/5

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

Description clearly states verb ('Add'), resource ('mailbox labels to an email'), and behavior ('without removing existing ones'). It distinguishes from move_email by specifying not to relocate.

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

Usage Guidelines5/5

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

Explicitly states when to use ('tag or categorize a message while keeping current mailbox membership') and when not to use ('do not use to relocate... use move_email'). Provides clear alternative.

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

bulk_add_labelsA
Idempotent

Add labels to multiple emails in one call. Use when the user wants to categorize many specific messages at once. Do not use to relocate messages into a different mailbox; use bulk_move.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdsYesArray of email IDs to add labels to
mailboxIdsYesArray of mailbox IDs to add as labels

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already indicate idempotent, non-destructive, and non-read-only behavior. The description adds minimal additional behavioral context beyond 'in one call'.

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

Conciseness5/5

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

Three sentences, each serving a distinct purpose: action, usage guidance, and exclusion. No wasted words.

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

Completeness4/5

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

For a simple batch operation with no output schema, the description covers purpose, usage, and alternatives. Could mention return value or errors, but not essential.

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

Parameters3/5

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

Input schema has 100% parameter description coverage, so the description does not need to add parameter details. Baseline score 3 applies.

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 'Add' and the resource 'labels to multiple emails', distinguishing it from siblings like 'bulk_remove_labels' and 'add_labels'.

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

Usage Guidelines5/5

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

Explicitly says when to use ('categorize many specific messages') and when not to use ('do not use to relocate messages'), naming the alternative tool 'bulk_move'.

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

bulk_deleteA
DestructiveIdempotent

Delete multiple emails by moving them to Trash. Use when the user explicitly wants to trash a batch of specific messages. Do not use for a single message; use delete_email.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdsYesArray of email IDs to delete

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already provide destructiveHint=true, but the description adds that the operation moves emails to Trash (not permanent deletion), which is valuable behavioral detail not in annotations.

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

Conciseness5/5

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

Three sentences are front-loaded with the core action, efficient, and contain no extraneous 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 simple single-parameter schema and annotations, the description is fairly complete; it covers purpose, usage guidelines, and basic behavior. Missing details about response format, but overall adequate for the tool's complexity.

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

Parameters3/5

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

Schema coverage is 100% with a clear description for 'emailIds', so the description does not need to add parameter details. Baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states 'Delete multiple emails by moving them to Trash' with a specific verb and resource, and distinguishes from 'delete_email' for single messages.

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

Usage Guidelines5/5

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

Explicitly provides when to use ('user explicitly wants to trash a batch of specific messages') and when not to use ('Do not use for a single message; use delete_email'), with a direct reference to the alternative sibling tool.

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

bulk_mark_readA
Idempotent

Mark multiple emails as read or unread in one call. Use when the user wants to triage a group of specific email IDs together. Do not use for one email; use mark_email_read.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdsYesArray of email IDs to mark
readNotrue to mark as read, false as unread

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already provide safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true). Description adds bulk nature but not new behavioral details beyond annotations.

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

Conciseness5/5

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

Three short sentences, no wasted words, purpose front-loaded.

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?

Tool is simple with no output schema; description covers purpose and usage well. Could mention idempotency but annotation already does.

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

Parameters3/5

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

Schema description coverage is 100%, and description doesn't add extra meaning beyond what the schema provides for 'emailIds' and 'read'.

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 'mark' and resource 'multiple emails', and distinguishes from sibling tool 'mark_email_read' by specifying it's for multiple emails in one call.

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

Usage Guidelines5/5

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

Explicitly says 'Use when...' for triaging a group and directly states to use 'mark_email_read' for a single email, providing clear guidance on when not to use it.

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

bulk_moveA
Idempotent

Move multiple emails to a mailbox in one call. Use when the user wants to file a set of known email IDs into the same destination mailbox. Do not use to apply labels while preserving the current mailbox set; use bulk_add_labels.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdsYesArray of email IDs to move
targetMailboxIdYesID of target mailbox

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, openWorldHint=true. Description adds nothing beyond stating the move action. No contradiction, but no extra behavioral context like effect on source mailbox or permissions.

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

Conciseness5/5

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

Three sentences, each essential: purpose, when to use, when not to use. Front-loaded with action. No wasted words.

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

Completeness4/5

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

For a simple 2-parameter bulk operation without output schema, description covers purpose and usage. Could briefly mention that emails are moved out of their current mailbox, but overall sufficient given signal count.

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

Parameters3/5

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

Schema description coverage is 100%; both 'emailIds' and 'targetMailboxId' have adequate descriptions. Description does not add any extra meaning beyond what the schema provides.

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

Purpose5/5

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

Description clearly states 'Move multiple emails to a mailbox in one call' with specific verb 'Move', resource 'emails', and scope 'multiple'. It distinguishes from sibling tool 'bulk_add_labels' which preserves mailbox.

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

Usage Guidelines5/5

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

Explicitly says when to use ('user wants to file a set of known email IDs into the same destination mailbox') and when not to use ('Do not use to apply labels while preserving the current mailbox set; use bulk_add_labels'). Clearly excludes alternative use cases.

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

bulk_remove_labelsA
Idempotent

Remove labels from multiple emails in one call. Use when the user wants to untag a batch of specific messages together. Do not use to delete or move email.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdsYesArray of email IDs to remove labels from
mailboxIdsYesArray of mailbox IDs to remove as labels

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate idempotent and non-destructive behavior; description confirms the operation without contradicting annotations, though it doesn't elaborate on edge cases (e.g., non-existent labels).

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

Conciseness5/5

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

Three concise sentences, each with a distinct purpose: action, usage, and exclusion. No unnecessary words.

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

Completeness4/5

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

Covers core purpose and usage constraints. For a simple operation with 2 parameters and annotations, it is adequate, though could mention return behavior.

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

Parameters3/5

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

Schema covers both parameters completely (100% description coverage), so the description adds no new semantic value beyond reinforcing that it operates on multiple emails.

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

Purpose5/5

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

The description clearly states the action ('remove labels') and scope ('multiple emails'), distinguishing it from siblings like 'remove_labels' (single) and 'bulk_add_labels'.

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

Usage Guidelines5/5

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

Explicitly states when to use ('untag a batch') and when not to use ('do not use to delete or move email'), providing clear direction.

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

check_function_availabilityA
Read-onlyIdempotent

Report which Fastmail email and identity functions are currently available for this account and API token. Use when setup seems incomplete, a mail tool fails in an unexpected way, or you need a quick capability summary for the configured account. Do not use for reading email content or browsing the inbox.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint, which cover safety and idempotency. The description adds that it reports availability for the configured account and API token, giving extra context beyond annotations about scope. It does not contradict annotations.

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 three sentences, each earning its place: purpose, usage guidance, and exclusions. Front-loaded with the core action, no redundant words.

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

Completeness4/5

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

Given no input parameters and no output schema, the description provides sufficient context for a simple diagnostic tool. It explains when to use and what it does, though it does not describe the output format (e.g., list of function names or flags), which would be helpful for completeness. However, the low complexity justifies a 4.

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?

Input schema has zero parameters, so baseline is 4 per guidelines. The description does not need to add parameter information, as there are none to describe.

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

Purpose5/5

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

The description uses a specific verb 'report' and resource 'function availability', clearly distinguishing from sibling tools like list_emails or download_attachment. It states exactly what the tool does: reports which Fastmail functions are available for a given account and token.

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?

The description explicitly provides 'when to use' scenarios: setup seems incomplete, a mail tool fails unexpectedly, or a quick capability summary is needed. It also clarifies 'when not to use' by stating not for reading email content or browsing inbox, providing clear context versus sibling tools.

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

create_draftA

Create a minimal draft email record without sending it. Use when the user wants a placeholder draft or partial draft state, such as saving a subject/body before the message is complete. Do not use for threaded replies or a send-ready draft reply; use save_draft or reply_email.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoRecipient addresses as [{email, name?}] objects (optional)
ccNoCC addresses (optional)
bccNoBCC addresses (optional)
fromNoSender email address (optional, defaults to account primary email)
mailboxIdNoMailbox ID to save the draft to (optional, defaults to Drafts folder)
subjectNoEmail subject (optional)
textBodyNoPlain text body (optional)
htmlBodyNoHTML body (optional)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=false, destructiveHint=false, and openWorldHint=true. The description adds context by emphasizing 'minimal draft' and not sending, which aligns with annotations. No contradictions.

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, front-loaded sentences. The first states the purpose, the second provides usage guidelines and exclusions. No wasted words.

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

Completeness4/5

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

Given 8 optional parameters, no output schema, and complex sibling tools, the description provides sufficient context: it creates a draft, does not send, and is not for replies. It could mention the return value (e.g., draft ID) but is otherwise complete for a minimal tool.

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

Parameters3/5

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

Schema description coverage is 100%, so the description does not need to add parameter-level detail. It does not provide any additional meaning beyond the schema, meeting the baseline expectation.

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 'create', the resource 'draft email record', and the qualifier 'minimal ... without sending it'. It distinguishes from sibling tools like save_draft and reply_email by explicitly naming them.

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

Usage Guidelines5/5

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

Explicitly states when to use ('when the user wants a placeholder draft or partial draft state') and when not to use ('Do not use for threaded replies or a send-ready draft reply'), with specific alternative tools named (save_draft, reply_email).

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

delete_emailA
DestructiveIdempotent

Delete one email by moving it to Trash. Use when the user explicitly wants a single message deleted or trashed. Do not use for mailbox cleanup across many messages; use bulk_delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email to delete

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate destructive and idempotent behavior. Description adds nuance: moving to Trash (not permanent deletion), which is valuable context for an agent. No contradictions.

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

Conciseness5/5

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

Three sentences with zero waste. First sentence immediately states purpose. Efficiently structured.

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 tool simplicity, complete annotations, single clear parameter, and no output schema needed, description fully covers all necessary context for correct usage.

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

Parameters3/5

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

Schema coverage is 100% with parameter description already present. Description adds no additional meaning beyond what schema provides, so baseline 3 is appropriate.

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

Purpose5/5

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

Specific verb 'delete' and resource 'one email' with explicit destination 'Trash'. Clearly distinguishes from sibling 'bulk_delete' by stating 'one email'.

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

Usage Guidelines5/5

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

Explicitly states when to use (user wants single message deleted) and when not to use (for bulk cleanup, use 'bulk_delete'). Provides alternative sibling tool.

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

download_attachmentA

Get an attachment download URL or save an attachment to disk when savePath is provided. Use when the user wants the file from a specific message attachment. Do not use when you still need to discover attachment IDs; use get_email_attachments first.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email
attachmentIdYesID of the attachment
savePathNoAbsolute file path to save the attachment to. Parent directories will be created automatically.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations provide readOnlyHint=false, destructiveHint=false, etc. The description adds value by disclosing that the tool can either return a URL or save to disk depending on savePath. This behavioral nuance is beyond what annotations convey. No contradictions found.

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 two sentences: one stating the core function and one providing usage guidance. It is front-loaded, every sentence adds value, and there is no redundant or extraneous 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?

The tool has no output schema, so the description could have described the return value (e.g., a download URL). However, the context of sibling tools and annotations provides sufficient background. The description is adequate for the tool's complexity.

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?

Input schema has 100% description coverage for all three parameters. The description adds conditional meaning: 'when savePath is provided' triggers save-to-disk behavior, otherwise returns URL. This clarifies the parameter's role beyond the schema's description.

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 function: 'Get an attachment download URL or save an attachment to disk when savePath is provided.' It specifies the verb (get/save) and resource (attachment), and distinguishes from siblings like get_email_attachments by noting its use case.

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?

The description explicitly tells when to use the tool ('when the user wants the file from a specific message attachment') and provides a clear negative case with an alternative: 'Do not use when you still need to discover attachment IDs; use get_email_attachments first.'

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

get_account_summaryA
Read-onlyIdempotent

Get an overall Fastmail account summary with aggregate mailbox statistics. Use when the user wants a high-level status view of the mailbox rather than raw email lists. Do not use for message content or search.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds 'aggregate mailbox statistics' and 'overall account summary', but does not disclose additional behavioral traits beyond what annotations provide. It does not contradict annotations.

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

Conciseness5/5

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

Three concise sentences, each carrying essential information: purpose, usage context, and exclusion. No redundant or irrelevant text, and the purpose is front-loaded.

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

Completeness4/5

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

Given zero parameters and no output schema, the description adequately covers what the tool does and when to use it. However, it could be more complete by detailing the specific statistics returned (e.g., total messages, storage), though this is optional given the tool's simplicity.

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?

There are zero parameters, so the baseline is 4. The description adds no parameter-specific information, which is acceptable given the absence of parameters.

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 it retrieves an overall account summary with aggregate mailbox statistics. It distinguishes from siblings by noting it is for high-level views rather than raw email lists, but does not explicitly differentiate from the similar sibling tool 'get_mailbox_stats'.

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

Usage Guidelines4/5

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

The description provides explicit when-to-use ('high-level status view') and when-not-to-use ('not for message content or search'), implicitly referencing alternatives like list_emails and search_emails. However, it does not name specific sibling tools.

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

get_emailA
Read-onlyIdempotent

Get one specific email by ID, including full content and metadata. Use after get_recent_emails, list_emails, search_emails, or advanced_search when you need to read the body, inspect headers, or prepare a reply. Do not use for browsing or discovery; use get_recent_emails or search tools first.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email to retrieve

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint. Description adds return of full content, metadata, and headers, which is useful beyond annotations.

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

Conciseness5/5

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

Three sentences, front-loaded with core purpose, then usage guidance. No redundant or vague language.

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 simple retrieval tool with one parameter and no output schema, the description fully covers purpose, usage, and constraints, aided by comprehensive annotations.

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

Parameters3/5

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

Schema coverage is 100% for the single parameter (emailId). Description does not add new meaning beyond what schema provides, meeting baseline.

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 'Get one specific email by ID' with a specific verb and resource, and distinguishes from sibling tools by noting it is not for browsing or discovery.

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

Usage Guidelines5/5

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

Explicitly states when to use (after list/search tools, when needing body/headers/reply) and when not to use (browsing/discovery), providing clear alternatives.

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

get_email_attachmentsA
Read-onlyIdempotent

List the attachments on a specific email. Use after get_email when you need attachment IDs before downloading one. Do not use to download content directly; use download_attachment.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true, destructiveHint=false. Description adds value by specifying typical usage flow (after get_email) and clarifying it does not download content. No contradictions.

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

Conciseness5/5

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

Two sentences, no fluff, front-loaded with purpose, then usage guidance. Highly concise and efficient.

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

Completeness4/5

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

For a simple list tool with good annotations and clear purpose, the description is mostly complete. Lacks specifics about what fields are returned per attachment, but the tool's behavior is clear enough for an agent to use correctly.

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

Parameters3/5

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

Schema coverage is 100% and description does not add additional meaning beyond the schema's parameter description. Baseline 3 is appropriate.

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

Purpose5/5

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

Clearly states it lists attachments on a specific email, with a specific verb and resource. Differentiates from sibling download_attachment by noting it provides IDs before download.

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

Usage Guidelines5/5

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

Explicitly says 'Use after get_email when you need attachment IDs before downloading one' and 'Do not use to download content directly; use download_attachment', providing clear when-to-use and when-not-to-use with reference to alternatives.

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

get_mailbox_statsA
Read-onlyIdempotent

Get statistics such as unread counts and total emails for a mailbox or across the account. Use when the user wants a summary of mailbox volume or unread counts rather than individual messages. Do not use for listing messages themselves.

ParametersJSON Schema
NameRequiredDescriptionDefault
mailboxIdNoID of the mailbox (optional, defaults to all mailboxes)

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description does not add additional behavioral context such as performance or required permissions. It is not contradictory.

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 two sentences, front-loading the purpose, with zero wasted words. It is highly concise.

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

Completeness4/5

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

For a simple tool with one optional parameter and no output schema, the description is adequate. It could mention the return format but is otherwise complete.

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

Parameters3/5

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

Schema coverage is 100% with a clear description for the single parameter. The tool description does not add additional meaning beyond what the schema already provides. Baseline score of 3 applies.

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 'Get' and resource 'statistics for a mailbox or across the account', and specifies the type of statistics ('unread counts and total emails'). It distinguishes from sibling list/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 Guidelines5/5

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

Explicitly states when to use ('when the user wants a summary of mailbox volume or unread counts rather than individual messages') and when not to use ('Do not use for listing messages themselves').

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

get_recent_emailsA
Read-onlyIdempotent

Get the newest email summaries from a Fastmail mailbox, defaulting to Inbox, in paginated form. Use when the user says "check email", "read my inbox", "show recent emails", or asks what just arrived. Returns items, total, has_more, and next_offset so the caller can keep paging only when needed. Use mailboxName to target another mailbox. Do not use when you need full message content for a known emailId (use get_email) or when you need filtered search results (use search_emails or advanced_search).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of recent emails to retrieve (default: 10, max: 50)
mailboxNameNoMailbox to search (default: inbox)inbox
offsetNoZero-based offset for pagination. Use next_offset from the previous response to fetch the next page.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, etc. Description adds details about return structure (items, total, has_more, next_offset) for pagination, which is valuable behavioral context beyond annotations.

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?

Concise and well-structured: first sentence states purpose, second gives usage triggers, third explains return format, fourth provides exclusion guidance. No unnecessary words, each sentence earns its place.

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 no output schema, description explains return fields for pagination. Covers when to use and not use, referencing siblings. Complete enough for the agent to select and invoke correctly.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all parameters' meanings and defaults. Description merely echoes 'defaulting to Inbox' and 'mailboxName to target another mailbox', adding no new semantic value beyond what the schema provides.

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

Purpose5/5

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

Description clearly states it retrieves newest email summaries from a mailbox, defaulting to Inbox, in paginated form. Distinguishes from siblings like get_email and search_emails by specifying scope and purpose.

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

Usage Guidelines5/5

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

Explicitly lists user utterances that trigger this tool ('check email', 'read my inbox', etc.) and provides clear exclusions with alternative tool names (get_email, search_emails, advanced_search). Excellent guidance.

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

get_threadA
Read-onlyIdempotent

Get all emails in one conversation thread. Use when the user wants the full conversation around a known thread or needs context before replying. Do not use when you only have one emailId and need the full message first; use get_email.

ParametersJSON Schema
NameRequiredDescriptionDefault
threadIdYesID of the thread/conversation

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds minimal extra behavioral info (e.g., 'all emails'), but does not contradict annotations.

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

Conciseness5/5

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

Three sentences that are front-loaded with purpose, followed by usage guidelines. No wasted words; every sentence adds value.

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

Completeness4/5

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

For a simple read-only tool with one parameter and comprehensive annotations, the description is mostly complete. It lacks explicit mention of return format, but annotations and clarity compensate.

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

Parameters3/5

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

Schema descriptions cover 100% of parameters. The tool description does not add additional meaning beyond what the schema already provides for the threadId parameter.

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

Purpose5/5

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

The description clearly states the action ('Get all emails') and the resource ('one conversation thread'). It distinguishes from sibling tools like get_email by specifying the scope ('all emails in a thread').

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

Usage Guidelines5/5

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

Explicitly states when to use ('when the user wants the full conversation...needs context before replying') and when not to use ('Do not use when you only have one emailId...use get_email'), providing a clear alternative.

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

list_emailsA
Read-onlyIdempotent

List email summaries from one Fastmail mailbox or across the account in paginated form. Use when you already know the mailboxId and want to browse messages there, such as "show messages in Archive" or "list emails in Projects". Returns an object with items, total, has_more, and next_offset so the caller can continue paging without fetching everything at once. Do not use for "check email" or "read my inbox" when no mailbox is specified; use get_recent_emails instead. Do not use when you already have an emailId; use get_email.

ParametersJSON Schema
NameRequiredDescriptionDefault
mailboxIdNoID of the mailbox to list emails from (optional, defaults to all)
limitNoMaximum number of emails to return (default: 20)
offsetNoZero-based offset for pagination. Use next_offset from the previous response to fetch the next page.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, destructiveHint, idempotentHint, openWorldHint. The description adds pagination behavior (items, total, has_more, next_offset) and clarifies scope (one mailbox or all). No contradictions.

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

Conciseness5/5

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

Three sentences, each serving a clear purpose: purpose+scope, usage guidance, return format. No extraneous words. Front-loaded with key information.

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 simplicity and lack of output schema, the description covers all essential aspects: what it does, when to use, alternatives, and return format for pagination. Complete for effective use.

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 coverage is 100%, so baseline is 3. The description adds value by explaining mailboxId defaults to all, limit default is 20, and offset usage with next_offset, which is not in schema descriptions.

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

Purpose5/5

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

The description clearly states the action ('List email summaries'), resource (from one mailbox or across the account), and scope (paginated). It distinguishes from siblings like get_recent_emails and get_email.

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

Usage Guidelines5/5

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

Explicitly states when to use ('when you already know the mailboxId and want to browse messages') and when not to use ('do not use for check email or read my inbox', with alternatives get_recent_emails and get_email).

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

list_identitiesA
Read-onlyIdempotent

List Fastmail sending identities that can be used in the from field. Use before send_email, save_draft, or create_draft when the user wants to send from an alias or confirm which sender addresses are allowed. Do not use for inbox or message retrieval.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already provide readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds minimal behavioral context beyond specifying the resource type (sending identities) but does not contradict annotations.

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

Conciseness5/5

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

Three concise sentences with no fluff. Main action front-loaded, usage guidance clear, and negative case provided.

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 0 parameters, no output schema, and high-quality annotations, the description fully covers the tool's purpose and usage context. No gaps.

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?

Input schema has 0 parameters, so baseline 4. Description adds value by clarifying that the identities are for the 'from' field, but no parameter details needed.

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?

Clearly states 'List Fastmail sending identities that can be used in the from field,' specifying the verb (list) and resource (sending identities), and distinguishes from siblings by providing context about its use in sending email.

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

Usage Guidelines5/5

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

Explicitly states when to use: 'before send_email, save_draft, or create_draft when the user wants to send from an alias or confirm which sender addresses are allowed,' and includes a negative usage: 'Do not use for inbox or message retrieval.'

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

list_mailboxesA
Read-onlyIdempotent

List the mailboxes, folders, and label IDs in the connected Fastmail account. Use when the user wants mailbox names, wants to choose a destination for moving or labeling email, or asks what folders exist. Do not use when the user wants recent messages or inbox contents; use get_recent_emails, list_emails, or search_emails instead.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already provide readOnlyHint, destructiveHint, idempotentHint, openWorldHint. The description adds context about returning mailboxes, folders, and label IDs, which is useful but not critical beyond the safety profile already declared.

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 concise sentences: the first states the purpose, the second provides usage guidelines. No wasted words, front-loaded with key information.

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 no parameters, no output schema, but rich annotations, the description fully covers the purpose and usage. It hints at return values (mailboxes, folders, label IDs), making it complete for a simple list operation.

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% description coverage. Baseline is 4 per guidelines as no compensation is needed. The description does not need to add parameter information.

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 states 'List the mailboxes, folders, and label IDs in the connected Fastmail account,' which is a specific verb and resource. It also distinguishes from siblings by noting not to use for recent messages or inbox contents, and suggests alternatives.

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?

The description explicitly provides when to use: 'when the user wants mailbox names, wants to choose a destination for moving or labeling email, or asks what folders exist.' It also gives clear when-not and alternatives: 'Do not use when the user wants recent messages or inbox contents; use get_recent_emails, list_emails, or search_emails instead.'

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

mark_email_readA
Idempotent

Mark one email as read or unread. Use after selecting a specific email when the user wants to clear unread state or mark something unread for later. Do not use for bulk mailbox triage; use bulk_mark_read.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email to mark
readNotrue to mark as read, false to mark as unread

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate this is mutable (readOnlyHint false) and idempotent (idempotentHint true). The description adds no additional behavioral quirks beyond the core operation. It is consistent with annotations, but does not expand on side effects or permissions.

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

Conciseness5/5

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

Three sentences, each earning its place: purpose, when to use, when not to use. Front-loaded with core action, no fluff.

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 simple tool with 2 parameters and no output schema, the description covers the essential aspects: what it does, when to use, and alternatives. No gaps remain.

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

Parameters3/5

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

Input schema has 100% coverage with descriptions for both parameters (emailId, read). The description does not add parameter-level details beyond what is in the schema. According to guidelines, baseline is 3 when schema coverage is high.

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

Purpose5/5

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

The description clearly states the action (mark) and resource (one email's read state). It explicitly distinguishes itself from sibling tool 'bulk_mark_read' by emphasizing 'one email' and contrasting with bulk operations.

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?

The description provides explicit guidance on when to use (after selecting a specific email, to clear unread or mark unread for later) and when not to use (bulk mailbox triage), with a direct alternative (bulk_mark_read). This is exemplary.

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

move_emailA
Idempotent

Move one email to a different Fastmail mailbox. Use when the user wants a specific message filed into another mailbox. Do not use to add extra labels while keeping the current mailbox membership; use add_labels.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email to move
targetMailboxIdYesID of the target mailbox

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already indicate mutation (readOnlyHint=false) and idempotency (idempotentHint=true). Description adds no further behavioral details beyond the obvious move action.

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, purpose first, followed by usage note. No wasted words.

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

Completeness4/5

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

For a simple move operation with two required params, the description sufficiently covers purpose and usage. No output schema, but that's expected. Could mention it only moves one email to distinguish from bulk_move, but it's implied by 'one email'.

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

Parameters3/5

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

Schema covers both parameters with full descriptions. Description adds no additional meaning beyond what the schema provides.

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

Purpose5/5

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

Description clearly states 'Move one email to a different Fastmail mailbox' with specific verb and resource, and distinguishes from add_labels by excluding label-only moves.

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

Usage Guidelines5/5

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

Explicitly states when to use ('user wants a specific message filed into another mailbox') and when not to use ('not to add labels'), with alternative tool name provided.

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

remove_labelsA
Idempotent

Remove one or more mailbox labels from an email. Use when the user wants to untag a specific message while leaving any remaining mailbox memberships alone. Do not use to move an email to Trash; use delete_email.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email to remove labels from
mailboxIdsYesArray of mailbox IDs to remove as labels

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate the tool is not read-only (readOnlyHint false), not destructive (destructiveHint false), idempotent, and open-world. The description adds context about preserving other labels ('leaving any remaining mailbox memberships alone'), which is a useful behavioral trait beyond what annotations provide.

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 highly concise with three sentences covering purpose, usage, and exclusion. Every sentence adds value, and the key information is front-loaded.

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 two parameters with full schema coverage, no output schema, and the complexity of a label removal operation, the description is complete enough for an agent to correctly select and invoke the tool. It covers what the tool does, when to use it, and when not to.

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

Parameters3/5

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

The input schema has full description coverage (100%) for both parameters, so the schema already documents the parameters adequately. The description does not add significant new semantics beyond restating the schema purpose.

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

Purpose5/5

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

The description clearly states the action ('Remove one or more mailbox labels from an email') with a specific verb and resource. It distinguishes from sibling tools like add_labels and delete_email by specifying the scope of the operation.

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?

The description provides explicit guidance: 'Use when the user wants to untag a specific message while leaving any remaining mailbox memberships alone' and a clear exclusion: 'Do not use to move an email to Trash; use delete_email.' This fully informs the agent about when and when not to use the tool.

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

reply_emailA

Reply to an existing email with Fastmail threading headers preserved automatically. Use when the user says "reply to this email", "answer the latest message from Alice", or wants a proper threaded response. Do not use for a brand-new outbound message; use send_email. Do not use when you only want to save a reply draft; use save_draft.

ParametersJSON Schema
NameRequiredDescriptionDefault
originalEmailIdYesID of the email to reply to
toNoRecipient addresses as [{email, name?}] objects (optional, defaults to original sender)
ccNoCC addresses (optional)
bccNoBCC addresses (optional)
fromNoSender email address (optional, defaults to account primary email)
textBodyNoPlain text body (optional)
htmlBodyNoHTML body (optional)

TDQS

A4.4/5.0
Behavior4/5

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

The description discloses that threading headers are preserved automatically, which adds behavioral context beyond the annotations. Annotations already indicate readOnlyHint=false and destructiveHint=false, so the description adds meaningful detail without contradiction.

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 four sentences, front-loaded with the main action, and contains no superfluous text. Each sentence adds value: purpose, use cases, and exclusions.

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 and lack of output schema, the description adequately covers purpose, usage, and exclusions. It does not explain return values or side effects, but these are generally inferred for an email reply action.

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

Parameters3/5

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

The input schema has 100% description coverage for all 7 parameters, so the description does not need to add parameter details. It does not provide extra commentary on parameters, which matches the baseline expectation.

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: 'Reply to an existing email with Fastmail threading headers preserved automatically.' It uses specific verbs and resources, and distinguishes itself from sibling tools like send_email and save_draft.

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

Usage Guidelines5/5

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

Explicitly provides when to use (e.g., 'when the user says "reply to this email"') and when not to use, with direct references to alternative tools (send_email, save_draft). This is excellent guidance.

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

save_draftA

Save an unsent draft email in Fastmail, including reply-thread headers when provided. Use when the user says "save a draft", "draft a reply", or wants a message prepared without sending it yet. Do not use for immediate delivery; use send_email. Do not use for a minimal placeholder draft with only partial fields; use create_draft.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRecipient addresses as [{email, name?}] objects
ccNoCC addresses (optional)
bccNoBCC addresses (optional)
fromNoSender email address (optional, defaults to account primary email)
subjectYesEmail subject
textBodyNoPlain text body (optional)
htmlBodyNoHTML body (optional)
inReplyToNoMessage-IDs to reply to (optional, for threading)
referencesNoMessage-IDs for References header (optional, for threading)

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false. The description adds context about saving with thread headers but does not mention any further behavioral traits like overwriting behavior or permission requirements. No contradictions with annotations.

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: first states purpose, second provides usage guidelines. No redundant information, front-loaded with the key action and platform.

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 tool with 9 well-documented parameters and no output schema, the description sufficiently covers what the tool does and when to use it. No missing critical information.

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 covers all 9 parameters with descriptions (100% coverage). The description adds value by explaining that reply-thread headers (inReplyTo, references) are relevant for threading, which is not fully captured in the schema descriptions alone.

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 'Save', the resource 'unsent draft email', and the specific platform 'Fastmail'. It also mentions handling reply-thread headers, which distinguishes it from related tools.

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

Usage Guidelines5/5

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

Explicitly states when to use ('save a draft', 'draft a reply') and when not to (use send_email for delivery, use create_draft for minimal placeholders). Provides clear alternatives among sibling tools.

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

search_emailsA
Read-onlyIdempotent

Search Fastmail email by free-text query across subject and message content in paginated form. Use when the user wants to find email about a topic or phrase, such as "search for invoices" or "find messages about taxes". Returns items, total, has_more, and next_offset so the agent can stop after the first useful page instead of pulling a large result set. Do not use for "check email" or "show recent emails"; use get_recent_emails. Do not use when you need structured filters like sender, unread, attachments, or date range; use advanced_search.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query string
limitNoMaximum number of results (default: 20)
offsetNoZero-based offset for pagination. Use next_offset from the previous response to fetch the next page.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate read-only, non-destructive, idempotent, open-world. Description adds pagination details and return fields (items, total, has_more, next_offset), plus advice on early stopping. Provides useful context beyond annotations.

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 sentences, front-loaded with purpose, followed by usage guidelines and behavioral notes. No redundant information.

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 3 parameters, good annotations, and no output schema, the description adequately covers search behavior, pagination, sibling differentiation, and best practices for early stopping. Complete for this tool.

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 covers all 3 parameters with descriptions. Description adds context: free-text query, paginated form, and explains offset usage via next_offset. Provides modest added value over 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 specific action: search Fastmail email by free-text query across subject and message content in paginated form. Clearly distinguishes from siblings later.

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

Usage Guidelines5/5

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

Explicitly says when to use (user wants to find email about a topic) and when not to use (use get_recent_emails for recent emails, use advanced_search for structured filters). Names alternatives directly.

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

send_emailA

Send a new outbound email from the connected Fastmail account. Use when the user says things like "send email to Alice" or wants to compose a fresh message right now. Do not use for threaded replies; use reply_email. Do not use when the user wants to save a draft instead of sending; use save_draft or create_draft.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRecipient addresses as [{email, name?}] objects
ccNoCC addresses (optional)
bccNoBCC addresses (optional)
fromNoSender email address (optional, defaults to account primary email)
mailboxIdNoMailbox ID to save the email to (optional, defaults to Drafts folder)
subjectYesEmail subject
textBodyNoPlain text body (optional)
htmlBodyNoHTML body (optional)
inReplyToNoMessage-ID(s) of the email being replied to (optional, for threading)
referencesNoFull reference chain of Message-IDs (optional, for threading)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate a write operation (readOnlyHint=false). Description adds context that it sends from the 'connected Fastmail account' and is a new outbound email. No contradiction, but lacks detail on immediate sending or permissions.

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

Conciseness5/5

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

Three sentences: purpose, usage, exclusions. Front-loaded with key verb and resource, no unnecessary words.

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

Completeness4/5

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

Given 10 parameters, no output schema, and annotations present, the description covers purpose and usage thoroughly. It lacks details on return value or side effects, but this is acceptable for a send tool.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description does not add parameter-level information, but the schema already documents each parameter well.

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

Purpose5/5

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

Description clearly states 'Send a new outbound email' with a specific verb and resource (Fastmail account). It explicitly differentiates from sibling tools like reply_email and save_draft, addressing purpose and distinction.

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?

Provides explicit when-to-use examples ('send email to Alice', compose fresh message) and when-not-to-use with named alternatives (reply_email, save_draft, create_draft). This guides the agent effectively.

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

test_bulk_operationsA

Test bulk email actions against recent inbox messages, optionally as a dry run. Use only for safe operational verification of bulk email tooling. Do not use for normal user-facing mailbox tasks; use the actual bulk tools instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoIf true, only shows what would be done without making changes (default: true)
limitNoNumber of emails to test with (default: 3, max: 10)

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate it is not read-only (readOnlyHint: false) but also not destructive (destructiveHint: false). The description adds clarity by stating it is a test tool and can be run as a dry run, explaining what can be expected. No contradiction with annotations.

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

Conciseness5/5

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

Three sentences with no wasted words. First sentence states purpose, second and third provide usage guidelines. Every sentence earns its place.

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 two parameters are well-described in the schema, annotations are present, and the tool is a test tool with clear scope, the description provides complete context for an agent to decide when and how to use it.

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

Parameters3/5

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

Schema coverage is 100% with descriptions for both parameters (dryRun, limit). The description mentions 'optionally as a dry run' which aligns with dryRun, but does not add significant new semantics beyond 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?

The description clearly states 'Test bulk email actions against recent inbox messages', specifying the verb and resource. It distinguishes itself from sibling tools like bulk_add_labels by emphasizing it is for testing, not production use.

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?

It explicitly says 'Use only for safe operational verification... Do not use for normal user-facing mailbox tasks; use the actual bulk tools instead.' This provides clear when-to-use, when-not-to-use, and names alternatives.

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

TDQS

A4.4/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose. Descriptions explicitly clarify when to use which tool, differentiating similar operations like single vs. bulk actions, search vs. retrieval, and draft creation vs. saving vs. sending.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in lower_snake_case (e.g., add_labels, bulk_delete, get_email). The use of prefixes like 'bulk_' and 'get_' is uniform, making the pattern predictable.

Tool Count4/5

With 28 tools, the server covers a broad range of email operations comprehensively. While slightly on the higher side, each tool serves a specific function, and the count is justified by the domain's complexity without being excessive.

Completeness5/5

The tool set provides full lifecycle coverage for email management: send, receive, search, draft, reply, label, move, delete, thread view, attachments, mailbox management, and account info. No obvious gaps for standard email tasks.

Maintenance

ActivityInactive
ResponsivenessNo issues

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
    Not graded
    quality
    D
    maintenance
    Enables AI-powered email management through FastMail's JMAP API with features like smart email analysis, automated organization, inbox zero automation, and intelligent reply generation. Supports advanced email operations, contact management, calendar integration, and hierarchical email organization systems.
    54
    3
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI assistants to interact with Fastmail email, contacts, and calendars through JMAP API, supporting operations like sending emails, managing attachments, searching conversations, and organizing events.
    52
    76
    126
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to securely access and search Fastmail emails via the JMAP API. Supports searching emails, retrieving full email content, and listing mailboxes with read-only access using Fastmail API tokens.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI models to interact with Fastmail accounts via the JMAP API through the Model Context Protocol. It supports managing emails, accessing usage analytics, and performing account operations using secure token-based authentication.
    30
    9
    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/as-j/fastmail-mcp'

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