DigestSEO — AI Visibility MCP for SEO & GEO

MCP serverSearch

Your AI can track brand citations across five AI search engines with this community-built tool. Once it is added, you can ask which engines mention a brand and how often, so you know where that brand stands in AI search results. It was built by DigestSEO.

Unavailable. This server has no hosted endpoint yet, so Ahel can't serve it.

Add to setup to save this item as a reference. Ahel cannot run it, and signing in will not install it.

What your AI can do with it

  • Track brand citations across five AI search engines
  • Check how often each engine cites a brand
  • See which AI search engines mention a brand
  • Summarize where a brand shows up in AI search results

Getting started

  1. Save this item in Your setup as a reference.
  2. Read the source or reference documentation for its setup requirements. Saving it here does not connect it to your AI.
  3. Check this page for availability before trying to install it through Ahel.

From the project's README

As published by akzar1el/mcp-geo in README.md.

Quick Install

Runs locally over stdio with your own API keys — all data stays on your machine (see Privacy Policy). Set at least one engine key (OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, PERPLEXITY_API_KEY, SERPAPI_API_KEY); engines without a key skip gracefully.

Runtime: Node.js 22+ (CI exercises Node 22 and 24).

Claude Desktop / any MCP client (npx):

{
  "mcpServers": {
    "digestseo": {
      "command": "npx",
      "args": ["-y", "@digestseo/mcp-geo"],
      "env": {
        "OPENAI_API_KEY": "sk-...",
        "GEMINI_API_KEY": "your_key_here"
      }
    }
  }
}

Claude Code:

claude mcp add --transport stdio digestseo -s user --env GEMINI_API_KEY=your_key_here -- npx -y @digestseo/mcp-geo

Cursor:

Kiro (hosted endpoint):

Uses the hosted OAuth endpoint, so no engine API keys are placed in the Kiro install link.

Claude Desktop extension (one-click): download the .mcpb bundle from the latest release and double-click it — Claude Desktop prompts for the API keys.

First run: ask your client to "track acme.com as brand acme, then refresh it" — track_brand creates the brand with generated prompts, refresh_brand runs the first scan, check_visibility shows the scores.

AI agents installing this server: follow llms-install.md. Prefer a remote server with cron auto-refresh? Self-host on Cloudflare Workers below.


mcp-geo is an open-source AI visibility tracker that measures how often your brand is cited by ChatGPT, Claude, Perplexity, Gemini, and Google AI Overviews. It's the GEO (Generative Engine Optimization) and AEO (Answer Engine Optimization) equivalent of Google Search Console — built as an MCP server so you can query your AI visibility data directly inside Claude.ai, Claude Desktop, Claude Code, Cursor, Codex CLI, or any MCP-compatible client.

Canonical product page: DigestSEO mcp-geo — AI Visibility MCP Server

Engineering case study: DigestSEO MCP Suite — AI visibility, Search Console, web validation, and trend intelligence

Need a client-ready baseline without running the stack yourself? The mcp-geo AI Visibility Audit is EUR 99 one time: one brand, up to three competitors, 20 buyer-intent prompts, checks across up to five supported AI surfaces where configured providers return usable results, citation evidence, and a prioritized action memo. The open-source package remains free.

See proof first: Open the sample report generated through mcp-geo to see the output style and evidence depth before requesting the audit.

Ready to request it? Open a prefilled email with your brand/domain and up to three competitors. No subscription or sales call is required.

Payment handoff: After fit and scope are confirmed, I reply with the normal invoice/payment instructions.

Methodology: The same 20 buyer-intent prompts are run as a point-in-time diagnostic and reported per engine, with citation/source evidence where available. The audit is an observed snapshot, not a proprietary ranking promise or guaranteed forecast.

Want the protocol before buying? Read the AI Visibility Audit methodology, including scope, engine coverage, interpretation limits, and what the audit does not claim.

Prefer zero setup? Try the hosted version at digestseo.com — managed Cloudflare infra, no API keys to manage, multi-brand, scheduled refresh, web UI. Waitlist now open. Join waitlist →


What it produces

Connect via MCP, ask Claude "Run an AI visibility analysis on [my brand]", and within 90 seconds you get a strategist-quality memo grounded in real per-engine data:

View the full report including content gaps, engine recommendations, and synthesis →

The report above was generated by Claude through the digestseo-mcp MCP server. The conversation chained five hosted tools — visibility.check, visibility.compare, visibility.citations (Perplexity + Claude), and visibility.content_gaps — to produce a 4-engine analysis with citation excerpts and a 3-recommendation strategy memo.


What's New

[0.3.3] - September 10, 2026

  • Optional one-time audit: the open-source package stays free; teams that want a client-ready baseline can request the EUR 99 mcp-geo AI Visibility Audit from the CTA above.
  • Lower-friction request path: the README now opens a prefilled, source-marked email, while the audit details remain available at https://geo-mcp.digestseo.com/audit.

[0.3.2] — July 27, 2026

  • Published scoped package: @digestseo/mcp-geo with synchronized Worker, MCP Registry, and MCPB metadata.
  • Hosted tool metadata: visibility.* namespaces with typed input/output schemas; local stdio tool names remain flat.
  • Distribution and deployment: dedicated mcp-geo-db D1 configuration, Cursor and Claude Code plugin metadata, and patched production dependency pins.

[0.3.0] — July 2026

  • Local stdio CLI on npm (npx -y @digestseo/mcp-geo): the same MCP tools backed by a local SQLite database (~/.digestseo/digestseo.sqlite) — no Cloudflare account needed. Engines run inline with your own API keys.
  • Local brand-management tools (CLI only): track_brand, list_brands, generate_prompts. Workers deployments keep these behind the X-Seed-Secret-gated /admin/* routes.
  • Runtime-agnostic core (src/core/) shared by the Worker and the CLI, with a Db contract implemented by D1 and better-sqlite3 adapters. All 0.2.1 accuracy and security fixes carry over to both runtimes.
  • Distribution metadata: official MCP Registry server.json, MCPB desktop extension (.mcpb bundle), Dockerfile, llms-install.md for AI agents, release-publish workflow.

[0.2.1] — June 2026

  • Optional CONNECT_SECRET gate on the OAuth flow. By default the OSS build auto-completes /authorize for any MCP client that knows your worker URL — anyone who finds the URL can connect and call visibility.refresh, spending your engine API credits. Set CONNECT_SECRET and the browser step of the connect flow now asks for it before issuing a token. See SECURITY.md.
  • Accurate citation matching. Brand/competitor mentions now require word boundaries (acme no longer matches "acmeshop"), and linked-citation checks require the exact domain or a subdomain (notacme.com no longer counts as a link to acme.com).
  • Per-brand aliases and exclude_terms. Aliases always count as a mention; exclude terms suppress the bare-word match on the brand name and domain root — so "Monday" the brand stops matching "monday" the weekday, while monday.com still counts. Apply migrations/0005_brand_alias_exclude.sql; existing brands behave exactly as before.
  • visibility.history consistency. Partially-finished runs now count toward history (matching visibility.check's 0.2.0 behavior), and fully-failed runs no longer show up as fake zero scores.
  • CI + unit tests. GitHub Actions runs tsc --noEmit plus a pure-function unit suite (npm run test:unit) covering mention matching, citation extraction, and score aggregation on every push.
  • Docs now recommend OpenAI + Anthropic as the starting engine pair — the Gemini free tier rate-limits brands with more than ~5 prompts and produced misleading first-run data as the documented cheapest path.
  • Constant-time comparison for SEED_SECRET / CONNECT_SECRET.

[0.2.0] — May 2026

  • Per-engine HTTP fan-out. /admin/run-live now creates one runs row per engine and self-fetches /admin/run-engine once per engine. Each engine runs in its own worker invocation with its own free-plan 50-subrequest budget — a single-invocation fan-out used to burst past the cap mid-run and lose half the rows.
  • Service binding (env.SELF) dispatches the per-engine fan-out through Cloudflare's internal fabric instead of a public-URL fetch, dodging the "Worker called itself" guard (error 1042) that silently blocks the latter.
  • Status column on prompt_responses (ok / failed / skipped) plus error_message. Failed engine calls used to write raw_response='ERROR: ...' rows that downstream scoring treated as real zero-mention hits; now they're explicitly excluded.
  • FK-resistant inserts. /admin/run-engine INSERT OR IGNOREs its runs row before persisting — D1 is eventually consistent across edge regions, and the upstream INSERT INTO runs from /admin/run-live doesn't always replicate before the downstream engine call lands. The IGNORE makes the FK happy either way.
  • Bulk D1 batch. Each engine collects its 20 prompt results in memory then flushes inserts + cache writes + the final UPDATE runs SET status='completed' in a single D1.batch() call. Drops the per-invocation subrequest count from ~89 to ~26.
  • Relaxed visibility queries. getLatestCompletedRun anchors on EXISTS(ok rows) instead of status='completed', so partially-finished runs still surface their data in MCP tool output instead of silently disappearing.
  • New admin route POST /admin/cleanup-failed-runs for one-shot deletion of legacy polluted rows after migrating to 0004.

[0.1.1] — May 2026

  • Manual install is now the canonical path. The unreliable bash setup script was removed; SETUP.md is self-contained and copy-pasteable, with every interactive wrangler prompt documented inline.

[0.1.0] — May 2026

  • Initial public release.
  • 5-engine support: ChatGPT (gpt-4o-mini), Claude (claude-haiku-4-5), Perplexity (sonar), Gemini (gemini-2.5-flash-lite), and Google AI Overviews (via SerpAPI).
  • 6 hosted MCP tools: visibility.check, visibility.history, visibility.compare, visibility.citations, visibility.content_gaps, visibility.refresh.
  • Engines are opt-in based on which API keys you provide — set only the credentials you have, the rest skip gracefully.
  • Cloudflare Cron Trigger that auto-refreshes tracked brands every 6h, respecting per-brand refresh_frequency (daily/weekly).
  • D1-backed storage for brands, prompts, runs, citations, and a shared prompt cache.

What Can This Do?

  • See which AI tools cite your brand and which don't — get a per-engine breakdown of who's citing you for buyer-intent queries.
  • Track AI visibility weekly, automatically — the built-in Cron Trigger re-runs scans on the cadence you configure per brand.
  • Compare your AI visibility to competitors — share-of-voice percentages, prompts you win, prompts they win.
  • Find content gaps — Claude-Haiku-synthesized recommendations grounded in your actual losing prompts.
  • Use it inside Claude.ai conversations — add the deployed Worker URL as a custom MCP connector and ask in natural language.
  • Self-hosted on your own Cloudflare account — your API keys, your data, your cost ceiling. The free Workers + D1 tiers cover a single brand with daily refreshes.

See the example report above for what this looks like in practice.


Available Tools

The six analysis capabilities are shared across both transports, but the exposed MCP names are intentionally transport-specific: hosted/Worker connections use the visibility.* namespace, while the local stdio package uses flat names.

Hosted / WorkerLocal stdioWhat it doesWhat you provide
visibility.checkcheck_visibilityLatest AI visibility snapshot across all configured engines for a tracked brand, with per-engine scores, winning prompts, and losing prompts.brand_id, optional engines[] filter
visibility.historyget_visibility_historyTime-series history of overall and per-engine visibility, bucketed daily or weekly.brand_id, optional days (default 30), optional granularity (daily/weekly)
visibility.comparecompare_competitorsShare-of-voice comparison against competitor domains, with prompts you win and prompts they win.brand_id, optional competitor_domains[], optional days
visibility.citationsget_citationsThe actual citation events — prompt, engine, response excerpt, citation type, brand URL when present.brand_id, optional days, optional engine filter
visibility.content_gapsget_content_gapsPrioritized Claude-Haiku-generated content recommendations targeting your losing prompts.brand_id, optional max_recommendations (1-10)
visibility.refreshrefresh_brandManually trigger a fresh scan across every engine whose API key is set.brand_id, optional engines[] filter

The local stdio CLI (npx, desktop extension, Docker) additionally provides brand management — on a Workers deployment the same operations live behind the X-Seed-Secret-gated /admin/* routes instead:

Tool (local CLI only)What it doesWhat you provide
track_brandStart tracking a brand: creates it locally and generates its buyer-intent prompt set (Claude Haiku when ANTHROPIC_API_KEY is set, three starter prompts otherwise).brand_id, name, domain, optional category, competitors[], aliases[], exclude_terms[], prompt_count
list_brandsList tracked brands with domains, competitors, and active prompt counts.—
generate_promptsRegenerate a brand's prompt set via Claude Haiku (replaces active prompts, keeps history).brand_id, optional count (default 20)

Getting Started

Step 1 — Get API keys

Engines are opt-in. Pick the ones you want; the rest skip silently.

  • OpenAI — ChatGPT engine. ~€0.0004 per prompt with gpt-4o-mini. Batch path roughly halves that. platform.openai.com
  • Anthropic — Claude engine, plus prompt generation and content-gap analysis (both call Claude Haiku). ~€0.0002 per prompt. Free trial credits are usually enough to evaluate. console.anthropic.com
  • Google AI Studio (Gemini) — Gemini engine. ~€0.0001 per prompt. The free tier has a low per-minute cap, so brands with more than ~5 prompts hit HTTP 429 and drop out of scoring (see Troubleshooting) — treat it as an opt-in add-on, not a starting engine. aistudio.google.com
  • Perplexity — Perplexity Sonar engine. ~€0.005-0.008 per prompt. Paid only. perplexity.ai/settings/api
  • SerpAPI — Google AI Overviews engine. ~€0.005 (free tier) / ~€0.0015 (volume) per prompt. Free tier covers 250 searches/month — enough for development. serpapi.com/dashboard

Recommended starting pair: OpenAI + Anthropic (Claude). Both bill per token with no rate-limit surprises, so your first scan returns clean, scorable data across the ChatGPT and Claude engines — and the Anthropic key also powers prompt generation and content-gap analysis. Solo evaluation runs comfortably under €1/month on the two together. Add Gemini, Perplexity, or SerpAPI deliberately once you want more coverage; Gemini's free tier rate-limits and Google AI Overviews often returns no result (scored as a zero), so leading with the cheapest path can skew your first run.

Step 2 — Deploy to your Cloudflare account

The deploy is 6 commands and takes about 5 minutes. See SETUP.md for the full walkthrough with explanations and troubleshooting, or follow the quick version below.

# 1. Install deps
npm install

# 2. Log in to Cloudflare
npx wrangler login

# 3. Copy the config template
cp wrangler.example.jsonc wrangler.jsonc

# 4. Create KV namespace + D1 database, paste each printed id into wrangler.jsonc
npx wrangler kv namespace create OAUTH_KV
npx wrangler d1 create mcp-geo-db

# 5. Set the required secret + at least one engine API key
#    Recommended starting pair — both bill per token, clean first-run data:
npx wrangler secret put SEED_SECRET
npx wrangler secret put CONNECT_SECRET      # recommended — gates who can connect (see SECURITY.md)
npx wrangler secret put OPENAI_API_KEY      # ChatGPT engine
npx wrangler secret put ANTHROPIC_API_KEY   # Claude engine + prompt generation

# 6. Apply migrations and deploy
npx wrangler d1 migrations apply mcp-geo-db --remote
npx wrangler deploy

The production MCP endpoint is the product-based custom domain:

https://geo-mcp.digestseo.com/mcp

Use that exact URL when publishing digestseo/mcp-geo on Smithery.ai. The endpoint is OAuth-protected, so Smithery will complete its normal MCP authorization flow during inspection.

Step 3 — Connect to your MCP client

After wrangler deploy finishes, you get a URL like https://digestseo-mcp.YOUR-SUBDOMAIN.workers.dev.

Claude.ai (web)

Settings → Connectors → Add custom connector. Paste:

https://YOUR-WORKER-NAME.YOUR-SUBDOMAIN.workers.dev/mcp

Complete the OAuth handshake. The connector turns green when ready.

Claude Code
claude mcp add --transport http digestseo https://YOUR-WORKER-NAME.YOUR-SUBDOMAIN.workers.dev/mcp

Then run /mcp inside Claude Code to complete the OAuth handshake in your browser.

Claude Desktop

Edit your Claude Desktop config:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "digestseo": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://YOUR-WORKER-NAME.YOUR-SUBDOMAIN.workers.dev/mcp"
      ]
    }
  }
}

Restart Claude Desktop after editing.

Cursor

Edit ~/.cursor/mcp.json:

{
  "mcpServers": {
    "digestseo": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://YOUR-WORKER-NAME.YOUR-SUBDOMAIN.workers.dev/mcp"
      ]
    }
  }
}

Restart Cursor.

Codex CLI

Add to ~/.codex/config.toml:

[mcp_servers.digestseo]
command = "npx"
args = [
  "-y",
  "mcp-remote",
  "https://YOUR-WORKER-NAME.YOUR-SUBDOMAIN.workers.dev/mcp",
]

Environment Variables Reference

VariableRequiredDefaultDescription
OPENAI_API_KEYopt-inunsetEnables the ChatGPT engine. Without it, ChatGPT is skipped.
ANTHROPIC_API_KEYopt-inunsetEnables the Claude engine and the Claude-Haiku-powered prompt generator + content-gap analyzer.
GEMINI_API_KEYopt-inunsetEnables the Gemini engine. Free tier is rate-limited for brands with more than ~5 prompts (see Troubleshooting); opt-in add-on.
PERPLEXITY_API_KEYopt-inunsetEnables the Perplexity Sonar engine. Paid only.
SERPAPI_API_KEYopt-inunsetEnables the Google AI Overviews engine (via SerpAPI).
SEED_SECRETyesunsetShared secret that gates every /admin/* route. Pick a high-entropy string.
CONNECT_SECRETrecommendedunsetWhen set, the OAuth connect flow asks for this secret in the browser before issuing a token. Without it, anyone who knows your worker URL can connect an MCP client. See SECURITY.md.
TURNSTILE_SITE_KEYnounsetReserved for forks that add a public /check form. Unused by the OSS build.
TURNSTILE_SECRET_KEYnounsetSame — reserved for forks.

All values are set via wrangler secret put VAR in production or .dev.vars locally. None are stored in wrangler.jsonc.


Architecture

flowchart LR
    C["MCP client<br/>(Claude.ai / Claude Code / Cursor / ...)"] -- "MCP over HTTP + OAuth" --> W["Cloudflare Worker<br/>digestseo-mcp"]
    CRON["Cron Trigger<br/>every 6h"] --> W
    W --> DO["GeoMcpAgent<br/>(Durable Object, 6 MCP tools)"]
    W -- "one self-fetch per engine<br/>via SELF service binding" --> RE["/admin/run-engine<br/>(own invocation per engine)"]
    RE --> E1["OpenAI"]
    RE --> E2["Anthropic"]
    RE --> E3["Gemini"]
    RE --> E4["Perplexity"]
    RE --> E5["SerpAPI<br/>(AI Overviews)"]
    RE --> DB[("D1<br/>brands / prompts / runs /<br/>responses / cache")]
    DO --> DB

Each engine runs in its own Worker invocation with its own free-plan 50-subrequest budget; results are flushed in a single D1.batch() per engine. The whole system fits the Cloudflare free tier for a single brand on a daily cadence.


Security

  • /admin/* is gated by SEED_SECRET (constant-time compared).
  • /mcp requires OAuth; set CONNECT_SECRET so only people with the secret can complete the connect flow — strongly recommended whenever your worker URL is shared anywhere, since connected clients can call visibility.refresh and spend your engine API credits.
  • All engine keys live in Cloudflare's encrypted secret store; all data stays in your own D1 database.

Full details and vulnerability reporting: SECURITY.md.


Sample Prompts

The example report above was generated by the first prompt below.

Once the connector is live in Claude.ai (or any MCP client), try:

Shortened here. Read the whole README on GitHub.

Signals

GitHub stars
46
Forks
2
Last commit
Sep 2026
Weekly_downloads
1k weekly_downloads
Advanced
Delivery
mcp-geo MCP server → your Ahel connector (mcp.ahel.ai) → your AI.
Item type
mcp-server
Key
io-github-akzar1el-mcp-geo
Source
github.com/akzar1el/mcp-geo