Google Search Console MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GSC_LANG | No | Language hint when a query's script is ambiguous (fa, ar, tr…) | |
| GSC_DB_PATH | No | Override individual file location for database | |
| GSC_ROW_CAP | No | Most rows one tool call may fetch. Default: 100000 | 100000 |
| GSC_USE_ADC | No | Set to 1 to use Google Application Default Credentials on a cloud VM when no credentials file is set. Default off. | |
| GSC_TIMEZONE | No | Your timezone for local-day reports, e.g. Asia/Tehran, Europe/Berlin | |
| GSC_CONFIG_DIR | No | Where your sign-in and history are kept. Default: ~/.config/gsc-mcp-full | ~/.config/gsc-mcp-full |
| GSC_DATA_STATE | No | all matches the Search Console UI; final returns only settled days. Default: all. | all |
| GSC_TOKEN_PATH | No | Override individual file location for token | |
| GSC_ALLOW_WRITE | No | Set to 1 to enable the write tools (then run gsc-mcp-full auth --force once). Default off. | |
| GSC_BIDI_ISOLATE | No | Set to 1 if right-to-left text renders scrambled in tables. Default off. | |
| GSC_ALLOWED_HOSTS | No | HTTP mode only: public host names allowed to reach the server through a proxy, comma-separated | |
| GSC_CREDENTIALS_PATH | Yes | Your OAuth client JSON or service-account key (detected automatically) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_capabilitiesA | Auth status, scope, write access, history coverage and the list of tools. Call this first when unsure. |
| reauthenticateA | Forget the cached client and sign in again (switch Google accounts or scopes). |
| build_query_regexA | Build a Search Console regex for a term that works in any script and matches its common spellings. Use the result as query_regex in other tools or paste it into the Search Console UI (regex filter). RE2's \b is ASCII-only, so this uses Unicode-safe boundaries; Arabic script gets ی/ي, ک/ك, ه/ة, ا/أ/إ/آ classes with optional vowel marks and half-spaces; digits match Persian, Arabic-Indic and full-width forms; Cyrillic е/ё; case-insensitive. loose=True also lets words run together. Accent and kana variants are not covered. |
| list_propertiesA | List every Search Console property this account can see, with the permission level. |
| get_propertyB | Details of one property (exact URL and permission level). Accepts loose input like example.com. |
| add_propertyB | Add a property to this account (needs GSC_ALLOW_WRITE=1). Verification still happens in Search Console. |
| remove_propertyA | Remove a property from this account (needs GSC_ALLOW_WRITE=1). Data is not deleted at Google. |
| query_search_analyticsA | Search Analytics rows with any dimensions and filters. The general-purpose query tool. Args: site_url: property (sc-domain:example.com, https://example.com/ or just example.com). days / start_date / end_date: range; explicit dates (YYYY-MM-DD) win over days. dimensions: comma list of query, page, country, device, date, searchAppearance, hour. search_type: web, image, video, news, discover, googleNews. query_filter: a term in ANY language; case-insensitive, and matches its common spellings (ی/ي, ک/ك, half-space, vowel marks, Persian/Arabic digits, е/ё). query_regex / query_regex_exclude: raw RE2 regex (see build_query_regex for a safe one). page_filter: substring of the page URL; page_exact: the exact URL; page_filter_exclude: substring to leave out; page_regex: RE2 regex on the URL. country: ISO-3166-1 alpha-3 (IRN, USA…); device: DESKTOP, MOBILE, TABLET. data_state: all (matches the UI, default) or final. group_variants: merge spelling variants of the same query (only when dimensions=query). level: standard or loose grouping (loose also merges spacing and accent differences). sort_by: clicks, impressions, ctr, position — applied to the fetched rows; Google itself always returns the top rows by clicks. limit: rows shown. max_rows: rows fetched. |
| performance_overviewB | One-screen summary: totals, trend, top queries and pages, devices, countries, and how fresh the data is. granularity: day, week, month or auto — the same choice as the Performance report's time-granularity menu (for hourly, use hourly_performance). auto picks day up to 31 days, week up to six months, then month. |
| compare_periodsB | Compare a period with an earlier one; biggest movers first. compare_to: previous (the same number of days just before) | year_ago (the same calendar dates last year) | 52_weeks (364 days back, weekdays aligned) | custom (give previous_start and previous_end). dimension: query, page, country, device or searchAppearance. Queries are matched across spellings. |
| queries_for_pageA | Which queries send traffic to one page. Spelling variants are merged unless group_variants=False. Give the exact page URL. If nothing matches exactly, pages whose URL contains the text are used instead and listed, so a path such as /blog/ works too. |
| pages_for_queryB | Which pages rank for one query — in each of its spellings — and how the impressions split between them. |
| hourly_performanceA | Hourly data for the last 10 days — Search Console's 24-hour view, and the only way to get true LOCAL days. hours=24 reproduces the Performance report's 24-hour view: the most recent 24 hourly points,
including preliminary ones. Otherwise the last |
| data_freshnessC | Which recent days are final and which are still changing, for daily and hourly data. |
| list_sitemapsA | Sitemaps submitted for a property, with errors/warnings and URL counts. Pass sitemap_index to list its children. |
| get_sitemapB | Details of one sitemap: submission/download dates, errors, warnings, per-type URL counts. |
| submit_sitemapB | Submit (or resubmit) a sitemap URL (needs GSC_ALLOW_WRITE=1). |
| delete_sitemapA | Remove a sitemap from Search Console (needs GSC_ALLOW_WRITE=1). The file itself is untouched. |
| inspect_urlB | Full URL Inspection for one page: index verdict, crawl, canonical, robots, sitemaps, rich results, mobile. |
| inspect_urlsB | Inspect up to 50 URLs in parallel (comma- or newline-separated). Quota is checked first. Columns: |
| indexing_summaryA | Problems only: which of the given URLs are not indexed or have structured-data failures, and why. Up to 50 URLs. |
| inspection_quotaA | How many URL inspections this server has used today for a property (Google allows ~2,000/day). |
| query_variantsA | Keywords that Search Console splits across several spellings, with their real combined totals. Groups queries by a per-script match key: Persian/Arabic letter forms (ی/ي, ک/ك, ه/ة, ا/أ/إ/آ), half-space, vowel marks, digit scripts, kana width, case, separator punctuation — also inside mixed queries such as «خريد iphone 13». level=loose additionally merges spacing, accents (café/cafe), hiragana/katakana, Simplified/Traditional Chinese (with the zh extra). Only groups with at least min_variants spellings are shown. source=history uses the local store. |
| language_breakdownC | Share of clicks and impressions by the script/language of the query (Persian vs Arabic vs Latin…). |
| keyboard_mistypesA | Queries typed with the keyboard on the wrong layout (e.g. "ovdn lhadk" = «خرید ماشین» on a Persian keyboard). A hit is reported only when the remapped text is a query that really appears in the data, so the list is precise. include_unmatched=True also lists vowel-less Latin queries that map cleanly onto a layout (more findings, some false positives). layouts: any of fa, fa2 (the two Persian layouts in common use), ar, ru, he. |
| top_termsC | Most demanded words across all queries — works for Chinese/Japanese/Thai (no spaces) too. Uses jieba / fugashi / pythainlp when installed ( |
| find_cannibalizationA | Queries where two or more of your pages compete, ranked by impressions going to the non-best page. Spelling variants of a query are merged first, so «خرید ماشین» on page A and «خريد ماشين» on page B is caught. min_share is the impression share a page needs to count as competing. |
| striking_distanceA | Queries ranking just off page one (default positions 8–20) with real demand — the quickest wins. potential_clicks estimates extra clicks at position 5. Spelling variants are merged first. |
| low_ctr_opportunitiesB | Query/page pairs on page one whose CTR is far below what their position should earn — title/snippet work. Expected CTR is the site's own median per position when there is enough data, otherwise a benchmark curve; ratio=0.5 flags rows under half the expected CTR. |
| content_moversB | Pages (or queries) that lost or gained ≥ threshold of their clicks vs an earlier period. compare_to: previous | year_ago (same calendar dates) | 52_weeks (weekdays aligned). Decayed = dropped, rising = grew, lost = had clicks before and none now, new = the opposite. |
| brand_splitB | Brand vs non-brand traffic. Give the brand in every script it is searched in, comma-separated (e.g. "toyota, تویوتا, トヨタ"). Each term matches its spelling variants, as whole words; with level=loose a term of 4+ characters also matches when glued to its neighbours (toyotacamry). |
| sync_historyA | Copy Search Analytics rows into the local SQLite history, one day at a time (keeps data past 16 months). Days already stored and final are skipped; recent or empty days are refreshed. dimensions defaults to
query,page; add country,device for more detail (more rows). One call works for about 45 seconds and
then reports how many days are left — call it again to continue, or run |
| history_statusC | What the local history contains: per property and search type, first/last day, rows, final days. |
| history_queryB | Query the local history for any date range, grouped by dimensions (queries merged across spellings). dimensions: query, page, country, device, date. query_contains matches the multilingual match key, so «ماشين» finds «ماشین» and 空调 works without spaces. |
| history_trendB | Clicks/impressions/CTR/position per day, ISO week or month from the local history — any length of time. |
| history_compareB | Compare two stored periods (e.g. this quarter vs the same quarter two years ago) — beyond the API's 16 months. dimension: query, page, country or device. |
| history_sqlB | Run a read-only SELECT on the history database. Table |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 37 tools
Most tools target distinct Search Console resources or analytics views, with clear boundaries such as single vs. batch URL inspection and API vs. local history. A few boundaries blur around the general-purpose query_search_analytics tool versus specialized analytics tools like performance_overview, compare_periods, and history_query, but the descriptions help disambiguate.
All tool names use snake_case consistently, with no camelCase or mixed styles. Many names are noun/report phrases rather than strict verb_noun patterns, but prefixes like history_, inspect_url(s), and sitemap_ are used predictably.
37 tools is well above a practical scoped set and risks overwhelming an agent, even for a feature-rich domain like Search Console. Many specialized analytics and history tools could be consolidated or surfaced as optional modes rather than separate top-level tools.
The surface covers properties, sitemaps, URL inspection, search analytics, advanced query/page analytics, variant handling, local history sync/query, and operational checks like capabilities and quota. No obvious lifecycle or CRUD gaps exist for the stated Google Search Console purpose.