Semrush MCP Pack provides 6 well-structured SEO analytics tools with complete input schemas and clear descriptions. All tools follow verb_noun naming (domain_overview, domain_organic_keywords, etc.) and include detailed parameter documentation. However, output schemas are not formally documented, descriptions mention CSV column abbreviations (Ph, Po, Nq, etc.) but the actual JSON response structure is not declared. Error handling is basic (throws on non-2xx or 'ERROR' prefix) with no recovery guidance. No tool annotations (readOnlyHint, destructiveHint) despite all being read-only. Parameter descriptions are strong (72-char average baseline met), but missing enum constraints for database codes and target_type values.
Backlinks summary for a domain or URL (Semrush type=backlinks_overview). Returns parsed rows with columns: target, target_type, total (total backlinks), domains_num (referring domains), urls_num (referring URLs), ips_num (referring IPs), follows_num (dofollow), nofollows_num, texts_num, images_num, score (authority score). Note: backlinks reports are not regional — there is no `database` param. Consumes your Semrush API units.
Top organic search keywords a domain ranks for (Semrush type=domain_organic). Returns parsed rows with columns: Ph (keyword phrase), Po (current position), Pp (previous position), Nq (search volume), Cp (CPC), Ur (ranking URL), Tr (traffic %), Co (competition), Nr (number of results). Consumes your Semrush API units.
Domain overview (Semrush type=domain_ranks): high-level SEO/PPC summary for a domain. Returns parsed rows with columns: Db (database), Dn (domain), Rk (Semrush rank), Or (organic keywords count), Ot (organic traffic), Oc (organic traffic cost), Ad (adwords/paid keywords count), At (paid traffic), Ac (paid traffic cost). Consumes your Semrush API units.
Paid (AdWords/PPC) keywords a domain bids on (Semrush type=domain_adwords). Returns parsed rows with columns: Ph (keyword phrase), Po (ad position), Nq (search volume), Cp (CPC), Ur (landing page URL), Tg (traffic), Tc (traffic cost), Co (competition), Nr (number of results). Consumes your Semrush API units.
Output schemas not formally documented. Descriptions mention CSV column abbreviations (Ph, Po, Nq, Cp, etc.) but do not declare the JSON response structure, field types, or whether results are paginated. LLMs cannot plan downstream tool calls without knowing what fields to extract.
No enum constraints for database parameter. Description says '2-letter Semrush regional database (e.g. us, uk, de, fr, es, ca, au)' but does not declare enum: ['us', 'uk', 'de', 'fr', 'es', 'ca', 'au']. LLMs may hallucinate invalid codes like 'gb' instead of 'uk'.
backlinks_overview target_type parameter lacks enum constraint. Description says 'One of "root_domain", "domain" (subdomain), or "url"' but schema does not declare enum. LLMs may pass invalid values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Keyword overview (Semrush type=phrase_this): search metrics for a single keyword phrase. Returns parsed rows with columns: Ph (phrase), Nq (search volume), Cp (CPC), Co (competition 0-1), Nr (number of organic results), Td (trend, last 12 months as |-separated values). Consumes your Semrush API units.
Organic search competitors for a domain (Semrush type=domain_organic_organic). Returns parsed rows with columns: Dn (competitor domain), Cr (competition level), Np (common keywords), Or (competitor organic keywords), Ot (competitor organic traffic), Oc (organic cost). Consumes your Semrush API units.
No tool annotations despite all tools being read-only. Missing readOnlyHint annotation would help agents understand these tools have no side effects and are safe to call speculatively.
Error handling provides no recovery guidance. semrushGet() throws generic errors like 'Semrush: 403 ERROR 120 :: WRONG KEY - ID PAIR' with no actionable next step. Should guide LLM: 'Invalid API key. Verify _apiKey parameter and Semrush account status.'