Self-hosted URL shortener with click tracking, analytics REST API, and MCP server
Server has 5 tools with complete input schemas and basic descriptions. Naming follows verb_noun convention (shorten_url, get_url_info, delete_url, list_urls). However, descriptions are generic and lack LLM-optimized guidance on when to use each tool vs. alternatives. Parameter descriptions are minimal (e.g., 'The short code to look up' lacks format/length constraints). Output schemas are not documented, LLMs cannot predict response structure. Error handling returns plain text errors without recovery guidance. No tool annotations (readOnlyHint, destructiveHint) despite clear risk levels (WRITE, DESTRUCTIVE). Missing idempotency guidance for retry-safe operations.
Delete a shortened URL.
Get information about a shortened URL including click count.
Get detailed click analytics for a shortened URL.
List all shortened URLs with pagination.
Create a shortened URL. Returns the short code, short URL, and QR code link.
No output schema documentation. LLMs cannot predict response structure (e.g., does shorten_url return 'shortUrl' or 'short_url'?). Responses are JSON-stringified text, not structured objects.
Parameter descriptions lack format/constraint details. 'The short code to look up' does not specify length, character set, or case sensitivity. 'Optional expiration time in seconds' lacks min/max bounds.
No tool annotations despite clear risk levels. delete_url is DESTRUCTIVE but lacks destructiveHint. get_url_info and get_url_stats are READ_ONLY but lack readOnlyHint. Agents cannot distinguish safe from unsafe operations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Error handling returns plain text ('Error: URL not found') without recovery guidance. No distinction between retryable vs. fatal errors. LLM cannot determine next action.
Tool descriptions are generic and do not explain when to use each tool vs. alternatives. 'Get information about a shortened URL' does not clarify difference between get_url_info (metadata) and get_url_stats (analytics).