Three tools with complete input schemas and basic descriptions, but significant gaps in parameter documentation and output schema clarity. Tool names lack action verbs (semrushDomain, semrushKeyword, semrushBacklinks instead of get_domain_ranks, analyze_keyword, list_backlinks). Descriptions are present but generic (avg ~80 chars, below 194-char baseline). Parameters have types and enums but lack detailed descriptions explaining constraints, formats, and use cases. No documented output schemas. Error handling is minimal, handlers throw generic errors without recovery guidance. Composition is reasonable (three distinct concerns), but naming conventions deviate from production baselines.
Backlink analysis tool supporting list and refdomains operations
Domain analysis tool supporting ranks and competitors operations
Keyword research and analysis tool supporting overview, related, and difficulty operations
Tool names lack action verbs. 'semrushDomain', 'semrushKeyword', 'semrushBacklinks' do not start with verbs (get_, list_, analyze_). LLMs infer intent from names, these names are ambiguous about what action occurs.
Parameter descriptions are minimal or missing. 'operation' enum values (ranks, competitors, overview, related, difficulty) are not explained, LLMs cannot determine when to use 'ranks' vs 'competitors' without additional context.
No documented output schemas. Tool handlers return results from API client methods (getDomainOverview, getKeywordDifficulty, getBacklinks), but the response structure is not documented. LLMs cannot plan downstream calls or extract required fields.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 43 | 2026-07-28+ | v2 |
Error handling is generic and non-actionable. Handlers throw 'Domain is required' or 'Keyword is required' without recovery guidance. No categorization of errors as retryable, user-fixable, or fatal.
API key handling is insecure. Code shows 'process.env.SEMRUSH_API_KEY || "api-key-from-claude-desktop"', the fallback string is a placeholder that will fail at runtime, and no guidance on proper secret injection is provided.