MCP server that bridges Pushover API with CLI and MCP tools for sending, receiving, and managing push notifications
The server registers 4 tools with explicit schemas and descriptions visible in internal/mcp/tools.go. Tool naming follows verb_noun convention (send_notification, check_messages, list_history, mark_read). All tools have descriptions between 100-150 characters. Input schemas are properly structured with JSON Schema format, type definitions, and descriptions for all parameters. However, there are significant gaps: (1) output schemas are NOT documented, the code defines SendNotificationOutput and other structs but these are never declared in the MCP tool registration, leaving LLMs without knowledge of return fields; (2) parameter descriptions lack constraint details (e.g., 'priority' says '-2 (lowest) to 2 (highest)' in the tool def but should also include validation guidance); (3) no error handling guidance, LLMs do not know what to do if the Pushover API is unreachable or credentials fail; (4) no idempotency or retry guidance for the write operation (send_notification); (5) resource composition is minimal, tools do not explicitly guide multi-step workflows (e.g., 'check messages, then optionally mark_read'). The server is functional but lacks production-grade documentation and error recovery patterns.
Poll the Pushover Open Client API, persist new messages, and return the newest ones.
Query persisted message history from the local SQLite database.
Delete unread messages from Pushover up to (and including) the provided ID.
Send a push notification through Pushover, mirroring the CLI 'send' command.
Output schemas not declared in MCP tool registration. Code defines SendNotificationOutput, CheckMessagesOutput, etc. structs, but these are never registered with the tool definitions. LLMs cannot infer return fields and cannot plan downstream tool calls or data extraction.
No error handling guidance. Tool descriptions and handlers do not specify what happens when Pushover API is unreachable, credentials fail, or database is unavailable. Error responses appear to return raw errors without recovery hints. LLMs will not know whether to retry, ask the user, or escalate.
Missing write-operation safeguards. 'send_notification' modifies external state (sends to Pushover) and 'mark_read' deletes data, but neither description flags them as WRITE/destructive operations. LLMs lack signal to decide when to ask for confirmation or avoid retries. Descriptions should explicitly state consequences.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 54 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 48 | - | v1 |
Parameter constraint guidance is incomplete. 'since' parameter in list_history says 'Natural language or ISO date' but does not specify which parser or date format is accepted. 'sound' parameter lists no valid values. LLMs may pass invalid values and receive unhelpful error messages.
No pagination or result limiting guidance. 'check_messages' and 'list_history' both return lists but descriptions do not clarify default limits, maximum result sizes, or pagination strategy. Large result sets could exhaust context windows.