Skip to main content
Glama
MadLlama25

Fastmail MCP Server

by MadLlama25

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

  1. Clone or download this repository

  2. Install dependencies:

    npm install
  3. Build the project:

    npm run build

Configuration

  1. Get your Fastmail API token:

    • Log in to Fastmail web interface

    • Go to Settings → Privacy & Security

    • Find "Connected apps & API tokens" section

    • Click "Manage API tokens"

    • Click "New API token"

    • Copy the generated token

  2. Set environment variables:

    export FASTMAIL_API_TOKEN="your_api_token_here"
    # Optional: customize base URL (defaults to https://api.fastmail.com)
    # 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 start

For development with auto-reload:

npm run dev

Run 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.js

Note: npx github:MadLlama25/fastmail-mcp does not work on npm 10 (a known npm GitFetcher bug). 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.

  1. Build and pack:

    npm run build
    npx @anthropic-ai/dxt pack

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

  2. Install into Claude Desktop:

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

    • When prompted:

      • Fastmail API Token: paste your token (stored encrypted by Claude) — 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)

  3. 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 properties for a slim view.

    • Parameters: properties (optional array of fields to return), parentId (optional; only children of this mailbox, null for 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 inReplyTo and references headers)

    • 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=false to 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: true to filter them out server-side.

    • Searches all mailboxes including Trash and Spam. For cleanup/verification flows, exclude the Trash mailbox explicitly (e.g. advanced_search with excludeMailboxIds) 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 mailboxName is 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)

    • savePath may 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, set FASTMAIL_DOWNLOAD_DIR to 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 unless overwrite: 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 with mailboxId/excludeMailboxIds when that matters. (get_recent_emails is 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: true to include them. Drafts are identified by the $draft keyword, so the asymmetry with search_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 untouched

    • Parameters: 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 needs end: "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, or location is rejected (it won't silently blank the property). To delete description or location, list them in clearFields. Floating times (no Z/offset) preserve the original timezone. WARNING: providing participants replaces 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 email and name are 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

  1. 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)

  2. 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 inside FASTMAIL_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 build

Development Mode

npm run dev

License

MIT

Contributing

Contributions are welcome! Please ensure that:

  1. Code follows the existing style

  2. All functions are properly typed

  3. Error handling is implemented

  4. Documentation is updated for new features

Troubleshooting

Common Issues

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

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

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

  4. Calendar/Contacts "Forbidden" Errors: Use check_function_availability to 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:

  1. API Token Scope: writes (create_contact/update_contact/delete_contact) need read-write contacts scope (see Contacts write scope)

  2. 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 tools
add_labelsA

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

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

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description 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.

Purpose5/5

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.

Usage Guidelines3/5

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_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoFilter by recipient email
fromNoFilter by sender email
afterNoEmails after this date (ISO 8601)
limitNoMaximum results (default: 50)
queryNoText to search for in subject/body
beforeNoEmails before this date (ISO 8601)
subjectNoFilter by subject
isPinnedNoFilter pinned emails
isUnreadNoFilter unread emails
ascendingNoSort oldest first instead of newest first (default: false)
mailboxIdNoSearch within a single mailbox. For an intersection across multiple mailboxes (e.g. Inbox AND a label folder), use requiredMailboxIds instead.
hasAttachmentNoFilter emails with attachments
excludeMailboxIdsNoExclude 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.
requiredMailboxIdsNoRequire 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

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

The description provides explicit guidance: 'Use 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email to archive
targetMailboxIdYesID of the destination mailbox

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

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

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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

The input schema has 100% description coverage for 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.

Purpose5/5

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

The description clearly states the verb (add), 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.

Usage Guidelines3/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdsYesArray of email IDs to delete

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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

For a simple tool with one 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.

Parameters3/5

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

Schema description coverage is 100%, so the description 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.

Purpose5/5

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.

Usage Guidelines2/5

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

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

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the action (mark), 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.

Usage Guidelines2/5

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

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

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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

Schema coverage is 100%, so the schema already documents 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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
pinnedNotrue to pin, false to unpin
emailIdsYesArray of email IDs to pin/unpin

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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

Schema coverage is 100% with descriptions for both parameters; description adds no extra meaning beyond schema.

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

Purpose5/5

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

The description clearly states 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.

Usage Guidelines2/5

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

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

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesEnd time in ISO 8601 format. For all-day events, DTEND is exclusive — a one-day event on April 1 requires end: 2026-04-02
startYesStart time in ISO 8601 format (e.g. 2026-04-07T14:00:00Z) or date-only for all-day events (e.g. 2026-04-07)
titleYesEvent title
locationNoEvent location (optional)
calendarIdYesID of the calendar to create the event in
descriptionNoEvent description (optional)
participantsNoEvent participants (optional). Automatically adds ORGANIZER from CalDAV username.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

The description provides explicit guidance on when to use 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoStructured name; provide full and/or given/surname
notesNoFree-form note (replaces the existing note on update)
emailsNoEmail addresses (replaces ALL existing emails on update; [] clears)
phonesNoPhone numbers (replaces ALL existing phones on update)
addressesNoPostal addresses as free-form text (replaces ALL existing on update)
addressBookIdNoTarget address book id (default book when omitted)

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoCC email addresses (optional)
toNoRecipient email addresses (optional)
bccNoBCC email addresses (optional)
fromNoSender email address (optional, defaults to account primary email)
replyToNoReply-To email addresses (replies go here instead of to the sender)
subjectNoEmail subject (optional)
htmlBodyNoHTML body (optional)
textBodyNoPlain text body (optional)
inReplyToNoMessage-IDs to reply to (optional, for threading)
mailboxIdNoMailbox ID to save the draft to (optional, defaults to Drafts folder)
referencesNoMessage-IDs for References header (optional, for threading)
attachmentsNoFiles 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

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesLeaf name of the new mailbox (not a full path). Must not contain "/".
parentIdNoParent mailbox ID. Pass null (or omit) to create at top level.

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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

For a simple tool with 2 parameters and no output schema, the description covers 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
eventIdYesID of the event to delete

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contactIdYesID of the contact to delete
expectStateNoOptional JMAP state precondition (ifInState)

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email to delete

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email
savePathNoFile 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.
attachmentIdYesID of the attachment

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoUpdated CC email addresses (optional)
toNoUpdated recipient email addresses (optional, keeps existing if omitted)
bccNoUpdated BCC email addresses (optional)
fromNoUpdated sender email address (optional)
emailIdYesThe ID of the draft email to edit
replyToNoReply-To email addresses (replies go here instead of to the sender)
subjectNoUpdated email subject (optional)
htmlBodyNoUpdated HTML body (optional)
textBodyNoUpdated plain text body (optional)
attachmentsNoFiles 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

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventIdYesID of the event to retrieve

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
contactIdYesID of the contact to retrieve

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email to retrieve

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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

For a simple retrieval tool with one parameter and no output schema, the description 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.

Parameters3/5

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

Schema coverage is 100%, so the schema already 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.

Purpose5/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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

Given the tool's simplicity (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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email to retrieve metadata for

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

The input schema has 100% description coverage for 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.

Purpose5/5

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

The description clearly states the tool's function: 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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFull path from root, separated by "/" (e.g. "Inbox" or "Archive/2026/Suppliers/ExampleCo").

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.)

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

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of recent emails to retrieve (default: 10, max: 50)
ascendingNoSort oldest first instead of newest first (default: false)
mailboxNameNoMailbox to search (optional; when omitted, all mailboxes except Trash and Spam are searched)

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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

For a simple list tool with 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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the action ('Get'), 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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
threadIdYesID of the thread/conversation
includeDraftsNoInclude draft messages in the thread (default: false, drafts excluded).

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
threadIdYesID of the thread/conversation (an email ID is also accepted and will be resolved to its parent thread)

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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

Given no output schema, description 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of events to return (default: 50)
endDateNoFilter events ending before this date (ISO 8601, e.g. 2026-03-30T00:00:00Z)
startDateNoFilter events starting from this date (ISO 8601, e.g. 2026-03-23T00:00:00Z)
calendarIdNoID of the calendar (optional, defaults to all calendars)

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description 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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of contacts to return (default: 50)

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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

For a simple list tool with 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of emails to return (default: 20)
ascendingNoSort oldest first instead of newest first (default: false)
mailboxIdNoID of the mailbox to list emails from (optional, defaults to all)

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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

The tool has no output schema, 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.

Parameters3/5

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.

Purpose4/5

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

The description clearly states the tool's purpose 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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of emails to return (default: 20)
ascendingNoSort oldest first instead of newest first (default: false)
mailboxIdNoID of the mailbox to list emails from (optional, defaults to all)

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
parentIdNoFilter to direct children of this mailbox ID. Pass null for top-level mailboxes. Filter is applied client-side after Mailbox/get.
propertiesNoJMAP Mailbox properties to return (e.g. ["id","name","parentId"]). Default: all properties. The slim form roughly halves payload size on large accounts.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100% with descriptions for both parameters. 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.

Purpose5/5

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.

Usage Guidelines5/5

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

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

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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

The description clearly states the action ('Mark') and 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.

Usage Guidelines2/5

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

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

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the tool's 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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
pinnedNotrue to pin, false to unpin
emailIdYesID of the email to pin/unpin

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

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

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoCC email addresses (optional)
toNoRecipient email addresses (optional, defaults to the original sender)
bccNoBCC email addresses (optional)
fromNoSender email address (optional, defaults to account primary email)
sendNoWhether to send the reply immediately (default: true). Set to false to save as draft instead.
replyToNoReply-To email addresses (replies go here instead of to the sender)
htmlBodyNoHTML body (optional)
textBodyNoPlain text body (optional)
attachmentsNoFiles 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.
originalEmailIdYesID of the email to reply to

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesID of the email
overwriteNoReplace an existing remote file (default false: fail if it exists)
remotePathYesRelative 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.
attachmentIdYesAttachment partId, blobId, or zero-based index
createParentsNoCreate missing parent collections via MKCOL (default true)

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results (default: 20)
queryYesSearch query string

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results (default: 20)
queryYesText to search for in email body and subject lines
ascendingNoSort oldest first instead of newest first (default: false)
excludeDraftsNoOmit draft messages from results (default: false, drafts included). Filtered server-side via the $draft keyword.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results (default: 20)
queryYesSearch query string
ascendingNoSort oldest first instead of newest first (default: false)

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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

For a tool with no output schema 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdYesThe ID of the draft email to send

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoCC email addresses (optional)
toYesRecipient email addresses (array of strings, or a comma-separated string)
bccNoBCC email addresses (optional)
fromNoSender email address (optional, defaults to account primary email)
replyToNoReply-To email addresses (replies go here instead of to the sender)
subjectYesEmail subject
htmlBodyNoHTML body (optional)
textBodyNoPlain text body (optional)
inReplyToNoMessage-ID(s) of the email being replied to (optional, for threading)
mailboxIdNoMailbox ID to save the email to (optional, defaults to Drafts folder)
referencesNoFull reference chain of Message-IDs (optional, for threading)
attachmentsNoFiles 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

C2.6/5.0
Behavior1/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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)

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

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoNew end time in ISO 8601 format. DTEND is exclusive per RFC 5545
startNoNew start time in ISO 8601 format. Floating times (no Z/offset) preserve original timezone
titleNoNew event title
eventIdYesID of the event to update
locationNoNew event location
clearFieldsNoProperty names to delete from the event. Allowed: description, location. Cannot also pass the same field as a value.
descriptionNoNew event description
participantsNoReplaces ALL existing attendees. Empty array removes all attendees. Omit to preserve existing attendees.
confirmRecurringNoRequired when changing start/end on a recurring event with exceptions. Acknowledges that orphaned exception overrides will be removed.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoStructured name; provide full and/or given/surname
notesNoFree-form note (replaces the existing note on update)
emailsNoEmail addresses (replaces ALL existing emails on update; [] clears)
phonesNoPhone numbers (replaces ALL existing phones on update)
addressesNoPostal addresses as free-form text (replaces ALL existing on update)
contactIdYesID of the contact to update
expectStateNoOptional JMAP state precondition (ifInState); update fails with stateMismatch if contacts changed since this state

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the tool's function 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.

Usage Guidelines4/5

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

B3.4/5.0
Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness5/5

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

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/MadLlama25/fastmail-mcp'

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