Google Search Console MCP Server- by k-o.pro (remote)
Connect Search Console to Claude and ask what your data means — across every property in your account, in plain English, without exporting a single CSV.
No Google Cloud project, no API keys, nothing to install. The button opens claude.ai with the connector pre-filled; you confirm the URL, then sign in with Google.
- 33 tools
- Read-only access
- Every property, one connection
- Open source
Connecting
claude.ai and Claude Desktop
One click adds it with the details filled in — claude.ai will ask you to confirm the address before anything connects:
Prefer to do it by hand? Settings → Connectors → Add custom connector, and paste the URL below. The Claude setup guide covers sign-in and troubleshooting.
Claude Code
claude mcp add --transport http gsc https://gsc.k-o.pro/mcp
Then run /mcp inside Claude Code to sign in. Scopes and
terminal workflows are in the Claude Code guide.
Any other MCP client
It is a standard remote MCP server over Streamable HTTP. Point any client that supports remote MCP at:
https://gsc.k-o.pro/mcp
What happens the first time
Your browser opens two screens, in this order. First this server's own consent page, naming the application that asked and the exact address the result will be sent to — it exists so a connection request you did not start is refusable. Then Google's sign-in, asking for read-only Search Console access and your email address, and nothing else.
Then ask: “List my Search Console properties.”
What you can ask
Once connected, you ask questions instead of reading API rows. The answer comes back as a diagnosis, not a spreadsheet you still have to interpret:
“What am I almost ranking for?”
Queries sitting just off page one, where a small change moves the most traffic.
“Which pages lost traffic, and why?”
Traffic-drop diagnosis that separates a ranking loss from lost impressions or a seasonal dip.
“Am I cannibalising myself?”
Pages competing for the same query, and which one Google actually prefers.
“What’s decaying?”
Content sliding month over month while you weren’t looking.
Every answer carries provenance: which property it came from, the exact
parameters used, and the date range. An answer is never ambiguous about
which site it describes. position is labelled as the
impression-weighted average it actually is, rather than being passed off as
a rank-tracker position.
Real answers
One response per tool group, from this hosted instance against the author's
own site, k-o.pro. They are shown as they came back, with rows trimmed where
the caption says so. The _meta block at the top of each is the
provenance every answer carries.
Find the opportunity · quick_wins
quick_wins on the hosted instance, 13 October 2026
{
"_meta": {
"source": "Google Search Console API (live data)",
"tool": "quick_wins",
"parameters": {
"days": 90,
"min_impressions": 5,
"max_position": 20,
"site_url": "sc-domain:k-o.pro"
},
"note": "All numbers in this response come directly from the Google Search Console API. They are exact values, not estimates. Base your analysis only on this data. Do not invent or assume additional context."
},
"data": [
{
"query": "canonical check",
"clicks": 0,
"impressions": 22,
"ctr": 0,
"position": 15.6,
"opportunity": 2
}
]
}
One query qualifies on a site this size: "canonical check", 22 impressions at an average position of 15.6. The parameters Claude actually passed are in _meta, so the lowered thresholds are on the record rather than implied.
Diagnose the problem · cannibalization_check
cannibalization_check on the hosted instance, 13 October 2026; first 2 of 7 queries shown
{
"_meta": {
"source": "Google Search Console API (live data)",
"tool": "cannibalization_check",
"parameters": {
"days": 90,
"min_impressions": 10,
"site_url": "sc-domain:k-o.pro"
},
"note": "All numbers in this response come directly from the Google Search Console API. They are exact values, not estimates. Base your analysis only on this data. Do not invent or assume additional context."
},
"data": [
{
"query": "bulk redirect checker",
"totalImpressions": 98,
"pages": [
{
"page": "https://k-o.pro/bulk-redirect-checker/",
"clicks": 0,
"impressions": 21,
"position": 17.5
},
{
"page": "https://k-o.pro/bulk-redirect-checker",
"clicks": 0,
"impressions": 77,
"position": 77.1
}
]
},
{
"query": "url checker bulk",
"totalImpressions": 48,
"pages": [
{
"page": "https://k-o.pro/bulk-redirect-checker/",
"clicks": 0,
"impressions": 11,
"position": 83.9
},
{
"page": "https://k-o.pro/bulk-redirect-checker",
"clicks": 0,
"impressions": 37,
"position": 85.7
}
]
}
]
}
The competing pages are the same tool at two URLs that differ only by a trailing slash. For "bulk redirect checker" the slash version averages position 17.5 while the other averages 77.1 and takes most of the impressions: a canonicalisation fix, not a content one.
Look it up · inspect_url
inspect_url on the hosted instance, 13 October 2026
{
"_meta": {
"source": "Google Search Console API (live data)",
"tool": "inspect_url",
"parameters": {
"url": "https://k-o.pro/",
"site_url": "sc-domain:k-o.pro"
},
"note": "All numbers in this response come directly from the Google Search Console API. They are exact values, not estimates. Base your analysis only on this data. Do not invent or assume additional context."
},
"data": {
"url": "https://k-o.pro/",
"indexed": true,
"indexingState": "Submitted and indexed",
"lastCrawlTime": "2026-10-02T21:35:12Z",
"crawlAllowed": true,
"indexingAllowed": true,
"pageFetchState": "SUCCESSFUL",
"googleCanonical": "https://k-o.pro/",
"userCanonical": "https://k-o.pro/",
"canonicalMatch": true,
"mobileUsability": "VERDICT_UNSPECIFIED",
"issues": [],
"summary": "This URL is indexed and healthy. Last crawled: 2026-10-02T21:35:12Z."
}
}
Indexed, last crawled on 2 October 2026, and Google picked the same canonical the page declares. When a URL is not indexed, the same fields say which state it is in.
Image search · image_page_audit
image_page_audit on the hosted instance, 13 October 2026
{
"_meta": {
"source": "Live fetch of the audited pages (the user's own site)",
"tool": "image_page_audit",
"parameters": {
"urls": [
"https://k-o.pro/"
],
"fetch_metadata": true,
"max_images_per_page": 6,
"max_images_reported": 6
},
"note": "All findings come from fetching and parsing the listed pages and image files at call time. Alt text, attributes, bytes, and dimensions are read values, not estimates. Base your analysis only on this data. An empty alt (alt=\"\") is correct for decorative images; do not report it as a defect."
},
"data": {
"audits": [
{
"url": "https://k-o.pro/",
"status": "ok",
"http_status": 200,
"page_checks": {
"total_img_tags": 17,
"content_images": 0,
"images_fetched": 0,
"lcp_candidate_src": null,
"lcp_candidate_lazy_loaded": null,
"lcp_candidate_fetchpriority": null,
"inline_background_images": 0,
"max_image_preview": "not_set",
"image_object_schema_count": 0,
"has_licensable_fields": false,
"has_primary_image_of_page": false,
"images_with_srcset": 0,
"modern_format_sources": false
},
"images": [],
"images_not_reported": 0,
"issue_counts": {},
"top_fixes": [
"Add ImageObject schema (with about/mainEntity) for the page's key images",
"Add max-image-preview:large to the robots meta for full-size previews"
]
}
],
"overall": {
"pages_audited": 1,
"pages_failed": 0,
"total_issues": 0,
"note": "empty alt (alt=\"\") is correct for decorative images; it is reported but not counted as an issue."
}
}
}
Of the 17 img tags, none counted as a content image, so no image files were fetched. The two page-level fixes it returned are about previews and schema rather than the images themselves.
AI search, and your account · genai_conversation_queries
genai_conversation_queries on the hosted instance, 13 October 2026; empty buckets, the long-tail bucket and the monthly timeline left out
{
"_meta": {
"source": "Google Search Console API (live data)",
"tool": "genai_conversation_queries",
"parameters": {
"days": 480,
"min_impressions": 1,
"max_rows_per_bucket": 10,
"include_timeline": true,
"site_url": "sc-domain:k-o.pro"
},
"note": "All numbers in this response come directly from the Google Search Console API. They are exact values, not estimates. Base your analysis only on this data. Do not invent or assume additional context."
},
"data": {
"period": {
"startDate": "2025-06-20",
"endDate": "2026-10-12"
},
"total_conversation_queries": 4,
"total_conversation_impressions": 20,
"buckets": {
"conversational": {
"total_matched": 2,
"rows": [
{
"query": "how can i implement bulk tracking across chatgpt, perplexity, and gemini for 15+ accounts?",
"impressions": 9,
"clicks": 0,
"ctr": 0,
"position": 89.6,
"top_pages": [
{
"page": "https://k-o.pro/posts/track-traffic-from-ai-chatbots-ga4",
"impressions": 9
}
]
},
{
"query": "is it hard to make a chrome extension",
"impressions": 1,
"clicks": 0,
"ctr": 0,
"position": 51,
"top_pages": [
{
"page": "https://k-o.pro/posts/how-to-build-a-chrome-extension",
"impressions": 1
}
]
}
]
}
}
}
}
Four queries in 16 months, all low volume: two conversational questions, each landing on the post that answers it. No reply artefacts like "yes" or "go on" on this site, which the timeline confirms month by month.
The 33 tools
Grouped by what you would reach for them to do. Each one takes the property as a parameter, so a single connection covers every site in your account.
Find the opportunity
Where the traffic you do not have yet is hiding.
| quick_wins | Keywords at positions 4–15 worth pushing to page one |
| ctr_opportunities | Pages with the impressions but a CTR far below par for their position |
| content_gaps | Demand you already get impressions for but rank beyond 20 |
| content_recommendations | Quick wins, gaps and cannibalisation cross-referenced into actions |
| topic_cluster_performance | How a group of pages performs as one thing |
Find the opportunity: parameters and a real example →
Diagnose the problem
What changed, and whether it was ranking, CTR or demand.
| traffic_drops | The biggest losses, each with a diagnosed cause |
| content_decay | Pages declining across three consecutive 30-day periods |
| cannibalization_check | Queries where your own pages compete with each other |
| check_alerts | Position drops, CTR collapses, and pages gone from results |
| ctr_vs_benchmark | Your CTR per page against the benchmark for that position |
Diagnose the problem: parameters and a real example →
Look it up
The direct questions, answered against live data.
| site_snapshot | Clicks, impressions, CTR and position against the prior period |
| advanced_search_analytics | A custom query with your own dimensions and filters |
| inspect_url | Whether a URL is indexed, and why it is not |
| verify_claim | Check a number against live data before it goes in the deck |
| generate_report | A full markdown performance report |
| multi_site_dashboard | One health check across many properties at once |
| list_properties | Every property this account can reach, with permission level |
| list_sitemaps | Submitted sitemaps with status, errors and indexed counts |
Look it up: parameters and a real example →
Image search
Google's type=image surface, which most tools skip entirely.
| image_keyword_overview | Top image-search keywords for the site |
| image_search_quick_wins | Image queries at positions 4–15 with real impressions |
| image_pages_overview | Pages ranked by image-search performance |
| image_keyword_trends | Period-over-period movement for image queries |
| image_impressions_no_clicks | Real image impressions earning effectively zero clicks |
| image_content_decay | The decay check, run against image search |
| compare_web_vs_image | Each query side by side across web and image |
| image_page_audit | Audits images on your own pages for what drives image ranking |
Image search: parameters and a real example →
AI search, and your account
The newer surface, plus the controls over your own data.
| genai_conversation_queries | AI-conversation exhaust hiding in ordinary query data |
| set_default_property | Save a default property so later calls can omit it |
| export_my_data | Everything this server stores about you |
| disconnect_account | Erase all of it and end your sessions |
AI search, and your account: parameters and a real example →
The three indexing tools — submit_url, submit_batch and submit_sitemap — are part of the software but cannot run on this hosted instance: they need write access to your Google account, which this service never requests. They work on a self-hosted install configured with wider scopes.
How it compares
The questions worth asking of any Search Console MCP server, answered for this one:
| Question | This server |
|---|---|
| Do you need a Google Cloud project? | No, for the hosted instance. Self-hosting needs your own OAuth client. |
| Does it work in claude.ai and Claude Desktop, or only locally? | Both. It is a remote server over Streamable HTTP with its own OAuth, so connector UIs add it by URL; the same code runs locally over stdio. |
| One property per config, or all of them? | Every property your Google account can see, from one connection. |
| What can it change in your Google account? | Nothing, on the hosted instance: it requests webmasters.readonly only. |
| Is your Search Console data stored? | No. It is fetched live for each question and passed back to your client. |
| What do the tools return? | Diagnoses with provenance: every answer names the property, the parameters and the date range. 33 tools; 30 run on the hosted instance. |
| Does it cover Google Images? | Yes, eight tools on the type=image search type, including an on-page image audit. |
| Can it find AI Mode and AI Overview queries? | It finds queries shaped like AI conversations and sorts them into seven buckets. See AI Mode queries. |
| Price and licence | The hosted instance is free. The code is Apache 2.0 and public on GitHub. |
Why a remote server
Most MCP servers are local-only: one process, on one laptop, holding one credential. That is why they cannot be shared, and why the claude.ai and Claude Desktop connector interfaces cannot add them at all.
This one runs as a hosted service over Streamable HTTP, and implements the MCP authorization spec properly — dynamic client registration, PKCE, rotating tokens, and a consent screen of its own. That is what lets a connector interface onboard it from nothing but a URL. It also means a team shares one deployment while each person signs in as themselves and sees only their own properties. Nobody copies a credential anywhere.
What it reads, and what it stores
- It requests exactly one Google permission:
webmasters.readonly— read-only access to Search Console. It cannot change your site, submit URLs, or touch anything else in your Google account. - It stores your email address, your Google account identifier, and an encrypted Google refresh token, so it can answer your requests without asking you to sign in every time.
- It does not store your Search Console data. Results are fetched live for each question and passed straight back to your Claude client.
- Your refresh token is encrypted with AES-256-GCM under a key held outside the database. Tokens issued to your client are stored only as hashes, expire after an hour, and rotate on refresh.
Ask your Claude client to run export_my_data to see everything
held about you, or disconnect_account to erase it. The full
detail is in the privacy policy.
Running your own
The code that runs here is at github.com/kodotpro/gsc-mcp-remote, under Apache 2.0. You can read exactly what this service does, or run your own copy with your own Google credentials — the same 33 tools, over stdio or as your own hosted deployment. The self-hosting guide walks through both.
Who builds it
Version 3.8.0 · page updated 13 October 2026 · changelog
Questions
What is an MCP server?
Model Context Protocol is an open standard for connecting AI clients to outside systems. An MCP server exposes a set of tools; the client decides when to call them. This one exposes Search Console, so Claude can answer questions about your search data without you exporting anything.
Do I need a Google Cloud project or API keys?
Not for the hosted instance. You add https://gsc.k-o.pro/mcp to your client and sign in with Google; the OAuth client belongs to this server. Running your own copy does need an OAuth client of your own from Google Cloud Console, and the self-hosting guide covers it.
Is there an official Google Search Console MCP server?
Not as of 13 October 2026. Google's list of Google-managed MCP servers and its open-source google/mcp repository do not include Search Console. Servers like this one are built on the public Search Console API.
Do I need to install anything?
No. It runs as a hosted remote MCP server, so you add it by URL and sign in with Google. If you would rather your Google token never left your own machine, the same server runs locally over stdio — the self-hosting guide has the instructions.
Can it change anything in my Search Console?
No. The hosted service requests one Google permission, webmasters.readonly, plus your email address to identify you. It cannot edit properties, change sitemaps, or submit URLs for indexing. Google's own per-property permissions apply on top, so you see exactly the properties Google would show you.
Does it work across all my properties?
Yes — that is the main reason it exists. Every property-scoped tool takes the property as a parameter, so one connection covers your whole account. You never edit a config file and restart to look at a different site.
Is my Search Console data stored anywhere?
No. Each question is answered by fetching live from Google's API and handing the result back to your Claude client; nothing is retained afterwards. What is stored is your email, your Google account identifier, an encrypted refresh token, and your chosen default property.
Is it free, and is it open source?
The software is open source under Apache 2.0 and the hosted instance is free to use. You can read exactly what runs here, or run your own copy.
