mcp-seo-audit
mcp-seo-audit is a local MCP server for technical SEO audits, Google Search Console analytics, performance checks, and recurring monitoring.
Manage Search Console properties: list, add, and delete sites.
Pull Search Console analytics: basic/advanced reports, performance overviews, period comparisons, page-query queries, striking-distance keywords, cannibalization, and branded/non-branded splits.
Inspect URLs and indexing: single/batch URL inspection, indexing notifications, and indexing/removal requests for JobPosting or BroadcastEvent pages.
Manage and analyze sitemaps: list/submit/delete GSC sitemaps and fetch/analyze XML sitemaps.
Check performance: CrUX Core Web Vitals, PageSpeed Insights, and local Lighthouse audits when enabled.
Run live SEO checks: robots.txt inspection, page SEO analysis, same-origin crawling, and live-site audits.
Use structured audit reports, compare audits, and run raw/rendered/compare crawl modes with sitemap discovery and coverage limits.
Create and monitor audit projects: schedules, run history, snapshots, change events, comparison, and a separate monitor worker.
Reauthenticate Google access and report server status/config readiness.
Store audit history locally in SQLite with retention limits and optional Google credentials.
Provides capabilities for requesting URL indexing or removal via the Web Search Indexing API and retrieving Core Web Vitals performance metrics through the Chrome UX Report (CrUX) API.
Utilizes Google Cloud Console for managing API credentials and enabling the Search Console and Web Search Indexing APIs required for site analysis.
Offers comprehensive tools for managing properties, querying search performance analytics, inspecting URL status, and performing SEO audits within Google Search Console.
mcp-seo-audit
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 .venvActivate 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 chromiumFor 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.0Configure 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 --onceGoogle 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_FILEto its downloaded client JSON. SetGSC_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_PATHto the key file, grant the account access to the relevant Search Console property, and useGSC_SKIP_OAUTH=true.Performance APIs: set
CRUX_API_KEYfor CrUX and optionallyPAGESPEED_API_KEYfor PageSpeed Insights.GOOGLE_API_KEYis 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 |
| A finding appeared with applicable evidence in both snapshots. |
| A successful applicable recheck verified the finding disappeared. |
| The finding remains. |
| The baseline did not cover the page or its dependencies. |
| 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-monitorOr process one bounded batch and exit, suitable for an external OS scheduler:
mcp-seo-monitor --onceThe 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 |
|
macOS |
|
Linux |
|
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 |
|
Search analytics |
|
SEO opportunities |
|
URL inspection |
|
Indexing notifications |
|
Google sitemaps |
|
Performance |
|
Live inspection |
|
Structured reports |
|
Projects and monitoring |
|
Authentication and 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 |
|
| OAuth desktop-client file; prefer an explicit external path. |
| Conventional service-account locations | Service-account JSON path. |
|
| Token destination; legacy package token is a read fallback. |
|
| Skip interactive OAuth for Google tools. |
|
|
|
| Empty | CrUX API key. |
|
| PageSpeed Insights key. |
| Empty | Fallback PageSpeed key. |
| Platform user-data directory | Project/history storage and default token location. |
| Playwright Chromium | Optional installed Chromium executable for rendered crawling. |
|
| Enable mutating Google tools. |
|
| Allow private destinations only for deliberately trusted testing. |
|
| Per-response decoded-byte cap; also bounds direct JSON report inputs. |
|
| HTTP-fetch redirect cap. |
|
| URL cap for individual sitemap analysis. |
|
| Ceiling for crawl page attempts. |
|
| Permit separate Lighthouse execution for trusted targets. |
| Auto-detect | Installed Lighthouse executable path. |
|
| Chrome path for local Lighthouse. |
|
| Permit downloading/running Lighthouse through |
|
| Legacy Lighthouse-only sandbox override; keep disabled normally. |
Crawl and rendering boundaries
Crawls stay on the starting origin, use the
mcp-seo-audituser 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_auditTests 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 toolsadd_siteBIdempotent
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_seoBRead-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_sitemapBRead-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_siteARead-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_urlsARead-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_notificationBRead-onlyIdempotent
Check the latest indexing notification status for a URL.
Args:
url: The URL to check
Inputs: url (required). Returns: result
compare_project_auditsBRead-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_periodsBRead-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_auditsARead-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_seoARead-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_siteCDestructiveIdempotent
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_sitemapBDestructiveIdempotent
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_cannibalizationARead-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_keywordsARead-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_analyticsARead-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_vitalsARead-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_insightsBRead-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_overviewBRead-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_auditARead-onlyIdempotent
Load an immutable retained audit snapshot by its project-scoped audit_id.
Inputs: audit_id (required), project_id (required).
get_search_analyticsARead-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_snapshotARead-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_queryBRead-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_reportARead-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_statusBRead-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_sitemapsCRead-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_txtBRead-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_urlBRead-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_eventsBRead-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_projectsARead-onlyIdempotent
List local projects, settings, schedule state and latest run status.
Inputs: no named parameters.
list_project_auditsCRead-onlyIdempotent
List up to 100 retained snapshots, newest first, with coverage and issue summaries.
Inputs: project_id (required), limit.
list_propertiesBRead-onlyIdempotent
Retrieves and returns the user's Search Console properties.
Inputs: no named parameters. Returns: result
prioritize_audit_issuesBRead-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
reauthenticateADestructive
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_removalADestructive
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_auditARead-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_auditADestructive
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_auditARead-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_queriesARead-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
Scored across 43 tools
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.
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.
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.
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
Related MCP Connectors
SEO MCP server for keyword research, SERP analysis, audits, and Search Console workflows.
SEO MCP: Search Console, GA4, SERP and domain data, rank tracking, AI citations and site fixes.
SEO MCP server for keyword research, live SERPs, backlinks, site audits and AI visibility.
Free Google Search Console MCP + Bing Webmaster Tools: queries, URL inspection, sitemaps.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server for Google Search Console, URL Inspection & Indexing API — search analytics, sitemap management, and batch indexing13149 npm8MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for Google Search Console. 21 tools for search analytics, keyword opportunities, URL inspection, sitemaps, indexing, and property management.1MIT
- AlicenseAqualityDmaintenanceMCP server for advanced Google Search Console analysis — keyword cannibalization detection, page-level query deep dive, and rank change tracking.3MIT
- AlicenseBqualityDmaintenanceProfessional 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.4017 npm6MIT