A lightweight MCP server that provides dad jokes from icanhazdadjoke.com API
Three tools with basic verb-noun naming (get_*, search_*). All have descriptions and input schemas present. However, descriptions are minimal (10-50 chars for tool summaries; parameter descriptions exist but lack detail on constraints, formats, and error recovery). No output schema documentation. No error handling guidance. Parameters lack validation constraints (e.g., limit bounds not enforced in schema, only in code). No tool annotations (readOnlyHint, etc.). Schemas are present but sparse, missing examples, format specs, and chaining IDs. This is a functional but minimal implementation typical of community servers.
Get a specific dad joke by its ID. Args: joke_id: The ID of the joke to retrieve
Get a random dad joke from icanhazdadjoke.com
Search for dad jokes by keyword or phrase. Args: term: Search term to find jokes limit: Number of jokes to return (default: 5, max: 30)
No output schema documentation. Tools return strings; LLMs cannot infer structure (joke text, ID, count) for downstream chaining or parsing.
Parameter descriptions lack constraint details. 'limit' has default and max in docstring but not in schema constraints (minItems, maxItems, or enum). LLMs cannot validate bounds without reading code.
No error handling guidance. Tools call external API (icanhazdadjoke.com) but do not document failure modes (network timeout, invalid ID, rate limit). LLMs have no recovery path.
Tool descriptions are under 100 chars and lack context on when to use each tool. 'Get a random dad joke' does not explain when to call this vs search_jokes_tool.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint, idempotentHint). All three tools are read-only and idempotent, but this is not declared in the schema for agent optimization.