A Next.js calendar application that integrates with Google Calendar, processes calendar events from images using AI extraction, and manages event drafts and publishing. Includes Discord OAuth integration for user authentication.
MyCalPal exhibits significant definition quality gaps. While 18 tools are registered with descriptions and input schemas, most descriptions are generic and lack actionable context for LLM selection. Parameter descriptions are sparse or missing entirely. No output schemas are documented. Tool naming is inconsistent (oauth_initiate vs calendar_create vs drafts_list). Critical security concerns: oauth_callback and oauth_notify expose sensitive OAuth flows without error recovery guidance. Destructive tools (drafts_clear, published_clear, drafts_delete) lack confirmation patterns. Average tool description length ~120 chars (below 194-char baseline); many parameters lack type constraints or format guidance. No evidence of idempotency, pagination limits, or chaining-ID inclusion in responses.
Creates and publishes a calendar event to the user's selected calendar provider (Google Calendar). Requires authentication and valid event details.
Retrieves list of user's calendars from Google Calendar. Returns calendar metadata including ID, name, access role, and colors.
Tests if a specific event exists in Google Calendar by event ID and calendar ID.
Lists all Google accounts registered for a Discord user, including active account status.
Switches the active Google account for a Discord user by account number.
Registers a Discord user with a Google account email. Supports multiple Google accounts per Discord user with account switching capability.
Deletes all draft events for the authenticated user.
Destructive tools lack confirmation/dry-run patterns. drafts_clear, published_clear, and drafts_delete accept minimal input and execute immediately without user confirmation, risking accidental data loss.
Output schemas not documented. No tool description specifies what fields are returned, forcing LLMs to guess structure and plan downstream calls blindly. calendar_list, drafts_list, published_list, and discord_accounts_list lack return type documentation.
OAuth flow lacks error recovery guidance. oauth_callback and oauth_notify descriptions do not explain what LLM should do on invalid_state, access_denied, or server_error. No actionable recovery steps provided.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 41 | 2026-07-28+ | v2 |
Creates a new draft event for the authenticated user.
Deletes a specific draft event for the authenticated user.
Retrieves draft events for the authenticated user from MongoDB. Supports filtering by status and limiting results.
Moves a draft event to published collection and removes it from drafts. Records the calendar provider and calendar ID where the event was published.
Updates a specific draft event for the authenticated user.
Returns server health status and environment configuration details including API key availability and runtime information.
Handles OAuth callback from Google authentication. Verifies state parameter, exchanges authorization code for tokens, retrieves user info, and registers Discord user with verified email.
Initiates OAuth flow for Discord user authentication with Google. Generates secure state parameter, stores session in database, and returns authorization URL for Google OAuth2.
Sends Discord notifications to users about authentication success or failure. Handles different error types with appropriate messages.
Deletes all published events from the database.
Retrieves all published events, optionally filtered by user ID.
Parameter descriptions incomplete or missing. drafts_update accepts only 'id' but description does not specify which fields can be updated (title, date, time, location, etc.). calendar_create attendees parameter lacks format guidance (email list? array of objects?).
No pagination or result limits documented. drafts_list and published_list accept limit parameter but no maximum is specified. No guidance on whether results are paginated, what happens with large datasets, or how to fetch next page.