Skip to main content
Glama
mcp-seo-audit

mcp-seo-audit

by GiorgiKemo

mcp-seo-audit

Tests and package build License: MIT

A local Model Context Protocol server for technical SEO audits, JavaScript rendering, Search Console analytics, performance checks, and recurring monitoring. Its 44 tools return evidence, affected URLs, suggested fixes, and explicit coverage limits.

Current source version: 2.1.0. Install this checkout to use the features below. A GitHub update does not publish a PyPI package or MCP Registry release; uvx mcp-seo-audit can still resolve an older published version.

The supported deployment is stdio for a trusted local user, not a hosted multi-tenant service. Public-site crawls require no Google credentials. Based on AminForou/mcp-gsc, with its MIT attribution preserved.

Install and connect

Requires Python 3.11 or later.

git clone https://github.com/GiorgiKemo/mcp-seo-audit.git
cd mcp-seo-audit
python -m venv .venv

Activate with .venv/Scripts/Activate.ps1 in Windows PowerShell or source .venv/bin/activate on macOS/Linux, then install the pinned runtime dependencies and this package:

python -m pip install --require-hashes -r requirements.lock
python -m pip install --no-deps .

The lock includes the optional Python browser package. JavaScript rendering also needs Chromium:

python -m playwright install chromium

For a smaller source installation without browser support, python -m pip install . resolves core dependency ranges instead of the full lock. To add browser support later, use python -m pip install ".[browser]" and install Chromium. For editable development, use python -m pip install -e ".[dev,browser]".

Linux may require OS browser dependencies; python -m playwright install --with-deps chromium installs them where you administer those packages. Chromium's sandbox remains enabled. Run as a supported non-root user with the required OS facilities rather than disabling sandboxing.

On Ubuntu 23.10+ an AppArmor user-namespace restriction can cause Chromium's No usable sandbox error. Ask the machine administrator to follow Chromium's per-executable AppArmor instructions, allowing userns for the exact installed Chromium and headless-shell executable paths. Keep those browser files trusted and refresh the profile after browser updates. The CI workflow demonstrates this scoped setup; it retains Chromium sandboxing and the system-wide restriction.

Docker

Build and connect the non-root stdio container with a named volume for audit history and configuration:

docker build -t mcp-seo-audit:2.1.0 .
docker run --rm -i -v seo-audit-data:/data mcp-seo-audit:2.1.0

Configure the MCP client to launch the docker run command. No HTTP port is exposed. The image supports raw crawling by default; it includes the Python browser package but no Chromium binary or browser OS dependencies. Rendered audits require a separate image setup that installs both and supports the enabled browser sandbox.

Run one batch of explicitly enabled schedules against the same data volume:

docker run --rm --entrypoint mcp-seo-monitor -v seo-audit-data:/data mcp-seo-audit:2.1.0 --once

Google credentials are optional for public-site audits. To use Google tools, explicitly mount your own credential file read-only and set the matching credential-path environment variable; never copy credentials into the image. See the authentication settings below.

MCP client configuration

Add a stdio server in your MCP client's configuration. For example, on Windows:

{
  "mcpServers": {
    "seo-audit": {
      "command": "C:/path/to/mcp-seo-audit/.venv/Scripts/mcp-seo-audit.exe",
      "env": {
        "GSC_SKIP_OAUTH": "true",
        "SEO_AUDIT_ENABLE_WRITE_TOOLS": "false",
        "SEO_AUDIT_ALLOW_PRIVATE_URLS": "false"
      }
    }
  }
}

On macOS/Linux, use the absolute path to .venv/bin/mcp-seo-audit. Configuration-file locations vary by client. The process waits for MCP messages on stdin; starting it without a client can appear to wait silently. get_server_status reports local configuration/readiness without revealing credentials or proving Google account access.

Optional Google access

  • OAuth: enable the Search Console API in Google Cloud, create an OAuth Desktop app, and set GSC_OAUTH_CLIENT_SECRETS_FILE to its downloaded client JSON. Set GSC_SKIP_OAUTH=false. The first Google operation can open browser consent. Enable the Web Search Indexing API if using its tools.

  • Service account: set GSC_CREDENTIALS_PATH to the key file, grant the account access to the relevant Search Console property, and use GSC_SKIP_OAUTH=true.

  • Performance APIs: set CRUX_API_KEY for CrUX and optionally PAGESPEED_API_KEY for PageSpeed Insights. GOOGLE_API_KEY is the PageSpeed fallback.

Keep credentials outside the checkout. OAuth tokens default to the user-data directory or GSC_TOKEN_FILE. Legacy tokens beside the server remain a read fallback during migration; failed reauthentication preserves the working token.

Google property/sitemap mutations and Indexing API publish calls require SEO_AUDIT_ENABLE_WRITE_TOOLS=true. Local project/history tools do not require that Google-write flag. The flag does not reduce granted OAuth scopes.

Related MCP server: gsc-mcp-rs

Audit a site

Ask your MCP client:

Create a structured SEO report for https://example.com/ with up to 25 pages. Include sitemap discovery, compare raw and rendered HTML, and show coverage gaps before prioritizing fixes.

The underlying tool accepts:

get_seo_audit_report(
  start_url="https://example.com/",
  max_pages=25,
  respect_robots=True,
  render_mode="compare",
  include_sitemaps=True,
  max_seconds=180
)

render_mode defaults to raw; rendered analyzes the resulting DOM, and compare also captures differences from server-returned HTML. Direct reports default to include_sitemaps=False. The crawl time budget defaults to 180 seconds, configurable from 5 to 600. Reports disclose partial coverage and stopping reasons.

Reports include a versioned JSON schema, timestamp, stable rule IDs, severity, evidence, affected URLs, recommendations, page observations, and coverage. Checks cover HTTP errors and link sources, metadata, headings, indexability, canonicals, duplicate titles/descriptions, images, links, hreflang, and selected JSON-LD profiles.

Sitemap discovery follows bounded same-origin indexes and combines sitemap URLs with link discovery. A sitemap URL without an observed incoming link is an orphan candidate within the sample, not proof that the whole site has no link to it.

Hreflang checks cover language/region syntax and observed self-references, return links, cluster consistency, and alternate/canonical conflicts. Unvisited or cross-origin alternates remain unverified. Structured-data checks cover basic Product, BreadcrumbList, and Article-family fields, disclosing unsupported types/contexts and unresolved references. They do not certify rich-result eligibility or implement every Schema.org vocabulary.

Compare fixes

Call compare_seo_audits(baseline_json, current_json) with two serialized reports using the same start URL and settings. If your client wraps a report under structuredContent.result, serialize the inner report.

Result

Meaning

new

A finding appeared with applicable evidence in both snapshots.

resolved

A successful applicable recheck verified the finding disappeared.

persistent

The finding remains.

newly_observed

The baseline did not cover the page or its dependencies.

unverified

A page or required related URL was not successfully rechecked.

Missing pages never prove fixes. A completed discovered-link frontier never establishes complete site coverage. Word-count, title-length, and social-metadata findings are review guidance, not ranking requirements.

Save projects and monitor changes

Create a project through MCP:

create_audit_project(
  project_id="example",
  start_url="https://example.com/",
  max_pages=25,
  render_mode="raw",
  include_sitemaps=True,
  retention=30
)
run_project_audit(project_id="example")

Projects always respect robots.txt and start with scheduling disabled. IDs use 1-64 lowercase letters, digits, hyphens, or underscores, starting with a letter or digit. The returned audit ID identifies an immutable snapshot. Use list_project_audits, get_project_audit, and compare_project_audits for history. Successful runs prune old snapshots to the configured retention.

Opt into a daily schedule:

set_audit_schedule(project_id="example", enabled=True, interval_seconds=86400)

Run the separate worker in the same installed environment, with the same SEO_AUDIT_DATA_DIR and network settings:

mcp-seo-monitor

Or process one bounded batch and exit, suitable for an external OS scheduler:

mcp-seo-monitor --once

The MCP server never starts a worker automatically. The first scheduled run is due one interval after enabling. --once processes at most 25 due projects; repeat it or keep the worker running for larger backlogs. Polling defaults to 30 seconds, configurable with --poll-seconds from 1 to 60. Ctrl+C cancels the active audit and stops the worker. Disabling a schedule prevents future claims; an active run can finish.

Database leases coordinate concurrent workers. Runs have a ten-minute outer timeout and eleven-minute lease for crash recovery; the report's crawl budget can stop earlier. Failures use exponential backoff capped at 24 hours, or the configured interval when longer. After a process crash, another worker can claim the project when its lease expires.

Read list_audit_events(project_id="example", after_id=0) for local verified finding changes, failure transitions, and recovery. Save next_after_id and pass it next time. Unchanged findings and sampling-only changes stay quiet. No email, webhook, push notification, or other outbound message is sent.

Storage and retention

The database is audits.sqlite3 under:

Platform

Default directory

Windows

%LOCALAPPDATA%/mcp-seo-audit

macOS

~/Library/Application Support/mcp-seo-audit

Linux

$XDG_DATA_HOME/mcp-seo-audit, or ~/.local/share/mcp-seo-audit

Override with SEO_AUDIT_DATA_DIR. Use a local filesystem with reliable SQLite locking; do not share a database across hosts or place it on an unreliable network filesystem.

Limits: 100 projects, 1-100 snapshots per project (default 30), 10 MiB per snapshot, and the latest 500 events per project. Schedule intervals are 60 seconds to 31 days. Storage timestamps are Unix UTC seconds. Retention bounds counts rather than global disk usage; provision disk space for your report sizes.

Reports may contain page metadata, URL parameters, and business data. Storage is not application-encrypted. To back up, stop both server and monitor, then securely copy the data directory including SQLite sidecar files. Restore with processes stopped and retain the original backup until verified. The directory may also contain OAuth tokens: treat backups as sensitive and never attach them to public issues.

Analytics and performance

get_search_analytics_snapshot paginates with explicit row/request/time budgets: default 25,000 rows, maximum 100,000 rows, at most 10 API pages within 180 seconds. Partial rows survive provider failures. Coverage includes stop reason, duplicate rows, and freshness; API-page counts exclude additional retry attempts. Google still limits results to selected top rows, so exhausting an API window does not establish complete traffic coverage. Google's query reference.

prioritize_audit_issues sorts report findings by severity, then observed page clicks/impressions. URL matching is exact; unmatched pages are unknown rather than zero traffic. It does not predict revenue or ranking gains.

Google calls run off the event loop through a serialized worker because the cached client transport is not thread-safe. Reads retry selected rate-limit/server errors at most twice with bounded delays; mutations are attempted once. Cancellation prevents later retries, but a request already sent to Google may still complete.

CrUX reports field data where available; PageSpeed/Lighthouse results are lab measurements. Missing field data is not a failed Core Web Vitals assessment. Local Lighthouse requires an installed Lighthouse executable, Chrome/Chromium, and explicit SEO_AUDIT_ENABLE_LOCAL_LIGHTHOUSE=true. Downloads through npx are disabled by default. Lighthouse's separate Chrome process does not inherit the rendered crawler's guarded networking; use it only with trusted targets. See SECURITY.md.

The Indexing API supports eligible JobPosting pages and BroadcastEvent embedded in VideoObject. Notification acceptance is not proof of indexing/removal; this is not a general-purpose indexing API for every page. Google's Indexing API guidance.

Tool reference

Area

Tools

Properties

list_properties, add_site, delete_site

Search analytics

get_search_analytics, get_advanced_search_analytics, get_performance_overview, get_search_by_page_query, compare_search_periods, get_search_analytics_snapshot

SEO opportunities

find_striking_distance_keywords, detect_cannibalization, split_branded_queries, prioritize_audit_issues

URL inspection

inspect_url, batch_inspect_urls

Indexing notifications

request_indexing, request_removal, check_indexing_notification, batch_request_indexing

Google sitemaps

get_sitemaps, submit_sitemap, delete_sitemap

Performance

get_core_web_vitals, get_pagespeed_insights, run_lighthouse_audit

Live inspection

inspect_robots_txt, analyze_sitemap, analyze_page_seo, crawl_site_seo, audit_live_site

Structured reports

get_seo_audit_report, compare_seo_audits, site_audit

Projects and monitoring

create_audit_project, list_audit_projects, set_audit_schedule, run_project_audit, list_project_audits, get_project_audit, compare_project_audits, list_audit_events

Authentication and status

reauthenticate, get_server_status

site_audit combines Google account data. audit_live_site is a live-site text report. get_seo_audit_report is the structured crawl/comparison workflow. Tool descriptions expose inputs and read/write annotations to clients.

Configuration

Restart the server after changing configuration.

Variable

Default

Purpose

GSC_OAUTH_CLIENT_SECRETS_FILE

client_secrets.json beside server

OAuth desktop-client file; prefer an explicit external path.

GSC_CREDENTIALS_PATH

Conventional service-account locations

Service-account JSON path.

GSC_TOKEN_FILE

token.json in user-data directory

Token destination; legacy package token is a read fallback.

GSC_SKIP_OAUTH

false

Skip interactive OAuth for Google tools.

GSC_DATA_STATE

all

all includes provisional data; final requests finalized data.

CRUX_API_KEY

Empty

CrUX API key.

PAGESPEED_API_KEY

GOOGLE_API_KEY or empty

PageSpeed Insights key.

GOOGLE_API_KEY

Empty

Fallback PageSpeed key.

SEO_AUDIT_DATA_DIR

Platform user-data directory

Project/history storage and default token location.

SEO_AUDIT_BROWSER_PATH

Playwright Chromium

Optional installed Chromium executable for rendered crawling.

SEO_AUDIT_ENABLE_WRITE_TOOLS

false

Enable mutating Google tools.

SEO_AUDIT_ALLOW_PRIVATE_URLS

false

Allow private destinations only for deliberately trusted testing.

SEO_AUDIT_MAX_FETCH_BYTES

5242880

Per-response decoded-byte cap; also bounds direct JSON report inputs.

SEO_AUDIT_MAX_REDIRECTS

5

HTTP-fetch redirect cap.

SEO_AUDIT_MAX_SITEMAP_URLS

50000

URL cap for individual sitemap analysis.

SEO_AUDIT_MAX_CRAWL_PAGES

100

Ceiling for crawl page attempts.

SEO_AUDIT_ENABLE_LOCAL_LIGHTHOUSE

false

Permit separate Lighthouse execution for trusted targets.

LIGHTHOUSE_BINARY

Auto-detect

Installed Lighthouse executable path.

LIGHTHOUSE_CHROME_PATH

CHROME_PATH or auto-detect

Chrome path for local Lighthouse.

SEO_AUDIT_ALLOW_NPX_LIGHTHOUSE

false

Permit downloading/running Lighthouse through npx.

LIGHTHOUSE_NO_SANDBOX

false

Legacy Lighthouse-only sandbox override; keep disabled normally.

Crawl and rendering boundaries

  • Crawls stay on the starting origin, use the mcp-seo-audit user agent, and preserve query/path parameters. Googlebot may receive different rules.

  • Recursive crawls respect robots.txt by default, including redirects and rendered resources. Single-page inspections make direct requests. Disable robots only for a site you control.

  • Robots parsing is capped at 500 KiB. Crawled pages are spaced at least 0.2 seconds apart; crawl-delay up to 10 seconds is honored. Larger delays and temporary robots errors defer crawling.

  • Page budgets include attempted URLs, errors, and non-HTML responses. Report sitemap discovery separately caps 10 documents, 20 times the page budget in candidates, 5 MiB per decoded document, and up to 45 seconds within the remaining crawl budget.

  • Guarded HTTP validates all DNS answers and connects to a validated IP while preserving TLS hostname verification. Private, loopback, reserved, and unsafe translated destinations are blocked by default, including redirects.

  • Rendered pages use a fresh sandboxed Chromium context, guarded GET/HEAD resource fetching, blocked service workers/WebSockets/downloads, and no authenticated browser session. Defaults: 30 seconds, 80 requests, 20 MiB per page, and a 750 ms settle interval. Blocked resources, JavaScript errors, or unfinished work produce partial coverage. Sites requiring login, writes, WebSockets, or longer waits may render incompletely.

  • Crawled content is untrusted data. Clients must not treat page text, metadata, or findings as permission to execute commands or send messages.

These controls support local auditing. They are not authentication, tenant isolation, or a substitute for controlled egress for untrusted workloads. See SECURITY.md and the implementation audit.

Development and verification

python -m pip install -e ".[dev]"
python -m pytest -q
python -m build
python -m pip_audit

Tests isolate credentials and use controlled HTTP fixtures and mocked Google APIs. CI is configured for Windows/Linux and Python 3.11/3.13/3.14, with browser integration enabled on Python 3.13 and a separate non-root container check. For local browser integration, install Chromium and set SEO_AUDIT_TEST_BROWSER=1 before running pytest. Passing offline tests does not establish live Google permissions, quotas, remote CI completion, or package publication; release evidence belongs in the audit record.

See CONTRIBUTING.md for change/release checks and CHANGELOG.md for changes.

License

MIT. Original work copyright 2025 Amin Foroutan; project contributions copyright 2025-2026 GiorgiKemo.

Available Tools

43 tools
add_siteB
Idempotent
Add a site to your Search Console properties.

Args:
    site_url: The URL of the site to add (e.g. https://example.com or sc-domain:example.com)

Inputs: site_url (required). Returns: result

analyze_page_seoB
Read-onlyIdempotent
Fetch a page and analyze on-page SEO signals, structured data, and indexability hints.

Args:
    url: Full page URL

Inputs: url (required). Returns: result

analyze_sitemapB
Read-onlyIdempotent
Fetch and analyze an XML sitemap or sitemap index.

Args:
    sitemap_url: Full sitemap URL
    sample_urls: Number of sitemap URLs to validate with GET requests

Inputs: sitemap_url (required), sample_urls. Returns: result

audit_live_siteA
Read-onlyIdempotent
Run a live SEO audit without requiring Search Console access.
Combines page analysis, robots.txt inspection, sitemap discovery, PSI data, and a small same-origin crawl.

Args:
    url: Full site/page URL
    crawl_pages: Number of pages to crawl for duplicate/missing-tag issues
    include_lighthouse: Whether to also run a local Lighthouse CLI audit

Inputs: url (required), crawl_pages, include_lighthouse. Returns: result

batch_inspect_urlsA
Read-onlyIdempotent
Inspect multiple URLs for indexing status. Handles rate limiting automatically.
API limit: 2000/day, 600/minute. This tool handles up to 50 URLs per call.

Args:
    site_url: Exact GSC property URL (e.g. "sc-domain:example.com")
    urls: List of URLs to inspect, one per line

Inputs: urls (required), site_url (required). Returns: result

batch_request_indexingA
Request indexing for multiple URLs. Processes sequentially with rate limiting.
Default quota: 200/day. Only for pages with JobPosting or BroadcastEvent structured data.

Args:
    urls: List of URLs to index, one per line (max 100 per batch)

Inputs: urls (required). Returns: result

check_indexing_notificationB
Read-onlyIdempotent
Check the latest indexing notification status for a URL.

Args:
    url: The URL to check

Inputs: url (required). Returns: result

compare_project_auditsB
Read-onlyIdempotent

Compare two retained project snapshots using applicable rechecks and coverage. Missing pages do not count as resolved; differing crawl settings cannot be compared.

Inputs: current_id (required), project_id (required), baseline_id (required).

compare_search_periodsB
Read-onlyIdempotent
Compare search analytics between two time periods.

Args:
    site_url: Exact GSC property URL
    period1_start: Start date for period 1 (YYYY-MM-DD)
    period1_end: End date for period 1
    period2_start: Start date for period 2
    period2_end: End date for period 2
    dimensions: Dimensions to group by (default: query)
    limit: Top N results to compare (default: 20)

Inputs: site_url (required), period1_end (required), period2_end (required), period1_start (required), +3 more. Returns: result

compare_seo_auditsA
Read-onlyIdempotent

Compare two JSON outputs of get_seo_audit_report with matching crawl settings. Classifies new, resolved, persistent, newly observed and unverified issues without fetching URLs or writing files. Missing/failed pages never prove an issue resolved.

Inputs: current_json (required), baseline_json (required). Returns: result

crawl_site_seoA
Read-onlyIdempotent

Crawl same-origin raw HTML and summarize issues. Respects robots.txt by default. max_pages bounds fetch attempts, including errors/non-HTML. Use get_seo_audit_report for structured evidence and remediation. Disable robots only for a site you control.

Inputs: start_url (required), max_pages, respect_robots. Returns: result

create_audit_projectA

Create a local project with robots-aware audit settings and scheduling disabled. IDs use lowercase letters/digits/hyphens/underscores. Retain 1-100 snapshots (default 30); max_pages 1-500 is further capped by server configuration. Files live under SEO_AUDIT_DATA_DIR or the platform user-data directory. Rendered modes require the optional browser dependency and installed Chromium.

Inputs: start_url (required), project_id (required), max_pages, retention, +2 more.

delete_siteC
DestructiveIdempotent
Remove a site from your Search Console properties.

Args:
    site_url: The URL of the site to remove

Inputs: site_url (required). Returns: result

delete_sitemapB
DestructiveIdempotent
Delete (unsubmit) a sitemap from Google Search Console.

Args:
    site_url: Exact GSC property URL
    sitemap_url: Full URL of the sitemap to delete

Inputs: site_url (required), sitemap_url (required). Returns: result

detect_cannibalizationA
Read-onlyIdempotent
Identify queries appearing for multiple pages as potential cannibalization candidates.
Multiple pages can serve different intents; overlap alone does not prove harmful competition.

Args:
    site_url: Exact GSC property URL
    days: Days to look back (default: 28)
    min_impressions: Minimum impressions per query-page pair (default: 5)

Inputs: site_url (required), days, min_impressions. Returns: result

find_striking_distance_keywordsA
Read-onlyIdempotent
Find "striking distance" keywords — queries ranking at positions 5-20 with decent impressions.
These are review candidates; positions alone do not establish the effort needed to improve rankings.

Args:
    site_url: Exact GSC property URL
    days: Days to look back (default: 28)
    min_impressions: Minimum impressions to include (default: 10)
    row_limit: Max results (default: 50)

Inputs: site_url (required), days, row_limit, min_impressions. Returns: result

get_advanced_search_analyticsA
Read-onlyIdempotent
Get advanced search analytics with sorting, filtering (including regex), and pagination.

Args:
    site_url: Exact GSC property URL (e.g. "sc-domain:example.com")
    start_date: Inclusive start date YYYY-MM-DD (defaults to 28-day window ending at end_date)
    end_date: Inclusive end date YYYY-MM-DD (defaults to today in Pacific time)
    dimensions: Dimensions comma-separated (query,page,device,country,date,searchAppearance)
    search_type: WEB, IMAGE, VIDEO, NEWS, DISCOVER
    row_limit: Max rows (up to 25000)
    start_row: Starting row for pagination
    sort_by: Metric to sort returned API page locally (clicks, impressions, ctr, position)
    sort_direction: ascending or descending
    filter_dimension: Single filter dimension (query, page, country, device)
    filter_operator: contains, equals, notContains, notEquals, includingRegex, excludingRegex
    filter_expression: Filter value
    filters: JSON array of filter objects for AND logic. Each needs dimension, operator, expression.
    data_state: "all" (default) or "final" (confirmed only, 2-3 day lag)

Inputs: site_url (required), filters, sort_by, end_date, +10 more. Returns: result

get_core_web_vitalsA
Read-onlyIdempotent
Get Core Web Vitals (LCP, INP, CLS) from the Chrome UX Report (CrUX) API.
Free API, no OAuth needed — just a CRUX_API_KEY env variable.

Args:
    url_or_origin: Full URL or origin (e.g. "https://example.com" for origin-level)
    form_factor: PHONE, DESKTOP, or TABLET (default: PHONE)

Inputs: url_or_origin (required), form_factor. Returns: result

get_pagespeed_insightsB
Read-onlyIdempotent
Run Google's PageSpeed Insights API for a URL.
Returns Lighthouse lab data plus available Chrome UX Report field data.

Args:
    url: Full page URL
    strategy: mobile or desktop
    categories: Comma-separated Lighthouse categories

Inputs: url (required), strategy, categories. Returns: result

get_performance_overviewB
Read-onlyIdempotent
Get a performance overview with totals and daily trend.

Args:
    site_url: Exact GSC property URL
    days: Number of days to look back (default: 28)

Inputs: site_url (required), days. Returns: result

get_project_auditA
Read-onlyIdempotent

Load an immutable retained audit snapshot by its project-scoped audit_id.

Inputs: audit_id (required), project_id (required).

get_search_analyticsA
Read-onlyIdempotent
Get search analytics data for a specific property.

Args:
    site_url: Exact GSC property URL (e.g. "sc-domain:example.com")
    days: Number of days to look back (default: 28)
    dimensions: Dimensions to group by, comma-separated (query, page, device, country, date, searchAppearance)
    row_limit: Number of rows to return (default: 20, max: 500)
    search_type: Type of search results (WEB, IMAGE, VIDEO, NEWS, DISCOVER)

Inputs: site_url (required), days, row_limit, dimensions, +1 more. Returns: result

get_search_analytics_snapshotA
Read-onlyIdempotent

Fetch a bounded, paginated Search Console snapshot with explicit coverage. Returns at most 100,000 rows / 10 API pages within 180 seconds. Google may still omit anonymized/long-tail rows; completion is only for the returned API window. Partial results survive provider errors. Includes data-state/freshness metadata.

Inputs: site_url (required), days, max_rows, dimensions, +2 more. Returns: result

get_search_by_page_queryB
Read-onlyIdempotent
Get search queries driving traffic to a specific page.

Args:
    site_url: Exact GSC property URL
    page_url: The specific page URL to analyze
    days: Days to look back (default: 28)
    row_limit: Rows to return (default: 20, max: 500)

Inputs: page_url (required), site_url (required), days, row_limit. Returns: result

get_seo_audit_reportA
Read-onlyIdempotent

Return a structured technical SEO action plan with stable rule IDs, affected URLs, evidence, fix guidance, crawl coverage and limits. No Google credentials required. Save the returned JSON in your MCP client to compare later with compare_seo_audits. Optional rendered/compare modes execute JavaScript in a guarded browser; include_sitemaps discovers nested sitemaps and checks unlinked candidates. max_seconds bounds the crawl. Preserves query strings. Respects robots.txt by default; turn this off only for a site you control. max_pages is capped by server configuration.

Inputs: start_url (required), max_pages, max_seconds, render_mode, +2 more. Returns: result

get_server_statusB
Read-onlyIdempotent

Inspect local setup without credential values, network calls, or starting jobs. Credential presence does not prove current Google permissions or quota.

Inputs: no named parameters. Returns: result

get_sitemapsC
Read-onlyIdempotent
List all sitemaps for a property with detailed info.

Args:
    site_url: Exact GSC property URL

Inputs: site_url (required). Returns: result

inspect_robots_txtB
Read-onlyIdempotent
Fetch and summarize the site's robots.txt file.

Args:
    url_or_origin: Full URL, origin, or sc-domain property

Inputs: url_or_origin (required). Returns: result

inspect_urlB
Read-onlyIdempotent
Inspect a URL for indexing status, rich results, and mobile usability.

Args:
    site_url: Exact GSC property URL (e.g. "sc-domain:example.com")
    page_url: The specific URL to inspect

Inputs: page_url (required), site_url (required). Returns: result

list_audit_eventsB
Read-onlyIdempotent

Read a local change/failure/recovery inbox without marking events as read. Pass next_after_id on the next call; retain the latest 500 events per project. Only verified new/resolved findings trigger change events; sampling changes and unchanged reports stay quiet. No external notification is transmitted.

Inputs: project_id (required), limit, after_id.

list_audit_projectsA
Read-onlyIdempotent

List local projects, settings, schedule state and latest run status.

Inputs: no named parameters.

list_project_auditsC
Read-onlyIdempotent

List up to 100 retained snapshots, newest first, with coverage and issue summaries.

Inputs: project_id (required), limit.

list_propertiesB
Read-onlyIdempotent

Retrieves and returns the user's Search Console properties.

Inputs: no named parameters. Returns: result

prioritize_audit_issuesB
Read-onlyIdempotent

Add observed Search Console traffic to an audit action plan. Sort by severity, then affected-page clicks/impressions. Does not estimate revenue or ranking gains. Unmatched URLs are unknown, not zero. No page traffic is double-counted within a rule.

Inputs: site_url (required), report_json (required), days. Returns: result

reauthenticateA
Destructive

Authenticate a new account, then atomically replace the saved OAuth token. Existing credentials and service caches are preserved if login or saving fails.

Inputs: no named parameters. Returns: result

request_indexingA
Request Google to crawl and index a URL via the Indexing API.
IMPORTANT: Only works for pages with JobPosting or BroadcastEvent structured data.
Default quota: 200 requests/day.

Args:
    url: The full URL to request indexing for

Inputs: url (required). Returns: result

request_removalA
Destructive
Request Google to remove a URL from the index via the Indexing API.
IMPORTANT: Only works for pages with JobPosting or BroadcastEvent structured data.

Args:
    url: The full URL to request removal for

Inputs: url (required). Returns: result

run_lighthouse_auditA
Read-onlyIdempotent
Run a local Lighthouse CLI audit for an explicitly trusted URL.
Requires SEO_AUDIT_ENABLE_LOCAL_LIGHTHOUSE=true, Node.js and Chrome/Chromium.
Lighthouse browser networking is not guarded by the public crawl transport.

Args:
    url: Full page URL
    form_factor: mobile or desktop
    categories: Comma-separated Lighthouse categories

Inputs: url (required), categories, form_factor. Returns: result

run_project_auditA
Destructive

Fetch a project now, save its immutable report, and record verified finding changes. Prunes oldest snapshots to project retention. One run per project; ten-minute timeout. Returns audit_id; use get_project_audit for the full snapshot. Alerts stay in the local event inbox; no email, messaging or webhook is sent.

Inputs: project_id (required).

set_audit_scheduleA

Explicitly enable/disable a project's recurring audit (60 seconds to 31 days). First run is due one interval after enabling. A separate mcp-seo-monitor worker must be running; the MCP stdio server does not launch background work. Failures back off; disabling prevents future scheduled claims, leaving an active run to finish.

Inputs: project_id (required), enabled, interval_seconds.

site_auditA
Read-onlyIdempotent
Check sitemap submission health, performance, and a sample of top search pages for indexing issues.
This sample cannot establish indexing coverage across the entire property.

Args:
    site_url: Exact GSC property URL (e.g. "sc-domain:example.com")
    sitemap_url: Optional submitted sitemap to include in the GSC health report (not crawled here).
    max_inspect: Max URLs to inspect (0-100, default: 30, costs 1 API call each)

Inputs: site_url (required), max_inspect, sitemap_url. Returns: result

split_branded_queriesA
Read-onlyIdempotent
Split search performance into branded vs non-branded queries.
Separates query-visible traffic; one period alone does not establish growth.

Args:
    site_url: Exact GSC property URL
    brand_name: Your brand name to filter (e.g. "cdljobscenter")
    days: Days to look back (default: 28)

Inputs: site_url (required), brand_name (required), days. Returns: result

submit_sitemapB
Submit or resubmit a sitemap to Google.

Args:
    site_url: Exact GSC property URL
    sitemap_url: Full URL of the sitemap to submit

Inputs: site_url (required), sitemap_url (required). Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 43 tools

    Disambiguation3/5

    Many tools target distinct GSC, indexing, and project operations, but several overlap—especially the multiple search-analytics variants (basic, advanced, snapshot) and the various audit/crawl tools (audit_live_site, site_audit, get_seo_audit_report, crawl_site_seo). Descriptions help clarify boundaries, but an agent can still misselect without careful reading.

    Naming Consistency4/5

    Mostly consistent snake_case with verb_noun patterns (e.g., get_search_analytics, submit_sitemap, create_audit_project). Minor deviations like site_audit and reauthenticate are readable and do not seriously hinder predictability.

    Tool Count2/5

    43 tools is excessive for the domain; many functions could be consolidated (e.g., analytics variants, audit variants, and project CRUD pieces). The breadth suggests feature sprawl rather than a tightly scoped set.

    Completeness4/5

    The surface covers a wide SEO audit lifecycle: properties, search analytics, indexing, sitemaps, URL inspection, live crawling, project management, scheduling, event listing, and comparison. Missing delete/update operations for audit projects are minor gaps an agent can work around.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      MCP server for Google Search Console, URL Inspection & Indexing API — search analytics, sitemap management, and batch indexing
      13
      149 npm
      8
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server for Google Search Console. 21 tools for search analytics, keyword opportunities, URL inspection, sitemaps, indexing, and property management.
      1
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      MCP server for advanced Google Search Console analysis — keyword cannibalization detection, page-level query deep dive, and rank change tracking.
      3
      MIT
    • 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
      17 npm
      6
      MIT