Install
$ agentstack add mcp-avansaber-seo-monster ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ● Shell / process execution Used
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Don't learn another SEO dashboard. Just ask.
The open-source SEO analyst that lives inside the AI assistant you already use —working from your own Search Console, Analytics, and PageSpeed data, on your machine.
You don't open a new tool — you just ask, in plain English, inside Claude (or Cursor / Cline / Codex):
> You "What should I write about next?" > > 🦖 SEOMonster Pulls your Search Console and surfaces three topics you're almost ranking for — positions 8–20 with real demand — ranked by opportunity. Say the word and it drafts the brief.
| You ask … | … SEOMonster does | | :-- | :-- | | "What should I write about next?" | Surfaces near-ranking topics from your own Search Console demand | | "Is this page ready to publish?" | Runs the technical-SEO + structured-data checks before you ship | | "Get this indexed." | Nudges Google (Indexing API) and Bing / Yandex (IndexNow) | | "Did my change actually move rankings?" | Before/after attribution vs a matched control group — with a confidence interval, not a guess | | "Is ChatGPT recommending us, or our competitors?" | Tracks your brand's share of voice across the AI answer engines |
70 tools across Search Console, GA4, PageSpeed, Cloudflare, AI-citation tracking, keyword discovery, and technical SEO — every one returning the same JSON result envelope, every one driven by your own credentials. No new dashboard to learn; you chat with the assistant you already use.
> [!NOTE] > Published on PyPI as seo-monster (so the command is uvx seo-monster). The import package is seo_mcp; seo-mcp is a dev/local alias. The package ships zero secrets — every credential is resolved at runtime from your own environment or config file.
- Your data, your machine. User-credential-driven; nothing is sent to any third party.
- Read-first, safe by default. Reads always work; the two routine writes (sitemap submit, indexing request) are on by default; the Cloudflare write tools (cache purge, redirects, settings, managed robots.txt) are gated behind
SEO_MCP_ALLOW_DESTRUCTIVE, and the riskier ones also need a per-callconfirmtoken. - Lean. Standard library + the
mcpSDK + the Google client libraries; PageSpeed and Cloudflare ride onurllib, no extra HTTP dependency.
Quickstart
> [!TIP] > Fastest path: the one-click install buttons above. Or add it to any MCP client by hand:
{
"mcpServers": {
"seomonster": { "command": "uvx", "args": ["seo-monster"] }
}
}
Run the one-time Google sign-in once — uvx --from seo-monster seo-monster auth — then ask your assistant to call system_status to confirm what's connected. Full per-client setup and credentials are in [Install](#install) and [Auth](#auth).
How it works
flowchart LR
U["You — plain English"] --> H["Claude · Cursor · Cline · Codex"]
H -- "MCP · stdio" --> S["SEOMonster70 tools"]
S --> GSC["Search Console · GA4"]
S --> PSI["PageSpeed · CrUX"]
S --> CF["Cloudflare · IndexNow"]
S --> AI["AI engines · SERP(optional)"]
S -. "your creds · your machine" .-> U
SEOMonster is a stdio MCP server: your AI host launches it, it calls Google / Cloudflare / the AI engines with your credentials, and returns a consistent JSON envelope the assistant reads back to you in plain language.
Requirements
For the .mcpb bundle path (Claude Desktop): just Claude Desktop on macOS or Windows. The bundle declares Python 3.11+ as a runtime; Claude Desktop materializes the environment for you. No prior uv install needed.
For the uvx path (Cursor, Cline, Codex, advanced Claude Desktop): Python 3.11 or newer plus uv (which provides uvx). Find the absolute path to uvx with which uvx; GUI hosts do not read your shell profile, so MCP configs need the full path.
Tools
70 tools, grouped by service. All return the same result envelope (see [Result envelope](#result-envelope)). Call system_status first if unsure what is configured. The server also publishes thirteen named [workflow prompts](#workflow-prompts).
Cross-service
system_status- which services are configured/reachable, the Google auth
method and scopes, whether destructive mode is on, the full tool catalog, and the list of registered prompts.
📂 Browse all 70 tools — grouped by service (GSC · GA4 · AI/GEO · keyword discovery · content · PageSpeed/CrUX · Cloudflare · IndexNow · technical · schema). Click to expand.
Google Search Console (18)
Workhorses
gsc_list_properties- properties the credentials can see, with permission
level and a derived writable flag (true for siteOwner / siteFullUser).
gsc_search_analytics- the workhorse: clicks/impressions/CTR/position by
dimensions, date range, filters, and data_state.
gsc_top_queries/gsc_top_pages- convenience top-N wrappers.gsc_compare_periods- current vs prior window with per-key deltas.
v0.2.0 added sort_by, sort_dir, min_delta_clicks / _impressions / _position, anomalies_only + sigma_threshold, and top for one-call movers / losers / outliers reporting.
gsc_inspect_url- URL Inspection (index verdict, coverage, canonicals).gsc_batch_inspect_urls- inspect up to 25 URLs, per-URL failures collected.gsc_list_sitemaps- registered sitemaps and their status.gsc_submit_sitemap- submit a sitemap (write, un-gated; needs the writable
scope). Accepts either sitemap_url (friendly) or feedpath (raw API field).
gsc_request_indexing- request (re)crawl via the Indexing API (write,
un-gated). Accepts singular url or urls.
Query intelligence (v0.2.0)
gsc_query_opportunities- queries already ranking top N with below-target
CTR. Title and meta optimization candidates.
gsc_query_gaps- queries that draw impressions but barely any clicks.
Content opportunity signal.
gsc_new_queries- queries appearing in the current window with no prior
impressions. Emerging topics.
gsc_top_pages_by_query- which pages rank for a specific query. The
cannibalization audit input.
Multi-property + lifecycle (v0.5.0)
gsc_portfolio_summary(days, include?, exclude?)- multi-property fleet
view. Per-property one-row summary (clicks, impressions, CTR, position) for the last N days, plus a portfolio-level rollup. Honors optional include / exclude filters. The single fastest answer to "how is the whole portfolio doing?" across agency or multi-brand setups.
gsc_trending_pages(days, limit)- pages whose impressions grew most over
the last N days vs the prior N days. Wrapper on gsc_compare_periods with dimensions=["page"], sort_by="delta_impressions", sort_dir="desc".
gsc_decaying_pages(days, limit)- same wrapper, ascending sort. Pages
to rescue.
gsc_coverage_audit(urls, site_url?)- heuristic coverage audit. The GSC
Index Coverage report is not exposed in the API; this tool takes a user- supplied URL list (typically pulled from a sitemap) and bulk-inspects each, then rolls up verdicts (PASS / PARTIAL / FAIL) and coverage_state frequencies.
Content intelligence (4)
content_opportunities(site_url?, days?, count?, impressions_min?)- ranks
data-grounded content topics from your own Search Console data: fuses CTR-vs-expected gap (curve self-calibrated from your own per-position CTR), striking-distance position, demand, and momentum into a transparent opportunity score; flags cannibalization. If a GA4 property is configured, it also weights each topic by the organic conversions its top page already drives (up to +50%), so topics that convert rank higher; filters_applied.ga4_value_status reports whether that ran and why (applied / no_ga4_property / ga4_unreachable / no_conversions). Prioritizes demand you already have; does not do cold-start keyword research or write the content. Pairs with the content workflow prompts below. (GA4 weighting v0.7.3) v0.9.0 adds an additive per-candidate winnability block (banded: striking-distance + topical- proximity, GSC-personalization tier; existing fields unchanged).
content_brief_data(target_query, competitor_urls?, topic?, site_url?, days?)-
data-wired backing for a content brief: fetches the competitor pages (or your own GSC-ranking pages as a fallback) and returns the heading union, median word-count floor, schema types, and entity coverage, plus the 2026 GEO writing directives and validation rules. The host writes the prose; SEOMonster brings rules + evidence. Backs the content_brief prompt. (v0.9.0)
topic_cluster_map(cluster_path | pillar_url, site_url?, days?, impressions_min?)- maps a content cluster from your own GSC data and surfaces missing subtopics.
Classifies each cluster query into defend / optimize / create / monitor by demand and best position; the create quadrant is your missing-subtopic list. Flags cannibalization. GSC-only; honest about the ~47% query anonymization. (v0.9.0)
rank_change_attribution(url | urls, change_date, query?, site_url?, pre_days?, post_days?, gap_days?, control_scope?)- estimates whether an on-site change moved a page's clicks via
difference-in-differences against a matched control group (never a naked before/after). Returns an estimated lift with a 95% CI, a three-state verdict (likelypositive / likelynegative / inconclusive), and a confounders block that auto-detects the 2025 GSC data-regime breaks (impression bug, num=100) and downgrades position reliability. Observational, not causal -- a server-side split test is the only true causal test. GSC-only. (v0.9.0)
AI / GEO citation (3, v0.9.0) - whether the AI answer surfaces reach and cite you.
ai_citation_readiness(url)- is a page structured to be extracted/cited by
LLM answer engines? Leads with a render-blindness check (GPTBot / ClaudeBot / PerplexityBot fetch but do not run JS, so a client-rendered SPA is invisible to them), then scores evidence-backed signals (statistics, quotations, cited sources, no keyword-stuffing). schema.org / FAQ / llms.txt are reported as informational only -- the 2026 evidence does not support them as AI-citation drivers, so they are not scored. Free, HTTP-only.
ai_referral_overview(property_id?, site_url?, days?)- first-party AI traffic:
GA4 referral sessions from AI apps (the native ai-assistant channel plus a configurable source-host regex) and AI-crawler robots coverage (GPTBot, ClaudeBot, PerplexityBot, ...). Surfaces the ~70% dark-traffic undercount and keeps AI-Overview clicks (counted as Organic) separate. Free.
ai_citation_track(prompts, brand, brand_domains?, competitors?, engines?, samples?)- sampled brand mention + citation share-of-voice across AI engines
(Perplexity / OpenAI / Anthropic / Gemini APIs + Google AI Overviews via DataForSEO) for a managed prompt set, vs competitors. N samples/prompt (default 7) with a 95% CI, share-of-voice, and run-to-run volatility -- NOT an "AI rank" (single runs are statistically meaningless). Discloses that developer-API output differs from the logged-in consumer UI and that AIO has no API. Paid + non-deterministic. Needs at least one engine key and/or DataForSEO.
Keyword discovery (3, v0.9.0) - find terms you don't already rank for.
gsc_keyword_expand(candidates, site_url?, days?, impressions_min?)- you
(the host) brainstorm candidate terms from your winning queries; this grounds each against your own Search Console data (footprint covered / thin / none) with a sibling-strength confidence band. "none" = no VISIBLE footprint (GSC hides ~75% of impressions), so net-new terms are scored hypotheses. Free.
serp_adjacency_expand(seeds, include_paa?)- expand seed terms into adjacent
terms. FREE core: Google Autocomplete (no key). Optional People-Also-Ask + related searches via DataForSEO. Returns per-seed suggestions plus the aggregated net-new terms; degrades gracefully without a key.
keyword_universe(target_domain?, competitors?, keywords?, limit?)- optional,
paid. Core value: the competitor keyword GAP (DataForSEO Domain Intersection; no Google equivalent). Optional search volume / difficulty / intent via a provider chain (DataForSEO, else Google Ads volume-only). External volume is a degraded directional signal -- a tiebreaker, never a gate.
Google Analytics 4 (7)
ga4_run_report- the workhorse: arbitrary dimensions/metrics/date range,
optional dimension filter and ordering.
ga4_top_landing_pages- top landing pages, organic-only by default.ga4_traffic_by_channel- sessions/engagement/conversions by channel group.ga4_organic_search_overview- organic totals plus a day-by-day trend.ga4_setup_audit(property_id?)- read-only SEO-measurement-readiness audit:
web data stream, key events, data retention, content-group dimensions, and (v0.7.4) enhanced measurement, internal site search, and Google Signals. Severity-graded with a benign exception per finding. Uses the GA4 Admin API over REST (analytics.readonly; no extra dependency). (v0.7.0)
ga4_site_search(days?, limit?)- internal site-search query report (a
direct content-gap signal); honest envelope when no real search terms. (v0.7.1)
ga4_landing_page_conversions(days?, organic_only?, limit?)- organic
landing pages ranked by conversions. (v0.7.1)
PageSpeed Insights (2)
psi_analyze- Lighthouse scores, lab Core Web Vitals, and field (CrUX) Core
Web Vitals for a URL. Defaults to the mobile strategy. Field data carries a field_data_note: Google is deprecating PSI field data, so use crux_snapshot / crux_history for durable field metrics.
psi_opportunities(url, strategy?)- the actionable Lighthouse "opportunity"
audits (with estimated savings) plus the SEO-category audits, severity-graded. Lab data only. An on-page-basics checklist, not a ranking predictor. (v0.7.1)
Cloudflare (13)
cf_list_zones- zones the token can see.cf_zone_info- status, plan, name servers for a zone.cf_list_dns- DNS records (read-only); useful for verifying canonical host
and TXT verification records during migrations.
cf_web_analytics- read-only edge Web Analytics (RUM), to compare against
GA4. Cloudflare returns host: null for some sites; pass the site_tag to look those up explicitly.
cf_purge_cache- purge specific URLs (gated).cf_purge_cache_all- purge an entire zone (gated + confirm token).cf_settings_audit(zone?)- read-only audit of SEO-relevant Cloudflare zone
settings (SSL mode, Always-Use-HTTPS, HSTS, Automatic HTTPS Rewrites, Brotli, cache TTL). Severity-graded with a "verify, not fail" discipline because CF cannot see the origin; HSTS is never a hard failure. Needs Zone Settings Read on the token. Each finding carries a machine-readable fix hint (the exact cf_settings_update setting + recommended value) to chain audit -> fix. (v0.7.1)
cf_settings_update(settings, zone?, confirm?, acknowledge_hsts_risk?, dry_run?)- write the SEO/crawl/security settings the audit grades (SSL mode, Always-Use-
HTTPS, Automatic HTTPS Rewrites, Brotli, browser cache TTL, HSTS), closing the audit -> remediate loop. Gated. ssl_mode or any HSTS-raise needs confirm= (HSTS-raise also needs acknowledge_hsts_risk=true); validates locally, supports dry_run, and re-runs the audit so you see the finding clear. Needs Zone Settings:Edit (vs the audit's Read). (v0.7.10)
cf_list_redirects(zone?)- list a zone's single (dynamic) redirect rules
plus the account's Bulk Redirect lists (read-only). Call before any redirect write so nothing is clobbered. (v0.7.8; bulk lists added v0.7.9)
cf_create_redirect(source, target, status_code?, ...)- create one edge
redirect (e.g. a
…
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: avansaber
- Source: avansaber/seo-monster
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.