Your search data,
kept.
SEO & GEO analytics that lives in your own Cloudflare account. See which pages AI crawlers read, cite and send clicks to, keep your history forever, and ask about it from Claude, Cursor or ChatGPT.
Built on data you already own
- Google Search Console
- Bing Webmaster Tools
- Cloudflare AI crawler traffic
- Cloudflare Web Analytics
- Claude
- Cursor
- ChatGPT
Crawled. Cited. Clicked.
Finally in one place.
Generative engines read your site long before anyone clicks. Searchkeep joins three first-party sources per page, so you can see where AI visibility leaks out, not just that it does.
- 01
Crawled
Cloudflare AI crawler trafficWhich pages GPTBot, ClaudeBot, PerplexityBot and friends actually fetch, how often, and with what status code.
- 02
Cited
Bing AI Performance (CSV import)Which of those pages show up as sources in AI answers, so you know crawling turned into visibility.
- 03
Clicked
Web Analytics · GSC · BingVisits referred by ChatGPT, Perplexity, Copilot and others, side by side with classic search clicks.
AI reads it, then ignores it.
Often thin or outdated pages, missing direct answers, or crawlers hitting errors. Fix the content or the status code.
You’re the source, not the destination.
The answer is complete without you. Add what an answer can’t: tools, data, depth, a next step.
The Cited step uses Bing AI Performance, which has no API yet: you import its CSV export from the dashboard. Example figures are illustrative.
Ask, don’t dig.
Point Claude, Claude Code, Cursor or ChatGPT at https://your-domain/mcp. Twelve task-shaped
read-only tools aggregate on the server and return compact answers, so your assistant does the digging.
list_sitesConfigured sites, their connected sources and stored date ranges.query_performanceClicks, impressions, CTR and position by any dimension.compare_periodsWhat moved between two periods, and by how much.find_quick_winsHigh-impression queries ranking just off the top.find_cannibalizationQueries where several of your pages compete.find_ctr_anomaliesQueries with a CTR well below what their position predicts.find_content_decayPages whose clicks have been sliding for weeks.geo_funnelCrawled → Cited → Clicked, per page.ai_crawlersAI crawler requests by bot, operator, purpose, path and status.inspect_urlLive Google URL Inspection for one URL.list_sitemapsSitemaps known to Search Console, with status.submit_sitemapSubmit a sitemap to Search Console. Off by default. write · offsetup_statusReadiness, configuration and sync health in one call.
And look, when you’d rather look.
A fast dashboard served by the same Worker. Every view runs the same analysis functions as the MCP tools, so the numbers your assistant quotes are the numbers you see.
-
Overview
Clicks, impressions and AI crawler requests for a site, against the previous period.
-
GEO funnel
Every page’s path from crawled to cited to clicked, with crawled-but-never-cited pages flagged.
-
AI crawlers & referrals
Requests by bot, operator and purpose (training, search, user), and visits sent by AI assistants.
-
Performance & compare
GSC and Bing queries and pages, brand vs non-brand, by country and device, period over period.
-
Opportunities
Quick wins, cannibalization, CTR anomalies and content decay, ranked.
-
Technical & settings
Web Vitals, sitemaps, crawl issues and URL inspection, plus setup checks, sync runs and Sync now.
Keep your history forever.
Search Console forgets everything older than 16 months. Searchkeep starts backfilling those 16 months the day you deploy, keeps every new day in D1 and never deletes. Comparing this quarter with the same quarter two years ago just works.
- Search Console
- 16 months
- Searchkeep, two years in
- 40 months, and counting
First-party data only.
Searchkeep reads the APIs you already have access to, for sites you own. Each source is synced into D1 once a day, in small batches; live calls are reserved for things like URL inspection.
Google Search Console
- Search Analytics by date, query, page, country, device
- Sitemaps
- Live URL Inspection
Bing Webmaster Tools
- Traffic, query and page stats
- Crawl issues
- AI Performance citations, imported from its CSV export
Cloudflare
- AI crawler requests by bot, path and status
- Web Analytics page views and referrers
- Core Web Vitals
One Worker. Your account.
Nobody else in the loop.
MCP, the dashboard and the scheduled sync are three entrances to one Worker, sharing one core and one D1 database. There is no Searchkeep server to trust, pay or outlive.
Your data never leaves your account
Searchkeep runs as one Worker and one D1 database in your Cloudflare account. No telemetry, no vendor server, nothing phones home.
Read-only by default
Every tool reads. The single write, submitting a sitemap, stays unregistered until you set ENABLE_WRITES and grant Full permission.
Free-tier friendly
One Worker, one D1 database and a cron that syncs in small batches, paced to stay within Cloudflare’s free plans for typical sites.
Upgrade = Sync fork
Click “Sync fork” on GitHub. Workers Builds rebuilds and deploys, and the Worker applies new migrations itself. Your config lives in Secrets, so nothing conflicts.
Secure by default.
Locked until it’s safe.
Search data is sensitive. Searchkeep refuses to serve any of it until Cloudflare Access is protecting it properly, and it checks again on every request.
-
Cloudflare Access in front
One self-hosted Access app guards the dashboard and the MCP endpoint. Only the emails you allow get in.
-
Managed OAuth for MCP
Access acts as the OAuth 2.1 server with dynamic client registration and PKCE. No client IDs to paste.
-
JWT re-verified in the Worker
Every request’s Access JWT is checked against your team’s keys and AUD tag, so bypassing Access gets nothing.
-
Locked until ready
Until Access, Managed OAuth and a tight policy are confirmed, data and sync stay off. Break a check later and it locks again.
- 1 Locked
no_accessNot protected by Access - 2 Locked
oauth_disabledManaged OAuth off - 3 Locked
policy_too_broadPolicy too broad - 4 Serving
readyAll checks pass - Cron only syncs after
readyis recorded, and re-checks Access before every pass.
Hand the runbook to your agent.
The deploy guide is written as an idempotent runbook: every step can be re-run and comes with a check. An agent with GitHub and Cloudflare MCP access can do almost all of it, and stops to ask when a human must click.
- You, once Authorize the Cloudflare GitHub App
- You, once Create your Zero Trust organization
- You, once Create the read-only Cloudflare API token
- You, once Add the service account in Search Console
- You, once Generate the Bing API key
- You Sign in through Access
Honest about what it isn’t.
Searchkeep is deliberately narrow: your own data, for your own sites. If you need backlinks, competitor research or rank tracking, keep a SaaS tool for that, and use Searchkeep for everything you own.
| Capability | Searchkeep | Typical SaaS SEO tool |
|---|---|---|
| Where your data lives | Your Cloudflare account | The vendor’s servers |
| Price | Free, MIT licensed | Monthly subscription |
| History past GSC’s 16 months | Kept in D1, forever | Varies; often only while subscribed |
| AI crawled → cited → clicked, per page | Built in | Rare |
| Ask from Claude, Cursor, ChatGPT | 12 read-only MCP tools | Sometimes |
| Telemetry | None | Usually |
| Writes to your properties | Off unless you opt in | Varies |
| Backlink index | No, by design | Yes |
| Competitor research | No, by design | Yes |
| Rank tracking (SERP scraping) | No, by design | Yes |
What is Searchkeep?
Searchkeep is open-source SEO and GEO (generative engine optimization) analytics that you deploy to your own Cloudflare account. It keeps syncing Google Search Console, Bing Webmaster Tools and Cloudflare data into a D1 database, then lets you explore it in a dashboard or ask about it from any MCP client such as Claude, Cursor or ChatGPT.
How much does it cost?
Searchkeep is free and MIT licensed. You pay only for the Cloudflare resources it uses: one Worker, one D1 database and a cron trigger, which fit within Cloudflare’s free plans for typical sites. The history backfill is paced to stay under D1’s free limit of 100,000 rows written per day. Cloudflare Access is part of Zero Trust, which has a free plan for small teams.
Does my data leave my Cloudflare account?
No. Searchkeep has no backend of its own and sends no telemetry. Data flows from Google, Bing and Cloudflare APIs into your D1 database and is served only to you, through Cloudflare Access. When you ask a question over MCP, the tool results go to the AI client you chose to connect, just like any other MCP server.
What is the GEO funnel?
It follows each page through three steps of AI visibility: Crawled (AI crawlers fetched it, from Cloudflare), Cited (an AI answer referenced it, from the Bing AI Performance report, which has no API yet, so you import its CSV export from the dashboard) and Clicked (people arrived from an AI assistant, from Web Analytics referrers, alongside classic GSC and Bing clicks). Gaps between steps tell you what to fix.
How far back does the history go?
After you deploy, Searchkeep backfills as much as Google provides, which is 16 months, one day at a time. On the free D1 write quota the full backfill takes days to weeks. It never deletes anything, so your history keeps growing past the point where Search Console forgets it. The earlier you deploy, the more you keep.
Why no backlinks, competitor data or rank tracking?
By design. Searchkeep only uses first-party data you already have access to for sites you own. Backlink indexes and rank trackers depend on large-scale crawling or SERP scraping, which needs a vendor and is outside the project’s charter. Pair Searchkeep with a dedicated tool if you need them.
Do I need a paid Cloudflare plan?
No. AI crawler data requires the site to be proxied through Cloudflare (orange-clouded), which works on the free plan; Searchkeep identifies crawlers by user agent. AI referrals come from Web Analytics referrer hosts. Workers Free allows 10 ms of CPU per invocation, so the sync works in small batches; if sync units keep getting skipped, lower GSC_ROWS_PER_DAY or move to Workers Paid.
Can an AI agent deploy it for me?
Yes. The deploy guide is written as an idempotent runbook with a verification for every step. An agent with GitHub and Cloudflare MCP access can fork the repo, create the Worker, configure Access and set Secrets. A few steps need a human: authorizing the Cloudflare GitHub App, creating the Zero Trust organization, adding the service account in Search Console, generating the Bing API key and signing in through Access.
Which AI clients can connect?
Any MCP client that supports Streamable HTTP with OAuth, including Claude, Claude Code, Cursor and ChatGPT. Cloudflare Access acts as the OAuth server with dynamic client registration and PKCE, so there is no client ID to paste: the client opens a browser, you sign in, and it is connected.
How do I upgrade?
Open your fork on GitHub and click “Sync fork”. Workers Builds notices the new commit, builds and deploys, and the Worker applies any new D1 migrations itself on its next request. Your configuration lives in Worker Secrets, never in the repo, so upstream changes do not conflict with it.
Start keeping your search data today.
Every day you wait is a day Search Console forgets. Deploying takes about 30–45 minutes.