Skip to main content
Glama

Server Details

Free Google Search Console MCP: your real GSC, Google Analytics and keyword data for AI agents.

Ownership verified
Status
Healthy
Uptime
98.7% over 24 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
iannuttall/seo
GitHub Stars
607
Server Listing
seoskill
ChatGPT
–
Claude
–

TDQS

A3.8/5.0

Scored across 8 tools

Disambiguation3/5

seo_report, seo_compare, seo_data, and seo_page all surface Search Console performance data with overlapping scopes. The descriptions provide usage guidance, but an agent must still choose among several broad retrieval tools that can answer similar questions. seo_lint, seo_research, and seo_sites are clearly distinct.

Naming Consistency4/5

All tools use a consistent seo_ snake_case prefix, making the namespace predictable. The only minor deviation is that most names are nouns (seo_report, seo_data, seo_page) while two are verbs (seo_compare, seo_lint), but this is still readable and consistent.

Tool Count5/5

Eight tools is well within a reasonable range for a rich SEO analysis server. Each tool maps to a distinct workflow area: setup, reporting, comparison, raw data, page inspection, indexing, copy linting, and external research.

Completeness4/5

The surface covers setup, weekly auditing, Search Console/GA/Bing reporting, indexing diagnostics, content linting, and external keyword/backlink research. Minor gaps remain around dedicated technical crawling or content brief generation, but core SEO workflows are well covered.

Available Tools

8 tools
seo_compareBefore and after a dateA
Read-only
Inspect

Compares equal periods before and after a date, such as a site change or a Google update: totals, devices, and the pages and queries that moved, Google Analytics sessions from the property whose web stream matches the site, and Google updates in the window. Optional pages narrows it to URLs that contain that text, such as /blog/.

NameRequiredDescriptionDefault
dateYesYYYY-MM-DD: the first day after the change.
siteYesSearch Console property or site, such as sc-domain:example.com, https://example.com/ or example.com.
pagesNoOptional URL text, such as /blog/.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds meaningful behavioral scope by enumerating exactly what the comparison returns (totals, devices, moved pages/queries, matching-property GA sessions, in-window Google updates), which the annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core operation, and the follow-up sentence handles the optional parameter. The first sentence is dense with comma-separated output clauses but each clause carries information, so there is no obvious waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description appropriately shoulders the burden by describing the return contents, and it covers all three parameters plus the triggering context. It omits pagination/format details but nothing critical for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 goes beyond the schema by clarifying 'pages' semantics for filtering ('narrows it to URLs that contain that text, such as /blog/'), which adds interpretation value on top of the schema's 'Optional URL text' wording.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: it 'compares equal periods before and after a date' and enumerates the outputs (totals, devices, moved pages/queries, GA sessions, Google updates). The comparison operation is distinctive, but no sibling (e.g., seo_data or seo_report) is named, so the differentiation is implied rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete triggering contexts ('a site change or a Google update'), which tells the agent when this tool is the right choice. It stops short of naming an alternative tool or stating when not to use it, so it does not reach the 5 level.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

seo_dataRaw rowsA
Read-only
Inspect

Raw rows for questions the report does not answer. search_console (default): rows for any dimensions, each with the previous period and the change; page and query narrow to rows whose URL or query contains that text. google_analytics: landing pages for visits from search, with Google Analytics’ own metric names. bing: Bing Webmaster query or page rows (first dimension) for the same site, by week. clicky: landing-page visits, traffic sources and search engines from a Clicky site the person saved (site is its domain or Clicky site ID; at most 31 days).

NameRequiredDescriptionDefault
pageNosearch_console only: URL text, such as /blog/.
siteYessearch_console and bing: the property or site. google_analytics: numeric property id from seo_sites. clicky: the site or its Clicky site ID.
queryNosearch_console only: query text.
detailNosummary first. rows: the next page of rows. full: every field as JSON.summary
offsetNorows only: the first row to return.
sourceNosearch_console
end_dateNoYYYY-MM-DD. Optional.
dimensionsNosearch_console; bing uses the first, query or page.
start_dateNoYYYY-MM-DD. Optional; without end_date it runs to the latest final day.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint and openWorldHint, so the description carries the real burden and does well: it discloses the Clicky 31-day window, that Bing rolls up by week, that search_console rows include previous-period comparison, and that GA uses its own metric names rather than the tool's. It does not mention rate limits, quota, or upstream API failure behavior, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is one paragraph, front-loaded with the differentiator before the per-source detail, and each source sentence adds distinct information rather than restating the schema. It is dense and could be split into bullets, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nine-parameter, four-source read tool with no output schema and thin annotations, the description covers the essentials an agent needs: which source yields what, source-specific constraints (Clicky's 31-day cap, Bing's weekly grain and single dimension), and what a search_console row contains. Remaining mechanics (paging, detail levels) are fully documented in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 89%, so the baseline is 3, and the description earns above that by clarifying matching semantics ('page and query narrow to rows whose URL or query contains that text' – substring, not exact), that Bing only consumes the first dimension, and that Clicky's site may be a domain or site ID. The 'detail' enum's summary/rows/full progression and offset paging are left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line ('Raw rows for questions the report does not answer') frames it as the raw-data counterpart to the report, and each subsequent sentence specifies exactly what rows come back per source (search console dimensions, GA landing pages, Bing query/page by week, Clicky visits). An agent can distinguish it from seo_report, though the other siblings (seo_page, seo_research, seo_sites) are never named as alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for questions the report does not answer' gives an explicit selection rule against the report tool, and the per-source clauses imply when each source applies. However, there is no guidance on when to prefer seo_page or seo_research, and no statement of what this tool cannot do.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

seo_indexGoogle indexing reasons and pages that lost their clicksA
Read-only
Inspect

Google’s indexing reasons for 100 known URLs a run in a fixed order (lost-click pages, Search Console pages by clicks then impressions, sitemap URLs, then the rest), each checked live and labelled fix, check, expected or indexed from the evidence, sorted by reason then URL. Use it for a first baseline and then weekly: keep the full result and compare by URL and reason to find new reasons. Also: Pages that had at least 3 clicks in the previous 28 days and kept 20% or less of them in the last 28 days, with a live check of the top 20 and Google’s index status for the top 10 and the home page.

NameRequiredDescriptionDefault
siteYesSearch Console property or site, such as sc-domain:example.com, https://example.com/ or example.com.
detailNosummary first. rows: the next page of rows. full: every field as JSON.summary
offsetNorows only: the first row to return.
end_dateNoYYYY-MM-DD. Optional.
start_dateNoYYYY-MM-DD. Optional; without end_date it runs to the latest final day.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover readOnly and openWorld, so the description carries the rest and does deliver: it discloses a live check per URL (a costly, outbound operation), a 100-URL cap, sampling depth of top 20 live checks and top 10 for index status, and the 3-click/20%-retention threshold. It omits expected latency or failure behavior for the live checks, which keeps it off a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence carries content, but the structure is weak: an awkward fragment ('100 known URLs a run in a fixed order'), then a second feature tacked on with a bare 'Also:', and the baseline instruction buried mid-paragraph. The two distinct outputs should be split, and the primary action front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must explain returns and does – labels (fix/check/expected/indexed), sort order, and the lost-click cohort definition. Only the paging contract of detail/offset is left entirely to the schema, which is acceptable given 100% parameter coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 meaning on top by tying the 28-day windows to start_date/end_date semantics and by advising the agent to keep the 'full' result for later comparison, which gives the detail parameter operational intent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource domain – Google indexing reasons for up to 100 known URLs plus lost-click pages – with enough detail (fixed ordering, labelling, sorting) that an agent can tell what it returns. It never names a verb like 'fetch' or 'list' and never references any sibling tool, so differentiation comes only from the domain wording.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit timing guidance: use for a first baseline and then weekly, keep the full result, and compare by URL and reason to detect new reasons. That is concrete usage context, but no sibling alternative (e.g. seo_compare or seo_report) is named for related tasks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

seo_lintCheck copy for AI writing patternsA
Read-only
Inspect

Checks landing page copy, blog posts, titles and meta descriptions for patterns common in AI-written text (such as "isn't X, it's Y" reframes, ", not X" contrasts, two-beat fragments, stock idioms and kicker lines), weak copy (dash punctuation, buzzwords, vague link text) and SEO rules (title 30 to 60 characters, description 70 to 160, one H1). Each error and warning has a line, the words, and a concrete fix. Each finding has a category (ai, copy or seo); only limits the check, such as only ["ai"] to leave out house style like dashes. Review items are judgement calls for you: read each quote and change it only when it fails the question. A url checks the main content of a live page (CLI and local MCP only). It reads no accounts.

NameRequiredDescriptionDefault
urlNoOptional instead of text: a live page. Its main content is extracted as Markdown (as seo_page with detail full shows it) and checked with the blog preset. Only the CLI and the local MCP server read pages.
onlyNoOptional categories to check: ai (patterns common in AI-written text), copy (weak copy and house style, such as dashes) or seo (titles, descriptions, headings). Default: all.
textNoThe copy to check: a page, post, title or description, up to 200,000 characters. Markdown, MDX or HTML as written, so line numbers match.
rulesNoOptional. true lists every rule with its id, category, level and description instead of checking text; only limits the list, such as only ["ai"].
formatNoOptional. md (default for text), mdx, html, astro or text. Code, tags and URLs are skipped; captions and titles are checked.
presetNoOptional. blog (default for Markdown), landing (default for HTML: stricter on buzzwords, weak links and claims with no number), docs, or meta (one title or description per line; start a line with "title:" or "description:" to say which).
meta_kindNoOptional, with the meta preset: title or description, what a line with no "title:" or "description:" label is. Default: a line up to 70 characters is a title, a longer one a description.
ignore_rulesNoOptional rule ids or review lenses to skip.
ignore_phrasesNoOptional phrases to allow, such as a product name a rule keeps matching.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond readOnlyHint/openWorldHint, it discloses what findings look like (line, the words, a concrete fix, a category), how review items differ from errors and warnings, and that no accounts are read. It also flags an environment constraint the annotations do not carry: url fetching works only in CLI and local MCP.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and every clause carries content, but the opening sentence is a long, heavily parenthesized enumeration that takes effort to parse. The trailing 'It reads no accounts' is terse but useful; overall dense rather than wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With nine parameters and no output schema, the description compensates by explaining the shape of results (per-finding line, quoted words, fix, category) and the review-item distinction. It also covers the environment restriction on url and the default-preset behavior, which is everything an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented, and the description mostly restates those semantics (the 'only ["ai"]' example, the url/CLI caveat). It adds little syntax or format detail the schema does not already supply, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Checks landing page copy, blog posts, titles and meta descriptions') and enumerates the three finding families (AI patterns, weak copy, SEO rules). An agent can tell instantly this is a copy-linting tool, distinct from siblings like seo_page (extraction) or seo_compare.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear operational context: use 'only' to skip a category such as house-style dashes, use 'url' instead of 'text' for a live page, and treat review items as judgement calls to read and apply only when they fail the stated question. It stops short of explicitly naming an alternative sibling (e.g. seo_page for extraction), so the when-not guidance is implied rather than complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

seo_pageOne pageA
Read-only
Inspect

Everything for one URL: live page facts (status, redirect, title, description, H1, canonical, robots), Google’s index status from URL Inspection, and the page’s Search Console queries against the previous period.

NameRequiredDescriptionDefault
urlYes
detailNosummary first. rows: the next page of rows. full: every field as JSON.summary
offsetNorows only: the first row to return.
end_dateNoYYYY-MM-DD. Optional.
start_dateNoYYYY-MM-DD. Optional; without end_date it runs to the latest final day.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as a read-only, open-world operation. The description adds useful provenance and freshness context by naming 'live page facts', Google’s index status from URL Inspection, and previous-period comparison, but it does not disclose auth requirements, rate limits, or how the sources are combined.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence that immediately establishes the scope and then lists the three returned datasets. It is dense but every clause contributes directly to understanding the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter aggregation tool without an output schema, the description sufficiently enumerates the data domains the agent will receive. It could say more about how the period and detail modes interact, but the schema covers those mechanics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high at 80%, so the schema already documents url, detail, offset, start_date, and end_date. The description does not add format or selection guidance beyond what the schema provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the resource scope (one URL) and enumerates the three data domains returned: live page facts, Google index status, and Search Console queries. It is specific about contents, but it does not explicitly distinguish this aggregate view from siblings such as seo_index or seo_data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Everything for one URL' implies this is the single-URL deep-dive tool, but there is no explicit guidance on when to choose it over seo_index, seo_data, or seo_compare. Usage is inferable but not directed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

seo_reportSearch Console reportA
Read-only
Inspect

Start here. Without site: a short summary of every site in the person's weekly site audit (beta) for last week, with each site's Google index, weekly crawl and search clicks, sites with changes first, ending with the site to ask about next; an account outside that beta gets its site list to pick from. With site: the main report for that Search Console property, the overview plus each section's row count and top rows. With site and section: that section's rows; page sections also check their top 20 URLs live. Sections:

  • overview: Site totals (clicks, impressions, CTR, position) against the previous period, by device, with the top pages and queries and their change, and Google Analytics sessions for the same dates from the property whose web stream matches the site.

  • quick-wins: Query and page pairs at average positions 4 to 10 with a click-through rate below the site’s own curve for that position.

  • low-ctr: Query and page pairs at average positions 1 to 4 with a click-through rate below the site’s own curve: titles and snippets to review with the person.

  • striking-distance: Queries just outside the top positions, with impressions, for pages that already rank.

  • second-page: Pages with an average position of 11 to 20 and their queries.

  • content-decay: Query and page pairs that lost clicks against the previous period.

  • cannibalization: Queries where more than one page of the site gets impressions, with each page’s share.

  • traffic-drop: Daily clicks and impressions checked for a sudden change that lasted, with the date it started (else the last 7 days against the days before), and Google updates within 3 days of that date. Overlap is timing only, not cause.

  • ai-queries: Queries with the shape of AI conversations and agent searches (replies such as "yes go on", follow-ups, agent prompts, search operators, chat phrasing, ten or more words), with rewordings grouped into one question and its top page, impressions, clicks and position. A heuristic: Search Console does not mark AI Mode.

  • bing: Bing’s top queries from Bing Webmaster Tools with Google’s clicks, impressions and position for the same query beside them, and the same for pages.

  • issues: A list kept for the site between sessions: issues the striking-distance, low-ctr and quick-wins checks found (and the weekly crawl and Google index checks for an audited site), each with its id, the latest check and what the person marked it (open, fixed or ignored). A fixed page, or query on a page, gets its Search Console clicks and impressions for the 28 and 56 days from the day it was marked fixed against the same days before, once final data covers them. Asking for it runs those checks again. To mark issues, add mark and issues instead of section. The hosted server keeps the list only for sites in the weekly site audit; for any other site it returns the list as JSON for the agent to save and pass back as saved.

  • google-updates: One Google ranking update (core, spam and similar, from Google’s Search Status Dashboard) laid over the site’s Search Console data: clicks and impressions from the day it started against the same number of days just before (whole weeks, up to 28 days), whether that change is outside the site’s own movement in the 8 comparisons before it (a heuristic), and the folders, pages and queries that gained or lost most. The latest update by default; with end_date, the latest update that started on or before it. Timing only, not cause. With site, mark and issues: records what the person decided about those issue ids (fixed, ignored, or open to undo) and runs no checks.

NameRequiredDescriptionDefault
markNoOptional, with site and issues: fixed, ignored, or open to undo. Only when the person says so.
noteNoOptional, with mark: why, in the person’s words.
siteNoLeave it out for the summary of every audited site (weekly site audit beta). Otherwise a Search Console property or site, such as sc-domain:example.com, https://example.com/ or example.com.
savedNoOptional, with section issues or mark, only where this server is not storing the list: the JSON the issues section returned last time, as the agent saved it.
detailNosummary first. rows: the next page of rows. full: every field as JSON.summary
issuesNoWith mark: issue ids from the issues section, comma-separated.
offsetNorows only: the first row to return.
sectionNoOptional, needs site. Leave it out first; then ask for one section.
end_dateNoYYYY-MM-DD. Optional.
start_dateNoYYYY-MM-DD. Optional; without end_date it runs to the latest final day.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint and openWorldHint, and the description adds substantial behavior beyond that: page sections check their top 20 URLs live, asking for issues re-runs the striking-distance/low-ctr/quick-wins checks, and several sections are explicitly labeled heuristics (ai-queries, traffic-drop, google-updates "timing only, not cause"). One gap keeps it from higher: the mark path "records what the person decided" and the hosted server "keeps the list between sessions," which is persistent state mutation under a readOnlyHint=true annotation — the description should reconcile that rather than leave the agent to notice it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The bulleted section list is well structured and each section line carries real information. The opening is the problem: a single dense sentence packs all three calling modes, the beta behavior, and the fallback site-list case into one unbroken clause, making the most important routing rule the hardest part to parse. It is long but not padded — the cost is legibility, not filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, zero-required, multi-mode tool with no output schema, the description does the heavy lifting on return content, describing what each section yields (row counts and top rows, per-page share, comparison windows, 28/56-day before-and-after windows). Remaining gaps are date-range scoping across sections and pagination, both delegated to schema descriptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 earns above that by giving meaning the enum values cannot — what each of the twelve sections actually computes, when mark/issues replaces section, what saved contains and why it exists, and what end_date does to google-updates. It does not clarify how start_date/end_date interact with individual sections, which is left implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is unusually specific about the verb and resource: it enumerates three calling modes (no site = cross-site weekly audit summary, site = main property report, site+section = one section's rows) and defines all twelve sections by what each computes. An agent knows exactly what the tool returns in each mode. It loses a point only because it never distinguishes itself from the six sibling tools (seo_data, seo_page, seo_index, seo_lint, seo_research, seo_compare), several of which plainly overlap on sections like google-updates and issues.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Start here" establishes entry-point ordering, and the description gives explicit sequencing rules: run without site first, then with site, then request one section; add mark and issues instead of section to record decisions; end_date selects an earlier google-updates entry. The gate that issues only persists for audited sites and otherwise returns JSON for the agent to save is spelled out. What is missing is when NOT to use this tool and which sibling to reach for instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

seo_researchKeyword, competitor, backlink and AI answer dataA
Read-only
Inspect

Data from the person’s own DataForSEO or Ahrefs account, which costs them credits. It uses the key the person saved on their seoskill.dev account (or on this machine for the CLI). Actions: provider is optional: without it the call uses the saved key, DataForSEO when both are saved. The target is a domain (the whole site), a path ending in / such as example.com/blog/ (every URL under it), or one page; scope overrides that. keyword_metrics (keywords: volume, difficulty, CPC), keyword_ideas (up to 5 seed keywords: searches that contain each seed, by volume), ranked_keywords (target: keywords a site, subfolder or page ranks for, with the provider's traffic total for the whole target), top_pages (target: the pages with the most estimated organic traffic), serp (keywords, up to 5: the ranking pages, each with its domain's authority: DataForSEO domain_rank 0 to 100, Ahrefs domain_rating; depth sets results per keyword, default 20; rows run position by position across the keywords), serp_overlap (2 to 10 keywords: for each pair, how many of their top 10 pages and sites are the same, to decide one page or several; results without a real page are counted, not compared), competitors (target: domains that share keywords), backlinks (target: referring domains), pages_by_backlinks (target: the pages with the most referring domains), link_gap (target and 2 to 5 competitors: referring domains that link to two or more competitors and not the target, highest authority first, from each site's top 1,000 referring domains; costs one backlinks call per site), ai_answers (DataForSEO only; target: the site. Without keywords it takes the site’s top 10 chat-style and long questions from Search Console’s AI-shaped queries itself. With up to 10 questions in keywords it asks those instead, and the target can be any domain, such as a competitor's. Each answer row also lists the other sites it cites, and the notes rank them. Answers come from DataForSEO's queue: answers not ready after about 40 seconds are returned as tasks, already paid for; call again with the same target and those tasks to read them at no cost. It asks ChatGPT search, Google AI Mode and Google AI Overviews each one and says whether the answer cites or mentions the site. DataForSEO’s queue prices are about $0.0072 a question across the three engines, so about $0.07 a run: tell the person before running it). Rows with a domain, and the target, get a free Ahrefs domain_rating column. Numbers are provider estimates, not Search Console data.

NameRequiredDescriptionDefault
alsoNoai_answers only: the brand's other domains, such as claude.ai beside claude.com. A citation to any of them counts as citing the target.
brandNoai_answers only: the brand names that count as a mention, such as Datadog for datadoghq.com. Default: each domain's name.
depthNoserp only: results per keyword, default 20. Deeper costs more.
scopeNoOptional: domain, prefix or exact, to read the target another way than its shape says.
tasksNoai_answers only: the tasks an earlier run returned as not ready, to read back at no cost.
actionYes
detailNosummary first. rows: the next page of rows. full: every field as JSON.summary
offsetNorows only: the first row to return.
targetNoDomain (the whole site), a path ending in / for every URL under it, such as example.com/blog/, or one page.
countryNoTwo-letter country code.us
keywordsNo
providerNoOptional. Without it, the saved key; DataForSEO when both are saved.
competitorsNolink_gap only: 2 to 5 competitor domains.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and openWorldHint annotations, the description discloses that calls consume the user's paid provider credits, explains provider key fallback behavior, details the ai_answers queue and paid-task retry mechanism, and gives a concrete cost estimate with an instruction to warn the user. These are exactly the behavioral traits annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single very long, dense paragraph that buries the action-by-action semantics in run-on prose. Most sentences carry useful information, but structure and scannability suffer, and the opening cost/account context precedes the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter, multi-action tool with no output schema, the description covers every action, the cost model, provider behavior, async queue handling, and how rows and citations are returned. An agent has enough information to select an action and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is already 85%, the description adds substantial meaning beyond field-level definitions: target shape controls scope, scope overrides target shape, keywords vary by action with different limits, competitors applies only to link_gap, and tasks/also/brand apply only to ai_answers. It also explains how depth and per-action row outputs behave.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource (DataForSEO/Ahrefs SEO data) and enumerates the actions it can perform with clear per-action scope. It does not distinguish itself from sibling tools such as seo_compare or seo_report, but the purpose is otherwise unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is explained action by action: target shape determines domain, prefix or exact scope; provider defaults are described; keyword counts and limits are given for each action. It lacks explicit routing versus sibling tools like seo_compare, but within the tool the when-to-use guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

seo_sitesList sitesB
Read-only
Inspect

Lists the Search Console and Google Analytics properties the connected Google accounts can read, the Bing Webmaster site for each, and which research keys are set. Call it first. With add: starts the weekly site audit of that site on the hosted server (a weekly crawl, daily Google index checks, a Monday email and webhook with what changed, and alerts when a page drops out of Google's index). A site that needs paying for returns a Stripe Checkout link: give it to the person to open, and the audit starts once they pay.

NameRequiredDescriptionDefault
addNoOptional. A site to add to the weekly site audit. Only when the person asks for it: a site can cost money.

TDQS

B3.4/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, but the description states that passing `add` starts a recurring weekly audit on a hosted server and can return a Stripe Checkout link that, once paid, activates a paid subscription. That is a state-changing, monetized side effect, directly contradicting the read-only annotation. An agent trusting only the annotation would believe the tool is a pure read when one optional parameter turns it into a billing-triggering mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The listing behaviour and the 'call it first' directive are front-loaded, and the detail about what the weekly audit includes earns its place by letting the agent explain the offer to a user. The parenthetical feature list is dense and runs long, but nothing is truly redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the work of describing the return payload: properties, per-site Bing site, research-key status, and a Checkout URL in the paid case. It stops short of covering edge cases such as calling `add` for a site already under audit or accounts with no readable properties.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 real meaning: `add` triggers a weekly crawl, daily Google index checks, a Monday email/webhook, index-drop alerts, and possibly a payment flow. It also documents the cost gate, which the schema hints at but the description makes explicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource set: it lists Search Console and Google Analytics properties, the matching Bing Webmaster site, and which research keys are set. That is clearly distinct from siblings like seo_data or seo_index, though none are named. The 'with add:' clause introduces a second, quite different mode (starting a paid audit), which slightly blurs what the tool fundamentally is.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Call it first' gives unambiguous ordering guidance relative to the other seo_* tools, and 'Only when the person asks for it: a site can cost money' is an explicit precondition for the add path. What is missing is any named alternative for when the agent doesn't need the site list, or guidance on re-calling it after an audit is started.

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.

  1. 1 tool update
    • Changedseo_lint1 field changed
      • addedInput schema / properties / rules
        Added value: +{
        +  "description": "Optional. true lists every rule with its id, category, level and description instead of checking text; only limits the list, such as only [\"ai\"].",
        +  "type": "boolean"
        +}
  2. 2 tool updates
    • Changedseo_lint4 fields changed
      • addedInput schema / properties / meta_kind
        Added value: +{
        +  "description": "Optional, with the meta preset: title or description, what a line with no \"title:\" or \"description:\" label is. Default: a line up to 70 characters is a title, a longer one a description.",
        +  "enum": [
        +    "title",
        +    "description"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / only
        Added value: +{
        +  "description": "Optional categories to check: ai (patterns common in AI-written text), copy (weak copy and house style, such as dashes) or seo (titles, descriptions, headings). Default: all.",
        +  "items": {
        +    "enum": [
        +      "ai",
        +      "copy",
        +      "seo"
        +    ],
        +    "type": "string"
        +  },
        +  "maxItems": 3,
        +  "type": "array"
        +}
      • changedInput schema / properties / preset / description
        Previous value: -"Optional. blog (default for Markdown), landing (default for HTML: stricter on buzzwords, weak links and claims with no number), docs, or meta (one title or description per line)."New value: +"Optional. blog (default for Markdown), landing (default for HTML: stricter on buzzwords, weak links and claims with no number), docs, or meta (one title or description per line; start a line with \"title:\" or \"description:\" to say which)."
      • addedInput schema / properties / url
        Added value: +{
        +  "description": "Optional instead of text: a live page. Its main content is extracted as Markdown (as seo_page with detail full shows it) and checked with the blog preset. Only the CLI and the local MCP server read pages.",
        +  "format": "uri",
        +  "type": "string"
        +}
    • Changedseo_research8 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "keyword_metrics",
        -  "ranked_keywords",
        -  "serp",
        -  "competitors",
        -  "backlinks",
        -  "link_gap",
        -  "ai_answers"
        -]New value: +[
        +  "keyword_metrics",
        +  "ranked_keywords",
        +  "serp",
        +  "competitors",
        +  "backlinks",
        +  "link_gap",
        +  "ai_answers",
        +  "top_pages",
        +  "pages_by_backlinks",
        +  "keyword_ideas",
        +  "serp_overlap"
        +]
      • addedInput schema / properties / also
        Added value: +{
        +  "default": [],
        +  "description": "ai_answers only: the brand's other domains, such as claude.ai beside claude.com. A citation to any of them counts as citing the target.",
        +  "items": {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 4,
        +  "type": "array"
        +}
      • addedInput schema / properties / brand
        Added value: +{
        +  "default": [],
        +  "description": "ai_answers only: the brand names that count as a mention, such as Datadog for datadoghq.com. Default: each domain's name.",
        +  "items": {
        +    "maxLength": 60,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 10,
        +  "type": "array"
        +}
      • addedInput schema / properties / depth
        Added value: +{
        +  "description": "serp only: results per keyword, default 20. Deeper costs more.",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / provider / description
        Added value: +"Optional. Without it, the saved key; DataForSEO when both are saved."
      • addedInput schema / properties / scope
        Added value: +{
        +  "description": "Optional: domain, prefix or exact, to read the target another way than its shape says.",
        +  "enum": [
        +    "domain",
        +    "prefix",
        +    "exact"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / target / description
        Previous value: -"Domain or URL."New value: +"Domain (the whole site), a path ending in / for every URL under it, such as example.com/blog/, or one page."
      • changedInput schema / required
        Previous value: -[
        -  "provider",
        -  "action"
        -]New value: +[
        +  "action"
        +]
  3. 1 tool update
    • Changedseo_research2 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "keyword_metrics",
        -  "ranked_keywords",
        -  "serp",
        -  "competitors",
        -  "backlinks",
        -  "ai_answers"
        -]New value: +[
        +  "keyword_metrics",
        +  "ranked_keywords",
        +  "serp",
        +  "competitors",
        +  "backlinks",
        +  "link_gap",
        +  "ai_answers"
        +]
      • addedInput schema / properties / competitors
        Added value: +{
        +  "default": [],
        +  "description": "link_gap only: 2 to 5 competitor domains.",
        +  "items": {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 5,
        +  "type": "array"
        +}
  4. 1 tool update
    • Changedseo_report1 field changed
      • changedInput schema / properties / section / enum
        Previous value: -[
        -  "overview",
        -  "quick-wins",
        -  "low-ctr",
        -  "striking-distance",
        -  "second-page",
        -  "content-decay",
        -  "cannibalization",
        -  "traffic-drop",
        -  "ai-queries",
        -  "bing",
        -  "issues"
        -]New value: +[
        +  "overview",
        +  "quick-wins",
        +  "low-ctr",
        +  "striking-distance",
        +  "second-page",
        +  "content-decay",
        +  "cannibalization",
        +  "traffic-drop",
        +  "ai-queries",
        +  "bing",
        +  "issues",
        +  "google-updates"
        +]
  5. 1 tool update
    • Changedseo_research1 field changed
      • addedInput schema / properties / tasks
        Added value: +{
        +  "default": [],
        +  "description": "ai_answers only: the tasks an earlier run returned as not ready, to read back at no cost.",
        +  "items": {
        +    "pattern": "^([a-z_]+):([0-9a-f-]{20,64})$",
        +    "type": "string"
        +  },
        +  "maxItems": 30,
        +  "type": "array"
        +}
  6. 2 tool updates
    • Removedseo_ai_access
    • Removedseo_social_posts
  7. 3 tool updates
    • Addedseo_ai_access
    • Addedseo_lint
    • Addedseo_social_posts
  8. 1 tool update
    • Changedseo_report5 fields changed
      • addedInput schema / properties / issues
        Added value: +{
        +  "description": "With mark: issue ids from the issues section, comma-separated.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / mark
        Added value: +{
        +  "description": "Optional, with site and issues: fixed, ignored, or open to undo. Only when the person says so.",
        +  "enum": [
        +    "open",
        +    "fixed",
        +    "ignored"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / note
        Added value: +{
        +  "description": "Optional, with mark: why, in the person’s words.",
        +  "maxLength": 300,
        +  "type": "string"
        +}
      • addedInput schema / properties / saved
        Added value: +{
        +  "description": "Optional, with section issues or mark, only where this server is not storing the list: the JSON the issues section returned last time, as the agent saved it.",
        +  "maxLength": 600000,
        +  "type": "string"
        +}
      • changedInput schema / properties / section / enum
        Previous value: -[
        -  "overview",
        -  "quick-wins",
        -  "low-ctr",
        -  "striking-distance",
        -  "second-page",
        -  "content-decay",
        -  "cannibalization",
        -  "traffic-drop",
        -  "ai-queries",
        -  "bing"
        -]New value: +[
        +  "overview",
        +  "quick-wins",
        +  "low-ctr",
        +  "striking-distance",
        +  "second-page",
        +  "content-decay",
        +  "cannibalization",
        +  "traffic-drop",
        +  "ai-queries",
        +  "bing",
        +  "issues"
        +]
  9. 1 tool update
    • Changedseo_sites1 field changed
      • addedInput schema / properties / add
        Added value: +{
        +  "description": "Optional. A site to add to the weekly site audit. Only when the person asks for it: a site can cost money.",
        +  "minLength": 1,
        +  "type": "string"
        +}
  10. 4 tool updates
    • Changedseo_data2 fields changed
      • changedInput schema / properties / end_date / description
        Previous value: -"YYYY-MM-DD. Optional; send with start_date."New value: +"YYYY-MM-DD. Optional."
      • changedInput schema / properties / start_date / description
        Previous value: -"YYYY-MM-DD. Optional; send with end_date."New value: +"YYYY-MM-DD. Optional; without end_date it runs to the latest final day."
    • Changedseo_index2 fields changed
      • changedInput schema / properties / end_date / description
        Previous value: -"YYYY-MM-DD. Optional; send with start_date."New value: +"YYYY-MM-DD. Optional."
      • changedInput schema / properties / start_date / description
        Previous value: -"YYYY-MM-DD. Optional; send with end_date."New value: +"YYYY-MM-DD. Optional; without end_date it runs to the latest final day."
    • Changedseo_page2 fields changed
      • changedInput schema / properties / end_date / description
        Previous value: -"YYYY-MM-DD. Optional; send with start_date."New value: +"YYYY-MM-DD. Optional."
      • changedInput schema / properties / start_date / description
        Previous value: -"YYYY-MM-DD. Optional; send with end_date."New value: +"YYYY-MM-DD. Optional; without end_date it runs to the latest final day."
    • Changedseo_report2 fields changed
      • changedInput schema / properties / end_date / description
        Previous value: -"YYYY-MM-DD. Optional; send with start_date."New value: +"YYYY-MM-DD. Optional."
      • changedInput schema / properties / start_date / description
        Previous value: -"YYYY-MM-DD. Optional; send with end_date."New value: +"YYYY-MM-DD. Optional; without end_date it runs to the latest final day."
  11. 1 tool update
    • Changedseo_report3 fields changed
      • changedInput schema / properties / section / description
        Previous value: -"Optional. Leave it out first; then ask for one section."New value: +"Optional, needs site. Leave it out first; then ask for one section."
      • changedInput schema / properties / site / description
        Previous value: -"Search Console property or site, such as sc-domain:example.com, https://example.com/ or example.com."New value: +"Leave it out for the summary of every audited site (weekly site audit beta). Otherwise a Search Console property or site, such as sc-domain:example.com, https://example.com/ or example.com."
      • removedInput schema / required
        Removed value: -[
        -  "site"
        -]
  12. 1 tool update
    • Changedseo_index2 fields changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "default": "summary",
        +  "description": "summary first. rows: the next page of rows. full: every field as JSON.",
        +  "enum": [
        +    "summary",
        +    "rows",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "rows only: the first row to return.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
  13. 1 tool update
    • Changedseo_research1 field changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "keyword_metrics",
        -  "ranked_keywords",
        -  "serp",
        -  "competitors",
        -  "backlinks"
        -]New value: +[
        +  "keyword_metrics",
        +  "ranked_keywords",
        +  "serp",
        +  "competitors",
        +  "backlinks",
        +  "ai_answers"
        +]
  14. 1 tool update
    • Changedseo_report1 field changed
      • changedInput schema / properties / section / enum
        Previous value: -[
        -  "overview",
        -  "quick-wins",
        -  "low-ctr",
        -  "striking-distance",
        -  "second-page",
        -  "content-decay",
        -  "cannibalization",
        -  "traffic-drop",
        -  "bing"
        -]New value: +[
        +  "overview",
        +  "quick-wins",
        +  "low-ctr",
        +  "striking-distance",
        +  "second-page",
        +  "content-decay",
        +  "cannibalization",
        +  "traffic-drop",
        +  "ai-queries",
        +  "bing"
        +]

Publisher details

Operator
Ian Nuttall · Publisher source
Operator website
https://seoskill.dev/
Vendor relationship
Independent
Trust center
Not available
Restrictions
Free. Sign in with Google; the account needs access to at least one Search Console property. Keyword research needs your own DataForSEO or Ahrefs key, saved on your seoskill.dev account.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    MCP server for querying Google Search Console data — search analytics, URL inspection, sitemap monitoring, and more — read-only tools for any MCP-compatible AI client.
    7
    39 PyPI
    Apache 2.0
  • A
    license
    B
    quality
    D
    maintenance
    Professional Google Search Console MCP server providing 40+ SEO tools for performance analysis, content decay, CTR opportunities, and more, enabling real search data in clients like Cursor and Claude.
    40
    10 npm
    6
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to query Google Search Console and Bing Webmaster Tools data for verified properties, covering clicks, impressions, CTR and rankings by query or page, URL index inspection, sitemap listing and submission, and Bing crawl issues and traffic stats. It runs as a hosted remote MCP server, so nothing is installed locally.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables natural-language, read-only analysis of your own Google Search Console and Google Analytics 4 data, including search performance, engagement, sitemap health, ranking opportunities, and deterministic SEO audits through MCP clients like ChatGPT.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.