MCP server with 5 ICS / iCalendar tools. Generate events, build multi-event calendars, parse existing ICS, plus one-click 'Add to Google/Outlook Calendar' URLs. Free, MIT.
mcp-ical has well-structured tool definitions with complete input schemas and clear descriptions. All 5 tools follow verb_noun naming (create_event, parse_ics, google_calendar_url). Schemas are properly typed with required fields. However, parameter descriptions are sparse or missing for many fields (e.g., 'location', 'description', 'url' in create_event lack descriptions). Output schemas are not documented, callers cannot see what fields to expect from responses. Error handling is minimal; no recovery guidance or validation messages. The server lacks tool annotations (readOnlyHint, destructiveHint) despite all tools being read-only operations.
Build a multi-event ICS calendar file from an array of events.
Generate an RFC 5545 ICS file for a single calendar event.
Build a one-click 'Add to Google Calendar' URL for an event (no auth needed).
Build a one-click 'Add to Outlook Web Calendar' URL.
Parse an ICS file content and return an array of event objects.
Output schemas not documented. Callers cannot see what fields create_event, create_calendar, parse_ics return. LLMs cannot plan downstream operations or extract required data.
Many parameters lack descriptions. 'location', 'description', 'url', 'organizer_email', 'attendees' in create_event have no descriptions. LLMs cannot infer when to use these optional fields.
No tool annotations. All 5 tools are read-only (generate ICS, parse, build URLs) but lack readOnlyHint annotation. Agents cannot distinguish safe tools from destructive ones.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Minimal error handling. No validation messages, recovery guidance, or error categorization. Invalid ISO 8601 dates throw generic 'Invalid datetime' errors with no guidance on correct format.
Parameter 'all_day' in create_event and create_calendar lacks description. LLMs cannot determine when to set it true vs false or what behavior changes.