Fastmail MCP Server
The Fastmail MCP Server provides a Model Context Protocol interface to Fastmail's JMAP API, enabling AI assistants to manage email, contacts, and calendar data.
Email Management:
List mailboxes and get mailbox/account statistics
List, search (full-text and multi-criteria), filter, and retrieve emails; get recent emails and full conversation threads
Send emails (plain text/HTML, with To/CC/BCC); reply with proper threading; create and save drafts
Mark emails as read/unread; move between folders; add/remove labels; delete emails
List and download attachments
Bulk Operations:
Bulk mark, move, delete, or add/remove labels across multiple emails simultaneously
Dry-run mode for safely testing bulk operations
Contacts:
List all contacts; retrieve a specific contact by ID; search by name or email
Calendar:
List calendars and events; retrieve specific events by ID
Create new events with title, description, start/end times, location, and participants
Account & Utilities:
List available sending identities
Get full account summaries and statistics
Check which functions are available based on account permissions, with setup guidance
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Fastmail MCP Servershow me my 5 most recent emails"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Fastmail MCP Server (Unofficial)
An unofficial Model Context Protocol (MCP) server that provides access to the Fastmail API, enabling AI assistants to interact with email, contacts, and calendar data.
Disclaimer: This is a community project. It is not affiliated with, endorsed by, or supported by Fastmail. "Fastmail" is a trademark of Fastmail Pty Ltd; it is used here only to describe compatibility with their public JMAP/CalDAV/WebDAV APIs. Use at your own risk under the terms of the project license.
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, edit, and send email drafts (with or without threading)
Email management: mark read/unread, delete, move between folders
Advanced Email Features
Attachment Handling: List, download, and send attachments; save attachments straight to WebDAV cloud storage
Privacy-lean metadata tools: Metadata-only variants of list/search/thread tools (no body content)
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
Create, update, and delete contacts (JMAP ContactCard/set; requires an API token with read-write contacts scope)
Calendar Operations
List, get, create, update, and delete calendar events (via CalDAV)
All-day and timed events, participants, recurrence-aware updates
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, # each with an optional regional prefix (phl.api.fastmail.com, # phl-www.fastmailusercontent.com) as returned by JMAP session discovery. # 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/). # download_attachment savePaths are confined to this directory; set it to the root # you want attachments saved under to write there directly in one step. export FASTMAIL_DOWNLOAD_DIR="/path/to/your/downloads"
Running the Server
Start the MCP server:
npm startFor development with auto-reload:
npm run devRun from a clone
git clone https://github.com/MadLlama25/fastmail-mcp && cd fastmail-mcp
npm install && npm run build
FASTMAIL_API_TOKEN="your_token" node dist/index.jsNote:
npx github:MadLlama25/fastmail-mcpdoes not work on npm 10 (a known npmGitFetcherbug). Use the clone above, or install the packaged Desktop Extension.
Install 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) — required
Fastmail Base URL: leave blank to use
https://api.fastmail.com(default)Download Directory: leave blank for
~/Downloads/fastmail-mcp/CalDAV Username / Password / Display Name: optional — required for calendar tools (use an app-specific password; see CalDAV Calendar Support)
WebDAV URL / Username / Password: optional — required for
save_attachment_to_webdav(see WebDAV file storage)
Use any of the tools (e.g.
get_recent_emails).
Available Tools (52 Total)
Response shape for list/search tools: the query tools (list_emails, list_emails_metadata, search_emails, search_emails_metadata, get_recent_emails, advanced_search, advanced_search_metadata, list_contacts, search_contacts) return a {"total", "items"} JSON envelope — total is the server-reported match count, items the returned page. When the server reports no total, a bare array is returned.
🎯 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. On accounts with many mailboxes the full output can be large — pass
propertiesfor a slim view.Parameters:
properties(optional array of fields to return),parentId(optional; only children of this mailbox,nullfor top level)
get_mailbox_by_name: Look up a mailbox by its full path from the root (e.g.
Inbox/Receipts)Parameters:
path(required)
create_mailbox: Create a new mailbox (folder/label)
Parameters:
name(required),parentId(optional, omit or null for top level)
list_emails: List emails from a specific mailbox or all mailboxes
Parameters:
mailboxId(optional),limit(default: 20, max: 100),ascending(optional, oldest first)
list_emails_metadata: List emails from a mailbox, metadata only (headers, no body content)
Parameters:
mailboxId(optional),limit(default: 20, max: 100),ascending(optional, oldest first)
get_email: Get a specific email by ID
Parameters:
emailId(required)
get_email_metadata: Get a specific email's metadata only (allowlisted headers, no body)
Parameters:
emailId(required)
send_email: Send an email (supports threading via optional
inReplyToandreferencesheaders)Parameters:
to(required — array or comma-separated string),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),attachments(optional array — see Email attachments on send)
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),attachments(optional array — see Email attachments on send)
create_draft: Create an email draft (at least one of to/subject/body/attachments required; supports threading headers for reply drafts)
Parameters:
to(optional array),cc(optional array),bcc(optional array),from(optional),mailboxId(optional),subject(optional),textBody(optional),htmlBody(optional),replyTo(optional array),inReplyTo(optional array),references(optional array),attachments(optional array — see Email attachments on send)
edit_draft: Edit an existing draft in place — only provided fields change; existing attachments are preserved
Parameters:
emailId(required),to,cc,bcc,from,subject,textBody,htmlBody,replyTo,attachments(all optional)
send_draft: Send an existing draft
Parameters:
emailId(required)
search_emails: Search emails by content
Parameters:
query(required),limit(default: 20, max: 100),ascending(optional, oldest first),excludeDrafts(optional, omit draft messages)Drafts are included by default. Set
excludeDrafts: trueto filter them out server-side.Searches all mailboxes including Trash and Spam. For cleanup/verification flows, exclude the Trash mailbox explicitly (e.g.
advanced_searchwithexcludeMailboxIds) rather than trusting a bare search count.
get_recent_emails: Get the most recent emails (inspired by JMAP-Samples top-ten)
Parameters:
limit(default: 10, max: 50),mailboxName(optional),ascending(optional, oldest first)When
mailboxNameis omitted, all mailboxes are searched except Trash and Spam. Pass a mailbox name (e.g.'inbox','sent') to scope to one folder.
search_emails_metadata: Search emails by content, returning metadata only
Parameters:
query(required),limit(default: 20, max: 100),ascending(optional, oldest first)
mark_email_read: Mark an email as read or unread
Parameters:
emailId(required),read(default: true)
pin_email: Pin or unpin an email
Parameters:
emailId(required),pinned(default: true)
archive_email: Archive an email — moves it and marks it read in one atomic step
Parameters:
emailId(required),targetMailboxId(required)
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)savePathmay be absolute or relative. Relative paths (including a bare filename) resolve against the download directory, so an attachment lands there in one step. Absolute paths must fall within that directory; traversal or symlink escape outside it is rejected. To save directly into your own location, setFASTMAIL_DOWNLOAD_DIRto that root — confinement stays on, scoped to the directory you choose.
save_attachment_to_webdav: Save an attachment directly to WebDAV cloud storage (Fastmail Files, Nextcloud, ...) without touching local disk
Parameters:
emailId(required),attachmentId(required),remotePath(required, relative),overwrite(default false),createParents(default true)The storage server and credentials come from
FASTMAIL_WEBDAV_*env config; the tool only chooses the relative path beneath that base. Existing files are never replaced unlessoverwrite: true.
advanced_search: Advanced email search with multiple criteria
Parameters:
query(optional),from(optional),to(optional),subject(optional),hasAttachment(optional),isUnread(optional),isPinned(optional),mailboxId(optional),requiredMailboxIds(optional array — email must be in ALL of these),excludeMailboxIds(optional array — exclude emails in any of these),after(optional),before(optional),limit(default: 50, max: 100),ascending(optional, oldest first)Like
search_emails, searches all mailboxes including Trash and Spam — scope withmailboxId/excludeMailboxIdswhen that matters. (get_recent_emailsis the one that excludes Trash/Spam by default.)
advanced_search_metadata: Same filters as
advanced_search, metadata-only results (no body content)get_thread: Get all emails in a conversation thread
Parameters:
threadId(required),includeDrafts(optional, include in-progress drafts)Draft messages are excluded by default (an in-progress reply is noise when reading a conversation). Set
includeDrafts: trueto include them. Drafts are identified by the$draftkeyword, so the asymmetry withsearch_emails(which includes drafts by default) is deliberate: a search should still find everything you've written.
get_thread_metadata: Get all emails in a thread, metadata only. Also accepts an email ID and resolves its parent thread.
Parameters:
threadId(required),includeDrafts(optional)
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_pin: Pin or unpin multiple emails
Parameters:
emailIds(required array),pinned(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, max: 200)
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, max: 100)
create_contact: Create a new contact (requires read-write contacts scope on the API token)
Parameters:
name{given, surname, full},emails[{address, label}],phones[{number, label}],addresses[{full, label}],notes,addressBookId(all optional, but a name or one email is required)
update_contact: Update an existing contact — each provided field wholly replaces the stored value (
emails: []removes all emails); unspecified fields are untouchedParameters:
contactId(required), same fields as create,expectState(optional JMAP state precondition)
delete_contact: Permanently delete a contact (cannot be undone)
Parameters:
contactId(required),expectState(optional)
Calendar Tools
list_calendars: List all calendars
list_calendar_events: List calendar events (core fields only — no participants for token efficiency)
Parameters:
calendarId(optional),startDate(optional, ISO 8601),endDate(optional, ISO 8601),limit(default: 50, max: 500)
get_calendar_event: Get a specific calendar event by ID. Returns organizer and participants when available.
Parameters:
eventId(required)
create_calendar_event: 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 needsend: "2026-04-02".Parameters:
calendarId(required),title(required),description(optional),start(required, ISO 8601 or date-only),end(required, ISO 8601 or date-only),location(optional),participants(optional array of{email, name?})
update_calendar_event: Patch 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 or whitespace-only string for
title,description, orlocationis rejected (it won't silently blank the property). To deletedescriptionorlocation, list them inclearFields. Floating times (no Z/offset) preserve the original timezone. WARNING: providingparticipantsreplaces ALL existing attendee data;participants: []removes all attendees (and the now-orphaned ORGANIZER).Parameters:
eventId(required),title,description,start,end,location,participants(array of{email, name?}),clearFields(array of"description"/"location"to delete),confirmRecurring(boolean)
delete_calendar_event: Delete a calendar event
Parameters:
eventId(required)
Calendar known limitations
Recurring events: Only "all events" modification is supported (master VEVENT). "This event only" or "this and future events" are not supported. Changing start/end on recurring events with exception overrides requires
confirmRecurring: true— orphaned exceptions are pruned to prevent server errors.Attendee parameters: RSVP, ROLE, CUTYPE and other attendee parameters are parsed on read but not settable on create/update — only
emailandnameare accepted.
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). Calendar tools run over CalDAV, so calendar is reported available when CalDAV credentials are configured, regardless of the JMAP calendar capability.
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. All calendar tools use CalDAV directly.
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" # Optional: display name for ORGANIZER when creating events with participants export FASTMAIL_CALDAV_DISPLAY_NAME="Your Name"
When these variables are set, all calendar tools are available. When they are not set, calendar tools will return an error with setup instructions.
WebDAV file storage (optional)
save_attachment_to_webdav saves attachments straight to cloud storage. Configure the target (never supplied by tools at runtime — this is deliberate, so a misbehaving caller cannot redirect uploads):
# Fastmail Files:
export FASTMAIL_WEBDAV_URL="https://myfiles.fastmail.com/"
export FASTMAIL_WEBDAV_USERNAME="your-email@fastmail.com"
export FASTMAIL_WEBDAV_PASSWORD="app-password-with-files-scope"
# ...or any WebDAV server, e.g. Nextcloud:
# export FASTMAIL_WEBDAV_URL="https://cloud.example.com/remote.php/dav/files/USERNAME/"The URL must be HTTPS. Note: Fastmail Files ignores the WebDAV If-None-Match precondition, so the tool performs an explicit existence check before non-overwrite uploads.
Email attachments on send
send_email, create_draft, edit_draft, and reply_email accept an attachments array. Each entry uses exactly one source:
{ "localPath": "report.pdf" }— a file insideFASTMAIL_DOWNLOAD_DIR(same confinement as downloads){ "emailId": "...", "attachmentId": "..." }— re-attach from an existing email (zero-copy: no bytes are transferred){ "blobId": "...", "name": "...", "type": "..." }— an already-uploaded JMAP blob
Uploads respect the server's maxSizeUpload (~50 MB on Fastmail). Editing a draft preserves its existing attachments.
Contacts write scope
create_contact / update_contact / delete_contact need the API token to have read-write contacts scope (Settings → Privacy & Security → API tokens). Read-only tokens keep the three read tools working and fail writes with a forbidden error.
Development
Project Structure
src/
├── index.ts # Main MCP server implementation
├── auth.ts # Authentication handling
├── jmap-client.ts # JMAP client wrapper
├── contacts-calendar.ts # Contacts extensions (JMAP)
├── caldav-client.ts # CalDAV calendar client (the calendar path — JMAP calendars are not available)
├── webdav-files-client.ts # WebDAV file storage client (save_attachment_to_webdav)
├── url-validation.ts # Base-URL allowlist / HTTPS validation
├── coerce.ts # Input coercion helpers
└── *.test.ts # Unit tests (colocated)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 or later (any current release includes the fix). This was caused by incomplete JMAP response validation that surfaced after the MCP SDK v1.x upgrade added stricter result checking.
Calendar Not Working?
Calendar tools run over CalDAV, not JMAP. If they return "CalDAV not configured", set FASTMAIL_CALDAV_USERNAME and FASTMAIL_CALDAV_PASSWORD (see CalDAV Calendar Support).
Contacts Not Working?
If contacts functions return "Forbidden" errors:
API Token Scope: writes (
create_contact/update_contact/delete_contact) need read-write contacts scope (see Contacts write scope)Account Plan: the contacts API may require certain Fastmail plans
Contact not found / Calendar event not found errors mean the ID is stale — re-list and retry.
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?
With no annotations, the description carries full burden. It discloses that existing labels are preserved, which is useful, but lacks details on idempotency, permissions, or error states.
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 purpose and constraint.
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 additive operation with only 2 parameters fully described in schema, the description is mostly sufficient. Could include examples or edge cases, but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds no extra semantics beyond the schema, just restates the purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (add labels) and the resource (email), with the specific constraint 'without removing existing ones', distinguishing it from siblings 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 implies usage for adding labels without removal, but does not explicitly state when to use this tool vs alternatives like 'bulk_add_labels' or 'remove_labels', leaving room for ambiguity.
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_labelsB
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 are provided, and the description fails to disclose critical behavioral traits such as error handling, idempotency, or whether the operation is atomic. For a bulk mutation tool, this is insufficient.
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 waste, but could be expanded slightly to include key usage 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 the lack of output schema and annotations, the description is too sparse. It omits important details for a bulk operation, such as batch size limits, behavior on partial failures, or asynchronous nature.
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 both parameters, so the description adds no additional meaning beyond the schema. 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 verb (add), resource (labels), and scope (multiple emails simultaneously), distinguishing it from the singular 'add_labels' 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?
The description implies usage for batch label additions but provides no explicit guidance on when to use this vs. alternatives like 'add_labels', nor any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_deleteB
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?
Lacking annotations, the description only says 'move to trash' without clarifying permanence, reversibility, or side effects. It does not address limits on batch size or what happens if some IDs are invalid.
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. It is front-loaded and efficient, though lacks additional structure or examples.
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 the basic purpose. However, it omits usage context like error handling or typical use cases, making it minimally 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 description adds no extra meaning beyond the schema. The baseline of 3 is appropriate as the description does not enrich parameter understanding.
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 multiple emails') and specifies the result ('move to trash'), using a specific verb and resource. It distinguishes from sibling tools like 'delete_email' (single) and 'bulk_move' (different destination).
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 such as 'delete_email' for single deletions or 'bulk_move' for moving to a different folder. The description does not mention prerequisites or context.
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 carries full burden. It only states the basic operation but fails to disclose potential failure modes, atomicity, or any side effects such as error handling for invalid email IDs.
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 of 5 words, highly concise with no unnecessary information. It front-loads the 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 absence of an output schema and annotations, the description fails to specify return values, error states, or any additional context needed for a bulk operation, making it 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 input schema provides 100% coverage with descriptions for both parameters. The description adds no extra meaning beyond restating the read/unread functionality, so 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 clearly states the action (mark), resource (emails), and scope (multiple, read/unread). It effectively distinguishes itself from the sibling 'mark_email_read' tool by specifying 'multiple' 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?
No explicit guidance is provided on when to use this tool versus alternatives. While the name implies bulk operations, the description does not mention when to prefer this over 'mark_email_read' or other bulk tools.
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 are provided, and the description does not disclose potential behavioral traits like authentication needs, whether the operation is destructive, or error handling for batch operations (e.g., partial failures).
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 that is front-loaded. While efficient, it lacks structural elements like prerequisites or return values, which could be added without increasing verbosity.
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 with no output schema and no annotations, the description is minimally adequate. However, it fails to address batch-specific considerations such as atomicity limits or error handling, leaving gaps for an AI 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?
Schema coverage is 100%, so the schema already documents both parameters. The description adds no additional meaning beyond what is in the schema, meeting the baseline without extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states action (move), object (multiple emails), and destination (a mailbox). However, it does not explicitly distinguish from sibling tools like 'move_email' or 'bulk_delete', relying on the name for differentiation.
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 such as 'move_email' for single moves or 'bulk_delete' for deletion. The description offers no context for appropriate use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_pinB
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; description only states the action without detailing side effects, error handling, or permissions for bulk operations.
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 is concise and front-loaded, but could include more useful information without verbosity.
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?
Schema covers parameters, but no output schema or return value explanation; minimal context for a bulk 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?
Schema coverage is 100% with descriptions for both parameters; description adds no extra meaning 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 (pin/unpin) and resource (multiple emails), distinguishing it from the singular pin_email tool.
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 pin_email or other bulk operations. Missing context for appropriate use.
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?
No annotations exist, so the description bears full responsibility for behavioral disclosure. It only states 'simultaneously' without clarifying atomicity, partial failure handling, side effects, or authorization requirements. A score of 2 reflects minimal 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 a single, front-loaded sentence that conveys the core action without superfluous words. It is optimally 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 bulk mutation tool with no output schema, the description lacks essential context: return value (success/failure counts), error conditions, and behavioral guarantees. This is insufficient for an agent to invoke reliably.
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 already provides 100% coverage for both parameters (emailIds, mailboxIds). The description adds no additional meaning beyond the schema, meriting a baseline score 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 uses the specific verb 'Remove' and resource 'labels from multiple emails', clearly distinguishing it from siblings like 'remove_labels' (single email) and 'bulk_add_labels' (adding labels). The 'simultaneously' adverb further clarifies bulk operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool over alternatives such as 'remove_labels' for single emails or 'bulk_add_labels' for adding. No prerequisites or contextual hints are given.
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_emailA
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?
The description notes 'move to trash', implying the action is reversible, but does not explain if the operation is idempotent, requires special permissions, or any side effects. With no annotations, more detail would help, but the provided information is minimally adequate.
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 that conveys the core action and nuance. No unnecessary words or information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (one parameter, no output schema, no nested objects), the description is sufficient. It could mention whether the email is permanently deleted or recoverable, but the 'move to trash' clarification addresses a key concern.
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 with a description for the single parameter 'emailId'. The tool description adds no additional meaning beyond what the schema already provides, so 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 verb 'delete' and the resource 'email', and explicitly mentions the action 'move to trash', which distinguishes it from other email operations like permanent deletion or moving to a specific 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 is provided on when to use this tool versus alternatives like bulk_delete, move_email, or other deletion-related tools among the 19 siblings. The agent is left to infer usage without context.
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_summaryA
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?
No annotations are provided, and the description does not disclose whether the tool is read-only, destructive, or involves external side effects. The verb 'Get' suggests a read operation, but this is not explicitly stated.
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 wasted words. It efficiently conveys the core functionality.
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 parameters and no output schema, the description is minimal. It omits key details such as what statistics are included or whether the summary reflects real-time data. An agent may need more context to correctly interpret the result.
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 with 100% coverage. The description adds the context 'with statistics', providing slight semantic value beyond the schema. Baseline for zero parameters is 4.
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 tool name and description explicitly state that it retrieves an account summary with statistics, which is distinct from all sibling tools that focus on emails, contacts, or calendars. This leaves 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?
No explicit guidance on when or why to use this tool over alternatives. Since it is the only tool for account-level overview, usage is implied but not articulated.
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_contactA
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 provided, and description only states the action without behavioral context (e.g., read-only, error conditions, permissions). Minimal disclosure beyond the obvious.
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, front-loaded with the action and resource, 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?
Adequate for a simple get-by-ID operation with schema fully covering parameters; no output schema needed but could mention typical response or errors 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?
Schema coverage is 100% with one parameter described; description adds no extra meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'get' and resource 'specific contact by ID', distinguishing it from sibling tools like list_contacts (list all) and search_contacts (search).
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 like search_contacts or list_contacts; usage is implied but not clarified.
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?
With no annotations, the description carries full burden but only states a basic action. It fails to disclose behavioral traits such as retrieval scope (e.g., full email vs. headers), permissions, 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, concise sentence front-loaded with the action. Every word is necessary, and there is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple retrieval tool with one parameter and no output schema, the description is adequate but lacks details about the return structure (e.g., what fields are included) which 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?
Schema coverage is 100%, so the schema already defines the emailId parameter. The description adds no extra meaning beyond what the schema provides, meeting 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 'Get a specific email by ID' clearly states the verb (Get), resource (email), and identifier (ID), distinguishing it from sibling tools like list_emails or get_thread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like get_recent_emails or get_thread. The description is too brief to offer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_email_attachmentsA
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?
No annotations are provided, and the description only states the action without disclosing behavioral traits such as return format (metadata vs. content), pagination, authentication requirements, or side effects. For a read-only tool, this lack of transparency is a notable 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, direct sentence with no superfluous words. It efficiently conveys the core purpose 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?
Given the tool's simplicity (one parameter, no output schema), the description is mostly complete. However, it could be improved by specifying what information the list contains (e.g., attachment names, sizes) to reduce ambiguity.
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 already fully describes the one parameter ('emailId') with a clear description. The description does not add additional meaning beyond the schema, so it meets the baseline for 100% 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 clearly states the tool retrieves a list of attachments for a given email, using a specific verb and resource. It effectively distinguishes from sibling tools like 'download_attachment' which downloads a specific attachment, and 'get_email' which retrieves the email content itself.
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 (e.g., 'download_attachment' for individual attachments). It does not mention prerequisites or contexts where it is appropriate, leaving the agent to infer usage based solely on the purpose.
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_statsB
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?
No annotations provided. Description only states 'Get statistics', a read operation, but does not disclose behavior like defaults (e.g., when mailboxId omitted, it retrieves all mailboxes) or performance implications. Lacks depth beyond basic action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence of 7 words, very concise and front-loaded. However, could include the default behavior (all mailboxes) without much bloat. Efficient but slightly under-specified.
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 1 optional parameter and no output schema, the description is adequate but minimal. It does not mention return format or that it is read-only, which would help completeness. Just enough to understand purpose.
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% (1 parameter fully described). Description adds minimal extra meaning beyond schema: it implies the parameter is optional and relates to a single mailbox, but this is already in 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?
Description clearly states verb 'Get', resource 'mailbox statistics', and hints at specific statistics (unread count, total emails). It distinguishes from sibling tools like 'list_mailboxes' which list mailboxes rather than stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., 'list_mailboxes' for listing only, or 'get_email' for detailed email retrieval). No exclusions or prerequisites mentioned.
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_eventsB
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?
No annotations provided, so description must cover behavioral traits. It does not mention ordering, pagination, timezone handling, or what happens if no events exist. Only default limit is inferable from 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?
Single sentence without waste. However, it could include 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 4 parameters and no output schema or annotations, the description is too sparse. It does not clarify return format, default sorting, or event scope (future/past), leaving gaps for the 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?
Schema description coverage is 100%, so baseline is 3. The description adds no extra meaning beyond the schema's parameter descriptions, which are clear.
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 'List events from a calendar' clearly specifies the action (list) and resource (calendar events). It distinguishes from sibling tools like get_calendar_event (single event) and list_calendars (calendar list).
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 is provided. The description implies use for listing events, but lacks comparison to alternatives like get_calendar_event or guidance on parameter prerequisites.
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?
With no annotations, the description must disclose behavioral traits. It only states 'List all calendars', with no mention of being read-only, potential pagination, or any side effects. The agent cannot infer safety or resource impact from this text.
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 extremely concise (3 words) but sacrifices necessary context, such as what 'calendars' refers to or what the output contains. It is shorter than ideal for a tool that could benefit from brief behavioral notes.
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 parameterless tool with no output schema, the description adequately states the core function. However, it does not mention the return type or any constraints (e.g., all available calendars), leaving the agent to infer completeness from the name alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and the schema coverage is 100%, so the description need not add parameter details. Baseline 4 is appropriate as the description is not required to compensate for missing parameter info.
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 'List' and the resource 'all calendars', making the purpose obvious. However, it does not differentiate this tool from sibling listing tools like 'list_calendar_events' or 'list_contacts', which could cause 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. The description lacks any context about appropriate usage scenarios or exclusions.
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 carries full burden. Only states basic function, no details on safety (e.g., read-only), permissions, or return behavior beyond listing identities.
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 with no wasted words. Front-loaded information: action and subject.
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 zero-parameter tool, but lacks usage context to differentiate from sibling list tools. No output schema, but description covers basic purpose.
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, baseline is 4 per guidelines. Description adds meaning by explaining what identities are listed (sending email addresses).
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 tool lists sending identities, specifically email addresses for sending. This distinguishes it from sibling list tools like list_contacts or list_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?
No guidance on when to use this tool versus alternatives. Lacks when-not or exclusion criteria. Agent must infer usage from the name and description alone.
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_readC
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?
The description implies a write operation (changing email state) but lacks details on idempotency, side effects, required permissions, or reversibility. With no annotations, this minimal transparency is insufficient.
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 that is front-loaded and to the point. While efficient, it could be slightly expanded with context without losing brevity.
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 simplicity of the tool and lack of output schema, the description is too minimal. It does not explain common email semantics (e.g., what 'read' means or that it's undoable) or provide any contextual 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 coverage is 100% and both parameters have clear descriptions in the schema. The tool description adds no extra meaning beyond what the schema already provides, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Mark') and the resource ('an email') and specifies the possible states ('read or unread'). It is specific and distinct from siblings like 'bulk_mark_read' but could explicitly contrast with that to 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?
No guidance is provided on when to use this tool versus alternatives such as 'bulk_mark_read'. The description does not mention use cases or exclusions, leaving the agent without context for selection.
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, and the description does not disclose behavioral traits such as permissions needed, side effects (e.g., label handling), or whether the operation is reversible.
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 with a single sentence. It gets straight to the point but lacks structuring like prerequisites or post-conditions.
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 operation with 2 parameters, the description is minimally adequate. However, it does not explain return values or what happens to the original email (e.g., is it a copy or move?).
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 no additional meaning beyond the schema, so baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action (move) and resource (email) with a specific destination (different mailbox). It distinguishes from siblings like delete_email, bulk_move, and mark_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 does not mention any prerequisites, context, or scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pin_emailB
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 are provided, so the description should disclose behavioral traits. It only states the action without explaining what pinning does (e.g., affect folder visibility, ordering) or 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 extremely concise at 5 words, with no wasted text. It immediately conveys 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 simple toggle operation with clear schema, the description is mostly complete. It lacks indication of return values or success confirmation, but the tool is straightforward.
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 schema descriptions already explain the parameters. The description adds no extra meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Pin or unpin an email' clearly states the action and resource. It distinguishes from sibling 'bulk_pin' which handles multiple emails, so the single-email scope is implied.
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 when unpinning is preferred. The description does not mention context or preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_labelsB
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 lacks details on effects, reversibility, or permissions of the removal 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, but the single phrase could be considered under-specified; however, it is not 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?
Tool is simple and no output schema, but lacks differentiation from bulk_remove_labels and does not explain behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters, and description adds no extra meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'remove' and the resource 'labels (mailboxes) from an email', distinguishing it from sibling '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 guidance on when to use this tool versus alternatives like 'bulk_remove_labels' or prerequisites.
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 description carries full burden. It discloses post-send behavior (moved to Sent folder, draft keyword removed) and prerequisites. Lacks details on permissions, error states, or rate limits, but provides adequate basic 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?
Two sentences, no extraneous words. Efficiently communicates purpose, precondition, and behavioral outcome.
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 one-parameter tool without output schema, description covers purpose, prerequisite, and post-action effect. Could mention return values, but not required.
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?
Single parameter 'emailId' is fully described in input schema (100% coverage). Description adds no additional semantic information beyond the schema, so 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?
Description clearly states verb 'send' and resource 'draft email'. Provides specific precondition (must have recipients/from address) and distinguishes from related siblings like create_draft and send_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?
Explains when to use (sending an existing draft) and implicit when not to (if draft lacks recipients/from). Mentions result (moved to Sent, draft keyword removed). Could explicitly contrast with send_email, 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.
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_operationsB
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 provided. The description says 'safe operations' but does not clarify that when dryRun is false, actions actually modify emails. This omission is critical for a test 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?
A single, efficient sentence that conveys the core purpose. 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?
With no output schema and no annotations, the description is too brief. It lacks details about what 'test' means, success/error behavior, or how it differs from sibling bulk tools.
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 descriptions for dryRun and limit are present. The tool description adds context about finding recent emails and safe operations, but does not add 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 is for testing bulk operations by finding recent emails and performing safe operations like mark read/unread. It distinguishes from actual bulk tools by the 'test' intent, though it doesn't explicitly name a 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?
Implies use for testing before actual bulk operations, but does not explicitly state when to use this vs sibling tools like bulk_mark_read or bulk_add_labels. No when-not or alternatives mentioned.
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.
TDQS
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Connect any mailbox to Claude, ChatGPT & AI: read, send, reply, schedule & search emails.
Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.
AI email inbox and sending tools with attachments, search, live events, and webhooks.
Manage Gmail end-to-end: search, read, send, draft, label, and organize threads. Automate workflow…
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI-powered email management through FastMail's JMAP API with features like smart email analysis, automated organization, inbox zero automation, and intelligent reply generation. Supports advanced email operations, contact management, calendar integration, and hierarchical email organization systems.543MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to securely access and search Fastmail emails via the JMAP API. Supports searching emails, retrieving full email content, and listing mailboxes with read-only access using Fastmail API tokens.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI models to interact with Fastmail accounts via the JMAP API through the Model Context Protocol. It supports managing emails, accessing usage analytics, and performing account operations using secure token-based authentication.309MIT
- 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
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/MadLlama25/fastmail-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server