An MCP server that performs automated SEO site health audits, analyzing domains for health scores, critical issues, and providing audit summaries across multiple checks.
Single tool 'audit_domain' has critical gaps across naming, description quality, parameter documentation, and schema completeness. The tool definition is visible in client.py but lacks the depth, clarity, and structure required for production use. Tool naming does start with a verb (audit_), meeting a baseline criterion, but descriptions are minimal and parameter documentation is severely inadequate.
Audits a domain for SEO site health, returning a health score, critical issues, and an audit summary.
Tool description is only 88 characters; lacks WHEN to use it, WHAT prerequisites exist, and what the health_score scale means (0 - 100? other?). According to baseline, average descriptions are 194 chars; under 100 chars offers minimal context for LLM selection.
Parameter 'target_domain' lacks description entirely. LLM cannot determine if it expects 'example.com', 'https://example.com', or 'example.com/path'. Parameter naming alone does not convey format or valid input.
Parameter 'crawl_depth' description is only 36 characters ('The depth of crawling to perform (default: 2)') and omits constraints: minimum value, maximum value, what 'depth' means operationally, and time/resource implications. Unbounded numeric parameters let LLMs pass absurd values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 34 | 2026-07-28+ | v2 |
Output schema is not documented. Return value is a dict with 'health_score', 'critical_issues', and 'audit_summary', but LLM has no formal specification of field types, array structure of issues, or whether health_score is 0 - 100, 0 - 1, or unbounded. Required per pattern:tool.
Issue objects in 'critical_issues' array lack schema. Each has 'issue' (string) and 'severity' (enum?), but this is inferred from code, not documented. Severity values are not formally declared as enum, risking hallucinated values like 'CRITICAL' or 'BLOCKER'.
No error handling guidance. If the domain is unreachable, malformed, or requires authentication, the tool returns nothing; no recovery suggestion (e.g. 'Check domain spelling' or 'Try a public URL'). Pattern:recovery-guide requires actionable error messages.
Tool description does not clarify when to call this vs other SEO tools or whether it requires external API calls. Is this a local analysis or does it fetch live data? Does it work offline or require network access? LLM cannot infer dependencies.
Return type 'health_score' scale is undocumented. Is 88.5 out of 100? Out of 10? Percentile? 'audit_summary' is free text, not structured. LLM cannot parse or reason about results reliably without formal output schema.