# Seo Monster

> SEOMonster: a local, user-credential-driven MCP server for SEO workflows over Google Search Console, GA4, PageSpeed Insights, and Cloudflare. Read-first, open source.

- **Type:** MCP server
- **Install:** `agentstack add mcp-avansaber-seo-monster`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [avansaber](https://agentstack.voostack.com/s/avansaber)
- **Installs:** 0
- **Category:** [Cloud & Infrastructure](https://agentstack.voostack.com/c/cloud-infrastructure)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [avansaber](https://github.com/avansaber)
- **Source:** https://github.com/avansaber/seo-monster

## Install

```sh
agentstack add mcp-avansaber-seo-monster
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## 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.

  
  
  
  
  
  

  
  &nbsp;
  
  &nbsp;
  

---

You don't open a new tool — you just ask, in plain English, inside **Claude** (or Cursor / Cline / Codex):

> **You** &nbsp; *"What should I write about next?"*
>
> **🦖 SEOMonster** &nbsp; 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-call `confirm` token.
- **Lean.** Standard library + the `mcp` SDK + the Google client libraries; PageSpeed and Cloudflare ride on `urllib`, no extra HTTP dependency.

## Quickstart

> [!TIP]
> Fastest path: the **one-click install** buttons above. Or add it to any MCP client by hand:

```json
{
  "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

```mermaid
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`](https://docs.astral.sh/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
  (likely_positive / likely_negative / 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](https://github.com/avansaber)
- **Source:** [avansaber/seo-monster](https://github.com/avansaber/seo-monster)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** yes
- **Filesystem access:** no
- **Shell / process execution:** yes
- **Environment & secrets:** yes
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/mcp-avansaber-seo-monster
- Seller: https://agentstack.voostack.com/s/avansaber
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
