MCP server for Fastmail — email, contacts, calendar, and files via JMAP, CardDAV, CalDAV, and WebDAV
Server has 15 tools with consistent naming (verb_noun pattern) and complete input schemas. Descriptions are present but generic, most lack context on WHEN to use the tool or what makes it distinct from similar tools. Parameter descriptions are minimal (often just restating the name). No output schemas documented. Error handling is absent from tool definitions. Security considerations (credentials via env vars) are handled server-side but not reflected in tool metadata. Composition is sound (tools are single-responsibility), but descriptions don't guide LLM selection effectively.
Create a new event in a CalDAV calendar. Args: calendar_href: The href of the calendar (from calendar_list_calendars). title: Event title/summary. start: Start datetime as ISO string (YYYY-MM-DDTHH:MM:SS or YYYY-MM-DD for all-day). end: End datetime as ISO string. location: Optional location string. description: Optional description. all_day: If True, treat start/end as dates (not datetimes).
Delete a CalDAV event by its href. Args: href: The href of the .ics resource (from calendar_list_events).
Get full details of a single CalDAV event by its href. Args: href: The href/URL path of the .ics resource (as returned by calendar_list_events).
List all CalDAV calendars for the authenticated Fastmail account.
List events in a CalDAV calendar within a date range. Args: calendar_href: The href of the calendar (from calendar_list_calendars). start_date: ISO date string (YYYY-MM-DD). Defaults to today. end_date: ISO date string (YYYY-MM-DD). Defaults to 7 days from start.
No output schemas documented. LLMs cannot predict response structure, forcing them to guess at field names for downstream tool calls. E.g., calendar_list_calendars returns a list but the response format is undocumented.
Descriptions lack context on WHEN to use each tool. 'List all CalDAV calendars' doesn't explain when to call this vs calendar_list_events. LLMs need disambiguation to select the right tool.
Destructive tools (calendar_delete_event, contacts_delete_contact) lack confirmation or dry-run support. Agents can delete data without safeguards.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Update fields on an existing CalDAV event. Args: href: The href of the .ics resource (from calendar_list_events). title: New summary/title (omit to keep existing). start: New start datetime ISO string (omit to keep existing). end: New end datetime ISO string (omit to keep existing). location: New location (omit to keep existing). description: New description (omit to keep existing).
Create a new contact card. Args: name: Full display name of the contact. emails: List of email addresses. phones: List of phone numbers. org: Organization / company name. notes: Free-text notes. address_book_ids: Address book IDs to add the contact to.
Delete one or more contacts by ID. Args: contact_ids: List of ContactCard IDs to delete.
Fetch full contact card(s) by ID. Returns id, addressBookIds, name, emails, phones, addresses, organizations, and notes. Args: ids: One or more ContactCard IDs to fetch.
List contacts, optionally filtered by address book or text search. Uses a single round trip (ContactCard/query + ContactCard/get). Args: address_book_id: Restrict to contacts in this address book. text: Full-text search across name, email, phone, etc. limit: Maximum number of contacts to return.
List all address books with id, name, description, sortOrder, isDefault, and isSubscribed.
Query contacts with optional filters and sorting. Args: address_book_id: Filter to contacts in this address book. text: Full-text search across name, email, phone, etc. kind: Filter by kind (e.g. "individual", "org", "group"). limit: Maximum number of results to return. sort_by: Sort field — one of "name/given", "name/surname", "created", "updated".
Update an existing contact card via JSON patch. Only the fields you provide will be changed; omitted fields are left as-is. Args: contact_id: ID of the ContactCard to update. name: New full display name. emails: Replace all email addresses with this list. phones: Replace all phone numbers with this list. org: Replace organization name. notes: Replace notes. address_book_ids: Replace address book membership.
Download a file from Fastmail Files (WebDAV), returned as base64. Args: path: Path to the file (e.g. "/Documents/report.pdf").
List files and folders at a WebDAV path on Fastmail Files. Args: path: Path to list (default: root "/"). depth: "0" for the item itself only, "1" for immediate children (default).
No error handling guidance in tool definitions. If a calendar_href is invalid or a contact_id doesn't exist, the tool description doesn't tell the LLM what to do next (retry, search, ask user).
Parameter descriptions are minimal and don't explain constraints. E.g., 'start_date: ISO date string (YYYY-MM-DD)' doesn't state if it's required, what happens if omitted, or if past dates are allowed.