Integrates LeetCode, CodeChef, and Codeforces contests with Google Calendar. Fetches upcoming coding contests from multiple platforms and manages calendar events with IST timezone support.
This server has moderate definition quality with a mix of strengths and significant gaps. Tool naming follows verb_noun conventions well (fetch_contests, add_contest_to_calendar, delete_calendar_event). Descriptions exist for all tools and most parameters, but are often generic and lack sufficient context for LLM decision-making. Parameter schemas are present but incomplete, many lack explicit type definitions in the schema, relying instead on Python type hints that may not be visible to MCP clients. No output schemas are documented. Error handling is minimal and does not guide recovery. The server operates in STDIO mode only, which is a hard transport limitation. Resources are implemented (contest://{contest_id}), but tool composition and chaining support is weak.
Parameter schemas lack explicit JSON Schema type definitions. While Python type hints exist (list[int], str, bool), these are not guaranteed to be serialized in the MCP schema. Parameters should have explicit 'type' and 'items' fields in JSON Schema.
Add explicit JSON Schema type definitions to parameter schemas. For add_contest_to_calendar.reminder_minutes, use: {'type': 'array', 'items': {'type': 'integer', 'minimum': 1, 'maximum': 1440}, 'description': 'Minutes before contest to send reminders (1 - 1440 range, e.g., [30, 10])'}
Convert platform parameter in fetch_contests to an enum: {'type': 'string', 'enum': ['Codeforces', 'LeetCode', 'CodeChef', ''], 'description': 'Filter by platform. Leave empty to fetch from all platforms.'}
Expand tool descriptions to include WHEN and WHY to use them. Example: 'Fetch upcoming coding contests from LeetCode, CodeChef, and Codeforces. Call this first to discover upcoming contests before adding them to your calendar. Returns contest details including start time (IST), duration, and registration URLs. Filters by platform and lookahead window (default: next 30 days).'
Add per-parameter descriptions where missing or vague. days_ahead in fetch_contests: 'Number of days to look ahead from today (1 - 365, default: 30). Determines the search window for upcoming contests.'
Score history
Overall score trend
↑ 8 points across a rubric change (v1 → v2)
48/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
F
48
2026-07-28+
v2
2026-03-09
F
40
-
v1
Descriptions lack specificity and recovery guidance. E.g., 'Fetch upcoming coding contests from LeetCode, CodeChef, and Codeforces' does not explain WHEN to call this vs other tools, or what structure is returned. No guidance on failure modes.
Error handling is minimal and non-actionable. E.g., 'Error adding to calendar: {str(e)}' exposes raw exceptions. No error categorization (retryable vs user-fixable), no recovery hints, no structured error format.
Missing tool annotations (readOnlyHint, destructiveHint, idempotentHint). Current spec expects tools to be annotated with their safety classification. Destructive tools like delete_calendar_event should have destructiveHint=true; read-only tools like fetch_contests should have readOnlyHint=true.
No input validation or constraint documentation. Platform parameter in fetch_contests accepts any string; should be an enum: ['Codeforces', 'LeetCode', 'CodeChef', '']. reminder_minutes in add_contest_to_calendar is unbounded, no range constraint (e.g., 1-1440 minutes).
No pagination support or result limits documented. fetch_contests returns all contests for a date range without limiting result count. Large result sets could exhaust context windows. No 'limit' or 'offset' parameters; no documentation of max results per call.
Tool composition is weak. add_contest_to_calendar requires a 'contest_id', but fetch_contests does not document what contest_id format it returns. This breaks the natural tool chain: fetch → add to calendar.
No confirmation or dry-run mechanism for destructive operations. delete_calendar_event is irreversible but has no confirmation step or dry-run option. Agents could accidentally delete calendar events.
delete_calendar_event
Implement structured error responses that categorize errors and offer recovery guidance. Example: 'Contest ID "codeforces_9999" not found. Available contests: [list]. Try calling fetch_contests() first to refresh the contest list.'
Add tool annotations to FastMCP tool registrations. Wrap each @mcp.tool() with readOnlyHint/destructiveHint/idempotentHint metadata to signal safety to clients.
Add pagination to fetch_contests and list_calendar_contests. Accept 'limit' (default: 20, max: 100) and 'offset' (default: 0) parameters. Return a response with 'contests', 'total', 'offset', 'limit', 'has_more' fields.
Document contest_id format in fetch_contests output and add_contest_to_calendar input. E.g., 'Contest ID is returned by fetch_contests() as contest.id and has format: {platform}_{numeric_id}, e.g., codeforces_1234.'
Add a confirm_delete_calendar_event() tool or add a 'dry_run' parameter to delete_calendar_event to allow agents to preview what will be deleted before committing.
Add input validation with actionable error messages. E.g., 'Invalid reminder: 2000 minutes. Must be between 1 and 1440.' instead of passing invalid values to the API.
Document IST timezone assumptions and conversion behavior in tool descriptions and output schemas. E.g., 'All times are displayed in IST (Indian Standard Time, UTC+5:30). Times are converted from platform-specific timezones on return.'