MCP server for Pingfyr — schedule reminders via email, webhook, Slack, Discord, Telegram, OpenClaw, or Google Calendar.
Strong tool naming and parameter schemas with well-defined enums and constraints. All four tools have clear action-verb names (create_, list_, update_, cancel_) and detailed descriptions. Input schemas are comprehensive using Zod with type definitions and validation rules. However, output schemas are not formally documented, responses are hand-crafted text concatenations rather than structured objects with typed fields. Error handling is basic (returns error text but lacks recovery guidance or categorization). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear semantic differences between tools (read-only list_reminders vs. destructive cancel_reminder). The server accepts natural identifiers (email, URLs) for recipients, which is good for composition. Missing pagination metadata (total count, next_cursor) in list_reminders response despite accepting limit/offset params.
Cancel a pending reminder so it will not be delivered
Schedule a new reminder to be delivered via email, webhook, Slack, Discord, Telegram, OpenClaw, or Google Calendar
List all reminders for the authenticated user with optional filtering
Update a pending reminder (title, fire time, etc.)
Output schemas not formally documented. Tool responses are text-formatted strings rather than structured objects with typed fields. LLM cannot parse response structure to extract IDs, timestamps, or metadata for downstream tool calls.
Tool annotations (readOnlyHint, destructiveHint, idempotentHint) missing. cancel_reminder is clearly destructive, list_reminders is read-only, create_reminder has side effects, these semantic hints guide agent behavior and should be declared.
list_reminders accepts limit/offset pagination parameters but response does not include total count or next_cursor. LLM cannot determine if more results exist without making repeated calls.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Error responses lack recovery guidance. Errors return plain text 'Failed to create reminder: <error>' without categorizing as retryable/user-fixable/fatal or suggesting next steps. LLM has no way to determine appropriate recovery action.
No confirmation or dry-run for destructive operation (cancel_reminder). Agents make mistakes, a confirmation step would prevent accidental reminder cancellations.
create_reminder description lacks clarity on when fire_at times in the past are rejected (states 'must be in the future' but no error behavior documented). update_reminder can only modify pending reminders, this constraint should be stated in the description, not left implicit.