BlogSEO
Server Details
SEO that executes: keywords, calendar, articles written, scored and published to your CMS, backlinks
- Status
- Healthy
- Uptime
- 85.4% over 22 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- BlogSEO-io/blogseo-agent-plugin
- GitHub Stars
- 0
- Server Listing
- BlogSEO MCP server
TDQS
Scored across 61 tools
Tools have largely distinct purposes, and the descriptions carefully distinguish stored articles from inline content, exact keyword adds from research, and publishing from CMS syncing. Although the set is very large, overlapping pairs like check_article_seo_score vs check_seo_score or improve_article_seo vs improve_content_seo remain clearly separated.
Nearly every tool follows a snake_case verb_noun convention such as get_, list_, update_, check_, create_, and delete_. Predictable suffixes like _for_content, _with_ai, and _settings keep naming readable despite the large surface.
With 61 tools, the server is far beyond the recommended 3-15 range and passes the 50+ threshold that indicates an extreme mismatch. Even for a broad SEO/content platform, this volume creates substantial selection overhead and many tools could be consolidated.
The surface thoroughly covers keyword research, article lifecycle, SEO scoring, publishing, integrations, settings, backlinks, Search Console, and AI visibility. Minor gaps exist around direct article deletion/archiving, but core workflows have no major dead ends.
Available Tools
61 toolsadd_keywordsAdd keywordsAInspect
Adds the given keywords to the website's keyword plan exactly as written (1 to 20 per call) with their monthly volume, difficulty and CPC from the search-volume provider; nothing is expanded or invented. Keywords already tracked are skipped. Clustering and search-intent classification run in the background afterwards, so cluster_label and intent can be empty for a minute. Limited to 5 calls per hour per website, shared with research_keywords. The credit is charged even when every keyword was already tracked. To discover related keyword ideas from a few seeds, use research_keywords instead. Costs 1 AI brain credit, charged after the work, not refunded on failure. Requires an active subscription or free trial. Pass confirm=true to acknowledge the AI brain credits charge; without it the tool only returns the cost and your balance. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Set to true to acknowledge the AI brain credit charge. Omit it to only get the cost and your balance. | |
| keywords | Yes | Keywords to add as written (1 to 20). | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| website_id | No | Website the result belongs to. |
| added_count | No | |
| credits_balance | No | Current AI brain credits balance; only with requires_confirmation. |
| credits_required | No | AI brain credits the call would charge; only with requires_confirmation. |
| credits_balance_after | No | AI brain credits balance after this call. |
| requires_confirmation | No | Present when the tool did not run: it needs confirm=true. The other fields are then absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations by disclosing that duplicate keywords are skipped, clustering and intent classification run asynchronously, and the credit is charged even if all keywords were already tracked. It also states the rate limit, credit cost, non-refundability, and subscription requirement. This gives the agent a strong understanding of real-world behavior and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence provides necessary operational detail: what the tool does, what it skips, background processing, rate limits, credit costs, auth requirements, and alternative routing. Despite its length, it is well-organized and front-loads the core behavior before secondary caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers prerequisites, quota limits, cost implications, failure behavior, asynchronous effects, parameter requirements, and sibling tool differentiation. Together with the output schema, an agent has everything needed to invoke the tool correctly and anticipate outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema already documents all parameters, the description adds critical semantics: confirm=true acknowledges the credit charge, omitting it returns only the cost and balance, and website_id is needed only for multi-website accounts. The exact keyword count range and the 'exactly as written' behavior add meaning beyond the schema's field names and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool adds given keywords to the keyword plan exactly as written, with volume, difficulty, and CPC from the provider. It differentiates itself from research_keywords by explicitly noting that nothing is expanded or invented and that research_keywords is for discovering related ideas. This makes the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance, including the alternative research_keywords for discovery use cases. It also details limits shared with research_keywords, the confirm=true requirement, and the website_id field conditions. The agent knows exactly when to call this tool versus others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_edit_articles_with_aiBatch edit articles with AIADestructiveInspect
Queues an AI rewrite of up to 50 articles with the same instructions (default-language version only). Asynchronous: articles are edited in the background over the next minutes; check them later with get_article. Articles still generating are skipped and not charged. Editing an article that is already published (or published in draft) marks it Out of Sync until it is synced with sync_article_to_cms or published again. Use edit_article_with_ai for a single article or a translation. Costs AI brain credits (see the cost rule above), charged before the work, refunded if the provider fails. Requires an active subscription or free trial. Pass confirm=true to acknowledge the AI brain credits charge; without it the tool only returns the cost and your balance. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Set to true to acknowledge the AI brain credit charge. Omit it to only get the cost and your balance. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| article_ids | Yes | Articles to rewrite (1 to 50). | |
| instructions | Yes | What to change in every article. |
Output Schema
| Name | Required | Description |
|---|---|---|
| failed | No | Could not be queued; refunded. |
| queued | No | |
| status | No | Always "queued": the rewrites run in the background. |
| skipped | No | Still generating; not charged. |
| credits_balance | No | Current AI brain credits balance; only with requires_confirmation. |
| credits_required | No | AI brain credits the call would charge; only with requires_confirmation. |
| credits_balance_after | No | AI brain credits balance after this call. |
| requires_confirmation | No | Present when the tool did not run: it needs confirm=true. The other fields are then absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint=false and destructiveHint=true, but the description goes far beyond that: it discloses asynchronous execution, skipping of still-generating articles, the Out of Sync side effect on published articles, charging/refund behavior on provider failure, and subscription requirements. These are substantial behavioral disclosures that the annotations alone would not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense 8-sentence paragraph, but every sentence adds distinct information—async behavior, skip/charge rules, Out of Sync effect, alternative tool, costs, confirm requirement, and website_id. It front-loads the core action and limitation. Slightly long for the information, but well-ordered and free of fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex async batch tool with cost and side effects, the description covers all critical operational context: what happens, when, what to check, what to acknowledge, what prerequisites exist, and how to route to alternatives. The presence of an output schema means return values need no explanation. No important gap is evident.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description paraphrases the schema's parameter descriptions (confirm, website_id, article_ids, instructions) without adding new meaning. The extra context about credit charging and skipping is behavioral rather than parameter-specific, so there is no significant added semantic value beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'Queues an AI rewrite of up to 50 articles with the same instructions.' It also differentiates from the sibling tool edit_article_with_ai by explicitly pointing to it for single-article or translation use, so an agent can immediately distinguish batch vs. single editing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use and when-not-to-use guidance: 'Use edit_article_with_ai for a single article or a translation.' It also covers prerequisites (active subscription/free trial), the confirm flag requirement, the website_id condition, and async behavior with a pointer to check results via get_article. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_article_seo_scoreCheck article SEO scoreARead-onlyIdempotentInspect
Computes the on-page SEO score (0-100, graded S+ to D) of an article from its saved content: keyword checks (title, intro, meta, slug, subheading, density, image alt, cannibalization), sub-keyword or competitor-term coverage, and structure checks (length, meta and title length, subheadings, links, images, FAQ, paragraph and sentence length). When a done advanced analysis exists (run_advanced_seo_check) the competitor benchmark is included: competitor-relative score, topic gaps, recommendations and strengths. Pass locale to score a translation against its localized keyword (no benchmark or cannibalization check for translations). Returns every check with status good/ok/bad/na, the semantic keyword coverage and a prioritized list of fixes. The internal and external link checks are skipped when the website has no base URL set. Free and instant; nothing is modified. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Translation locale (e.g. "fr") to score instead of the default-language article. | |
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| band | Yes | |
| fixes | Yes | Failing checks, most impactful first. |
| grade | Yes | Letter grade, S+ to D. |
| score | Yes | On-page SEO score, 0-100. |
| checks | Yes | |
| locale | Yes | |
| article_id | Yes | |
| website_id | Yes | |
| target_keyword | Yes | |
| advanced_analysis | Yes | |
| semantic_keywords | Yes | |
| benchmark_included | Yes | true when a done advanced analysis contributed competitor checks. |
| has_target_keyword | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent/non-destructive annotations, the description discloses that nothing is modified, that checks are skipped when no base URL is set, and that translations get no benchmark or cannibalization checks. It also states the result shape (statuses good/ok/bad/na, semantic coverage, prioritized fixes), adding real behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: scope, check categories, conditional advanced analysis, locale behavior, return format, base-URL exception, and website_id guidance. It front-loads the core computation and maintains a logical flow from normal behavior to exceptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter tool with an output schema, the description covers all relevant edge cases: translation scoring, multi-website accounts, absence of advanced analysis, missing base URL, and the free/non-destructive nature. Nothing essential for an agent to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already covers all three parameters, the description adds decisive semantics: locale means scoring a translation against its localized keyword with benchmark and cannibalization disabled, article_id refers to saved article content, and website_id is needed only when an account has multiple websites. This goes beyond the schema's lexical descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: it computes the on-page SEO score of an article from saved content, including a concrete 0-100/S+ to D grading scale. It further separates itself from the run_advanced_seo_check sibling by explaining when that analysis affects this tool's benchmark output, so an agent can tell it apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete calling context: pass locale to score a translation instead of the default article, pass website_id only for multi-website accounts, and expect a competitor benchmark only when advanced analysis exists. It does not explicitly list exclusionary criteria versus check_seo_score or other siblings, but the conditions are clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_backlinksCheck backlinksAInspect
Returns the backlink profile of any domain (competitors, prospects or the user's own site) from the DataForSEO backlinks index: Ahrefs Domain Rating, total live backlinks, referring domains, main domains and IPs, broken backlinks and pages, nofollow counts, the top TLDs of the linking pages and the 20 strongest backlinks (one per referring domain, sorted by domain rank) with source URL, target URL, anchor, dofollow flag, first-seen date and page title. Accepts a bare domain or a full URL; subdomains and paths are reduced to the registrable domain. Profiles are cached for 7 days (1 hour when the Domain Rating is unavailable) and the response says whether it came from the cache; the credit is charged for every call, cached or not, so do not call it twice for the same domain. Takes up to two and a half minutes on a cache miss. Limited to 30 checks per hour per website. Use check_domain_rating when only the Domain Rating is needed (free). Costs 1 AI brain credit, charged before the work, refunded if the provider fails. Requires an active subscription or free trial. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| domain_or_url | Yes | A domain name (example.com) or a full http(s) URL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cached | Yes | |
| domain | Yes | |
| top_tlds | Yes | |
| backlinks | Yes | Live backlinks in the index. |
| checked_at | Yes | |
| website_id | Yes | Website the result belongs to. |
| broken_pages | Yes | |
| domain_rating | Yes | |
| referring_ips | Yes | |
| top_backlinks | Yes | Strongest backlinks, one per referring domain. |
| broken_backlinks | Yes | |
| referring_domains | Yes | |
| nofollow_backlinks | Yes | |
| credits_balance_after | No | AI brain credits balance after this call. |
| referring_main_domains | Yes | |
| nofollow_referring_domains | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses meaningful behavioral details: calls are charged even when cached, results are cached for 7 days, cache misses can take up to two and a half minutes, there is a 30-per-hour limit, and the credit is refunded if the provider fails. No contradiction with annotations exists; the readOnlyHint=false aligns with the described non-free, non-idempotent behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely informative, with each clause covering a distinct operational concern: output contents, normalization, caching, cost, latency, rate limits, and authentication. It is front-loaded with the primary purpose and the most relevant selection-relevant facts, though the output field enumeration could arguably be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description covers all necessary context: input normalization, caching behavior, costs, failure refund, rate limits, subscription requirements, website_id handling, and the key alternative tool. An output schema is already present, so detailing return values is unnecessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds important semantic clarity by explaining that subdomains and paths are reduced to the registrable domain, and by specifying when website_id is needed, which goes beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Returns the backlink profile of any domain' from the DataForSEO backlinks index, enumerating the exact metrics returned. It explicitly distinguishes itself from the sibling check_domain_rating by naming when that alternative is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly says to use check_domain_rating when only Domain Rating is needed, and explicitly warns not to call check_backlinks twice for the same domain due to credit charges and caching. It also provides rate limits, caching duration, and required subscription context, giving the agent actionable selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_domain_ratingCheck Domain RatingARead-onlyIdempotentInspect
Returns the Ahrefs Domain Rating (0-100 authority score) of any domain, not only the user's own websites: competitors, prospects for link building, or a site found in the backlinks overview. Accepts a bare domain or a full URL; subdomains and paths are reduced to the registrable domain (blog.example.com/page -> example.com). Results are cached for 24 hours, so repeated calls for the same domain return the same value. Limited to 60 lookups per hour.
| Name | Required | Description | Default |
|---|---|---|---|
| domain_or_url | Yes | A domain name (example.com) or a full http(s) URL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cached | Yes | |
| domain | Yes | Registrable domain the rating applies to. |
| domain_rating | Yes | Ahrefs Domain Rating, 0-100; null when unavailable. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, the description discloses important behavioral details: normalization to registrable domain, 24-hour caching, and a 60-lookups-per-hour rate limit. These details help the agent predict repeated-call behavior and throttling without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: the main purpose appears first, followed by scope, input behavior, caching, and rate limit. Every sentence carries useful information and there is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with an output schema and strong annotations, the description is complete. It covers what the tool returns, which domains are in scope, how input is normalized, cache behavior, and rate limits. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes domain_or_url as a domain name or full URL, and schema coverage is 100%. The description adds meaningful semantic depth by explaining that subdomains and paths are reduced to the registrable domain, with a concrete example, which goes beyond the schema's basic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: returns Ahrefs Domain Rating (0-100 authority score) for any domain. It clearly differentiates the tool from siblings by emphasizing it works for competitors, prospects, and sites found in backlinks, not just the user's own websites.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it is for checking authority of any domain, including competitors and link-building prospects. It does not explicitly name alternative tools or state when not to use it, but the context is strong enough that an agent can infer appropriate scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_keyword_densityCheck keyword densityARead-onlyIdempotentInspect
Computes keyword density for a public page URL or a block of text (exactly one of url or text): total and unique words, sentences, reading time, and the most frequent one-, two- and three-word phrases with count and density. With target_keyword it also returns its count, density, a verdict (ideal between 0.5% and 2.5%) and whether it appears in the title, meta description, H1 and first 100 words (placement flags are null for pasted text). Pages are fetched server-side as Googlebot with a Chrome fallback, JavaScript is not executed, at most 1 MB of HTML is read and the extracted text is cached for 1 hour. Fails for pages behind bot protection, non-HTML URLs or JavaScript-only pages: pass the page text instead. Any public page can be checked, not only the user's websites. Limited to 20 checks per 15 minutes. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public http(s) page URL to fetch and analyze. Exactly one of url or text must be set: sending both or neither is rejected. | |
| text | No | Raw text to analyze (max 200000 characters). Exactly one of url or text must be set: sending both or neither is rejected. | |
| max_phrases | No | How many phrases to return per phrase length (1 to 50). | |
| target_keyword | No | Keyword or phrase to measure density and placement for. | |
| exclude_stop_words | No | Skip phrases that start or end with an English stop word (the, of, and...). |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | null when text was analyzed. |
| report | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnly/idempotent/openWorld hints, but the description adds substantial behavioral context beyond them: server-side fetching as Googlebot with Chrome fallback, no JavaScript execution, 1 MB HTML cap, 1-hour cache, failure modes, and rate limiting. This gives the agent a realistic model of how the tool behaves before calling it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six sentences, each dense with non-redundant information, starting with the core output and progressing through fetch details, failure handling, scope, and limits. There is no filler or repetition; the structure makes it easy for an agent to quickly extract constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers input modes, computed outputs, fetch mechanism, success/failure conditions, scope, cache behavior, and rate limits. Since an output schema exists, return-value details do not need to be repeated, and nothing critical is missing for an agent to decide when and how to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already has a solid description, so the baseline is 3. The description adds meaning beyond the schema by explaining target_keyword's verdict threshold (0.5%–2.5%), placement flags behavior, and the url/text mutual-exclusion rule. This is valuable clarification, though not exhaustive since schema already covers defaults and ranges.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb and resource: 'Computes keyword density for a public page URL or a block of text' and enumerates exact outputs (word counts, reading time, n-grams, target keyword verdict). This clearly differentiates it from siblings like check_seo_score or research_keywords, which target broader SEO analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description gives explicit usage context: exactly one of url or text must be provided, and it tells the agent to pass page text when the URL fails due to bot protection, non-HTML, or JavaScript-only pages. It also clarifies any public page can be checked and notes the 20-per-15-minute rate limit. It does not explicitly compare against sibling tools, but the within-tool guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_seo_scoreCheck SEO scoreARead-onlyIdempotentInspect
Scores any content you pass inline (markdown or plain text) with the same on-page SEO checks as BlogSEO articles: keyword in title, introduction, meta description and subheadings, keyword density, sub-keyword coverage, length, meta and title length, subheading distribution, internal and external links, inline images, FAQ section, paragraph and sentence length. Returns the 0-100 score with its letter grade, every check grouped by keyphrase/structure, the semantic coverage of secondary_keywords and the top fixes ordered by impact. The content does not need to be in BlogSEO: use it on drafts, pages from other tools or competitor copy. Without target_keyword the keyword checks are skipped; without site_url the link checks are not applicable. Pasted content has no URL, so no slug is scored: the keyword-in-slug check always reads as a reminder to put the keyword in the URL when you publish. Free and instant; use get_article for articles stored in BlogSEO. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Body of the content as markdown or plain text, 200 to 60,000 characters. | |
| headline | Yes | Title (H1) of the content. | |
| site_url | No | URL of the site the content lives on; its host tells internal and external links apart. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| target_keyword | No | Primary keyword the content should rank for. | |
| meta_description | No | Meta description, when there is one. | |
| secondary_keywords | No | Secondary keywords the content should also cover (max 20). |
Output Schema
| Name | Required | Description |
|---|---|---|
| band | Yes | |
| label | Yes | Letter grade, S+ to D. |
| score | Yes | On-page SEO score, 0-100. |
| checks | Yes | |
| top_fixes | Yes | Failing checks, most impactful first. |
| website_id | Yes | Website the result belongs to. |
| word_count | Yes | |
| has_keyphrase | Yes | false when no target keyword was given: keyword checks are skipped. |
| semantic_keywords | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds valuable behavioral context: the keyword-in-slug check always reads as a reminder for pasted content, the tool is free and instant, and the conditional behavior when target_keyword or site_url are omitted. It doesn't describe rate limits or exact response format, but the output schema exists and the description summarizes the return structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized, front-loading the core purpose and then covering return values, use cases, conditional behavior, and sibling routing. It's a long paragraph but every sentence adds information. Slightly long, but justified given the tool's complexity and 7 parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a read-only scoring tool. It covers what checks are performed, what the return value includes, when to use it vs alternatives, conditional parameter behavior, and the website_id prerequisite. The output schema exists, so return values are further documented. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 7 parameters. The description adds some context beyond the schema: it explains the consequence of omitting target_keyword and site_url, and mentions website_id comes from get_account. However, it doesn't add much detail about the parameters themselves beyond what the schema provides, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool scores inline content with the same on-page SEO checks as BlogSEO articles, listing the specific checks performed. It distinguishes itself from siblings like check_article_seo_score (which likely scores articles stored in BlogSEO) by explicitly saying 'use get_article for articles stored in BlogSEO' and noting the content does not need to be in BlogSEO.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('use it on drafts, pages from other tools or competitor copy') and when not to ('use get_article for articles stored in BlogSEO'). It also provides conditional guidance: 'Without target_keyword the keyword checks are skipped; without site_url the link checks are not applicable' and 'Pass website_id when the account has several websites (see get_account).'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_custom_webhookConnect custom webhookAInspect
Connects a custom webhook: from then on BlogSEO POSTs every published article as JSON to the endpoint (see get_webhook_contract), and auto-publish is on so generated articles are delivered as soon as they are ready. The endpoint must be deployed and reachable over HTTPS first. With auth_method=generated the tool returns a shared secret exactly once: store it in the deployment's environment variables and verify the X-Webhook-Secret header with it. One webhook per organization (Lovable, Bolt, v0, Replit, Base44 and Next.js connections are webhooks too); it works next to a CMS integration. Call test_custom_webhook afterwards. Free. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public URL of the deployed endpoint that receives the articles. | |
| format | No | Format of article.content in the payload: what the endpoint's renderer expects. | markdown |
| platform | No | Builder or framework of the website, one of v0, bolt, replit, base44, lovable, nextjs, so the dashboard shows the connection under it. Omit for anything else. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| auth_method | No | generated (recommended): BlogSEO creates a shared secret and sends it in the X-Webhook-Secret header. custom: BlogSEO sends the header you name with the value you give. | generated |
| custom_header_name | No | Header name, only with auth_method=custom. | |
| custom_header_value | No | Header value, only with auth_method=custom. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| format | Yes | |
| auth_method | Yes | |
| auto_publish | Yes | Always true: generated articles are delivered automatically. |
| shared_secret | Yes | Returned once, with auth_method=generated: store it in the deployment's environment variables. |
| custom_header_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description richly discloses side effects beyond the sparse annotations: it turns on auto-publish, sends every published article as JSON, returns a shared secret exactly once for auth_method=generated, and establishes a one-webhook-per-organization constraint. It also notes compatibility with CMS integrations and that certain builder connections count as webhooks. This gives an agent a strong model of what will happen.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: prerequisites, delivery behavior, authentication handling, constraints, next step, and cost. It is front-loaded with the core action and effect. It could be slightly improved with bullet-style separation, but it remains focused and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters, side effects, authentication nuances, and cross-tool dependencies, the description covers the critical operational context: setup requirements, secret handling, one-per-organization limitation, coexistence with CMS integrations, and follow-up verification via test_custom_webhook. An output schema exists, so explaining return values is unnecessary. Nothing essential is missing for an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all 7 parameters with descriptions and enums, so the baseline is 3. The description adds meaningful behavioral context for key parameters: auth_method=generated means the secret is returned exactly once and must be stored in environment variables, platform has the special meaning that several builder connections are webhooks, and website_id should be passed for multi-website accounts. This exceeds schema-only understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Connects a custom webhook') and immediately clarifies the behavioral consequence: BlogSEO POSTs every published article as JSON to the endpoint. It also distinguishes this tool from related siblings by referencing get_webhook_contract and test_custom_webhook, making its role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational guidance: the endpoint must already be deployed and reachable over HTTPS, one webhook is allowed per organization, and test_custom_webhook should be called afterwards. It also explains when website_id is needed. It does not explicitly state when to prefer alternatives over this tool, but it provides enough context to infer appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_credits_to_backlink_creditsConvert credits to backlink creditsADestructiveInspect
Converts AI brain credits into backlink credits at a fixed rate of 1 AI brain credit = 5 backlink credits, so the exchange network can place more backlinks to the website. The conversion is irreversible: backlink credits can never be turned back into AI brain credits. Cost rule: the amount passed is the number of AI brain credits spent (1 to 100 per call). Returns the new balances. Costs AI brain credits (see the cost rule above), charged before the work, not refunded on failure. Requires an active subscription or free trial. Pass confirm=true to acknowledge the AI brain credits charge; without it the tool only returns the cost and your balance. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Number of AI brain credits to convert (each one becomes 5 backlink credits). | |
| confirm | No | Set to true to acknowledge the AI brain credit charge. Omit it to only get the cost and your balance. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| credits_balance | No | Current AI brain credits balance; only with requires_confirmation. |
| credits_required | No | AI brain credits the call would charge; only with requires_confirmation. |
| ai_credits_balance | No | |
| ai_credits_converted | No | |
| credits_balance_after | No | AI brain credits balance after this call. |
| requires_confirmation | No | Present when the tool did not run: it needs confirm=true. The other fields are then absent. |
| backlink_credits_added | No | |
| backlink_credits_balance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing that the conversion is irreversible, that credits are charged before the work, and that charges are not refunded on failure. These are important behavioral facts not derivable from destructiveHint alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place, covering rate, irreversibility, cost rule, subscription requirement, confirmation behavior, and website_id handling. It is front-loaded with the core conversion fact and then layers necessary operational details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all essential operational dimensions: cost, irreversibility, failure refunds, authentication requirements, confirmation flow, and parameter conditions. With an output schema present, the return value details are adequately handled elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already covers all parameters, the description adds meaning: amount is defined as AI brain credits spent with a 1-to-100 range, confirm is tied to acknowledging the charge, and website_id is tied to multi-website accounts and the get_account source. This is strong value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact verb and resource: it converts AI brain credits into backlink credits. It also specifies the fixed conversion rate and the intended purpose, which clearly distinguishes it from any sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and how-to-use guidance: it states the subscription/free-trial requirement, explains the confirm=true prerequisite for actually performing the conversion, and gives the website_id condition for multi-website accounts. This leaves little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_hosted_blogCreate hosted blogAInspect
Creates the hosted blog: a blog served by BlogSEO on a subdomain of the user's domain (blog. by default) over HTTPS, with a sitemap, an RSS feed, Open Graph images, structured data and the website's branding. Returns the CNAME record to add at the DNS provider; nothing is live until DNS points to the target, so call get_hosted_blog_status afterwards. Subdomains only (no apex domain), one hosted blog per organization, and not next to a CMS integration such as WordPress or Shopify. Every generated article is published automatically once connected. Free. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| hostname | No | Subdomain for the blog, e.g. blog.example.com. Defaults to blog.<website domain>. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| blog_url | Yes | |
| hostname | Yes | Subdomain serving the blog. |
| config_id | Yes | |
| next_step | Yes | What to do next for the current status: records to add, DNS and SSL wait times, or the article URL pattern once connected. |
| registrar | Yes | |
| created_at | Yes | |
| last_error | Yes | |
| updated_at | Yes | |
| website_id | Yes | |
| dns_records | Yes | Records still to add at the DNS provider. |
| is_connected | Yes | true once DNS resolves and the certificate is issued. |
| status_label | Yes | |
| dashboard_url | Yes | |
| dns_verified_at | Yes | |
| registrar_warning | Yes | Instruction specific to the detected DNS provider to follow when adding the records; null when none applies. |
| ssl_provisioned_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic write/open-world profile; the description adds the operationally critical behavior that nothing is live until DNS points at the target, that a CNAME record is returned, that articles publish automatically once connected, and that the feature is free. It also discloses the side-effect semantics an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded and every clause carries functional information (constraints, return value, follow-up tool, cost). It is delivered as one dense run-on paragraph rather than being chunked, which slightly hurts scannability but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with an output schema, the description covers everything an agent needs: constraints, prerequisite-free call, DNS dependency, follow-up status check, and multi-website disambiguation. Return-value detail is rightly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents the hostname default (blog.<website domain>) and the website_id behavior including the get_account reference. The description mostly restates that guidance, adding no new syntax or format details, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (creates) and a precisely defined resource (a hosted blog served by BlogSEO on a subdomain, with sitemap/RSS/OG/structured data). It is unmistakably distinct from siblings like get_hosted_blog_status or sync_article_to_cms, and even explains the mechanism (HTTPS subdomain hosting).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives preconditions and exclusions: subdomains only, one hosted blog per organization, not alongside a CMS integration like WordPress or Shopify, and pass website_id when the account has multiple websites (routing to get_account). It also names the required follow-up tool, get_hosted_blog_status, after the call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_image_uploadCreate an image uploadAInspect
Prepares the upload of an image file from the user's machine, for set_article_cover_image or upload_article_image when the image has no public URL. Returns an upload_url to send the file to with an HTTP PUT (a ready-to-run curl command is included) and the upload_id to pass to those tools afterwards. Accepts JPEG, PNG, WebP, GIF and AVIF up to 10 MB. The upload_url expires after 2 hours; an uploaded file is deleted as soon as it is used, or after 6 hours if it is not; at most 10 unused uploads per connection. Free. Not needed for images that already have a public URL: pass image_url directly.
| Name | Required | Description | Default |
|---|---|---|---|
| file_name | Yes | Name of the file on the user's machine, for example cover.jpg. It becomes the hosted file name. | |
| content_type | Yes | MIME type of the file. |
Output Schema
| Name | Required | Description |
|---|---|---|
| command | Yes | Ready-to-run curl command; replace the file name with the file's path. |
| max_bytes | Yes | |
| upload_id | Yes | |
| expires_at | Yes | |
| upload_url | Yes | Send the file here with an HTTP PUT within 2 hours. |
| content_type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are sparse and only indicate readOnly/idempotent/destructive hints, so the description carries the behavioral burden. It discloses the upload_url expiry, deletion policy, unused-upload quota, file size limit, supported formats, and cost, which is rich and useful behavior beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense, with the primary purpose and sibling relationship front-loaded before operational details. Every sentence adds a distinct piece of information: purpose, return values, format/size, expiry/lifecycle, quota, cost, and alternative path.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be elaborated. The description covers the full lifecycle, constraints, alternatives, and edge cases, making the tool callable without additional investigation. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters already have clear descriptions and an enum for content_type. The description adds useful context like the 10 MB limit and the fact that file_name becomes the hosted file name, but this is mostly reinforcing rather than deeply extending the schema semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it 'prepares the upload of an image file' and explicitly connects it to set_article_cover_image and upload_article_image. It clearly distinguishes when this tool is needed versus when it is not, which separates it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: use it when an image has no public URL and you need to pass it to set_article_cover_image or upload_article_image. It also names the alternative explicitly ('pass image_url directly') when a URL already exists, so an agent knows exactly when to avoid this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_keywordsDelete keywordsADestructiveInspect
Permanently deletes keywords from the website. Refused when any of them already has a generated article. Pending scheduled articles that targeted a deleted keyword are kept and their ids returned so their headlines can be regenerated. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| keyword_ids | Yes | Keywords to delete (1 to 200). |
Output Schema
| Name | Required | Description |
|---|---|---|
| website_id | Yes | Website the result belongs to. |
| deleted_count | Yes | |
| affected_scheduled_article_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond destructiveHint=true, it reveals irreversibility ('permanently'), the refusal guard for keywords with generated articles, and a nontrivial side effect: scheduled articles targeting deleted keywords are kept and their ids returned for headline regeneration. This is meaningful behavioral context absent from structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying information: the destructive action, the refusal condition, the side effect on scheduled articles, and the website_id guidance. It is front-loaded and has no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given annotations, a full input schema, and an output schema, the description covers the key operational details an agent needs: what gets deleted, when the call is rejected, and what happens to scheduled articles. No critical calling behavior is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds only a slight reminder to pass website_id in multi-website accounts, mirroring the schema's own note, and provides no additional meaning for keyword_ids beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Permanently deletes keywords from the website,' a specific verb+resource action that clearly separates it from siblings like add_keywords and delete_scheduled_article. The scope and irreversibility are explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to pass website_id ('when the account has several websites') and gives an explicit when-not condition: the call is refused if any keyword already has a generated article. It does not explicitly name alternative tools for those blocked cases, so it stops just short of perfect routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_scheduled_articleRemove a scheduled article from the calendarADestructiveIdempotentInspect
Unschedules an article: removes a pending article from the content calendar. Irreversible. Refuses rows that were already generated (use the articles tools to archive those). Nothing is refunded because scheduling never charged anything. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| scheduled_article_id | Yes | Scheduled article id from list_scheduled_articles. |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | Always true. |
| headline | Yes | |
| scheduled_at | Yes | |
| scheduled_article_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and idempotentHint=true, but the description adds beyond those: it clarifies irreversibility, that rows already generated are refused, and that no refund occurs because scheduling never charged anything. These are valuable behavioral details not covered by annotations. The only minor gap is not detailing the exact response on success or failure, but that is covered by the output schema. No contradiction found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each with a distinct purpose: action, irreversibility, edge case (generated rows), and guidance on website_id. It is concise and front-loaded with the primary action verb. The only minor inefficiency is repeating the 'scheduling' context in the refund sentence, but it's still useful. Overall, it's well-structured and earns a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a destructive, irreversible operation with an output schema and full parameter coverage, the description covers all essential aspects: what it does, limits (only pending articles), irreversibility, refund policy, and the conditional parameter. It could mention what happens on attempting to delete a non-existent ID, but the output schema likely covers that. It is complete enough for an agent to call correctly, earning a 4.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are described in the schema: 'scheduled_article_id' from list_scheduled_articles and 'website_id' from get_account. The description adds the crucial conditional logic for 'website_id' (required when multiple websites) and clarifies that 'scheduled_article_id' is for a pending article, but these are mostly redundant with the schema. The description does not add format or syntax details beyond what the schema provides, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear verb ('Unschedules an article') and specifies the resource ('a pending article from the content calendar'). It clearly distinguishes from 'reschedule_article' (which would reschedule) and 'update_scheduled_article' (which edits rather than deletes), and it explicitly contrasts with 'generate' and 'archive' operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: 'removes a pending article from the content calendar', and when not to: 'Refuses rows that were already generated (use the articles tools to archive those)'. It also provides a conditional instruction ('Pass website_id when the account has several websites') and references 'get_account' for context. This is comprehensive and leaves no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_article_with_aiEdit article with AIADestructiveInspect
Rewrites an article's body with AI following your instructions (tone, length, add a section, fix facts...) and saves it. Targets the default-language version unless locale is given; also_apply_to_locales runs the same instructions on extra translations, one credit each. Synchronous and slow: the call takes one to several minutes, wait for it instead of retrying. Editing an article that is already published (or published in draft) marks it Out of Sync until it is synced with sync_article_to_cms or published again. Only locales that were actually rewritten are charged. Use batch_edit_articles_with_ai for many articles, and the update_* tools for headline, meta description or slug. Costs AI brain credits (see the cost rule above), charged after the work, not refunded on failure. Requires an active subscription or free trial. Pass confirm=true to acknowledge the AI brain credits charge; without it the tool only returns the cost and your balance. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Translation locale (e.g. "fr") to target instead of the default-language article. | |
| confirm | No | Set to true to acknowledge the AI brain credit charge. Omit it to only get the cost and your balance. | |
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| instructions | Yes | What to change in the article. | |
| also_apply_to_locales | No | Extra translation locales to rewrite with the same instructions (one credit each). |
Output Schema
| Name | Required | Description |
|---|---|---|
| article_id | No | |
| edited_locales | No | Locales that were rewritten and charged. |
| failed_locales | No | |
| credits_balance | No | Current AI brain credits balance; only with requires_confirmation. |
| credits_charged | No | |
| credits_required | No | AI brain credits the call would charge; only with requires_confirmation. |
| credits_balance_after | No | AI brain credits balance after this call. |
| requires_confirmation | No | Present when the tool did not run: it needs confirm=true. The other fields are then absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond annotations by disclosing synchronous slow execution ('one to several minutes, wait for it instead of retrying'), the Out of Sync side effect and remedy, credit charging and refund policy, subscription requirement, and the cost-estimate behavior when confirm is omitted. The destructiveHint is consistent with these details; no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place. It front-loads the core action and then methodically covers timing, side effects, costs, prerequisites, and parameter conditions without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a slow, destructive, credit-charging AI editing tool with 6 parameters, the description covers all critical operational aspects: duration, charging behavior, side effects, prerequisites, and parameter usage. An agent has everything needed to invoke it safely and correctly; the output schema handles return-value specifics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description adds essential semantics: locale target selection, per-locale credits for also_apply_to_locales, confirm's dual role (acknowledge vs. cost-only response), and website_id's condition. It also clarifies instructions with concrete examples ('tone, length, add a section, fix facts...').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Rewrites an article's body with AI... and saves it.' The description also names sibling alternatives (batch_edit_articles_with_ai, update_* tools), so an agent can immediately distinguish this tool from related ones.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives when-to-use and when-not-to-use guidance: 'Use batch_edit_articles_with_ai for many articles, and the update_* tools for headline, meta description or slug.' Also explains when to pass confirm, website_id, and locale, making invocation decisions clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expand_keyword_clusterExpand keyword clusterAInspect
Grows the topic cluster of a keyword: fetches related ideas from the search-volume provider seeded with up to 5 cluster members, keeps only ideas semantically close to the cluster (drops near-duplicates, navigational and other-city keywords) and adds at most 30 of them to the cluster. A keyword without a cluster becomes the pillar of a new one. The credit is refunded only when the provider fails, not when zero ideas pass the filters. Costs 1 AI brain credit, charged before the work, refunded if the provider fails. Requires an active subscription or free trial. Pass confirm=true to acknowledge the AI brain credits charge; without it the tool only returns the cost and your balance. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Set to true to acknowledge the AI brain credit charge. Omit it to only get the cost and your balance. | |
| keyword_id | Yes | Keyword id from list_keywords. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | |
| website_id | No | Website the result belongs to. |
| added_count | No | |
| credits_balance | No | Current AI brain credits balance; only with requires_confirmation. |
| credits_required | No | AI brain credits the call would charge; only with requires_confirmation. |
| filtered_out_count | No | |
| credits_balance_after | No | AI brain credits balance after this call. |
| requires_confirmation | No | Present when the tool did not run: it needs confirm=true. The other fields are then absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses non-obvious behavior beyond annotations: credit is charged upfront and refunded only on provider failure, zero qualifying ideas still consume the credit, near-duplicates/navigational/other-city keywords are dropped, and a keyword without a cluster becomes the pillar of a new one. This is far richer than the annotations alone and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries necessary operational detail: main behavior first, then credit mechanics, confirmation requirement, and website_id condition. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with cost implications, the description covers prerequisites, confirmation behavior, refund policy, filtering logic, and parameter conditions. Combined with 100% schema coverage and the presence of an output schema, nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description mostly restates what the schema already says about confirm, keyword_id, and website_id, though it does add the multi-website condition nuance. It does not materially exceed the schema's parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Grows the topic cluster of a keyword' and explains the concrete behavior (fetches related ideas, filters for semantic closeness, adds at most 30). This clearly differentiates it from sibling tools like research_keywords or add_keywords, which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational context: confirm=true is required to acknowledge the credit charge, without it only the cost and balance are returned, and website_id is needed for multi-website accounts. It does not explicitly mention when to prefer this tool over alternatives, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_keyword_cannibalizationFind keyword cannibalizationARead-onlyIdempotentInspect
Finds tracked keywords for which two of the site's own pages will compete. This is BlogSEO's definition, not Search Console's "two URLs for one query" (Search Console gives one top page per keyword): a keyword is cannibalized when the page Google already ranks for it is not the landing page and is either a blog article (any position) or another page ranking within the website's cannibalization_max_position (top 30 by default), AND a BlogSEO article targets that same keyword without being the ranking page (with include_planned, a still-scheduled article counts too). Scans the Google keywords of the default locale that have a Search Console ranking page; snapshots older than 30 days are ignored, so it needs a recent sync. Returns up to top keywords (max 200), best position first, each with the ranking URL and its kind (blog_article or other_page), ranking_article_id when the ranking page is a BlogSEO article, the competing articles (article_id, headline, slug, status, live url when known; status scheduled means article_id is a scheduled_article_id) and a deterministic suggestion with its reason: consolidate when a published article competes with a ranking blog article, differentiate otherwise (for a planned article: rewrite its brief or drop the plan). Tells you when Search Console is not connected instead of returning nothing silently. Not a rank tracker: use get_keyword_rankings for positions and get_keyword for one keyword's articles. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | How many cannibalized keywords to return, best position first. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| include_planned | No | Also flag keywords whose competing article is still scheduled and not generated yet. |
Output Schema
| Name | Required | Description |
|---|---|---|
| counts | Yes | |
| locale | Yes | |
| gsc_status | Yes | |
| website_id | Yes | Website the result belongs to. |
| gsc_fix_url | No | Where to connect Search Console; only present when it is not connected. |
| gsc_connected | Yes | Whether Google Search Console is connected for the website. |
| gsc_data_stale | Yes | Search Console data older than 30 days or never synced. |
| include_planned | Yes | |
| gsc_last_synced_at | Yes | |
| cannibalized_keywords | Yes | |
| cannibalization_max_position | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already declare readOnlyHint, idempotentHint, and destructiveHint, the description adds substantial behavioral detail: the exact cannibalization algorithm, the maximum of 200 keywords, the deterministic suggestion logic, the prerequisite of a recent sync, and the non-silent handling of a missing Search Console connection. This goes well beyond the annotations and helps the agent predict side effects and edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely informative; every part relates to correct invocation or interpretation. It front-loads the core purpose before elaborating on the algorithm, output fields, prerequisites, and alternatives. It could be slightly more scannable with structural breaks, but it avoids fluff and repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with this complexity, the description covers prerequisites, input semantics, output shape, edge cases, and alternatives. It even explains the meaning of different suggestion reasons and how scheduled articles are represented. The presence of an output schema helps, but the description still independently supplies enough context for an agent to invoke and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each parameter already documented. The description adds marginal context by explaining include_planned's effect and the website_id requirement for multi-website accounts, but most of this is a paraphrase of the schema. The added 'best position first' ordering note is useful but not substantial enough to push above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific action: 'Finds tracked keywords for which two of the site's own pages will compete.' It defines the resource (tracked keywords) and the exact outcome, and it explicitly differentiates from Search Console's definition and from sibling tools like get_keyword_rankings. There is no ambiguity about what this tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states concrete when-to-use conditions: it requires a recent Search Console sync, ignores snapshots older than 30 days, and returns a message when Search Console is not connected. It also names alternatives explicitly: 'Not a rank tracker: use get_keyword_rankings for positions and get_keyword for one keyword's articles.' This gives the agent clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountGet accountARead-onlyIdempotentInspect
Recommended first call. Returns the signed-in user's email and every website this connection may use (the websites chosen on the consent screen, or all of them when none were excluded), each with its website_id (needed by the other tools when the account has several websites), the user's role on it (owner or admin: websites where the user is only a member are never available over MCP and are not listed), its credit balances (AI brain credits for AI features, article credits for generation, backlink credits) and its plan (subscription status, whether it is active, period end, billing interval, articles per month, whether the current user is the payer). Credits cannot be bought through this server: send the user to buy_credits_url.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| Yes | ||
| websites | Yes | Websites this connection may use. |
| buy_credits_url | Yes | |
| member_only_organizations | Yes | Organizations where the user is only a member; their websites are not available over MCP. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already mark it read-only and idempotent, the description adds substantial behavioral context: websites where the user is only a member are never available over MCP and not listed, credits cannot be bought through this server, and the return includes credit balances and subscription details. This goes well beyond the annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single long sentence but it is dense and information-rich, starting with 'Recommended first call' and systematically covering websites, roles, credits, and plan. It could be split for easier scanning, but no sentence or clause is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters, strong annotations, and an output schema present, the description is complete. It explains the return semantics, the website_id dependency for other tools, and the credit purchase limitation, giving the agent everything needed to decide when and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter-level semantics to explain. The description appropriately focuses on what the response contains, which is the relevant semantic content for a no-input tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it 'Returns the signed-in user's email and every website this connection may use' with detailed fields. It explicitly positions itself as the 'Recommended first call,' differentiating it from account-related siblings like get_credit_balance and get_website_settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: it is 'Recommended first call' and explains that website_id is 'needed by the other tools' when multiple websites exist. It does not name specific sibling alternatives or state when not to use it, but the first-call guidance effectively signals when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_advanced_seo_reportGet advanced SEO reportARead-onlyIdempotentInspect
Reads the stored competitor-relative SEO analysis of an article (default-language version). status is none (never run), pending or processing (poll again in a minute), failed (error included, credit refunded) or done. A done report carries the competitor-relative score, summary, coverage gaps (with resolved flags from later re-checks), strengths, prioritized recommendations (with applied flags), the competitor terms and whether the article uses them, the target word count and the benchmarked competitor pages. is_stale is true when the article body changed since the analysis without being re-verified. Free and instant. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | Yes | |
| status | Yes | none: never run; pending/processing: poll again; failed; done. |
| summary | Yes | |
| is_stale | Yes | The article changed since the analysis. |
| strengths | Yes | |
| article_id | Yes | |
| checked_at | Yes | |
| website_id | Yes | |
| competitors | Yes | |
| coverage_gaps | Yes | |
| advanced_score | Yes | Competitor-relative score, 0-100. |
| recommendations | Yes | |
| target_word_count | Yes | Median length of the ranking pages. |
| recommended_keywords | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: the status lifecycle, the is_stale flag meaning the article body changed without re-verification, and the fact that it is 'Free and instant.' It does not describe pagination or exact return shape, but the output schema exists and the status semantics are well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: it front-loads the core purpose, then enumerates statuses, then report contents, then the staleness flag, then cost and the website_id condition. Every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only retrieval tool with a rich output schema, the description covers the status lifecycle, staleness semantics, cost, and the conditional parameter. The only minor omission is an explicit note that the report is for the default-language version, which is actually included. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters with source references (article_id from list_articles, website_id from get_account). The description adds the conditional rule for website_id ('when the account has several websites'), which is useful, but it does not add much beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Reads the stored competitor-relative SEO analysis of an article (default-language version).' It clearly distinguishes this from running a new analysis (siblings run_advanced_seo_check, run_advanced_seo_check_for_content) by emphasizing 'stored' and 'status' states. The scope is precise and an agent can tell it apart from check_article_seo_score and check_seo_score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit status-based guidance: 'pending or processing (poll again in a minute), failed (error included, credit refunded) or done.' It also states when to pass website_id: 'Pass website_id when the account has several websites (see get_account).' This is clear when-to-use guidance with a pointer to a sibling for context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ai_visibilityGet AI visibilityARead-onlyIdempotentInspect
Reads the AI Visibility dashboard of the website: how often AI assistants (ChatGPT, Claude, Gemini, Perplexity, Copilot, Google AI Overview and AI Mode, plus Grok and Mistral when the website pays for them) mention and cite the brand when answering its tracked prompts. For the range (7d, 30d, 3m or 6m, default 30d) it returns the overall mention rate and cited rate with the number of prompts and answers checked; the same per platform (only platforms with checks in the range); the trend (mention rate over the first half of the range vs the second half); the leaderboard of the brand (is_own) and its tracked competitors by mention rate; each prompt with its latest state per platform from the last 21 days of checks (mentioned_cited, mentioned, not_mentioned, or pending while a check is queued, running or failed), its mention rate across those latest checks and the competitor mentioned most for it; the most cited domains and the brand's own cited pages; and the sentiment drivers (strengths and weaknesses AI answers express about the brand) once enough brand-mentioning answers exist. Pass surface to restrict every number to one platform and include_answers=true for the latest answer text per prompt (600 characters max). Rates are percentages, null when nothing was checked. Fails with an activation link when the AI Visibility add-on is not active. Read-only: it cannot add prompts or competitors, and it is not Google Search Console data (use get_keyword_rankings for that). Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Period to report: 7d, 30d, 3m (90 days) or 6m (182 days). | 30d |
| surface | No | Restrict every number to one AI platform. Omit for all the platforms the website tracks. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| include_answers | No | Add the latest AI answer per prompt, truncated to 600 characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | Yes | |
| range | Yes | |
| trend | Yes | |
| overall | Yes | |
| prompts | Yes | |
| surface | Yes | Platform the numbers are restricted to; null for all. |
| citations | Yes | |
| website_id | Yes | Website the result belongs to. |
| competitors | Yes | Leaderboard by mention rate, the brand included. |
| per_surface | Yes | |
| recommendations | Yes | Sentiment drivers; null until enough brand-mentioning answers exist. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though readOnlyHint, idempotentHint, and destructiveHint are already provided, the description adds meaningful behavioral detail: rates are percentages, null when nothing was checked, pending states during checks, and a failure mode with an activation link when the add-on is not active. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely packed with non-redundant information: purpose, outputs, parameter behaviors, failure conditions, read-only nature, and sibling distinction. Every sentence carries useful operational meaning, and the main purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex with four optional parameters and a rich output, yet the description covers all relevant behaviors, defaults, failure modes, and parameter effects. It also handles the multi-website case by referencing get_account. Nothing an agent needs to decide whether and how to call the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented. The description adds value by explaining the effect of parameters on the output, e.g., 'Pass surface to restrict every number to one platform' and 'include_answers=true for the latest answer text per prompt.' This provides semantic context beyond the bare schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Reads the AI Visibility dashboard of the website: how often AI assistants... mention and cite the brand.' It clearly states what data is returned and distinguishes itself from siblings, notably saying it is not Google Search Console data and pointing to get_keyword_rankings for that.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes explicit usage guidance: when to pass surface, include_answers, and website_id, and that the tool cannot add prompts or competitors. It explicitly routes the user to get_keyword_rankings for Google Search Console data, making the when-not-to-use case clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_articleGet articleARead-onlyIdempotentInspect
Returns one article: headline, slug, status, target keyword, meta description, cover image and its alt text (main_image_alt, shared by every locale), dashboard URL and the list of its translations. Set include_content=true to also get the markdown body (can be long). Pass locale to read a translation instead of the default-language version; the base status and slug are shared by every locale. Never contacts the CMS. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Translation locale (e.g. "fr") to target instead of the default-language article. | |
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| include_content | No | Also return the article body as markdown. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| locale | Yes | Locale of the returned version; null for the default language. |
| status | Yes | Raw status; status_label is the human reading. |
| excerpt | Yes | |
| headline | Yes | |
| is_on_cms | Yes | true once the article exists on a connected CMS. |
| article_id | Yes | |
| created_at | Yes | |
| website_id | Yes | |
| preview_text | Yes | First 200 characters of the body. |
| published_at | Yes | |
| status_label | Yes | Status as shown in the app, e.g. Published, Draft on CMS, Failed to publish. |
| translations | Yes | |
| dashboard_url | Yes | Article page in the app. |
| default_locale | Yes | |
| is_out_of_sync | Yes | Edited since the last push to the CMS; sync_article_to_cms clears it. |
| main_image_alt | Yes | Cover alt text, shared by every locale. |
| main_image_url | Yes | Cover image URL. |
| target_keyword | Yes | |
| last_updated_at | Yes | |
| includes_content | Yes | true when markdown_content holds the body. |
| markdown_content | Yes | The article body in markdown when include_content=true, null otherwise. |
| meta_description | Yes | |
| target_keyword_id | Yes | |
| main_image_description | Yes | Brief the cover image was generated from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so the bar is lowered, yet the description adds real value: "Never contacts the CMS" clarifies the data source, and the warning that the content body "can be long" prepares the agent for payload size. It also notes the sharing semantics of status/slug across locales.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return contents, then the optional-parameter guidance, with no filler sentences. The field enumeration and locale/cross-locale notes make it somewhat dense, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, yet the description covers the locale fallback, the multi-website disambiguation via website_id, and the content-size caveat. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: main_image_alt and the base status/slug are shared by every locale, and include_content can yield a long body. That sharing behavior is not captured in the parameter descriptions themselves.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Returns one article") and enumerates the returned fields, which lets an agent distinguish it from list_articles without opening the schema. The scope is single-article retrieval, clearly separated from the sibling list/batch tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditions for the optional parameters: include_content for the markdown body, locale to read a translation, website_id when the account has several websites, plus a pointer to get_account. It does not name a competing alternative tool directly, but the context needed to invoke it correctly is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_backlinks_overviewGet backlinks overviewARead-onlyIdempotentInspect
Returns the website's backlink exchange status: current Domain Rating, backlink credit balance, counts of backlinks received by status (queued, placed, verified, lost) and the last 20 received backlinks with the linking site, anchor and target page. Use it to report on link building progress; backlinks are matched automatically by the exchange network, there is nothing to trigger. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| received | Yes | Backlinks received through the exchange, by status. |
| website_id | Yes | |
| domain_rating | Yes | Ahrefs Domain Rating of the website. |
| recent_received | Yes | |
| backlink_credits | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false; the description adds that backlinks are matched automatically and there is nothing to trigger, setting the expectation that this tool performs no action. It also discloses a bounded result of the last 20 backlinks. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: return payload, usage context, and parameter condition. The most important information is front-loaded with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values, the single optional input parameter is well documented, and annotations cover safety. The description adds usage context and parameter guidance, so nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents website_id as optional and sourced from get_account. The description reinforces when to pass it (accounts with several websites), but this is essentially the same information, so with 100% schema coverage the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool returns the website's backlink exchange status and enumerates the exact contents: Domain Rating, credit balance, status counts, and last 20 backlinks with linking site, anchor, and target page. It does not explicitly differentiate itself from sibling tools like check_backlinks, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a direct use case: report on link building progress, and notes that backlinks are matched automatically with nothing to trigger, telling an agent this is a passive read rather than an action. It does not mention when to prefer sibling tools such as check_backlinks, so no exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_credit_balanceGet credit balanceARead-onlyIdempotentInspect
Returns the website's current credit balances: ai_brain_credits (spent by AI edits, keyword research, image previews and SEO checks), articles_credit (one per generated article), backlink_credits, plus has_active_subscription. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| articles_credit | Yes | Article credits, one per generated article. |
| ai_brain_credits | Yes | AI brain credits, spent by AI edits, keyword research and SEO checks. |
| backlink_credits | Yes | Backlink credits for the backlink exchange. |
| has_active_subscription | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is fully covered. The description adds meaningful context about what the returned credits mean and confirms this is a current-state read. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main result is front-loaded in a single focused sentence, with compact parenthetical definitions for the fields and a direct parameter condition. Every phrase earns its place; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one optional parameter, a full output schema, and strong read-only/idempotent annotations, the description provides everything an agent needs to select and invoke the tool correctly. It covers field semantics and the only parameter condition without requiring extra context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents website_id with 100% coverage, including that it comes from get_account and is optional for single-website accounts. The description restates this guidance ('Pass website_id when the account has several websites') without adding new format, constraints, or defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Returns') and a clear resource ('the website's current credit balances'), and it enumerates the exact fields returned: ai_brain_credits, articles_credit, backlink_credits, and has_active_subscription. This makes the tool's purpose unambiguous and distinguishes it from all sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for invocation by stating when to pass website_id ('when the account has several websites') and directs the agent to get_account for the id. It does not explicitly contrast alternatives, but no sibling tool appears to perform the same credit-balance lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hosted_blog_statusGet hosted blog statusAIdempotentInspect
Re-checks the hosted blog's DNS and certificate like the Refresh status button and returns the current status (Waiting for DNS propagation, Issuing SSL certificate, Ownership verification needed, DNS misconfigured, CAA blocked, Connected...), the DNS records still to add (the CNAME plus any TXT ownership record), the last error and the detected DNS provider with a link to its settings. Poll it every few minutes after adding the record; DNS changes take 5 to 60 minutes. Limited to 30 checks per hour. Free. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| blog_url | Yes | |
| hostname | Yes | Subdomain serving the blog. |
| config_id | Yes | |
| next_step | Yes | What to do next for the current status: records to add, DNS and SSL wait times, or the article URL pattern once connected. |
| registrar | Yes | |
| created_at | Yes | |
| last_error | Yes | |
| updated_at | Yes | |
| website_id | Yes | |
| dns_records | Yes | Records still to add at the DNS provider. |
| is_connected | Yes | true once DNS resolves and the certificate is issued. |
| status_label | Yes | |
| dashboard_url | Yes | |
| dns_verified_at | Yes | |
| registrar_warning | Yes | Instruction specific to the detected DNS provider to follow when adding the records; null when none applies. |
| ssl_provisioned_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: it triggers a re-check like the Refresh status button (explaining why readOnlyHint is false despite being a 'get'), enforces a 30-checks-per-hour rate limit, is free, and has a 5-60 minute propagation window. This is exactly the side-effect, quota, and timing disclosure an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The paragraph is front-loaded with the action and its result, then layers operational details (timing, rate limit, param guidance). It is dense and largely earns its length, though the long parenthetical status list borders on redundant given the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A complete picture for a single-optional-param status tool: it covers behavior, timing, limits, and cost, and an output schema handles return-value structure. Only auth/permission prerequisites are unstated, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds routing guidance not present in the schema: pass website_id when the account has several websites and consult get_account to obtain it. That meaningfully improves correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (re-check the hosted blog's DNS and certificate) and precisely enumerates what it returns, including concrete status strings. An agent can distinguish it from create_hosted_blog or get_website_setup_guide without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit operational guidance: poll every few minutes after adding the record, DNS changes take 5-60 minutes, and pass website_id when the account has multiple sites (pointing to get_account). It lacks an explicit 'when not to use' or named alternative for checking status, keeping it just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_keywordGet keywordARead-onlyIdempotentInspect
Returns one keyword with its metrics, the last 90 days of Google Search Console position history (per day and country), the scheduled and generated articles targeting it, and up to 20 sibling keywords of the same topic cluster. Position history is empty when Google Search Console is not connected. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| keyword_id | Yes | Keyword id from list_keywords. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| keyword | Yes | |
| website_id | Yes | Website the result belongs to. |
| cluster_siblings | Yes | |
| position_history | Yes | Daily Search Console positions, per country. |
| generated_articles | Yes | |
| scheduled_articles | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds meaningful behavioral context beyond those hints: the 90-day per-day/per-country history, the up-to-20 sibling keyword limit, the inclusion of scheduled and generated articles, and the empty-history edge case when GSC is disconnected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the return payload, the important edge case, and the conditional parameter guidance. The most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-keyword retrieval tool with a read-only annotation and an output schema, the description is complete. It covers what is returned, the limit on sibling keywords, the GSC dependency, and the parameter condition the agent needs to make a correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already describes both parameters. The description adds a practical condition for website_id ('Pass website_id when the account has several websites') and references get_account, giving the agent actionable selection logic beyond the schema's static descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Returns one keyword with its metrics...' It clearly enumerates the exact payload components (metrics, 90-day position history, articles, sibling keywords), which differentiates it from siblings like list_keywords, get_keyword_rankings, and get_keyword_trends.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear contextual usage guidance: it tells the agent when to pass website_id ('when the account has several websites') and warns when position history will be empty ('when Google Search Console is not connected'). It does not explicitly name alternatives or state when not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_keyword_rankingsGet keyword rankingsARead-onlyIdempotentInspect
Rank-tracking view from Google Search Console, covering the website's tracked keywords only and refreshed at the Search Console sync cadence (see gsc_last_synced_at): for each keyword the current average position, the page ranking for it, clicks, impressions, ctr (clicks / impressions), the country of that snapshot and the last sync time. Pass keyword_ids (max 50) or get the top N keywords (default 50, max 50). Filters run in the database: position_min and position_max bound the current position (unranked keywords are excluded when either is set), min_impressions drops low-visibility keywords, and sort orders by position (best first, unranked last, default), impressions or clicks (highest first). Page-2 quick wins: position_min 5, position_max 15, min_impressions 200, sort impressions. position_30d_ago is included when a history point exists around 30 days ago for the snapshot country (or the country you pass, lowercase alpha-3 like usa, or wwd). Not for changes over time: use get_keyword_trends for click, impression and position deltas between periods. Tells you when Google Search Console is not connected instead of returning empty positions silently. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | How many keywords to return when keyword_ids is omitted. | |
| sort | No | position: best first, unranked last; impressions or clicks: highest first. | position |
| country | No | Country of the Search Console rows to use, lowercase alpha-3 (usa, fra, ...) or wwd; defaults to each keyword's snapshot country. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| keyword_ids | No | Specific keywords to report; omit to get the best-ranking ones. | |
| position_max | No | Only keywords whose current position is at most this value; must be >= position_min. | |
| position_min | No | Only keywords whose current position is at least this value (1 = top of page 1). | |
| min_impressions | No | Only keywords with at least this many impressions in the current snapshot. |
Output Schema
| Name | Required | Description |
|---|---|---|
| locale | Yes | |
| rankings | Yes | |
| gsc_status | Yes | |
| website_id | Yes | Website the result belongs to. |
| gsc_fix_url | No | Where to connect Search Console; only present when it is not connected. |
| gsc_connected | Yes | Whether Google Search Console is connected for the website. |
| gsc_last_synced_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and non-destructive behavior, so the description's added value comes from extra context: data freshness follows the Search Console sync cadence with a reference to gsc_last_synced_at, unranked keywords are excluded when either position bound is set, the 30-day historical point is conditionally included, and the tool reports an unconnected GSC instead of returning empty positions. These are meaningful edge-case behaviors beyond the annotations and are not contradicted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: it opens with purpose, defines the data fields, explains filters and sort semantics, gives a ready-to-use query, names the alternative tool, and closes with connection-status and website_id guidance. The structure flows logically from what the tool returns to how to shape a request, and the density is appropriate for an 8-parameter read-only tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the presence of an output schema (which covers return-value details), and read-only annotations, the description covers the remaining operational context: data freshness, server-side filtering, historical data availability, alternative use cases, error behavior when GSC is disconnected, and the multi-website case. An agent has everything needed to select and call it correctly without further lookups.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already covers 100% of parameters with descriptions, the description layers on significant additional semantics: the unranked-exclusion behavior when position_min or position_max is set, the explicit CTR formula, the interpretation of country defaults to snapshot country or a lowercase alpha-3 code, and the practical example showing how to combine filters and sort. This goes beyond simple parameter documentation and materially improves correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a rank-tracking view from Google Search Console for the website's tracked keywords, stating exactly what is returned (current average position, page ranking, clicks, impressions, CTR, country, last sync time). It also differentiates from get_keyword_trends by explicitly stating it is not for changes over time, so an agent can correctly choose between siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance: 'Not for changes over time: use get_keyword_trends for click, impression and position deltas between periods.' It also gives a concrete recipe for a common use case ('Page-2 quick wins: position_min 5, position_max 15, min_impressions 200, sort impressions') and explains when website_id is required, which is actionable and leaves little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_keyword_trendsGet keyword trendsARead-onlyIdempotentInspect
Google Search Console trend view for the website's tracked keywords, refreshed at the Search Console sync cadence: compares the last window_days (7, 28 or 90, default 28) with the window_days before it. Per keyword: clicks, impressions and impression-weighted average position in both windows plus the deltas (current minus previous), and the page currently ranking for it. by_page groups the clicks and impressions of every keyword with data by that page, most decayed first (clicks_delta ascending), so it answers which pages are losing traffic. Pass keyword_ids (max 200) or let it consider every keyword with history; rows are sorted by clicks_lost (default), clicks_gained, position_lost or position_gained and cut to top (default 50, max 200). by_page is computed before the cut. Rows use each keyword's snapshot country, or the country you pass (lowercase alpha-3 like usa, or wwd). Keywords without history in either window are omitted; a position is null when its window has no impressions. Search Console data lags 2 to 3 days, so the newest days of the current window are usually missing. Not for the current position or ctr (use get_keyword_rankings) nor volume and difficulty (use list_keywords). Tells you when Google Search Console is not connected instead of returning empty rows silently. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | How many rows to return after sorting. | |
| sort | No | clicks_lost: biggest click drop first; position_lost: biggest position increase (worse) first. | clicks_lost |
| country | No | Country of the Search Console rows to use, lowercase alpha-3 (usa, fra, ...) or wwd; defaults to each keyword's snapshot country. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| keyword_ids | No | Specific keywords to compare; omit to consider every keyword with Search Console history. | |
| window_days | No | Length in days of each compared window: 7, 28 or 90. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sort | Yes | |
| locale | Yes | |
| trends | Yes | |
| by_page | Yes | Per ranking page, most decayed first. |
| gsc_status | Yes | |
| website_id | Yes | Website the result belongs to. |
| gsc_fix_url | No | Where to connect Search Console; only present when it is not connected. |
| window_days | Yes | |
| gsc_connected | Yes | Whether Google Search Console is connected for the website. |
| current_window | Yes | |
| previous_window | Yes | |
| gsc_last_synced_at | Yes | |
| keywords_with_data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent, and the description adds substantial behavioral context beyond that: it explains the 2–3 day data lag, that keywords without history are omitted, that position is null when a window has no impressions, that by_page is computed before the top cut, and that it surfaces a 'not connected' state instead of silently returning empty rows. This is exactly the kind of non-obvious behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense, with every sentence contributing a distinct fact: comparison windows, metrics, grouping, sorting, defaults, country handling, data lag, exclusions, and error behavior. It is front-loaded with the core purpose before covering parameter behavior and use boundaries.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the presence of an output schema, and rich annotations, the description covers all expected context: window semantics, defaults, exclusions, data freshness, edge cases for missing impressions, and alternative tools. An agent can select and invoke this tool correctly without additional documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema has 100% parameter description coverage, the tool description adds operational meaning beyond the schema: sort options map to concrete meanings, default country behavior falls back to each keyword's snapshot country, by_page is applied before the top cut, and keyword_ids max 200 can be omitted to include all tracked keywords. These details are not inferable from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (Google Search Console keyword trends) and a precise operation: comparing the last window_days against the prior window_days with per-keyword metrics and deltas. It also explicitly contrasts itself with get_keyword_rankings and list_keywords, so it is clearly distinguishable from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('answers which pages are losing traffic') and provides direct exclusions with named alternatives: 'Not for the current position or ctr (use get_keyword_rankings) nor volume and difficulty (use list_keywords).' It also clarifies the sync cadence and the Search Console connection failure behavior, leaving little ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_webhook_contractGet webhook contractARead-onlyIdempotentInspect
Returns the custom webhook contract an endpoint must implement to receive BlogSEO articles: request headers, the JSON payload with every field, multi-language delivery, republish and retry semantics, response and timeout rules, how to verify the shared secret and what the pages must render. Read it before writing or reviewing a webhook receiver. Free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| contract | Yes | The webhook contract as markdown. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds valuable context about what the contract contains (headers, payload, retry semantics, etc.) and that it's free, which is not in the annotations. However, it does not disclose any potential side effects (there are none) or rate limits, which are not critical given the read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense sentence that front-loads the core purpose and lists the contract components without fluff. It is efficient and earns its length, though it could be broken into two sentences for readability. The 'Free.' note is a minor addition. Overall, it is concise and structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, read-only documentation tool with an existing output schema (indicated by 'Has output schema: true'), the description is complete. It states when to use, what the contract covers, and the cost implication. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description does not need to explain parameters, and the schema coverage is 100% trivially. It does add context about the returned content, but that is not parameter semantics. Thus a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Returns') and a clear resource ('the custom webhook contract an endpoint must implement to receive BlogSEO articles'), listing the key elements (headers, payload, multi-language, retry semantics, secret verification, etc.). It clearly distinguishes this from sibling tools like connect_custom_webhook and test_custom_webhook by focusing on the specification of the contract.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs the agent to 'Read it before writing or reviewing a webhook receiver,' which is a clear when-to-use directive. It also notes the tool is free, removing any cost concern. No exclusion or alternative is necessary since this is the definitive source for the contract.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_website_settingsGet website settingsARead-onlyIdempotentInspect
Returns the website's configuration grouped as it appears in the app: info (read-only facts: base_url, blog_url, favicon, domain rating, detected CMS, articles per month, locales, brand logo URL), general (sitemap, auto-scheduling, publishing time), content (locale, audiences, offer summary, writing instructions), images (styles, brand color, image instructions, AI images vs media library) and competitors. Read it before calling an update_* tool so you only change what the user asked for. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| info | Yes | Read-only facts about the website. |
| images | Yes | |
| content | Yes | |
| general | Yes | |
| website_id | Yes | |
| competitors | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds value by detailing the exact structure of the returned object and noting that some fields are read-only facts, which helps the agent interpret data correctly. It does not mention any side effects or pagination, but for a settings getter with a small payload, this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no wasted words. The first sentence states purpose and enumerates content, the second gives usage guidance, and the third covers the parameter condition. The most critical information (purpose and usage) is front-loaded, and the grouping list is dense but useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a settings object with multiple nested groups), the description provides a complete enumeration of fields, making it self-sufficient for an agent to know what to expect. It also provides the necessary usage context (before updates) and parameter condition (multiple websites). With an output schema present, the description does not need to explain return format, and nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already states 'Website id from get_account. Optional when the account has a single website.' The description repeats this ('Pass website_id when the account has several websites') without adding new semantics. Since the schema fully documents the parameter, the description earns the baseline 3 without extra credit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Returns the website's configuration grouped as it appears in the app.' It then enumerates all configuration groups (info, general, content, images, competitors) with their key fields, making the tool's purpose unmistakable. It also implicitly distinguishes itself from the update_* siblings by instructing to read it before updates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool: 'Read it before calling an update_* tool so you only change what the user asked for.' This is a clear directive that positions the tool as a prerequisite for any mutation. It also gives conditional guidance for the parameter: 'Pass website_id when the account has several websites (see get_account),' referencing the correct sibling for context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_website_setup_guideGet website setup guideARead-onlyIdempotentInspect
Returns the guide to connect a custom-built website (Next.js, Astro, Rails, any framework or AI builder) so generated articles get published on it. Two options: a hosted blog on a subdomain of the user's domain (one CNAME record, no code) or a custom webhook received by an endpoint in the user's codebase. Call it first when the user asks to plug, connect or integrate their website, then follow its steps with the tools it names. Free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| guide | Yes | The setup guide as markdown. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds valuable behavioral context: it returns a guide (not performing the setup), notes it is free, and describes the two setup options. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences that front-load the purpose, list the options, and give clear next-step instruction. Every sentence earns its place with zero redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and no parameters, the description is fully sufficient for an agent to decide when to call this tool and what to expect. It even mentions the two branches of the guide and the follow-up tools, making it a complete entry-point definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and schema coverage is 100%, so the baseline for no parameters is 4. The description adds no parameter-specific details because none exist, but it effectively conveys the tool's purpose without needing parameter context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns a guide for connecting a custom-built website so articles get published, with specific frameworks mentioned. It distinguishes itself from action tools by being the guide that precedes them, and names the two options (hosted blog vs webhook) within the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call it first when the user asks to plug, connect or integrate a website, then follow its steps with the tools it names. This provides clear when-to-use guidance and implies alternatives (the actual setup tools) are used after following the guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
improve_article_seoImprove article SEO with AIADestructiveInspect
Rewrites the article body with AI to fix its failing on-page SEO checks, exactly like the Improve with AI button: the current score is computed (with the competitor benchmark when a done advanced analysis exists), the failing body-level checks, missing sub-keywords and open competitor gaps become the rewrite instructions, the article is rewritten and saved, then re-scored. Title, meta description, slug, links and images are never changed; use the update_* tools for those. Synchronous and slow: takes 1 to 3 minutes, wait for it instead of retrying. The body is replaced in place and the previous version is not kept. Fails without charging when nothing is left to improve. Pass locale to improve a translation. Editing a published article marks it Out of Sync until sync_article_to_cms is called. Returns previous_score, new_score and the instructions that were applied. Costs 1 AI brain credit, charged after the work, not refunded on failure. Requires an active subscription or free trial. Pass confirm=true to acknowledge the AI brain credits charge; without it the tool only returns the cost and your balance. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Translation locale (e.g. "fr") to score instead of the default-language article. | |
| confirm | No | Set to true to acknowledge the AI brain credit charge. Omit it to only get the cost and your balance. | |
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| locale | No | |
| new_score | No | |
| article_id | No | |
| website_id | No | Website the result belongs to. |
| previous_score | No | |
| credits_balance | No | Current AI brain credits balance; only with requires_confirmation. |
| credits_charged | No | |
| credits_required | No | AI brain credits the call would charge; only with requires_confirmation. |
| instructions_applied | No | |
| credits_balance_after | No | AI brain credits balance after this call. |
| requires_confirmation | No | Present when the tool did not run: it needs confirm=true. The other fields are then absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond annotations: it discloses the destructive nature (body replaced in place, previous version not kept), the 1-3 minute synchronous wait, the cost of 1 AI brain credit charged after work and not refunded, the 'Out of Sync' side effect for published articles, and the failure-without-charge behavior. It also states return values (previous_score, new_score, instructions). This is thorough and consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries necessary information. It is well-structured, starting with the main action, then exclusions, timing, destructive nature, side effects, returns, cost, confirm, and website_id. No redundancy; it earns its length given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters and significant behavioral caveats, the description covers all necessary aspects: purpose, process, exclusions, timing, destructive effects, side effects, costs, confirm requirement, locale handling, and return values. An agent has everything needed to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful context: locale is for translations, confirm must be true to proceed (otherwise only cost/balance returned), and website_id is optional for single-website accounts. This clarifies usage beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool rewrites the article body with AI to fix failing on-page SEO checks, and outlines the entire process (score, rewrite, re-score). It explicitly excludes title, meta description, slug, links, and images, and directs users to update_* tools for those, effectively differentiating from siblings like update_article_content or edit_article_with_ai.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance: use it for body-level SEO improvement, but use update_* tools for title/meta/etc. It also covers prerequisites (active subscription/trial), the need to pass confirm=true to acknowledge charges, and website_id for multi-website accounts. It notes the tool is slow and advises waiting rather than retrying.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
improve_content_seoImprove content SEOAInspect
Rewrites content you pass inline to fix its failing on-page SEO checks for target_keyword (keyword in introduction and subheadings, density, sub-keyword coverage, length, subheading distribution, FAQ, paragraph and sentence length) while keeping its topic, facts, tone, language, links and images. Returns the improved markdown verbatim with the score before and after. The content does not need to be in BlogSEO and nothing is saved: apply the result yourself, or use edit_article_with_ai for stored articles. Fails before charging when every body-level check already passes. Synchronous and slow: it takes 1 to 3 minutes, wait for it instead of retrying. Limited to 20 calls per hour per website. Costs 1 AI brain credit, charged after the work, not refunded on failure. Requires an active subscription or free trial. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Body of the content as markdown or plain text, 200 to 60,000 characters. | |
| headline | Yes | Title (H1) of the content. | |
| site_url | No | URL of the site the content lives on; its host tells internal and external links apart. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| target_keyword | Yes | Primary keyword the content should rank for. | |
| meta_description | No | Meta description, when there is one. | |
| extra_instructions | No | Extra instructions appended to the SEO fixes (tone, things to keep, wording to avoid). | |
| secondary_keywords | No | Secondary keywords the content should also cover (max 20). |
Output Schema
| Name | Required | Description |
|---|---|---|
| new_score | Yes | |
| website_id | Yes | Website the result belongs to. |
| previous_score | Yes | |
| credits_charged | Yes | |
| improved_markdown | Yes | The rewritten content, also returned as the text content. |
| credits_balance_after | No | AI brain credits balance after this call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses key behaviors: it is synchronous and slow (1-3 min, wait, don't retry), has a rate limit (20 calls/hour/website), costs 1 AI brain credit charged after work and not refunded on failure, requires subscription or trial, and preserves topic, facts, tone, language, links, and images. It also states the output format (improved markdown and score before/after). This fully informs the agent of side effects, latency, cost, and constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place. It opens with the core action and scope, then moves to output, usage, failure behavior, latency, rate limits, cost, auth, and a parameter hint, in a logical order. There is no fluff or repetition; it is a compact, well-structured paragraph that front-loads the most critical information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 params, output schema, multiple constraints), the description covers all necessary context: what it does, when to use it, how to handle the result, failure conditions, latency, rate limiting, cost, auth, and parameter specifics. Since an output schema exists, the description appropriately does not restate return structure but adds the score-before/after detail. Nothing an agent needs to correctly invoke this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides descriptions for all 8 parameters (100% coverage), so the baseline is 3. The description adds extra value by clarifying the inline nature of the content ('content you pass inline') and by giving specific guidance for website_id ('Pass website_id when the account has several websites (see get_account)'). It also explains the relationship of target_keyword to the checks. These additions lift it above the baseline, though not dramatically.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('rewrites'), a resource ('content you pass inline'), and the precise goal ('fix failing on-page SEO checks') while enumerating the checks (keyword in intro, subheadings, density, etc.). It distinguishes itself from the sibling edit_article_with_ai by explicitly noting it works on inline content and not stored articles, so an agent can immediately tell what it does and what it does not do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: it states that content does not need to be in BlogSEO, that nothing is saved, and that for stored articles one should use edit_article_with_ai. It also warns that the tool fails before charging when all body-level checks pass, preventing wasted calls, and provides rate-limit and cost details. This is a model of usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_articlesList articlesARead-onlyIdempotentInspect
Lists the website's generated articles, newest first, 20 per page, with their publication status and target keyword. Filter by headline search, status (generating, generated, preview_failed = failed to publish, preview_draft = published in draft, published, out_of_sync) and creation date range. Returns summaries only: call get_article with include_content=true to read an article's body. There is no total count; keep paging while has_more is true. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| search | No | Case-insensitive headline search. | |
| date_to | No | Keep articles created on or before this date (YYYY-MM-DD, inclusive, or ISO datetime). | |
| statuses | No | Keep only these statuses. | |
| date_from | No | Keep articles created on or after this date (YYYY-MM-DD or ISO datetime). | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| items | Yes | |
| has_more | Yes | |
| page_size | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering the safety profile. The description adds substantial behavioral context beyond annotations: it specifies the ordering, page size, summary-only return, absence of a total count, and the meaning of statuses (preview_failed = failed to publish, preview_draft = published in draft). These details inform the agent about the tool's output and paging contract, which annotations do not provide. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long and every sentence earns its place. It front-loads the core listing behavior (newest first, 20 per page, status and keyword) before moving to filters, then to return behavior and pagination, and finally to the website_id nuance. There is no fluff or repetition, and the structure is logical and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (not shown but indicated) and annotations covering the safety profile, the description covers everything an agent needs to call this tool correctly: what it lists, filtering options, pagination semantics, the summary-only return, how to get full content, and when to pass website_id. It also explains the meaning of statuses that might otherwise be opaque. No essential usage information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter has a basic description. The tool description adds meaningful semantics beyond the schema: it clarifies the status enum values (preview_failed and preview_draft are explained), explains that website_id is optional when the account has a single website, and clarifies the date range filtering is inclusive. It also explains the pagination behavior tied to the page parameter and has_more, which the schema does not. This adds value beyond the structured schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists generated articles with a specific ordering (newest first), pagination (20 per page), and the fields returned (publication status and target keyword). It distinguishes itself from get_article by explicitly saying it returns summaries only and directing the agent to call get_article with include_content=true for full body content. This is a specific verb+resource with clear scope and differentiation from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: it names the alternative tool (get_article) and the condition for using it (to read an article's body), explains pagination behavior (keep paging while has_more is true) since there is no total count, and instructs when to pass website_id (when the account has several websites, referencing get_account). It also enumerates the available filters (search, status, date range). This leaves no ambiguity about when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_integrationsList integrationsARead-onlyIdempotentInspect
Lists the CMS, e-commerce and webhook integrations connected to the website's organization (provider, connection status, auto-publish and draft-mode flags, publishing targets such as blogs or collections) plus the Google Search Console connection of the website (property, status, last sync). Use it to know where articles get published and whether Search Console analytics are available. Credentials and tokens are never returned. A custom webhook or the hosted blog can be connected with connect_custom_webhook and create_hosted_blog; other integrations are connected, and any integration disconnected, in the app. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| website_id | Yes | |
| integrations | Yes | |
| search_console | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: credentials and tokens are never returned, and it clarifies the scope (organization-level integrations plus the website's Search Console connection). It doesn't describe pagination or response shape, but the output schema exists and the added context is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but well-organized: it front-loads what is listed, then gives the use case, then exclusions and alternatives. It is longer than strictly necessary, but every sentence earns its place by adding routing or behavioral context. The structure is logical and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with one optional parameter, an output schema, and strong annotations, the description is complete. It covers what is returned, the use case, the key exclusion (no credentials/tokens), the conditional parameter usage, and the relevant sibling tools. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents website_id well. The description adds context beyond the schema by explaining when to pass website_id ('when the account has several websites') and pointing to get_account as the source. This is a small but useful addition over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists CMS, e-commerce, webhook integrations and the Google Search Console connection, with specific attributes (provider, connection status, auto-publish, draft-mode flags, publishing targets). It distinguishes itself from sibling tools by naming connect_custom_webhook and create_hosted_blog as alternatives for connecting, and get_account for website_id context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool: 'Use it to know where articles get published and whether Search Console analytics are available.' It also provides exclusions: credentials/tokens are never returned, and it names alternatives for connecting integrations (connect_custom_webhook, create_hosted_blog) and notes other integrations are connected/disconnected in the app. It also gives a conditional usage rule: pass website_id when the account has several websites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_keywordsList keywordsARead-onlyIdempotentInspect
Lists the website's tracked keywords (Google, in the website's default locale) with volume, difficulty, CPC, opportunity score/label, search intent, favorite flag, topic cluster label and the latest Google Search Console position, clicks, impressions and top ranking page. Pages of 50; sort by opportunity (default), volume, position (best first, unranked last) or recent. Use search to filter by keyword text and favorites_only to keep starred keywords. Positions are null when Google Search Console is not connected. Returns keyword_id values used by every other keyword tool. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. | |
| sort | No | opportunity | |
| search | No | Case-insensitive substring of the keyword text. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| favorites_only | No | Only return starred keywords. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| locale | Yes | |
| has_more | Yes | |
| keywords | Yes | |
| page_size | Yes | |
| website_id | Yes | Website the result belongs to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds valuable behavioral context: pages of 50, default sort by opportunity, position sorted best-first with unranked last, null positions when Google Search Console is not connected, and the fact that keyword_id is reused by other tools. This is exactly the kind of context that goes beyond structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries operational value: returned fields, pagination, sorting, filtering, null behavior, downstream ID usage, and multi-website prerequisite. It is front-loaded with the core purpose and does not waste words on tautology or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema already exists and there are 5 optional parameters, the description covers all call-time decisions: pagination size, sort options and default, filtering approach, website_id prerequisite, null positions edge case, and the tool's role in the broader keyword toolset. No essential information for invoking the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the baseline is 3andar; the description earns above baseline by adding semantics not present in the schema: page size of 50, sort order details ('position (best first, unranked last)'), default sort by opportunity, and the account-specific reasoning for website_id. Some overlap exists for search and favorites_only, but the added context is meaningful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource, 'Lists the website's tracked keywords', and enumerates the exact fields returned, which leaves no ambiguity about what the tool does. It further differentiates the tool from siblings by stating that it returns keyword_id values used by every other keyword tool, establishing it as the canonical listing endpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational context: pagination, supported sort orders, filtering options, and when to pass website_id ('when the account has several websites'). It doesn't explicitly name alternatives or state when-not to use it, but the role as the source of keyword_id values strongly implies when it is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scheduled_articlesList scheduled articlesARead-onlyIdempotentInspect
Lists the content calendar of a website: the articles scheduled for generation, one row per day slot, ordered by date. Defaults to today through the next 60Returns 50 rows per page with has_more. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last scheduled date to include (YYYY-MM-DD). Defaults to today + 60 days. | |
| from | No | First scheduled date to include (YYYY-MM-DD). Defaults to today. | |
| page | No | 1-based page number. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | |
| from | Yes | |
| page | Yes | |
| items | Yes | |
| has_more | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description adds value by disclosing pagination (50 rows per page with has_more) and ordering by date. No contradictions with annotations; these details are not present in structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the purpose and includes essential details (defaults, pagination, website_id). It is concise, though a minor typo ('60Returns') slightly detracts from polish.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation. The description covers pagination, ordering, defaults, and the website_id condition, which is sufficient for a read-only tool with four optional parameters. It is complete enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's note about website_id (pass when account has several websites) largely echoes the schema description for that parameter, adding no significant new meaning. Defaults are also restated from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists the content calendar of a website, specifically articles scheduled for generation, with a row per day slot ordered by date. This distinguishes it from siblings like list_articles and schedule_article, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for when to use (viewing scheduled articles) and gives a specific parameter guideline (pass website_id for multi-website accounts). However, it does not explicitly name alternatives or state when not to use this tool, falling short of the highest bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_articlePublish articleAInspect
Queues an article for publishing to one of the website's connected integrations (WordPress, Shopify, Webflow, webhook...). When provider is omitted and exactly one integration is eligible it is used; otherwise the eligible options are returned. Eligibility: generated or failed-to-publish articles can go to any active integration; an article published in draft can only be re-pushed to its own CMS; a live article can only be re-sent to a webhook (use sync_article_to_cms to push edits to a CMS). Asynchronous: the publish runs in the background within a few minutes; poll get_article until status is published or the status label reads Failed to publish. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| provider | No | Integration provider id (e.g. wordpress, shopify, webflow, webhook). Optional when only one is eligible. | |
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | Always "queued": the publish runs in the background. |
| provider | Yes | |
| article_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description openly discloses that publishing is asynchronous, runs in the background within a few minutes, and requires polling get_article until status is published or Failed to publish. This goes well beyond the basic annotations, which only indicate the operation is non-read-only, non-idempotent, and non-destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense yet well-structured, front-loading the core purpose before detailing eligibility, async behavior, and the website_id caveat. Every sentence adds necessary operational context, and no filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has meaningful complexity around provider selection, article eligibility, async execution, and failure handling, and the description covers all of these. Since an output schema exists, the description does not need to explain return values, and it even points to get_account and get_article for related context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaning around provider behavior by explaining how omission works and when eligible options are returned. It also clarifies the role of website_id in multi-website accounts, adding context beyond the bare schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool queues an article for publishing to connected integrations, naming specific providers like WordPress, Shopify, Webflow, and webhook. It distinguishes itself from the sibling sync_article_to_cms, which is explicitly referenced for pushing edits to a CMS, so an agent can tell the tools apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus sync_article_to_cms, including the eligibility of draft, live, generated, and failed-to-publish articles. It also explains provider-omission behavior and when to pass website_id, giving the agent clear decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_search_consoleQuery Search ConsoleARead-onlyIdempotentInspect
Queries Google Search Console live for the website: clicks, impressions, click-through rate and average position over any period of the last 16 months, grouped by query, page, country, device, date or search appearance, with filters on any of them (contains, equals, regex). It reads everything Search Console has at the moment of the call, where get_keyword_rankings and get_keyword_trends only cover the tracked keywords synced once a day. It also works on a website that has no plan yet, as soon as Search Console is connected for it. Examples: the queries of one page (dimensions ["query"], filter page equals its URL); queries ranking 5 to 15 with the most impressions (position_min 5, position_max 15, sort impressions); brand versus non-brand (filter query includingRegex or excludingRegex); daily clicks (dimensions ["date"]); pages losing traffic (call it for two periods and compare). Rows come back ordered by clicks, or by date when grouping by date only, unless sort is set. min_clicks, min_impressions, position_min, position_max and sort are applied to the top 25000 rows by clicks, and the result says when the property had more. Returns at most 500 rows per call (page with start_row). Search Console data lags 2 to 3 days. Limited to 200 calls per hour per website. When Search Console is not connected, the error gives the page where an admin connects it. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | position: best first; clicks, impressions or ctr: highest first. Omit to keep Search Console's order. | |
| filters | No | Conditions a row must all satisfy. | |
| end_date | No | Last day, YYYY-MM-DD. Defaults to 3 days ago, the latest day with complete data. | |
| row_limit | No | How many rows to return. | |
| start_row | No | Zero-based offset, to page through the rows. | |
| data_state | No | final: only complete days. all: also the last days whose numbers may still change. | final |
| dimensions | No | How rows are grouped. Pass an empty array for the totals of the period. | |
| min_clicks | No | Only rows with at least this many clicks. | |
| start_date | No | First day, YYYY-MM-DD. Defaults to 27 days before end_date. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| search_type | No | Which Google surface: web search (default), image, video, news, discover or googleNews. | web |
| position_max | No | Only rows whose average position is at most this value; must be >= position_min. | |
| position_min | No | Only rows whose average position is at least this value. | |
| min_impressions | No | Only rows with at least this many impressions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| end_date | Yes | |
| has_more | Yes | True when more rows exist: call again with start_row increased by row_count. |
| site_url | Yes | Search Console property the rows come from. |
| row_count | Yes | |
| start_row | Yes | |
| dimensions | Yes | |
| start_date | Yes | |
| website_id | Yes | Website the result belongs to. |
| search_type | Yes | |
| scanned_rows | No | Rows read from Search Console before the metric filters and sort were applied; absent without them. |
| scan_truncated | No | True when the property has more rows than the scan read, so low-click rows may be missing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, but the description adds substantial behavioral context beyond them: a 2-3 day data lag, a 200 calls/hour/website rate limit, a 500-row cap per call, that filters/sort apply only to the top 25000 rows by clicks, and that a 'more rows' signal is returned. It also explains the error content when Search Console isn't connected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and sibling differentiation, then constraints and examples. It is dense and long, but each sentence carries distinct information (limits, lag, row caps, examples, error behavior) rather than filler, so the length is largely earned though slightly overstuffed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter read tool with a full output schema and rich annotations, the description covers everything an agent needs: purpose, alternatives, examples, rate limits, data lag, pagination, ordering, and the row-cap semantics. Return-value explanation is unnecessary given the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning not in the schema: the ordering rules (by clicks, or by date when grouping by date only, unless sort is set) and the critical scoping note that min_clicks/min_impressions/position_min/position_max/sort operate only on the top 25000 rows. It also frames website_id via get_account and pagination via start_row.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (queries Google Search Console live) and names the exact metrics returned (clicks, impressions, CTR, average position) plus the supported groupings. It explicitly distinguishes itself from siblings get_keyword_rankings and get_keyword_trends by noting those only cover daily-synced tracked keywords while this reads live data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternatives and the condition that selects this tool over them, and supplies concrete when-to-use examples (one page's queries, positions 5-15 by impressions, brand vs non-brand, daily clicks, traffic-loss comparison across periods). It also notes it works on a website with no plan as long as Search Console is connected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_keyword_metricsRefresh keyword metricsAIdempotentInspect
Re-fetches monthly volume, difficulty, CPC and the opportunity score of one keyword, plus up to 49 companion keywords of the same website and locale, from the search-volume provider in a single call. Keywords the provider does not return are left untouched. Use it when metrics look stale (see metrics_updated_at); it does not change Google Search Console positions. Costs 1 AI brain credit, charged before the work, refunded if the provider fails. Requires an active subscription or free trial. Pass confirm=true to acknowledge the AI brain credits charge; without it the tool only returns the cost and your balance. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Set to true to acknowledge the AI brain credit charge. Omit it to only get the cost and your balance. | |
| keyword_id | Yes | Keyword id from list_keywords. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| companion_keyword_ids | No | Up to 49 other keyword ids to refresh in the same call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| website_id | No | Website the result belongs to. |
| credits_balance | No | Current AI brain credits balance; only with requires_confirmation. |
| refreshed_count | No | |
| credits_required | No | AI brain credits the call would charge; only with requires_confirmation. |
| credits_balance_after | No | AI brain credits balance after this call. |
| requires_confirmation | No | Present when the tool did not run: it needs confirm=true. The other fields are then absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the partial-failure behavior (provider-omitted keywords are left untouched), the credit cost and refund policy, the confirmation gate (without confirm=true it only returns cost and balance), and the subscription requirement. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded, and each subsequent sentence adds a distinct fact about side effects, cost, prerequisites, or parameter conditions. There is no redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, paid refresh call with four parameters, the description covers when to use it, how costs are charged/refunded, how the confirm parameter changes behavior, how website_id disambiguates accounts, and what happens to unfetchable keywords. An output schema is present, so return-value details are not needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds useful context: companion keywords must share the same website and locale, website_id is needed only when the account has several websites, and confirm controls whether the charge is acknowledged. This exceeds what the schema alone states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact resource and verb: it re-fetches monthly volume, difficulty, CPC, and opportunity score for one keyword plus up to 49 companion keywords of the same website and locale. It also distinguishes itself from plain getters by emphasizing it is a re-fetch that leaves missing provider keywords untouched and does not change Google Search Console positions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the trigger: use it when metrics look stale, pointing to metrics_updated_at. It also clarifies what it does not do (change GSC positions) and the prerequisite of an active subscription or free trial, though it does not name a specific alternative tool to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
regenerate_headlinesRegenerate headlinesAInspect
Queues a rewrite of the headlines of every upcoming automatically planned article that has not been generated yet (custom articles are untouched). Use it after changing the offer summary, audiences or instructions so the calendar reflects them. Asynchronous: returns as soon as the job is queued and the new headlines appear in the calendar within a few minutes. Limited to 3 requests per 24 hours per website and needs at least one article credit. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | Always "queued". |
| website_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavior beyond the annotations: the operation is asynchronous and returns as soon as the job is queued, headlines appear within minutes, there is a strict rate limit of 3 requests per 24 hours per website, and at least one article credit is required. These are exactly the operational details an agent needs to avoid misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient: every sentence adds unique value — purpose, when to use, async behavior, rate limit/credit requirement, and parameter handling. The most important functional information is front-loaded, and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema, this description covers everything needed to call it correctly: scope, timing, constraints, prerequisites, and parameter conditions. The async return behavior and rate limit are especially important for managing agent expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents website_id and its 100% coverage, so the baseline is 3. The description adds meaningful guidance beyond the schema by instructing when to pass website_id (when the account has several websites) and pointing to get_account as the source, which compensates well for a sparse parameter set.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific, concrete action: it queues a rewrite of headlines for every upcoming automatically planned article that has not been generated yet. It also explicitly scopes out custom articles, which clearly distinguishes this tool from single-article headline tools like suggest_headline or update_article_headline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use the tool: after changing the offer summary, audiences, or instructions so the calendar reflects those changes. It also gives an exclusion (custom articles are untouched), but it does not explicitly name an alternative tool for those excluded cases, so it stops short of full 5-level guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reschedule_articleReschedule an articleAIdempotentInspect
Moves a scheduled article to another date (YYYY-MM-DD). Pass swap_with_scheduled_article_id to exchange dates with the article occupying the target day instead of stacking two articles on it. Without a swap, the website's publishing frequency is enforced: a full day is refused and the next free date is named. Refuses articles that are published or currently generating. Repeating a swap swaps the dates back. Returns the moved row. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| new_date | Yes | Target date, YYYY-MM-DD. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| scheduled_article_id | Yes | Scheduled article id from list_scheduled_articles. | |
| swap_with_scheduled_article_id | No | Article currently on new_date whose date should be swapped with this one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| brief | Yes | Writing brief the article follows. |
| headline | Yes | |
| is_custom | Yes | true when the user planned the article; false for automatic topics. |
| created_at | Yes | |
| product_ids | Yes | |
| is_generated | Yes | true once the article was written; generated rows can no longer be edited. |
| scheduled_at | Yes | Generation date, YYYY-MM-DD. |
| target_keyword | Yes | |
| target_keyword_id | Yes | |
| generated_article_id | Yes | Article id once generated, for the articles tools. |
| scheduled_article_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotation Contradiction: the description states 'Repeating a swap swaps the dates back,' meaning the same call can undo the previous result and the operation is not idempotent, while idempotentHint=true claims it is. The description otherwise discloses useful traits such as refusals, frequency enforcement, and return value, but the direct contradiction with the annotation forces the lowest score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and packs swap behavior, frequency rules, refusal conditions, repeat behavior, return value, and website_id guidance into six dense sentences. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating reschedule operation, the description covers prerequisites, failure conditions, target-day conflicts, repetition semantics, multi-website handling, and return value; the output schema supplies return structure. It is complete for an agent to invoke and interpret the tool, aside from the annotation contradiction already flagged.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, providing baseline parameter documentation. The description adds meaning beyond the schema by explaining the effect of swap_with_scheduled_article_id ('exchange dates... instead of stacking') and the condition for website_id ('see get_account'). This exceeds the baseline without needing to restate formats.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Moves a scheduled article to another date (YYYY-MM-DD).' It clearly distinguishes this action from scheduling, updating, or deleting by focusing on the date move and the swap semantics, so an agent can tell it apart from siblings like schedule_article and update_scheduled_article.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear conditional guidance: when to pass swap_with_scheduled_article_id, what happens without a swap, and when website_id is needed ('when the account has several websites'). It does not explicitly name sibling alternatives or state when not to use this tool, but the context is strong enough to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
research_keywordsResearch keywordsAInspect
Discovers new keywords from seed keywords and adds them to the website: each seed (at most 20) is expanded into related keyword ideas via the search-volume provider, filtered for relevance to the website by AI, de-duplicated against existing keywords and inserted (at most 250 new keywords per call). Clustering and search-intent classification run in the background afterwards, so cluster_label and intent can be empty for a minute. Limited to 5 calls per hour per website, shared with add_keywords. The credit is charged even when nothing new is added. To add specific keywords as written, use add_keywords; to look up metrics of existing keywords, use refresh_keyword_metrics. Costs 1 AI brain credit, charged after the work, not refunded on failure. Requires an active subscription or free trial. Pass confirm=true to acknowledge the AI brain credits charge; without it the tool only returns the cost and your balance. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Set to true to acknowledge the AI brain credit charge. Omit it to only get the cost and your balance. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| seed_keywords | Yes | Seed keywords to expand (1 to 20). |
Output Schema
| Name | Required | Description |
|---|---|---|
| website_id | No | Website the result belongs to. |
| added_count | No | |
| credits_balance | No | Current AI brain credits balance; only with requires_confirmation. |
| credits_required | No | AI brain credits the call would charge; only with requires_confirmation. |
| credits_balance_after | No | AI brain credits balance after this call. |
| requires_confirmation | No | Present when the tool did not run: it needs confirm=true. The other fields are then absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations. It discloses the 5-calls-per-hour shared rate limit, that credit is charged even when nothing is added, the 1 AI brain credit cost charged after work and non-refundable on failure, the requirement of an active subscription or free trial, and the asynchronous background processing (clustering/intent may be empty for a minute). Annotations only indicate readOnlyHint false and openWorldHint true, so this description carries the full burden and exceeds it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficiently structured. It front-loads the primary purpose, then covers limits, async behavior, rate limits, costs, alternatives, and the confirm flag in a logical order. Every sentence delivers necessary information; there is no filler or redundancy, despite its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with significant complexity—costs, rate limits, async processing, prerequisites, and alternatives—the description covers every aspect an agent needs to invoke it correctly. It explains the confirm requirement, subscription need, charge behavior, and background processing. An output schema exists, so return-value documentation is not required. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage, with descriptions for seed_keywords ('Seed keywords to expand (1 to 20)'), confirm ('Set to true to acknowledge the AI brain credit charge...'), and website_id ('Website id from get_account...'). The description largely repeats these details and does not add new parameter-specific semantics beyond what the schema already conveys. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Discovers new keywords from seed keywords and adds them to the website.' It specifies the verb (discovers/adds), the resource (keywords), and the mechanism (seed expansion). It also distinguishes from siblings by naming add_keywords for specific keywords and refresh_keyword_metrics for metrics, so an agent can immediately tell this tool apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool versus alternatives: 'To add specific keywords as written, use add_keywords; to look up metrics of existing keywords, use refresh_keyword_metrics.' It also explains the confirm flag behavior ('without it the tool only returns the cost and your balance') and the shared rate limit with add_keywords, leaving no ambiguity about invocation context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_advanced_seo_checkRun advanced SEO checkAInspect
Starts a competitor-relative SEO analysis of the default-language article: fetches the pages ranking in Google's top results for its target keyword, compares their depth and topic coverage with the article and stores a report (competitor-relative score, summary, topic gaps, recommendations, competitor terms, target word count). Asynchronous: returns as soon as the analysis is queued. It takes about 1 to 2 minutes; poll get_advanced_seo_report until status is done. The article must have a target keyword. Refused while an analysis is already running. Once done, check_article_seo_score and improve_article_seo use the benchmark automatically; re-run it only when the article changed substantially (see is_stale). Costs 1 AI brain credit, charged before the work, refunded if the provider fails. Requires an active subscription or free trial. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| async | Yes | Always true: poll get_advanced_seo_report for the result. |
| status | Yes | Always "queued". |
| article_id | Yes | |
| website_id | Yes | Website the result belongs to. |
| credits_balance_after | No | AI brain credits balance after this call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, but the description goes far beyond by disclosing the asynchronous polling model (returns immediately, 1-2 minutes until done, poll get_advanced_seo_report), the refusal condition (already running), the cost (1 AI brain credit, charged upfront, refunded on provider failure), and subscription requirement. It also describes the side effect of storing a report, which is richer than the bare annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: it starts with the core action, then covers async behavior, prerequisites, refusal, cost, subscription, and parameter guidance. There is no filler, and the structure flows logically from what → how → when → prerequisites → cost. Despite its length, it remains highly scannable and front-loaded with the primary purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's asynchronous nature, cost implications, required keyword precondition, and interplay with sibling tools, the description covers all necessary details: what the analysis produces, how to retrieve results (polling), when to rerun, and account context (website_id). While an output schema exists, the description also enumerates the report fields, ensuring an agent understands the outcome without needing to open the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage: both parameters have descriptive text ('Article id from list_articles.' and 'Website id from get_account. Optional when the account has a single website.'). The description repeats the website_id guidance ('Pass website_id when the account has several websites'), which adds marginal value beyond the schema. Since the schema carries the meaning, the baseline of 3 is appropriate; the reinforcement does not elevate it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb ('Starts') and resource ('competitor-relative SEO analysis of the default-language article'), then specifies the exact steps (fetches top Google results, compares depth and topic coverage, stores a report). This clearly differentiates it from siblings like check_article_seo_score (which reads the report) and improve_article_seo (which acts on it), and the distinction is reinforced by the note that these tools use the benchmark automatically.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: the article must have a target keyword, it is refused while an analysis is already running, and it should be re-run only when the article changed substantially (with a pointer to is_stale). It also instructs to pass website_id when the account has several websites (linking to get_account). While it does not name a direct alternative tool, it clarifies that check_article_seo_score and improve_article_seo consume the benchmark, so rerunning is unnecessary unless content changed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_advanced_seo_check_for_contentRun advanced SEO check for contentAInspect
Benchmarks content you pass inline against the pages currently ranking on Google for target_keyword in the given locale: fetches the top organic results, reads up to 6 of them (title, headings, word count) and asks the AI for a competitor-relative report with a 0-100 advanced score, summary, coverage gaps, strengths, prioritized recommendations and the semantic terms ranking pages cover, plus the median word count to aim for. Also returns the on-page score of the content recomputed with that benchmark (competitor keyword coverage and length target). The content does not need to be in BlogSEO. Competitor pages are read as raw HTML, so ranking pages that build their content with JavaScript are skipped and the advanced score can differ from the one run_advanced_seo_check gives on a stored article, which reads rendered pages. Synchronous and slow: it takes 1 to 3 minutes, wait for it instead of retrying. Fails (and refunds) when fewer than 2 ranking pages can be read. Limited to 10 calls per hour per website. Use check_seo_score first for a free on-page-only check. Costs 1 AI brain credit, charged before the work, refunded if the provider fails. Requires an active subscription or free trial. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | BCP-47 locale of the Google market to benchmark against (default "en-US"). | en-US |
| content | Yes | Body of the content as markdown or plain text, 200 to 60,000 characters. | |
| headline | Yes | Title (H1) of the content. | |
| site_url | No | URL of the site the content lives on; its host tells internal and external links apart. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| target_keyword | Yes | Primary keyword the content should rank for. | |
| meta_description | No | Meta description, when there is one. | |
| secondary_keywords | No | Secondary keywords the content should also cover (max 20). |
Output Schema
| Name | Required | Description |
|---|---|---|
| summary | Yes | |
| strengths | Yes | |
| website_id | Yes | Website the result belongs to. |
| competitors | Yes | |
| coverage_gaps | Yes | Topics the ranking pages cover and the content does not. |
| on_page_score | Yes | On-page score recomputed with the benchmark. |
| advanced_score | Yes | Competitor-relative score, 0-100. |
| credits_charged | Yes | |
| recommendations | Yes | |
| target_word_count | Yes | Median length of the ranking pages. |
| recommended_keywords | Yes | |
| credits_balance_after | No | AI brain credits balance after this call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses meaningful behavioral traits: it charges 1 AI brain credit before work, refunds on provider failure, is synchronous and slow, has a 10-call-per-hour limit, fails and refunds when fewer than 2 ranking pages can be read, and requires an active subscription or free trial. This greatly exceeds what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although lengthy, the description is dense and front-loaded: it leads with the core benchmarking behavior and report contents, then moves through operational constraints, failure modes, cost, rate limits, and alternatives. Every clause carries practical information that an agent needs before invoking the tool, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, cost, latency, and external dependencies, the description covers all essential context: what it returns, what can cause failure, rate limits, billing, prerequisites, and how it differs from sibling tools. The presence of an output schema means the detailed return shape does not need to be restated, so the description is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all eight parameters with 100% coverage, so the baseline is 3. The description adds value by clarifying that content is passed inline, does not need to be in BlogSEO, and that website_id should be supplied when the account has multiple websites. These details go slightly beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: benchmarks caller-supplied content against Google's top organic results for a target keyword and locale, producing an advanced score and a competitor-relative report. It also differentiates itself from the sibling run_advanced_seo_check by clarifying that this variant works on inline content and raw HTML rather than stored articles with rendered pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage direction: use check_seo_score first for a free on-page-only check, pass website_id when the account has several websites, and wait 1-3 minutes instead of retrying. It also explains when not to rely on the result, noting that JavaScript-rendered competitor pages are skipped and that results may differ from run_advanced_seo_check on stored articles.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_articleSchedule an articleAInspect
Adds a custom article to the content calendar on a given date. The scheduler generates it around that date and consumes 1 article credit at generation time (not when scheduling), so the account needs an active subscription or at least 1 article credit. Limits: at most 90 pending (not yet generated) articles per website, 30 new schedules per hour, one scheduled article per keyword, 3 products per article. The website's publishing frequency is enforced: when the date already holds as many articles as the website publishes per day, the call fails and names the next free date, so pass that date, or move the existing article with reschedule_article. Pass keyword_id (from list_keywords, or add_keywords then list_keywords) to target a keyword, and brief for writing instructions. Returns the created row; nothing is written yet in the articles list until generation runs. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| brief | No | Content brief the writer follows: angle, must-cover points, tone, audience, sources. | |
| headline | Yes | Article headline (title). Use suggest_headline afterwards to improve it. | |
| keyword_id | No | Keyword id from the keywords tools. One scheduled article per keyword. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| product_ids | No | Product ids to feature in the article (max 3). Unknown ids are dropped. | |
| scheduled_date | Yes | Generation date, YYYY-MM-DD. Today or later. |
Output Schema
| Name | Required | Description |
|---|---|---|
| brief | Yes | Writing brief the article follows. |
| headline | Yes | |
| is_custom | Yes | true when the user planned the article; false for automatic topics. |
| created_at | Yes | |
| product_ids | Yes | |
| is_generated | Yes | true once the article was written; generated rows can no longer be edited. |
| scheduled_at | Yes | Generation date, YYYY-MM-DD. |
| target_keyword | Yes | |
| target_keyword_id | Yes | |
| generated_article_id | Yes | Article id once generated, for the articles tools. |
| scheduled_article_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry four false hints, so the description carries the disclosure burden, and it does so thoroughly. It reveals that credit is consumed at generation time rather than scheduling time, that the call fails on full dates and names the next free date, that nothing is written to the articles list until generation, and it lists rate and pending limits. These are non-obvious behavioral traits an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely packed, front-loading the core action and the most important caveat (credit consumption) before moving to limits, failure behavior, and parameter guidance. Every sentence carries operational value, and the structure is logical despite the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, complex scheduling behavior, and an output schema, the description covers the essential operational context: prerequisites, limits, failure mode, parameter sources, and what the call returns. An agent has enough information to call the tool correctly without needing additional discovery.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it explains where keyword_id comes from, when website_id is needed, that product_ids are capped at 3, and that one scheduled article is allowed per keyword. This gives practical context the schema alone does not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and object: 'Adds a custom article to the content calendar on a given date.' It also distinguishes the tool from siblings by contrasting with reschedule_article ('move the existing article with reschedule_article') and by clarifying that scheduling is not generation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear conditions: active subscription or article credit required, limits on pending articles and schedules, one scheduled article per keyword, and website publishing-frequency enforcement. It also points to reschedule_article as the alternative when the date is full and to list_keywords/add_keywords/get_account as data sources. It does not explicitly contrast with the bulk sibling schedule_articles_for_keywords, so it stops short of a full when-not-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_articles_for_keywordsSchedule articles for keywordsAInspect
Queues one article per keyword in the content calendar. Asynchronous: the call enqueues the work and returns immediately; headlines are generated and the scheduled articles appear in the calendar about a minute later. Fails when any keyword already has a scheduled article. The calendar holds at most 90 pending articles: keywords beyond the remaining slots are dropped and reported in skipped_over_limit_count. Limited to 30 calls per hour. Scheduling is free; each article consumes 1 article credit when it is generated. Requires an active subscription or free trial. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| keyword_ids | Yes | Keywords to write an article for (1 to 50). |
Output Schema
| Name | Required | Description |
|---|---|---|
| async | Yes | Always true: the scheduled articles appear in the calendar about a minute later. |
| website_id | Yes | Website the result belongs to. |
| queued_keyword_ids | Yes | |
| skipped_over_limit_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds extensive behavioral context beyond the sparse annotations: asynchronous execution, immediate return, ~1 minute delay before appearing, failure on duplicate keywords, 90 pending article cap with skipped_over_limit_count reporting, 30 calls/hour rate limit, free scheduling but credit consumption, and subscription/trial requirement. This is rich, non-redundant disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense but well-ordered set of sentences, each earning its place: core action first, then async behavior, failure mode, capacity, rate limit, cost, auth, and parameter condition. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers most operational aspects an agent needs: async behavior, failure conditions, capacity, limits, cost, auth, and parameter guidance. The output schema exists, so return values need not be explained. Minor ambiguity remains about whether a duplicate keyword fails the entire call or just the offending keyword, but overall the description is quite complete for a complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning beyond the schema by clarifying that each keyword_id results in one article, and by providing the conditional rule 'Pass website_id when the account has several websites' with a cross-reference to get_account. This enhances parameter understanding beyond the raw schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb+resource: 'Queues one article per keyword in the content calendar.' It is distinguishable from siblings through the explicit 'one article per keyword' wording, though it doesn't name the singular alternative schedule_article, so it lacks explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool, such as passing website_id for accounts with several websites and the failure on duplicate keywords. It lacks explicit guidance on when to choose this over the singular schedule_article tool, but the operational constraints and conditional instructions are well covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_article_cover_imageSet article cover imageAInspect
Replaces the cover (main) image of a generated article with an image stored on the website's media host: either downloaded from a public URL (image_url) or uploaded from the user's machine (upload_id, see create_image_upload). Pass alt_text to describe the new image at the same time (recommended). Pass locale to change the cover of a translation only. Free. Editing an article that is already published (or published in draft) marks it Out of Sync until it is synced with sync_article_to_cms or published again. Inline images inside the body are part of the markdown: host them with upload_article_image and edit the body with update_article_content. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Translation locale (e.g. "fr") to target instead of the default-language article. | |
| alt_text | No | Alt text of the cover image (max 200 characters): what the image shows, for search engines and screen readers. Shared by every locale of the article and sent to the CMS with the image. | |
| image_url | No | Public http(s) URL of the image to download (JPEG, PNG, WebP, GIF or AVIF, 4 MB max). For a file on the user's machine, pass upload_id instead. | |
| upload_id | No | upload_id returned by create_image_upload, once the file has been sent to its upload_url. Alternative to image_url for files on the user's machine (10 MB max). | |
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| locale | Yes | |
| article | Yes | |
| main_image_url | Yes | Hosted URL of the new cover. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal readOnlyHint=false, destructiveHint=false, and idempotentHint=false, but the description adds meaningful behavioral context: it marks the article Out of Sync when published, mentions Free, and clarifies that alt_text is shared across locales. The description is consistent with the annotations (a mutation that is not idempotent) and goes beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact given the tool's complexity and delivers the key differentiators up front. The sentence about inline images is ancillary but prevents a common misuse, and the flow references are terse. It could be slightly tighter, but the density is high and valuable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has six parameters, no enums, a rich schema, and a true output schema. The description covers the two source modes, the out-of-sync side effect, the publishing distinction, translation targeting, multi-website handling, and routes inline-image work to sibling tools. There is no meaningful gap for an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already explains parameters well. The description still adds useful semantics: it clarifies the relationship between image_url and upload_id as mutually exclusive alternatives, recommends alt_text, describes locale as targeting a translation, and notes website_id is only needed for multi-website accounts. This exceeds the schema's per-parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb ('Replaces') and resource ('the cover (main) image of a generated article'), and distinguishes itself from sibling tools like upload_article_image and update_article_cover_alt_text. It makes the core purpose immediately identifiable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear when-to-use guidance: it explains the two image source options (URL vs upload_id), refers to create_image_upload for the upload flow, mentions website_id for multi-website accounts, and tells agents to use upload_article_image plus update_article_content for inline images instead. This is explicit routing with conditions and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_keyword_favoriteSet keyword favoriteAIdempotentInspect
Stars or unstars a keyword. Favorites are scheduled first when the website auto-selects keywords for its calendar and can be filtered with list_keywords favorites_only. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| keyword_id | Yes | Keyword id from list_keywords. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| is_favorite | Yes | true to star, false to unstar. |
Output Schema
| Name | Required | Description |
|---|---|---|
| keyword_id | Yes | |
| website_id | Yes | Website the result belongs to. |
| is_favorite | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate this is a non-destructive, idempotent write operation. The description adds useful behavioral context beyond that: favorites affect scheduling priority and can be filtered via list_keywords favorites_only. This helps the agent understand the downstream effects of setting a favorite.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each serving a purpose: the action, the behavioral consequence, and the conditional parameter guidance. No filler or redundant detail; the most important action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple mutation tool, the description covers the action, related list_keywords filtering, account-with-multiple-websites handling, and relevant data sources. The output schema handles return-value expectations, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents keyword_id, website_id, and is_favorite. The description mostly restates the website_id condition already present in the schema, adding minimal new parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Stars or unstars a keyword') and clarifies the feature's role in auto-selection and filtering. This clearly distinguishes it from siblings like list_keywords or add_keywords.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when this tool is relevant: favorites are scheduled first and can be filtered with list_keywords favorites_only. It also instructs when to pass website_id. It does not explicitly state when not to use it or name an alternative, but the usage context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_headlineSuggest a headlineARead-onlyInspect
Asks the AI for an alternative headline for a pending scheduled article, using its brief, target keyword and the website profile, and avoiding headlines already in the calendar. It only returns a suggestion: nothing is saved. Apply it with update_scheduled_article once the user picks one. Limited to 25 suggestions per hour per user; each call takes a few seconds and costs no credits. Requires an active subscription or free trial. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| scheduled_article_id | Yes | Scheduled article id from list_scheduled_articles. |
Output Schema
| Name | Required | Description |
|---|---|---|
| saved | Yes | Always false: the suggestion is never saved by this tool. |
| current_headline | Yes | |
| suggested_headline | Yes | |
| scheduled_article_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces and extends this with concrete operational context: 'nothing is saved', 'Limited to 25 suggestions per hour per user', 'each call takes a few seconds and costs no credits', and 'Requires an active subscription or free trial.' This goes well beyond what annotations provide and matches them without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, all earning their place: core purpose, non-save behavior, workflow guidance, and operational constraints (rate limit, latency, cost, auth). The most important scoping information is front-loaded and there is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (so return values need no explanation), only two well-documented parameters, and rich annotations, the description covers everything an agent needs: rate limit, cost, latency, auth prerequisite, side-effect-free behavior, parameter guidance, and the follow-up workflow. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters well. The description adds minor reinforcement ('Pass website_id when the account has several websites') and explains how inputs are used ('using its brief, target keyword and the website profile'), but it doesn't add materially new meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Asks the AI for an alternative headline for a pending scheduled article') and explicitly distinguishes itself from sibling tools by stating 'It only returns a suggestion: nothing is saved.' This draws a clear line against update_article_headline and update_scheduled_article, so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when it applies — for pending scheduled articles, using brief, target keyword and website profile, avoiding duplicates already in the calendar — and names the follow-up tool ('Apply it with update_scheduled_article once the user picks one'). It lacks explicit exclusions or a comparison to similar siblings like regenerate_headlines, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_article_to_cmsSync article to CMSAIdempotentInspect
Pushes the current content of a published (or published-in-draft) article to every connected CMS, clearing its Out of Sync state. Synchronous: returns once the CMS accepted the update (a few seconds; Shopware, Umbraco and BigCommerce finish in the background). Fails for articles that are not on a CMS yet: publish those with publish_article. Framer and webhook connections are never synced. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| locale | Yes | Translation locale the change applied to; null for the default-language article or a field shared by every locale. The other fields always describe the default-language article. |
| status | Yes | Raw status; status_label is the human reading. |
| message | Yes | What changed, e.g. "Headline updated for the fr version." |
| headline | Yes | |
| article_id | Yes | |
| created_at | Yes | |
| preview_text | Yes | First 200 characters of the body. |
| published_at | Yes | |
| status_label | Yes | Status as shown in the app, e.g. Published, Draft on CMS, Failed to publish. |
| is_out_of_sync | Yes | Edited since the last push to the CMS; sync_article_to_cms clears it. |
| main_image_url | Yes | Cover image URL. |
| target_keyword | Yes | |
| meta_description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare idempotency, non-destructiveness and open-world scope; the description goes much further, disclosing synchronous return semantics, that Shopware/Umbraco/BigCommerce complete in the background, the prerequisite failure mode, and the connection types that are never synced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The primary action and the Out-of-Sync effect are front-loaded, followed by timing, failure/prerequisite handling, exclusions, and the parameter hint. Every sentence carries distinct operational information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation. The description covers prerequisites, alternatives, cross-account scoping and per-integration execution behavior, leaving no meaningful gap for an agent calling this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents both parameters, including that website_id is optional for single-website accounts. The description's note about passing website_id for multi-website accounts and referring to get_account largely restates the schema, so it sits at the baseline with only marginal added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (pushes current article content to connected CMS) plus the resulting state change (clearing Out of Sync). It clearly distinguishes itself from publish_article, which is named as the tool for articles not yet on a CMS.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the failure condition (article not on a CMS yet) and routes the agent to the alternative (publish_article), plus states which connections are out of scope (Framer, webhooks) and when website_id is required. When-to-use, when-not, and alternatives are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_custom_webhookTest custom webhookAIdempotentInspect
Sends a sample article payload to the connected webhook with its saved settings and secret or, with url, to an endpoint that is not connected yet (without the secret, like the dashboard test before saving). Reports whether the endpoint answered 2xx within 30 seconds and the error otherwise. The sample uses random ids and fills every optional field; it never reproduces the multi-language fan-out. Limited to 30 tests per hour. Free. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Endpoint to test before connecting it. Omit to test the connected webhook with its saved settings and secret. | |
| format | No | Format of the sample payload, only with url. | markdown |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| auth_method | No | generated (recommended): BlogSEO creates a shared secret and sends it in the X-Webhook-Secret header. custom: BlogSEO sends the header you name with the value you give. | generated |
| custom_header_name | No | Header name, only with auth_method=custom. | |
| custom_header_value | No | Header value, only with auth_method=custom. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Endpoint tested; null when the connected webhook was tested. |
| detail | Yes | |
| passed | Yes | |
| status_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is otherwise rich, disclosing 30-second 2xx wait, sample payload characteristics, and the 30-test/hour limit. However, it contradicts the idempotentHint=true annotation: the sample uses random ids and each call consumes quota, so repeated identical calls produce different payloads and side effects. This is an Annotation Contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core behavior, then adds mode distinction, response reporting, payload notes, rate limit, cost, and a conditional parameter in a logical order. Every sentence earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With six optional parameters fully described in the schema, an output schema present, and annotations provided, the description still adds the critical runtime context: response expectation within 30 seconds, rate limit, non-reproduction of multi-language fan-out, and website_id guidance. Nothing an agent needs for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already well documented in the schema. The description adds only lightweight context such as the website_id condition, but does not materially improve on the schema's parameter meanings. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: it sends a sample article payload to a webhook, and clearly distinguishes testing the connected webhook from testing an unconnected endpoint via url. It also clarifies that it is a pre-connection test, which separates it from the sibling connect_custom_webhook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use guidance for both modes: omit url to test the saved webhook, or pass url to test before connecting. It also explains when website_id is needed and points to get_account. It does not explicitly name sibling alternatives like connect_custom_webhook, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_article_contentUpdate article contentADestructiveIdempotentInspect
Replaces the body of a generated article with the markdown you pass (the whole body, not a diff: read it first with get_article include_content=true, edit, then send it back). Headings, lists, links and images use standard markdown; inline images are , where url can be an image hosted with upload_article_image. The SEO score is recomputed and saved with the content. Pass locale to edit a translation instead of the default-language article. Free. Editing an article that is already published (or published in draft) marks it Out of Sync until it is synced with sync_article_to_cms or published again. For instruction-driven rewrites use edit_article_with_ai instead. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Translation locale (e.g. "fr") to target instead of the default-language article. | |
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| markdown_content | Yes | The complete new article body in markdown. |
Output Schema
| Name | Required | Description |
|---|---|---|
| locale | Yes | |
| article | Yes | |
| seo_score | Yes | Recomputed on-page SEO score, 0-100. |
| word_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry destructiveHint=true, readOnlyHint=false, idempotentHint=true, so the bar is lower, but the description still adds substantial context: the Out of Sync state change on published articles, SEO score recomputation and persistence, the 'Free' cost disclosure, and the whole-body replacement semantics. No contradiction with annotations — 'replaces the body' aligns with destructive=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place — workflow, syntax, side effects, cost, alternatives, and multi-site handling are all actionable. It is front-loaded with the core purpose and the most important caveat (whole body, not a diff). Slightly long, but no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool, this is unusually complete: workflow, side-effect state transitions, cost, alternatives, translation handling, and multi-website conditions are all covered. The presence of an output schema relieves it of explaining return values. An agent has everything needed to call it correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with good per-parameter descriptions, so the baseline is 3. The description adds genuine value on top: markdown_content gets format rules and image-hosting guidance (upload_article_image), locale gets translation-targeting context, and website_id gets the multi-website trigger. This pushes it above baseline but the schema still does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb-resource pair ('Replaces the body of a generated article') with a critical disambiguator: the whole body, not a diff. The markdown and image syntax details plus the 'read it first' workflow leave no doubt about the operation. It clearly distinguishes from siblings like update_article_headline, update_article_slug, and edit_article_with_ai.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when/when-not guidance: names the exact read-before-edit workflow (get_article include_content=true), the alternative for instruction-driven rewrites (edit_article_with_ai), the conditional for translations (locale), and the multi-website condition (website_id with get_account). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_article_cover_alt_textUpdate article cover alt textAIdempotentInspect
Replaces the alt text of an article's cover image. The alt text is stored once per article and used for every locale. An empty string clears it, in which case the headline is used. Inline images keep their alt text in the markdown body (): edit it with update_article_content. Free. Editing an article that is already published (or published in draft) marks it Out of Sync until it is synced with sync_article_to_cms or published again. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| alt_text | Yes | Alt text of the cover image (max 200 characters): what the image shows, for search engines and screen readers. Shared by every locale of the article and sent to the CMS with the image. | |
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| locale | Yes | Translation locale the change applied to; null for the default-language article or a field shared by every locale. The other fields always describe the default-language article. |
| status | Yes | Raw status; status_label is the human reading. |
| message | Yes | What changed, e.g. "Headline updated for the fr version." |
| headline | Yes | |
| article_id | Yes | |
| created_at | Yes | |
| preview_text | Yes | First 200 characters of the body. |
| published_at | Yes | |
| status_label | Yes | Status as shown in the app, e.g. Published, Draft on CMS, Failed to publish. |
| is_out_of_sync | Yes | Edited since the last push to the CMS; sync_article_to_cms clears it. |
| main_image_url | Yes | Cover image URL. |
| target_keyword | Yes | |
| meta_description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly=false, idempotent=true, destructive=false). The description adds non-obvious behavior the annotations cannot express: alt text is stored once and shared across all locales, an empty string clears it and falls back to the headline, and editing a published article marks it Out of Sync until synced or republished.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, each carrying distinct decision-relevant information: purpose, storage scope, empty-string edge case, sibling routing, side effect, and precondition. Purpose is front-loaded and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation. The description covers the remaining gaps an agent would hit: locale sharing, the empty-string edge case, post-publish sync state, the inline-image boundary, and multi-website disambiguation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters, making 3 the baseline. The description still adds semantics the schema lacks: an empty alt_text is not just an empty write but an explicit clear that triggers headline fallback, and it explains when website_id is required rather than merely optional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Replaces the alt text of an article's cover image.' It immediately scopes to the cover image and explicitly separates cover alt text from inline-image alt text, which is the main ambiguity in this tool family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the exact alternative for the adjacent case ('Inline images keep their alt text in the markdown body ... edit it with update_article_content'), states the cost ('Free'), and gives the website_id precondition plus the published-article follow-up path via sync_article_to_cms.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_article_headlineUpdate article headlineAIdempotentInspect
Renames an article (or one of its translations when locale is given). Editing an article that is already published (or published in draft) marks it Out of Sync until it is synced with sync_article_to_cms or published again. Renaming an article that already lives on a CMS freezes its current slug so the live URL does not move; use update_article_slug to change the URL on purpose. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Translation locale (e.g. "fr") to target instead of the default-language article. | |
| headline | Yes | New headline. | |
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| locale | Yes | Translation locale the change applied to; null for the default-language article or a field shared by every locale. The other fields always describe the default-language article. |
| status | Yes | Raw status; status_label is the human reading. |
| message | Yes | What changed, e.g. "Headline updated for the fr version." |
| headline | Yes | |
| article_id | Yes | |
| created_at | Yes | |
| preview_text | Yes | First 200 characters of the body. |
| published_at | Yes | |
| status_label | Yes | Status as shown in the app, e.g. Published, Draft on CMS, Failed to publish. |
| is_out_of_sync | Yes | Edited since the last push to the CMS; sync_article_to_cms clears it. |
| main_image_url | Yes | Cover image URL. |
| target_keyword | Yes | |
| meta_description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses non-obvious side effects well beyond the annotations: editing a published (or draft-published) article marks it Out of Sync, and renaming a CMS-live article freezes the slug so the live URL does not move. These facts about state and irreversible URL anchoring are exactly what an agent needs and cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each carrying distinct information, with the core rename behavior front-loaded and the side-effect and sibling-routing details following. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. Combined with full schema coverage and annotations, the description supplies everything an agent needs: scope, side effects, alternatives, and the multi-website condition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already fully documented. The description adds useful framing for locale (target a translation) and website_id (multi-website accounts), but does not go beyond what the schema states, warranting the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Renames an article") and extends it precisely to translations via the locale parameter. It is immediately distinguishable from siblings like update_article_slug and update_article_content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use update_article_slug to intentionally change the URL, and sync_article_to_cms or republish when the article goes Out of Sync. It also names the condition (multiple websites) that governs passing website_id, with get_account as the lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_article_meta_descriptionUpdate article meta descriptionAIdempotentInspect
Replaces the SEO meta description of an article (or of one translation when locale is given); keep it under 160 characters. Editing an article that is already published (or published in draft) marks it Out of Sync until it is synced with sync_article_to_cms or published again. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Translation locale (e.g. "fr") to target instead of the default-language article. | |
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| meta_description | Yes | New meta description (max 160 characters). |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| locale | Yes | Translation locale the change applied to; null for the default-language article or a field shared by every locale. The other fields always describe the default-language article. |
| status | Yes | Raw status; status_label is the human reading. |
| message | Yes | What changed, e.g. "Headline updated for the fr version." |
| headline | Yes | |
| article_id | Yes | |
| created_at | Yes | |
| preview_text | Yes | First 200 characters of the body. |
| published_at | Yes | |
| status_label | Yes | Status as shown in the app, e.g. Published, Draft on CMS, Failed to publish. |
| is_out_of_sync | Yes | Edited since the last push to the CMS; sync_article_to_cms clears it. |
| main_image_url | Yes | Cover image URL. |
| target_keyword | Yes | |
| meta_description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavior: published articles are marked 'Out of Sync' until re-synced or republished, which is a non-obvious side effect an agent must plan around. It stops short of permissions or rate-limit context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then layers constraints and the side-effect warning in a compact multi-clause sentence with no filler. Dense but every clause carries information; only minor cost is a slightly run-on structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the operation, the 160-character constraint, conditional parameters, and the downstream sync consequence, and an output schema exists so return values need no explanation. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter (article_id, meta_description, locale, website_id) is already documented in the schema with sourced ids and constraints. The description largely restates the locale and website_id semantics rather than adding new meaning, so the 3 baseline applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replaces the SEO meta description of an article') and immediately scopes the translation variant when locale is given. This cleanly distinguishes it from siblings like update_article_headline, update_article_slug, and update_article_cover_alt_text without requiring the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditional guidance: pass website_id when the account has several websites, and use locale to target a single translation. It also names sync_article_to_cms as the recovery path after editing published content, but does not broadly state when to prefer this tool over manual content edits or AI-driven SEO tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_article_slugUpdate article slugAIdempotentInspect
Changes the URL slug of an article; the value is normalised (lowercase, hyphens) and must be unique on the website. Translations share the parent slug, so there is no locale option. Editing an article that is already published (or published in draft) marks it Out of Sync until it is synced with sync_article_to_cms or published again. On a published article the old slug is kept as a redirect on the hosted blog only; other CMSs will serve a 404 on the old URL. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | New slug, e.g. "best-running-shoes". | |
| article_id | Yes | Article id from list_articles. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| locale | Yes | Translation locale the change applied to; null for the default-language article or a field shared by every locale. The other fields always describe the default-language article. |
| status | Yes | Raw status; status_label is the human reading. |
| message | Yes | What changed, e.g. "Headline updated for the fr version." |
| headline | Yes | |
| article_id | Yes | |
| created_at | Yes | |
| preview_text | Yes | First 200 characters of the body. |
| published_at | Yes | |
| status_label | Yes | Status as shown in the app, e.g. Published, Draft on CMS, Failed to publish. |
| is_out_of_sync | Yes | Edited since the last push to the CMS; sync_article_to_cms clears it. |
| main_image_url | Yes | Cover image URL. |
| target_keyword | Yes | |
| meta_description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a non-read-only, idempotent, non-destructive write. The description goes well beyond that, disclosing slug normalisation (lowercase/hyphens), website-wide uniqueness, shared parent slug for translations, the Out of Sync side effect on published articles, and differing redirect behavior (hosted blog keeps redirect, other CMSs 404). This is exactly the behavioral depth that earns a high score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph with the core action front-loaded and no filler sentences; every clause adds operational value. It could be marginally easier to scan if broken up, which keeps it just under a top mark.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation. The description covers the full set of things an agent must know before calling: normalisation, uniqueness constraint, translation/locale behaviour, side effects on published articles, and how to recover via sync_article_to_cms or republish.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains slug normalisation and uniqueness beyond the schema's bare example, clarifies there is no locale option (relevant to the slug parameter), and gives the conditional rule for website_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Changes the URL slug of an article') and immediately distinguishes itself from sibling mutators like update_article_content and update_article_headline by naming the exact field it touches. An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear scenario-based context: pass website_id when the account has several websites (pointing to get_account), and use sync_article_to_cms when a published article goes Out of Sync. It doesn't explicitly rule out alternative tools, but the when/why guidance is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_competitorsUpdate competitorsAIdempotentInspect
Replaces the website's competitor list (up to 10 entries of name + domain). Domains are normalized to their hostname and duplicates dropped. Pass the complete list you want to keep; an empty list clears it. When AI Visibility is active the tracked competitors are reconciled with this list. Returns the saved competitors. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| competitors | Yes | Full competitor list; it replaces the current one (max 10). |
Output Schema
| Name | Required | Description |
|---|---|---|
| website_id | Yes | |
| competitors | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors beyond annotations: domains are normalized to hostname, duplicates are dropped, the list replaces the current one, and an empty list clears it. It also mentions reconciliation with AI Visibility. Annotations already indicate idempotentHint=true and destructiveHint=false, and the description adds meaningful context about the replacement semantics and normalization.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core action ('Replaces the website's competitor list'), followed by key behaviors and usage guidance. Every sentence adds value, and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, replacement semantics, normalization, clearing behavior, AI Visibility reconciliation, return value, and website_id conditionality. With a rich schema and output schema present, nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds value by explaining the replacement semantics ('Pass the complete list you want to keep'), the empty-list clearing behavior, and the website_id conditionality. It doesn't add syntax details beyond the schema, but the behavioral context compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool replaces the website's competitor list with a complete list of up to 10 name+domain entries. It distinguishes itself from siblings by focusing on the competitor list update, which is unique among the listed tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use this tool: pass the complete list to keep, empty list clears it, and it mentions the reconciliation behavior when AI Visibility is active. It also provides guidance on when website_id is needed, referencing get_account for multi-website accounts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_content_settingsUpdate content settingsAIdempotentInspect
Partially updates the Content settings tab: default locale, target audiences, offer summary and custom writing instructions. Only the fields you pass change; target_audiences replaces the whole list. The default locale cannot be one of the website's additional translation locales. Changing the offer summary re-embeds the website profile. Returns the content section after the update. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| offer_summary | No | What the business sells, used to brief the writer. | |
| default_locale | No | Language of generated articles as a locale code such as en-US or fr-FR. | |
| target_audiences | No | Replaces the audience list. | |
| custom_instructions | No | Free-form writing instructions for every article. |
Output Schema
| Name | Required | Description |
|---|---|---|
| content | Yes | |
| website_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses key behaviors: only passed fields change, target_audiences replaces the entire list, the default locale constraint, the re-embedding side effect when changing the offer summary, and the return value. This is rich, non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: purpose and fields, partial-update behavior, critical constraint, side effect plus return value and website_id guidance. Information is front-loaded and efficiently packed without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations declare idempotence and non-destructiveness, the description covers all remaining operational details: partial updates, list replacement, locale constraint, side effects, return value, and multi-website handling. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes each parameter. The description adds meaningful semantics beyond the schema: partial update behavior, list replacement, the locale restriction, the re-embedding side effect, and website_id usage. This significantly helps an agent invoke parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb ('partially updates') and a specific resource ('Content settings tab'), then lists the exact fields involved. This clearly distinguishes it from sibling tools like update_general_settings and update_image_settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when and how to use the tool: partial update semantics, whole-list replacement for target_audiences, and when to pass website_id. It doesn't explicitly name alternatives, but the Content settings tab scope makes the distinction clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_general_settingsUpdate general settingsAIdempotentInspect
Partially updates the General settings tab: sitemap URL, skipping non-custom articles, owner cross-linking, automatic scheduling, daily publishing time and timezone, and optionally the organization name. Only the fields you pass change. autopublish_time and autopublish_timezone must end up both set or both null. Returns the general section after the update. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| group_name | No | Rename the organization (admin or owner only). | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| sitemap_url | No | Sitemap URL (with or without https://). Pass null to clear it. | |
| autopublish_time | No | Daily publishing time as HH:mm. Set autopublish_timezone with it; pass null on both to clear. | |
| autopublish_timezone | No | IANA timezone for autopublish_time, e.g. Europe/Paris. | |
| auto_schedule_enabled | No | Let the planner fill the calendar automatically. | |
| skip_non_custom_articles | No | When true only articles the user planned themselves are generated; automatic topics are skipped. | |
| enable_owner_cross_linking | No | Link between the websites the same owner runs. Only applied when the user is the owner. |
Output Schema
| Name | Required | Description |
|---|---|---|
| general | Yes | |
| website_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral detail beyond the annotations: only passed fields are changed, the autopublish pairing invariant, and the fact that the general section is returned after update. It also explains the website_id condition. This is consistent with the idempotentHint=true annotation and adds practical context without contradicting any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and information-dense: four sentences cover scope, partial-update behavior, an important invariant, return value, and a conditional parameter requirement. It is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 optional parameters and an output schema, the description sufficiently covers usage semantics, the pairing constraint, and the website_id disambiguation. The output schema handles return-value details, so nothing critical is missing for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description maps top-level concepts to parameters like sitemap_url, skip_non_custom_articles, enable_owner_cross_linking, and auto_schedule_enabled, but does not add meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Partially updates') on a specific resource ('the General settings tab') and enumerates the fields involved. This distinguishes it from sibling tools like update_content_settings and update_image_settings, and from read-only tools like get_website_settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: to update General settings fields, with a partial-update semantics and a precondition about autopublish_time and autopublish_timezone. It also provides website disambiguation guidance ('Pass website_id when the account has several websites'). It does not explicitly name alternatives or exclusions, but the usage context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_image_settingsUpdate image settingsAIdempotentInspect
Partially updates the Images settings tab: cover and inline image styles (sketch, photo_realistic, digital_illustration, cinematic_realism, polygon, pixel_art, packshot), brand color, cover and inline image instructions and inline images per post (0-3). Only the fields you pass change; the brand logo, the AI images vs media library choice and media variations can only be changed in the app. Returns the images section after the update. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| brand_main_color | No | ||
| image_generation_style | No | Cover image style; null resets to the default. | |
| inline_images_per_post | No | ||
| inline_image_generation_style | No | Inline image style; null resets to the default. | |
| cover_image_custom_instructions | No | ||
| inline_image_custom_instructions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| images | Yes | |
| website_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses meaningful behavioral details beyond the annotations: it is a partial/patch update ('Only the fields you pass change'), it lists settings that cannot be changed via the API, and it states the response is the updated images section. It also adds the website_id scoping nuance. There is no contradiction with the readOnlyHint, idempotentHint, or destructiveHint annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four information-dense sentences with no filler: field list, partial-update semantics, in-app-only restrictions, return value, and website_id caveat. Every sentence earns its place, and the most important scoping information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 7-parameter complexity and the presence of annotations plus an output schema, the description is complete enough for correct invocation. It covers which fields can be updated, which cannot, when website_id is required, and what is returned. No critical invocation context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 43%, but the description compensates by naming and explaining every parameter: cover and inline image styles with valid style values, brand color, cover and inline image instructions, inline images per post range (0-3), and the website_id condition. It also clarifies partial-update semantics, which is critical for understanding how parameters interact.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Partially updates the Images settings tab' and enumerates the exact updatable fields (styles, brand color, instructions, inline images per post). This clearly differentiates it from sibling tools like update_general_settings and update_content_settings. It does not merely restate the tool's name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: this tool is for the Images settings tab and includes a when-not condition by noting that brand logo, AI images vs media library choice, and media variations can only be changed in the app. It also gives the conditional website_id guideline ('Pass website_id when the account has several websites') and points to get_account. It does not explicitly name sibling alternatives for non-image settings, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_scheduled_articleUpdate a scheduled articleAIdempotentInspect
Edits the headline, brief, target keyword or products of a pending scheduled article; omitted fields keep their current value and keyword_id=null clears the keyword. Refuses rows that were already generated (edit the generated article instead). To change the date use reschedule_article. Returns the updated row. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| brief | No | Content brief the writer follows: angle, must-cover points, tone, audience, sources. | |
| headline | No | ||
| keyword_id | No | Keyword id from the keywords tools. One scheduled article per keyword. | |
| website_id | No | Website id from get_account. Optional when the account has a single website. | |
| product_ids | No | Product ids to feature in the article (max 3). Unknown ids are dropped. | |
| scheduled_article_id | Yes | Scheduled article id from list_scheduled_articles. |
Output Schema
| Name | Required | Description |
|---|---|---|
| brief | Yes | Writing brief the article follows. |
| headline | Yes | |
| is_custom | Yes | true when the user planned the article; false for automatic topics. |
| created_at | Yes | |
| product_ids | Yes | |
| is_generated | Yes | true once the article was written; generated rows can no longer be edited. |
| scheduled_at | Yes | Generation date, YYYY-MM-DD. |
| target_keyword | Yes | |
| target_keyword_id | Yes | |
| generated_article_id | Yes | Article id once generated, for the articles tools. |
| scheduled_article_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description discloses meaningful behavior: omitted fields retain their values, keyword_id=null clears the keyword, generated rows are refused, and the updated row is returned. This gives an agent a clear model of the operation's side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it opens with the core edit operation and the most important semantic (omitted fields keep current values), then covers exclusions and alternatives in short, separate sentences. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description completes the context needed for correct invocation: it explains behavior for edge cases (generated rows, null keyword, multi-website), returns the updated row, and routes date changes elsewhere. No essential guidance is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 83%, the description adds high-value semantics not in the schema: the partial-update merge behavior, the null-clearing effect of keyword_id, the refusal on already-generated rows, and the need to pass website_id for multi-website accounts. This materially improves parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Edits'), a resource ('a pending scheduled article'), and the exact fields affected (headline, brief, target keyword, products). It also differentiates from siblings like reschedule_article and update_article_content by naming them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: only pending scheduled articles, and routes already-generated rows to 'edit the generated article instead.' It also names the alternative for date changes (reschedule_article) and the website_id prerequisite when an account has multiple websites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_article_imageUpload an article imageAInspect
Hosts an image on the website's media host for use inside an article body, either downloaded from a public URL (image_url) or uploaded from the user's machine (upload_id, see create_image_upload). Returns the hosted URL: reference it in markdown as and save the body with update_article_content. Does not change the article by itself. Free. Pass website_id when the account has several websites (see get_account).
| Name | Required | Description | Default |
|---|---|---|---|
| image_url | No | Public http(s) URL of the image to download (JPEG, PNG, WebP, GIF or AVIF, 4 MB max). For a file on the user's machine, pass upload_id instead. | |
| upload_id | No | upload_id returned by create_image_upload, once the file has been sent to its upload_url. Alternative to image_url for files on the user's machine (10 MB max). | |
| article_id | Yes | Article the image belongs to (it is stored under that article). | |
| website_id | No | Website id from get_account. Optional when the account has a single website. |
Output Schema
| Name | Required | Description |
|---|---|---|
| image_url | Yes | Hosted URL to reference in the markdown body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint: false, etc.), the description discloses key behaviors: 'Does not change the article by itself' (so the agent knows a separate call is needed), 'Returns the hosted URL' with a specific markdown usage, and 'Free' (cost implications). This adds meaningful behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-organized paragraph that front-loads the core action, then details modes, return value, side-effect caveat, cost, and conditional parameter. Every sentence earns its place—no fluff, no repetition. It is concise yet comprehensive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters and an output schema, the description covers the full workflow: how to host (two methods), what to do with the returned URL, that the article isn't modified directly, the cost implication, and when the optional website_id matters. It also references the related tools needed for setup (create_image_upload) and follow-up (update_article_content). Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial semantics: it explains the two mutually exclusive input modes (image_url vs upload_id), points to create_image_upload for obtaining upload_id, and clarifies that article_id determines storage and website_id is conditional on account type. These enrich the schema definitions, making the parameters easier to use correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Hosts an image on the website's media host for use inside an article body.' This clearly distinguishes it from siblings like set_article_cover_image (which handles cover images) and create_image_upload (which only creates an upload session). The purpose is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use each parameter mode: image_url for public URLs, upload_id for local files (with a reference to create_image_upload). It also states when website_id is required (multi-website accounts, see get_account) and provides the follow-up action ('save the body with update_article_content'). This gives an agent clear routing and workflow guidance without ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
- Changed
create_hosted_blog3 fields changed- added
Output schema / properties / next_stepAdded value: +{ + "description": "What to do next for the current status: records to add, DNS and SSL wait times, or the article URL pattern once connected.", + "type": "string" +} - added
Output schema / properties / registrar_warningAdded value: +{ + "description": "Instruction specific to the detected DNS provider to follow when adding the records; null when none applies.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / requiredPrevious value: -[ - "config_id", - "website_id", - "hostname", - "blog_url", - "status", - "status_label", - "is_connected", - "dns_records", - "last_error", - "registrar", - "dns_verified_at", - "ssl_provisioned_at", - "created_at", - "updated_at", - "dashboard_url" -]New value: +[ + "config_id", + "website_id", + "hostname", + "blog_url", + "status", + "status_label", + "is_connected", + "dns_records", + "last_error", + "registrar", + "dns_verified_at", + "ssl_provisioned_at", + "created_at", + "updated_at", + "dashboard_url", + "registrar_warning", + "next_step" +]
- Changed
get_article3 fields changed- changed
Output schema / properties / includes_content / descriptionPrevious value: -"true when the markdown body is in the text content."New value: +"true when markdown_content holds the body." - added
Output schema / properties / markdown_contentAdded value: +{ + "description": "The article body in markdown when include_content=true, null otherwise.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / requiredPrevious value: -[ - "article_id", - "headline", - "slug", - "status", - "status_label", - "created_at", - "published_at", - "is_out_of_sync", - "meta_description", - "preview_text", - "main_image_url", - "target_keyword", - "website_id", - "dashboard_url", - "last_updated_at", - "is_on_cms", - "excerpt", - "main_image_description", - "main_image_alt", - "target_keyword_id", - "default_locale", - "locale", - "translations", - "includes_content" -]New value: +[ + "article_id", + "headline", + "slug", + "status", + "status_label", + "created_at", + "published_at", + "is_out_of_sync", + "meta_description", + "preview_text", + "main_image_url", + "target_keyword", + "website_id", + "dashboard_url", + "last_updated_at", + "is_on_cms", + "excerpt", + "main_image_description", + "main_image_alt", + "target_keyword_id", + "default_locale", + "locale", + "translations", + "includes_content", + "markdown_content" +]
- Changed
get_hosted_blog_status3 fields changed- added
Output schema / properties / next_stepAdded value: +{ + "description": "What to do next for the current status: records to add, DNS and SSL wait times, or the article URL pattern once connected.", + "type": "string" +} - added
Output schema / properties / registrar_warningAdded value: +{ + "description": "Instruction specific to the detected DNS provider to follow when adding the records; null when none applies.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / requiredPrevious value: -[ - "config_id", - "website_id", - "hostname", - "blog_url", - "status", - "status_label", - "is_connected", - "dns_records", - "last_error", - "registrar", - "dns_verified_at", - "ssl_provisioned_at", - "created_at", - "updated_at", - "dashboard_url" -]New value: +[ + "config_id", + "website_id", + "hostname", + "blog_url", + "status", + "status_label", + "is_connected", + "dns_records", + "last_error", + "registrar", + "dns_verified_at", + "ssl_provisioned_at", + "created_at", + "updated_at", + "dashboard_url", + "registrar_warning", + "next_step" +]
- Changed
sync_article_to_cms3 fields changed- added
Output schema / properties / localeAdded value: +{ + "description": "Translation locale the change applied to; null for the default-language article or a field shared by every locale. The other fields always describe the default-language article.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / messageAdded value: +{ + "description": "What changed, e.g. \"Headline updated for the fr version.\"", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "article_id", - "headline", - "slug", - "status", - "status_label", - "created_at", - "published_at", - "is_out_of_sync", - "meta_description", - "preview_text", - "main_image_url", - "target_keyword" -]New value: +[ + "article_id", + "headline", + "slug", + "status", + "status_label", + "created_at", + "published_at", + "is_out_of_sync", + "meta_description", + "preview_text", + "main_image_url", + "target_keyword", + "message", + "locale" +]
- Changed
update_article_cover_alt_text3 fields changed- added
Output schema / properties / localeAdded value: +{ + "description": "Translation locale the change applied to; null for the default-language article or a field shared by every locale. The other fields always describe the default-language article.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / messageAdded value: +{ + "description": "What changed, e.g. \"Headline updated for the fr version.\"", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "article_id", - "headline", - "slug", - "status", - "status_label", - "created_at", - "published_at", - "is_out_of_sync", - "meta_description", - "preview_text", - "main_image_url", - "target_keyword" -]New value: +[ + "article_id", + "headline", + "slug", + "status", + "status_label", + "created_at", + "published_at", + "is_out_of_sync", + "meta_description", + "preview_text", + "main_image_url", + "target_keyword", + "message", + "locale" +]
- Changed
update_article_headline3 fields changed- added
Output schema / properties / localeAdded value: +{ + "description": "Translation locale the change applied to; null for the default-language article or a field shared by every locale. The other fields always describe the default-language article.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / messageAdded value: +{ + "description": "What changed, e.g. \"Headline updated for the fr version.\"", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "article_id", - "headline", - "slug", - "status", - "status_label", - "created_at", - "published_at", - "is_out_of_sync", - "meta_description", - "preview_text", - "main_image_url", - "target_keyword" -]New value: +[ + "article_id", + "headline", + "slug", + "status", + "status_label", + "created_at", + "published_at", + "is_out_of_sync", + "meta_description", + "preview_text", + "main_image_url", + "target_keyword", + "message", + "locale" +]
- Changed
update_article_meta_description3 fields changed- added
Output schema / properties / localeAdded value: +{ + "description": "Translation locale the change applied to; null for the default-language article or a field shared by every locale. The other fields always describe the default-language article.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / messageAdded value: +{ + "description": "What changed, e.g. \"Headline updated for the fr version.\"", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "article_id", - "headline", - "slug", - "status", - "status_label", - "created_at", - "published_at", - "is_out_of_sync", - "meta_description", - "preview_text", - "main_image_url", - "target_keyword" -]New value: +[ + "article_id", + "headline", + "slug", + "status", + "status_label", + "created_at", + "published_at", + "is_out_of_sync", + "meta_description", + "preview_text", + "main_image_url", + "target_keyword", + "message", + "locale" +]
- Changed
update_article_slug3 fields changed- added
Output schema / properties / localeAdded value: +{ + "description": "Translation locale the change applied to; null for the default-language article or a field shared by every locale. The other fields always describe the default-language article.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / messageAdded value: +{ + "description": "What changed, e.g. \"Headline updated for the fr version.\"", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "article_id", - "headline", - "slug", - "status", - "status_label", - "created_at", - "published_at", - "is_out_of_sync", - "meta_description", - "preview_text", - "main_image_url", - "target_keyword" -]New value: +[ + "article_id", + "headline", + "slug", + "status", + "status_label", + "created_at", + "published_at", + "is_out_of_sync", + "meta_description", + "preview_text", + "main_image_url", + "target_keyword", + "message", + "locale" +]
1 tool update
- Added
query_search_console
60 tool updates
- First observed
add_keywords - First observed
batch_edit_articles_with_ai - First observed
check_article_seo_score - First observed
check_backlinks - First observed
check_domain_rating - First observed
check_keyword_density - First observed
check_seo_score - First observed
connect_custom_webhook - First observed
convert_credits_to_backlink_credits - First observed
create_hosted_blog - First observed
create_image_upload - First observed
delete_keywords - First observed
delete_scheduled_article - First observed
edit_article_with_ai - First observed
expand_keyword_cluster - First observed
find_keyword_cannibalization - First observed
get_account - First observed
get_advanced_seo_report - First observed
get_ai_visibility - First observed
get_article - First observed
get_backlinks_overview - First observed
get_credit_balance - First observed
get_hosted_blog_status - First observed
get_keyword - First observed
get_keyword_rankings - First observed
get_keyword_trends - First observed
get_webhook_contract - First observed
get_website_settings - First observed
get_website_setup_guide - First observed
improve_article_seo - First observed
improve_content_seo - First observed
list_articles - First observed
list_integrations - First observed
list_keywords - First observed
list_scheduled_articles - First observed
publish_article - First observed
refresh_keyword_metrics - First observed
regenerate_headlines - First observed
reschedule_article - First observed
research_keywords - First observed
run_advanced_seo_check - First observed
run_advanced_seo_check_for_content - First observed
schedule_article - First observed
schedule_articles_for_keywords - First observed
set_article_cover_image - First observed
set_keyword_favorite - First observed
suggest_headline - First observed
sync_article_to_cms - First observed
test_custom_webhook - First observed
update_article_content - First observed
update_article_cover_alt_text - First observed
update_article_headline - First observed
update_article_meta_description - First observed
update_article_slug - First observed
update_competitors - First observed
update_content_settings - First observed
update_general_settings - First observed
update_image_settings - First observed
update_scheduled_article - First observed
upload_article_image
Related MCP Connectors
Turns SEO insight into page changes: keyword research, SERP and rank data, rewrites you approve.
Full-cycle SEO automation for AI agents: technical audits, SEO articles, machine-readable pricing.
Autonomous SEO + GEO growth: keyword research, audits, content, AI answer-engine visibility.
SEO, competitor and AI-search data, plus blog management — draft, schedule and publish posts.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceRun the full agency SEO loop from your AI assistant: Search Console insights, prioritized actions, article generation, CMS publishing, indexing, and performance measurement.MIT
- AlicenseNot gradedqualityAmaintenanceRuns AI readiness audits, Google Search Console reporting, keyword research and SEO article drafting, putting every draft into a human review queue instead of publishing it.2AGPL 3.0

TopicForgeofficial
AlicenseNot gradedqualityDmaintenanceSEO articles that sound like your brand — not generic AI output. TopicForge runs a four-stage pipeline — outline, draft, voice, and CTA — to turn topics into publish-ready articles with FAQ schema, meta, and editorial guardrails.768 npmMIT- AlicenseNot gradedqualityBmaintenanceTurn Claude Code into your SEO manager with keyword research, content pipeline that ships pull requests, rank tracking, and a dashboard.2 npm81AGPL 3.0
Glama MCP Gateway
Add one secure layer between your agents and this server.