Output schemas completely undocumented. No tool declares what fields are returned, forcing LLMs to infer structure and plan downstream calls blindly.
get_domain_overviewget_domain_organic_keywordsget_domain_paid_keywordsget_competitors_in_organicget_backlinksget_backlinks_domainsget_keyword_overviewget_related_keywordsget_keyword_overview_single_dbget_batch_keyword_overviewget_keyword_organic_resultsget_keyword_paid_resultsget_keyword_ads_historyget_broad_match_keywordsget_phrase_questions
Tool descriptions uniformly brief (10-30 chars, e.g. 'Get domain overview including ranks and traffic metrics'). Baseline is 194 chars; LLM-optimized range is 50-200. Current descriptions lack context for selection, do not explain when to use this tool vs similar ones, and do not hint at prerequisites.
get_domain_overviewget_domain_organic_keywordsget_domain_paid_keywordsget_competitors_in_organicget_backlinksget_backlinks_domainsget_keyword_overviewget_related_keywordsget_keyword_overview_single_dbget_batch_keyword_overviewget_keyword_organic_resultsget_keyword_paid_resultsget_keyword_ads_historyget_broad_match_keywordsget_phrase_questions
'database' parameter accepts only known values (us, uk, de, fr, etc.) but is not declared as an enum. Free-form string invites hallucinated values; enum makes options self-documenting.
get_domain_overviewget_domain_organic_keywordsget_domain_paid_keywordsget_competitors_in_organicget_keyword_overviewget_related_keywordsget_keyword_overview_single_dbget_batch_keyword_overviewget_keyword_organic_resultsget_keyword_paid_resultsget_keyword_ads_historyget_broad_match_keywordsget_phrase_questions
'limit' parameters lack min/max constraints. Unbounded numeric parameters let LLMs pass absurd values (e.g. limit=1000000) that stress APIs or cause timeouts.
get_domain_organic_keywordsget_domain_paid_keywordsget_competitors_in_organicget_backlinksget_backlinks_domainsget_related_keywordsget_batch_keyword_overviewget_keyword_organic_resultsget_keyword_paid_resultsget_keyword_ads_historyget_broad_match_keywordsget_phrase_questions
No pagination guidance. Tools returning lists (keywords, results, backlinks) lack documentation of how results are chunked, whether there is a default limit, or how to iterate through large result sets. LLMs need explicit pagination to avoid context window exhaustion.
get_domain_organic_keywordsget_domain_paid_keywordsget_competitors_in_organicget_backlinksget_backlinks_domainsget_related_keywordsget_keyword_organic_resultsget_keyword_paid_resultsget_keyword_ads_historyget_broad_match_keywordsget_phrase_questions
Parameter descriptions are minimal (avg 15-25 chars vs 72 char baseline). E.g. 'Database to query (default: us)' does not state which values are valid, what the implications of choosing one database over another are, or when to use regional vs global data.
get_domain_overviewget_domain_organic_keywordsget_domain_paid_keywordsget_competitors_in_organicget_keyword_overviewget_related_keywordsget_keyword_overview_single_dbget_batch_keyword_overviewget_keyword_organic_resultsget_keyword_paid_resultsget_keyword_ads_historyget_broad_match_keywordsget_phrase_questions
No error handling or recovery guidance visible. Code defines SemrushApiError but does not show how errors are caught, classified (retryable vs permanent), or formatted for LLM consumption. LLMs cannot act on bare error codes.
get_domain_overviewget_domain_organic_keywordsget_domain_paid_keywordsget_competitors_in_organicget_backlinksget_backlinks_domainsget_keyword_overviewget_related_keywordsget_keyword_overview_single_dbget_batch_keyword_overviewget_keyword_organic_resultsget_keyword_paid_resultsget_keyword_ads_historyget_broad_match_keywordsget_phrase_questions
Tool names could be more specific about output. 'get_domain_organic_keywords' and 'get_keyword_organic_results' both query organic rankings but from opposite angles (domain→keywords vs keyword→domains). Descriptions should clarify the direction and when to use each.
get_domain_organic_keywordsget_keyword_organic_results