A Windows reminder notification MCP server that schedules, lists, and cancels reminders with Windows toast notifications
NudgeMcp defines 3 tools with clear verb-noun naming (schedule_reminder, list_reminders, cancel_reminder) and adequate descriptions (80-120 chars each). All tools have input schemas with typed parameters and descriptions. However, output schemas are inferred from C# record types rather than explicitly documented in the MCP protocol layer. Parameter descriptions are functional but lack constraint details (e.g., message length limits, delayMinutes bounds). Error handling is basic, ArgumentOutOfRangeException for invalid delayMinutes, but no recovery guidance in descriptions. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear semantic differences (list_reminders is read-only; schedule_reminder is destructive). Composition is sound: each tool has one responsibility, and schedule_reminder returns reminderId for use in cancel_reminder.
Cancel a pending reminder by its reminder ID.
List all pending reminders that are still waiting to fire.
Schedule a Windows reminder notification after a delay in minutes. Example: if the user says "tell me to stretch 10 minutes later", use message="stretch" and delayMinutes=10.
Output schemas not explicitly documented in MCP protocol layer. Return types are C# records (ScheduleReminderResult, PendingReminderResult, CancelReminderResult) but not exposed as JSON Schema in tool definitions. LLMs cannot predict response structure without explicit schema documentation.
Missing tool annotations. schedule_reminder is destructive (creates state); list_reminders is read-only; cancel_reminder is reversible. No destructiveHint, readOnlyHint, or idempotentHint annotations present. Agents cannot distinguish safe from risky operations.
Parameter constraints not documented. delayMinutes accepts 'fractional values' but no min/max bounds stated in description. message parameter has no length limit or format guidance. LLMs may pass invalid values (negative delays, empty messages) despite runtime validation.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | <=2025-11-25 | v2 |
Error messages lack recovery guidance. ArgumentOutOfRangeException for invalid delayMinutes is caught at runtime but description does not explain what values are valid or what to do if validation fails. No actionable error classification (retryable vs user-fixable).
list_reminders description is vague ('List all pending reminders that are still waiting to fire'). Does not explain when to call it, what structure is returned, or whether results are paginated. No guidance on result limits or ordering.