# geoseo-mcp (pypi · geoseo-mcp)

SEO + GEO: Search Console, Bing, Yandex, IndexNow, AI Overviews and LLM citation tracking.

- Trust score: 77/100 (medium)
- Change this week: +15
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-04

## Components

- pypi · `geoseo-mcp`: 77/100 (this document), [markdown](https://verifymcp.io/servers/rachit8484-geoseo-mcp/geoseo-mcp.md), [page](https://verifymcp.io/servers/rachit8484-geoseo-mcp/geoseo-mcp)

## Channel facts

- Registry: `pypi`
- Package: `geoseo-mcp`
- Version: `0.4.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-04.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised build step with no custom scripting around it.
  - 2 of 46 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to Rachit8484/geoseo-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 11 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 63/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 4361 tokens (~92/item across 47 items; 47 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 73/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 6% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 47 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 48 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the geoseo-mcp server?

geoseo-mcp runs locally as a PyPI package, launched with uvx geoseo-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add rachit8484-geoseo-mcp -- uvx geoseo-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "rachit8484-geoseo-mcp": {
      "command": "uvx",
      "args": [
        "geoseo-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "rachit8484-geoseo-mcp": {
      "command": "uvx",
      "args": [
        "geoseo-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add rachit8484-geoseo-mcp -- uvx geoseo-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "rachit8484-geoseo-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "geoseo-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add rachit8484-geoseo-mcp --command uvx --arg geoseo-mcp
```

### Hermes

```yaml
mcp_servers:
  rachit8484-geoseo-mcp:
    command: "uvx"
    args: ["geoseo-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "rachit8484-geoseo-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "geoseo-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add rachit8484-geoseo-mcp -t stdio -c uvx -a geoseo-mcp
```

### Other

```json
{
  "mcpServers": {
    "rachit8484-geoseo-mcp": {
      "command": "uvx",
      "args": [
        "geoseo-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-30 (score 77, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-23 (score 62)

First indexed and scored.

## MCP tools (47)

### `geoseo_status` (~57 tokens)

Report which engines are configured and reachable.

Always safe to call. Returns a dict keyed by engine name with
\`configured: bool` and a short message. Use this as the first call
in a session to know what's available.

### `gsc_list_sites` (~57 tokens)

List all Search Console properties the authenticated user can access.

Returns a list of site entries with ``siteUrl`` and ``permissionLevel``.
Use ``siteUrl`` from this list as input to other ``gsc_*`` tools.

### `gsc_performance` (~221 tokens)

Query GSC search analytics.

Input parameters:

- `country`: ISO 3166-1 alpha-3 country filter (e.g. ``usa``).
- `device`: ``desktop``, ``mobile``, or ``tablet``.
- `dimensions`: One or more of ``query``, ``page``, ``country``, ``device``, ``date``, ``searchAppearance``. Defaults to ``["query"]``.
- `end_date`: ISO date. Defaults to 2 days ago (GSC has ~2-day latency).
- `row_limit` (integer): Max rows (capped at 25,000).
- `search_type` (string): ``web``, ``image``, ``video``, ``news``, or ``discover``.
- `site_url` (string, required): The property as it appears in GSC (e.g. ``sc-domain:example.com`` or ``https://example.com/``).
- `start_date`: ISO date (YYYY-MM-DD). Defaults to 28 days ago.

### `gsc_inspect_url` (~80 tokens)

Get index status for a specific URL via the URL Inspection API.

Returns coverage state, last crawl time, mobile usability, indexed verdict,
and indexing rich-result data. Slow (~1s/call); rate-limited by Google.

Input parameters:

- `language_code` (string)
- `site_url` (string, required)
- `url` (string, required)

### `gsc_submit_sitemap` (~65 tokens)

Submit (or resubmit) a sitemap URL to GSC.

\``feedpath`` is the absolute URL of the sitemap, e.g.
\``https://example.com/sitemap.xml``.

Input parameters:

- `feedpath` (string, required)
- `site_url` (string, required)

### `bing_list_sites` (~21 tokens)

List all Bing-verified sites for the API key owner.

### `bing_query_stats` (~57 tokens)

Last-6-months query stats from Bing Webmaster (clicks, impressions, position).

\``site_url`` must match what Bing has verified, e.g. ``https://example.com/``.

Input parameters:

- `site_url` (string, required)

### `bing_page_stats` (~24 tokens)

Per-page stats from Bing Webmaster.

Input parameters:

- `site_url` (string, required)

### `bing_url_info` (~36 tokens)

Index status + crawl info for a single URL on Bing.

Input parameters:

- `site_url` (string, required)
- `url` (string, required)

### `bing_submit_url` (~40 tokens)

Submit a URL for fast crawling. Daily quota applies (default ~10/day).

Input parameters:

- `site_url` (string, required)
- `url` (string, required)

### `bing_crawl_issues` (~32 tokens)

Crawl errors / blocked URLs / DNS issues reported by Bingbot.

Input parameters:

- `site_url` (string, required)

### `yandex_list_sites` (~21 tokens)

List sites in the token owner's Yandex Webmaster account.

### `yandex_site_summary` (~67 tokens)

Site quality index (SQI), pages in search, excluded pages, problem counts.

\``site`` can be a URL (``https://example.com/``) or a Yandex host id
(``https:example.com:443``).

Input parameters:

- `site` (string, required)

### `yandex_query_stats` (~131 tokens)

Top Yandex search queries: shows, clicks, average show/click position.

\``order_by``: ``TOTAL_SHOWS`` or ``TOTAL_CLICKS``. ``device``: ``ALL``,
\``DESKTOP``, ``MOBILE_AND_TABLET``, ``MOBILE``, ``TABLET``. Dates are
\``YYYY-MM-DD``; defaults to the last week.

Input parameters:

- `date_from`
- `date_to`
- `device` (string)
- `limit` (integer)
- `order_by` (string)
- `site` (string, required)

### `yandex_url_info` (~40 tokens)

Indexing + search status for a URL in Yandex "Monitoring important pages".

Input parameters:

- `site` (string, required)
- `url` (string, required)

### `yandex_submit_url` (~37 tokens)

Queue a URL for Yandex recrawl. Daily quota applies.

Input parameters:

- `site` (string, required)
- `url` (string, required)

### `yandex_crawl_issues` (~34 tokens)

Active Yandex site diagnostics (by severity) plus sample broken internal links.

Input parameters:

- `site` (string, required)

### `indexnow_submit_url` (~75 tokens)

Notify Bing, Yandex, Naver, Seznam, and Yep that a single URL was published or updated.

Requires ``GEOSEO_INDEXNOW_KEY`` env var (a 32-char hex string you also
host at ``https://yourdomain.com/<key>.txt``).

Input parameters:

- `url` (string, required)

### `indexnow_submit_urls` (~47 tokens)

Batch-notify search engines about up to 10,000 URLs (must share one host).

Best for sitemap-wide rebuilds or large content updates.

Input parameters:

- `urls` (array, required)

### `perplexity_query` (~92 tokens)

Ask Perplexity (Agent API + web search); return answer + cited URLs/domains.

Defaults to the ``fast`` effort preset. Pass ``model`` to pin one
(e.g. ``openai/gpt-5-mini``); legacy names like ``sonar`` still work.

Input parameters:

- `max_tokens`
- `model`
- `question` (string, required)
- `system_prompt`

### `perplexity_citation_check` (~46 tokens)

Citation share for ``target_domain`` across a Perplexity question batch.

Input parameters:

- `model`
- `questions` (array, required)
- `target_domain` (string, required)

### `openai_query` (~78 tokens)

Ask ChatGPT (with web search) a question; return answer + cited URLs.

Uses the OpenAI Responses API with the ``web_search`` tool.
Default model: ``GEOSEO_OPENAI_MODEL`` (``gpt-5-mini``).

Input parameters:

- `model`
- `question` (string, required)
- `system_prompt`

### `claude_query` (~53 tokens)

Ask Claude (with server-side web search) a question; return answer + cited URLs.

Input parameters:

- `max_tokens` (integer)
- `model`
- `question` (string, required)
- `system_prompt`

### `gemini_query` (~79 tokens)

Ask Gemini (with Google Search grounding) a question; return answer + cited URLs.

Grounding sources here are the same signal Google uses for AI Overviews,
so this is the closest open-API proxy for "what AIO might cite for this query".

Input parameters:

- `model`
- `question` (string, required)
- `system_prompt`

### `grok_query` (~127 tokens)

Ask Grok (with live web search) a question; return answer + cited URLs.

Uses the xAI Responses API with the ``web_search`` tool. ``citations``
are the URLs Grok actually cites inline; ``sources_considered`` lists
everything it looked at. Set ``x_search=True`` to also search X posts.
Default model: ``GEOSEO_GROK_MODEL`` (``grok-4.3``).

Input parameters:

- `model`
- `question` (string, required)
- `system_prompt`
- `x_search` (boolean)

### `brave_query` (~89 tokens)

Ask Brave's AI Answers (grounded in Brave Search); return answer + cited URLs.

Brave runs its own independent web index, so it is a useful extra
signal next to Google/Bing-backed engines. Requires the Brave Answers
plan (``GEOSEO_BRAVE_API_KEY``).

Input parameters:

- `country` (string)
- `language` (string)
- `question` (string, required)

### `multi_llm_query` (~100 tokens)

Ask the same question to all (or selected) configured LLM engines in parallel.

\``engines``: optional subset of ``["perplexity","openai","anthropic","gemini","grok","brave"]``.
Default: every engine with credentials configured (see ``geoseo_status``).
Engines that error are reported per-engine and don't block the others.

Input parameters:

- `engines`
- `question` (string, required)

### `multi_llm_citation_check` (~256 tokens)

How often each configured LLM cites (or mentions) ``target_domain``.

The headline GEO/AEO tool. Feed it your top 20-50 buyer questions and get
a per-engine breakdown for ChatGPT/Claude/Gemini/Perplexity/Grok/Brave:

\- ``citation_rate`` (+ 95% interval): share of answers linking to your
  domain or any subdomain of it.
\- ``mention_rate`` / ``unlinked_mention_rate``: answers that name your
  brand, with or without a link. Pass ``brand_aliases`` (e.g.
  \``["Acme", "Acme CRM"]``) if your brand isn't obvious from the domain.
\- ``top_competing_domains`` and per-question results.

LLM answers vary run to run, so every question is asked ``samples``
times per engine (default ``GEOSEO_CITATION_SAMPLES``, 3; max 10).
Cost scales with questions x samples x engines.

Input parameters:

- `brand_aliases`
- `engines`
- `max_concurrency`
- `questions` (array, required)
- `samples`
- `target_domain` (string, required)

### `list_llm_engines` (~24 tokens)

Return the LLM engines currently configured (have an API key).

### `aio_check` (~103 tokens)

Run a Google search via SerpAPI and parse the AI Overview block.

Returns ``aio_present``, the AIO answer text, the URLs/domains AIO
cites, and the top-10 organic results for context. Use this to
track which pages Google's generative answers actually source.

Input parameters:

- `gl` (string)
- `google_domain` (string)
- `hl` (string)
- `location`
- `query` (string, required)

### `aio_citation_check` (~96 tokens)

For a batch of queries, report AIO fire-rate and citation share for ``target_domain``.

This is the GEO companion to ``multi_llm_citation_check`` — same
idea, but specifically for Google's on-SERP AI Overviews. Run
weekly and snapshot to ``snapshot_serp_aio`` to track AIO
visibility over time.

Input parameters:

- `queries` (array, required)
- `target_domain` (string, required)

### `audit_page` (~197 tokens)

Audit a single page (local file path or http(s) URL).

Set ``render=True`` to audit the page after JavaScript runs (needs the
optional ``geoseo-mcp[render]`` extra + ``playwright install chromium``).
Either way the report flags pages that are empty without JavaScript,
since most AI crawlers don't execute it.

Returns a structured report with: title/meta/headings, word count,
link counts, image alt coverage, JSON-LD schema types, Open Graph,
Twitter Card, freshness signals, GEO-quotability score, and a list
of human-readable findings. Plus a 0-100 overall ``score``.

Examples:
    ``audit_page("seo/aa-meetings-what-to-expect.html")``
    ``audit_page("https://soberpath.com/blog/quit-drinking")``

Input parameters:

- `render` (boolean)
- `source` (string, required)

### `audit_site` (~83 tokens)

Recursively audit every HTML file under a folder.

Returns per-file scores, an aggregate summary (mean score, worst pages,
most common findings), and the top opportunities for improvement.

Useful as the first call against a content directory to spot the worst
offenders quickly.

Input parameters:

- `folder` (string, required)
- `limit` (integer)
- `pattern` (string)

### `find_broken_external_links` (~243 tokens)

Find dead, redirected, or flaky outbound links across a folder of HTML.

Every external ``<a href>`` is collected (``mailto:``, ``tel:``,
\``javascript:`` and in-page anchors are skipped) and each unique URL is
checked once with HEAD, falling back to GET for servers that refuse
HEAD. Results are grouped as ``ok`` / ``redirect`` / ``client_error`` /
\``server_error`` / ``timeout`` / ``dns_fail`` / ``error``, and every
non-ok link lists the pages it appears on plus a suggested action.

\``site_host`` (e.g. ``"example.com"``) marks absolute links to your own
site as internal so they're skipped. Results are cached locally for
\``cache_days`` (set 0 to force a fresh check); timeouts are never cached.

Input parameters:

- `cache_days` (number)
- `concurrency` (integer)
- `folder` (string, required)
- `include_ok` (boolean)
- `max_urls` (integer)
- `pattern` (string)
- `site_host`
- `timeout` (number)

### `lint_schema_page` (~181 tokens)

Validate a page's JSON-LD against Google's structured-data requirements.

\``source`` is a local HTML file or an http(s) URL. Every
\``application/ld+json`` block is parsed (``@graph`` included) and each
typed entity is checked against Google's documented required and
recommended properties for Article, Product (with nested Offer /
AggregateRating / Review), Recipe, LocalBusiness, BreadcrumbList, Event,
VideoObject, SoftwareApplication, JobPosting, QAPage, Review and
Organization. FAQPage and HowTo are checked against schema.org since
Google no longer shows those rich results.

Returns per-entity ``{type, ok, required_missing, recommended_missing,
line_estimate, doc}``. ``ok`` is false when a required property is
missing or the JSON is invalid.

Input parameters:

- `source` (string, required)

### `lint_schema_site` (~79 tokens)

Run ``lint_schema_page`` over every HTML file in a folder.

Returns files with errors, files that have no JSON-LD at all, a count
of schema types found, the most common missing required properties,
and per-file problems.

Input parameters:

- `folder` (string, required)
- `limit` (integer)
- `pattern` (string)

### `generate_llms_txt` (~196 tokens)

Generate a draft ``llms.txt`` from a folder of HTML pages.

\``llms.txt`` (https://llmstxt.org) is the emerging standard for telling
LLM crawlers where your canonical content lives. This tool reads each
page's ``<title>`` and meta description, groups by URL prefix, and
produces spec-compliant Markdown ready to drop at ``/llms.txt``.

\``section_strategy`` controls grouping:
    - ``first_path_segment`` (default): groups by first URL path
      segment, e.g. all ``/blog/...`` pages under "Blog".
    - ``flat``: a single "Pages" section.

Input parameters:

- `folder` (string, required)
- `limit` (integer)
- `pattern` (string)
- `section_strategy` (string)
- `site_summary`
- `site_title`
- `site_url` (string, required)

### `validate_llms_txt` (~68 tokens)

Validate an ``llms.txt`` file (local path or URL) against the spec.

Returns parsed structure plus an ``issues`` list with line numbers for
any violations (missing H1, broken link syntax, non-http(s) URLs, etc).

Input parameters:

- `source` (string, required)

### `internal_link_graph` (~159 tokens)

Audit a folder of HTML pages as a directed internal-link graph.

Returns counts of files/edges, the orphans (no inbound links),
dead-ends (no outbound links), top hub pages, and a list of
dangling internal hrefs that don't resolve to any file.

Pass ``site_host`` (e.g. ``"example.com"``) if pages link to
themselves with absolute URLs — those will then count as internal
edges. Files are also matched by URL slug, so ``/blog/foo``
resolves to ``foo.html`` even when paths don't match exactly.

Input parameters:

- `folder` (string, required)
- `limit` (integer)
- `pattern` (string)
- `site_host`

### `suggest_internal_links` (~228 tokens)

Suggest top-K internal links to add to each page in a folder.

By default uses TF-IDF cosine similarity over ``<title>``, headings,
meta description and body text (offline, free). Set ``mode`` to
\``"openai"`` (text-embedding-3-small), ``"gemini"``
(gemini-embedding-001) or ``"local"`` (sentence-transformers) for
embedding similarity; ``model`` overrides the default model. Vectors
are cached in SQLite by content hash, so re-runs are cheap. Excludes links the source already has, plus
the page itself. Returns suggestions for ``page`` only if
provided, otherwise for every page.

Each suggestion includes a cheap ``anchor_hint`` derived from
terms shared between source headings and target title.

Input parameters:

- `folder` (string, required)
- `limit` (integer)
- `mode` (string)
- `model`
- `page`
- `pattern` (string)
- `site_host`
- `top_k` (integer)

### `trend_init` (~23 tokens)

Create the local SQLite snapshot DB if it doesn't exist; return its path.

### `trend_stats` (~25 tokens)

Inventory of what's stored: row counts, sites/domains, oldest/newest snapshots.

### `snapshot_gsc` (~110 tokens)

Run a GSC performance query and persist the rows as a snapshot.

Run this on a schedule (cron, n8n, ``launchd`` — anything that can
invoke an MCP tool) to build a local time-series of search
performance. Default dimensions: ``["query"]``.

Input parameters:

- `dimensions`
- `end_date`
- `row_limit` (integer)
- `search_type` (string)
- `site_url` (string, required)
- `start_date`

### `snapshot_llm_citations` (~105 tokens)

Run multi-LLM citation check and persist the per-question results.

Builds the dataset behind ``trend_llm_citations``. ``engines``
defaults to every configured LLM (see ``geoseo_status``). With
\``samples > 1`` a question is stored as cited when most samples cite you.

Input parameters:

- `engines`
- `questions` (array, required)
- `samples` (integer)
- `target_domain` (string, required)

### `snapshot_serp_aio` (~48 tokens)

Run AIO citation check via SerpAPI and persist as ``serpapi_aio`` engine rows.

Input parameters:

- `queries` (array, required)
- `target_domain` (string, required)

### `trend_gsc` (~87 tokens)

Time-series of clicks/impressions/position from stored GSC snapshots.

Aggregates by ``captured_at``. Filter by ``query`` and/or ``page``
to drill in. Returns up to ``limit`` most recent snapshots in
chronological order.

Input parameters:

- `limit` (integer)
- `page`
- `query`
- `site_url` (string, required)

### `trend_llm_citations` (~91 tokens)

Per-snapshot citation share for ``target_domain`` over time.

\``engine`` filters to one of ``perplexity|openai|anthropic|gemini|serpapi_aio``.
Returns rows of ``{captured_at, engine, questions, cited, citation_share}``.

Input parameters:

- `engine`
- `limit` (integer)
- `target_domain` (string, required)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/rachit8484-geoseo-mcp/geoseo-mcp#diagnostics

## Score history

- 2026-11-04: 77
- 2026-11-03: 77
- 2026-11-02: 77
- 2026-11-01: 77
- 2026-10-31: 77
- 2026-10-30: 77
- 2026-10-29: 62
- 2026-10-28: 62
- 2026-10-27: 62
- 2026-10-26: 62
- 2026-10-25: 62
- 2026-10-24: 62
- 2026-10-23: 62

## Common questions

### What is the geoseo-mcp server?

geoseo-mcp is listed in the public MCP registry as io.github.Rachit8484/geoseo-mcp. SEO + GEO: Search Console, Bing, Yandex, IndexNow, AI Overviews and LLM citation tracking. This page covers its PyPI package (geoseo-mcp).

### Is the geoseo-mcp server safe to use?

geoseo-mcp scores 77 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the geoseo-mcp server expose?

geoseo-mcp exposes 47 tools: geoseo_status, gsc_list_sites, gsc_performance, gsc_inspect_url, gsc_submit_sitemap, and 42 more. Their descriptions and schemas cost roughly 4,208 tokens of context every time the server is loaded.

### Is the geoseo-mcp server still maintained?

geoseo-mcp is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the geoseo-mcp server under?

geoseo-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- PyPI project: https://pypi.org/project/geoseo-mcp/
- Socket report: https://socket.dev/pypi/package/geoseo-mcp
- Repository: https://github.com/Rachit8484/geoseo-mcp
- Changelog RSS feed: https://verifymcp.io/servers/rachit8484-geoseo-mcp/geoseo-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/rachit8484-geoseo-mcp/geoseo-mcp.json
- HTML version of this page: https://verifymcp.io/servers/rachit8484-geoseo-mcp/geoseo-mcp
