MCPal defines a single tool 'send_notification' with a clear action verb, comprehensive parameter schema, and well-structured input validation. The tool description (145 chars) is within the 10-1024 baseline and explains the core functionality and use case. All 5 parameters have type definitions and descriptions. Input sanitization is robust (SANITIZE_LIMITS enforced, control char stripping, newline normalization). Output schema is formally defined via Zod with runtime validation. However, the output schema documentation is implicit (inferred from code) rather than explicitly surfaced in tool registration, and error handling lacks recovery guidance for the LLM (e.g., 'notification failed, try again' vs actionable next steps).
Send a native desktop notification. Use reply=true when you need user input - they can type a response directly! Perfect for asking questions or getting feedback without interrupting their flow.
Output schema not documented in tool registration. The Zod schema exists in tool-result.schema.ts but is not exposed to the LLM via the tool definition. LLMs cannot infer what fields to expect in the response (status, title, message, response, activationType, reply, error, sanitized).
Error responses lack recovery guidance. When notification fails, the error message does not tell the LLM what to do next (retry, adjust input, check permissions). A bare error string wastes a turn.
Parameter 'dropdownLabel' is marked optional but the description states it is 'required when using multiple actions'. This conditional dependency is not enforced in the schema and could confuse LLMs into omitting it when actions.length > 1.
No idempotency guarantee documented. If an LLM retries a send_notification call due to a transient error, will the user see duplicate notifications? The tool should declare idempotency or provide a deduplication mechanism.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2025-06-18+ | v2 |
Timeout parameter accepts any number but lacks bounds. Description says 'Defaults: 10s (simple), 20s (actions), 30s (reply)' but does not specify min/max. LLMs could pass 0, negative, or absurdly large values.