This server registers 4 tools with explicit schemas and descriptions. However, there are significant gaps that prevent a higher score. All tools have descriptions and input schemas with type definitions, which is positive. However, descriptions are frequently generic or lack actionable guidance for LLM selection. Parameter descriptions exist but several lack specificity about constraints, formats, or when to use the tool. The schema quality is solid, all tools have proper JSON Schema with types, but output schemas are not documented, and error handling is minimal. The naming follows verb_noun convention (create_link, update_link, delete_link, upsert_link), which is good, but the descriptions do not clearly articulate WHEN to use each tool or what distinguishes 'create' from 'upsert'. For example, 'create_link' says 'asking the user which domain to use' but the description does not explain when the user would be prompted, or what happens if domain is provided vs omitted. The server lacks tool annotations (destructiveHint on delete_link is critical), parameter validation guidance, output schema documentation, and clear error recovery paths.
Create a new short link on dub.co, asking the user which domain to use
Delete a short link on dub.co
Update an existing short link on dub.co
Create or update a short link on dub.co, asking the user which domain to use if creating
Output schemas not documented. LLM cannot predict what fields are returned (e.g., does create_link return shortLink, linkId, domain, expiresAt?). This forces agents to make assumptions or fail on downstream tool calls.
Missing tool annotations. delete_link is destructive but has no destructiveHint annotation. create_link and update_link should have idempotentHint if they are idempotent (unclear from docs). LLM cannot reason about retry safety or reversibility.
Descriptions do not clarify tool disambiguation. 'create_link' and 'upsert_link' both accept the same parameters and return similar results, the descriptions do not clearly explain WHEN to use create vs upsert. LLM will guess or use both redundantly.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 56 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Parameter descriptions lack constraint details. 'url' in create_link says 'The destination URL to shorten' but does not specify: must be http/https? Max length? Relative URLs allowed? 'key' says 'optional custom slug' but does not say: allowed characters? Max length? Must be unique? Format?
No error recovery guidance. Error handling returns HTTP status and message text, but does not categorize errors as retryable, user-fixable, or fatal. LLM cannot decide: retry? Ask user? Give up?
delete_link lacks confirmation/dry-run pattern. Destructive operations should support a confirmation step or dry-run to prevent accidental deletion. No dry_run parameter or confirmation mechanism visible.
Domain parameter behavior unclear. create_link and upsert_link both say 'Optional domain slug to use. If not provided, the primary domain will be used.' But the description also says 'asking the user which domain to use', when does this prompt happen? Before calling the tool? After? Is it blocking?
No pagination or result limits documented. If a user has hundreds of links, list/search operations could return massive responses. No evidence of pagination, limit defaults, or result capping in tool descriptions.