MCP server for iCloud integration (CalDAV, CardDAV, IMAP/SMTP)
24 tools with consistent naming (verb_noun pattern) and reasonable descriptions (avg ~150 chars). All tools have input schemas with typed parameters. However, output schemas are undocumented, LLMs cannot predict response structure. Error handling is generic (returns {error, status} dict) without recovery guidance. Parameter descriptions lack format constraints (e.g., ISO date format stated but not enforced). Missing tool annotations (readOnlyHint, destructiveHint). No pagination guidance for list tools despite potential large result sets.
Create a new calendar event. Args: summary: Event title start: Start datetime in ISO format (e.g., "2025-11-15T10:00:00") end: End datetime in ISO format (e.g., "2025-11-15T11:00:00") description: Event description (optional) location: Event location (optional) attendees: List of attendee email addresses to invite (optional) calendar_id: Target calendar URL/ID (optional)
Delete a calendar event. Args: event_id: Event URL/ID to delete
List all available calendars. Returns a list of calendars with their IDs, names, and URLs.
List calendar events with optional filtering. Args: calendar_id: Specific calendar URL/ID (optional) start_date: Start date in ISO format YYYY-MM-DD (optional) end_date: End date in ISO format YYYY-MM-DD (optional)
Search for events by text query. Args: query: Search text (matches summary, description, location) calendar_id: Specific calendar URL/ID (optional) start_date: Start date in ISO format (optional) end_date: End date in ISO format (optional)
Output schemas undocumented. LLMs cannot predict response structure (fields, types, nesting). Forces agents to guess or fail on unexpected formats.
Generic error handling. All tools return {error, status} dict without recovery guidance. LLMs cannot determine if error is retryable, user-fixable, or fatal.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without parsing descriptions.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Update an existing calendar event. Args: event_id: Event URL/ID summary: New event title (optional) start: New start datetime in ISO format (optional) end: New end datetime in ISO format (optional) description: New description (optional) location: New location (optional) attendees: New list of attendee email addresses (optional, replaces existing)
Create a new contact. Args: name: Full name phones: List of phone numbers (optional) emails: List of email addresses (optional) addresses: List of postal addresses (optional) organization: Company/organization name (optional) title: Job title (optional)
Delete a contact. Args: contact_id: Contact URL/ID to delete
Get a specific contact by ID. Args: contact_id: Contact URL/ID
List all contacts. Args: limit: Maximum number of contacts to return (optional)
Search for contacts by text query. Args: query: Search text (matches name, email, phone)
Update an existing contact. Args: contact_id: Contact URL/ID name: New full name (optional) phones: New list of phone numbers (optional) emails: New list of email addresses (optional) addresses: New list of postal addresses (optional) organization: New company/organization (optional) title: New job title (optional)
Delete message(s). Args: message_ids: Single message ID or list of message IDs folder: Folder name (default: INBOX) permanent: Permanently delete (default: False, moves to Trash) Returns: Confirmation of deleted messages
Forward an email message. Args: message_id: ID of the message to forward folder: Folder containing the message (default: INBOX) to: Recipient email address(es) to forward to subject: New subject (optional, defaults to "Fwd: [original subject]") body: Additional text to include before the forwarded message (optional) cc: CC recipients (optional, comma-separated) bcc: BCC recipients (optional, comma-separated) Returns: Confirmation of forwarded message
Get a specific message with full details. Args: message_id: Message ID folder: Folder name (default: INBOX) include_body: Include message body content full_html: Include full HTML body (default: False, only text body returned) Returns: Complete message details
Get multiple messages at once. Args: message_ids: List of message IDs to fetch folder: Folder name (default: INBOX) include_body: Include message body content full_html: Include full HTML body (default: False, only text body returned)
List all email folders/mailboxes. Returns a list of folders with their names and flags.
List messages in a folder. Args: folder: Folder name (default: INBOX). Common folder names: INBOX, Sent Messages, Drafts, Trash, Archive limit: Maximum number of messages to return (default: 50) unread_only: Only return unread messages (default: False) Note: The Sent folder may be named "Sent Messages", "Sent", or "Sent Items" depending on your email provider.
Mark message(s) as read. Args: message_ids: Single message ID or list of message IDs folder: Folder name (default: INBOX) Returns: Confirmation of marked messages
Mark message(s) as unread. Args: message_ids: Single message ID or list of message IDs folder: Folder name (default: INBOX) Returns: Confirmation of marked messages
Move message(s) to a different folder. Args: message_ids: Single message ID or list of message IDs source_folder: Source folder name (default: INBOX) target_folder: Target folder name Returns: Confirmation of moved messages
Reply to an email message. Args: message_id: ID of the message to reply to folder: Folder containing the message (default: INBOX) body: Reply body (plain text) html_body: HTML version of the reply (optional) cc: Additional CC recipients (optional, comma-separated) bcc: BCC recipients (optional, comma-separated) reply_all: Reply to all recipients (default: False) Returns: Confirmation of sent reply
Search for messages. Args: query: Search query (supports: from:, to:, subject:, body:, before:, after:, is:unread, is:read, has:attachment) folder: Folder to search in (default: INBOX) limit: Maximum number of results (default: 50) Returns: List of matching messages
Send an email message. Args: to: Recipient email address(es) - can be a single email or comma-separated list subject: Email subject body: Email body (plain text) cc: CC recipient(s) - comma-separated list (optional) bcc: BCC recipient(s) - comma-separated list (optional) html_body: HTML version of the body (optional, if provided both text and HTML will be sent) reply_to: Reply-To address (optional) in_reply_to: Message-ID of the message being replied to (optional) references: Message-IDs of related messages (optional, space-separated) Returns: Confirmation of sent message
List tools lack pagination guidance. email_list_messages defaults to 50 items; no mention of offset/cursor or total count. Large result sets risk context window exhaustion.
Parameter format constraints stated in descriptions but not enforced in schema. ISO date format (YYYY-MM-DD) mentioned but no regex pattern or format keyword in JSON Schema.