Fastmail MCP Server
Fastmail MCP Server
A Model Context Protocol (MCP) server that provides access to the Fastmail API, enabling AI assistants to interact with email, contacts, and calendar data.
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
Contacts Operations
List all contacts with full contact information
Get specific contacts by ID
Search contacts by name or email
Calendar Operations
List all calendars and calendar events
Get specific calendar events by ID
Create new calendar events with participants and details
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 20+
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) # Only api.fastmail.com and www.fastmailusercontent.com are accepted by default. # For self-hosted JMAP servers, also set FASTMAIL_ALLOW_UNSAFE_BASE_URL=true. export FASTMAIL_BASE_URL="https://api.fastmail.com" # Optional: customize attachment download directory (defaults to ~/Downloads/fastmail-mcp/) export FASTMAIL_DOWNLOAD_DIR="/path/to/your/downloads"
Running the Server
Start the MCP server:
npm startFor development with auto-reload:
npm run devRun 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.9.4 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 (38 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
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),ascending(optional, oldest first)
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),replyTo(optional array)
reply_email: Reply to an existing email with proper threading headers (automatically builds In-Reply-To and References). Set
send=falseto save as draft instead of sending.Parameters:
originalEmailId(required),to(optional array, defaults to original sender),cc(optional array),bcc(optional array),from(optional),textBody(optional),htmlBody(optional),send(optional boolean, default: true),replyTo(optional array)
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),replyTo(optional array)
search_emails: Search emails by content
Parameters:
query(required),limit(default: 20),ascending(optional, oldest first)
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'),ascending(optional, oldest first)
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: 50),ascending(optional, oldest first)
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)
Contact Tools
list_contacts: List all contacts
Parameters:
limit(default: 50)
get_contact: Get a specific contact by ID
Parameters:
contactId(required)
search_contacts: Search contacts by name or email
Parameters:
query(required),limit(default: 20)
Calendar Tools
list_calendars: List all calendars
list_calendar_events: List calendar events
Parameters:
calendarId(optional),limit(default: 50)
get_calendar_event: Get a specific calendar event by ID
Parameters:
eventId(required)
create_calendar_event: Create a new calendar event
Parameters:
calendarId(required),title(required),description(optional),start(required, ISO 8601),end(required, ISO 8601),location(optional),participants(optional 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.
CalDAV Calendar Support
Fastmail does not currently expose calendar access via JMAP API tokens — the urn:ietf:params:jmap:calendars scope is not available because the JMAP Calendars specification is still an IETF Internet-Draft (draft-ietf-jmap-calendars). Fastmail has stated they will add JMAP calendar support once the spec becomes an RFC, but there is no public timeline.
However, Fastmail fully supports CalDAV for calendar access via caldav.fastmail.com. This server automatically falls back to CalDAV when JMAP calendar access is unavailable.
Setup
Create an app-specific password on Fastmail:
Go to Settings → Privacy & Security → Manage app passwords
Create a new app password (you can name it "CalDAV MCP" or similar)
Set the following environment variables:
export FASTMAIL_CALDAV_USERNAME="your-email@fastmail.com" export FASTMAIL_CALDAV_PASSWORD="your-app-specific-password"
When these variables are set, the calendar tools (list_calendars, list_calendar_events, get_calendar_event, create_calendar_event) will automatically fall back to CalDAV if JMAP calendars are not available. When these variables are not set, the server behaves exactly as before (JMAP only).
Development
Project Structure
src/
├── index.ts # Main MCP server implementation
├── auth.ts # Authentication handling
├── jmap-client.ts # JMAP client wrapper
├── contacts-calendar.ts # Contacts and calendar extensions
└── caldav-client.ts # CalDAV calendar client (fallback)Building
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 buildCalendar/Contacts "Forbidden" Errors: Use
check_function_availabilityto see setup guidance
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.
Calendar/Contacts Not Working?
If calendar and contacts functions return "Forbidden" errors, this is likely due to:
Account Plan: Calendar/contacts API may require business/professional Fastmail plans
API Token Scope: Your API token may need calendar/contacts permissions enabled
Feature Enablement: These features may need explicit activation in your account
Solution: Run check_function_availability for step-by-step setup guidance.
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.
Available Tools
52 toolsadd_labelsA
Add labels (mailboxes) to an email without removing existing ones
| 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?
No annotations are provided, so the description must carry the full burden. It discloses an important behavioral trait (incremental labeling) but does not mention error conditions, return values, 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?
The description is a single efficient sentence that conveys the essential purpose and key behavior with 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 no output schema, no annotations, and two parameters, the description covers the main function but lacks details on error cases, return values, or prerequisites, leaving gaps for a fully informed agent.
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, so description adds minimal value. The 'without removing existing ones' comment is not parameter-specific, resulting in baseline score.
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 that the tool adds labels to an email without removing existing ones, distinguishing it from related tools like 'remove_labels' 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?
The description mentions 'without removing existing ones' to indicate additive use, but lacks explicit guidance on when to use this tool versus alternatives like 'bulk_add_labels' or 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.
advanced_searchA
Advanced email search with multiple criteria. Mailbox scoping supports a single mailbox (mailboxId), an intersection of multiple mailboxes (requiredMailboxIds — must be a member of ALL listed mailboxes), and exclusion (excludeMailboxIds — member of NONE of the listed mailboxes), alongside the standard sender / recipient / subject / free-text / date / attachment / unread / pinned filters. When the server reports a total match count, results are wrapped in a {"total", "items"} JSON envelope; otherwise a bare JSON array is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Filter by recipient email | |
| from | No | Filter by sender email | |
| after | No | Emails after this date (ISO 8601) | |
| limit | No | Maximum results (default: 50) | |
| query | No | Text to search for in subject/body | |
| before | No | Emails before this date (ISO 8601) | |
| subject | No | Filter by subject | |
| isPinned | No | Filter pinned emails | |
| isUnread | No | Filter unread emails | |
| ascending | No | Sort oldest first instead of newest first (default: false) | |
| mailboxId | No | Search within a single mailbox. For an intersection across multiple mailboxes (e.g. Inbox AND a label folder), use requiredMailboxIds instead. | |
| hasAttachment | No | Filter emails with attachments | |
| excludeMailboxIds | No | Exclude emails that are members of ANY of these mailbox IDs (maps to JMAP inMailboxOtherThan). Useful for queries like "in a parent label but not its archive sub-folder". Combines cleanly with mailboxId / requiredMailboxIds. | |
| requiredMailboxIds | No | Require membership in ALL of these mailbox IDs (intersection / AND semantic). Use this for queries like "in Inbox AND a label folder" — pass both mailbox IDs in the array. If mailboxId is also passed, it is folded into the intersection (de-duplicated). JMAP cannot express multi-mailbox membership in a single FilterCondition, so this builds a FilterOperator AND over multiple inMailbox conditions on the server. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so excellently. It discloses the variable response envelope ('total'/'items' vs bare array), the JMAP technical limitation that forces a FilterOperator AND, and the exact membership semantics for require/exclude mailbox IDs. This is high-value behavioral context beyond the schema.
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 relatively long but every sentence delivers unique information: scoping semantics, the list of filters, the JSON envelope behavior, and a JMAP rationale. It is front-loaded with the core purpose and then details. No fluff, though it could be slightly tightened.
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 14 optional parameters, no output schema, and no annotations, the description covers all significant aspects: parameter semantics, response format, edge cases like deduplication of mailboxId, and the reasoning behind the implementation. This is a well-rounded spec that allows an agent to invoke the tool correctly and predict results.
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?
Even though schema coverage is 100%, the description adds critical meaning to the mailbox parameters: it clarifies that requiredMailboxIds means membership in ALL (intersection), excludeMailboxIds means NONE, and that mailboxId is folded into the intersection. It also connects hasAttachment/excludeMailboxIds to concrete query patterns. This goes well beyond the 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 identifies the tool as 'Advanced email search with multiple criteria' and enumerates the specific filter dimensions (sender, recipient, subject, free-text, date, attachment, unread, pinned) plus mailbox scoping. This distinguishes it from simpler search siblings like search_emails and advanced_search_metadata.
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 concrete usage context, such as 'Use this for queries like “in a parent label but not its archive sub-folder”' and explains when requiredMailboxIds is appropriate. It does not explicitly contrast with search_emails or mention when NOT to use it, but the advanced semantics make the intended use case clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
advanced_search_metadataA
Same filter capabilities as advanced_search (single-mailbox scoping via mailboxId, multi-mailbox intersection via requiredMailboxIds, exclusion via excludeMailboxIds, plus sender / recipient / subject / free text / date / attachment / unread / pinned) but returns ONLY metadata on each match — id, threadId, subject, from, to, cc, replyTo, receivedAt, hasAttachment, keywords. Does NOT return preview or any body-derived content. Use in privacy-sensitive flows where the routing decision is made from headers alone — for example, when classifying customer mail by sender / recipient / subject / thread state without ingesting body content. The free-text query still searches body content on the server side; only the result envelope comes back without body excerpts. When the server reports a total match count, results are wrapped in a {"total", "items"} JSON envelope; otherwise a bare JSON array is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Filter by recipient email | |
| from | No | Filter by sender email | |
| after | No | Emails after this date (ISO 8601) | |
| limit | No | Maximum results (default: 50) | |
| query | No | Text to search for in subject/body | |
| before | No | Emails before this date (ISO 8601) | |
| subject | No | Filter by subject | |
| isPinned | No | Filter pinned emails | |
| isUnread | No | Filter unread emails | |
| ascending | No | Sort oldest first instead of newest first (default: false) | |
| mailboxId | No | Search within a single mailbox. For an intersection across multiple mailboxes (e.g. Inbox AND a label folder), use requiredMailboxIds instead. | |
| hasAttachment | No | Filter emails with attachments | |
| excludeMailboxIds | No | Exclude emails that are members of ANY of these mailbox IDs (maps to JMAP inMailboxOtherThan). Useful for queries like "in a parent label but not its archive sub-folder". Combines cleanly with mailboxId / requiredMailboxIds. | |
| requiredMailboxIds | No | Require membership in ALL of these mailbox IDs (intersection / AND semantic). Use this for queries like "in Inbox AND a label folder" — pass both mailbox IDs in the array. If mailboxId is also passed, it is folded into the intersection (de-duplicated). JMAP cannot express multi-mailbox membership in a single FilterCondition, so this builds a FilterOperator AND over multiple inMailbox conditions on the server. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the metadata-only return, absence of preview/body content, server-side body search, and conditional envelope format. It does not mention permission requirements or rate limits, but for a read-only search tool, key traits are well covered.
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 moderately long but each sentence adds distinct value: capability reference, return fields, privacy use case, body-search caveat, and response envelope. It is front-loaded and structured logically, though slightly dense.
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 complexity (14 parameters, no output schema), the description covers the core purpose, differentiation, valid use case, and response format. It does not explain pagination or limit behavior, but those are documented in the schema, so completeness is adequate.
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 baseline is 3. The description adds conceptual grouping of mailbox filter parameters, but this largely mirrors schema details. It adds marginal value beyond the schema, which is sufficient to hold the 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 explicitly names the tool as a variant of advanced_search with identical filters but metadata-only returns. It lists exact returned fields and clearly distinguishes it from the body-returning sibling, making the purpose unambiguous.
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 in privacy-sensitive flows where the routing decision is made from headers alone' and contrasts with advanced_search. It also clarifies that free-text still searches body server-side, setting correct expectations for when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_emailA
Archive an email — move it to the target mailbox AND mark it as read in a single atomic JMAP operation. Equivalent to calling move_email followed by mark_email_read, but in one MCP call and one Email/set patch (the move and the read flag land together or not at all). For trashing an email, use delete_email instead — that follows a different convention and does not auto-mark-read.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ID of the email to archive | |
| targetMailboxId | Yes | ID of the destination mailbox |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description discloses atomicity (single JMAP operation, all-or-nothing) and automatic marking as read. Lacks mention of permissions or behavior if email already read, but sufficient for this tool.
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 with front-loaded main action, followed by atomic detail and alternative guidance. No wasted words, highly 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?
Completes the needed context for a mutation tool with no output schema: explains what it does, atomicity, and alternative. Could mention return value but overall adequate.
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 brief parameter descriptions. The description does not add new meaning beyond the schema, so baseline 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 tool archives an email by moving it to a target mailbox and marking it as read atomically. It distinguishes from sibling delete_email and implies it combines move_email and mark_email_read.
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 (archive) and when not to (use delete_email for trashing), providing specific alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_add_labelsA
Add labels to multiple emails simultaneously
| 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?
No annotations provided, so description carries full burden. Only states the action; does not disclose whether labels are added incrementally or replace existing ones, permissions required, atomicity, or rate limits. Minimal behavioral context.
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?
Single sentence, no unnecessary words. Information is front-loaded. Every word 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?
For a simple tool with 2 parameters and no output schema, the description is minimally adequate. However, it lacks any indication of return value, side effects, or error conditions. Could be more 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 both parameters described. The description adds no additional meaning beyond the schema; it's generic. 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?
Description clearly states action (Add), resource (labels), and scope (multiple emails simultaneously). Differentiates from sibling tools like add_labels (single) and bulk_remove_labels (opposite action).
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?
Implies usage for batch labeling but provides no explicit guidance on when to use vs alternatives (e.g., add_labels for single email) or when not to use (e.g., need to replace all labels). No prerequisites mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_deleteA
Delete multiple emails (move to trash)
| 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?
Specifies the behavior 'move to trash', which is a key detail, but lacks disclosure of additional traits such as irreversibility, permission requirements, rate limits, or effect on trash retention. No annotations are provided, so the description bears full responsibility but only partially fulfills it.
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?
One short sentence that front-loads the core action and outcome. Efficient but could include more detail without losing conciseness.
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?
Adequate for a simple bulk operation with one parameter, but lacks information on partial success, error handling, or limits (e.g., maximum number of IDs). No output schema, so no return value explanation needed. Could be more complete for a bulk 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?
Schema coverage is 100%, so the schema fully describes the parameter. The description adds no new meaning beyond repeating 'multiple emails'. No extra context on array size limits, required format, or validation rules.
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 the action 'Delete multiple emails' and specifies it moves to trash, distinguishing it from permanent deletion. The tool name 'bulk_delete' is accurately reflected and differentiated from sibling 'delete_email' for single emails.
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?
Implies use for deleting multiple emails, but no explicit guidance on when to use this tool over alternatives like 'delete_email' for single deletes or 'bulk_move' for moving to other folders. No prerequisites or constraints mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_mark_readB
Mark multiple emails as read/unread
| Name | Required | Description | Default |
|---|---|---|---|
| read | No | true to mark as read, false as unread | |
| emailIds | Yes | Array of email IDs to mark |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits, but it only states the basic action. No mention of failure handling, limits, or side effects.
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 a single, clear sentence with no wasted words. It could be slightly longer to include usage context.
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 bulk operation, the description is adequate but lacks guidance on when to use and behavioral details. The presence of a similar sibling tool makes it slightly incomplete.
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 no additional meaning beyond the schema descriptions 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 tool marks multiple emails as read/unread, with a specific verb and resource. The bulk nature is explicit, distinguishing it from the singular 'mark_email_read' sibling.
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?
No guidance is provided on when to use this tool versus alternatives like 'mark_email_read' or other bulk operations. The context for choosing this tool is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_moveC
Move multiple emails to a mailbox
| 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?
No annotations provided, so description must bear full burden. It only states the action but does not disclose behavioral traits such as atomicity, error handling, permissions required, or side effects. The description is insufficient for a bulk operation.
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 a single short sentence, directly stating the function. It is concise and front-loaded without unnecessary words, though it could provide more context without losing conciseness.
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 two parameters with schema descriptions and no output schema, the description is minimal. For a bulk operation, it lacks details on return values, limits, error behavior, or any post-conditions. More context is needed 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?
Input schema has 100% coverage with descriptions for both parameters, so baseline is 3. The description adds no additional meaning beyond the schema, hence score remains at 3.
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 (move) and resources (multiple emails) and target (mailbox). It distinguishes from sibling bulk operations like bulk_delete and from singular move_email, though the bulk aspect is already implied by the name.
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?
No guidance on when to use this tool versus alternatives like move_email or bulk_delete. It does not mention suitable contexts, prerequisites, or 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_pinA
Pin or unpin multiple emails
| Name | Required | Description | Default |
|---|---|---|---|
| pinned | No | true to pin, false to unpin | |
| emailIds | Yes | Array of email IDs to pin/unpin |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and the description does not disclose any behavioral traits such as side effects, permissions, or error conditions. Minimal information.
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 a single, concise sentence with no wasted words. Well 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 simple parameters and lack of annotations or output schema, the description is adequate but does not cover behavioral context like idempotency or error handling.
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; the description adds no extra meaning beyond the schema's parameter 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 tool's action ('pin or unpin') and the resource ('multiple emails'), distinguishing it from the singular 'pin_email' sibling.
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?
No explicit guidance on when to use this tool vs. alternatives like 'pin_email'. The bulk vs. single distinction is implied but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_remove_labelsB
Remove labels from multiple emails simultaneously
| 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?
Without annotations, the description only states the basic operation. It does not disclose behavioral traits such as whether the operation is destructive, reversible, requires permissions, handles partial failures, or has rate limits.
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 a single concise sentence. While front-loaded, it is too brief and lacks necessary context, making it merely adequate.
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 annotations, no output schema, and the presence of sibling tools, the description is incomplete. It does not explain return values, error handling, how it differs from 'remove_labels', or confirm whether labels are removed from all emails atomically.
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 with clear parameter descriptions. The tool description adds no extra meaning beyond what the 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?
The description clearly states the action 'Remove labels', the resource 'labels', and the scope 'from multiple emails simultaneously'. It effectively distinguishes from sibling tools like 'remove_labels' (singular) and 'add_labels' (opposite).
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?
No guidance is provided on when to use this tool versus alternatives like 'remove_labels' or 'bulk_remove_'. There is no mention of prerequisites, conditions, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_function_availabilityA
Check which MCP functions are available based on account permissions. Calendar tools run over CalDAV, so calendar is reported available when CalDAV credentials are configured, regardless of the JMAP calendar capability.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses behavioral nuance about calendar availability (CalDAV vs JMAP), but does not cover other aspects like whether it is read-only, rate limits, or what happens on errors.
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, front-loaded with purpose, followed by a clarifying example. No extraneous words. Perfectly 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?
Given no parameters and no output schema, the description adequately explains what the tool does with a specific example. It could be more complete by explaining the output format or listing what 'functions' means, but for a simple tool it is sufficient.
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, so baseline is 4. The description does not need to add parameter information. It mentions nothing about parameters, which 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 the verb ('check') and resource ('which MCP functions are available'), and it distinguishes itself from sibling tools as none of them are about checking availability. However, it could be more precise about what 'MCP functions' refers to.
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 a specific example about calendar availability conditions, giving context for usage. However, it does not explicitly state when to use this tool versus alternatives, nor does it mention 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.
create_calendar_eventA
Create a new calendar event. Supports date-only (e.g. 2026-04-01) for all-day events. DTEND is exclusive per RFC 5545 — a one-day event on April 1 needs end: 2026-04-02.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | End time in ISO 8601 format. For all-day events, DTEND is exclusive — a one-day event on April 1 requires end: 2026-04-02 | |
| start | Yes | Start time in ISO 8601 format (e.g. 2026-04-07T14:00:00Z) or date-only for all-day events (e.g. 2026-04-07) | |
| title | Yes | Event title | |
| location | No | Event location (optional) | |
| calendarId | Yes | ID of the calendar to create the event in | |
| description | No | Event description (optional) | |
| participants | No | Event participants (optional). Automatically adds ORGANIZER from CalDAV username. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description shoulders the behavioral disclosure burden. It reveals the crucial DTEND exclusivity behavior and notes that participants automatically adds ORGANIZER from CalDAV username. This goes beyond typical descriptions, though it omits potential side effects like permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the core purpose, and every sentence adds unique information. It wastes no 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 the 7 parameters and no output schema, the description covers the most important behavioral nuances (DTEND exclusivity and automatic ORGANIZER). It does not explain return values or error conditions, but the schema already documents all parameters well. For a creation tool, this is reasonably 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?
Despite 100% schema description coverage, the description adds value by providing a concrete example of the DTEND exclusion (a one-day event on April 1 needs end: 2026-04-02) and clarifying the date-only format for all-day events. This helps agents understand parameter 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 it creates a new calendar event, specifies support for date-only format for all-day events, and explains the DTEND exclusivity per RFC 5545. This distinguishes it from sibling tools like update_calendar_event or list_calendar_events.
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 date-only format and how to set DTEND correctly for all-day events. It does not explicitly state when not to use this tool or suggest alternatives, but the context of a creation tool is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_contactA
Create a new contact in the address book. Requires a name or at least one email address. Requires an API token with read-write contacts scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Structured name; provide full and/or given/surname | |
| notes | No | Free-form note (replaces the existing note on update) | |
| emails | No | Email addresses (replaces ALL existing emails on update; [] clears) | |
| phones | No | Phone numbers (replaces ALL existing phones on update) | |
| addresses | No | Postal addresses as free-form text (replaces ALL existing on update) | |
| addressBookId | No | Target address book id (default book when omitted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It does add useful context such as required authentication scope and the minimum input validation rule. However, it does not describe the return value, error behavior, or what happens if the required conditions are not met.
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 concise sentences, front-loaded with the primary action. Every sentence provides meaningful context (what it does, requirements, permissions) with no filler.
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 several nested parameters, no output schema, and no annotations. The description leaves important gaps: it does not state what the tool returns (e.g., the created contact), how invalid input is handled, or the behavior when the addressBookId is omitted. The schema documents parameters well, but the description is incomplete for an agent to fully anticipate the tool's 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 description coverage is 100%, so the baseline is 3. The description adds a cross-field validation rule (name or at least one email) that is not captured in any single parameter's schema description, which is valuable and pushes the score above 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 the action ('Create'), the resource ('a new contact'), and the scope ('in the address book'). It is easily distinguished from sibling tools like update_contact, delete_contact, and list_contacts.
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 prerequisites: a name or at least one email address, and an API token with read-write contacts scope. This gives clear context for when the tool should be used, though it does not explicitly contrast it with sibling tools or mention 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.
create_draftA
Create an email draft without sending it. Supports threading headers for replies. IMPORTANT: each call creates a new draft — do not call twice for the same message.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC email addresses (optional) | |
| to | No | Recipient email addresses (optional) | |
| bcc | No | BCC email addresses (optional) | |
| from | No | Sender email address (optional, defaults to account primary email) | |
| replyTo | No | Reply-To email addresses (replies go here instead of to the sender) | |
| subject | No | Email subject (optional) | |
| htmlBody | No | HTML body (optional) | |
| textBody | No | Plain text body (optional) | |
| inReplyTo | No | Message-IDs to reply to (optional, for threading) | |
| mailboxId | No | Mailbox ID to save the draft to (optional, defaults to Drafts folder) | |
| references | No | Message-IDs for References header (optional, for threading) | |
| attachments | No | Files to attach. Each entry must use EXACTLY ONE source: localPath (a file inside the configured download directory), emailId + attachmentId (re-attach an attachment from an existing email — no bytes are copied), or blobId (an already-uploaded JMAP blob). Optional name/type override the inferred filename and MIME type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses a key behavioral trait—each call creates a new draft—and warns against duplicate calls. However, it does not mention side effects like saving to the Drafts folder, authentication requirements, or return value behavior. The warning adds value but the description is still thin on behavioral details.
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-loaded with the purpose, and the IMPORTANT warning is clearly highlighted. Every sentence earns its place without redundancy.
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?
Despite having 12 parameters and no output schema or annotations, the description is very brief. It fails to explain what happens after creating a draft (e.g., how to reference it for send_draft/edit_draft), what the return value is, or how the tool interacts with sibling tools. The schema is detailed, but the description does not provide sufficient contextual glue for effective invocation.
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 schema covers 100% of parameters with descriptions, so the baseline is 3. The description adds minor semantic context by mentioning threading headers for replies, which maps to inReplyTo/references, but does not elaborate on other parameters. It does not significantly exceed the schema's 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 clearly states 'Create an email draft without sending it', using a specific verb and resource that distinguishes it from sibling tools like send_email, reply_email, and edit_draft. The additional context about threading headers further clarifies its scope.
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 context for when to use this tool ('without sending it') and includes a strong warning about not calling twice for the same message. However, it does not name alternative tools or explicitly contrast with send_draft/edit_draft, so it lacks explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_mailboxA
Create a new mailbox (folder). Returns the new mailbox ID. The caller is responsible for validating the name is appropriate (length, character set, parent-folder allow-list) before calling — JMAP itself only enforces uniqueness within a parent.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Leaf name of the new mailbox (not a full path). Must not contain "/". | |
| parentId | No | Parent mailbox ID. Pass null (or omit) to create at top level. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return value (new mailbox ID) and uniqueness behavior. Without annotations, it lacks details on permissions, side effects, or error handling for invalid names. Adequate but not thorough.
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 wasted words. Front-loaded with action and output. 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 2 parameters and no output schema, the description covers purpose, return, and caller responsibilities sufficiently. 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?
Schema description coverage is 100%. Description adds value by clarifying 'leaf name' and providing guidance on parentId. Enhances understanding beyond the schema 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?
Clearly states 'Create a new mailbox (folder)' with verb and resource. Distinguishes from sibling tools like list_mailboxes or get_mailbox_by_name because it's the only one creating a 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?
Provides explicit caller responsibility for name validation and notes uniqueness enforcement. Does not explicitly mention alternatives or when not to use, but gives clear context for prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_calendar_eventB
Delete a calendar event by ID
| Name | Required | Description | Default |
|---|---|---|---|
| eventId | Yes | ID of the event to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description states 'Delete' but omits critical behavior: whether deletion is permanent, what happens to recurring events, required permissions, or side effects (e.g., notifications). Agent is left guessing.
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?
Single sentence, no extraneous words. Efficiently conveys the core action.
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 one parameter and no output schema. Description covers the basic action but lacks safety information. For a destructive operation, this is incomplete.
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 one parameter described. Description adds no additional semantics beyond what the schema already provides. 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?
The description clearly states the action ('Delete') and resource ('a calendar event'), with the qualifier 'by ID' specifying the identifier. It effectively distinguishes from sibling tools like create or update.
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?
No guidance on when to use this tool versus alternatives (e.g., bulk_delete, update to cancel), prerequisites, or scenarios where deletion is inappropriate. Agent must infer solely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_contactA
Permanently delete a contact from the address book. This cannot be undone. Requires read-write contacts scope.
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | ID of the contact to delete | |
| expectState | No | Optional JMAP state precondition (ifInState) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for disclosing behavior. It explicitly states the deletion is permanent and irreversible ('This cannot be undone') and mentions the required scope, which is valuable context for an agent deciding to invoke the tool.
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 with no wasted words. It leads with the primary action, followed by the two most critical caveats (irreversibility and scope requirement).
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 delete operation, the description covers the essential context: permanence, irreversibility, and permission scope. It omits return value details, but no output schema exists and such details are often standardized for delete operations.
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 input schema already provides full meaning for contactId and expectState. The description adds no parameter-specific details beyond what the schema offers, matching the baseline of 3.
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 'Permanently delete a contact from the address book' with a specific verb and resource, clearly distinguishing it from sibling tools like delete_email or update_contact. The addition of 'permanently' and 'cannot be undone' reinforces the destructive nature.
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 phrase 'Requires read-write contacts scope' provides a clear precondition for use. While it doesn't explicitly contrast with alternative tools, the purpose is unambiguous enough that an agent would know when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_emailB
Delete an email (move to trash)
| 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?
No annotations are provided, so the description must convey behavioral traits. It adds a nuance that deletion means moving to trash, but does not disclose if it's reversible, requires permissions, or triggers side effects.
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?
A single, concise sentence that efficiently conveys the core action. 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?
For a low-complexity tool with no output schema and no annotations, the description is minimally adequate but missing expected return value or success/failure indicator. It does not fully compensate for the lack of structured metadata.
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 schema covers 100% of the parameter 'emailId' with a clear description. The tool description adds no additional meaning beyond the schema, meeting the baseline for high coverage.
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 'Delete an email (move to trash)' clearly states the action and the specific resource (email). It distinguishes from sibling tools like 'bulk_delete' (batch) and 'move_email' (different folder).
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?
No guidance on when to use this tool versus alternatives (e.g., 'bulk_delete' for multiple emails, 'move_email' for relocating). The description lacks context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_attachmentA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ID of the email | |
| savePath | No | File path to save the attachment to. May be absolute or relative; relative paths resolve against ~/Downloads/fastmail-mcp/ (configurable via FASTMAIL_DOWNLOAD_DIR), so a bare filename lands there in one step. Absolute paths must fall within that directory; traversal or symlink escape outside it is rejected for security. To save directly into your own location, set FASTMAIL_DOWNLOAD_DIR to that root. Parent directories will be created automatically. | |
| attachmentId | Yes | ID of the attachment |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that the tool may write to disk (if savePath provided) or return a URL, and mentions security constraints on paths. This is good transparency for a download operation.
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 with no wasted words. The most important information (download action) is front-loaded, and operational nuances are efficiently presented.
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 description covers the two primary workflows, return values, and security constraints. It is absent of output schema but sufficiently explains outputs. Minor omission: no mention of maximum file size or supported formats.
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?
Although schema coverage is 100% (baseline 3), the description adds value by explaining the behavioral difference between providing savePath or not, beyond what the schema parameter descriptions cover.
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 starts with the clear verb+resource 'Download an email attachment,' and distinguishes the two behaviors based on savePath. This clearly sets it apart from sibling tools like get_email_attachments, which lists attachments.
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 implicitly states when to use the tool: to download an attachment. It does not explicitly exclude alternative tools, but the context is clear. It could be improved by noting that this is for downloading, not listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_draftA
Edit an existing draft email. Since JMAP emails are immutable, this atomically destroys the old draft and creates a new one with the updated fields. Only fields you provide will be changed; others are preserved from the original draft.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Updated CC email addresses (optional) | |
| to | No | Updated recipient email addresses (optional, keeps existing if omitted) | |
| bcc | No | Updated BCC email addresses (optional) | |
| from | No | Updated sender email address (optional) | |
| emailId | Yes | The ID of the draft email to edit | |
| replyTo | No | Reply-To email addresses (replies go here instead of to the sender) | |
| subject | No | Updated email subject (optional) | |
| htmlBody | No | Updated HTML body (optional) | |
| textBody | No | Updated plain text body (optional) | |
| attachments | No | Files to attach. Each entry must use EXACTLY ONE source: localPath (a file inside the configured download directory), emailId + attachmentId (re-attach an attachment from an existing email — no bytes are copied), or blobId (an already-uploaded JMAP blob). Optional name/type override the inferred filename and MIME type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the crucial behavioral trait that JMAP emails are immutable, so the tool atomically destroys the old draft and creates a new one. It also clarifies partial-update semantics. It does not mention return values or permissions, but the disclosed behaviors are significant and well-worded.
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, front-loaded with the primary purpose, followed by the key behavioral nuance and an important caveat about partial updates. Every sentence adds value without redundancy or padding.
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 that destroys and recreates a draft, the description omits what the tool returns (e.g., the new draft's ID) and how to reference it afterward. Since there is no output schema, this is a notable gap. It covers the mutation semantics well but leaves the return contract ambiguous, which is important for a destructive replacement.
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% coverage, providing individual parameter descriptions. The description adds a global rule: only fields you provide will be changed; others are preserved. This goes beyond the per-field 'optional' labels and gives a coherent update semantics, justifying a score above the baseline of 3.
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 edits an existing draft email, using a specific verb ('Edit') and resource ('existing draft email'). It distinguishes itself from siblings like create_draft by focusing on existing drafts, and it adds the important nuance that it destroys and recreates the draft due to immutability.
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 establishes clear context: it is for editing existing drafts, and it explains that only provided fields change while others are preserved. However, it does not explicitly mention alternatives (e.g., create_draft for new drafts) or exclusion criteria, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_summaryB
Get overall account summary with statistics
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior. It only says 'get' and 'statistics', but doesn't confirm read-only nature, required permissions, or side effects. This is minimal.
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 only 6 words, efficient but front-loaded. No wasted words, but could be expanded slightly for clarity.
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?
No output schema, and description barely hints at return value ('statistics'). For a tool with no params, more context on what statistics are included would improve completeness.
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 description adds no param info. Baseline is 4 because there's nothing to add beyond 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 the action ('Get') and the resource ('overall account summary'), adding 'with statistics' to hint at the content. However, it doesn't differentiate from sibling tools like 'get_mailbox_stats', which may overlap.
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?
No guidance on when to use this tool versus alternatives (e.g., get_mailbox_stats or list_mailboxes). The description lacks context about prerequisites or use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_calendar_eventA
Get a specific calendar event by ID. Returns organizer and participants when available.
| Name | Required | Description | Default |
|---|---|---|---|
| eventId | Yes | ID of the event to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description is the sole source. Mentions return of organizer and participants when available, but does not explicitly state it's read-only or cover error conditions like missing event.
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 succinct sentences with no unnecessary words. Action 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?
Simple tool with one required parameter and no output schema. Description mentions specific return fields (organizer, participants) which adds value. Lacks details on error handling but adequate for 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?
Schema has 100% coverage for the single parameter. Description adds no extra meaning beyond the schema's 'ID of the event to retrieve.' Baseline 3 due to high schema coverage.
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 the action and resource: 'Get a specific calendar event by ID.' Distinguishes from sibling tools like delete_calendar_event and list_calendar_events.
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?
No explicit when-to-use or when-not-to-use guidance. Implied usage is straightforward for a retrieval tool, but alternatives like list_calendar_events are not mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contactB
Get a specific contact by ID
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | ID of the contact to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits like required permissions, rate limits, or error behavior. For a simple read operation, the lack of transparency is a gap.
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 a single, clear sentence with no unnecessary words. It is optimally concise and 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 tool's simplicity (one parameter, no output schema), the description provides sufficient information to understand its purpose. However, adding what is returned (e.g., contact details) would enhance completeness.
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 schema covers both parameters with descriptions. The tool description adds no additional meaning beyond 'by ID', which is already implied. With 100% schema coverage, the 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 'Get a specific contact by ID' clearly specifies the action (get), resource (contact), and method (by ID). It distinguishes from siblings like list_contacts and search_contacts.
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 no guidance on when to use this tool versus alternatives, such as list_contacts or search_contacts. It lacks explicit usage context or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_emailB
Get a specific email by ID
| 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?
The description lacks any behavioral details beyond the parameter. It does not disclose what data the response contains, any permission requirements, or whether the email is returned in full. Since no annotations are provided, the description carries the full burden, and it falls short.
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 very concise (five words) but lacks necessary context. It is front-loaded, but the brevity reduces its informative value. Every word earns its place, but more details could be added without being verbose.
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 absence of an output schema, the description should explain what is returned (e.g., email details or attachments). It does not. For a simple tool, this is still incomplete for an AI to understand the tool's full 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?
The parameter 'emailId' is described in the schema as 'ID of the email to retrieve', which is clear. The tool description adds no additional semantic meaning beyond what the schema already provides. With 100% schema coverage, the baseline is 3.
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 a specific email by ID', which is a specific verb-resource combination. It distinguishes from sibling tools like 'get_recent_emails' or 'search_emails' by focusing on a single email retrieval by ID.
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?
No guidance is provided on when to use this tool versus alternatives. For example, it doesn't mention that this is for retrieving a known email by ID, as opposed to listing or searching. There are no prerequisites or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_email_attachmentsB
Get list of attachments for an email
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ID of the email |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It does not mention any behavioral traits such as whether the list includes metadata, file sizes, or content types, nor any side effects or permissions needed.
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 a single, focused sentence with no extraneous words, making it highly concise and well-structured for quick comprehension.
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 lack of output schema, the description fails to specify what the list contains (e.g., attachment IDs, names, sizes), and provides no information on error conditions or authentication requirements, leaving the agent with incomplete context for invoking the 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?
The parameter 'emailId' is fully described in the input schema (100% coverage). The description adds no additional meaning beyond what the schema provides, meeting the baseline for full coverage.
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 list'), the resource ('attachments'), and the scope ('for an email'), distinguishing it from siblings like 'download_attachment' (which downloads a specific attachment) and 'get_email' (which retrieves email content).
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 no guidance on when to use this tool versus alternatives like 'download_attachment', no prerequisites (e.g., email existence), and no mention of what not to use it for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_email_metadataA
Get headers/metadata for an email — sender, recipients, subject, date, threading, mailbox membership, keywords (read/flagged/etc.), size, and whether an attachment is present — but NOT the body, preview, or any rendered text. Useful when a workflow needs to classify or route an email without ingesting its content (e.g. customer-mail least-privilege flows where reading bodies is forbidden, or skills that only need to verify post-archive folder placement). The return shape is the standard JMAP Email object restricted to a strict header-only allowlist.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ID of the email to retrieve metadata for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses what is returned (headers/metadata) and what is not (body, preview), and mentions the return shape as a restricted JMAP Email object. However, it does not discuss performance, rate limits, or authentication requirements, which would enhance transparency.
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 concise yet comprehensive, stating the main purpose first, then listing specific fields, followed by use-case examples. Every sentence adds value, and there is no redundancy. It is well-organized and easy to parse.
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 has only one parameter and no output schema, the description adequately explains what the tool returns. It covers the header-only restriction and how it differs from full email retrieval. However, a brief note about the return structure (e.g., JMAP Email object) could be more explicit for completeness.
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 the single parameter 'emailId', so baseline is 3. The description does not add further details about the parameter's format or constraints beyond the schema, but the overall tool context implies its purpose. No additional semantic value is provided.
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: retrieving email headers/metadata. It explicitly lists the fields included (sender, recipients, subject, etc.) and those excluded (body, preview, rendered text), distinguishing it from siblings like '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?
The description provides explicit usage scenarios, such as classifying or routing emails without ingesting content, and gives concrete examples like least-privilege flows and verifying post-archive placement. This helps the agent decide when to use this tool instead of alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mailbox_by_nameA
Look up a single mailbox by its full path from root (e.g. "Folder/Subfolder/Leaf"). Returns the mailbox ID and minimal metadata, or throws "Mailbox not found" if no exact match. The path separator is "/"; folder names containing a literal "/" are not supported.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Full path from root, separated by "/" (e.g. "Inbox" or "Archive/2026/Suppliers/ExampleCo"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool returns minimal metadata, throws if not found, and clarifies the path separator and unsupported characters. It could be more specific about what 'minimal metadata' includes, but it is generally transparent for a lookup tool.
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 without wasted words. It front-loads the purpose and then provides essential details, making it efficient and clear.
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 it's a simple lookup tool with one parameter, no output schema, and no annotations, the description is fully complete. It covers purpose, input format, error behavior, and constraints.
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 'path' parameter. The description adds meaning by explaining the format from root, separator, and giving an example, which goes 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 looks up a single mailbox by its full path from root, returning the mailbox ID and minimal metadata. It distinguishes itself from sibling tools like list_mailboxes by focusing on a single exact match lookup.
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 specifies when to use: to get a mailbox by exact path. It includes an error case ('Mailbox not found') but does not explicitly mention when not to use or name alternatives. The context of sibling tools implies that for listing all mailboxes, list_mailboxes should be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mailbox_statsA
Get statistics for a mailbox (unread count, total emails, etc.)
| 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?
The description discloses the purpose but lacks any behavioral details beyond that. Since annotations are absent, the description should mention that this is a read operation, potential permissions required, or what happens if the mailbox ID is invalid. No such information is provided.
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 a single concise sentence with no redundant words. It efficiently communicates the tool's core function.
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 (1 optional param, no output schema), the description is minimally adequate but could be more complete by detailing the return format or providing an example. Without an output schema, more context about the returned object structure would improve completeness.
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 covers 100% of parameter descriptions (defaults to all mailboxes). The tool description adds meaning by specifying what kind of statistics are returned ('unread count, total emails, etc.'), which is not in 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 the verb 'Get', the resource 'mailbox statistics', and examples of statistics ('unread count, total emails, etc.'). It distinguishes from sibling tools like list_mailboxes which list mailbox metadata.
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 implies the tool is used to retrieve mailbox statistics, but provides no explicit when-to-use guidance or alternatives. The context of when to choose get_mailbox_stats over other tools like list_mailboxes or get_account_summary is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_emailsA
Get the most recent emails across all mailboxes except Trash and Spam (pass mailboxName to scope to one folder, e.g. "inbox"). When the server reports a total match count, results are wrapped in a {"total", "items"} JSON envelope; otherwise a bare JSON array is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of recent emails to retrieve (default: 10, max: 50) | |
| ascending | No | Sort oldest first instead of newest first (default: false) | |
| mailboxName | No | Mailbox to search (optional; when omitted, all mailboxes except Trash and Spam are searched) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for behavioral disclosure. It reveals a non-obvious server-dependent response format (envelope vs. bare array) and the default exclusion of Trash/Spam. It does not address rate limits or authentication, but the disclosed behaviors are meaningful and not deducible from the schema.
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-loads the core purpose, and uses no filler. Every clause adds value: the scope, the mailboxName option, and the response format note.
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 3 optional parameters and no output schema, the description covers the key operational details: default scope, optional scoping, and the return format variation. It lacks details about returned email fields, but that is not critical for tool selection and invocation.
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 baseline is 3. The description adds a small amount above the schema by providing an example mailboxName value ('inbox') and re-explaining the default scope. The envelope behavior is not directly parameter-related, so no additional parameter semantics are conveyed.
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'), the resource ('most recent emails'), and the scope ('across all mailboxes except Trash and Spam'). It distinguishes this tool from siblings like get_email (single email) and search_emails (query-based retrieval) by focusing on recency and default cross-mailbox behavior.
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 implies when to use this tool (retrieve recent emails, optionally scoped to a mailbox) but does not explicitly compare against alternatives or state when not to use it. The mailboxName guidance is helpful but the tool's relationship to list_emails and search_emails is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_threadA
Get all emails in a conversation thread. Draft messages are excluded by default; set includeDrafts=true to include in-progress drafts in the thread.
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes | ID of the thread/conversation | |
| includeDrafts | No | Include draft messages in the thread (default: false, drafts excluded). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses that drafts are excluded by default, which is a key behavioral trait. No destructive actions hinted. Could add more on authentication or rate limits, but sufficient for a read operation.
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, front-loaded with purpose, then behavioral detail. No wasted words. Efficient and clear.
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?
Lacks description of the return format or what the output contains. Given no output schema, agent lacks info on response structure. Additional details on what is returned (e.g., array of email objects) would improve completeness.
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 already describes both parameters with 100% coverage. The description adds value by explaining the default behavior of 'includeDrafts' (excluded by default, explicit inclusion needed), which is not in the schema 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 'Get all emails in a conversation thread', providing a specific verb and resource. It distinguishes from sibling tool 'get_thread_metadata' by focusing on content rather than metadata.
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 gives context on default draft exclusion and how to include drafts, aiding proper usage. However, it does not explicitly mention when to use this tool over alternatives like 'get_email' or 'get_thread_metadata'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_thread_metadataA
Same as get_thread (enumerate every message in a conversation thread) but returns ONLY metadata on each thread message — id, threadId, subject, from, to, cc, replyTo, receivedAt, hasAttachment, keywords. Does NOT return preview or any body-derived content. Use for thread-state checks (reply-presence detection, sender enumeration, date comparison, read/flagged status) without ingesting message bodies — particularly in customer-mail least-privilege flows where the skill needs to know "did we reply, when, and from which alias" but is forbidden from reading what was said. Accepts either a thread ID or an email ID and resolves to the parent thread, mirroring get_thread.
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes | ID of the thread/conversation (an email ID is also accepted and will be resolved to its parent thread) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses no body content, lists returned metadata fields, explains resolution of email ID to thread; read-only implied.
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, front-loaded with key difference, lists fields and use cases efficiently.
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 details return fields and resolution behavior; complete for a simple one-param 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?
Adds meaning beyond schema by explaining that email ID is accepted and resolved to parent thread.
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 returns metadata only, distinguishes from get_thread, lists specific fields and use cases.
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?
Explicit when-to-use for thread-state checks without bodies; implies get_thread for full content; no explicit when-not but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_calendar_eventsC
List events from a calendar
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of events to return (default: 50) | |
| endDate | No | Filter events ending before this date (ISO 8601, e.g. 2026-03-30T00:00:00Z) | |
| startDate | No | Filter events starting from this date (ISO 8601, e.g. 2026-03-23T00:00:00Z) | |
| calendarId | No | ID of the calendar (optional, defaults to all calendars) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits, but it provides none. Missing details on pagination, ordering, timezone handling, or return format.
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?
Only one sentence, which is efficient but too brief for a tool with 4 parameters and many siblings. Could include more context without being verbose.
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?
Lacks completeness: no mention of return fields, default behavior when calendarId is omitted, or limitations. For a listing tool with date filters, more context is needed.
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 with clear parameter details. The description adds no extra meaning beyond the schema, 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?
The description clearly states it lists events from a calendar, but does not specify the scope (e.g., single calendar or all) or differentiate from sibling tools like get_calendar_event.
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?
No guidance on when to use this tool vs alternatives such as get_calendar_event or search_emails. Missing context on prerequisites or default behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_calendarsB
List all calendars
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not disclose behavioral traits beyond the obvious read-only nature. Since no annotations exist, the description carries full burden, but it fails to mention safety (e.g., no side effects), rate limits, or required 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?
The description is a single, concise sentence with no extraneous words, fully front-loading the tool's 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?
For a zero-parameter tool with no output schema, the description lacks completeness about return format (e.g., IDs, names) and context (e.g., linked to which account). The agent may be unable to process the response effectively.
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 zero parameters, and the description adds the purpose 'List all calendars,' which provides meaning beyond the empty schema. With 100% schema coverage, the baseline is 4, and the description justifiably earns that score.
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') and resource ('calendars'), distinguishing it from sibling tools like list_events or list_emails. However, it does not specify what type of calendars (e.g., Google Calendar) or any scoping, leaving slight ambiguity.
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?
No guidance is provided on when to use this tool versus alternatives like get_freebusy or list_events. There are no explicit when-not or precondition mentions, relying on the agent to infer from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contactsA
List contacts from the address book. When the server reports a total match count, results are wrapped in a {"total", "items"} JSON envelope; otherwise a bare JSON array is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of contacts to return (default: 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a non-obvious response format behavior: results are wrapped in a {'total','items'} envelope when a total count is reported, otherwise a bare array. With no annotations provided, this is valuable context, though it doesn't cover other traits like authentication or rate limits.
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-loaded with the primary purpose, followed by the response format note. Every word 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?
For a simple list tool with one parameter and no output schema, the description adequately covers the main purpose and the variable response envelope. It could mention sorting or error behavior but the current scope is reasonably 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?
The schema already fully documents the 'limit' parameter with a clear description and default value. The tool description adds no additional parameter information, so baseline 3 applies per schema coverage rules.
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 'List contacts from the address book', using a specific verb and resource. It distinguishes from sibling tools like search_contacts and get_contact by indicating a full listing 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 implies this tool is for listing all contacts but does not explicitly state when to use it versus alternatives like search_contacts. No exclusions or alternative guidance are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_emailsB
List emails from a mailbox. When the server reports a total match count, results are wrapped in a {"total", "items"} JSON envelope; otherwise a bare JSON array is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of emails to return (default: 20) | |
| ascending | No | Sort oldest first instead of newest first (default: false) | |
| mailboxId | No | ID of the mailbox to list emails from (optional, defaults to all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses an important behavioral nuance: the response can be a JSON envelope with total and items when the server reports a match count, otherwise a bare array. This adds valuable parsing context beyond the schema, especially with no annotations present. However, it omits other behavioral details like read-only nature, authentication, or rate limits, which would make it more transparent.
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, consisting of two focused sentences. The first sentence states the core purpose, and the second provides a critical detail about response format. Each sentence earns its place with no filler or redundancy.
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, and the description does not clarify what each listed email contains (full email vs metadata), creating ambiguity given the sibling list_emails_metadata tool. It also does not distinguish itself from search_emails. However, it does cover the core listing action and the response envelope, making it moderately 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?
All three parameters (limit, ascending, mailboxId) have descriptions in the input schema, giving 100% schema description coverage. The tool description adds no parameter-specific information beyond what the schema already provides, so the 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 the tool's purpose with a specific verb and resource: 'List emails from a mailbox.' It is easy to understand, but it does not explicitly differentiate from sibling tools like search_emails or list_emails_metadata, so it misses the extra distinction that would earn a 5.
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 offers no guidance on when to use this tool versus alternative tools such as search_emails or list_emails_metadata. It simply states what the tool does without any context about typical use cases, exclusions, or comparisons to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_emails_metadataA
Same as list_emails (lists emails from a mailbox, optionally filtered by mailboxId, with paging and sort) but returns ONLY metadata fields on each result — id, threadId, subject, from, to, replyTo, receivedAt, hasAttachment, keywords. Does NOT return preview or any body-derived content. Use in privacy-sensitive flows where the workflow needs only the envelope (e.g. customer-mail least-privilege scans, or any caller forbidden from ingesting message bodies). Pair with get_email_metadata for follow-up lookups that should also stay header-only. When the server reports a total match count, results are wrapped in a {"total", "items"} JSON envelope; otherwise a bare JSON array is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of emails to return (default: 20) | |
| ascending | No | Sort oldest first instead of newest first (default: false) | |
| mailboxId | No | ID of the mailbox to list emails from (optional, defaults to all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries behavioral disclosure. It reveals that only metadata is returned, explicitly excludes preview/body-derived content, and describes the conditional JSON envelope format. This is substantial, actionable behavioral context.
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 well-structured and front-loaded. It opens with the core comparison, then details fields, exclusions, use cases, and response format—every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description thoroughly compensates by explaining the response envelope and array fallback. It covers use cases, exclusions, and related tools, making the description complete for a list tool with optional parameters.
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 schema already explains limit, ascending, and mailboxId. The description adds only a generic mention of 'paging and sort' and 'optionally filtered by mailboxId', which does not materially exceed the schema. 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?
The description clearly states that this tool lists emails but returns only metadata fields, explicitly contrasting with list_emails. It lists the exact fields returned and what is excluded (preview/body content), making the purpose unambiguous and distinguishing it from sibling 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?
The description explicitly recommends use in privacy-sensitive flows and names get_email_metadata as a companion tool for header-only follow-ups. This is strong guidance on when to use the tool and how it relates to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_identitiesA
List sending identities (email addresses that can be used for sending)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must carry the burden. It states the tool lists identities but does not disclose behavioral traits such as read-only nature, authentication requirements, or edge cases like empty results.
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?
Single sentence, no wasted words, front-loaded with verb and resource.
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 parameters and no output schema. Description is sufficient to understand the tool's function.
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 parameter semantics are not needed. Baseline 4 applies per criteria.
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 the action (list) and resource (sending identities) with additional context (email addresses for sending). It distinguishes from sibling tools that list other entities like contacts, emails, mailboxes, etc.
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?
No explicit guidance on when to use this tool versus alternatives. Usage is implied by the tool name and description, but lacks contextual clues or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mailboxesA
List mailboxes in the Fastmail account. By default returns all mailboxes with full metadata; on accounts with hundreds of mailboxes the full result can exceed the MCP tool result window. Use properties: ["id","name","parentId"] for a slim view, and/or parentId to filter to one level of children.
| Name | Required | Description | Default |
|---|---|---|---|
| parentId | No | Filter to direct children of this mailbox ID. Pass null for top-level mailboxes. Filter is applied client-side after Mailbox/get. | |
| properties | No | JMAP Mailbox properties to return (e.g. ["id","name","parentId"]). Default: all properties. The slim form roughly halves payload size on large accounts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden for behavioral disclosure. It reveals that the parentId filter is applied client-side after the Mailbox/get call, which is a crucial behavioral note. However, it does not explicitly state that the operation is read-only or safe, though that's implied by listing. Still, it provides enough transparency to avoid misuse.
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 concise, consisting of two sentences with no unnecessary words. It front-loads the primary purpose and immediately addresses a known limitation (result window), then provides actionable advice. 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?
For a listing tool with no output schema, the description is fairly complete: it defines purpose, limitations, optimization tips, and a behavioral detail. It could be enhanced by mentioning that the result is a list of mailbox objects, but that is standard for list operations. The given context is sufficient 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 descriptions for both parameters. The description adds value beyond the schema by explaining the optimization benefit of 'properties' (roughly halves payload size) and clarifying that 'parentId' filtering is client-side. This contextual insight helps the agent use parameters more effectively.
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 states explicitly that the tool lists mailboxes in the Fastmail account, using the verb 'list' and specifying the resource 'mailboxes'. It clearly distinguishes from sibling tools like get_mailbox_by_name or create_mailbox by focusing on listing multiple mailboxes.
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 clear usage guidance: it notes the default returns all mailboxes with full metadata, warns about result window limits on large accounts, and offers specific parameters ('properties' and 'parentId') to slim down the result or filter by parent. This helps the agent decide when and how to use the tool effectively.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_email_readB
Mark an email as read or unread
| Name | Required | Description | Default |
|---|---|---|---|
| read | No | true to mark as read, false to mark as unread | |
| emailId | Yes | ID of the email to mark |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and the description fails to disclose any behavioral traits such as reversibility, authentication needs, or side effects. Bare minimum.
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?
Single sentence, no fluff. Appropriate length for a simple toggle action.
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, the description lacks context about expected outcomes or return values. Given no output schema, more detail could be beneficial.
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 covers both parameters adequately (100% coverage). Description adds no additional meaning beyond the schema definitions.
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 the action of marking an email as read/unread. Implicitly distinguishes from bulk_mark_read by implying a single email via the required emailId parameter, but does not explicitly mention it.
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?
No guidance on when to use this tool vs alternatives like bulk_mark_read. The agent is left to infer from parameter count.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_emailB
Move an email to a different mailbox
| 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?
No annotations provided, so the description must disclose behavioral traits. It only says 'move' without mentioning side effects (e.g., preserving labels), permissions, or error conditions.
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?
One sentence, no fluff. It efficiently conveys the action, though it could be slightly expanded for clarity.
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 and no annotations, the description is sparse. It lacks details about return values, error handling, or constraints like mailbox permissions.
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 explicit descriptions for both parameters. The description adds no extra meaning beyond the schema, meeting the baseline for high coverage.
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 'Move' and the resource 'email' to a 'different mailbox'. It distinguishes from siblings like delete_email and mark_email_read.
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?
No guidance on when to use this tool versus alternatives like bulk_move. The description lacks context about prerequisites or scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pin_emailC
Pin or unpin an email
| Name | Required | Description | Default |
|---|---|---|---|
| pinned | No | true to pin, false to unpin | |
| emailId | Yes | ID of the email to pin/unpin |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description only states action without disclosing side effects (e.g., visual changes, reversibility) or behavioral traits beyond the basic operation.
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?
Extremely concise (5 words) with no waste. Appropriate for a simple tool, though lacks structural elements like examples or bullet points.
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?
Adequate for a straightforward toggle operation, but missing details on return value or effect on email order/visibility. Could be more informative given no output schema.
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 parameters with descriptions. The tool description adds no extra semantic value beyond the schema content.
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 action (pin/unpin) and resource (email). Distinguishes from sibling 'bulk_pin' by implication, but lacks explicit scope indication.
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?
No guidance on when to use this tool versus alternatives like bulk_pin or other email operations. No context on prerequisites or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_labelsA
Remove specific labels (mailboxes) from an 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?
No annotations provided; description does not disclose side effects (e.g., if labels must exist, impact of removing nonexistent labels, or return value).
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?
Extremely concise single sentence with no redundancy, efficiently conveying the tool's function.
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?
Lacks details on return value, error conditions, or prerequisites; adequate for a simple operation but could be more comprehensive.
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 adds minimal value beyond schema definitions, providing only the parenthetical clarification '(mailboxes)'.
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 the action 'Remove specific labels' and the target 'email', distinguishing it from sibling tools like '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?
No explicit guidance on when to use this tool over alternatives like 'bulk_remove_labels', but the purpose is straightforward and implied.
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 proper threading headers (In-Reply-To, References). Automatically fetches the original email to build the reply chain. By default sends immediately; set send=false to save as a draft instead.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC email addresses (optional) | |
| to | No | Recipient email addresses (optional, defaults to the original sender) | |
| bcc | No | BCC email addresses (optional) | |
| from | No | Sender email address (optional, defaults to account primary email) | |
| send | No | Whether to send the reply immediately (default: true). Set to false to save as draft instead. | |
| replyTo | No | Reply-To email addresses (replies go here instead of to the sender) | |
| htmlBody | No | HTML body (optional) | |
| textBody | No | Plain text body (optional) | |
| attachments | No | Files to attach. Each entry must use EXACTLY ONE source: localPath (a file inside the configured download directory), emailId + attachmentId (re-attach an attachment from an existing email — no bytes are copied), or blobId (an already-uploaded JMAP blob). Optional name/type override the inferred filename and MIME type. | |
| originalEmailId | Yes | ID of the email to reply to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden. It reveals key behaviors: automatically fetching the original email, building threading headers, and defaulting to immediate sending with a draft option. It could mention return values or error handling, but the main side-effects are covered.
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, front-loaded with the core action and key behavior. No wasted words, and every phrase adds useful 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?
For a tool with 10 parameters and no output schema, the description provides a solid workflow overview (reply, fetch original, threading, send/draft). The rich schema already documents parameters, so this level of description is adequate, though it could include a note about return values if relevant.
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 description doesn't need to explain every parameter. It adds modest value by emphasizing the originalEmailId and send behavior, but these are already in the schema. The description doesn't significantly enhance parameter understanding 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 the tool replies to an existing email, specifies threading headers (In-Reply-To, References), and notes automatic fetching of the original email. This distinguishes it from sibling tools like send_email, create_draft, and send_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?
The description explains the default behavior (sends immediately) and how to save a draft instead (send=false), giving clear usage context. It doesn't explicitly name alternatives or exclusions, but the scope is clear enough for an email reply tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_attachment_to_webdavA
Save an email attachment directly to WebDAV cloud storage (e.g. Fastmail Files or Nextcloud) without touching local disk. The storage server and credentials come from server configuration (FASTMAIL_WEBDAV_URL / _USERNAME / _PASSWORD); this tool only chooses the relative path beneath that base. Fails if the remote file exists unless overwrite is set.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ID of the email | |
| overwrite | No | Replace an existing remote file (default false: fail if it exists) | |
| remotePath | Yes | Relative path under the configured WebDAV base (e.g. "invoices/2026/receipt.pdf"). No leading slash, no "..", forward slashes only. Missing parent folders are created unless createParents is false. | |
| attachmentId | Yes | Attachment partId, blobId, or zero-based index | |
| createParents | No | Create missing parent collections via MKCOL (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals the configuration source, clarifies the tool's limited scope (choosing only the relative path), and states the overwrite-related failure condition. It doesn't mention return values or auth errors, but it covers the most important behavioral traits.
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 long, front-loaded with the primary purpose, and every sentence adds unique value: purpose, configuration source, and overwrite behavior. There is no wasted wording.
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 5-parameter mutation tool with no output schema or annotations, the description covers the essential context: what it does, where storage is configured, the overwrite failure mode, and local-disk avoidance. It doesn't describe the return value or non-overwrite error paths in detail, but it is sufficiently complete for an agent to select and invoke it effectively.
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 baseline is 3. The description adds some context beyond the schema by explaining the server/base configuration and how remotePath relates to it, but it does not significantly expand on the individual parameter meanings already provided in 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 opens with a specific verb+resource: 'Save an email attachment directly to WebDAV cloud storage'. It clearly distinguishes this from sibling tools like download_attachment by adding 'without touching local disk', making the intended action and target unambiguous.
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 clear context on when to use this tool: for saving attachments directly to WebDAV cloud storage rather than local disk. It highlights the storage server and credential configuration, but it does not explicitly name alternative tools or state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contactsA
Search contacts by name or email. When the server reports a total match count, results are wrapped in a {"total", "items"} JSON envelope; otherwise a bare JSON array is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default: 20) | |
| query | Yes | Search query string |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses an important conditional behavior: results may be wrapped in a {'total', 'items'} envelope when a total match count is reported, otherwise a bare array. This adds value beyond the schema and annotations (which are absent). It does not cover other behaviors like sorting or default limits, but the provided detail is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the core purpose and followed by a specific behavioral note. No filler or redundant material.
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 two-parameter search tool with no output schema, the description adequately covers the main purpose and a key return-format nuance. It could benefit from mentioning whether results include full contact objects or only IDs, but that is not necessary for basic 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 description coverage is 100% for both parameters, so the baseline is 3. The description adds that 'query' targets name/email, but this is a minor enhancement over the schema's 'Search query string' and does not substantially clarify parameter usage.
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 verb 'Search' and resource 'contacts', and specifies the search criteria 'by name or email'. This distinguishes it from siblings like list_contacts and get_contact, though it does not explicitly name 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?
Usage context is implied through the search criteria ('by name or email'), but there is no explicit guidance on when to use this tool versus siblings like list_contacts or get_contact. No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_emailsA
Full-text search of email body and subject. Does not filter by sender, recipient, or date — use advanced_search for field-specific filtering. Drafts are included by default; set excludeDrafts=true to omit draft messages from results. When the server reports a total match count, results are wrapped in a {"total", "items"} JSON envelope; otherwise a bare JSON array is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default: 20) | |
| query | Yes | Text to search for in email body and subject lines | |
| ascending | No | Sort oldest first instead of newest first (default: false) | |
| excludeDrafts | No | Omit draft messages from results (default: false, drafts included). Filtered server-side via the $draft keyword. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses that drafts are included by default, explains the excludeDrafts option to omit them, and describes the two possible return formats (envelope vs. bare array). These are non-obvious behaviors that an agent must know to correctly interpret results.
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 long, front-loaded with the core purpose, and every sentence adds critical information: scope, exclusions/alternative, draft behavior, and output format. There is no redundancy or filler.
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 search tool with no output schema and no annotations, the description is remarkably complete. It explains the output envelope behavior, which is essential for parsing results, and the draft default. It also gives enough context about the search scope to avoid surprises. The description fully equips an agent to use the tool 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 each parameter already has a descriptive comment (e.g., query: 'Text to search for in email body and subject lines'). The description adds little new parameter information—it restates excludeDrafts behavior that is already in the schema and mentions the response envelope, which is not a parameter. Thus the baseline 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 opens with a specific verb and resource: 'Full-text search of email body and subject.' It clearly distinguishes itself from sibling tools by stating it does not filter by sender, recipient, or date, and explicitly names advanced_search as the alternative. This makes the tool's purpose and scope unambiguous.
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 usage guidance: 'Does not filter by sender, recipient, or date — use advanced_search for field-specific filtering.' This clearly tells the agent when not to use this tool and which alternative to choose. It also notes the draft-inclusion behavior, further clarifying expected usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_emails_metadataA
Same as search_emails (free-text search across subject and body) but returns ONLY metadata on each match — id, threadId, subject, from, to, replyTo, receivedAt, hasAttachment, keywords. The query still searches body text on the server side; only the result envelopes come back, never preview or body excerpts. Use when a content match is required (e.g. "find all messages mentioning X") but the matches must not surface body fragments to the caller. When the server reports a total match count, results are wrapped in a {"total", "items"} JSON envelope; otherwise a bare JSON array is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default: 20) | |
| query | Yes | Search query string | |
| ascending | No | Sort oldest first instead of newest first (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral burden and excels: it discloses that the search is server-side against body text, that only metadata envelopes are returned (never body excerpts), and that the JSON shape varies (envelope vs bare array) based on server-reported match counts. This is rich, accurate, and goes beyond minimal requirements.
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 moderately sized but every sentence serves a purpose: establishing the sibling relationship, clarifying the metadata-only output, providing a use case, and explaining the conditional envelope format. It is front-loaded with the most important distinction and avoids fluff, though it could be tighter by removing redundant phrases like 'never preview or body excerpts' after already saying 'only metadata'.
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 and no annotations, the description is remarkably complete: it covers purpose, relationship to sibling search_emails, when to use it, what it returns, and the dynamic JSON envelope. It does not mention pagination behavior or potential errors, but for a straightforward search/metadata tool, the provided context is sufficient for a typical agent to select and invoke it 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?
The input schema covers all three parameters (query, limit, ascending) with basic descriptions, giving 100% schema coverage. The tool description adds meaningful behavioral context for the query parameter (it searches body text on the server side), but it doesn't provide additional per-parameter semantics beyond what the schema already offers. This meets the baseline for high schema coverage.
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 opens with 'Same as search_emails (free-text search across subject and body) but returns ONLY metadata on each match', clearly specifying the action, resource, and scope while distinguishing it from its sibling search_emails. It also enumerates the exact fields returned, leaving no ambiguity about what the tool does.
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 states when to use the tool: 'Use when a content match is required … but the matches must not surface body fragments to the caller.' It also references search_emails as the alternative for full-text results. However, it does not explicitly contrast with other metadata-related siblings like advanced_search_metadata, so it stops short of comprehensive alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_draftA
Send an existing draft email. The draft must have recipients (to/cc/bcc) and a from address. After sending, the email is moved to the Sent folder and the draft keyword is removed.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | The ID of the draft email to send |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It discloses that after sending, the email is moved to Sent folder and draft keyword removed. This covers the key behavioral effects, though error handling is not mentioned.
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 with no wasted words. Front-loaded with the core action, then conditions and aftermath. Efficient and clear.
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 parameter and no output schema, the description covers purpose, prerequisites, and outcome. 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?
Only one parameter with 100% schema coverage. The description does not add meaning beyond the schema, but the prerequisite conditions indirectly clarify the parameter's context. 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?
The description clearly states the verb 'Send' and resource 'existing draft email', distinguishing it from siblings like 'create_draft' and 'send_email'. It also specifies prerequisites (recipients and from address).
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 prerequisites (draft must have recipients and from address), guiding when to use. It does not explicitly name alternatives, but the context from sibling tools implies when not to use (e.g., use 'send_email' for non-drafts).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_emailC
Send an email
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC email addresses (optional) | |
| to | Yes | Recipient email addresses (array of strings, or a comma-separated string) | |
| bcc | No | BCC email addresses (optional) | |
| from | No | Sender email address (optional, defaults to account primary email) | |
| replyTo | No | Reply-To email addresses (replies go here instead of to the sender) | |
| subject | Yes | Email subject | |
| htmlBody | No | HTML body (optional) | |
| textBody | No | Plain text body (optional) | |
| inReplyTo | No | Message-ID(s) of the email being replied to (optional, for threading) | |
| mailboxId | No | Mailbox ID to save the email to (optional, defaults to Drafts folder) | |
| references | No | Full reference chain of Message-IDs (optional, for threading) | |
| attachments | No | Files to attach. Each entry must use EXACTLY ONE source: localPath (a file inside the configured download directory), emailId + attachmentId (re-attach an attachment from an existing email — no bytes are copied), or blobId (an already-uploaded JMAP blob). Optional name/type override the inferred filename and MIME type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the burden falls entirely on the description. 'Send an email' discloses no behavioral traits: no mention of side effects (e.g., saving to Sent folder), authentication requirements, rate limits, or error behavior. The description merely repeats the tool name without adding any contextual detail.
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 a single sentence with no waste, but it is under-specified. While it earns its place by stating the core action, it provides no additional useful information. It is neither verbose nor helpfully detailed, placing it at the minimum viable level.
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 12 parameters, no output schema, and no annotations, the description is far too minimal. It fails to explain what happens after sending, how to handle attachments (despite schema details), whether it is immediate, or expected return behavior. The lack of context makes it difficult for an agent to anticipate consequences, so it is incomplete.
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 schema provides 100% coverage of the 12 parameters with clear descriptions, including details like the 'attachments' object's EXACTLY ONE source constraint. Since the description adds no parameter information itself, the baseline of 3 applies. The schema carries the full semantic weight, so the description's lack of parameter detail is not a significant penalty.
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 'Send an email' clearly states the action (send) and resource (email), making the core purpose unambiguous. However, it does not differentiate from sibling tools like send_draft or reply_email, which are both send-like operations. Still, the basic purpose is clear.
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?
There is no guidance on when to use this tool versus alternatives such as reply_email, send_draft, or create_draft. The description provides no context for distinguishing between direct sending and other email operations, leaving the agent to infer usage from the tool name.
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 operations by finding recent emails and performing safe operations (mark read/unread)
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of emails to test with (default: 3, max: 10) | |
| dryRun | No | If true, only shows what would be done without making changes (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states 'safe operations (mark read/unread)' but does not disclose what happens when dryRun is false, whether changes are permanent, or any limits beyond the schema. More detail on the test's actual effect would improve transparency.
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?
Single sentence, front-loaded with key action, no redundant words. Efficient and to the point.
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?
No output schema exists, so the description should explain the test's output (e.g., what is returned). It does not mention return values, success/failure indicators, or how results relate to sibling bulk tools. This is a significant gap for a test 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 coverage is 100% and both parameters (dryRun, limit) are well described in the schema. The description adds no 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 tool tests bulk operations by finding recent emails and performing safe operations like mark read/unread. It distinguishes itself from sibling bulk tools (e.g., bulk_mark_read, bulk_delete) by being a test tool, not the actual 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 implies use for testing, but lacks explicit guidance on when to use versus alternatives like bulk_mark_read or when not to use. No exclusions or prerequisites are mentioned, leaving the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_calendar_eventA
Update an existing calendar event. Preserves all existing data (attendees, reminders, recurrence rules, etc.) not being changed. Omit a field to leave it unchanged; passing an empty/whitespace string for title, description, or location is rejected (use clearFields to delete description/location). Floating times preserve the original timezone; explicit UTC/offset times convert to UTC. WARNING: providing participants replaces ALL existing attendee data (acceptance status, roles, etc.). participants: [] removes all attendees.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | New end time in ISO 8601 format. DTEND is exclusive per RFC 5545 | |
| start | No | New start time in ISO 8601 format. Floating times (no Z/offset) preserve original timezone | |
| title | No | New event title | |
| eventId | Yes | ID of the event to update | |
| location | No | New event location | |
| clearFields | No | Property names to delete from the event. Allowed: description, location. Cannot also pass the same field as a value. | |
| description | No | New event description | |
| participants | No | Replaces ALL existing attendees. Empty array removes all attendees. Omit to preserve existing attendees. | |
| confirmRecurring | No | Required when changing start/end on a recurring event with exceptions. Acknowledges that orphaned exception overrides will be removed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It fully discloses key behaviors: preserving unchanging fields, rejecting empty strings for title/description/location, timezone handling, participant replacement, and the effect of clearFields. This is comprehensive.
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 a single paragraph that is concise but dense. It is front-loaded with the core purpose. While effective, it could benefit from bullet points for improved readability.
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 has 9 parameters and no output schema, the description covers essential behaviors and warnings. It provides enough context for correct invocation, though some details about response or error states are omitted.
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 significant value beyond schema by explaining timezone behavior, participant replacement semantics, and clearFields constraints. This justifies an above-baseline score.
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 'Update an existing calendar event' with a specific verb and resource. It clearly distinguishes from sibling tools like create_calendar_event and delete_calendar_event.
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 explains when to use the tool (e.g., for updating events) and provides warnings against misuse, such as the need for confirmRecurring on recurring events. However, it does not explicitly list alternative tools for specific scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_contactA
Update an existing contact. Each provided field WHOLLY REPLACES the stored value (e.g. emails: [] removes all emails) — unspecified fields are left untouched. Requires read-write contacts scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Structured name; provide full and/or given/surname | |
| notes | No | Free-form note (replaces the existing note on update) | |
| emails | No | Email addresses (replaces ALL existing emails on update; [] clears) | |
| phones | No | Phone numbers (replaces ALL existing phones on update) | |
| addresses | No | Postal addresses as free-form text (replaces ALL existing on update) | |
| contactId | Yes | ID of the contact to update | |
| expectState | No | Optional JMAP state precondition (ifInState); update fails with stateMismatch if contacts changed since this state |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full weight for behavioral disclosure. It explicitly explains the replacement semantics ('Each provided field WHOLLY REPLACES the stored value') and provides a concrete example, while also stating the required read-write scope. It is transparent about partial updates and clearing behavior, though it does not detail error cases or response format.
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 with no wasted words, front-loading the primary purpose and then adding essential behavioral context. It is an ideal length for a mutation tool with this complexity.
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 complexity (7 parameters, nested objects, arrays, no output schema, no annotations), the description covers the core behavioral context: partial update semantics, array clearing, scope requirement, and what fields remain untouched. It lacks explicit mention of error handling or return value, but these are not expected given the schema and overall tool set.
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 schema descriptions cover 100% of parameters, so the baseline is 3. The description adds a cross-cutting semantic note about field replacement, but this generalizes what is already stated in individual parameter descriptions. It does not introduce significant new meaning 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 the tool's function with a specific verb and resource: 'Update an existing contact.' This distinguishes it from sibling tools like create_contact, delete_contact, and get_contact, which have different purposes.
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 clear context for when to use the tool (updating an existing contact) and notes the required scope, implying it is not for creating or deleting contacts. However, it does not explicitly mention alternatives or exclusions, so it falls short of a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v1.13.4- Added
create_contact - Changed
create_draft1 field changed- added
Input schema / properties / attachmentsAdded value: +{ + "description": "Files to attach. Each entry must use EXACTLY ONE source: localPath (a file inside the configured download directory), emailId + attachmentId (re-attach an attachment from an existing email — no bytes are copied), or blobId (an already-uploaded JMAP blob). Optional name/type override the inferred filename and MIME type.", + "items": { + "properties": { + "attachmentId": { + "description": "Attachment partId, blobId, or zero-based index within the source email", + "type": "string" + }, + "blobId": { + "description": "An existing blob ID in this account", + "type": "string" + }, + "emailId": { + "description": "Source email ID (use with attachmentId)", + "type": "string" + }, + "localPath": { + "description": "Path to a file within FASTMAIL_DOWNLOAD_DIR (relative paths resolve against it)", + "type": "string" + }, + "name": { + "description": "Override the attachment filename", + "type": "string" + }, + "type": { + "description": "Override the MIME type", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +}
- Added
delete_contact - Changed
edit_draft1 field changed- added
Input schema / properties / attachmentsAdded value: +{ + "description": "Files to attach. Each entry must use EXACTLY ONE source: localPath (a file inside the configured download directory), emailId + attachmentId (re-attach an attachment from an existing email — no bytes are copied), or blobId (an already-uploaded JMAP blob). Optional name/type override the inferred filename and MIME type.", + "items": { + "properties": { + "attachmentId": { + "description": "Attachment partId, blobId, or zero-based index within the source email", + "type": "string" + }, + "blobId": { + "description": "An existing blob ID in this account", + "type": "string" + }, + "emailId": { + "description": "Source email ID (use with attachmentId)", + "type": "string" + }, + "localPath": { + "description": "Path to a file within FASTMAIL_DOWNLOAD_DIR (relative paths resolve against it)", + "type": "string" + }, + "name": { + "description": "Override the attachment filename", + "type": "string" + }, + "type": { + "description": "Override the MIME type", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +}
- Changed
reply_email1 field changed- added
Input schema / properties / attachmentsAdded value: +{ + "description": "Files to attach. Each entry must use EXACTLY ONE source: localPath (a file inside the configured download directory), emailId + attachmentId (re-attach an attachment from an existing email — no bytes are copied), or blobId (an already-uploaded JMAP blob). Optional name/type override the inferred filename and MIME type.", + "items": { + "properties": { + "attachmentId": { + "description": "Attachment partId, blobId, or zero-based index within the source email", + "type": "string" + }, + "blobId": { + "description": "An existing blob ID in this account", + "type": "string" + }, + "emailId": { + "description": "Source email ID (use with attachmentId)", + "type": "string" + }, + "localPath": { + "description": "Path to a file within FASTMAIL_DOWNLOAD_DIR (relative paths resolve against it)", + "type": "string" + }, + "name": { + "description": "Override the attachment filename", + "type": "string" + }, + "type": { + "description": "Override the MIME type", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +}
- Added
save_attachment_to_webdav - Changed
send_email1 field changed- added
Input schema / properties / attachmentsAdded value: +{ + "description": "Files to attach. Each entry must use EXACTLY ONE source: localPath (a file inside the configured download directory), emailId + attachmentId (re-attach an attachment from an existing email — no bytes are copied), or blobId (an already-uploaded JMAP blob). Optional name/type override the inferred filename and MIME type.", + "items": { + "properties": { + "attachmentId": { + "description": "Attachment partId, blobId, or zero-based index within the source email", + "type": "string" + }, + "blobId": { + "description": "An existing blob ID in this account", + "type": "string" + }, + "emailId": { + "description": "Source email ID (use with attachmentId)", + "type": "string" + }, + "localPath": { + "description": "Path to a file within FASTMAIL_DOWNLOAD_DIR (relative paths resolve against it)", + "type": "string" + }, + "name": { + "description": "Override the attachment filename", + "type": "string" + }, + "type": { + "description": "Override the MIME type", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +}
- Added
update_contact
17 tool updates
v1.11.1- Changed
advanced_search3 fields changed- added
Input schema / properties / excludeMailboxIdsAdded value: +{ + "description": "Exclude emails that are members of ANY of these mailbox IDs (maps to JMAP inMailboxOtherThan). Useful for queries like \"in a parent label but not its archive sub-folder\". Combines cleanly with mailboxId / requiredMailboxIds.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / mailboxId / descriptionPrevious value: -"Search within specific mailbox"New value: +"Search within a single mailbox. For an intersection across multiple mailboxes (e.g. Inbox AND a label folder), use requiredMailboxIds instead." - added
Input schema / properties / requiredMailboxIdsAdded value: +{ + "description": "Require membership in ALL of these mailbox IDs (intersection / AND semantic). Use this for queries like \"in Inbox AND a label folder\" — pass both mailbox IDs in the array. If mailboxId is also passed, it is folded into the intersection (de-duplicated). JMAP cannot express multi-mailbox membership in a single FilterCondition, so this builds a FilterOperator AND over multiple inMailbox conditions on the server.", + "items": { + "type": "string" + }, + "type": "array" +}
- Added
advanced_search_metadata - Added
archive_email - Changed
create_calendar_event6 fields changed- changed
Input schema / properties / end / descriptionPrevious value: -"End time in ISO 8601 format"New value: +"End time in ISO 8601 format. For all-day events, DTEND is exclusive — a one-day event on April 1 requires end: 2026-04-02" - changed
Input schema / properties / participants / descriptionPrevious value: -"Event participants (optional)"New value: +"Event participants (optional). Automatically adds ORGANIZER from CalDAV username." - added
Input schema / properties / participants / items / properties / email / descriptionAdded value: +"Participant email address" - added
Input schema / properties / participants / items / properties / name / descriptionAdded value: +"Participant display name (optional)" - added
Input schema / properties / participants / items / requiredAdded value: +[ + "email" +] - changed
Input schema / properties / start / descriptionPrevious value: -"Start time in ISO 8601 format"New value: +"Start time in ISO 8601 format (e.g. 2026-04-07T14:00:00Z) or date-only for all-day events (e.g. 2026-04-07)"
- Added
create_mailbox - Added
delete_calendar_event - Changed
download_attachment1 field changed- changed
Input schema / properties / savePath / descriptionPrevious value: -"File path to save the attachment to. Paths are restricted to ~/Downloads/fastmail-mcp/ (configurable via FASTMAIL_DOWNLOAD_DIR). Path traversal outside this directory is rejected for security. Parent directories will be created automatically."New value: +"File path to save the attachment to. May be absolute or relative; relative paths resolve against ~/Downloads/fastmail-mcp/ (configurable via FASTMAIL_DOWNLOAD_DIR), so a bare filename lands there in one step. Absolute paths must fall within that directory; traversal or symlink escape outside it is rejected for security. To save directly into your own location, set FASTMAIL_DOWNLOAD_DIR to that root. Parent directories will be created automatically."
- Added
get_email_metadata - Added
get_mailbox_by_name - Changed
get_recent_emails2 fields changed- removed
Input schema / properties / mailboxName / defaultRemoved value: -"inbox" - changed
Input schema / properties / mailboxName / descriptionPrevious value: -"Mailbox to search (default: inbox)"New value: +"Mailbox to search (optional; when omitted, all mailboxes except Trash and Spam are searched)"
- Changed
get_thread1 field changed- added
Input schema / properties / includeDraftsAdded value: +{ + "description": "Include draft messages in the thread (default: false, drafts excluded).", + "type": "boolean" +}
- Added
get_thread_metadata - Added
list_emails_metadata - Changed
list_mailboxes2 fields changed- added
Input schema / properties / parentIdAdded value: +{ + "description": "Filter to direct children of this mailbox ID. Pass null for top-level mailboxes. Filter is applied client-side after Mailbox/get.", + "type": [ + "string", + "null" + ] +} - added
Input schema / properties / propertiesAdded value: +{ + "description": "JMAP Mailbox properties to return (e.g. [\"id\",\"name\",\"parentId\"]). Default: all properties. The slim form roughly halves payload size on large accounts.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
search_emails2 fields changed- added
Input schema / properties / excludeDraftsAdded value: +{ + "description": "Omit draft messages from results (default: false, drafts included). Filtered server-side via the $draft keyword.", + "type": "boolean" +} - changed
Input schema / properties / query / descriptionPrevious value: -"Search query string"New value: +"Text to search for in email body and subject lines"
- Added
search_emails_metadata - Added
update_calendar_event
17 tool updates
v1.8.1- Added
add_labels - Changed
advanced_search3 fields changed- added
Input schema / properties / ascendingAdded value: +{ + "description": "Sort oldest first instead of newest first (default: false)", + "type": "boolean" +} - added
Input schema / properties / isPinnedAdded value: +{ + "description": "Filter pinned emails", + "type": "boolean" +} - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +[ + "number", + "string" +]
- Added
bulk_add_labels - Added
bulk_pin - Added
bulk_remove_labels - Added
create_draft - Changed
download_attachment1 field changed- added
Input schema / properties / savePathAdded value: +{ + "description": "File path to save the attachment to. Paths are restricted to ~/Downloads/fastmail-mcp/ (configurable via FASTMAIL_DOWNLOAD_DIR). Path traversal outside this directory is rejected for security. Parent directories will be created automatically.", + "type": "string" +}
- Added
edit_draft - Changed
get_recent_emails2 fields changed- added
Input schema / properties / ascendingAdded value: +{ + "description": "Sort oldest first instead of newest first (default: false)", + "type": "boolean" +} - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +[ + "number", + "string" +]
- Changed
list_calendar_events2 fields changed- added
Input schema / properties / endDateAdded value: +{ + "description": "Filter events ending before this date (ISO 8601, e.g. 2026-03-30T00:00:00Z)", + "type": "string" +} - added
Input schema / properties / startDateAdded value: +{ + "description": "Filter events starting from this date (ISO 8601, e.g. 2026-03-23T00:00:00Z)", + "type": "string" +}
- Changed
list_emails2 fields changed- added
Input schema / properties / ascendingAdded value: +{ + "description": "Sort oldest first instead of newest first (default: false)", + "type": "boolean" +} - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +[ + "number", + "string" +]
- Added
pin_email - Added
remove_labels - Added
reply_email - Changed
search_emails2 fields changed- added
Input schema / properties / ascendingAdded value: +{ + "description": "Sort oldest first instead of newest first (default: false)", + "type": "boolean" +} - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +[ + "number", + "string" +]
- Added
send_draft - Changed
send_email7 fields changed- added
Input schema / properties / inReplyToAdded value: +{ + "description": "Message-ID(s) of the email being replied to (optional, for threading)", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / referencesAdded value: +{ + "description": "Full reference chain of Message-IDs (optional, for threading)", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / replyToAdded value: +{ + "description": "Reply-To email addresses (replies go here instead of to the sender)", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / to / descriptionPrevious value: -"Recipient email addresses"New value: +"Recipient email addresses (array of strings, or a comma-separated string)" - removed
Input schema / properties / to / itemsRemoved value: -{ - "type": "string" -} - added
Input schema / properties / to / oneOfAdded value: +[ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string" + } +] - removed
Input schema / properties / to / typeRemoved value: -"array"
28 tool updates
v1.0.0- First observed
advanced_search - First observed
bulk_delete - First observed
bulk_mark_read - First observed
bulk_move - First observed
check_function_availability - First observed
create_calendar_event - First observed
delete_email - First observed
download_attachment - First observed
get_account_summary - First observed
get_calendar_event - First observed
get_contact - First observed
get_email - First observed
get_email_attachments - First observed
get_mailbox_stats - First observed
get_recent_emails - First observed
get_thread - First observed
list_calendar_events - First observed
list_calendars - First observed
list_contacts - First observed
list_emails - First observed
list_identities - First observed
list_mailboxes - First observed
mark_email_read - First observed
move_email - First observed
search_contacts - First observed
search_emails - First observed
send_email - First observed
test_bulk_operations
TDQS
Scored across 52 tools
Most tools are clearly distinct in purpose, with full-content vs metadata-only variants explicitly described as privacy-safe alternatives. However, the presence of multiple search tools (search_emails, advanced_search) and bulk operations creates potential for misselection if an agent doesn't read descriptions carefully.
The majority of tools follow a consistent verb_noun pattern (get_*, list_*, create_*, update_*, delete_*, bulk_*). Minor deviations like 'advanced_search' (adjective_noun) and 'get_recent_emails' (verb_adjective_noun) break the pattern, but the naming remains predictable and readable overall.
With 52 tools, the server is significantly over the recommended range for a typical MCP server. Many tools are near-duplicates (e.g., list_emails vs list_emails_metadata, various bulk_* operations) that could be consolidated into parameterized versions, making the surface area unnecessarily large.
The server offers comprehensive coverage across email (draft, send, search, threads, labels, attachments, bulk operations), contacts (full CRUD and search), calendars (full CRUD), and account management. Only minor gaps exist, such as identity modification or mailbox settings, but they do not impact common workflows.
Maintenance
Related MCP Connectors
Email inboxes and calendars for AI agents: send, receive, search, draft and schedule.
Email inboxes and calendars for AI agents: send, receive, search, draft and schedule.
- Lettio MCPOAutheu.lettio
Private, EU-hosted email for AI agents over JMAP: read, search, reply, organize, send.
Connect any mailbox to Claude, ChatGPT & AI: read, send, reply, schedule & search emails.
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.32 npm3MIT
- 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.5 npm9MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with Fastmail services, providing tools for comprehensive email management, contact searching, and calendar event coordination via the JMAP API. It supports advanced features like threaded conversations, attachment handling, and bulk mailbox operations through natural language.28MIT