Fastmail MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Fastmail MCP Serversummarize my unread emails from the last 24 hours"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Clone or download this repository
Install dependencies:
npm installBuild the project:
npm run build
Configuration
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
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 startFor development with auto-reload:
npm run devRemote 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 startBehavior in HTTP mode:
The server is single-tenant: every MCP session uses the same Fastmail token from the environment.
Stateless sessionless
POSTrequests are the default hosted path; most remote MCP clients do not need to sendmcp-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-mcpWindows PowerShell:
$env:FASTMAIL_API_TOKEN="your_token"
$env:FASTMAIL_BASE_URL="https://api.fastmail.com"
npx --yes github:MadLlama25/fastmail-mcp fastmail-mcpPin to a tagged release:
FASTMAIL_API_TOKEN="your_token" \
npx --yes github:MadLlama25/fastmail-mcp@v1.7.1 fastmail-mcpInstall as a Claude Desktop Extension (DXT)
You can install this server as a Desktop Extension for Claude Desktop using the packaged .dxt file.
Build and pack:
npm run build npx @anthropic-ai/dxt packThis produces
fastmail-mcp.dxtin the project root.Install into Claude Desktop:
Open the
.dxtfile, or drag it into Claude DesktopWhen prompted:
Fastmail API Token: paste your token (stored encrypted by Claude)
Fastmail Base URL: leave blank to use
https://api.fastmail.com(default)
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, andnext_offsetso 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
inReplyToandreferencesheaders)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 queriesBuilding
npm run buildDevelopment Mode
npm run devLicense
MIT
Contributing
Contributions are welcome! Please ensure that:
Code follows the existing style
All functions are properly typed
Error handling is implemented
Documentation is updated for new features
Troubleshooting
Common Issues
Authentication Errors: Ensure your API token is valid and has the necessary permissions
Missing Dependencies: Run
npm installto ensure all dependencies are installedBuild Errors: Check that TypeScript compilation completes without errors using
npm run buildUnexpectedly Large Search Results: Use
limitandoffset, then follownext_offsetonly whenhas_moreis trueHTTP Session Errors: Prefer sessionless
POSTrequests first;mcp-session-idis only needed for explicit stateful-session flowsToo Many Concurrent Clients: Increase
MCP_MAX_SESSIONSor 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 toolsadd_labelsAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ID of the email to add labels to | |
| mailboxIds | Yes | Array of mailbox IDs to add as labels |
TDQS
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.
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.
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.
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.
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.
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.
advanced_searchARead-onlyIdempotent
Search Fastmail email with structured filters such as sender, recipient, subject, unread state, attachments, mailbox, and date range in paginated form. Use when the user asks for something like "find the latest message from Alice", "show unread invoices with attachments", or "find messages from last week". Returns items, total, has_more, and next_offset so the agent can refine or continue the search without consuming excess context. Do not use for simple inbox checks; use get_recent_emails. Do not use when you already have an emailId; use get_email.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Text to search for in subject/body | |
| from | No | Filter by sender email | |
| to | No | Filter by recipient email | |
| subject | No | Filter by subject | |
| hasAttachment | No | Filter emails with attachments | |
| isUnread | No | Filter unread emails | |
| mailboxId | No | Search within specific mailbox | |
| after | No | Emails after this date (ISO 8601) | |
| before | No | Emails before this date (ISO 8601) | |
| limit | No | Maximum results (default: 20) | |
| offset | No | Zero-based offset for pagination. Use next_offset from the previous response to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds value by explaining the paginated response structure (items, total, has_more, next_offset) and the ability to refine/continue search. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then usage guidelines, then return value info. No redundancy, every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 parameters with full schema descriptions and no output schema, the description adequately covers the return structure and pagination. Could optionally mention default limit (20) but schema covers it. Complete enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 groups filters under 'structured filters' and lists key ones implicitly, providing context beyond individual descriptions. Adds moderate value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search Fastmail email with structured filters' and lists specific filter types. It distinguishes from siblings by specifying when to use alternative tools (get_recent_emails, get_email).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when-to-use examples ('find the latest message from Alice') and when-not-to-use ('Do not use for simple inbox checks; use get_recent_emails. Do not use when you already have an emailId; use get_email').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_add_labelsAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailIds | Yes | Array of email IDs to add labels to | |
| mailboxIds | Yes | Array of mailbox IDs to add as labels |
TDQS
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.
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.
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.
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.
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.
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_deleteADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailIds | Yes | Array of email IDs to delete |
TDQS
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.
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.
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.
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.
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.
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_readAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailIds | Yes | Array of email IDs to mark | |
| read | No | true to mark as read, false as unread |
TDQS
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.
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.
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.
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.
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.
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_moveAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailIds | Yes | Array of email IDs to move | |
| targetMailboxId | Yes | ID of target mailbox |
TDQS
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.
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.
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.
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.
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.
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_labelsAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailIds | Yes | Array of email IDs to remove labels from | |
| mailboxIds | Yes | Array of mailbox IDs to remove as labels |
TDQS
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.
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.
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.
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.
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.
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_availabilityARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Recipient addresses as [{email, name?}] objects (optional) | |
| cc | No | CC addresses (optional) | |
| bcc | No | BCC addresses (optional) | |
| from | No | Sender email address (optional, defaults to account primary email) | |
| mailboxId | No | Mailbox ID to save the draft to (optional, defaults to Drafts folder) | |
| subject | No | Email subject (optional) | |
| textBody | No | Plain text body (optional) | |
| htmlBody | No | HTML body (optional) |
TDQS
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.
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.
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.
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.
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.
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_emailADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ID of the email to delete |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ID of the email | |
| attachmentId | Yes | ID of the attachment | |
| savePath | No | Absolute file path to save the attachment to. Parent directories will be created automatically. |
TDQS
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.
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.
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.
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.
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.
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_summaryARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_emailARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ID of the email to retrieve |
TDQS
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.
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.
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.
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.
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.
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_attachmentsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ID of the email |
TDQS
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.
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.
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.
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.
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.
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_statsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| mailboxId | No | ID of the mailbox (optional, defaults to all mailboxes) |
TDQS
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.
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.
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.
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.
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.
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_emailsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of recent emails to retrieve (default: 10, max: 50) | |
| mailboxName | No | Mailbox to search (default: inbox) | inbox |
| offset | No | Zero-based offset for pagination. Use next_offset from the previous response to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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_threadARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes | ID of the thread/conversation |
TDQS
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.
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.
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.
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.
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.
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_emailsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| mailboxId | No | ID of the mailbox to list emails from (optional, defaults to all) | |
| limit | No | Maximum number of emails to return (default: 20) | |
| offset | No | Zero-based offset for pagination. Use next_offset from the previous response to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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_identitiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_mailboxesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_readAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ID of the email to mark | |
| read | No | true to mark as read, false to mark as unread |
TDQS
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.
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.
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.
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.
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.
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_emailAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ID of the email to move | |
| targetMailboxId | Yes | ID of the target mailbox |
TDQS
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.
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.
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.
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.
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.
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_labelsAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ID of the email to remove labels from | |
| mailboxIds | Yes | Array of mailbox IDs to remove as labels |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| originalEmailId | Yes | ID of the email to reply to | |
| to | No | Recipient addresses as [{email, name?}] objects (optional, defaults to original sender) | |
| cc | No | CC addresses (optional) | |
| bcc | No | BCC addresses (optional) | |
| from | No | Sender email address (optional, defaults to account primary email) | |
| textBody | No | Plain text body (optional) | |
| htmlBody | No | HTML body (optional) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient addresses as [{email, name?}] objects | |
| cc | No | CC addresses (optional) | |
| bcc | No | BCC addresses (optional) | |
| from | No | Sender email address (optional, defaults to account primary email) | |
| subject | Yes | Email subject | |
| textBody | No | Plain text body (optional) | |
| htmlBody | No | HTML body (optional) | |
| inReplyTo | No | Message-IDs to reply to (optional, for threading) | |
| references | No | Message-IDs for References header (optional, for threading) |
TDQS
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.
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.
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.
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.
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.
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_emailsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query string | |
| limit | No | Maximum number of results (default: 20) | |
| offset | No | Zero-based offset for pagination. Use next_offset from the previous response to fetch the next page. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient addresses as [{email, name?}] objects | |
| cc | No | CC addresses (optional) | |
| bcc | No | BCC addresses (optional) | |
| from | No | Sender email address (optional, defaults to account primary email) | |
| mailboxId | No | Mailbox ID to save the email to (optional, defaults to Drafts folder) | |
| subject | Yes | Email subject | |
| textBody | No | Plain text body (optional) | |
| htmlBody | No | HTML body (optional) | |
| inReplyTo | No | Message-ID(s) of the email being replied to (optional, for threading) | |
| references | No | Full reference chain of Message-IDs (optional, for threading) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, only shows what would be done without making changes (default: true) | |
| limit | No | Number of emails to test with (default: 3, max: 10) |
TDQS
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.
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.
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.
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.
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.
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
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.
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.
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.
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
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
Connect any mailbox to Claude, ChatGPT & AI: read, send, reply, schedule & search emails.
AI email inbox and sending tools with attachments, search, live events, and webhooks.
Email infrastructure for AI agents β send, receive, search, and reply to email over MCP.
Manage Gmail end-to-end: search, read, send, draft, label, and organize threads. Automate workflowβ¦
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables 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.543MIT
- AlicenseBqualityAmaintenanceEnables 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.5276126MIT
- AlicenseNot gradedqualityDmaintenanceEnables 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
- AlicenseNot gradedqualityDmaintenanceEnables 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.309MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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