# Google Search Console MCP Server - by k-o.pro (remote): full text > Every public page of this site as Markdown, in one file. The index is https://gsc.k-o.pro/llms.txt; each page is also served on its own at its .md address. --- Source: https://gsc.k-o.pro/ MCP server · v3.11.0 · read-only # Google Search Console MCP Server - by k-o.pro (remote) Connect Search Console to Claude and ask what your data actually means, across every property in your account, in plain English, without exporting a single CSV. [Add to Claude](https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Google+Search+Console&connectorUrl=https%3A%2F%2Fgsc.k-o.pro%2Fmcp) [Other clients](#connecting) No Google Cloud project, no API keys, nothing to install. You confirm the URL in claude.ai, then sign in with Google. ## What you can ask You ask questions instead of reading API rows. The answer comes back as a diagnosis, with the property, the parameters and the date range it was computed from. ### “What am I almost ranking for?” Queries sitting just off page one, where a small change moves the most traffic. [See the tools →](/tools/opportunities.md) ### “Which pages lost traffic, and why?” A diagnosis per page that separates a ranking loss from a CTR collapse or falling demand. [See the tools →](/tools/diagnostics.md) ### “Am I cannibalising myself?” Pages competing for the same query, and which one Google actually prefers. [See the tools →](/tools/diagnostics.md) ### “How is the site doing?” Clicks, impressions, CTR and position against the previous period, for one property or all of them. [See the tools →](/tools/lookups.md) ## What the answer looks like In a client that supports MCP Apps, ten tools draw their result as cards and sortable tables beside the conversation. Every other client gets the same result as text, and the data Claude reads is identical either way. Search Console · sc-domain:example.com Site snapshot Against the previous period · last 28 days Clicks 4,210 +8.23% Impressions 182,400 -4.75% CTR 2.31% +0.28 pts Avg position 14.2 -1.3 `site_snapshot` as a client with MCP Apps shows it: four figures and how each moved. A lower position is better, so it is marked as good. Sample data, drawn to show the layout. Search Console · sc-domain:example.com Quick wins Queries at positions 4–15 that could reach page one · last 28 days | Query | Position | Impressions | CTR | Extra clicks | | --- | --- | --- | --- | --- | | search console mcp server | 4.2 | 5,200 | 1.2% | 410 | | connect search console to claude | 5.4 | 4,780 | 1.4% | 368 | | image seo audit tool | 6.6 | 4,360 | 1.6% | 326 | | content decay checker | 8.4 | 3,730 | 1.9% | 263 | `quick_wins`: sortable by any column in the client, with the estimated gain drawn to scale. Sample data, drawn to show the layout. Search Console · sc-domain:example.com Traffic drops Pages that lost clicks against the previous period · last 28 days | Page | Clicks | Before | Change | Position | Diagnosis | | --- | --- | --- | --- | --- | --- | | /blog/search-console-guide/ | 120 | 310 | -190 | +4.9 | Ranking loss | | /tools/ | 80 | 140 | -60 | 0 | CTR collapse | | /about/ | 0 | 42 | -42 | 0 | Page disappeared | | /pricing/ | 30 | 44 | -14 | -0.4 | Impression decline | `traffic_drops`: each lost page with a diagnosis that tells a ranking loss from a CTR collapse or falling demand. Sample data, drawn to show the layout. [Real, unedited output from the hosted instance →](/tools.md#real-answers) ## Connecting ### claude.ai and Claude Desktop One click adds it with the details filled in. claude.ai asks you to confirm the address before anything connects. [Add to Claude](https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Google+Search+Console&connectorUrl=https%3A%2F%2Fgsc.k-o.pro%2Fmcp) By hand: **Settings → Connectors → Add custom connector**, and paste `https://gsc.k-o.pro/mcp`. The [Claude setup guide](/claude.md) 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. More in the [Claude Code guide](/claude-code.md). ### Any other MCP client It is a standard remote MCP server over Streamable HTTP. Point the client at `https://gsc.k-o.pro/mcp`. The first time, your browser shows two screens: this server's own consent page, naming the application that asked, and then Google's sign-in, asking for read-only Search Console access and your email address. Then ask *“List my Search Console properties.”* ## 32 tools, grouped by job Each tool takes the property as a parameter, so one connection covers every site in your account. Thirty run on a hosted instance; the two that write to Google need a [self-hosted install](/self-host.md). 5 tools ### Find the opportunity Where the traffic you do not have yet is hiding. [Parameters and a real example →](/tools/opportunities.md) 5 tools ### Diagnose the problem What changed, and whether it was ranking, CTR or demand. [Parameters and a real example →](/tools/diagnostics.md) 8 tools ### Look it up The direct questions, answered against live data. [Parameters and a real example →](/tools/lookups.md) 8 tools ### Image search Google's `type=image` surface, which most tools skip entirely. [Parameters and a real example →](/tools/image-search.md) 4 tools ### AI search, and your account The newer surface, plus the controls over your own data. [Parameters and a real example →](/ai-mode-queries.md) [Every tool on one page →](/tools.md) ## How it works, and what it keeps 1 · You ### Your Claude client You ask a question in plain words. Claude picks a tool and sends the request. tool call 2 · This server ### Reads, analyses, returns Keeps your email and an encrypted Google token. Keeps none of your Search Console data. read-only, as you 3 · Google ### Search Console API Answers with live data for the properties your own account can see. - It requests exactly one Search Console permission, `webmasters.readonly`, plus Google's basic `openid` and `email` scopes, only to identify your account. 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. It does not store your Search Console data: results are fetched live for each question and passed straight back. - Ask Claude to run `export_my_data` to see everything held about you, or `disconnect_account` to erase it. [The privacy policy →](/privacy.md) [How it compares →](/compare.md) [Questions →](/faq.md) ## Open source, and still moving The code that runs here is at [github.com/kodotpro/gsc-mcp-remote](https://github.com/kodotpro/gsc-mcp-remote), under Apache 2.0. Read exactly what this service does, or [run your own copy](/self-host.md) with your own Google credentials. - v3.11.0 Ten tools draw their result as cards and sortable tables in clients that support MCP Apps, and every analysis tool returns a typed result as well as text. - v3.10.0 The tool list costs a client half as much context, every input is bounded, and a failure on Google's side is retried and then explained in plain words. - v3.9.0 Fixes from a security audit: private data files, a vault key that fails closed, per-message rate limits, and a bounded `image_page_audit`. Built and run by [Oleksii Khoroshun](https://k-o.pro/about), an SEO with nine years in the field who builds tools at [k-o.pro](https://k-o.pro/). It is a fork of [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP) by [Suganthan Mohanadasan](https://suganthan.com): the analysis logic and most of the tool set are his design, and this fork adds multi-property access, the remote server and per-user sign-in. Version 3.11.0 · page updated 10 November 2026 · [changelog](https://github.com/kodotpro/gsc-mcp-remote#changelog) --- Source: https://gsc.k-o.pro/claude [Overview](/index.md) › Connect to Claude Setup guide # Connect Google Search Console to Claude Add this server to claude.ai or Claude Desktop as a custom connector. It takes one URL and a Google sign-in, and gives Claude read-only access to every Search Console property your account can see. ## What you need A Google account with access to at least one Search Console property, and claude.ai or Claude Desktop. No Google Cloud project, API key or download. ## Add the connector ### With one click This opens claude.ai's *Add custom connector* dialog with the name and URL already filled in. claude.ai asks you to confirm the address before anything connects. [Add to Claude](https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Google+Search+Console&connectorUrl=https%3A%2F%2Fgsc.k-o.pro%2Fmcp) ### By hand In claude.ai or Claude Desktop, open **Settings → Connectors → Add custom connector**, give it a name such as *Google Search Console*, and paste: ``` https://gsc.k-o.pro/mcp ``` Both `/mcp` and `/mcp/` work. ## Sign in Your browser opens two screens, in this order: 1. **This server's own consent page.** It names the application that asked and the exact address the result will be sent to. It exists so a connection request you did not start can be refused; cancel if anything looks wrong. 2. **Google's sign-in.** It asks for read-only Search Console access (`webmasters.readonly`) and your email address, and nothing else. ## Check that it works Ask Claude: *“List my Search Console properties.”* You get every property your Google account can see, with its type and your permission level. From there, name a property in any question: - *“What am I almost ranking for on sc-domain:example.com?”* — [opportunity tools](/tools/opportunities.md) - *“Which pages lost the most traffic last month, and why?”* — [diagnostic tools](/tools/diagnostics.md) - *“Is https://example.com/page indexed?”* — [lookups](/tools/lookups.md) - *“Which of my queries look like AI Mode conversations?”* — [AI Mode queries](/ai-mode-queries.md) Tired of naming the property every time? Ask Claude to run `set_default_property`. ## Troubleshooting | What you see | Why, and what to do | | --- | --- | | `access_denied` from Google | Consent was declined or blocked: you pressed Cancel, or your Google Workspace admin restricts third-party apps. Try again, or ask your admin to allow the app. | | The connector dialog rejects the URL | Check it is exactly `https://gsc.k-o.pro/mcp`. | | “This session belongs to a different user” | A stale connector entry. Remove it and add it again. | | A tool says a property is not available | Google's own permissions apply. Check that the account you signed in with can see the property in Search Console itself. | | `GSC_SITE_URL environment variable is required` | A tool ran without a property and you have no default. Name one, or run `set_default_property`. | | `429` or `503` with `Retry-After` | A capacity limit. Wait the stated interval and ask again. | ## Disconnecting Either of these is enough: - Ask Claude to run `disconnect_account`. It erases the stored Google connection, every token and your saved settings, and ends your sessions. - Remove the app at [myaccount.google.com/permissions](https://myaccount.google.com/permissions). The stored credential stops working and the server erases it the next time it tries to use it. Removing the connector in Claude only removes it from Claude. Details are in the [privacy policy](/privacy.md). ## About this page Built and run by [Oleksii Khoroshun](https://k-o.pro/about), an SEO with nine years in the field who builds tools at [k-o.pro](https://k-o.pro/). It is a fork of [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP) by [Suganthan Mohanadasan](https://suganthan.com): the analysis logic and most of the tool set are his design, and this fork adds multi-property access, the remote server and per-user sign-in. Version 3.11.0 · page updated 10 November 2026 · [changelog](https://github.com/kodotpro/gsc-mcp-remote#changelog) ## Related - [Overview](/index.md) - [Use it in Claude Code](/claude-code.md) - [All 32 tools](/tools.md) - [Find opportunities](/tools/opportunities.md) - [Diagnose drops](/tools/diagnostics.md) - [Look things up](/tools/lookups.md) - [Image search](/tools/image-search.md) - [AI Mode queries](/ai-mode-queries.md) - [Self-host it](/self-host.md) - [How it compares](/compare.md) - [Questions](/faq.md) --- Source: https://gsc.k-o.pro/claude-code [Overview](/index.md) › Use it in Claude Code Setup guide # Use Google Search Console in Claude Code Claude Code connects to the hosted server over HTTP. One command adds it, and Claude Code runs the Google sign-in through its own OAuth flow. ## Add the server ``` claude mcp add --transport http gsc https://gsc.k-o.pro/mcp ``` `gsc` is the name Claude Code shows for the server; any name works. Claude Code's [MCP documentation](https://code.claude.com/docs/en/mcp) covers the command in full. ## Choose a scope Claude Code stores the server in one of three scopes. Local is the default. | Scope | Where it loads | Add it with | | --- | --- | --- | | Local | This project only, private to you | `claude mcp add --transport http gsc https://gsc.k-o.pro/mcp` | | User | All your projects | `claude mcp add --transport http --scope user gsc https://gsc.k-o.pro/mcp` | | Project | Everyone working in the repository, via `.mcp.json` | `claude mcp add --transport http --scope project gsc https://gsc.k-o.pro/mcp` | A project-scoped entry shares the address, not an account: each teammate still signs in with their own Google account and sees only their own properties. ## Sign in Inside Claude Code, run `/mcp`, pick the server, and follow the steps in your browser. You see this server's consent page first, naming the application and the address the result goes to, then Google's sign-in asking for read-only Search Console access. If the browser does not open on its own, copy the URL Claude Code prints and open it yourself. Then ask: *“List my Search Console properties.”* ## Questions that suit a terminal - *“Inspect the five URLs we shipped today and tell me which are not indexed yet.”* (`inspect_url`) - *“Do /pricing and /pricing/ both get impressions for the same queries?”* (`cannibalization_check`) - *“Check the click numbers in this README against live data before I commit it.”* (`verify_claim`) - *“Write a 28-day performance report for sc-domain:example.com.”* (`generate_report`; on this hosted instance the report comes back in the conversation) ## Manage it ``` claude mcp list claude mcp get gsc claude mcp remove gsc ``` Removing the server deletes the OAuth tokens Claude Code stored for it. To erase what this server stores about you as well, ask Claude to run `disconnect_account` first. ## Run it locally instead If you would rather your Google token stayed on your machine, build the server from source and add it over stdio. You need your own Google OAuth client; the [self-hosting guide](/self-host.md) covers getting one. Then: ``` claude mcp add-json gsc '{"command":"node","args":["/absolute/path/to/gsc-mcp-remote/dist/index.js"],"env":{"GSC_AUTH_MODE":"oauth","GSC_OAUTH_SECRETS_FILE":"/absolute/path/to/client_secret.json","GSC_SCOPES":"readonly"}}' ``` Local mode is also the only way to use the two indexing tools, which need `GSC_SCOPES=full`. ## About this page Built and run by [Oleksii Khoroshun](https://k-o.pro/about), an SEO with nine years in the field who builds tools at [k-o.pro](https://k-o.pro/). It is a fork of [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP) by [Suganthan Mohanadasan](https://suganthan.com): the analysis logic and most of the tool set are his design, and this fork adds multi-property access, the remote server and per-user sign-in. Version 3.11.0 · page updated 10 November 2026 · [changelog](https://github.com/kodotpro/gsc-mcp-remote#changelog) ## Related - [Overview](/index.md) - [Connect to Claude](/claude.md) - [All 32 tools](/tools.md) - [Find opportunities](/tools/opportunities.md) - [Diagnose drops](/tools/diagnostics.md) - [Look things up](/tools/lookups.md) - [Image search](/tools/image-search.md) - [AI Mode queries](/ai-mode-queries.md) - [Self-host it](/self-host.md) - [How it compares](/compare.md) - [Questions](/faq.md) --- Source: https://gsc.k-o.pro/tools [Overview](/index.md) › All 32 tools Reference # All 32 tools What each tool does, grouped by the job you would reach for it to do, followed by how results are shown, what they carry, where the limits are, and real output from the hosted instance. ## The tools, by job Every tool that reads a property also takes `site_url`, so one connection covers every property your Google account can see. Ask for `list_properties` to get the exact strings: `sc-domain:example.com` and `https://example.com/` are different properties with different data. ### 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 →](/tools/opportunities.md) ### 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 →](/tools/diagnostics.md) ### 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 →](/tools/lookups.md) ### 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 →](/tools/image-search.md) ### 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 →](/ai-mode-queries.md) The two indexing tools, `submit_url` 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](/self-host.md) configured with wider scopes. `submit_url` takes one URL or up to 200. ## Interactive views 10 tools come with a view: in a client that supports the MCP Apps extension, the result is drawn as cards and sortable tables beside the conversation. A client without it shows the same result as text. Either way Claude reads the same data, so the analysis does not depend on the view. Search Console · sc-domain:example.com Quick wins Queries at positions 4–15 that could reach page one · last 28 days | Query | Position | Impressions | CTR | Extra clicks | | --- | --- | --- | --- | --- | | search console mcp server | 4.2 | 5,200 | 1.2% | 410 | | connect search console to claude | 5.4 | 4,780 | 1.4% | 368 | | image seo audit tool | 6.6 | 4,360 | 1.6% | 326 | | content decay checker | 8.4 | 3,730 | 1.9% | 263 | `quick_wins`: sortable by any column in the client, with the estimated gain drawn to scale. Sample data, drawn to show the layout. Search Console · sc-domain:example.com Alerts Changes that need attention · last 7 days Critical 2 Warning 1 Total 3 | Severity | Query and page | What changed | | --- | --- | --- | | critical | search console mcp on /gsc/ | Clicks dropped from 100 to 30 (70% decline) | | critical | seo audit on /audit/ | Had 25 clicks in the prior period, zero now | | warning | claude seo on / | CTR dropped from 10% to 4% (60% decline) | `check_alerts`: what crossed a threshold, most severe first. Sample data, drawn to show the layout. | Tool | What the view shows | | --- | --- | | `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 | | `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 | | `site_snapshot` | Clicks, impressions, CTR and position against the prior period | | `multi_site_dashboard` | One health check across many properties at once | The view is one small page that runs in the client's sandbox. It loads nothing from the network except one font from this site, follows no links, and treats every query and URL in a result as text, never as markup. Only tools that read have a view. ## What every result carries - **Provenance.** A `_meta` block names the source, the tool, the exact parameters and the property the numbers came from. - **A typed copy.** The same result is returned as structured content as well as JSON text, and the ten tools with a view declare its shape in advance, so a client can rely on the fields. - **A warning about borrowed text.** Search queries and page URLs are written by other people. Each result says so, and tells the model never to follow instructions found inside them. - **Position, labelled honestly.** It is the impression-weighted average Search Console reports, not a rank-tracker position. ## Limits and errors | What | Behaviour | | --- | --- | | Date range | `days` is 1 to 480, the 16 months Search Console keeps. A value outside it is refused before any call to Google. | | Rows returned | Tools return their top rows (usually 50). `advanced_search_analytics` takes `row_limit` up to 500. | | Requests | 60 a minute per person by default; a batch counts once per message in it. Over the limit the server answers `429` and says when to retry. | | Google's failures | A read that Google answers with a rate-limit or server error is retried twice. Writes and timeouts are never retried. | | Error messages | Plain words and a next step: no access to that property (ask for `list_properties`), quota reached (wait), sign-in revoked (reconnect), or Google's own outage. | | Erasing your account | `disconnect_account` takes two calls: the first explains what will be erased, the second confirms it. | ## Real answers One response per tool group, from this hosted instance against the author's own site, k-o.pro, on the date in each caption. They are shown as they came back, indented for reading, with rows trimmed where the caption says so. Results today also carry the borrowed-text warning described above, which was added after these were captured. **Find the opportunity · `quick_wins`** **Asked:** “What is k-o.pro almost ranking for? It's a small site, so go down to 5 impressions and position 20.” `quick_wins` on the hosted instance, 13 October 2026 ```json { "_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`** **Asked:** “Is anything on k-o.pro competing with itself over the last 90 days?” `cannibalization_check` on the hosted instance, 13 October 2026; first 2 of 7 queries shown ```json { "_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`** **Asked:** “Is the k-o.pro homepage indexed, and when was it last crawled?” `inspect_url` on the hosted instance, 13 October 2026 ```json { "_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`** **Asked:** “Audit the images on the k-o.pro homepage.” `image_page_audit` on the hosted instance, 13 October 2026 ```json { "_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`** **Asked:** “Do any of k-o.pro's queries look like AI conversations?” `genai_conversation_queries` on the hosted instance, 13 October 2026; empty buckets, the long-tail bucket and the monthly timeline left out ```json { "_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. ## Connect it Add `https://gsc.k-o.pro/mcp` to [claude.ai or Claude Desktop](/claude.md) or to [Claude Code](/claude-code.md), sign in with Google, and ask. ## About this page Built and run by [Oleksii Khoroshun](https://k-o.pro/about), an SEO with nine years in the field who builds tools at [k-o.pro](https://k-o.pro/). It is a fork of [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP) by [Suganthan Mohanadasan](https://suganthan.com): the analysis logic and most of the tool set are his design, and this fork adds multi-property access, the remote server and per-user sign-in. Version 3.11.0 · page updated 10 November 2026 · [changelog](https://github.com/kodotpro/gsc-mcp-remote#changelog) ## Related - [Overview](/index.md) - [Connect to Claude](/claude.md) - [Use it in Claude Code](/claude-code.md) - [Find opportunities](/tools/opportunities.md) - [Diagnose drops](/tools/diagnostics.md) - [Look things up](/tools/lookups.md) - [Image search](/tools/image-search.md) - [AI Mode queries](/ai-mode-queries.md) - [Self-host it](/self-host.md) - [How it compares](/compare.md) - [Questions](/faq.md) --- Source: https://gsc.k-o.pro/tools/opportunities [Overview](/index.md) › Find opportunities Tools # Find SEO opportunities in your Search Console data These five tools look for traffic you could have but do not yet: queries just off page one, pages whose CTR trails their position, and demand you show up for without a page that targets it. ## The tools Every tool that reads a property also takes `site_url`, so one connection covers every property your Google account can see. Ask for `list_properties` to get the exact strings: `sc-domain:example.com` and `https://example.com/` are different properties with different data. ### `quick_wins` Returns queries at positions 4–15 with enough impressions to matter, sorted by the clicks reaching position 3 would add. On a small site the default threshold of 100 impressions can return nothing; ask for a lower one. Interactive view In a client that supports MCP Apps this result is also drawn as cards or a sortable table. [How that works](/tools.md#interactive-views). Ask: *“What am I almost ranking for on sc-domain:example.com?”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 28 | | | `min_impressions` | 100 | | | `max_position` | 15 | | ### `ctr_opportunities` Pages with plenty of impressions and a click-through rate well under what their average position usually earns. These are the title and meta description rewrites worth doing first. Interactive view In a client that supports MCP Apps this result is also drawn as cards or a sortable table. [How that works](/tools.md#interactive-views). Ask: *“Which pages get seen but clicked far less than their position should earn?”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 28 | | | `min_impressions` | 500 | | ### `content_gaps` Queries that already show your site but rank worse than position 20. Google is matching you to the demand without a page that targets it. Interactive view In a client that supports MCP Apps this result is also drawn as cards or a sortable table. [How that works](/tools.md#interactive-views). Ask: *“What do I get impressions for but rank beyond page two?”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 90 | | | `min_impressions` | 50 | | | `min_position` | 20 | | ### `content_recommendations` Runs quick wins, content gaps and the cannibalisation check together and returns a prioritised list: pages to update, content to create, pages to consolidate. Ask: *“Give me the ten content changes worth making first.”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 28 | | | `max_recommendations` | 10 | | ### `topic_cluster_performance` Adds up clicks, impressions, CTR and position for every page whose URL matches a path pattern, and lists the cluster's top five pages and queries. Ask: *“How is everything under /blog/seo/ doing as a group?”* | Parameter | Default | Note | | --- | --- | --- | | `path_pattern` | required | e.g. `/blog/seo` | | `days` | 28 | | ## A real answer From this hosted instance, run against the author's own site. Shown as it came back; rows are trimmed only where the caption says so. **Asked:** “What is k-o.pro almost ranking for? It's a small site, so go down to 5 impressions and position 20.” `quick_wins` on the hosted instance, 13 October 2026 ```json { "_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. ## Connect it Add `https://gsc.k-o.pro/mcp` to [claude.ai or Claude Desktop](/claude.md) or to [Claude Code](/claude-code.md), sign in with Google, and ask any of the questions above. ## About this page Built and run by [Oleksii Khoroshun](https://k-o.pro/about), an SEO with nine years in the field who builds tools at [k-o.pro](https://k-o.pro/). It is a fork of [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP) by [Suganthan Mohanadasan](https://suganthan.com): the analysis logic and most of the tool set are his design, and this fork adds multi-property access, the remote server and per-user sign-in. Version 3.11.0 · page updated 10 November 2026 · [changelog](https://github.com/kodotpro/gsc-mcp-remote#changelog) ## Related - [Overview](/index.md) - [Connect to Claude](/claude.md) - [Use it in Claude Code](/claude-code.md) - [All 32 tools](/tools.md) - [Diagnose drops](/tools/diagnostics.md) - [Look things up](/tools/lookups.md) - [Image search](/tools/image-search.md) - [AI Mode queries](/ai-mode-queries.md) - [Self-host it](/self-host.md) - [How it compares](/compare.md) - [Questions](/faq.md) --- Source: https://gsc.k-o.pro/tools/diagnostics [Overview](/index.md) › Diagnose drops Tools # Diagnose traffic drops, decay and cannibalisation When traffic changes, the first question is whether rankings, CTR or demand moved. These five tools answer it per page and per query. ## The tools Every tool that reads a property also takes `site_url`, so one connection covers every property your Google account can see. Ask for `list_properties` to get the exact strings: `sc-domain:example.com` and `https://example.com/` are different properties with different data. ### `traffic_drops` Compares the current period with the one before it and labels each loss as a ranking loss, a CTR collapse or a demand decline, so you know whether to fix the page, the snippet, or nothing. Interactive view In a client that supports MCP Apps this result is also drawn as cards or a sortable table. [How that works](/tools.md#interactive-views). Ask: *“Which pages lost the most traffic in the last 28 days, and why?”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 28 | length of each period | ### `content_decay` One bad month is noise. This flags pages whose clicks fell in each of three consecutive 30-day periods. Interactive view In a client that supports MCP Apps this result is also drawn as cards or a sortable table. [How that works](/tools.md#interactive-views). Ask: *“Which pages have lost clicks three months in a row?”* No parameters beyond the property (`site_url`). ### `cannibalization_check` Queries where more than one of your URLs collects impressions, with each URL's position and its share of the impressions. Two pages sharing a query is only a problem when they serve the same intent; the output shows you where to look. Interactive view In a client that supports MCP Apps this result is also drawn as cards or a sortable table. [How that works](/tools.md#interactive-views). Ask: *“Am I cannibalising myself anywhere?”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 28 | | | `min_impressions` | 50 | combined across the URLs | ### `check_alerts` Severity-rated alerts for position drops, CTR collapses, click losses and pages that disappeared from results, comparing the last week with the one before. Interactive view In a client that supports MCP Apps this result is also drawn as cards or a sortable table. [How that works](/tools.md#interactive-views). Ask: *“Is there anything I should look at this week?”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 7 | | | `position_drop_threshold` | 20 | positions | | `ctr_drop_threshold` | 50 | percent | | `click_drop_threshold` | 30 | percent | ### `ctr_vs_benchmark` Compares each page's CTR with a benchmark for its position and flags the ones well below it. Interactive view In a client that supports MCP Apps this result is also drawn as cards or a sortable table. [How that works](/tools.md#interactive-views). Ask: *“Which pages underperform the usual CTR for where they rank?”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 28 | | | `min_impressions` | 200 | | ## A real answer From this hosted instance, run against the author's own site. Shown as it came back; rows are trimmed only where the caption says so. **Asked:** “Is anything on k-o.pro competing with itself over the last 90 days?” `cannibalization_check` on the hosted instance, 13 October 2026; first 2 of 7 queries shown ```json { "_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. ## Connect it Add `https://gsc.k-o.pro/mcp` to [claude.ai or Claude Desktop](/claude.md) or to [Claude Code](/claude-code.md), sign in with Google, and ask any of the questions above. ## About this page Built and run by [Oleksii Khoroshun](https://k-o.pro/about), an SEO with nine years in the field who builds tools at [k-o.pro](https://k-o.pro/). It is a fork of [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP) by [Suganthan Mohanadasan](https://suganthan.com): the analysis logic and most of the tool set are his design, and this fork adds multi-property access, the remote server and per-user sign-in. Version 3.11.0 · page updated 10 November 2026 · [changelog](https://github.com/kodotpro/gsc-mcp-remote#changelog) ## Related - [Overview](/index.md) - [Connect to Claude](/claude.md) - [Use it in Claude Code](/claude-code.md) - [All 32 tools](/tools.md) - [Find opportunities](/tools/opportunities.md) - [Look things up](/tools/lookups.md) - [Image search](/tools/image-search.md) - [AI Mode queries](/ai-mode-queries.md) - [Self-host it](/self-host.md) - [How it compares](/compare.md) - [Questions](/faq.md) --- Source: https://gsc.k-o.pro/tools/lookups [Overview](/index.md) › Look things up Tools # Look up Search Console data from Claude The direct questions: how a site is doing, whether a URL is indexed, what a filtered query returns, and whether a number you are about to quote is right. ## The tools Every tool that reads a property also takes `site_url`, so one connection covers every property your Google account can see. Ask for `list_properties` to get the exact strings: `sc-domain:example.com` and `https://example.com/` are different properties with different data. ### `site_snapshot` Totals for the period and the one before it, with the change in each. Interactive view In a client that supports MCP Apps this result is also drawn as cards or a sortable table. [How that works](/tools.md#interactive-views). Ask: *“How did the last 28 days compare with the 28 before?”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 28 | length of each period | ### `advanced_search_analytics` The raw Search Analytics query, for anything the other tools do not cover: any mix of `query`, `page`, `country`, `device` and `date`, filters with regex, and every search type Google exposes. Ask: *“Clicks by country for pages containing /pricing, mobile only, last 90 days.”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 28 | | | `dimensions` | \["query"\] | | | `filters` | none | `contains`, `equals`, `includingRegex` and their negations | | `row_limit` | 100 | maximum 500 | | `order_by` | clicks | | | `order_direction` | descending | | | `search_type` | web | or `image`, `video`, `news`, `discover`, `googleNews` | ### `inspect_url` Google's URL Inspection result in one answer: indexing state, last crawl, the canonical you declared against the one Google chose, robots and noindex, and whether the fetch succeeded. Ask: *“Is https://example.com/page indexed? If not, why not?”* | Parameter | Default | Note | | --- | --- | --- | | `url` | required | | ### `verify_claim` Takes a claim, the metric and the value you expect, and checks it against live data. It exists so Claude can check its own numbers before presenting them. Ask: *“Check that the homepage got 500 clicks last month before I quote it.”* | Parameter | Default | Note | | --- | --- | --- | | `claim` | required | | | `metric` | required | `clicks`, `impressions`, `ctr` or `position` | | `expected_value` | required | | | `url` | optional | | | `query` | optional | | | `days` | 28 | | ### `generate_report` Snapshot, alerts, quick wins, traffic drops, content decay and recommendations in one markdown report, returned in the conversation. A local install can also save it as a file by passing `output_path`. Ask: *“Write me a performance report for the last 28 days.”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 28 | | | `include_sections` | all | any of `snapshot`, `alerts`, `quick_wins`, `traffic_drops`, `content_decay`, `recommendations` | ### `multi_site_dashboard` Clicks, impressions, CTR and position for each property against the prior period, with a health status per site. Interactive view In a client that supports MCP Apps this result is also drawn as cards or a sortable table. [How that works](/tools.md#interactive-views). Ask: *“Give me a health check across all my properties.”* | Parameter | Default | Note | | --- | --- | --- | | `site_urls` | list of properties | | | `days` | 28 | | ### `list_properties` Every property your Google account can access, with its type (domain or URL-prefix) and your permission level. Start here. Ask: *“List my Search Console properties.”* No parameters. ### `list_sitemaps` Every sitemap submitted for the property, with its status, errors, warnings and counts. Ask: *“Which sitemaps are submitted for this property, and do any have errors?”* No parameters beyond the property (`site_url`). ## A real answer From this hosted instance, run against the author's own site. Shown as it came back; rows are trimmed only where the caption says so. **Asked:** “Is the k-o.pro homepage indexed, and when was it last crawled?” `inspect_url` on the hosted instance, 13 October 2026 ```json { "_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. ## Connect it Add `https://gsc.k-o.pro/mcp` to [claude.ai or Claude Desktop](/claude.md) or to [Claude Code](/claude-code.md), sign in with Google, and ask any of the questions above. ## About this page Built and run by [Oleksii Khoroshun](https://k-o.pro/about), an SEO with nine years in the field who builds tools at [k-o.pro](https://k-o.pro/). It is a fork of [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP) by [Suganthan Mohanadasan](https://suganthan.com): the analysis logic and most of the tool set are his design, and this fork adds multi-property access, the remote server and per-user sign-in. Version 3.11.0 · page updated 10 November 2026 · [changelog](https://github.com/kodotpro/gsc-mcp-remote#changelog) ## Related - [Overview](/index.md) - [Connect to Claude](/claude.md) - [Use it in Claude Code](/claude-code.md) - [All 32 tools](/tools.md) - [Find opportunities](/tools/opportunities.md) - [Diagnose drops](/tools/diagnostics.md) - [Image search](/tools/image-search.md) - [AI Mode queries](/ai-mode-queries.md) - [Self-host it](/self-host.md) - [How it compares](/compare.md) - [Questions](/faq.md) --- Source: https://gsc.k-o.pro/tools/image-search [Overview](/index.md) › Image search Tools # Image search tools for Search Console The Search Analytics API defaults to web search, so Google Images data only appears when a request asks for `type=image`. Seven of these tools ask for it; the eighth audits the images on your pages directly. ## The tools Every tool that reads a property also takes `site_url`, so one connection covers every property your Google account can see. Ask for `list_properties` to get the exact strings: `sc-domain:example.com` and `https://example.com/` are different properties with different data. ### `image_keyword_overview` Queries the site appears for in Google Images, sorted by impressions, clicks or position. Ask: *“What are my top Google Images queries for the last 90 days?”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 90 | | | `min_impressions` | 50 | | | `row_limit` | 50 | | | `order_by` | impressions | | ### `image_search_quick_wins` Image queries at positions 4–15, sorted by the traffic reaching position 3 would add, using a CTR baseline for image search rather than web search. Ask: *“Which image queries are close to the top three?”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 90 | | | `min_impressions` | 500 | | | `max_position` | 15 | | ### `image_pages_overview` Pages ranked by image-search clicks or impressions. Pairs with the keyword overview to map queries back to pages. Ask: *“Which of my pages actually surface in Google Images?”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 90 | | | `min_impressions` | 100 | | | `row_limit` | 50 | | | `order_by` | clicks | | ### `image_keyword_trends` Two equal windows joined on query, with impression and position changes. Ask: *“Which image queries moved most against the previous 28 days?”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 28 | length of each window | | `min_combined_impressions` | 100 | | | `row_limit` | 50 | | | `order_by` | impressions_delta | | ### `image_impressions_no_clicks` Query and page pairs with meaningful image impressions and almost no clicks: usually a thumbnail problem. Ask: *“Where do my images get seen but not clicked?”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 90 | | | `min_impressions` | 500 | | | `max_clicks` | 2 | | | `row_limit` | 50 | | ### `image_content_decay` The three-window decay check on image search, with a lower click threshold than the web version because image clicks run lower. Ask: *“Which pages are losing image-search clicks three months running?”* | Parameter | Default | Note | | --- | --- | --- | | `min_period3_clicks` | 5 | | ### `compare_web_vs_image` One Search Analytics request per search type, joined on the query, with an impressions ratio that shows where image search carries a large share of the demand. Ask: *“Compare web and image performance for my top queries.”* | Parameter | Default | Note | | --- | --- | --- | | `days` | 90 | | | `min_combined_impressions` | 100 | | | `row_limit` | 50 | | ### `image_page_audit` Fetches up to five of your own pages and checks every image: alt text, filenames, width and height attributes, lazy loading on the LCP candidate, `srcset`, format and weight, ImageObject schema, `max-image-preview`, and EXIF, IPTC and XMP metadata in the files. It reads pages, not Search Console, so it takes URLs instead of a property. Ask: *“Audit the images on these two pages.”* | Parameter | Default | Note | | --- | --- | --- | | `urls` | required | 1–5 pages from your own site | | `fetch_metadata` | true | | | `max_images_per_page` | 12 | 1–50 | | `max_images_reported` | 20 | | ## A real answer From this hosted instance, run against the author's own site. Shown as it came back; rows are trimmed only where the caption says so. **Asked:** “Audit the images on the k-o.pro homepage.” `image_page_audit` on the hosted instance, 13 October 2026 ```json { "_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. ## Connect it Add `https://gsc.k-o.pro/mcp` to [claude.ai or Claude Desktop](/claude.md) or to [Claude Code](/claude-code.md), sign in with Google, and ask any of the questions above. ## About this page Built and run by [Oleksii Khoroshun](https://k-o.pro/about), an SEO with nine years in the field who builds tools at [k-o.pro](https://k-o.pro/). It is a fork of [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP) by [Suganthan Mohanadasan](https://suganthan.com): the analysis logic and most of the tool set are his design, and this fork adds multi-property access, the remote server and per-user sign-in. Version 3.11.0 · page updated 10 November 2026 · [changelog](https://github.com/kodotpro/gsc-mcp-remote#changelog) ## Related - [Overview](/index.md) - [Connect to Claude](/claude.md) - [Use it in Claude Code](/claude-code.md) - [All 32 tools](/tools.md) - [Find opportunities](/tools/opportunities.md) - [Diagnose drops](/tools/diagnostics.md) - [Look things up](/tools/lookups.md) - [AI Mode queries](/ai-mode-queries.md) - [Self-host it](/self-host.md) - [How it compares](/compare.md) - [Questions](/faq.md) --- Source: https://gsc.k-o.pro/ai-mode-queries [Overview](/index.md) › AI Mode queries Tools # Find AI Mode queries in your Search Console data Google counts an AI Mode follow-up question as a new query, so AI conversations leave fragments in your Performance report. `genai_conversation_queries` finds them and sorts them into seven buckets. ## Why AI conversations show up as queries Google reports traffic from AI Overviews and AI Mode in the Performance report, inside the **Web** search type, alongside ordinary results ([Google Search Central](https://developers.google.com/search/docs/appearance/ai-features)). And when someone asks a follow-up question in AI Mode, Google treats it as a new query, crediting the impressions, position and clicks of the follow-up to that query ([Search Console Help](https://support.google.com/webmasters/answer/7042828)). Both checked on 13 October 2026. The result is that conversation fragments sit in your query list next to ordinary searches, with real impressions, positions and clicks. Search Console does not label them. `genai_conversation_queries` finds them by their shape and sorts them by what produced them. ## The seven buckets | Bucket | What it is | Typical shape | | --- | --- | --- | | `artefact` | A person replied to Google's AI mid-conversation, and the reply was logged as a query your page appeared for. Positions here are AI-block positions, not open-web rankings. | *yes*, *go on*, *tell me more* | | `pivot` | A mid-conversation comparison. It names the alternative people ask the AI about next. | *what about X*, *how about X* | | `conversational` | A question shaped by conversation with an AI rather than by a search box. | *can you…*, *how do I…*, *is it worth…*, questions of ten or more words | | `tracker_probe` | Synthetic prompts from AI-visibility tracking tools passing through Google's grounding layer. Machine traffic, not demand. | *… my location is X.*, *evaluate the X on Y* | | `agent_harness` | Complete agent instructions logged verbatim as a query. Machine traffic. | *search the web for…*, *do not invent…* | | `pasted_string` | Error messages and CSV header rows entered as searches, by people or pipelines. | comma-separated header rows, Search Console status messages | | `long_uncategorised` | Ten or more words with no other marker: quoted sentences, agent fragments, rare long-tail. Review by hand. | long queries matching none of the above | ## Reading the result - Leave `tracker_probe` and `agent_harness` out of any demand analysis. They are machine-generated views. If you run an AI-visibility tracker, the probes may be its own; if you do not, someone else is tracking topics you rank for. - `pivot` rows name the alternatives people ask about next, which makes them a ready list for a comparison section on the page they land on. - Conversational queries with impressions and almost no clicks can mean the page is being read inside answers rather than clicked from results. - The monthly timeline shows when reply artefacts first appeared for your site. ## What it cannot see - Google excludes anonymised (rare) queries, so every number is a floor, not a total. - AI Overviews and AI Mode cannot be told apart at query level; both fold into the web search type. - Classification reads the shape of a query, not intent. A phrase that looks conversational can be typed deliberately, so treat single rows as evidence rather than statistics. - Search Console data does not identify who runs a tracker or an agent. ## A real answer **Asked:** “Do any of k-o.pro's queries look like AI conversations?” `genai_conversation_queries` on the hosted instance, 13 October 2026; empty buckets, the long-tail bucket and the monthly timeline left out ```json { "_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. ## Parameters Every tool that reads a property also takes `site_url`, so one connection covers every property your Google account can see. Ask for `list_properties` to get the exact strings: `sc-domain:example.com` and `https://example.com/` are different properties with different data. | Parameter | Default | Note | | --- | --- | --- | | `days` | 480 | the full 16 months Search Console keeps | | `min_impressions` | 1 | | | `max_rows_per_bucket` | 50 | | | `include_timeline` | true | | The query detection comes from [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP), the project this server is forked from. ## Your account The same group holds the controls over what this server keeps about you. ### `set_default_property` Saves a default property for your account, so tool calls that do not name one use it. Ask: *“Make sc-domain:example.com my default property.”* | Parameter | Default | Note | | --- | --- | --- | | `site_url` | required | exactly as `list_properties` reports it | ### `export_my_data` Your identity, the status of your Google connection, your saved settings and how many active tokens exist. It never includes the stored Google credential. Ask: *“Show me everything this server stores about me.”* No parameters. ### `disconnect_account` Erases the stored Google connection, every token and your saved settings, and ends your open sessions. It takes two calls: the first explains what will be erased and returns a one-time code, and a second call with that code does it. Your client's own approval prompt for destructive tools is what puts you in the loop. Ask: *“Disconnect my account and erase what you store.”* No parameters. ## About this page Built and run by [Oleksii Khoroshun](https://k-o.pro/about), an SEO with nine years in the field who builds tools at [k-o.pro](https://k-o.pro/). It is a fork of [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP) by [Suganthan Mohanadasan](https://suganthan.com): the analysis logic and most of the tool set are his design, and this fork adds multi-property access, the remote server and per-user sign-in. Version 3.11.0 · page updated 10 November 2026 · [changelog](https://github.com/kodotpro/gsc-mcp-remote#changelog) ## Related - [Overview](/index.md) - [Connect to Claude](/claude.md) - [Use it in Claude Code](/claude-code.md) - [All 32 tools](/tools.md) - [Find opportunities](/tools/opportunities.md) - [Diagnose drops](/tools/diagnostics.md) - [Look things up](/tools/lookups.md) - [Image search](/tools/image-search.md) - [Self-host it](/self-host.md) - [How it compares](/compare.md) - [Questions](/faq.md) --- Source: https://gsc.k-o.pro/self-host [Overview](/index.md) › Self-host it Open source # Self-host the Google Search Console MCP server The hosted instance runs the code that is on GitHub. Running your own keeps Google tokens on your hardware, and it is the only way to use the two indexing tools. ## Two ways to run it | | On your machine (stdio) | As your own remote server | | --- | --- | --- | | Who connects | You, from your own MCP client | Anyone you allow, each with their own Google account (or one shared token) | | Where Google tokens live | Your machine, in `~/.gsc-mcp/` | Your server, encrypted at rest | | Indexing tools | Yes, with `GSC_SCOPES=full` | Not in per-user sign-in mode, which is read-only | | Runtime | Node 20+ | Node 20+; per-user sign-in needs Node 24+ | ## Run it on your machine 1. **Clone and build.** It is not on npm yet, so install from source: ``` git clone https://github.com/kodotpro/gsc-mcp-remote.git && cd gsc-mcp-remote npm ci && npm run build ``` 2. **Get a Google OAuth client.** In [Google Cloud Console](https://console.cloud.google.com), enable the **Google Search Console API**, then go to **Credentials → Create credentials → OAuth client ID → Desktop app** and download the JSON. 3. **Run the guided setup.** It signs you in, checks the connection with a live API call, and writes your Claude config: ``` node dist/index.js setup ``` Restart Claude and ask *“list my Search Console properties”*. To configure it by hand, or to use a service account instead, see the [README](https://github.com/kodotpro/gsc-mcp-remote#readme). For Claude Code, the [Claude Code guide](/claude-code.md) has a one-line `claude mcp add-json` command. `GSC_SCOPES=readonly` requests a single read-only Google permission and is the recommended setting. `full` adds the write tools: `submit_url`, `submit_sitemap`. ## Host it for other people The same server runs as a remote MCP server, which is what `gsc.k-o.pro` is. Pick an auth mode first: | | `GSC_HTTP_AUTH=oauth` | `GSC_HTTP_AUTH=bearer` (default) | | --- | --- | --- | | Who connects | Anyone you allow, with their own Google account | Whoever holds the one token | | What they see | Their own properties | Everything the server's single credential sees | | claude.ai and Desktop connector UI | Yes, added by URL | No | | Claude Code | Yes, through the OAuth flow | Yes, with an `Authorization` header | | Runtime | Node 24+ | Node 20+ | The [self-hosting documentation](https://github.com/kodotpro/gsc-mcp-remote/blob/main/docs/self-hosting.md) covers the rest: Docker deployment, the reverse proxy, turning on per-user sign-in, Google's app verification, backups, the capacity limits and troubleshooting. ## Licence and credit Apache 2.0. The project is a fork of [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP) by [Suganthan Mohanadasan](https://suganthan.com), and the `NOTICE` file in the repository records what this fork changed. Issues and pull requests go to [github.com/kodotpro/gsc-mcp-remote](https://github.com/kodotpro/gsc-mcp-remote). ## About this page Built and run by [Oleksii Khoroshun](https://k-o.pro/about), an SEO with nine years in the field who builds tools at [k-o.pro](https://k-o.pro/). It is a fork of [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP) by [Suganthan Mohanadasan](https://suganthan.com): the analysis logic and most of the tool set are his design, and this fork adds multi-property access, the remote server and per-user sign-in. Version 3.11.0 · page updated 10 November 2026 · [changelog](https://github.com/kodotpro/gsc-mcp-remote#changelog) ## Related - [Overview](/index.md) - [Connect to Claude](/claude.md) - [Use it in Claude Code](/claude-code.md) - [All 32 tools](/tools.md) - [Find opportunities](/tools/opportunities.md) - [Diagnose drops](/tools/diagnostics.md) - [Look things up](/tools/lookups.md) - [Image search](/tools/image-search.md) - [AI Mode queries](/ai-mode-queries.md) - [How it compares](/compare.md) - [Questions](/faq.md) --- Source: https://gsc.k-o.pro/compare [Overview](/index.md) › How it compares Comparison # How it compares What to ask of any Search Console MCP server before you connect it to your account, and the answers for this one. ## The questions worth asking Ask these of any Search Console MCP server. Other servers are not named here: their specifications change, and a table about them would be stale or unverified. These are the answers 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: its only Search Console permission is `webmasters.readonly`, which is read-only. Signing in also uses Google's basic `openid` and `email` scopes, only to identify you. | | 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. 32 tools; 30 run on the hosted instance. | | Does it show results visually? | Ten tools render cards and sortable tables in clients that support MCP Apps; every client gets the same data as text. See [all tools](/tools.md). | | 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](/ai-mode-queries.md). | | 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: dynamic client registration, PKCE, rotating tokens, and a consent screen of its own. That is what lets a connector interface add 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. ## Hosted, or your own | | Hosted at `gsc.k-o.pro` | Your own copy | | --- | --- | --- | | Setup | Add a URL, sign in with Google | Clone, build, bring a Google OAuth client | | Where the Google token lives | On this server, encrypted | On your machine or your server | | Access to Google | Read-only | Read-only, or full if you choose | | Indexing tools | Not available | Available with full access | The [self-hosting guide](/self-host.md) covers the second column. ## About this page Built and run by [Oleksii Khoroshun](https://k-o.pro/about), an SEO with nine years in the field who builds tools at [k-o.pro](https://k-o.pro/). It is a fork of [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP) by [Suganthan Mohanadasan](https://suganthan.com): the analysis logic and most of the tool set are his design, and this fork adds multi-property access, the remote server and per-user sign-in. Version 3.11.0 · page updated 10 November 2026 · [changelog](https://github.com/kodotpro/gsc-mcp-remote#changelog) ## Related - [Overview](/index.md) - [Connect to Claude](/claude.md) - [Use it in Claude Code](/claude-code.md) - [All 32 tools](/tools.md) - [Find opportunities](/tools/opportunities.md) - [Diagnose drops](/tools/diagnostics.md) - [Look things up](/tools/lookups.md) - [Image search](/tools/image-search.md) - [AI Mode queries](/ai-mode-queries.md) - [Self-host it](/self-host.md) - [Questions](/faq.md) --- Source: https://gsc.k-o.pro/faq [Overview](/index.md) › Questions Questions # Questions What it is, what it can touch, what it keeps, and what happens when something goes wrong. ## Questions and answers ### 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](/self-host.md) 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](https://docs.cloud.google.com/mcp/supported-products) and its open-source [google/mcp](https://github.com/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](/self-host.md) 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. ### Does it show charts, or only text? Both, depending on the client. Ten tools come with an interactive view, cards and sortable tables drawn beside the conversation, in clients that support the MCP Apps extension. Every other client gets the same result as text, and the data Claude reads is identical either way. The [tool reference](/tools.md) lists which tools have a view. ### What happens if Google's API fails, or I ask for too much? A read that Google answers with a rate-limit or server error is retried twice before it is reported, and the report says what happened in plain words: no access to that property, quota reached, sign-in revoked, or Google's own outage. Inputs are bounded (a date range is 1 to 480 days, the 16 months Search Console keeps), and a deployment allows 60 requests a minute per person unless its operator changes that. ### 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. ## About this page Built and run by [Oleksii Khoroshun](https://k-o.pro/about), an SEO with nine years in the field who builds tools at [k-o.pro](https://k-o.pro/). It is a fork of [Suganthan's GSC MCP](https://github.com/Suganthan-Mohanadasan/Suganthans-GSC-MCP) by [Suganthan Mohanadasan](https://suganthan.com): the analysis logic and most of the tool set are his design, and this fork adds multi-property access, the remote server and per-user sign-in. Version 3.11.0 · page updated 10 November 2026 · [changelog](https://github.com/kodotpro/gsc-mcp-remote#changelog) ## Related - [Overview](/index.md) - [Connect to Claude](/claude.md) - [Use it in Claude Code](/claude-code.md) - [All 32 tools](/tools.md) - [Find opportunities](/tools/opportunities.md) - [Diagnose drops](/tools/diagnostics.md) - [Look things up](/tools/lookups.md) - [Image search](/tools/image-search.md) - [AI Mode queries](/ai-mode-queries.md) - [Self-host it](/self-host.md) - [How it compares](/compare.md) --- Source: https://gsc.k-o.pro/privacy Legal # Privacy policy What `gsc.k-o.pro` does with your data when you connect your Google account to it. It is written to match what the software actually does; the source is public, so it can be checked. ## Who runs this service An instance of the open-source *gsc-mcp-remote* server, operated by whoever deployed it at `gsc.k-o.pro`. It is not operated by, affiliated with, or endorsed by Google or by Anthropic. ## What is collected | Data | Why | | --- | --- | | Your Google account email address and account identifier | To recognise you across sessions and to attach your saved settings and stored credential to you | | A Google refresh token, encrypted at rest | To call the Search Console API on your behalf without making you sign in again for every question | | Your chosen default property, if you set one | So tool calls that do not name a property can use it | | Irreversible hashes of the access tokens issued to your Claude client | To recognise valid requests. The tokens themselves are never stored, so a copy of the database does not yield working access tokens | | Server logs: session open and close events, errors, timestamps | To keep the service running and diagnose failures | ## What is not collected - **Your Search Console data is not stored.** Each question is answered by fetching live from Google's API and returning the result to your Claude client. Nothing is retained afterwards. - Logs deliberately exclude tokens and the content of your queries. - No advertising or analytics trackers, and no cookies for tracking. The service sets exactly one cookie, and only while you are connecting: a random value that ties the sign-in you started to the browser you started it in, so nobody else can complete it in your name. It is `HttpOnly`, scoped to the sign-in routes, expires after ten minutes, and is cleared the moment the connection finishes. It carries no identifier and is never used to track you. ## What access is requested One Search Console permission: `https://www.googleapis.com/auth/webmasters.readonly`. This is read-only. Signing in also uses Google's basic `openid` and `email` scopes, solely to identify your account. The service cannot submit URLs for indexing, change sitemaps, modify your properties, or reach any other Google service. Google's own Search Console permissions still apply on top: you see exactly the properties Google would show you. ## How your data is protected - Your Google refresh token is encrypted with AES-256-GCM under a key held in a file readable only by the service account, never in the database alongside the data it protects. - Tokens issued to your Claude client are random, stored only as SHA-256 hashes, expire after an hour, and rotate on refresh. Presenting an already-rotated token invalidates every session it belonged to. - All traffic is over HTTPS. - Your Google credentials are never sent to your Claude client, and the tokens issued to your Claude client are never sent to Google. ## Sharing Your data is not sold, rented, or shared with third parties. It is not used for advertising, and it is not used to train any machine-learning or AI model. The only third party involved is Google, whose API is called on your behalf with the permission you granted. ## Google API user data This service's use and transfer to any other app of information received from Google APIs will adhere to the [Google API Services User Data Policy](https://developers.google.com/terms/api-services-user-data-policy), including the Limited Use requirements. Data obtained through the Search Console API is transferred only to your own Claude client, in answer to the questions you ask there. It is not transferred to anyone else, not used for advertising, and not used to develop, improve or train any machine-learning or AI model. ## How long it is kept, and how to delete it Data is kept until you remove it. You can do that at any time, in either of two ways, and doing either is enough: - Ask your Claude client to run `disconnect_account`. This erases the stored Google credential, every token, and your saved settings, and ends your open sessions immediately. - Remove the app at [myaccount.google.com/permissions](https://myaccount.google.com/permissions). The stored credential stops working, and the service erases it the next time it tries to use it. Run `export_my_data` at any time to see everything held about you. Expired tokens and abandoned sign-in attempts are swept automatically. If the operator keeps backups of the database, an erased connection can remain in those backups until they expire (up to 30 days by default). Stored credentials in a backup stay encrypted with a key that is kept outside it. ## Changes If this policy changes materially, the change will appear on this page. The repository's history is the authoritative record of what changed and when. ## Contact For any question about your data, or to ask for it to be deleted by hand, write to [hi@k-o.pro](mailto:hi@k-o.pro). --- Not affiliated with or endorsed by Google or Anthropic. “Google” and “Google Search Console” are trademarks of Google LLC.