icloud-mcp
One-line summary: icloud-mcp is an MCP server that gives AI clients read/write access to your iCloud Mail, Contacts, Calendar, and Reminders over stdio or authenticated HTTP.
Mail reading & search: list accounts/mailboxes, inbox and mailbox summaries, top/unread senders, read/paginate, search by keyword, sender, domain, subject, date, size, unread/flagged, attachments; fetch full emails, raw RFC 2822, threads, attachments, unsubscribe headers, and storage reports.
Mail writing: compose, reply (and reply-all), forward, and save drafts via SMTP.
Bulk mail operations (all with
dryRun): bulk move, delete, flag, mark read/unread, delete/move by sender, delete by subject, move by domain, archive/delete older than, empty trash, and safe copy-verify-delete moves with a resumable manifest (get_move_status,abandon_move).Mailbox management: create, rename, and delete folders; single-email flag, mark read, delete, and move.
Automation & state: saved rules (create/list/run/delete, run all) plus digest state and a session log for long cleanups.
Contacts (CardDAV): list, search, get, create, update, and delete contacts.
Calendar (CalDAV): list/create/delete calendars, list/get/create/update/delete/search events, bulk create/update/delete events, multi-calendar listing, conflict detection, and optional read-only subscribed ICS/webcal feeds.
Reminders: list/create/rename/delete reminder lists and list/get/create/update/complete/delete reminders.
Email-to-calendar: extract suggested event details from an email for confirmation before creating an event.
Remote/hosted use: Streamable HTTP transport on loopback behind Cloudflare Tunnel/Access (JWT or service tokens), with
remote-safetool profile, send modes (off/drafts/self-only/on), rate limiting, audit logging, and prompt-injection guardrails.
Connects to Apple services to manage iCloud Mail accounts, enabling email reading, searching, and automated inbox organization through the use of Apple app-specific passwords.
Provides comprehensive tools for managing iCloud Mail, including reading and searching emails, sending and replying to messages via SMTP, performing bulk operations like move and delete, and managing mailbox folders.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@icloud-mcpFind all emails from Sarah about the project and summarize them"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
icloud-mcp
An MCP server for iCloud Mail, Calendar, Contacts and Reminders. Works with Claude, Grok Bot, and any MCP client.
Version 2.8.0 (86 tools).
Works with: Claude Desktop, Claude Code, Claude custom connectors (including phone), Grok Bot, and other MCP clients over stdio or Streamable HTTP. "Works with" describes compatibility only; this is an independent project and is not endorsed by or affiliated with Anthropic or xAI.
Pick your client
Client | How it connects | Start here |
Claude Desktop | Local, stdio | Install, then Claude Desktop |
Claude Code | Local, stdio | |
Claude custom connector / phone | Remote, Cloudflare Access sign-in (Managed OAuth) | Remote access, then step 3 of the Grok Bot guide |
Grok Bot | Remote, Cloudflare Access service token headers | |
Other MCP clients | stdio, or Streamable HTTP |
Local stdio setups run on your own machine. Remote setups run the server on a Mac you control, behind a tunnel and an access policy, so that machine must be awake and online.
Remote mode is drafts-only. Run remote setups with
ICLOUD_MCP_SEND_MODE=draftsandICLOUD_MCP_TOOL_PROFILE=remote-safeso connected clients can read and draft but cannot send mail. See Send mode and Tool profiles.
Related MCP server: macos-mail-mcp
Features
Read, search, and paginate any mailbox, including threads, attachments, and unsubscribe links
Send, reply, forward, and save drafts over SMTP
Bulk move, delete, flag, and mark-read, with a safe copy-verify-delete pipeline for moves
Saved rules, digest state, and a session log for long cleanups
Contacts over CardDAV, calendars over CalDAV (including bulk create/update/delete and conflict checks), and Reminders
dryRunon every delete, every move that removes the original, and every bulk operation. A dry run reports achangeslist of exactly what would be affected and does not modify anything
Prerequisites
Node.js 20 or newer
An MCP client, such as Claude Desktop, Claude Code, Grok Bot, or any client that supports stdio or Streamable HTTP
An iCloud account with an app-specific password
Install
Install from npm:
npm install -g icloud-mcpOr skip the install and let npx fetch it on demand (the configs below use this).
Confirm the server can reach iCloud:
IMAP_USER="you@icloud.com" IMAP_PASSWORD="your-app-specific-password" npx -y icloud-mcp --doctorClaude Desktop
{
"mcpServers": {
"icloud-mail": {
"command": "npx",
"args": ["-y", "icloud-mcp"],
"env": {
"IMAP_USER": "you@icloud.com",
"IMAP_PASSWORD": "your-app-specific-password"
}
}
}
}If Claude Desktop cannot find npx, use its full path (which npx). With a global install, "command": "icloud-mcp" and no args also works. Quit Claude Desktop completely and reopen it.
Claude Code
claude mcp add icloud-mail \
--scope user \
-e IMAP_USER=you@icloud.com \
-e IMAP_PASSWORD=your-app-specific-password \
-- npx -y icloud-mcpFrom source
git clone https://github.com/adamzaidi/icloud-mcp.git
cd icloud-mcp
npm installPoint the configs above at node /absolute/path/to/icloud-mcp/index.js instead of npx -y icloud-mcp. To run from a checkout, copy .mcp.json.example to .mcp.json (that file is gitignored) and export ICLOUD_EMAIL and ICLOUD_APP_PASSWORD in your shell.
Additional IMAP accounts use IMAP_ACCOUNT_N_USER, IMAP_ACCOUNT_N_PASSWORD, IMAP_ACCOUNT_N_HOST, IMAP_ACCOUNT_N_SMTP_HOST, and IMAP_ACCOUNT_N_NAME.
If IMAP_USER or IMAP_PASSWORD is unset, the server fills the missing value from the macOS Keychain via security find-generic-password. The service name defaults to icloud-mcp and can be changed with ICLOUD_MCP_KEYCHAIN_SERVICE. When both variables are already set, Keychain is not read. IMAP_PASS is used only when IMAP_PASSWORD is unset. The password is not written to the log. node mcp-call.mjs loads a .env file in the checkout when one exists, and keeps working from the process environment when it does not.
ICLOUD_MCP_REMINDER_LIST is the Reminders list name mentioned by the digest tools. The default is claude.
Local data
Rules, the move manifest, digest state, the session log, and the audit log are written outside the repository, in your home directory:
~/.icloud-mcp-rules.json~/.icloud-mcp-move-manifest.json~/.icloud-mcp-digest.json~/.icloud-mcp-session.json~/.icloud-mcp/audit.log~/.icloud-mcp/subscribed-calendars.json(only whenICLOUD_MCP_SUBSCRIBED_CALENDARS=on)
The audit log is append-only. The default file lives in ~/.icloud-mcp/, which this server creates mode 0700 when that directory is missing. A directory that already exists is not changed. If that directory is group or world writable, the server warns once and leaves it. The log file, including rotated copies, is mode 0600. Each line is one JSON object with a fixed set of fields: tool name, timestamp, status (ok or error), duration, and one integer count. That count is an array length, or a number taken from a fixed list of result fields such as total or wouldDelete. Keys on the result are never copied, so a sender address used as a key is not written. Arguments, error text, message bodies, and subjects are not written either. When the file reaches 1 MiB it is rotated through .1, .2, and .3. ICLOUD_MCP_AUDIT_LOG_MAX_BYTES changes that size. Set ICLOUD_MCP_AUDIT_LOG to move the file. Set ICLOUD_MCP_DATA_DIR to store the other local files somewhere else; the audit log then defaults to $ICLOUD_MCP_DATA_DIR/.icloud-mcp/audit.log. Do not point it at the git checkout. Contact exports, CRM notes, .env, and digest output belong outside the repo; .gitignore already excludes the usual local folders.
Available tools (86)
dryRun: true returns { dryRun: true, changes: [...] } plus the existing count fields (wouldDelete, wouldMove, and so on). Omitted or false performs the change.
Tool profiles
ICLOUD_MCP_TOOL_PROFILE defaults to full, which is the list below. remote-safe is an allowlist: only the read, search, draft, and calendar or reminder create and edit tools named in that list are exposed, including flag_email and mark_as_read. A tool that is not on the list is hidden, including tools added later. bulk_create_events and bulk_update_events are on the list, and in remote-safe they run as a dry run unless that tool name is listed in ICLOUD_MCP_ALLOW_BULK (comma-separated). A hidden tool still throws if something calls it.
Tool | Description | dryRun |
| List all configured email accounts (names and IMAP hosts). Use the account name in any mail tool's account parameter. | |
| Get a summary of a mailbox including total, unread, and recent email counts | |
| Get total, unread, and recent email counts for any specific mailbox/folder | |
| Get the top senders by email count from a sample of the inbox | |
| Get top senders of unread emails | |
| Get all emails from a specific sender | |
| Read emails from an inbox with pagination. Supports multiple accounts. | |
| Get full content of a specific email by UID | |
| Search emails by keyword or targeted field queries, with optional filters for date, read status, domain, and more | |
| Count how many emails match a set of filters without moving or deleting them. Use this before bulk_move or bulk_delete to preview how many emails will be affected. | |
| Move emails matching any combination of filters from one mailbox to another. Uses safe copy-verify-delete with fingerprint verification and a persistent manifest. Use dryRun: true to preview without making changes. | yes |
| Delete emails matching any combination of filters. Processes in chunks of 500 with per-chunk timeouts for reliability. Use dryRun: true to preview without making changes. | yes |
| Flag or unflag emails matching any combination of filters in bulk | yes |
| Delete all emails from a specific sender | yes |
| Move all emails from a specific sender to a folder | yes |
| Delete all emails matching a subject pattern | yes |
| Mark all emails as read, optionally filtered by sender | yes |
| Mark all emails as unread, optionally filtered by sender | yes |
| Delete all emails older than a certain number of days | yes |
| Get emails between two dates | |
| Flag or unflag a single email | |
| Mark a single email as read or unread | |
| Delete a single email | yes |
| Move a single email to a different mailbox/folder | yes |
| List all mailboxes/folders in iCloud Mail | |
| Create a new mailbox/folder | |
| Rename an existing mailbox/folder | |
| Delete a mailbox/folder. The folder must be empty first. | yes |
| Permanently delete all emails in the trash (Deleted Messages or Trash folder). Use dryRun: true to preview first. | yes |
| Check the status of the current or most recent bulk move operation. Shows progress, chunk statuses, and any failures. Call this to monitor a long-running move or inspect a failed one. | |
| Abandon an in-progress move operation so a new one can start. Only use if you are certain the operation should not be resumed. Emails already moved will not be returned to source. | |
| Write a step to the session log. Use this to record your plan before starting, and after each completed step. Helps maintain progress across long operations. | |
| Read the current session log to see what has been done so far. | |
| Clear the session log and start fresh. Use this at the start of a new task. | |
| List all attachments in an email without downloading them. Returns filename, MIME type, size, and IMAP part ID for each attachment. | |
| Download a specific attachment from an email. Returns the file content as base64-encoded data. Use list_attachments first to get the partId. Maximum 20 MB per request; use offset+length for larger files. | |
| Get the List-Unsubscribe header from an email, parsed into email and URL components. Useful for AI-assisted inbox cleanup. | |
| Mark all unread emails older than N days as read. Useful for bulk triage of a cluttered inbox. | yes |
| Move all emails from a specific domain to a folder. Convenience wrapper around bulk_move with a domain filter. | yes |
| Get the raw RFC 2822 source of an email (full headers + MIME body) as base64-encoded data. Useful for debugging or export. Capped at 1 MB. | |
| Flag or unflag all emails from a specific sender | yes |
| Safely move emails older than N days from a source mailbox to an archive folder. Uses the same safe copy-verify-delete pipeline as bulk_move. Use dryRun: true to preview. | yes |
| Estimate storage usage by size bucket and identify top senders by email size. Uses SEARCH LARGER queries for bucketing and samples large emails for sender analysis. | |
| Find all emails in the same thread as a given email. Uses subject matching + References/In-Reply-To header filtering. Note: iCloud does not support server-side threading — results are approximate. | |
| Create a saved rule that applies a specific action to emails matching a set of filters. Rules are stored persistently and can be run on demand or all at once with run_all_rules. | |
| List all saved rules with their filters, actions, and run history. | |
| Run a specific saved rule by name. Use dryRun: true to preview what would be affected without making changes. | yes |
| Delete a saved rule by name. | yes |
| Run all saved rules in sequence. Use dryRun: true to preview all rules without making changes. | yes |
| Compose and send a new email via iCloud SMTP. The From address is always your iCloud account. Supports plain text, HTML, or both (multipart/alternative). | |
| Reply to an existing email. Automatically sets correct threading headers (In-Reply-To, References) and prefixes the subject with Re:. Supports plain text and/or HTML body. | |
| Forward an existing email to one or more recipients. Fetches the original email body and includes it as a forwarded message block. Supports plain text and/or HTML note. | |
| Save a draft email to your iCloud Drafts folder without sending it. Supports plain text, HTML, or both. The draft can be edited and sent later from Mail.app or iCloud.com. | |
| Get the current inbox digest state — last run timestamp, processed email UIDs (to skip on next run), pending actions, and per-sender skip counts for smart unsubscribe. | |
| Update the digest state after a run. Merges new processed UIDs into the existing list, updates lastRun, replaces pendingActions, and accumulates per-sender skip counts. |
Contacts
Tool | Description | dryRun |
| List contacts from iCloud Contacts. Returns names, phones, emails, and other fields. | |
| Search iCloud Contacts by name, email address, or phone number. | |
| Get full details for a specific contact by ID. Use list_contacts or search_contacts to find a contactId. | |
| Create a new contact in iCloud Contacts. | |
| Update an existing contact in iCloud Contacts. Only provided fields are changed; others are preserved. | |
| Delete a contact from iCloud Contacts permanently. | yes |
Calendar
Tool | Description | dryRun |
| List all calendars in iCloud Calendar (e.g. Personal, Work, School). Returns calendarId, name, and supported event types. When ICLOUD_MCP_SUBSCRIBED_CALENDARS=on, configured read-only subscribed (ICS/webcal) calendars are included with readOnly:true and subscribed:true, and subscribedCalendars reports that setting. | |
| Create a new event calendar in iCloud Calendar. Fails if a calendar with that name already exists. | |
| Delete an iCloud event calendar by exact name or calendarId. The calendar must have no events (past or future); delete them first with bulk_delete_events. Will not delete Reminders lists. | yes |
| List events in a specific iCloud calendar within a date range. Use list_calendars first to get a calendarId. | |
| Get full details of a specific calendar event by its ID. | |
| Create a new event in an iCloud calendar. For all-day events use allDay:true and YYYY-MM-DD for start/end. | |
| Update an existing calendar event. Only provided fields are changed; others are preserved. | |
| Delete a calendar event permanently from iCloud Calendar. | yes |
| Search for events by title/summary across all calendars within an optional date range. | |
| Update multiple calendar events in one call. Each update object must include eventId and only the fields to change. | yes |
| List events from multiple calendars in one call. Returns events grouped by calendar ID. | |
| Create multiple calendar events in one call. Much more efficient than calling create_event repeatedly. Each event in the array uses the same fields as create_event. | yes |
| Delete multiple calendar events in one call. Much more efficient than calling delete_event repeatedly. | yes |
| Detect scheduling conflicts and tight gaps between events across multiple calendars. Compares all non-all-day events on the same date from different calendars. |
list_events and search_events return only events that overlap the requested since/before range. A recurring event is kept when iCloud reports one of its occurrences in that range, even though its listed start is the first occurrence.
Subscribed calendars
iCloud lists a subscribed calendar (an ICS or webcal:// feed added in Calendar.app) over CalDAV but returns no events for it, so the tools above miss everything on it. Set ICLOUD_MCP_SUBSCRIBED_CALENDARS=on to read those feeds from their source URL instead. The default is off, and when off nothing is read from disk or the network; list_calendars only gains a subscribedCalendars: { enabled, count } field. Any other value refuses to start.
Feeds are listed in ~/.icloud-mcp/subscribed-calendars.json (or ICLOUD_MCP_SUBSCRIBED_CALENDARS_FILE; with ICLOUD_MCP_DATA_DIR set the default is $ICLOUD_MCP_DATA_DIR/.icloud-mcp/subscribed-calendars.json). The file maps a display name to a URL. When it is missing and the feature is on, the server creates it empty, mode 0600, in a directory it creates mode 0700. The example below uses placeholders:
{
"Team Holidays": "https://calendar.example.com/feeds/holidays.ics",
"School": "webcal://school.example.com/calendar/term.ics",
"Club": "keychain:club-calendar"
}webcal:// is rewritten to https://. keychain:<account> reads the URL from the macOS Keychain item with that account name under the icloud-mcp service (or ICLOUD_MCP_KEYCHAIN_SERVICE), using the same security find-generic-password lookup as the password. Only https:// targets on port 443 are allowed, with no credentials in the URL; ICLOUD_MCP_SUBSCRIBED_CALENDARS_PORTS (comma-separated) permits other ports. Each calendar gets a stable id of subscribed- plus a slug of its name (for example subscribed-team-holidays); two names that slug the same are refused.
Do not give a subscription the same display name as an existing iCloud calendar. iCloud still lists its own copy of a subscribed calendar (with no events), so the same name would appear twice in list_calendars; delete_calendar by name then refuses as ambiguous, and create_calendar refuses the name as taken. Pick a distinct name, or address calendars by calendarId.
When on, list_calendars includes each feed with readOnly: true and subscribed: true, and list_events, get_event, list_events_multi, search_events, and detect_conflicts accept those ids. Events use the same fields as iCloud events plus readOnly: true, source: "subscribed", untrusted: true, and, on an expanded occurrence, recurrenceId. An occurrence id is <uid>_<recurrence stamp>. Recurrence rules (RRULE with DAILY, WEEKLY, MONTHLY, YEARLY, INTERVAL, COUNT, UNTIL, BYDAY, BYMONTHDAY, BYMONTH, BYSETPOS, WKST), RDATE, EXDATE, DURATION, and RECURRENCE-ID overrides are expanded locally. A rule without COUNT is evaluated from the query window, not from its first occurrence, so a daily event that started decades ago still returns this month's instances. TZID values are resolved as IANA names, including vendor-prefixed ids and X-LIC-LOCATION; an unknown id falls back to the feed's VTIMEZONE standard offset, then to floating time. create_event, update_event, delete_event, the bulk event tools, and delete_calendar refuse a subscribed calendar with a read-only error, including as a dry run, before any request is made.
Security notes:
Feed URLs are secrets. They frequently carry a private token. The URL never appears in tool output, errors, stderr, or the audit log; errors name the calendar instead. Keep the file private and do not paste its contents into chats or issues. If the file is readable by other users, the server warns once on stderr (without the path) and keeps going; run
chmod 600on it.Fetches are
https://only, on port 443 unlessICLOUD_MCP_SUBSCRIBED_CALENDARS_PORTSsays otherwise. Redirects are followed by hand (at most three) and every hop is checked again for scheme, port, embedded credentials, and address. The host is resolved first and the fetch is refused when any address is loopback, private, carrier-grade NAT, link-local (including the cloud metadata address), multicast, reserved, unique-local, Teredo, or an IPv4-mapped, SIIT, NAT64, or 6to4 form of one of those. A literal IP in the URL is checked the same way.Each fetch times out after 15 seconds and stops at 2 MB. The body must start with
BEGIN:VCALENDAR; theContent-Typeheader is not trusted either way. A feed with more than 2000VEVENTs is refused. Expanding one request is bounded too: at most 5000 occurrences, a fixed number of rule steps, and two seconds of wall-clock time; past any of these the call fails with a generic error instead of stalling the server. A parsed feed is cached in memory for five minutes.Event text from a feed (title, notes, location) is untrusted data, like message bodies, and every subscribed event carries
untrusted: true. Read it as data, not as instructions.There is no tool that turns this feature on or off at runtime. Such a tool would let injected text start outbound fetches from inside the
remote-safeprofile, so the setting is environment-only. No tool was added and nothing was added to theremote-safeallowlist; the read tools above are already on it and stay read-only.Known limitation: the address check happens after DNS resolution, but the fetch still connects by hostname, so a DNS answer that changes between the lookup and the connection (DNS rebinding) is not pinned. Only subscribe to feeds from hosts you trust.
Reminders
Tool | Description | dryRun |
| List all Reminders lists in iCloud Reminders (e.g. "Reminders", "Work", "Shopping"). Returns name, id, and count per list. | |
| Create a new Reminders list in iCloud Reminders. Fails if a list with that name already exists. | |
| Rename a Reminders list. The old name must match exactly one list, and the new name must not already be in use. | yes |
| Delete a Reminders list. The list must be empty first, and the name must match exactly one list. | yes |
| List reminders from iCloud Reminders. Omit listName to fetch from all lists. | |
| Get full details of a specific reminder by ID. | |
| Create a new reminder in iCloud Reminders. | |
| Update an existing reminder. Only provided fields are changed; others are preserved. | |
| Mark a reminder as completed in iCloud Reminders. | |
| Delete a reminder from iCloud Reminders permanently. | yes |
Listing reminders reads each property for the whole list in one batch. A list of zero or one reminder is coerced to an array before it is indexed. If Reminders.app stalls, the tool says the script timed out after 90 seconds instead of reporting an iCloud network timeout. A timed-out create, update, or delete may still have been applied.
Email to calendar
Tool | Description | dryRun |
| Fetch an email and return its content formatted for calendar event extraction. After calling this tool, extract the event fields from the returned content (pay attention to _dateAnchor for resolving relative dates like "Tuesday"), present a summary to the user for confirmation, then call create_event. No API key required. |
Filters
bulk_move, bulk_delete, bulk_flag, search_emails, count_emails, and rules accept any combination of: sender, domain, subject, before, since, unread, flagged, larger, smaller, hasAttachment, and account.
A domain filter searches both the bare domain and @domain. iCloud's FROM search misses some senders when given only the bare domain. Subdomains are not matched: a filter of example.com does not find mail from someone@mail.example.com. When a keyword and a domain are both set, search_emails keeps both conditions.
Safe move
bulk_move, bulk_move_by_sender, bulk_move_by_domain, and archive_older_than copy, verify fingerprints in the destination, then remove the source. get_move_status and abandon_move inspect or clear the manifest.
Connections
An idle iCloud IMAP connection times out after 60 seconds of silence. The server logs the error and that tool call fails. The process stays up. Saving a draft uses its own IMAP connection and attaches the same handler.
HTTP transport
Stdio is still the default. icloud-mcp --http (or node index.js --http) also serves the same tools over MCP Streamable HTTP. The process listens on 127.0.0.1 only. ICLOUD_MCP_HTTP_PORT chooses the port (default 8787).
HTTP mode refuses to start unless both of these are true:
Authentication is configured. Either set
CF_ACCESS_TEAM_DOMAIN,CF_ACCESS_AUD, andICLOUD_MCP_ALLOWED_EMAILSfor a Cloudflare Access JWT (Cf-Access-Jwt-Assertion, checked against the team JWKS), or setICLOUD_MCP_BEARER_TOKENfor a static bearer token used in local tests. When both are set, either one is accepted.ICLOUD_MCP_SEND_MODEisoff,drafts, orself-only. The defaultonis refused.ICLOUD_MCP_TOOL_PROFILEisremote-safe.fullis refused.
Host and Origin are checked before a request is handled, which blocks DNS rebinding. Loopback names (localhost, 127.0.0.1, ::1) are always allowed. A tunnel hostname belongs in ICLOUD_MCP_ALLOWED_HOSTS (comma-separated). A browser Origin must be a loopback origin for this port, or a value in ICLOUD_MCP_ALLOWED_ORIGINS, or http/https on an allowed host. A missing Origin header is allowed so non-browser clients can connect. The Origin value null is rejected. Authenticated requests are limited per identity (ICLOUD_MCP_RATE_LIMIT_PER_MINUTE, default 60). Requests with no credentials, and requests that fail authentication, have a separate limit of 10. That limit is per socket address. When the socket is loopback and Cloudflare Access is configured, the key is Cf-Connecting-Ip if the header is an IP address, so callers behind the tunnel do not share one bucket. Otherwise the header is ignored. An unknown or expired mcp-session-id is rejected with 404. A request with no session id that is not initialize is rejected with 400. Each session is tied to the identity that created it, dropped after 30 minutes idle, and new sessions stop once 100 are open. Logs record a reason code, not tokens or message contents.
IMAP_USER and IMAP_PASSWORD are still required to start. The send-mode values themselves are enforced by the SMTP layer when that gate is installed; this transport only refuses to listen while the mode is on.
Tests
npm test runs the offline suite only. It mocks IMAP, CardDAV, CalDAV, Reminders, and subscribed calendar feeds (the fetcher and DNS lookup are injected), and it does not contact iCloud, fetch any feed, or send mail.
npm run test:live runs the dummy-data suite in tests/live-destructive.test.js. It stays skipped unless ICLOUD_MCP_LIVE=1, IMAP_USER, and IMAP_PASSWORD are all set. It creates dummy contacts, reminders, calendar events, and messages appended into a temp folder, then deletes those dummies. It does not send mail. Set LIVE_CALENDAR to the calendar that should receive the dummy events. Calendar tests are skipped when that variable is unset. Delete tools run as a dry run first and skip the real delete unless that preview names exactly the dummies from this run.
npm run test:send runs tests/test.js. It stays skipped unless ICLOUD_MCP_SEND=1, IMAP_USER, and IMAP_PASSWORD are all set. Every message it sends goes only to the account in IMAP_USER. Reply, reply-all, and forward act on a seed that account just sent to itself, never on other inbox mail. Before each send, a guard checks every To, Cc, and Bcc recipient (case and surrounding whitespace ignored) and aborts the run if any address is anyone else.
dryRun: true on a delete, a move that removes the original, or a bulk change returns { dryRun: true, changes: [...] } and does not write. Omit it, or pass false, to perform the change.
Remote access
Stdio stays the default and is the right transport for a local client. A phone, Grok Bot, or a Claude custom connector should use the loopback HTTP listener behind Cloudflare Tunnel and Cloudflare Access. Do not expose port 8787 on the LAN or the public internet.
Cloudflare Tunnel and Access
Start
icloud-mcp --http(ornode index.js --http). The process binds to127.0.0.1only.ICLOUD_MCP_HTTP_PORTdefaults to8787.Create a Cloudflare Tunnel that routes one hostname to
http://127.0.0.1:8787.Put a Cloudflare Access application on that hostname and use Managed OAuth, so the connector signs in with an identity provider instead of a shared Mac password.
Set
CF_ACCESS_TEAM_DOMAINto the team domain (no scheme),CF_ACCESS_AUDto the application's AUD tag, andICLOUD_MCP_ALLOWED_EMAILSto the comma-separated addresses that may call the server.The tunnel forwards
Cf-Access-Jwt-Assertion. The server checks that JWT against the team JWKS athttps://<team-domain>/cdn-cgi/access/certs, then requires the token email to be on the allow list.Put the public hostname in
ICLOUD_MCP_ALLOWED_HOSTS. Loopback names are already allowed. This is the DNS-rebinding check.
A non-interactive client such as Grok Bot cannot sign in with an identity provider. Create an Access service token for it, add a policy with the Service Auth action that includes the token, and put the token's Client ID in ICLOUD_MCP_ALLOWED_SERVICE_TOKENS (comma-separated). A service token JWT has no email claim; its common_name claim is the Client ID. A JWT with no email is accepted only when common_name exactly matches an entry on that list. When the list is unset or empty, a JWT with no email is rejected, which is the previous behavior. Every other check still applies: signature, RS256, issuer, audience, exp, nbf, key rotation, Host and Origin, the remote-safe profile, and the send-mode gate. Service-token requests are rate limited by common_name. The Client Secret stays with the client; the server never sees or stores it. CF_ACCESS_TEAM_DOMAIN, CF_ACCESS_AUD, and ICLOUD_MCP_ALLOWED_EMAILS are still required to start.
ICLOUD_MCP_BEARER_TOKEN is a static bearer token for a local test client. It is not the remote credential. When Access and the bearer token are both set, either one is accepted.
HTTP mode refuses to start unless authentication is configured, ICLOUD_MCP_SEND_MODE is off, drafts, or self-only, and ICLOUD_MCP_TOOL_PROFILE is remote-safe. The default send mode on and the full profile are refused. A missing Origin header is allowed. The Origin value null, and any other Origin that is not on the allow list, are rejected. Authenticated requests are limited per identity. Requests that have no credentials use a separate limit of 10 per address, so an unauthenticated flood does not consume the caller's budget.
macOS LaunchAgent
Reminders uses JavaScript for Automation and needs a logged-in GUI session. Run the server as a LaunchAgent in ~/Library/LaunchAgents, not as a LaunchDaemon. A daemon starts outside that session and cannot talk to Reminders.
Store the app-specific password in the macOS Keychain (service icloud-mcp, or ICLOUD_MCP_KEYCHAIN_SERVICE) instead of in the plist. IMAP_PASS is only a fallback when IMAP_PASSWORD is unset. node mcp-call.mjs loads a .env file when one exists and otherwise uses the process environment.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.icloud-mcp</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/node</string>
<string>/Users/you/icloud-mcp/index.js</string>
<string>--http</string>
</array>
<key>EnvironmentVariables</key>
<dict>
<key>IMAP_USER</key>
<string>you@icloud.com</string>
<key>ICLOUD_MCP_SEND_MODE</key>
<string>drafts</string>
<key>ICLOUD_MCP_TOOL_PROFILE</key>
<string>remote-safe</string>
<key>CF_ACCESS_TEAM_DOMAIN</key>
<string>team.cloudflareaccess.com</string>
<key>CF_ACCESS_AUD</key>
<string>access-aud-tag</string>
<key>ICLOUD_MCP_ALLOWED_EMAILS</key>
<string>you@example.com</string>
<key>ICLOUD_MCP_ALLOWED_HOSTS</key>
<string>mail.example.com</string>
</dict>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>Using icloud-mcp with Grok Bot (Mac host and phone)
This walks through hosting the server on an always-on Mac and connecting Grok Bot (and Claude) to it. Everything below uses placeholders: example.com, <TEAM_DOMAIN>, <AUD_TAG>, <CLIENT_ID>, <APPLE_ID>. Substitute your own values locally and never commit them.
Prerequisites
A Mac that stays on and logged in to a GUI session (see the LaunchAgent note above).
Node (see Prerequisites) and this repo checked out, with
npm installdone.cloudflared:brew install cloudflared.A Cloudflare account with a domain and Zero Trust enabled.
1. Tunnel
Create a remotely managed tunnel in Zero Trust (Networks, Tunnels). Add a public hostname such as icloud-mcp.example.com routed to http://127.0.0.1:8787, and keep the catch-all rule as http_status:404. Create a proxied CNAME for the hostname pointing at <tunnel-id>.cfargotunnel.com. Copy the tunnel token and treat it as a password.
2. Access application
Create a self-hosted Access application on that hostname. Add an Allow policy that includes only your email address, use one-time PIN login, and set the session duration to 24 hours. Copy the application's AUD tag; it is CF_ACCESS_AUD (<AUD_TAG>). Your team domain (<TEAM_DOMAIN>.cloudflareaccess.com) is CF_ACCESS_TEAM_DOMAIN.
3. Interactive clients (Claude)
Enable Managed OAuth on the Access application and add the client's callback URL to the allowed redirect URIs. For Claude that is https://claude.ai/api/mcp/auth_callback. In Claude, add a custom connector with the URL https://icloud-mcp.example.com/mcp and sign in with the one-time PIN.
4. Non-interactive clients (Grok Bot)
Grok Bot's own OAuth callback is not known, so it cannot be added to the allowed redirect URIs. Use an Access service token instead:
In Zero Trust, create a service token (Access, Service Auth). The Client Secret is shown once. Store it like a password.
Add a policy to the Access application with the action Service Auth that includes that token. An Allow policy for your email does not cover service tokens.
Set
ICLOUD_MCP_ALLOWED_SERVICE_TOKENS=<CLIENT_ID>on the server (see Cloudflare Tunnel and Access above).In Grok Bot, add a custom MCP server with the URL
https://icloud-mcp.example.com/mcpand two headers:CF-Access-Client-Id: <CLIENT_ID>andCF-Access-Client-Secret: <the secret>.
To revoke, delete the token in Zero Trust (or remove it from the Service Auth policy); requests with it fail at Cloudflare immediately. To rotate, create a new token, add it to the policy, update ICLOUD_MCP_ALLOWED_SERVICE_TOKENS and the Grok Bot headers, restart the server, then delete the old token.
5. Mac setup
Store the app-specific password in the Keychain. The command prompts for it, so it never lands in shell history or a file:
security add-generic-password -s icloud-mcp -a <APPLE_ID> -wSave the tunnel token to a file only you can read, then run two LaunchAgents in ~/Library/LaunchAgents. Never put the app-specific password in a plist.
mkdir -p ~/.icloud-mcp && chmod 700 ~/.icloud-mcp
# paste the tunnel token into this file, then:
chmod 600 ~/.icloud-mcp/tunnel-tokencom.example.cloudflared.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.cloudflared</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/bin/cloudflared</string>
<string>tunnel</string>
<string>run</string>
<string>--token-file</string>
<string>/Users/you/.icloud-mcp/tunnel-token</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>com.example.icloud-mcp.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.icloud-mcp</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/node</string>
<string>index.js</string>
<string>--http</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/you/icloud-mcp</string>
<key>EnvironmentVariables</key>
<dict>
<key>IMAP_USER</key>
<string><APPLE_ID></string>
<key>ICLOUD_MCP_SEND_MODE</key>
<string>drafts</string>
<key>ICLOUD_MCP_TOOL_PROFILE</key>
<string>remote-safe</string>
<key>CF_ACCESS_TEAM_DOMAIN</key>
<string><TEAM_DOMAIN>.cloudflareaccess.com</string>
<key>CF_ACCESS_AUD</key>
<string><AUD_TAG></string>
<key>ICLOUD_MCP_ALLOWED_EMAILS</key>
<string>you@example.com</string>
<key>ICLOUD_MCP_ALLOWED_HOSTS</key>
<string>icloud-mcp.example.com</string>
<key>ICLOUD_MCP_ALLOWED_SERVICE_TOKENS</key>
<string><CLIENT_ID></string>
</dict>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>Load each agent with launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/<file>.plist. To restart after a change, run launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/<file>.plist, wait a few seconds, then bootstrap again.
6. Optional: subscribed calendars
To make subscribed (ICS) calendars readable through the same server, see Subscribed calendars under Calendar and add ICLOUD_MCP_SUBSCRIBED_CALENDARS=on to the server's environment.
7. Verify
An unauthenticated request returns 401:
curl -s -o /dev/null -w '%{http_code}\n' -X POST https://icloud-mcp.example.com/mcpAn
initializerequest with the two service-token headers returns 200:
curl -s -o /dev/null -w '%{http_code}\n' -X POST https://icloud-mcp.example.com/mcp \
-H 'CF-Access-Client-Id: <CLIENT_ID>' \
-H 'CF-Access-Client-Secret: <CLIENT_SECRET>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"check","version":"0"}}}'Then ask Grok Bot to run
list_calendars.
Phone
The Grok Bot connector is saved on your Grok Bot account, not in one conversation, so it also works from the phone. The server runs on the Mac, so the Mac must be awake, online, and logged in. When it sleeps, tool calls fail until it wakes.
Security notes
Keep
ICLOUD_MCP_SEND_MODE=draftsandICLOUD_MCP_TOOL_PROFILE=remote-safe. Do not enable send mode remotely.Never expose port 8787 on the LAN or the public internet; only the tunnel should reach it.
Keep the tunnel token, service token secret, app-specific password, and subscription URLs out of the repo, issues, and chats.
This repo is public. Never commit plists,
.envfiles, or other config with real values.
Recommended environment
Use ICLOUD_MCP_SEND_MODE=off or drafts for a remote connector. off blocks compose_email, reply_to_email, and forward_email. drafts saves a draft instead of sending. self-only sends only when every To, Cc, and Bcc is the authenticated account. Unset means on, which is the local stdio default and is refused in HTTP mode.
Use ICLOUD_MCP_TOOL_PROFILE=remote-safe. That profile is an allowlist of read, search, draft, and calendar or reminder create and edit tools. A tool that is not on the list is hidden, including tools added later. Leave ICLOUD_MCP_ALLOW_BULK unset so any bulk tool that is on the list runs as a dry run.
Prompt injection
Message bodies, subjects, and addresses are untrusted data. A sender can put instructions in a message that a model may follow. Read tool output as data, not as a new task. Send mode off or drafts, plus the remote-safe profile, limits what those instructions can cause. They do not make the text trustworthy.
Environment variables
Variable | Default | Role |
|
|
|
|
|
|
| unset | Comma-separated tool names that may mutate in |
|
| Loopback port for |
| unset | Cloudflare Access team domain. Required for JWT auth. |
| unset | Access application AUD tag. |
| unset | Comma-separated emails allowed to present an Access JWT. |
| unset | Comma-separated Access service token Client IDs. An Access JWT with no email is accepted only when its |
| unset | Static bearer token for local HTTP tests. |
| loopback | Extra Host values, such as the tunnel hostname. |
| loopback | Extra browser Origin values. A missing Origin is allowed. The value |
|
| Per-identity limit after authentication. Unauthenticated requests use a separate limit of 10, keyed by the socket address, or by |
|
|
|
| unset | Copied to |
|
| Reminders list name used by the digest tools. |
|
| Audit file, mode |
|
| Rotate the audit file after it reaches this size. Three older files are kept. |
| home directory | Directory for rules, the move manifest, digest state, the session log, the audit log, and the subscribed calendars file. |
|
|
|
|
| JSON object of display name to |
| unset | Comma-separated extra ports a feed URL or redirect may use. Port 443 is always allowed. |
Security
Credentials stay in your local MCP client config. The server runs on your machine. Revoke an app-specific password at appleid.apple.com.
Send mode
ICLOUD_MCP_SEND_MODE controls SMTP sending. Leave it unset for local stdio: the default is on, and compose_email, reply_to_email, and forward_email send mail as before. The check lives in the SMTP functions, so those tools cannot skip it.
Value | Behavior |
| Send. This is the default. |
| Refuse every send with an error. Nothing is handed to SMTP. |
| Do not send. |
| Send only when every To, Cc, and Bcc mailbox is the authenticated account. Addresses are parsed with the same parser nodemailer uses, then those objects are what gets sent. Case is ignored. |
Any other value is an error and nothing is sent. Recipient groups, addresses that do not parse to a single mailbox, and a CR, LF, or other control character in a header field are refused in every mode. The refusal does not include the address. A subject copied from the original message has CR, LF, and tab runs collapsed to a space, and other controls removed, before that check. A subject the caller supplies is still refused when it contains a control character.
License
MIT
Available Tools
86 toolsabandon_moveA
Abandon an in-progress move operation so a new one can start. Only use if you are certain the operation should not be resumed. Emails already moved will not be returned to source.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and successfully discloses critical behavioral traits: partial irreversibility ('Emails already moved will not be returned to source') and side effects (enabling new operations). It does not, however, clarify the final state of the abandoned operation or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste: first establishes purpose, second provides usage constraint, third discloses irreversibility consequence. Information is front-loaded and each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter mutation tool with no output schema, the description covers essential safety warnings regarding data loss. It could be improved by clarifying the post-abandonment state visible to get_move_status, but adequately covers the critical user-facing consequence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema contains zero parameters (empty object). Per rubric guidelines, zero-parameter tools receive a baseline score of 4. The description appropriately makes no parameter claims, matching the schema structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the verb (abandon), resource (in-progress move operation), and outcome (so a new one can start). It effectively distinguishes from sibling move operations (bulk_move, move_email) which initiate moves rather than aborting them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit safety constraint: 'Only use if you are certain the operation should not be resumed.' This establishes when-not-to-use versus attempting to resume. However, it omits explicit reference to get_move_status as the logical prerequisite for verifying move state before abandonment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_older_thanA
Safely move emails older than N days from a source mailbox to an archive folder. Uses the same safe copy-verify-delete pipeline as bulk_move. Use dryRun: true to preview.
| Name | Required | Description | Default |
|---|---|---|---|
| days | Yes | Archive emails older than this many days | |
| dryRun | No | If true, preview what would be moved without moving | |
| sourceMailbox | No | Source mailbox (default INBOX) | |
| targetMailbox | Yes | Destination archive folder (e.g. Archive) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Explains the 'copy-verify-delete pipeline' safety mechanism and dryRun preview capability. Missing: error handling behavior, confirmation of whether source emails are deleted after copy, rate limits, or idempotency guarantees expected for mutation tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste: purpose statement, safety pipeline disclosure, and usage tip. Front-loaded with specific operation details; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Appropriate for a 4-parameter mutation tool with no output schema. Covers the safety semantics (crucial for a 'move' operation) and preview capability. Could improve by clarifying the destructive aspect of the source deletion or referencing the default INBOX behavior mentioned in schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, establishing baseline 3. Description adds value by framing dryRun as a 'preview' usage pattern and contextualizing 'N days' within the archiving workflow. Connects the 'targetMailbox' parameter to the archive folder concept explicitly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('move') with clear resource ('emails'), condition ('older than N days'), and endpoints ('source mailbox' to 'archive folder'). The 'archive' semantic distinguishes it from sibling delete_older_than and general bulk_move operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance to 'Use dryRun: true to preview' and references implementation similarity to bulk_move. However, lacks explicit when-to-use vs destructive alternatives like delete_older_than or simple move_email given the large sibling tool set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_create_eventsA
Create multiple calendar events in one call. Much more efficient than calling create_event repeatedly. Each event in the array uses the same fields as create_event.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| events | Yes | Array of event objects, each with: summary (required), start (required), end, timezone, allDay, description, location, recurrence, status, reminder | |
| calendarId | Yes | Calendar ID to add all events to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It never states whether the batch is atomic, what happens if one event in the array is invalid, whether partial successes are possible, or what identifiers are returned. The dryRun behavior is documented in the schema, not the description, so it earns no credit here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the verb+resource and the scope, with every sentence carrying distinct information (what, why, field shape). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description should cover failure semantics and return expectations; it covers neither. The schema's dryRun flag partially mitigates this, but the agent still can't tell whether a mid-array failure aborts the whole call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents calendarId, events, dryRun and the per-event field list. The description's note that each array item uses the same fields as create_event adds a useful cross-reference, but the baseline of 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create) and resource (calendar events), with the 'multiple in one call' scope made explicit. It explicitly distinguishes itself from the sibling create_event by naming it as the repeated-call alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear condition for choosing this tool: use it instead of calling create_event repeatedly when creating several events. There are no explicit when-not-to-use cases (e.g. single event, cross-calendar batches), so it falls 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.
bulk_deleteA
Delete emails matching any combination of filters. Processes in chunks of 500 with per-chunk timeouts for reliability. Use dryRun: true to preview without making changes.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Only emails since this date (YYYY-MM-DD) | |
| before | No | Only emails before this date (YYYY-MM-DD) | |
| domain | No | Match any sender from this domain (e.g. substack.com) | |
| dryRun | No | If true, preview what would be deleted without actually deleting | |
| larger | No | Only emails larger than this size in KB | |
| sender | No | Match exact sender email address | |
| unread | No | True for unread only, false for read only | |
| account | No | Account name to use (e.g. 'icloud', 'gmail'). Defaults to first configured account. Use list_accounts to see available accounts. | |
| flagged | No | True for flagged only, false for unflagged only | |
| smaller | No | Only emails smaller than this size in KB | |
| subject | No | Keyword to match in subject | |
| hasAttachment | No | Only emails with attachments (client-side BODYSTRUCTURE scan — must be combined with other filters that narrow results to under 500 emails first) | |
| sourceMailbox | No | Mailbox to delete from (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Crucially, it discloses internal operational mechanics not found in the schema, specifically that it 'Processes in chunks of 500 with per-chunk timeouts for reliability.' This provides the agent with essential information about the tool's execution flow and fault tolerance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise, dedicating minimal space to state the core function, the operational safeguards (chunking/timeouts), and the required safety mechanism (dryRun).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (13 filters) and the lack of output schema, the description is highly complete. It covers how the operation works, how it's secured (dryRun), and how it handles large volumes (chunking/timeouts).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema coverage is 100%, setting a baseline of 3. The description does not elaborate on the semantics of the 13 specific filters (e.g., how `smaller` interacts with `larger`) beyond stating that they can be used in combination.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool deletes emails and emphasizes its ability to process 'any combination of filters,' distinguishing it from simple single-item deletion siblings. It is clear in its function as a bulk deletion utility.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a critical usage guideline by advising the agent to 'Use dryRun: true' when previewing changes. This operational advice is vital for minimizing risk, especially for a tool with high-impact parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_delete_by_senderC
Delete all emails from a specific sender
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| sender | Yes | Sender email address | |
| mailbox | No | Mailbox (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. 'Delete' implies a destructive, likely irreversible mutation, but the description does not disclose whether the deletion is permanent, whether it spans all mailboxes or only the default INBOX, permissions required, or the existence of a dry-run option. This is a significant gap for a destructive bulk operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. While extremely terse, it is not wasted or redundant; it simply lacks the additional context that the other dimensions penalize. Structurally it is clean and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive bulk-delete tool with no annotations and no output schema, the description is substantially incomplete. It omits critical behavioral context such as permanence, scope (e.g., mailbox vs. all mailboxes), and confirmation requirements. Schema coverage handles parameters, but the description fails to complete the behavioral picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (sender, mailbox, dryRun) are already documented in the schema. The description adds nothing beyond what the schema provides—'specific sender' merely restates the sender parameter—so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Delete all emails from a specific sender.' This clearly identifies both the action (bulk delete) and the filter (sender), distinguishing it from broad deletion tools like delete_email or bulk_delete. However, it does not differentiate from close siblings such as bulk_delete_by_subject or delete_older_than, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as bulk_delete, bulk_delete_by_subject, delete_email, or delete_older_than. There are no stated prerequisites, exclusions, or context cues to help an agent choose this over other deletion tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_delete_by_subjectC
Delete all emails matching a subject pattern
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| mailbox | No | Mailbox (default INBOX) | |
| subject | Yes | Subject keyword to match |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not disclose that deletion is destructive and likely irreversible, whether messages go to trash, whether the dryRun parameter is honored, or what permissions or scope limits apply. The phrase 'all emails matching' gives only minimal scope context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. However, its brevity comes at the cost of omitting important operational details, making it under-specified rather than optimally concise for a destructive bulk operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that this is a destructive bulk-delete tool with no annotations, no output schema, and no mention of dryRun or irreversibility, the description is not complete enough for safe invocation. It leaves the agent without critical context about side effects, reversibility, and the safety mechanism available in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters including the dryRun safety behavior. The description adds only 'subject pattern' versus the schema's 'Subject keyword to match', which is marginal added meaning. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Delete') and resource ('emails') plus a scoping condition ('matching a subject pattern'), which distinguishes it from sender-based siblings like bulk_delete_by_sender. However, it does not explicitly name those siblings or clarify how it differs from generic bulk_delete, so sibling differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as bulk_delete_by_sender, bulk_delete, or delete_email. It also omits any prerequisites, warnings, or conditions for safe use, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_delete_eventsB
Delete multiple calendar events in one call. Much more efficient than calling delete_event repeatedly.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| eventIds | Yes | Array of event IDs to delete | |
| calendarId | Yes | Calendar ID containing the events |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It says nothing about the irreversible/destructive nature of deletion, required permissions, partial-failure behavior when some eventIds are invalid, or what a dryRun returns — all critical for a bulk destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core action front-loaded and no wasted text. The second sentence is mildly promotional but does carry the differentiation from delete_event.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The parameters are fully covered by the schema and no output schema exists, so return values need no explanation. Still, for a bulk destructive tool with zero annotations, the description omits safety-critical context (irreversibility, partial failures) that an agent should know before invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the dryRun, eventIds, and calendarId parameters are all documented in the schema itself. The description adds no syntax, format, or constraint details beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Delete') and resource ('calendar events') with a clear scope qualifier ('multiple ... in one call'). It also names the sibling delete_event, distinguishing itself from the single-item variant, though the distinction is framed as efficiency rather than a semantic difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Much more efficient than calling delete_event repeatedly' implies the tool is for bulk/multi-event deletion rather than a single event. However, it offers no explicit when-to-use/when-not guidance or prerequisites, leaving the agent to infer selection criteria from the sibling name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_flagB
Flag or unflag emails matching any combination of filters in bulk
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Only emails since this date (YYYY-MM-DD) | |
| before | No | Only emails before this date (YYYY-MM-DD) | |
| domain | No | Match any sender from this domain (e.g. substack.com) | |
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| larger | No | Only emails larger than this size in KB | |
| sender | No | Match exact sender email address | |
| unread | No | True for unread only, false for read only | |
| account | No | Account name to use (e.g. 'icloud', 'gmail'). Defaults to first configured account. Use list_accounts to see available accounts. | |
| flagged | Yes | True for flagged only, false for unflagged only | |
| mailbox | No | Mailbox (default INBOX) | |
| smaller | No | Only emails smaller than this size in KB | |
| subject | No | Keyword to match in subject | |
| hasAttachment | No | Only emails with attachments (client-side BODYSTRUCTURE scan — must be combined with other filters that narrow results to under 500 emails first) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing about mutation risk, reversibility, auth/account requirements, or rate limits. The only useful caveat (client-side BODYSTRUCTURE scan, 500-email limit) lives in the schema, not the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. It is arguably under-specified for a 13-parameter destructive tool, but on pure conciseness and structure it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter bulk mutation with no annotations and no output schema, the description omits the dry-run-first workflow, the fact that at least one filter should accompany hasAttachment, and what the operation reports back. An agent would have to infer these from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, including the dryRun preview semantics and the hasAttachment constraint. The one-line description adds no syntax or format meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb pair (flag/unflag) plus resource (emails) and scope (bulk, any filter combination) — an agent can distinguish it from flag_email (single) and bulk_flag_by_sender (sender-only). It doesn't name those siblings explicitly, but the scope wording differentiates it functionally.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'In bulk' and 'any combination of filters' imply when this is preferable to flag_email, and the schema's dryRun parameter hints at a safe preview workflow. However, there is no explicit when-to-use vs. bulk_flag_by_sender guidance and no exclusions or prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_flag_by_senderB
Flag or unflag all emails from a specific sender
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| sender | Yes | Sender email address | |
| flagged | Yes | True to flag, false to unflag | |
| mailbox | No | Mailbox (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden yet only restates the mutation. It does not disclose that flagging is reversible, whether it spans mailboxes, permission/auth requirements, or the existence of the dryRun safety path (which is left to the schema alone). Thin for a bulk mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero redundancy. The core scope ('all emails from a specific sender') is stated up front with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a bulk mutation with no annotations and no output schema, the description should convey more about impact, reversibility, or scope (e.g., which mailbox, what a run returns). The schema covers the parameters, but the behavioral context an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents sender, flagged, mailbox, and dryRun. The description adds no format, default, or edge-case detail beyond what the schema provides; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb pair (flag/unflag) plus a precise scope ('all emails from a specific sender'), clearly distinguishing it from single-target flag_email and generic bulk_flag. An agent can identify the operation and its bulk-by-sender semantics without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the bulk 'by sender' scoping, but there is no explicit when-to-use, when-not-to-use, or named alternative (e.g., bulk_flag for specific IDs vs this for whole-sender sweeps). Nothing tells the agent which of the many bulk_* siblings to prefer.
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 all emails as read, optionally filtered by sender
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| sender | No | Optional: only mark emails from this sender as read | |
| mailbox | No | Mailbox (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and mostly doesn't: it never states that this is a mutating write, that it can affect the whole account (not just INBOX), whether it's reversible, or what permissions/auth are needed. 'Optionally filtered by sender' is the only scope qualifier offered for what is potentially a mass state change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the operation front-loaded and the qualifier trailing it; nothing is wasted and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter bulk operation with no annotations and no output schema, the description is only minimally complete: it omits the account-wide scope, reversibility, and any pointer to the single-message alternative. Schema coverage compensates for parameters, but behavioral context for a bulk mutation is thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so dryRun, sender, and mailbox are already documented in the schema with their defaults and semantics. The description's 'optionally filtered by sender' only restates what the schema says, adding no syntax or format detail beyond it, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Mark all emails as read') plus the optional sender filter, so the operation is unmistakable. It does not differentiate itself from close siblings such as mark_as_read (single message) or bulk_mark_unread, leaving the agent to infer the bulk/scope distinction on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no scenario in which this beats mark_as_read or mark_older_than_read, and no mention of opting into the safe dryRun path even though that parameter exists. Usage must be inferred entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_mark_unreadB
Mark all emails as unread, optionally filtered by sender
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| sender | No | Optional: only mark emails from this sender as unread | |
| mailbox | No | Mailbox (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It discloses that the operation affects 'all emails' and can be filtered by sender, but it does not mention the dryRun safety option, permission requirements, reversibility, or the impact of marking an entire mailbox unread.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It immediately states the action and the optional filter, making it quick for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The purpose and filter are covered, and the schema fully documents the parameters, so an agent has enough to invoke it. However, for a bulk mutation tool with no annotations and no output schema, the description omits relevant context such as dryRun usage and expected return behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters in detail. The description only echoes the sender filter and adds no new semantic detail about dryRun or mailbox behavior, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Mark all emails as unread') and includes the optional sender filter. It is clear what the tool does, though it does not explicitly distinguish itself from the opposite operation, bulk_mark_read, or the singular mark_as_read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is a bulk operation and mentions the optional sender filter, giving some usage context. However, it does not state when to choose this over bulk_mark_read or mark_as_read, nor does it mention exclusions or preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_moveA
Move emails matching any combination of filters from one mailbox to another. Uses safe copy-verify-delete with fingerprint verification and a persistent manifest. Use dryRun: true to preview without making changes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of emails to move (default: all matching) | |
| since | No | Only emails since this date (YYYY-MM-DD) | |
| before | No | Only emails before this date (YYYY-MM-DD) | |
| domain | No | Match any sender from this domain (e.g. substack.com) | |
| dryRun | No | If true, preview what would be moved without actually moving | |
| larger | No | Only emails larger than this size in KB | |
| sender | No | Match exact sender email address | |
| unread | No | True for unread only, false for read only | |
| account | No | Account name to use (e.g. 'icloud', 'gmail'). Defaults to first configured account. Use list_accounts to see available accounts. | |
| flagged | No | True for flagged only, false for unflagged only | |
| smaller | No | Only emails smaller than this size in KB | |
| subject | No | Keyword to match in subject | |
| hasAttachment | No | Only emails with attachments (client-side BODYSTRUCTURE scan — must be combined with other filters that narrow results to under 500 emails first) | |
| sourceMailbox | No | Source mailbox (default INBOX) | |
| targetMailbox | Yes | Destination mailbox path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full disclosure burden. It excellently documents the safety mechanism ('safe copy-verify-delete with fingerprint verification and a persistent manifest') and idempotency characteristics, critical for a destructive move operation. However, it omits potential rate limits, error handling behavior, or confirmation that source emails are deleted after verification.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences efficiently structured: purpose statement, safety mechanism disclosure, and usage guidance. Every sentence earns its place with zero redundancy or filler. Technical details (fingerprint verification, persistent manifest) are packed concisely without sacrificing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 15-parameter destructive operation with no output schema, the description adequately covers the mechanism and safety but leaves gaps regarding return value structure (only hinting at a 'manifest'), success/failure indicators, and specific warnings about the hasAttachment constraint documented in the schema. Functional but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage, establishing a baseline of 3. The description adds the concept of 'any combination of filters' which reinforces how the multiple filter parameters interact, and explicitly highlights the dryRun parameter's utility, but does not elaborate on specific parameter formats (e.g., date formats) or constraints beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Move emails matching any combination of filters from one mailbox to another', providing a specific verb, resource, and scope. The phrase 'any combination of filters' effectively distinguishes this tool from siblings like bulk_move_by_sender or bulk_move_by_domain which likely support limited filter types, and from move_email which likely handles single emails.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides valuable safety guidance with 'Use dryRun: true to preview without making changes', but lacks explicit guidance on when to use this general-purpose filterable version versus the specialized bulk_move_by_sender/bulk_move_by_domain variants. No prerequisites or exclusion criteria are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_move_by_domainA
Move all emails from a specific domain to a folder. Convenience wrapper around bulk_move with a domain filter.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Sender domain to match (e.g. github.com, substack.com) | |
| dryRun | No | Preview only — return count without moving | |
| sourceMailbox | No | Source mailbox (default INBOX) | |
| targetMailbox | Yes | Destination folder |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. While 'Move' implies a write operation, the description fails to disclose critical behavioral traits for a bulk operation: whether moves are reversible, what the dryRun behavior returns, success/failure handling, or performance implications of large batches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: first sentence establishes core function, second establishes architectural relationship to sibling tool. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is minimally adequate for a 4-parameter tool, but lacks important context for a bulk mutation operation (e.g., return value description, safety warnings). It meets baseline requirements but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are well-documented in the schema itself. The description adds context that this is a 'wrapper' which helps understand the domain parameter's filtering role, but does not add syntax details, format constraints, or examples beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the specific action (move), resource (emails), scope (from a specific domain to a folder), and explicitly identifies itself as a 'convenience wrapper around bulk_move with a domain filter,' effectively distinguishing it from the general bulk_move sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'convenience wrapper' statement implies this tool is for domain-specific filtering versus the general bulk_move, providing implicit context. However, it lacks explicit when-to-use guidance compared to siblings like bulk_move_by_sender or warnings about irreversible operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_move_by_senderB
Move all emails from a specific sender to a folder
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview only — return count without moving | |
| sender | Yes | Sender email address | |
| sourceMailbox | No | Source mailbox (default INBOX) | |
| targetMailbox | Yes | Destination folder |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden but only minimally discloses the bulk nature ('all emails'). It fails to mention the dryRun safety feature (present in schema), reversibility concerns, partial failure behavior, or performance implications of bulk operations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence is front-loaded and efficient with no wasted words. However, extreme brevity contributes to missing critical behavioral and usage context that would require additional sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a bulk mutation tool with no annotations and no output schema, the description is inadequate. It fails to describe return values (success count? moved message IDs?), error conditions, or the dryRun preview capability, leaving agents uncertain about invocation outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, documenting all four parameters including dryRun and sourceMailbox defaults. The description implies usage of sender and folder but does not add syntax guidance or validation rules beyond the schema, warranting the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description provides a specific verb ('Move'), clear resource ('all emails from a specific sender'), and distinguishes from siblings by specifying the 'by sender' filtering mechanism (differentiating it from bulk_move, bulk_move_by_domain, and move_email).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance provided on when to use this tool versus alternatives like bulk_move (general query-based moving), move_email (single item), or bulk_move_by_domain. Does not mention prerequisites or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_update_eventsA
Update multiple calendar events in one call. Each update object must include eventId and only the fields to change.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| updates | Yes | Array of update objects, each with eventId (required) plus any fields to change: summary, start, end, timezone, allDay, description, location, recurrence, status, reminder | |
| calendarId | Yes | Calendar ID containing the events |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose meaningful semantics ('only the fields to change'), clarifying this is a partial/patch update, but it is silent on atomicity, what happens if one eventId fails mid-batch, permissions, and it never surfaces the dryRun behavior that the schema describes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly scoped sentences with zero waste, and the core purpose is front-loaded ahead of the structural constraint. Nothing is padded or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a bulk mutation with no annotations and no output schema, the description covers what an agent needs to construct a correct call (eventId required, only changed fields). It drops the dryRun capability and any batch-failure semantics, leaving minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents calendarId, dryRun, and the update fields. The description reinforces the eventId requirement and partial-update semantics, adding modest value, but introduces no format or syntax detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Update') and resource ('multiple calendar events') with the batch scope made explicit via 'in one call,' which distinguishes it from the singular update_event sibling. It does not name update_event or the other bulk_* event siblings directly, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'multiple ... in one call' implies the batch use case versus single-event updates, but the description never states when to prefer this over update_event, nor any exclusions or prerequisites. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_reminderC
Mark a reminder as completed in iCloud Reminders.
| Name | Required | Description | Default |
|---|---|---|---|
| listName | Yes | List name containing the reminder | |
| reminderId | Yes | Reminder ID to mark as completed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. For a mutation tool it says nothing about whether completion is reversible, whether it is idempotent, what happens with an invalid reminderId, or whether permissions are required. It reveals only the state transition itself, which the name already implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no wasted words, and the action is front-loaded. It is perhaps too terse to be maximally useful, but nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a mutation with no annotations and no output schema, so the description should carry behavioral and result context. It omits reversibility, error behavior, and what the agent can expect back, leaving the definition under-specified for a write operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (listName, reminderId) are already documented by the schema. The description adds no format, casing, or ID-sourcing detail beyond what the structured fields provide, making 3 the correct baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Mark a reminder as completed') and scopes it to iCloud Reminders, so the agent knows the target domain. It does not explicitly distinguish itself from update_reminder, which could plausibly perform the same state change, but the verb+resource pairing is unambiguous on its face.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus update_reminder, delete_reminder, or get_reminder. The only implied usage is that the reminder must already exist in the named list, and no prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compose_emailA
Compose and send a new email via iCloud SMTP. The From address is always your iCloud account. Supports plain text, HTML, or both (multipart/alternative).
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC recipient(s), comma-separated or array | |
| to | Yes | Recipient email address(es), comma-separated or array | |
| bcc | No | BCC recipient(s), comma-separated or array | |
| body | No | Plain text body (used as fallback when html is also provided) | |
| html | No | HTML body. If provided without body, plain text is auto-generated. If provided with body, sends multipart/alternative. | |
| replyTo | No | Reply-To address override | |
| subject | Yes | Email subject |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the From address constraint and multipart format behavior, but fails to mention that this is an irreversible external action (sending email), potential rate limits, or error handling. Critical safety context for a destructive-by-nature operation is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. First sentence establishes core function and transport mechanism; second covers sender constraint and format support. Every clause provides essential information not redundant with structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter email sending tool with no output schema and no annotations, the description covers format options and sender identity but omits discussion of delivery status, failure modes, or irreversibility. Adequate but lacks critical behavioral warnings expected for external-communication tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage (baseline 3). The description adds value by explaining the implicit From constraint (not in schema) and summarizing the body/html multipart relationship. It clarifies that body serves as fallback when html is provided, adding semantic context beyond individual field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Compose and send a new email via iCloud SMTP' - specific verbs (compose, send), resource (email), and mechanism (iCloud SMTP). It distinguishes from sibling tools like reply_to_email and forward_email by specifying 'new email' and the SMTP transport method.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through 'new email' but does not explicitly state when to use this versus similar siblings like reply_to_email or forward_email. No explicit 'when-not-to-use' or alternatives are named, though the tool name provides strong implicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
count_emailsA
Count how many emails match a set of filters without moving or deleting them. Use this before bulk_move or bulk_delete to preview how many emails will be affected.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Only emails since this date (YYYY-MM-DD) | |
| before | No | Only emails before this date (YYYY-MM-DD) | |
| domain | No | Match any sender from this domain (e.g. substack.com) | |
| larger | No | Only emails larger than this size in KB | |
| sender | No | Match exact sender email address | |
| unread | No | True for unread only, false for read only | |
| account | No | Account name to use (e.g. 'icloud', 'gmail'). Defaults to first configured account. Use list_accounts to see available accounts. | |
| flagged | No | True for flagged only, false for unflagged only | |
| mailbox | No | Mailbox to count in (default INBOX) | |
| smaller | No | Only emails smaller than this size in KB | |
| subject | No | Keyword to match in subject | |
| hasAttachment | No | Only emails with attachments (client-side BODYSTRUCTURE scan — must be combined with other filters that narrow results to under 500 emails first) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It successfully communicates the non-destructive/safe nature ('without moving or deleting'), which is critical given the sibling context. However, it lacks disclosure of return value format, rate limits, or performance characteristics beyond the hasAttachment constraint buried in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. First sentence front-loads the core action and safety guarantee; second sentence provides workflow context. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite 12 parameters and no output schema, the description omits what the tool returns (a number? an object?). The hasAttachment parameter has a critical 500-email limit constraint documented only in the schema. Adequate but has clear gaps regarding return value and high-impact parameter constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with 12 well-documented filter parameters. The description references 'a set of filters' acknowledging the filtering capability without redundant enumeration. Baseline 3 is appropriate since schema carries the full semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Count' with resource 'emails' and explicit scope 'without moving or deleting them'. Clearly distinguishes from destructive sibling tools like bulk_move and bulk_delete by contrasting its non-destructive nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Use this before bulk_move or bulk_delete to preview how many emails will be affected', providing clear workflow guidance and indicating when to prefer this tool over immediate destructive actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_calendarA
Create a new event calendar in iCloud Calendar. Fails if a calendar with that name already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the new calendar |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the name-collision failure mode, which the schema does not, but says nothing about permissions/authentication requirements, side effects on existing calendars, or what the call returns. Adequate but thin for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core action front-loaded and the failure condition following. Nothing in the text is redundant or restated from the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter creation tool with no output schema and no nested objects, the description covers what it creates and the one error case an agent must anticipate. It stops short of describing the returned handle/identifier for the new calendar, which would be the remaining useful detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter and schema description coverage is 100% ('Name of the new calendar'), so the schema already does the parameter work. The description adds no extra constraints on the name (length, uniqueness scope, allowed characters) beyond the failure note, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Create) and a precisely-named resource (a new event calendar in iCloud Calendar). The noun 'calendar' cleanly separates it from create_event, bulk_create_events, and create_reminder_list among the siblings, so an agent can route to it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb and the domain rather than stated: no explicit when-to-use guidance, no comparison to create_event or bulk_create_events for creating multiple calendars. The precondition 'Fails if a calendar with that name already exists' does give a usable constraint before calling, which lifts it above a bare 2.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_contactC
Create a new contact in iCloud Contacts.
| Name | Required | Description | Default |
|---|---|---|---|
| org | No | Organization / company name | |
| url | No | Website URL | |
| note | No | Notes / free text | |
| No | Primary email address (shorthand for emails array) | ||
| phone | No | Primary phone number (shorthand for phones array) | |
| emails | No | Array of email objects: [{ email, type }] where type is home/work/etc. | |
| phones | No | Array of phone objects: [{ number, type }] where type is cell/home/work/etc. | |
| birthday | No | Birthday in YYYY-MM-DD format | |
| fullName | No | Full display name (overrides firstName + lastName for FN field) | |
| lastName | No | Last name | |
| addresses | No | Array of address objects: [{ street, city, state, zip, country, type }] | |
| firstName | No | First name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. 'Create' implies a write operation, but description omits duplicate handling, return value (no output schema exists), idempotency, or whether partial failures are possible. Lacks disclosure of iCloud-specific behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely brief at six words. While not verbose, the extreme brevity contributes to under-specification given the tool's complexity. No filler content, but misses critical context that would earn a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Inadequate for a 12-parameter mutation tool with zero required fields (unusual design) and no output schema. Description fails to explain what constitutes a valid minimal contact or what the operation returns, leaving significant agent uncertainty.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are fully documented in the schema. Description adds no supplemental parameter guidance (e.g., precedence between 'fullName' vs 'firstName+lastName'), warranting the baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verb 'Create' and resource 'contact' with scope 'iCloud Contacts'. However, it does not explicitly distinguish from sibling tool 'update_contact' (e.g., clarifying this is for new records only).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this versus 'update_contact' or 'search_contacts'. Fails to mention the unusual 'all parameters optional' constraint, which is critical for an agent to understand minimum viable input.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_eventA
Create a new event in an iCloud calendar. For all-day events use allDay:true and YYYY-MM-DD for start/end.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End date/time — ISO 8601 or YYYY-MM-DD. Defaults to 1 hour after start. | |
| start | Yes | Start date/time — ISO 8601 (e.g. 2026-03-15T10:00:00) or YYYY-MM-DD for all-day | |
| allDay | No | True for all-day event (uses DATE values, no time) | |
| status | No | Event status: CONFIRMED, TENTATIVE, or CANCELLED | |
| summary | Yes | Event title | |
| location | No | Event location | |
| reminder | No | Alert this many minutes before the event (default 30, set to 0 to disable) | |
| timezone | No | IANA timezone (e.g. America/New_York). Use "UTC" or omit for UTC. | |
| calendarId | Yes | Calendar ID to add the event to | |
| recurrence | No | iCal RRULE string (e.g. FREQ=WEEKLY;BYDAY=MO,WE,FR) | |
| description | No | Event description / notes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the iCloud domain and all-day event behavior, but omits safety details (idempotency, validation errors), authorization requirements, and what the tool returns upon success.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: first establishes purpose, second delivers critical implementation detail for all-day events. Appropriately front-loaded and dense with actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter creation tool with no output schema or annotations, the description covers the essential use case but leaves gaps regarding return values, error conditions, timezone handling behavior, and integration with list_calendars.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema description coverage, the description adds value by explicitly linking the allDay flag to the YYYY-MM-DD format requirement ('use allDay:true and YYYY-MM-DD'), reinforcing the parameter interaction imperatively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Create a new event') and target resource ('iCloud calendar'), distinguishing it from sibling tools like update_event, delete_event, and email-related functions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides specific syntax guidance for all-day events ('use allDay:true and YYYY-MM-DD'), but lacks broader guidance on when to use this versus suggest_event_from_email or prerequisites like obtaining calendarId from list_calendars.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_mailboxC
Create a new mailbox/folder
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the new mailbox |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It fails to mention critical mutation behaviors: whether the operation is idempotent, if nested mailbox paths are supported, what happens if the name already exists, or what the return value indicates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely brief at only four words, containing no redundancy or filler. However, given the lack of annotations and behavioral context, it borders on under-specification rather than optimal conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter creation tool without an output schema, the description meets minimum viability by identifying the operation type. However, given zero annotation coverage, it should explicitly address folder nesting capabilities and uniqueness constraints to be fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the 'name' parameter is already well-documented as 'Name of the new mailbox'. The description adds no additional semantic context (e.g., naming restrictions, path separators for nesting), but the baseline score of 3 is appropriate given the schema's completeness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Create') and identifies the resource ('mailbox/folder'), clarifying that this refers to email folders rather than user accounts. However, it does not explicitly differentiate from sibling operations like 'rename_mailbox' or 'delete_mailbox', nor does it specify scope constraints (e.g., parent mailbox context).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, prerequisites (such as checking for existing mailboxes via 'list_mailboxes'), or error handling scenarios (e.g., duplicate names).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_reminderC
Create a new reminder in iCloud Reminders.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | Due date/time — ISO 8601 (e.g. 2026-03-20T09:00:00) | |
| notes | No | Notes / description | |
| title | Yes | Reminder title | |
| listName | Yes | List name to add the reminder to (required) | |
| priority | No | Priority: high, medium, low, or none (default none) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not disclose whether the target list must pre-exist, what happens to duplicate titles, whether defaults are applied, or what is returned; 'Create' implies mutation with no further detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler or redundancy. It is appropriately terse for the resource, though the brevity borders on under-specification rather than earned conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is too thin: it omits prerequisites, return behavior (e.g., a reminder ID needed for complete_reminder), and any interaction with list state. The agent lacks enough to invoke it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter documented (title, listName, due, notes, priority) in the schema itself. The description adds no extra param meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Create) and resource (reminder in iCloud Reminders), clearly distinct from create_reminder_list and update_reminder. However, it does not explicitly differentiate itself from its close siblings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites (e.g., must the list already exist?), and no mention of alternatives like create_reminder_list or update_reminder. The agent must infer context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_reminder_listA
Create a new Reminders list in iCloud Reminders. Fails if a list with that name already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the new list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose a real behavioral trait beyond the schema: the call fails if a list with that name already exists, making the operation non-idempotent on duplicates. However, it says nothing about permissions/account requirements, case sensitivity of the name match, or what is returned on success.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler, purpose front-loaded and the error precondition immediately after. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter create tool with no output schema and no annotations, the description covers what it does and the main failure mode. A brief note on the return value or name-matching rules would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter has its own description ('Name of the new list'), so the schema already does the work. The description adds only that the name must be unique, a constraint rather than a semantic expansion of the parameter itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new Reminders list') and scopes it to 'iCloud Reminders', which separates it from create_calendar and create_reminder in the sibling list. It does not explicitly name the related rename_reminder_list/delete_reminder_list tools, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The duplicate-name failure condition implies when the call will be rejected, but there is no explicit guidance on when to use this versus rename_reminder_list or list_reminder_lists (e.g., check first to avoid collisions). Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ruleA
Create a saved rule that applies a specific action to emails matching a set of filters. Rules are stored persistently and can be run on demand or all at once with run_all_rules.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Unique rule name (used to run or delete the rule) | |
| action | Yes | Action to apply to matching emails | |
| filters | Yes | Email filters (same as bulk_move/bulk_delete filters: sender, domain, subject, before, since, unread, flagged, larger, smaller) | |
| description | No | Optional human-readable description of what the rule does |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It successfully discloses the persistence model ('stored persistently') and execution lifecycle ('run on demand'). However, it fails to mention important behavioral traits: that rules perform real (potentially destructive) actions when run, what happens if a duplicate name is provided, or whether validation occurs immediately.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two efficient sentences with zero waste. The first sentence front-loads the core purpose, while the second adds essential behavioral context about persistence and execution. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high complexity (nested filter/action objects) and 100% schema coverage, the description adequately explains the tool's purpose and persistence model. It appropriately omits return value documentation since no output schema exists. Minor gap: lacks warning about destructive actions (delete) that rules can perform when executed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, establishing a baseline of 3. The description text implies the function of the 'filters' and 'action' parameters at a high level ('applies a specific action to emails matching a set of filters'), but does not add syntax details, format examples, or semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific verb (Create), resource (saved rule), and mechanism (applies action to emails matching filters). It effectively distinguishes from sibling bulk_* tools by emphasizing that rules are 'saved' and 'stored persistently' rather than executing immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool (creating reusable automation) by stating rules 'can be run on demand or all at once with run_all_rules.' It explicitly references the sibling execution tool run_all_rules. However, it lacks explicit 'when-not-to-use' guidance contrasting with immediate bulk operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_calendarA
Delete an iCloud event calendar by exact name or calendarId. The calendar must have no events (past or future); delete them first with bulk_delete_events. Will not delete Reminders lists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Exact calendar name (must match exactly one calendar) | |
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| calendarId | No | Calendar ID from list_calendars (use instead of name) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the hard guardrail (calendar must be empty, past and future events both count), the pointer to the tool that clears that blocker, and a scope exclusion. It does not state irreversibility, permission/auth requirements, or what the dryRun default is, which are meaningful gaps for an unannotated destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what it deletes, then the blocker and its workaround, then the exclusion. Every clause carries information an agent needs; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations, no output schema, and zero required parameters, the description adequately covers scope, precondition, and alternative. It is slightly thin on the edge case of supplying neither or both identifiers, and does not describe the delete's result or permanence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented, including the mutual-exclusivity note on calendarId ('use instead of name'). The description reinforces that identifiers must be exact but adds nothing about dryRun (e.g., default value or that it is the safe-preview flag), so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete an iCloud event calendar') plus the two identifiers it accepts (exact name or calendarId). It also implicitly separates itself from delete_event (calendars, not events) and delete_reminder_list ('Will not delete Reminders lists'), so an agent can route without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('The calendar must have no events (past or future)') and names the remedial alternative tool ('delete them first with bulk_delete_events'). It also states an explicit when-not case by excluding Reminders lists, which is exactly the sibling an agent might otherwise confuse this with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_contactB
Delete a contact from iCloud Contacts permanently.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| contactId | Yes | Contact ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose irreversibility via 'permanently', which is the most important trait for a destructive operation. However, it says nothing about required permissions, confirmation behavior, or how a missing/invalid contactId is handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb and permanence up front and zero filler. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive tool with no annotations and no output schema, the description is only marginally complete: 'permanently' is useful, but it omits whether deletion is recoverable, what errors occur for a nonexistent contactId, and any confirmation flow. It is adequate but leaves clear gaps for a delete operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both contactId and the dryRun safety flag are already documented in the schema, including that dryRun mutates nothing. The description adds no parameter-level detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (contact in iCloud Contacts) and adds a scope qualifier (permanently). The resource noun cleanly separates it from other delete_* siblings like delete_email, delete_event, and delete_reminder. It stops short of explicitly contrasting with update_contact or any bulk alternative, so it is clear but not sibling-differentiated by description text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus update_contact (to scrub fields) or any bulk cleanup path, and no prerequisite stated. The only usage signal is the implied one from the name itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_emailC
Delete a single email
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Email UID | |
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| mailbox | No | Mailbox name (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It states 'Delete' but does not disclose whether deletion is permanent, whether it moves to trash, whether a dryRun is available (despite the schema including one), or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded phrase with no wasted words. It is arguably under-specified, but the sentence itself is efficient and not verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is too sparse. It omits critical context such as the effect of dryRun, default mailbox behavior, and irreversibility, leaving the agent with insufficient information to call the tool safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters (uid, dryRun, mailbox) are documented in the input schema itself. The description adds no extra semantic detail beyond the schema, which is acceptable given full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Delete a single email'), and the word 'single' implicitly distinguishes it from bulk deletion siblings like bulk_delete. However, it does not explicitly name or contrast with those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus bulk_delete, move_email, or other deletion alternatives, and no preconditions or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_eventB
Delete a calendar event permanently from iCloud Calendar.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| eventId | Yes | Event ID to delete | |
| calendarId | Yes | Calendar ID containing the event |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses the irreversible nature ('permanently'), which is real behavioral value, but it omits authentication/permission requirements, iCloud sync behavior, and whether any confirmation or recovery exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb leading and zero filler. It is efficient and well-structured, though the extreme brevity leaves the information content thin.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple keyed delete with complete parameter documentation and no output schema, the essentials are present. However, a permanent destructive operation with no annotations arguably warrants more than one sentence covering irreversibility, permissions, and how to preview via dryRun.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including a clear dryRun explanation, so the schema already documents every parameter. The description adds no format or syntax detail beyond that, which matches the baseline of 3 when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: deleting a single calendar event, and adds platform scope ('from iCloud Calendar') plus permanence. An agent can readily distinguish it from delete_calendar or delete_reminder, though it never explicitly contrasts with the sibling bulk_delete_events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and no alternatives. It never tells the agent when to prefer this over bulk_delete_events for a single item or how it relates to get_event/list_events. Usage must be entirely inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_mailboxA
Delete a mailbox/folder. The folder must be empty first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Mailbox path to delete | |
| dryRun | No | If true, report exactly what would change and do not modify anything |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden. It discloses the critical empty-folder precondition, which is real added value, but says nothing about permanence/reversibility, what happens to subfolders, or whether the operation can be undone — gaps that matter for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, the action first and the precondition second; nothing is wasted and nothing needs to be read twice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with full schema coverage and a dryRun escape hatch, the description covers the essential constraint. Remaining gaps (permanence, subfolder handling) are modest given there is no output schema and the schema itself documents the safety valve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both 'name' and 'dryRun' documented in the schema itself. The description adds no meaning beyond that (e.g., path format, anchoring, or dryRun behavior), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a mailbox/folder'), which is unambiguous and distinct from sibling tools like delete_email, delete_calendar, and delete_reminder. It does not, however, explicitly contrast itself with adjacent siblings such as create_mailbox, rename_mailbox, or empty_trash.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'The folder must be empty first' is a genuine precondition that tells the agent when this call will fail, which is more than most terse definitions offer. But there is no guidance on alternatives (e.g., using delete_email or bulk_delete to clear contents, or empty_trash) and no statement of when to prefer this over those paths.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_older_thanC
Delete all emails older than a certain number of days
| Name | Required | Description | Default |
|---|---|---|---|
| days | Yes | Delete emails older than this many days | |
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| mailbox | No | Mailbox (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, yet it says nothing about permanence, reversibility, or required permissions. It mentions 'Delete all' but never notes that this is a destructive, likely irreversible mass operation, and it does not surface the schema's dryRun safeguard, which matters a lot for a bulk delete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence that front-loads the verb and the subject. It earns its place but is arguably under-specified for a destructive bulk operation, which is a completeness issue rather than a conciseness one.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mass-destruction tool with no annotations and no output schema, the description is too thin. It omits the dryRun preview option, the mailbox scoping, and any warning about permanence—context an agent needs to invoke this safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so days, dryRun, and mailbox are each already documented in the schema (including the dryRun safety semantics). The description adds no syntax or format detail beyond restating the day-threshold concept, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Delete') with a precise resource and scope ('all emails older than a certain number of days' by a day threshold). This distinguishes it from generic deletes like delete_email or bulk_delete. However, it does not differentiate itself from the near-identical sibling archive_older_than, which shares the exact 'older than N days' pattern, leaving the agent to infer the destructive-vs-archive distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives such as archive_older_than or empty_trash. The description gives no indication of when this threshold-based bulk deletion is appropriate versus other delete tools in the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_reminderB
Delete a reminder from iCloud Reminders permanently.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| listName | Yes | List name containing the reminder | |
| reminderId | Yes | Reminder ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses the critical trait that deletion is permanent (irreversible), which is valuable. However, it omits other behavioral context such as dry-run interaction, failure behavior, or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that names the action and scope without any wasted words. It is appropriately sized for a simple delete tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with full schema coverage and no output schema, the description is minimally sufficient to invoke correctly. However, it lacks sibling differentiation and usage context that would help an agent choose between deleting, completing, or updating a reminder.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters including dryRun. The description adds no additional parameter semantics, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Delete') and resource ('a reminder from iCloud Reminders') plus an important scope qualifier ('permanently'). It does not explicitly differentiate from siblings such as complete_reminder or update_reminder, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use, when-not-to-use, or alternative guidance. The description only states what the tool does; it does not help an agent choose it over complete_reminder, update_reminder, or bulk delete tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_reminder_listA
Delete a Reminders list. The list must be empty first, and the name must match exactly one list.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Exact name of the list to delete | |
| dryRun | No | If true, report exactly what would change and do not modify anything |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description has to carry the whole behavioral burden. It usefully discloses a non-obvious precondition: the list must be empty. It does not say what happens when that precondition fails (error or refusal), whether the deletion is permanent, or whether confirmation is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the destructive action is named before its preconditions. Every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is an unannotated mutation with no output schema, so the description should do more. The precondition and the name-uniqueness rule are covered, but failure behavior, irreversibility, and how dryRun changes the outcome are left to the schema and to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented and the baseline is 3. The description adds real meaning beyond the schema by saying the name must resolve to exactly one list, which tells the agent that an ambiguous name will not delete anything. It says nothing about dryRun, but the schema covers that field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Delete a Reminders list" gives a specific verb plus resource, and the noun "list" cleanly separates it from the sibling delete_reminder and from delete_calendar or delete_mailbox. An agent can pick it out of the sibling set without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisite (the list must be empty) and the name-matching condition (the name must match exactly one list), which controls when a call will succeed. It does not point at alternatives such as delete_reminder for removing individual reminders or rename_reminder_list, so it stops just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_ruleC
Delete a saved rule by name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Rule name to delete | |
| dryRun | No | If true, report exactly what would change and do not modify anything |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden and does not meet it: it never says the deletion is permanent, whether the rule must exist, or what happens on an unknown name. The one mitigating detail, the schema's dryRun flag, is never referenced in the description, so its role as a preview mechanism is left for the agent to discover in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler and the key constraint (identify by name) up front. It is efficient, though the terseness is a symptom of missing behavioral content rather than tight editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is an irreversible mutation with no annotations and no output schema, so the description is the only place to disclose safety and effect. It omits permanence, error behavior on a missing rule, and any mention of the dryRun preview, leaving an agent under-informed before a destructive call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both 'name' and 'dryRun' are already documented at the field level; this sets the baseline at 3. The description's 'by name' phrase aligns with the required parameter but adds no syntax, matching rules, or case-sensitivity detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a saved rule') and scopes it to lookup by name, which cleanly separates it from create_rule, list_rules, and run_rule in the sibling set. It stops short of any explicit sibling differentiation, but the verb alone is a reliable discriminator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus run_rule, run_all_rules, or create_rule, and no prerequisites stated. The agent gets no hint about the existence of a dryRun safety path before invoking a destructive operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_conflictsA
Detect scheduling conflicts and tight gaps between events across multiple calendars. Compares all non-all-day events on the same date from different calendars.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Start of range (YYYY-MM-DD, default: today) | |
| before | No | End of range (YYYY-MM-DD, default: 90 days ahead) | |
| minBuffer | No | Minimum buffer minutes between events to flag tight gaps (default 0 = no gap check) | |
| calendarIds | Yes | Array of calendar IDs to check for conflicts |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It discloses a real behavioral rule (only non-all-day events, only same-date comparisons across different calendars), which is valuable. However, it omits that this is a read-only operation, what a returned conflict/gap record looks like, and any limits on calendar count or range size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, each earning its place: the first states purpose and scope, the second supplies the comparison rule. Purpose is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must carry more. It explains the comparison logic but never describes what a detected conflict or tight gap returns, which is exactly what an agent needs to interpret results from a detection tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents since, before, minBuffer, and calendarIds with types and defaults. The description only echoes the 'tight gaps' concept behind minBuffer and the multi-calendar meaning of calendarIds, adding little beyond the structured fields. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (Detect) and resource (scheduling conflicts and tight gaps between events) and scopes it to multiple calendars, non-all-day events, and same-date comparisons. No sibling tool performs conflict detection, so this is unambiguously distinguished from list_events, search_events, and get_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the scope ('across multiple calendars', 'non-all-day events on the same date') suggests when the check is meaningful, but the description never states when to reach for this versus search_events or list_events_multi, nor any precondition such as needing calendar IDs up front. Adequate but with a clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
empty_trashA
Permanently delete all emails in the trash (Deleted Messages or Trash folder). Use dryRun: true to preview first.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, preview how many emails would be deleted without deleting |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full disclosure burden. Successfully communicates destructive nature ('Permanently delete') and safety mechanism (dryRun preview). Missing return value description and rate limit details, but 'permanently' adequately warns of irreversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. Front-loaded with critical behavioral info ('Permanently delete') immediately signaling danger, followed by safety instruction. Perfect density for the tool complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with 100% schema coverage and no output schema, the description is complete. Covers scope (trash folder), destructive nature, and safety mechanism. No significant gaps given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage (baseline 3). Description adds value beyond schema by prescribing usage semantics ('preview first') rather than just defining the boolean, helping the agent understand WHEN to set dryRun=true.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear specific verb ('Permanently delete') + resource ('emails in the trash') + scope ('all'). Clarifies folder name variations ('Deleted Messages or Trash folder') to distinguish from other mailboxes, effectively differentiating from sibling deletion tools like bulk_delete or delete_email.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit safety guidance ('Use dryRun: true to preview first') which establishes a recommended workflow before destructive execution. Lacks explicit comparison to siblings (e.g., when to use this vs bulk_delete), but the trash-specific scope makes usage context largely self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flag_emailA
Flag or unflag a single email
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Email UID | |
| flagged | Yes | True to flag, false to unflag | |
| mailbox | No | Mailbox name (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It successfully indicates the bidirectional nature of the operation (both flagging and unflagging), but omits details about idempotency, error handling for invalid UIDs, or whether the operation is persistent/write-based.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It front-loads the core action and scope immediately, with no filler words or redundant explanations that duplicate the schema information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (3 simple parameters, 100% schema coverage) and lack of output schema, the description provides sufficient context for agent selection. It appropriately omits return value documentation (not required without output schema) but could be improved by noting the state-changing nature of the operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage (uid, flagged, mailbox are all well-documented). Since the schema comprehensively defines parameter semantics including the default mailbox behavior, the description appropriately adds no redundant parameter details, meeting the baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description provides specific verbs ('Flag or unflag') and resource ('single email'), clearly distinguishing it from sibling tools like 'bulk_flag' by emphasizing the singular scope. It loses one point for not clarifying what 'flag' means in this email context (e.g., starring vs. marking as important).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage constraints by specifying 'single email', suggesting it shouldn't be used for bulk operations. However, it fails to explicitly name 'bulk_flag' or 'bulk_flag_by_sender' as alternatives for multiple emails, leaving the agent to infer this from the naming convention alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forward_emailB
Forward an existing email to one or more recipients. Fetches the original email body and includes it as a forwarded message block. Supports plain text and/or HTML note.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC recipients | |
| to | Yes | Recipient(s) to forward to, comma-separated or array | |
| uid | Yes | UID of the email to forward | |
| html | No | Optional HTML note to prepend (overrides plain text note for HTML rendering) | |
| note | No | Optional plain text note to prepend before the forwarded message | |
| mailbox | No | Mailbox containing the original email (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool 'fetches the original email body' (read behavior) and formats it as a forwarded block, plus prepends notes. However, it omits whether the original email is marked as forwarded, if a copy appears in the sent folder, or what the return value indicates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three well-structured sentences: purpose statement, mechanism explanation, and feature support. No redundancy or filler. Each sentence adds distinct value (what it does, how it handles content, what formatting it supports).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for basic invocation given the comprehensive schema, but gaps remain regarding side effects and return values due to the absence of annotations and output schema. Missing: whether the operation creates a sent item, marks the original, or returns the new message ID.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, establishing a baseline of 3. The description references 'one or more recipients' (to) and 'plain text and/or HTML note' (note/html), aligning with the schema but adding minimal semantic detail beyond what the schema already provides for the 6 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb ('Forward') and resource ('existing email'), with specific detail about including the original body as a forwarded block. Distinguishes implicitly from siblings like compose_email or reply_to_email by describing the forwarding mechanics, though it doesn't explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus similar tools like reply_to_email or compose_email. Given the sibling list includes both reply_to_email and get_email, explicit differentiation (e.g., 'use this to send to new recipients rather than responding to the original sender') would prevent selection errors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_attachmentA
Download a specific attachment from an email. Returns the file content as base64-encoded data. Use list_attachments first to get the partId. Maximum 20 MB per request; use offset+length for larger files.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Email UID | |
| length | No | Max bytes to return for paginated download (default 20 MB) | |
| offset | No | Byte offset for paginated download (returns raw encoded bytes, not decoded) | |
| partId | Yes | IMAP body part ID from list_attachments (e.g. "2", "1.2") | |
| mailbox | No | Mailbox name (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and successfully discloses output format ('base64-encoded data'), size constraints ('Maximum 20 MB'), and pagination behavior. Lacks explicit read-only/safety declaration but 'download' implies non-destructive access.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with zero waste: purpose, return format, prerequisite workflow, and operational limits. Information is front-loaded and logically ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Comprehensive given no annotations or output schema. Covers return value format, prerequisites, and pagination strategy. Would be a 5 with explicit mention of error handling or idempotency, but adequately complete for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3). Description adds valuable semantic context: linking partId to the list_attachments prerequisite and explaining that offset+length work together for paginated downloads of large files.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Download') and resource ('attachment'), clearly distinguishing this from sibling 'list_attachments' by implying content retrieval vs. metadata listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the prerequisite workflow ('Use list_attachments first to get the partId') and provides clear pagination guidance for large files ('use offset+length for larger files'), covering both normal and edge-case usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contactA
Get full details for a specific contact by ID. Use list_contacts or search_contacts to find a contactId.
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Contact ID (UUID from list_contacts or search_contacts) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. The verb 'Get' implies a read-only operation (safe, non-destructive), but lacks details on error behavior (e.g., invalid ID), rate limits, or specific return structure beyond 'full details'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: first states purpose, second provides prerequisite workflow. Front-loaded with the core action and appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter retrieval tool with complete schema coverage, the description is functionally complete. It omits specific return value structure (no output schema exists), but 'full details' provides sufficient context for an agent to infer this returns a contact object.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage with contactId defined as a UUID from sibling tools. Description reinforces this workflow ('by ID') but does not add syntax details, validation rules, or format constraints beyond what the schema already provides. Baseline 3 appropriate given complete schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verb 'Get' with resource 'contact' and scope 'by ID'. It clearly distinguishes from sibling tools 'list_contacts' and 'search_contacts' by implying this is for direct ID lookup versus browsing/searching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use alternatives: 'Use list_contacts or search_contacts to find a contactId.' This provides clear workflow guidance (find ID first, then get details) and explicitly names sibling alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_digest_stateA
Get the current inbox digest state — last run timestamp, processed email UIDs (to skip on next run), pending actions, and per-sender skip counts for smart unsubscribe.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It successfully discloses behavioral semantics by explaining what the data represents (UIDs for skipping, skip counts for 'smart unsubscribe'), though it omits explicit read-only declaration or performance characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single efficient sentence with em-dash separated clauses. Front-loaded with action verb, followed by parenthetical elaboration. Zero waste; every clause explains a specific component of the returned state.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but description fully compensates by enumerating the specific fields and their semantic purposes (e.g., 'to skip on next run'). Adequate for a parameter-less state retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 0 parameters with 100% coverage. Per rubric, 0 params = baseline 4. Description appropriately does not mention parameters since none exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Get') + resource ('inbox digest state') with clear differentiation from siblings like get_inbox_summary via detailed field enumeration (last run timestamp, processed UIDs, pending actions, per-sender skip counts).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context about what data is returned and implies workflow (processed UIDs 'to skip on next run'), but does not explicitly name alternatives (e.g., 'use update_digest_state to modify') or explicit when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_emailB
Get full content of a specific email by UID
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Email UID | |
| mailbox | No | Mailbox name (default INBOX) | |
| maxChars | No | Max body characters to return (default 8000, max 50000) | |
| includeHeaders | No | If true, include a headers object with to/cc/replyTo/messageId/inReplyTo/references/listUnsubscribe |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure but fails to state whether this marks the email as read, what happens if the UID doesn't exist, or the return format structure. 'Full content' hints at scope but safety profile and side effects are unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, nine words, front-loaded with action verb. No filler or redundant phrases. Given the high schema coverage, this efficient length is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Minimum viable for a 4-parameter retrieval tool. While the schema covers parameters well, the absence of output schema and annotations leaves gaps regarding return structure and operational safety that the description does not fill. Adequate but could specify error handling or return format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, documenting all four parameters (uid, mailbox, maxChars, includeHeaders) adequately. The description mentions 'by UID' reinforcing the required parameter, but adds no semantic detail beyond the schema regarding character limits or header structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get'), resource ('full content of a specific email'), and lookup method ('by UID'), distinguishing it from bulk retrieval siblings like get_emails_by_date_range. However, it does not explicitly differentiate from get_email_raw (likely returns MIME source) or clarify if this returns structured data vs. raw content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance provided on when to use this tool versus alternatives like get_email_raw, get_thread, or read_inbox. Does not mention prerequisites such as needing a valid UID from list_mailboxes or search_emails first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_email_rawA
Get the raw RFC 2822 source of an email (full headers + MIME body) as base64-encoded data. Useful for debugging or export. Capped at 1 MB.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Email UID | |
| mailbox | No | Mailbox name (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses critical behavioral traits: base64 encoding format, inclusion of 'full headers + MIME body', and 'Capped at 1 MB' size limitation. Could improve by stating error behavior when limit exceeded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste: core action (sentence 1), use case guidance (sentence 2), limitation warning (sentence 3). Front-loaded with the most critical information (RFC 2822 source).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter fetch operation without output schema, description adequately covers return format, size constraints, and intended use cases. Missing only explicit read-only safety declaration, though implied by 'Get'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% ('Email UID', 'Mailbox name'), so baseline is 3. Description does not add parameter semantics beyond what schema provides, but none are needed given complete schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Get' + precise resource 'raw RFC 2822 source' + format 'base64-encoded' clearly distinguishes from sibling 'get_email' by emphasizing raw headers/MIME body vs parsed content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States 'Useful for debugging or export' providing clear contextual guidance on when to use this over standard email retrieval. Lacks explicit 'when not to use' or named alternative, but the niche use case is clearly signaled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_emails_by_date_rangeC
Get emails between two dates
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 10) | |
| endDate | Yes | End date (YYYY-MM-DD) | |
| mailbox | No | Mailbox (default INBOX) | |
| startDate | Yes | Start date (YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure, yet it fails to indicate whether this is a read-only operation, what data structure is returned, or how pagination/limiting behaves despite the presence of a limit parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence is efficiently worded without redundancy and places the core action at the front; however, it is arguably too brief given the tool's complexity and lack of supporting annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 4 parameters, no output schema, no annotations, and numerous sibling retrieval tools, the 5-word description is insufficiently complete to support confident tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage for all 4 parameters (startDate, endDate, mailbox, limit), so the schema carries the semantic weight; the description adds no additional parameter context beyond implying date-range filtering.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action ('Get') and resource ('emails') with specific scope ('between two dates'), but fails to differentiate from siblings like search_emails or get_emails_by_sender that could overlap in functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this tool versus alternatives such as search_emails (which supports complex filtering) or get_emails_by_sender, nor any prerequisites or constraints beyond the date range.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_emails_by_senderC
Get all emails from a specific sender
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to show (default 10) | |
| sender | Yes | Sender email address or domain | |
| mailbox | No | Mailbox to search (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry full behavioral disclosure burden. It fails to clarify whether results include full message bodies or just metadata (given 'get_email' exists for individual retrieval), pagination behavior, or the conflict between 'all' and the limit parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single-sentence structure is appropriately brief, but the use of 'all' is misleading given the limit parameter, wasting the limited descriptive real estate on inaccurate scope definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 50+ sibling tools including multiple search/retrieval variants and no output schema, the description is insufficient. It should clarify return format (list of IDs vs full objects), distinguish from 'search_emails', and explain the domain-search capability implied by the parameter schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage (all 3 parameters documented), the baseline is 3. The description adds no additional parameter context (e.g., that 'sender' accepts domains per the schema description, or that 'limit' defaults to 10).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the core action (Get) and filter (specific sender), but claims 'all' emails which contradicts the default limit of 10 in the schema. It also fails to distinguish from the sibling 'search_emails' tool, which likely overlaps in functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance provided on when to use this versus 'search_emails' or 'get_emails_by_date_range'. Does not mention prerequisites like mailbox access permissions or whether sender accepts domains (as hinted in parameter schema).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eventA
Get full details of a specific calendar event by its ID.
| Name | Required | Description | Default |
|---|---|---|---|
| eventId | Yes | Event ID (UUID from list_events or search_events) | |
| calendarId | Yes | Calendar ID containing the event |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. 'Get' implies a read-only operation and 'full details' suggests comprehensive data return, but it lacks disclosure of error handling (e.g., event not found) or authorization requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence of appropriate length with no redundant words. Information is front-loaded with the action ('Get full details') immediately clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter retrieval tool with complete schema coverage, the description adequately covers the tool's purpose and scope. Minor gap regarding error behavior keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the structured fields adequately document parameters. The description does not add parameter semantics, but the baseline 3 is appropriate given the schema's completeness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verb 'Get' with resource 'calendar event' and scope 'by its ID', clearly distinguishing it from sibling tools like list_events, search_events, create_event, and delete_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by its ID' implies usage when a specific identifier is known, likely from list_events or search_events (referenced in schema), but lacks explicit when-to-use guidance or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inbox_summaryC
Get a summary of a mailbox including total, unread, and recent email counts
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Account name to use (e.g. 'icloud', 'gmail'). Defaults to first configured account. Use list_accounts to see available accounts. | |
| mailbox | No | Mailbox name (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. While 'Get' implies a read operation, the description does not explicitly confirm this is read-only, safe, or without side effects. It also fails to define what constitutes 'recent' (time window) or mention any rate limits or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that places the action verb at the beginning. It avoids redundancy with the schema, though its brevity contributes to the lack of differentiation from sibling tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (2 parameters, no nested objects, no output schema), the description minimally suffices by indicating the return value structure. However, it lacks completeness regarding the tool's relationship to 'get_mailbox_summary' and does not clarify behavioral safety in the absence of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for both parameters ('mailbox' and 'account'), including default values. The description does not add semantic meaning beyond what the schema already provides, which warrants the baseline score of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the action ('Get a summary') and return value ('total, unread, and recent email counts'), but creates ambiguity with the sibling tool 'get_mailbox_summary'. It fails to clarify whether this tool is inbox-specific (as the name suggests) or works for any mailbox (as the description and parameter suggest), leaving the agent uncertain about which tool to select.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'get_mailbox_summary', 'count_emails', or 'read_inbox'. The description does not mention prerequisites or conditions for use, despite the existence of functionally similar sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mailbox_summaryA
Get total, unread, and recent email counts for any specific mailbox/folder
| Name | Required | Description | Default |
|---|---|---|---|
| mailbox | Yes | Mailbox path to summarize (e.g. Newsletters, Archive) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. States it retrieves counts but fails to define what 'recent' means (time window?), disclose performance characteristics, or describe the return structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single efficient sentence front-loaded with specific metrics (total, unread, recent). Zero redundancy; every word specifies scope or resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple single-parameter read operation. Minor gap: undefined 'recent' metric and no output schema, though the three count types are enumerated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with the 'mailbox' parameter well-documented ('Mailbox path to summarize'). Description mentions 'mailbox/folder' but adds no semantic details beyond the schema (e.g., case sensitivity, path separators, validation rules).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Get' with clear resource 'mailbox/folder' and precise scope 'total, unread, and recent email counts'. Effectively distinguishes from sibling 'get_inbox_summary' by emphasizing 'any specific' folder capability.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage for arbitrary folders via 'any specific mailbox/folder', differentiating it from inbox-specific tools, but lacks explicit when-to-use guidance or named alternatives like 'count_emails' or 'get_inbox_summary'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_move_statusA
Check the status of the current or most recent bulk move operation. Shows progress, chunk statuses, and any failures. Call this to monitor a long-running move or inspect a failed one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral disclosure burden. It effectively communicates key traits: it returns 'progress, chunk statuses, and any failures', operates on 'current or most recent' operation (statefulness), and handles 'long-running' async operations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three well-structured sentences: first states core purpose, second describes return data, third provides usage guidance. Every sentence earns its place with zero redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description adequately explains what information is returned (progress, chunks, failures). Given zero parameters and the specific monitoring purpose, the description provides sufficient context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 0 parameters, which per guidelines sets baseline 4. The description correctly implies no inputs are required by focusing entirely on the operation's behavior and output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verb 'Check' with resource 'status of the current or most recent bulk move operation', clearly distinguishing it from sibling tools like 'bulk_move' (which initiates moves) and 'abandon_move' (which cancels them).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance ('Call this to monitor a long-running move or inspect a failed one'), clearly indicating this is for polling/inspection rather than initiation. Does not explicitly name alternative tools, though the context makes the distinction clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reminderC
Get full details of a specific reminder by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| listName | Yes | List name containing the reminder | |
| reminderId | Yes | Reminder ID from list_reminders |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 'Get full details' hints at the return shape, but nothing is said about error behavior for a missing reminder, required permissions, or whether the lookup is scoped to an account. For a zero-annotation tool this is thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the verb and resource front-loaded and no filler. It is arguably too terse to be ideal, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description is minimally adequate. However, with no annotations and no output schema, it omits the failure mode for an unknown ID and the meaning of the required listName scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both listName and reminderId described in the schema, so the baseline is 3. The description adds only the phrase 'by ID' and does not clarify the role of listName or the ID format, so it does not exceed the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (reminder) with a scope qualifier (specific reminder by ID), which cleanly separates it from list_reminders, create_reminder, update_reminder, and complete_reminder. It does not explicitly name or contrast with a sibling tool, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no preconditions, and no alternatives. The only indirect hint is that the ID comes from list_reminders, and even that is only in the schema field description, not the tool description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_storage_reportA
Estimate storage usage by size bucket and identify top senders by email size. Uses SEARCH LARGER queries for bucketing and samples large emails for sender analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| mailbox | No | Mailbox to analyze (default INBOX) | |
| sampleSize | No | Max number of large emails to sample for sender analysis (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, description carries the full burden and successfully discloses implementation methodology: it uses 'SEARCH LARGER queries' for bucketing and performs 'sampling' (not exhaustive analysis). Does not mention performance costs or read-only nature, though implied by 'Estimate' and 'get' prefix.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. First sentence front-loads the value proposition (what it does), second sentence explains methodology (how it works). Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter analysis tool with no output schema, the description adequately explains what the report contains (size buckets, top senders by size). Could be improved by noting that results are estimates/samples, but sufficient for tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, establishing baseline 3. Description adds value by connecting sampleSize to 'sender analysis' and implying mailbox scopes the storage analysis, providing functional context beyond the schema's mechanical descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states specific actions: 'Estimate storage usage by size bucket' and 'identify top senders by email size.' Effectively distinguishes from sibling get_top_senders by specifying size-based analysis rather than frequency-based analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides implicit context that this is for storage analysis, but lacks explicit when-to-use guidance versus alternatives like get_mailbox_summary or search_emails. Does not specify prerequisites or when to prefer this over get_top_senders.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_threadA
Find all emails in the same thread as a given email. Uses subject matching + References/In-Reply-To header filtering. Note: iCloud does not support server-side threading — results are approximate.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Email UID to find the thread for | |
| mailbox | No | Mailbox to search (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations provided, description carries full disclosure burden excellently. Reveals implementation algorithm (subject matching + References/In-Reply-To headers) and platform-specific limitation (iCloud lacks server-side threading, results approximate). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste: sentence 1 states purpose, sentence 2 reveals implementation method, sentence 3 warns about platform limitation. Front-loaded with action and resource. Efficient density of information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, description adequately covers behavioral complexity (threading logic, header parsing, platform variance). Missing only minor details like return format or error handling for invalid UIDs, but explains the critical approximation caveat for iCloud users.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage (uid defined as 'Email UID to find the thread for', mailbox as 'Mailbox to search'). Description implies uid references the anchor email but doesn't add syntax, format constraints, or validation rules beyond schema. Baseline 3 appropriate given complete schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with specific verb 'Find' + resource 'emails' + scope 'in the same thread as a given email', clearly distinguishing from sibling get_email (single email retrieval) and search_emails (general criteria search). The threading concept is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides important technical context about iCloud limitations and result approximation, implying reliability concerns. However, lacks explicit guidance on when to use this versus search_emails or get_email for conversation reconstruction, and doesn't specify prerequisites like UID validity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_top_sendersA
Get the top senders by email count from a sample of the inbox
| Name | Required | Description | Default |
|---|---|---|---|
| mailbox | No | Mailbox to analyze (default INBOX) | |
| maxResults | No | Max number of senders/domains to return (default 20) | |
| sampleSize | No | Number of emails to sample (default 500) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the sampling behavior (non-exhaustive analysis), but omits safety characteristics (read-only status), performance implications of large sample sizes, or return value structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence that is front-loaded with the action ('Get the top senders') and efficiently qualifies it with the metric ('by email count') and scope ('from a sample'). No redundant words or wasted space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter analytical tool with simple types and no output schema, the description adequately covers the core functionality and key limitation (sampling). It appropriately relies on the schema for parameter details, though explicit read-only assurance would improve completeness given the lack of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, establishing a baseline of 3. The description provides context that 'sampleSize' relates to inbox sampling, but does not add syntax details, valid ranges, or semantic relationships beyond what the schema property descriptions already provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves sender frequency data ('top senders by email count') and specifies the methodology ('from a sample'). However, it does not explicitly distinguish from sibling tool 'get_unread_senders', which likely performs similar ranking but only on unread messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mention of 'sample' implicitly signals this is for approximate/quick analysis rather than exhaustive reporting, which helps usage context. However, there is no explicit guidance on when to choose this over 'get_emails_by_sender' or 'search_emails' for sender analysis.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_unread_sendersC
Get top senders of unread emails
| Name | Required | Description | Default |
|---|---|---|---|
| mailbox | No | Mailbox to analyze (default INBOX) | |
| maxResults | No | Max number of senders to return (default 20) | |
| sampleSize | No | Number of emails to sample (default 500) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure but fails to state whether this is read-only (implied by 'Get' but not explicit), what data structure is returned, or how 'top' is calculated. No mention of pagination or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely brief (6 words) and front-loaded with no filler. While not wasteful, the brevity contributes to under-specification given the lack of annotations and output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema and annotations, the description should explain the return format (list of sender strings? objects with counts?) and ranking logic. It provides neither, leaving significant gaps for an agent attempting to interpret results or handle errors.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema adequately documents all three parameters (mailbox, sampleSize, maxResults). The description mentions 'top senders' which loosely maps to maxResults, but doesn't add syntax details or usage guidance beyond the schema definitions. Baseline score appropriate given schema completeness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('Get') and resource ('senders of unread emails'), and the 'unread' qualifier distinguishes it from sibling tool 'get_top_senders'. However, it doesn't define what 'top' means (frequency, recency, etc.), leaving the ranking criteria ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance provided on when to use this versus 'get_top_senders', 'get_inbox_summary', or 'search_emails'. No mention of prerequisites, performance implications of the sampleSize parameter, or when bulk operations might be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_unsubscribe_infoA
Get the List-Unsubscribe header from an email, parsed into email and URL components. Useful for AI-assisted inbox cleanup.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Email UID | |
| mailbox | No | Mailbox name (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses the parsing behavior (splitting into email/URL components) which explains output structure, but fails to declare safety properties (read-only), error behavior when header is missing, or whether the operation is idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences totaling 17 words. First sentence front-loads the core function; second provides use-case context. No redundancy or filler. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter tool with no output schema, the description partially compensates by describing the return structure ('parsed into email and URL components'). However, it omits behavior when the header is absent. Reasonably complete for low-complexity tool but could specify return format more explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with 'uid' and 'mailbox' already well-described in the input schema. Description adds no additional parameter semantics (e.g., UID format, mailbox path conventions), so baseline 3 is appropriate per scoring rules for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description provides specific verb ('Get'), exact resource ('List-Unsubscribe header'), and processing detail ('parsed into email and URL components'). Clearly distinguishes from sibling 'get_email' by specifying header-specific extraction rather than full message retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides implied usage context ('Useful for AI-assisted inbox cleanup') suggesting when to use it, but lacks explicit when-not guidance or comparison to alternatives like using 'get_email' and parsing manually. No mention of prerequisites like email UID availability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsA
List all configured email accounts (names and IMAP hosts). Use the account name in any mail tool's account parameter.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full disclosure burden. Mentions return content (names and hosts) but omits safety profile (read-only), error handling, return format structure, or idempotency characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: first states purpose, second states usage context. Front-loaded with action verb and immediately useful. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple parameter-less tool. Mentions what data is returned despite lack of output schema. Could improve by specifying return format (array vs object) or empty-state behavior, but sufficient for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters present (empty schema). Per rubric, baseline is 4 for zero-parameter tools. Description appropriately focuses on return value usage rather than nonexistent inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'List' with clear resource 'configured email accounts' and specifies returned fields (names and IMAP hosts). Distinct from sibling list_mailboxes by focusing on account configuration rather than folders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states to 'Use the account name in any mail tool's account parameter,' establishing clear workflow relationship to sibling tools. Lacks explicit 'when not to use' exclusions, 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_attachmentsA
List all attachments in an email without downloading them. Returns filename, MIME type, size, and IMAP part ID for each attachment.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Email UID | |
| mailbox | No | Mailbox name (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and effectively discloses the return structure (filename, MIME type, size, IMAP part ID) and the non-destructive, read-only nature of the operation. It could improve by mentioning behavior when no attachments exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficiently structured sentences with zero waste: first establishes the action and key behavioral constraint (no download), second specifies return fields. Information is front-loaded and dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description appropriately enumerates the returned fields for each attachment. For a 2-parameter tool with complete schema coverage, this is sufficient, though explicitly stating it returns an array would be ideal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage ('Email UID', 'Mailbox name'), meeting the baseline. The description adds context by stating these parameters identify 'an email' but does not elaborate on UID format or mailbox naming conventions beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action (List) and resource (attachments), and distinguishes from sibling tool 'get_attachment' by emphasizing 'without downloading them', clarifying this is a metadata-only operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without downloading them' implicitly guides the agent to use this for metadata inspection versus 'get_attachment' for content retrieval. However, it lacks explicit 'when not to use' guidance or prerequisites (e.g., requiring the email UID to exist).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_calendarsA
List all calendars in iCloud Calendar (e.g. Personal, Work, School). Returns calendarId, name, and supported event types. When ICLOUD_MCP_SUBSCRIBED_CALENDARS=on, configured read-only subscribed (ICS/webcal) calendars are included with readOnly:true and subscribed:true, and subscribedCalendars reports that setting.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does a decent job: it discloses the read-only nature, the exact return fields, and non-obvious conditional behavior (subscribed ICS/webcal calendars appear with readOnly:true and subscribed:true, plus a subscribedCalendars flag reflecting the setting). It stops short of auth/permission requirements or failure modes, but the conditional-flag disclosure goes beyond what a bare list tool usually offers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and sample values, then the return shape, then the conditional edge case — a logical progression. The final sentence is dense and comma-heavy, but every clause carries new information, so nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with no annotations and no output schema, the description supplies exactly what an agent needs: what is listed, what fields come back, and how results change under the subscribed-calendars setting. There is no material gap left for a correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 — there is nothing for the description to disambiguate. The mention of an environment variable is genuinely useful context, but it is not a call-site parameter and does not raise the score further.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb plus resource ('List all calendars in iCloud Calendar') and scopes it with examples (Personal, Work, School). The resource word 'calendars' cleanly separates it from siblings like list_events, list_mailboxes, and list_reminder_lists, and the enumerated return fields (calendarId, name, supported event types) remove any ambiguity about what comes back.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — an agent can infer this is the discovery step before list_events or create_event, but the description never says so explicitly nor names any alternative or exclusion. The one conditional it does give (ICLOUD_MCP_SUBSCRIBED_CALENDARS=on) is about behavior, not about 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.
list_contactsA
List contacts from iCloud Contacts. Returns names, phones, emails, and other fields.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max contacts to return (default 50) | |
| offset | No | Skip this many contacts (default 0, for pagination) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the burden of disclosure and successfully specifies return fields (names, phones, emails) compensating for the missing output schema. However, it omits explicit safety declarations (read-only nature) or pagination behavior details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: first establishes scope and source (iCloud Contacts), second discloses return payload structure. Every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter tool with no output schema, the description adequately covers the data returned and source system. Could be improved by noting this retrieves all contacts (subject to pagination) versus filtered results, but sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage for both parameters (limit and offset), the schema fully documents the pagination interface. The description adds no supplemental parameter semantics, meeting the baseline for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verb 'List' with resource 'contacts from iCloud Contacts', clearly distinguishing it from sibling tools like get_contact (singular retrieval), search_contacts (filtered query), and mutation tools like create_contact/delete_contact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb 'List' suggesting bulk enumeration versus siblings like 'search' or 'get', but provides no explicit guidance on when to prefer this over search_contacts or whether it returns all contacts versus a default subset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsA
List events in a specific iCloud calendar within a date range. Use list_calendars first to get a calendarId.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max events to return (default 50) | |
| since | No | Start of range (YYYY-MM-DD, default: 30 days ago) | |
| before | No | End of range (YYYY-MM-DD, default: 30 days ahead) | |
| calendarId | Yes | Calendar ID from list_calendars |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full disclosure burden. States read operation ('List') and date range scoping, but omits output format details, pagination behavior, or what occurs when no events match. Adequate but minimal behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: first states purpose, second states prerequisite. Perfectly front-loaded and appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter listing tool with complete schema documentation, description is sufficiently complete. The prerequisite instruction is critical for successful invocation. Minor gap: does not describe return value structure (array of event objects?), though absence of output schema makes this less strictly required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage, establishing baseline of 3. Description adds valuable workflow context for calendarId parameter ('from list_calendars'), but does not augment understanding of date range parameters (since/before) or limit beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'List' with clear resource 'events in a specific iCloud calendar' and scope 'within a date range'. Effectively distinguishes from sibling operations like create_event, delete_event, and get_event (single retrieval).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit prerequisite 'Use list_calendars first to get a calendarId', establishing clear workflow. Lacks explicit differentiation from search_events (text search alternative) or guidance on when to use date range vs. other filtering methods.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_events_multiA
List events from multiple calendars in one call. Returns events grouped by calendar ID.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max events per calendar (default 50) | |
| since | No | Start of date range (YYYY-MM-DD, default: 30 days ago) | |
| before | No | End of date range (YYYY-MM-DD, default: 30 days ahead) | |
| calendarIds | Yes | Array of calendar IDs to fetch events from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. "List" implies a safe read and the second sentence usefully discloses the return shape (grouped by calendar ID), which is real value beyond a bare name. It says nothing about ordering, partial failures across calendars, or per-calendar truncation behavior beyond what the schema's limit field implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero waste: the action/scope is front-loaded, then the return shape. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with fully documented parameters and no annotations, the description covers purpose, scope relative to siblings, and return grouping. Only minor gaps remain: no note on whether one failing calendar aborts the whole call, and no detail on ordering of grouped results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter documents its own defaults (limit 50, since 30 days ago, before 30 days ahead), so the schema does the heavy lifting. The description adds nothing extra, but the baseline for fully-documented params is a 3 and the return-grouping note partially covers how calendarIds shapes output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List events") plus the scope that distinguishes it from the sibling list_events: "from multiple calendars in one call." An agent can infer the difference from the single-calendar sibling without opening schemas, though it never names list_events explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — the phrase "multiple calendars in one call" hints you should pick this over list_events when aggregating across calendars, but there is no explicit when-to-use/when-not statement and no alternative named. It offers guidance indirectly rather than stating it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mailboxesA
List all mailboxes/folders in iCloud Mail
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It clearly indicates this is a read operation by using 'List', but lacks disclosure of what specific data is returned (e.g., folder names, IDs, hierarchy levels, message counts) since no output schema exists to supplement this information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words. It is front-loaded with the action verb and immediately communicates scope, making it perfectly sized for a parameterless utility function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no input parameters) and lack of output schema, the description adequately covers the core functionality. It could be improved by briefly describing the return structure (e.g., 'returns folder names and paths'), but remains complete enough for agent selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema contains zero parameters. Per the evaluation rules, 0 parameters establishes a baseline score of 4, as there are no parameter semantics to clarify beyond the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description provides a specific verb ('List'), clear resource ('mailboxes/folders'), and scope ('all...in iCloud Mail'). It effectively distinguishes from siblings like create_mailbox, delete_mailbox, and get_mailbox_summary by emphasizing the enumeration aspect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While 'List all' implies this is for retrieving folder structure enumeration, there is no explicit guidance on when to use this versus get_mailbox_summary (which likely returns statistics) or other mailbox-related operations. Usage is implied but not explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reminder_listsA
List all Reminders lists in iCloud Reminders (e.g. "Reminders", "Work", "Shopping"). Returns name, id, and count per list.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does add real value by declaring the return shape (name, id, count per list) that would otherwise be undocumented since there is no output schema. It does not state that it is a read-only call, whether lists are ordered, or what an empty account returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero waste: what it does, the example values, and the returned fields, all front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter listing tool with no output schema, the description covers scope and return fields, which is what an agent needs to call it correctly. Minor gaps around ordering and empty results are acceptable at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; the schema needs no interpretation and the description correctly describes no inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List all Reminders lists in iCloud Reminders") and anchors it with concrete example values, so an agent can tell it apart from list_reminders or create_reminder_list. It does not explicitly name the nearest sibling, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the name and examples; there is no statement of when to prefer this over list_reminders, nor any prerequisite or exclusion. An agent can infer the discovery-then-list_reminders pattern, but the description never says it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_remindersB
List reminders from iCloud Reminders. Omit listName to fetch from all lists.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max reminders to return (default 50) | |
| listName | No | List name from list_reminder_lists (omit for all lists) | |
| includeCompleted | No | Include completed reminders (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 'List' implies a read-only operation, but the description says nothing about return volume, the default limit of 50, whether completed items are excluded by default, ordering, or pagination — all left implicitly to the schema or undocumented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero waste; the core purpose is front-loaded and the scope rule follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-required-parameter read tool with full schema coverage, the description is minimally adequate. But with no annotations and no output schema, it should disclose return behavior (default cap, whether completed reminders appear) rather than leaving that to the schema defaults alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with defaults and the list_reminder_lists cross-reference already documented inline. The description's note about omitting listName merely restates the schema, adding no new meaning to the three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List reminders from iCloud Reminders') and clarifies the scope of the listing. It doesn't explicitly distinguish itself from siblings like get_reminder or list_reminder_lists, but the list-vs-single retrieval distinction is clear from the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives one concrete usage rule ('Omit listName to fetch from all lists') and the schema cross-references list_reminder_lists for valid names. However, it never states when to use this tool versus get_reminder or list_reminder_lists, so the routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_rulesA
List all saved rules with their filters, actions, and run history.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It partially compensates by describing the return content (filters, actions, run history), but omits explicit safety declarations (read-only status), pagination behavior, or permission requirements that would be essential for a complete behavioral picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words. Every phrase earns its place: 'List all saved rules' establishes the operation, while 'with their filters, actions, and run history' provides necessary specificity about the data richness without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, no annotations, and no output schema, the description adequately compensates by hinting at the return structure through the field enumeration (filters, actions, run history). However, it could be improved by noting the read-only nature or pagination limits given the lack of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema contains zero parameters, which establishes a baseline score of 4 per the scoring rules. The description appropriately does not mention parameters since none exist, and the schema coverage is 100% (trivially, as there are no parameters to document).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description provides a specific verb ('List') and resource ('saved rules'), and distinguishes from siblings by specifying the detailed scope includes 'filters, actions, and run history' rather than just rule names or IDs. This clearly differentiates it from create_rule, delete_rule, and run_rule.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While the description implies this is for inspection/auditing of existing rules (vs. creating or running them), it provides no explicit when-to-use guidance or mention of alternatives like create_rule. The agent must infer usage context from the verb 'List' and the detailed field descriptions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_clearA
Clear the session log and start fresh. Use this at the start of a new task.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. While 'Clear' implies a destructive action, the description omits explicit warnings about data loss, irreversibility, or what happens to existing log entries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of exactly two sentences with zero waste: the first defines the action, and the second defines the usage context. It is appropriately front-loaded and sized for a simple parameter-less tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema), the description adequately covers its purpose and usage context. It is slightly incomplete regarding the destructive implications of clearing logs, which would be helpful given the absence of destructiveHint annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema contains zero parameters. Per the scoring rules, 0 params equals a baseline score of 4, as there are no parameter semantics to elaborate upon.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Clear') with a specific resource ('the session log') and distinguishes itself from siblings 'log_read' and 'log_write' by describing a destructive reset action rather than read/write operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence ('Use this at the start of a new task') provides explicit temporal guidance for when to invoke the tool. It lacks explicit 'when-not-to-use' guidance or named alternatives (e.g., contrasting with log_write for appending), preventing a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_readA
Read the current session log to see what has been done so far.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It mentions 'current session' implying scope/persistence behavior, but fails to disclose safety characteristics (idempotent?), return format, log size limits, or whether the log includes timestamps/agent actions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that front-loads the action ('Read'). Every word serves a purpose with no redundancy or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (zero parameters) and lack of output schema, the description provides minimum viable context. However, it omits the return value structure (string, array, or object?), which would be essential for an agent to use the output effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and 100% schema coverage (vacuously), meeting the baseline expectation for simple tools. No additional parameter context is required or provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Read') and resource ('current session log') to clearly define the tool's function. It effectively distinguishes this from siblings like log_write and log_clear by specifying the read-only nature of the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'to see what has been done so far' provides implied usage context (use when checking session history), but lacks explicit when-to-use guidance, exclusions, or comparisons to alternatives like log_write.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_writeA
Write a step to the session log. Use this to record your plan before starting, and after each completed step. Helps maintain progress across long operations.
| Name | Required | Description | Default |
|---|---|---|---|
| step | Yes | Description of what you are doing or just completed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full disclosure burden. It explains the purpose (maintaining progress across long operations) but omits mechanical details like whether entries append or overwrite, storage limits, persistence duration, or retrieval methods. Adequate but not rich in behavioral specifics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly constructed sentences with zero redundancy: (1) functional definition, (2) usage timing, (3) value proposition. Information density is high with no filler content. Well front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Appropriate for a single-parameter tool with no output schema. The description covers the operational lifecycle and intent. Could be improved by referencing the sibling log_read tool for retrieval or noting persistence characteristics, but sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the baseline is 3. The description adds valuable semantic context beyond the schema's generic 'Description of what you are doing' by specifying content types: 'plan before starting' versus 'completed step,' guiding the agent on what content to provide in the step parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific action 'Write a step to the session log,' clearly identifying the verb (write) and resource (session log). It effectively distinguishes from siblings log_read (reading) and log_clear (clearing) through this explicit action statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit temporal guidance: 'Use this to record your plan before starting, and after each completed step.' This establishes clear when-to-use context for long-running operations. Lacks explicit negative guidance (when not to use) or direct sibling comparison, but the workflow pattern is clearly defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_as_readA
Mark a single email as read or unread
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Email UID | |
| seen | Yes | True to mark as read, false for unread | |
| mailbox | No | Mailbox name (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It indicates a state mutation ('mark') but does not disclose idempotency, error handling for invalid UIDs, or whether the operation is destructive. It confirms the toggle nature (read or unread) which is the essential behavioral trait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient 8-word sentence with no filler. It is front-loaded with the action verb and immediately qualifies scope ('single') and capability ('read or unread'), earning every word.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity of a single-item state toggle and 100% input schema coverage, the description is functionally complete. The absence of an output schema is acceptable as the operation likely returns simple success/failure, though explicit confirmation of the return type would improve completeness further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all three parameters (uid, seen, mailbox) fully documented in the schema. The description adds no additional parameter semantics beyond what the schema provides, meeting the baseline expectation for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verb 'Mark' with clear resource 'single email' and states both possible states ('read or unread'). The word 'single' effectively distinguishes it from the 'bulk_mark_read' and 'bulk_mark_unread' siblings without explicitly naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the 'single' keyword (suggesting individual vs. batch operations) but provides no explicit guidance on when to choose this over 'bulk_mark_read'/'bulk_mark_unread' or other alternatives. No prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_older_than_readB
Mark all unread emails older than N days as read. Useful for bulk triage of a cluttered inbox.
| Name | Required | Description | Default |
|---|---|---|---|
| days | Yes | Mark emails older than this many days as read | |
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| mailbox | No | Mailbox (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It identifies a bulk mutation but does not disclose permissions, reversibility, side effects, or even mention the dryRun safety behavior described in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no wasted words. The purpose is front-loaded before the usage suggestion, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a moderate three-parameter tool whose schema is fully documented and has no output schema. However, for a bulk mutation with no annotations, it should say more about safety and dry-run behavior to be fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline score is 3. The description does not add parameter-level meaning beyond what the schema already provides for days, dryRun, and mailbox.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb, resource, and scope: mark unread emails older than N days as read. It clearly defines the operation, though it does not explicitly name or compare against sibling tools such as bulk_mark_read or mark_as_read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a usage context ('useful for bulk triage of a cluttered inbox'), which implies when to use it. However, it gives no explicit exclusions, prerequisites, or alternative tools for marking messages read.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_emailA
Move a single email to a different mailbox/folder
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Email UID | |
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| sourceMailbox | No | Source mailbox (default INBOX) | |
| targetMailbox | Yes | Destination mailbox path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the mutation ('Move') but omits side effects, reversibility, permission requirements, error behavior, and even the existence of the dryRun safety mechanism that is only documented in the schema. This leaves significant behavioral questions unanswered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with zero waste. It states the operation and scope efficiently without redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description states the core action and the schema fully documents parameters, which is sufficient for basic invocation. However, given the absence of annotations and output schema, the description could have added behavioral context (e.g., dry-run support, mutation side effects) to be more complete; as is, it provides the minimum viable context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (uid, sourceMailbox, targetMailbox, dryRun) are fully documented in the schema. The description adds no syntax or meaning beyond restating the target concept ('different mailbox/folder'), so it meets the baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb ('Move') and resource ('email') with cardinality ('a single'), which implicitly distinguishes it from bulk siblings like bulk_move and bulk_move_by_sender. An agent can tell what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'single' implies usage for one email at a time, hinting that bulk operations should use a different tool, but there is no explicit when-to-use statement, no mention of alternatives like bulk_move, and no prerequisites or conditions. It is implied usage rather than explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_inboxB
Read emails from an inbox with pagination. Supports multiple accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1) | |
| limit | No | Number of emails per page (default 10) | |
| account | No | Account name to read from (e.g. "work", "personal", "school", "icloud"). Omit for default iCloud account. | |
| mailbox | No | Mailbox to read (default INBOX) | |
| onlyUnread | No | Only fetch unread emails |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses pagination and multi-account support, but does not say whether reading marks messages as read, how results are ordered, or what permissions or side effects apply — all important for an inbox read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the main action and no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All five optional parameters are fully described in the schema, and there is no output schema to explain. However, the description does not help the agent choose this tool over the many alternative mail-reading siblings, leaving a meaningful navigation gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents page, limit, account, mailbox, and onlyUnread. The description only echoes the pagination and account concepts at a high level, adding no syntax, defaults, or edge-case details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('emails from an inbox') plus two capabilities (pagination, multiple accounts). It does not distinguish the tool from close siblings such as search_emails, get_emails_by_date_range, or get_email, so an agent still has to infer when this is the right read operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this instead of search_emails, get_emails_by_date_range, get_inbox_summary, or get_email. 'Supports multiple accounts' is a capability statement, not a usage rule or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_mailboxC
Rename an existing mailbox/folder
| Name | Required | Description | Default |
|---|---|---|---|
| newName | Yes | New mailbox path | |
| oldName | Yes | Current mailbox path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full disclosure burden for a mutation operation. It fails to specify whether emails/subfolders are preserved, if the operation is atomic, idempotency, or required permissions. Only implies the mailbox must exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is front-loaded and wastes no words, but given zero annotations and lack of output schema, it is arguably underspecified rather than optimally concise. No structural issues, but insufficient depth for the complexity of a mutation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool, the description meets minimum viability given good schema coverage, but gaps remain due to missing annotations and output schema. It omits what happens to contained emails, subfolder handling, and return value expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, establishing a baseline of 3. The description adds no supplemental context about path syntax, delimiters, case sensitivity, or validation rules beyond what the schema already provides for 'oldName' and 'newName'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Rename' and identifies the target resource as 'mailbox/folder'. It implicitly distinguishes from sibling tools create_mailbox and delete_mailbox by specifying 'existing', though it could further clarify path format or hierarchical behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like bulk_move or delete_mailbox/create_mailbox. No mention of prerequisites (e.g., target must not exist) or error conditions. Only the word 'existing' hints at pre-conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_reminder_listA
Rename a Reminders list. The old name must match exactly one list, and the new name must not already be in use.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, report exactly what would change and do not modify anything | |
| newName | Yes | New name for the list | |
| oldName | Yes | Exact current name of the list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It discloses the mutation and its name-matching constraints, but it does not mention permissions, reversibility, side effects, or the dryRun option, leaving notable gaps for a write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with no wasted language. The operation is front-loaded, and the preconditions follow immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple rename tool with a fully described schema, the description covers the key invocation constraints. Because annotations are absent, it could do more to disclose safety and side-effect behavior, but the schema already documents dryRun and the core parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds useful semantic constraints beyond the schema: oldName must match exactly one list, and newName must not already be in use.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Rename a Reminders list.' This clearly distinguishes the operation from sibling tools such as create_reminder_list, delete_reminder_list, and list_reminder_lists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear preconditions: the old name must match exactly one list and the new name must not already be in use. It does not explicitly compare this tool against alternatives, but the usage context is clear for a rename operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_emailA
Reply to an existing email. Automatically sets correct threading headers (In-Reply-To, References) and prefixes the subject with Re:. Supports plain text and/or HTML body.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Additional CC recipients for this reply | |
| uid | Yes | UID of the email to reply to | |
| body | No | Plain text reply body | |
| html | No | HTML reply body (auto-generates plain text fallback if body not provided) | |
| mailbox | No | Mailbox containing the original email (default INBOX) | |
| replyAll | No | If true, reply to all recipients (To + Cc). Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It successfully discloses specific behaviors (automatic threading header management, subject prefixing, body format support) but fails to indicate critical safety properties like whether the reply sends immediately or saves as draft, or if the operation is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of three tightly constructed sentences with zero waste. It front-loads the core purpose (reply), follows with technical implementation details (headers), and ends with format support, earning its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 6 parameters with complete schema coverage and lack of output schema, the description adequately covers the primary function. However, with no annotations to indicate side effects or safety, the description should have disclosed whether this sends immediately or creates a draft, marking it as minimally viable rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all 6 parameters (uid, body, html, mailbox, replyAll, cc). The description mentions body format support but adds no semantic depth beyond what the schema already provides, meeting the baseline for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific action (Reply) and resource (existing email) clearly. It distinguishes from siblings like compose_email and forward_email by mentioning Re: prefixing and threading headers (In-Reply-To, References), which are specific to reply semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides implicit context through mentions of threading headers and Re: prefixing, suggesting use for continuing conversations. However, it lacks explicit guidance on when to choose this over compose_email (new messages) or forward_email (forwarding), and states no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_all_rulesA
Run all saved rules in sequence. Use dryRun: true to preview all rules without making changes.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, preview all rules without making changes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Mentions 'in sequence' execution and dryRun behavior, but omits critical mutation details: side effects of rules, error handling (fail-fast vs. continue), idempotency, and synchronous/asynchronous nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. Front-loaded with purpose, followed immediately by usage hint. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a single-parameter tool, but given lack of output schema and annotations, description should ideally disclose success/failure signals or execution behavior. Sufficient for basic operation but leaves operational gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage with dryRun fully documented. Description essentially repeats the schema definition ('preview all rules without making changes') without adding syntax details, examples, or edge cases. Baseline 3 appropriate when schema does heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verb (Run), resource (saved rules), scope (all), and execution pattern (in sequence). Clearly distinguishes from sibling 'run_rule' by emphasizing 'all' and sequential execution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides specific guidance on using dryRun for previewing changes, but lacks explicit comparison to sibling 'run_rule' or guidance on when to use single vs. bulk execution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_ruleB
Run a specific saved rule by name. Use dryRun: true to preview what would be affected without making changes.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Rule name to run | |
| dryRun | No | If true, preview what would be affected without making changes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains dryRun behavior but omits critical details: whether the tool performs writes (likely given email-related siblings), what actions the rule executes (move/delete/flag), side effects, return values, or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of exactly two efficient sentences with no filler: the first establishes purpose immediately, and the second provides the most critical usage hint (dryRun). Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool likely performing mutations on email state (given the ecosystem of bulk_move, bulk_delete siblings), the description is incomplete. It lacks output format details, error handling, and—critically—any description of what 'running' a rule actually does to the user's data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage ('Rule name to run' and dryRun explanation), establishing a baseline of 3. The description adds minimal semantic value beyond the schema, essentially restating the dryRun parameter description verbatim rather than adding context about valid rule names or usage patterns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific verb ('Run') and resource ('saved rule'), and distinguishes itself from siblings like 'create_rule', 'delete_rule', and 'run_all_rules' by emphasizing 'specific saved rule by name'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides implied usage guidance by explaining the dryRun parameter's purpose (previewing changes), but fails to explicitly differentiate when to use this single-rule tool versus the sibling 'run_all_rules' tool or state prerequisites (e.g., rule must exist).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_draftA
Save a draft email to your iCloud Drafts folder without sending it. Supports plain text, HTML, or both. The draft can be edited and sent later from Mail.app or iCloud.com.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC recipient(s) | |
| to | Yes | Intended recipient(s), comma-separated or array | |
| bcc | No | BCC recipient(s) | |
| body | No | Plain text body (used as fallback when html is also provided) | |
| html | No | HTML body. If provided without body, plain text is auto-generated. If provided with body, saves multipart/alternative. | |
| account | No | Account whose Drafts folder to save into (e.g. "work", "personal", "school"). Defaults to iCloud. | |
| subject | Yes | Email subject | |
| inReplyTo | No | Message-ID of the email being replied to — sets In-Reply-To header for threading | |
| references | No | Space-separated Message-IDs for the References header — enables full thread linking |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It usefully discloses that the draft is not sent and can be edited/sent later, and that plain text, HTML, or both are supported. But it omits authentication needs, whether an existing draft is overwritten or a new one is always created, error behavior, and return values, leaving significant gaps for a write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with the core purpose front-loaded, followed by supported formats and later-editability. No wasted words and the structure is easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 100% schema coverage and no output schema, the description covers the essential purpose, non-sending behavior, format support, and post-save editing. A slight gap remains: it does not clarify that the account parameter can target non-iCloud accounts, nor does it explicitly relate the tool to compose_email for sending workflows.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all nine parameters are already documented in the input schema. The description mentions plain text/HTML/both and the iCloud Drafts folder, but adds little beyond what the schema already explains, especially regarding the body/html fallback behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Save a draft email to your iCloud Drafts folder without sending it.' The explicit 'without sending it' distinguishes this from send-oriented siblings like compose_email, reply_to_email, and forward_email. It is clear what the tool does and how it differs from sending tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use: save rather than send, and the draft can be edited and sent later. However, it does not explicitly name an alternative tool or state when not to use this tool, so it falls short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contactsB
Search iCloud Contacts by name, email address, or phone number.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Text to search for (matched against name, email, and phone) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, yet description fails to disclose critical behavioral traits: whether search is case-sensitive, supports wildcards, returns partial matches, pagination limits, or what format results take. Does not confirm this is read-only/safe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single, efficient sentence with zero redundancy. Action and resource front-loaded; every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a single-parameter tool with full schema coverage, but lacks mention of return value structure or empty-result behavior given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, establishing baseline 3. Description confirms the multi-field matching behavior (name/email/phone) but adds no syntax guidance (e.g., phone formatting) or examples beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Search' with clear resource 'iCloud Contacts' and explicit scope (name, email, phone). Effectively distinguishes from siblings like list_contacts (full enumeration) and get_contact (direct retrieval by ID).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this versus list_contacts (for bulk export) or get_contact (for direct ID lookup). No mention of performance implications or search limits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_emailsB
Search emails by keyword or targeted field queries, with optional filters for date, read status, domain, and more
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 10) | |
| query | No | Search keyword (matches subject, sender, body — use OR across all fields) | |
| since | No | Only emails since this date (YYYY-MM-DD) | |
| before | No | Only emails before this date (YYYY-MM-DD) | |
| domain | No | Match any sender from this domain (e.g. substack.com) | |
| larger | No | Only emails larger than this size in KB | |
| sender | No | Match exact sender email address | |
| unread | No | True for unread only, false for read only | |
| account | No | Account name to use (e.g. 'icloud', 'gmail'). Defaults to first configured account. Use list_accounts to see available accounts. | |
| flagged | No | True for flagged only, false for unflagged only | |
| mailbox | No | Mailbox to search (default INBOX) | |
| smaller | No | Only emails smaller than this size in KB | |
| subject | No | Keyword to match in subject | |
| bodyQuery | No | Match only in body field | |
| fromQuery | No | Match only in from/sender field | |
| queryMode | No | How to combine subjectQuery/bodyQuery/fromQuery: or (default) or and | |
| subjectQuery | No | Match only in subject field | |
| hasAttachment | No | Only emails with attachments (client-side BODYSTRUCTURE scan — must be combined with other filters that narrow results to under 500 emails first) | |
| includeSnippet | No | If true, include a 200-char body preview snippet for each result (max 10 emails) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure but fails to mention critical traits: pagination behavior, result ordering, rate limits, or the read-only nature of the operation. It does not describe the return format (absent output schema), and omits the performance constraint mentioned in the hasAttachment parameter description regarding the 500-email limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficiently structured sentence that front-loads the primary action. Every phrase serves a purpose: defining the search modality (keyword vs. targeted) and exemplifying filter categories. Despite the tool's complexity (19 parameters), the description avoids redundancy and wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the schema provides complete parameter documentation, the description remains minimal given the tool's complexity and lack of output schema or annotations. The phrase 'and more' hand-waves over 12 additional filter parameters. For a search tool with nuanced query modes (OR/AND) and performance constraints, the description adequately introduces capabilities but leaves significant behavioral gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Given 100% schema description coverage, the baseline score is 3. The description adds marginal value by categorizing parameters conceptually ('keyword', 'targeted field queries', 'date, read status, domain'), which helps map intent to parameters, but does not elaborate on syntax, format details, or the interaction between query and field-specific parameters beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the core action (Search) and resource (emails), distinguishing between 'keyword' (general) and 'targeted field queries' (specific fields). However, it does not explicitly differentiate this tool from sibling retrieval tools like get_emails_by_sender or get_emails_by_date_range, which could cause selection ambiguity given the large tool set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus the numerous alternatives (e.g., get_emails_by_sender, read_inbox, get_email). It omits prerequisites, performance considerations, and selection criteria, leaving the agent to infer based on parameter names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_eventsA
Search for events by title/summary across all calendars within an optional date range.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Text to search for in event titles | |
| since | No | Start of search range (YYYY-MM-DD, default: 1 year ago) | |
| before | No | End of search range (YYYY-MM-DD, default: 1 year ahead) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It successfully clarifies the scope ('across all calendars') and field restrictions ('title/summary' rather than full-text search). However, it omits critical behavioral details expected for a search tool: whether the search is case-insensitive, supports partial matching/wildcards, pagination behavior, and the read-only nature of the operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that is front-loaded with the action ('Search for events'). Every clause earns its place: 'by title/summary' defines the search fields, 'across all calendars' defines the scope, and 'within an optional date range' defines temporal constraints. No redundant or unnecessary text is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 simple parameters, no output schema, no annotations), the description adequately covers the primary functional aspects: what is searched (events), how (by title/summary text), where (all calendars), and temporal constraints. While missing details on matching logic and pagination, it provides sufficient context for an agent to understand the tool's basic contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, establishing a baseline of 3. The description adds minimal semantic value beyond the schema, though it does clarify that the date range is 'optional' (implied by defaults but not explicit in schema) and that the search covers 'summary' in addition to 'title' (potentially distinct fields). It does not provide additional context on query syntax or date format constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches for events by title/summary text across all calendars within a date range. It effectively distinguishes from 'get_event' (which likely retrieves by ID) and 'list_events' (which presumably lists events from a specific calendar without text search) by specifying 'across all calendars' and the text-based search mechanism. However, it does not explicitly clarify when to choose this over filtering via list_events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the verb 'Search' and the scope 'across all calendars,' suggesting use when looking for events by text across multiple calendars. However, it lacks explicit guidance on when to use this versus 'list_events' (e.g., 'use this when you need text search across all calendars instead of listing a specific calendar'). No alternatives or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_event_from_emailA
Fetch an email and return its content formatted for calendar event extraction. After calling this tool, extract the event fields from the returned content (pay attention to _dateAnchor for resolving relative dates like "Tuesday"), present a summary to the user for confirmation, then call create_event. No API key required.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Email UID to extract event from | |
| mailbox | No | Mailbox containing the email (default INBOX) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and succeeds in disclosing key behavioral traits: the special formatting for calendar extraction, the presence of _dateAnchor for date resolution, and the 'No API key required' authentication detail. Minor gap: does not explicitly declare read-only status (though implied by 'Fetch').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero waste. Front-loaded with purpose ('Fetch an email...'), followed by workflow instructions, and ending with authentication note. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema, the description adequately compensates by explaining the return value's purpose (formatted for extraction) and highlighting the critical _dateAnchor field. It also names the follow-up tool (create_event). Could be improved by specifying the return format type (JSON vs text), but sufficient for agent operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (uid and mailbox are fully documented with types and descriptions). The description does not add parameter-specific semantics beyond what the schema already provides, which is appropriate given the complete schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Fetch') and resource ('email'), and immediately distinguishes this from sibling tools like get_email by specifying the content is 'formatted for calendar event extraction.' This clearly defines the unique scope and intent of the tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit procedural guidance: extract fields from the returned content, pay attention to _dateAnchor for relative dates, present to user for confirmation, then call create_event. This establishes a clear workflow and implicitly distinguishes when to use this (calendar extraction workflow) versus standard email retrieval.
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 in iCloud Contacts. Only provided fields are changed; others are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| org | No | ||
| url | No | ||
| note | No | ||
| No | |||
| phone | No | ||
| emails | No | ||
| phones | No | ||
| birthday | No | ||
| fullName | No | ||
| lastName | No | ||
| addresses | No | ||
| contactId | Yes | Contact ID to update | |
| firstName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It successfully discloses the partial-update behavior (preservation of unspecified fields), but omits other critical behavioral traits like error handling for invalid contactIds, authentication requirements, or the return value structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two efficient sentences with zero waste. The first establishes purpose immediately; the second provides essential behavioral context (partial update semantics). Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high parameter count (13) and lack of output schema, the description provides the minimum viable context for a standard CRUD operation. However, with severely incomplete schema documentation and no annotations, it should ideally elaborate on parameter expectations or error states to be truly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is critically low at 8% (only contactId is documented). The description fails to compensate by explaining the remaining 12 parameters, their formats (e.g., phone vs phones arrays), or valid value ranges. It mentions 'fields' abstractly without mapping to specific parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action (Update), resource (contact), and system (iCloud Contacts). It effectively distinguishes from siblings like create_contact, delete_contact, and get_contact through the verb 'Update' and context 'existing contact'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies PATCH semantics through 'Only provided fields are changed; others are preserved,' guiding the user toward partial updates. However, it lacks explicit guidance on when to use this versus create_contact, or prerequisites like obtaining the contactId first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_digest_stateB
Update the digest state after a run. Merges new processed UIDs into the existing list, updates lastRun, replaces pendingActions, and accumulates per-sender skip counts.
| Name | Required | Description | Default |
|---|---|---|---|
| lastRun | No | ISO timestamp of this run | |
| skipCounts | No | Map of sender address to skip count increment for this run, e.g. { "news@example.com": 3 }. Accumulated across runs for smart unsubscribe. | |
| processedUids | No | Email UIDs processed in this run — merged with existing and capped at 5000 | |
| seenReminders | No | Snapshot of all active reminders in the "claude" list at end of this run — used next run to detect which ones the user deleted. Each: { id, title, notes? }. | |
| pendingActions | No | Full replacement list of pending action items to track across runs (deadlines, waiting-for-reply, etc.). Each item: { type, subject, to/from, dueDate?, notes? } | |
| dismissedReminders | No | Full replacement list of reminders the user has deleted from the "claude" list (treated as "not interested"). Each: { title, notes?, dismissedAt (ISO) }. Entries older than 30 days are pruned automatically. Capped at 500. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose useful mutation semantics (merge vs. full replacement per field), but much of this echoes the schema descriptions and it says nothing about permissions, idempotency, or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the action and then lists the state changes compactly. No filler, though the list form is close to restating field names already in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, nested-object, stateful mutation with no annotations or output schema, the description is adequate but thin: it omits the state model context (where the digest state lives, interaction with get_digest_state) and return behavior. The rich input schema compensates somewhat.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed per-parameter descriptions, so the baseline is 3. The description names four of the six parameters (processedUids, lastRun, pendingActions, skipCounts) but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (digest state) with the trigger condition 'after a run', and enumerates the fields it mutates. An agent can tell this is the write counterpart to get_digest_state, though the sibling is not named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'after a run' implies when this should be called, but there is no explicit when-not, no mention of get_digest_state as the read alternative, and no stated prerequisites for calling it. Usage is inferable rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_eventB
Update an existing calendar event. Only provided fields are changed; others are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| start | No | ||
| allDay | No | ||
| status | No | ||
| eventId | Yes | Event ID to update | |
| summary | No | ||
| location | No | ||
| reminder | No | Alert minutes before event (0 to disable) | |
| timezone | No | ||
| calendarId | Yes | Calendar ID containing the event | |
| recurrence | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses the partial-update/PATCH-like behavior explicitly, which is critical for safe usage. However, it omits other behavioral details like error handling if the event doesn't exist, timezone handling conflicts, or recurrence modification side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two efficiently structured sentences with zero waste. The first states purpose immediately; the second provides essential behavioral context. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no output schema, the description meets minimum viability by capturing the core operation and partial-update semantics. However, gaps remain regarding return values, error cases, and the specific formats required for complex fields like recurrence rules.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low at 25% (only 3 of 12 parameters have descriptions). The description mentions 'provided fields' generally but does not compensate by explaining undocumented parameters like 'recurrence' string format, valid 'status' values, or date-time formats for 'start'/'end'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Update' and resource 'calendar event', establishing a specific purpose. It distinguishes from create_event by specifying 'existing' event, though it does not explicitly differentiate from siblings like delete_event or get_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence provides crucial behavioral guidance ('Only provided fields are changed; others are preserved') clarifying partial update semantics. However, it lacks explicit when-to-use guidance versus alternatives like create_event or when to prefer this over delete+create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_reminderB
Update an existing reminder. Only provided fields are changed; others are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | ||
| notes | No | ||
| title | No | ||
| listName | Yes | List name containing the reminder | |
| priority | No | high, medium, low, or none | |
| reminderId | Yes | Reminder ID to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full behavioral burden. It does disclose genuinely useful patch semantics ('Only provided fields are changed; others are preserved'), which tells the agent this is a partial rather than full replacement. It says nothing about required permissions, whether the change is reversible, or what happens on an invalid reminderId, so significant gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero waste, and the patch-behavior clause is front-loaded right after the purpose statement where it matters most. Nothing is padded or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter mutation tool with no annotations and no output schema, the description covers the single most important behavioral trait (partial update) but omits parameter guidance, auth requirements, and error behavior. It is adequate but visibly thin for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, so due, notes, and title are undocumented in both the schema and the description. The description refers generically to 'provided fields' without naming a single parameter or adding format/semantic detail over the schema, so it does nothing to close the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update an existing reminder'), which is clear and unambiguous on its own. It does not, however, distinguish itself from the adjacent mutation siblings complete_reminder, delete_reminder, or create_reminder, leaving the agent to infer the boundary from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no when-to-use or when-not-to-use guidance and names no alternative. The most important routing question for this tool — update versus complete versus recreate a reminder — is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
34 tool updates
v2.8.0- Added
bulk_create_events - Changed
bulk_delete_by_sender1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Changed
bulk_delete_by_subject1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Added
bulk_delete_events - Changed
bulk_flag1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Changed
bulk_flag_by_sender1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Changed
bulk_mark_read1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Changed
bulk_mark_unread1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Added
bulk_update_events - Added
complete_reminder - Added
create_calendar - Added
create_reminder - Added
create_reminder_list - Added
delete_calendar - Changed
delete_contact1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Changed
delete_email1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Changed
delete_event1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Changed
delete_mailbox1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Changed
delete_older_than1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Added
delete_reminder - Added
delete_reminder_list - Changed
delete_rule1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Added
detect_conflicts - Added
get_reminder - Added
list_events_multi - Added
list_reminder_lists - Added
list_reminders - Changed
mark_older_than_read1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Changed
move_email1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "description": "If true, report exactly what would change and do not modify anything", + "type": "boolean" +}
- Changed
read_inbox1 field changed- added
Input schema / properties / accountAdded value: +{ + "description": "Account name to read from (e.g. \"work\", \"personal\", \"school\", \"icloud\"). Omit for default iCloud account.", + "type": "string" +}
- Added
rename_reminder_list - Changed
save_draft1 field changed- changed
Input schema / properties / account / descriptionPrevious value: -"Account whose Drafts folder to save into (e.g. \"umd\", \"personal\", \"alt\"). Defaults to iCloud."New value: +"Account whose Drafts folder to save into (e.g. \"work\", \"personal\", \"school\"). Defaults to iCloud."
- Changed
update_digest_state3 fields changed- added
Input schema / properties / dismissedRemindersAdded value: +{ + "description": "Full replacement list of reminders the user has deleted from the \"claude\" list (treated as \"not interested\"). Each: { title, notes?, dismissedAt (ISO) }. Entries older than 30 days are pruned automatically. Capped at 500.", + "type": "array" +} - added
Input schema / properties / seenRemindersAdded value: +{ + "description": "Snapshot of all active reminders in the \"claude\" list at end of this run — used next run to detect which ones the user deleted. Each: { id, title, notes? }.", + "type": "array" +} - changed
Input schema / properties / skipCounts / descriptionPrevious value: -"Map of sender address to skip count increment for this run, e.g. { \"bestbuy@email.bestbuy.com\": 3 }. Accumulated across runs for smart unsubscribe."New value: +"Map of sender address to skip count increment for this run, e.g. { \"news@example.com\": 3 }. Accumulated across runs for smart unsubscribe."
- Added
update_reminder
69 tool updates
v2.5.1- First observed
abandon_move - First observed
archive_older_than - First observed
bulk_delete - First observed
bulk_delete_by_sender - First observed
bulk_delete_by_subject - First observed
bulk_flag - First observed
bulk_flag_by_sender - First observed
bulk_mark_read - First observed
bulk_mark_unread - First observed
bulk_move - First observed
bulk_move_by_domain - First observed
bulk_move_by_sender - First observed
compose_email - First observed
count_emails - First observed
create_contact - First observed
create_event - First observed
create_mailbox - First observed
create_rule - First observed
delete_contact - First observed
delete_email - First observed
delete_event - First observed
delete_mailbox - First observed
delete_older_than - First observed
delete_rule - First observed
empty_trash - First observed
flag_email - First observed
forward_email - First observed
get_attachment - First observed
get_contact - First observed
get_digest_state - First observed
get_email - First observed
get_email_raw - First observed
get_emails_by_date_range - First observed
get_emails_by_sender - First observed
get_event - First observed
get_inbox_summary - First observed
get_mailbox_summary - First observed
get_move_status - First observed
get_storage_report - First observed
get_thread - First observed
get_top_senders - First observed
get_unread_senders - First observed
get_unsubscribe_info - First observed
list_accounts - First observed
list_attachments - First observed
list_calendars - First observed
list_contacts - First observed
list_events - First observed
list_mailboxes - First observed
list_rules - First observed
log_clear - First observed
log_read - First observed
log_write - First observed
mark_as_read - First observed
mark_older_than_read - First observed
move_email - First observed
read_inbox - First observed
rename_mailbox - First observed
reply_to_email - First observed
run_all_rules - First observed
run_rule - First observed
save_draft - First observed
search_contacts - First observed
search_emails - First observed
search_events - First observed
suggest_event_from_email - First observed
update_contact - First observed
update_digest_state - First observed
update_event
TDQS
Scored across 86 tools
Mail operations contain many overlapping bulk convenience tools: bulk_delete vs bulk_delete_by_sender vs bulk_delete_by_subject vs delete_older_than, and similarly bulk_move vs bulk_move_by_sender vs bulk_move_by_domain. Descriptions clarify the differences, but an agent still has multiple plausible choices for the same cleanup task.
Nearly all tools use consistent snake_case with verb-first naming (list_, get_, create_, update_, delete_, bulk_). Minor deviations exist, such as log_write/log_read/log_clear reversing the order and mark_older_than_read/delete_older_than not following a strict verb_noun pattern.
86 tools is an extreme count mismatch for a coherent MCP surface, even across mail, calendar, reminders, and contacts. Many tools are convenience wrappers around a smaller core set of operations.
The surface has strong lifecycle coverage across mail, calendar, reminders, contacts, rules, attachments, threading, digest state, and bulk operations. There are no major dead ends; minor omissions such as rule updates are workable via delete and recreate.
Maintenance
Related MCP Connectors
Hosted email MCP for your own Gmail, Outlook.com, Microsoft 365, iCloud or IMAP inbox: read, search, draft, reply in thread, forward and file mail. It moves or flags up to 500 messages in one call, and a send leaves exactly one copy in Sent. A calendar is a separate connection, and connecting one adds diary and scheduling tools.
Hosted Mailchimp MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
An MCP server that provides email capabilities, hosted on Alpic platform
An MCP server that provides email capabilities, hosted on Alpic platform
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that enables Claude to directly access and manage email through IMAP. It provides tools for reading, searching, organizing, and drafting emails within your mailbox.9MIT
- AlicenseAqualityAmaintenanceAn MCP server for Apple Mail that enables Claude to read, search, manage, and compose emails via AppleScript.2010 npm1MIT
- AlicenseBqualityCmaintenanceMCP server that connects Claude to iCloud Mail, enabling reading, searching, sending, and organizing emails via IMAP/SMTP.14PolyForm Noncommercial 1.0.0
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that enables Claude Desktop to interact with iCloud email accounts. This server provides full email functionality including reading, sending, and managing emails through your iCloud account.1-