# GSC PAP, full content > Hosted MCP server that connects Google Search Console, Google Analytics 4 and PageSpeed Insights to AI assistants such as Claude, Cursor, Claude Code and any other MCP client. Free. Sign in with Google; no Google Cloud project needed. This file is the whole of gscpap.com as one document. The index is at https://gscpap.com/llms.txt. ## Facts - Name: GSC PAP (gscpap.com) - What it is: a hosted Model Context Protocol (MCP) server that gives AI assistants read-only access to Google Search Console, Google Analytics 4 and PageSpeed Insights. - Price: free. $0, no credit card, no trial expiry, no paid tier today. Details at https://gscpap.com/pricing. - Tools: 36. - MCP endpoint: https://mcp.gscpap.com/mcp (streamable HTTP, OAuth 2.0 with Dynamic Client Registration, or a bearer token). - Setup: sign in with Google at https://app.gscpap.com. No Google Cloud project, no OAuth client of your own, nothing to install. - Scopes: webmasters.readonly, plus analytics.readonly when a user connects GA4. It cannot change properties, submit sitemaps or remove URLs. - History: a Personal Archive copies the 16 months of Search Console data Google still has when a user connects, then stores every new day, so history keeps growing past Google's 16-month limit. - Clients: Claude.ai connectors, ChatGPT custom MCP connectors (Business and Enterprise/Edu on ChatGPT web), Claude Desktop, Claude Code, Cursor, VS Code with GitHub Copilot, Cline, opencode, OpenAI Codex CLI, Gemini CLI, Windsurf, Zed, JetBrains AI Assistant, Continue, Warp, Goose, LM Studio, or any MCP client over HTTP. - Operator: an independent product, not affiliated with Google, Anthropic or OpenAI. https://gscpap.com/about. - Rate limits: 60 tool calls per minute and 1,000 per hour, per user. - Last shipped: 2026-10-27. Every change is dated at https://gscpap.com/changelog. ## Pricing GSC PAP is free. It costs $0 per user per month, and that includes all 36 tools, every property the signed-in Google account can see, the Search Console archive that reaches past Google's 16-month window, the Google Analytics 4 tools and the PageSpeed tools. There is no credit card form, no trial clock and no feature kept behind an upgrade prompt. The only ceilings are rate limits that protect the service: 60 tool calls per minute and 1,000 per hour, per user. A typical question costs 5 to 20 calls. They are not daily data caps. Paid plans arrive with v1.0, on three principles: pay as you go, a transparent per-call price, and a free tier that still covers light personal use. Preview accounts get at least 60 days notice and free-tier credits before any change. Full page: https://gscpap.com/pricing ## Two ways to connect, both free 1. One-click connector (no token, no config file). In Claude.ai, open the connector settings, add a custom connector with the URL https://mcp.gscpap.com/mcp, and approve the Google sign-in. GSC PAP implements OAuth 2.0 with Dynamic Client Registration (RFC 7591), so the client registers itself, and it advertises offline_access so a connector keeps working after the first token expires. ChatGPT supports the same flow, but custom MCP connections there are a Business and Enterprise/Edu feature on ChatGPT web. Guides: https://gscpap.com/integrations/claude-ai-connectors and https://gscpap.com/integrations/chatgpt 2. Bearer token (works in every MCP client). Sign in with Google at https://app.gscpap.com, copy the token shown once, and paste it into your client's MCP configuration. Guides per client are listed below. Time from first visit to first answer is about 60 seconds either way. ## Tools (36) ### Spot quick SEO wins Surface low-hanging fruit your team can ship this week. Pages ranking just outside the top 10, queries cannibalizing each other. - `find_quick_wins`: Find queries ranking positions 5 to 20 with at least 100 impressions but under 5% CTR: the title and snippet fixes most likely to lift clicks. - `find_cannibalization`: Detect keyword cannibalization where multiple URLs compete for the same query, splitting click-through and confusing Google. ### Find what's losing traffic Catch decaying pages and ranking drops before they tank your monthly traffic numbers. Compare any two periods, track positions over time. - `find_content_decay`: Identify pages losing organic traffic over time so you can refresh the content before rankings collapse. - `historical_position_trend`: Plot a query's position over the last N days to see whether you're trending up, down, or volatile. - `compare_periods`: Diff any two date ranges (e.g. last 28 days vs prior 28) to spot wins and losses across queries, pages, or countries. - `find_dead_pages`: Pages that have been appearing for months and have never earned a click, split by whether Google is showing them and nobody clicks (a listing problem) or barely showing them at all (not a listing problem). The larger group on most sites. ### Beat the 16-month limit Google Search Console only retains 16 months of search data. GSC PAP runs a per-account archive so you can query years of history through Claude or Cursor. - `search_analytics_archive`: Query your full GSC history beyond the 16-month limit. Same dimensions and filters as the live API, but unlocked for long-term trend analysis. - `archive_status`: Check archive coverage per site: earliest date, latest date, row count, last successful run. ### Diagnose performance & Core Web Vitals Run a Lighthouse audit or pull real-user (CrUX) Core Web Vitals for any public URL, right from your AI client. Lab data plus actual visitor metrics, with the top optimization opportunities ranked by potential time savings. - `pagespeed_insights`: Run a Google PageSpeed Insights (Lighthouse) audit. Returns performance / accessibility / best-practices / SEO scores, Core Web Vitals lab values (LCP, FCP, CLS, TBT), and the top opportunities ranked by potential savings. - `pagespeed_field_data`: Pull real-user Core Web Vitals from the Chrome User Experience Report (CrUX). LCP, INP, CLS at the 75th percentile, plus FAST/AVERAGE/SLOW rating, for both URL and origin level. ### Diagnose indexing issues Find out exactly why pages aren't indexed. URL Inspection API in bulk, full coverage summary, single-URL deep dives without tab-switching the GSC UI. - `get_index_coverage_summary`: Get an account-wide breakdown of indexing states (indexed, crawled-not-indexed, discovered-not-indexed) so you know where to focus. - `inspect_url`: Single-URL deep dive: indexability, last crawl, canonical, mobile usability, structured data. The full URL Inspection API result. - `batch_inspect_urls`: Bulk URL Inspection, up to 10 URLs per call within Google's 2,000-per-day quota. Diagnose why a content cluster or sitemap isn't getting indexed. - `find_new_pages`: Pages Search Console started showing in the last week, and whether each one has earned a click yet. Across this archive, 90% of the clicks new pages ever earn go to pages clicked in their first seven days, so a page still silent after a week rarely becomes anything. ### Pull performance data All the Search Analytics API capabilities, exposed natively to AI assistants. Skip the Google Cloud project setup, the OAuth dance, and the JSON parsing. - `get_performance_overview`: High-level performance snapshot for a site: clicks, impressions, CTR, position over the last N days. - `search_analytics_query`: Run any Search Analytics query with full dimension and filter support, identical to what you'd hit the GSC API for, but inline in chat. - `get_search_by_page_query`: Drill into a specific page to see which queries drive its traffic, impressions, and average position. ### Connect search to engagement & revenue (GA4) Pair GSC discovery with GA4 conversion data. Sessions, real-user engagement, top pages, conversions and revenue by source. The killer cross-tool joins GSC clicks per page to GA4 sessions, conversions, and revenue so you can see which top-ranking pages actually convert. - `list_ga4_properties`: List every Google Analytics 4 account and property the user can access. Always call first to discover the property_id needed for the other GA4 tools. - `ga4_overview`: High-level GA4 snapshot for a property: active users, sessions, new users, page views, bounce rate, average session duration, engagement rate, plus a per-day breakdown. - `ga4_top_pages`: Top pages by sessions over the last N days. One row per page path with sessions, active users, page views, bounce rate, average session duration. A session counts on every page it views, so the rows do not add up to total sessions. - `ga4_traffic_sources`: Acquisition breakdown by channel, source, medium, or campaign. Rows with sessions, active users, conversions per bucket. Choose the dimension to slice by. - `ga4_realtime`: Active users in the last 30 minutes broken down by country, device, city, current page, or minutes-ago. Plus the total active count. - `ga4_conversions_by_source`: Conversion attribution by source × medium with sessions, conversions, total revenue, and purchase revenue. Sorted by conversions to surface the channels driving outcomes. - `ga4_user_demographics`: Audience snapshot: top countries, device categories (desktop/mobile/tablet), and browsers. Useful for segmenting reports or identifying mobile-vs-desktop performance gaps. - `ga4_engagement`: Per-page engagement metrics. Engaged sessions, engagement rate, average session duration, bounce rate, event count. Spot pages that bring traffic but lose users. - `ga4_events_by_name`: Event-level breakdown: scroll depth, outbound clicks, file downloads and custom events, with event counts and users. Optionally per page, to answer questions like how many homepage visitors scrolled to 90%. - `ga4_compare_periods`: Diff any two windows for any GA4 metric (sessions, conversions, revenue, etc.). Week-over-week, month-over-month, with optional dimension slice. Returns absolute and percentage delta. - `correlate_gsc_to_ga4`: Cross-tool killer: join GSC clicks per page with the Google organic sessions, conversions and revenue GA4 recorded for visits landing on that page. Answer 'which top-ranking organic pages actually convert?' in one tool call instead of two manual exports. ### See who ranks above you on Google Search Console tells you your position, not who holds the spots above it or what is taking the clicks. Pull the live Google results for any query. - `serp_top_results`: Live Google results for any query and country: the top organic results plus which SERP features are present, such as AI Overview, featured snippet, map pack and People Also Ask. - `serp_competitor_analysis`: Where your domain ranks for a query and the full top 10 around it. Pair it with find_quick_wins to see exactly who is beating you on a query you are close on. - `serp_features_audit`: Check up to 25 queries at once for click-eating SERP features. Explains why CTR is low at a good position: usually an AI Overview, featured snippet or map pack above you. ### Manage sites & sitemaps List your verified properties, audit sitemap health, find duplicate property registrations that split your reporting. - `list_sites`: List every Search Console property you have access to, with verification state and permission level. - `get_site_details`: Permission level, verification state, and metadata for a single site URL. - `list_sitemaps`: List all sitemaps submitted for a property along with last download time and status. - `get_sitemap_details`: Per-sitemap detail: last submitted and downloaded, errors, warnings, and URLs submitted. - `detect_duplicate_properties`: Find duplicate Search Console properties (e.g. http vs https, www vs apex) that split your reporting and waste verification slots. The live, linkable list is at https://gscpap.com/tools ## Setup guides, one per client ### Connect Claude Desktop to Google Search Console URL: https://gscpap.com/integrations/claude-desktop Client: Claude Desktop Updated: 2026-09-18 Connect Claude Desktop to Google Search Console without creating a Google Cloud project. Sign in with Google, paste one config block, restart Claude. If you set up a self-hosted Search Console MCP server, the first step happens in the Google Cloud Console: create a project, enable the Search Console API, create OAuth credentials, download a JSON file, then keep the refresh token working. GSC PAP is a hosted MCP server, so you skip all of that. You sign in with Google, copy one token, and add one config block to Claude Desktop. Claude Desktop is Anthropic's desktop app for macOS and Windows. It talks to GSC PAP over the Model Context Protocol (MCP), so Claude can read your clicks, impressions, CTR and average position and answer questions about them. Access is read-only. Claude Desktop's config file only runs MCP servers it can start as a local command, so this guide connects through mcp-remote, a small open-source bridge that npx starts for you. It needs Node.js on your machine. If you would rather not install anything, see the connector option in the questions at the end. How to connect Google Search Console to Claude Desktop 1. Install Claude Desktop. Download Claude Desktop from claude.ai/download, open it, and sign in with your Anthropic account. 2. Sign in to GSC PAP and copy your token. Visit gscpap.com and click "Sign in with Google." Grant the read-only Search Console access. The connect page shows your bearer token once, so copy it now. If you lose it, create a new one at app.gscpap.com/account/tokens; your other tokens keep working. 3. Check that Node.js is installed. The bridge runs through npx, which ships with Node.js. Open a terminal and run the command below. If it prints a version number you are set. If the command is not found, install the LTS version from nodejs.org, then continue. 4. Open the Claude Desktop config file. Claude Desktop keeps its MCP servers in claude_desktop_config.json. Its Open Developer Config File command opens it for you, or open it directly at the path for your OS below. If the file does not exist yet, create it. 5. Add the GSC PAP server block. Paste the block below and replace YOUR_TOKEN with the token from step 2, keeping the word Bearer and the space before it. If the file already has an mcpServers section, add gsc-pap inside it next to your other servers instead of pasting a second mcpServers. Leave "Authorization:${AUTH}" exactly as written: the bridge fills in AUTH from the env block, and keeping the space out of the argument avoids a known Windows problem with spaces in arguments. 6. Restart Claude Desktop and ask a question. Quit Claude Desktop completely (Cmd+Q on macOS, or Quit from the tray icon on Windows) and open it again. The first start takes a little longer while npx downloads the bridge. Open a new chat and ask: "What sites are in my Search Console?" Claude calls list_sites and lists your verified properties. From there, try "Show me my top queries last week." Claude Desktop not showing your Search Console data? - Claude Desktop says "The following entries in claude_desktop_config.json are not valid MCP server configurations": an entry has the wrong shape. A block with "url" and "headers" produces exactly this, even though Cursor and other clients use that shape. Claude Desktop's config file only accepts servers it launches as a command, with command, args and env, which is why this guide uses the mcp-remote bridge. - "npx: command not found" or the server never starts: Node.js is missing or not on Claude Desktop's PATH. Install the LTS from nodejs.org and restart Claude Desktop. - GSC PAP tools do not appear, or Claude reports an authorization error: the token in AUTH is wrong or was revoked. Create a new one at app.gscpap.com/account/tokens and paste it into AUTH, with Bearer and a space in front, then restart Claude Desktop. - Claude Desktop reports a config error: check the JSON for trailing commas or unmatched braces. Run the file through a JSON validator if unsure. - On Windows, %APPDATA% expands to C:\Users\\AppData\Roaming, which File Explorer hides by default. The Open Developer Config File command avoids hunting for it. Questions - Do I need a Google Cloud project to connect Claude to Search Console? No. GSC PAP calls the Search Console API through its own OAuth client, which is already registered with Google. You never open the Google Cloud Console, enable an API, create OAuth credentials, or download a JSON file. A self-hosted MCP server needs all of those steps, which typically take 30 to 45 minutes the first time. - Is it free, and do I need a paid Claude plan? GSC PAP is free during the public preview: no credit card, no trial expiration, no feature gate. The limits are 60 tool calls per minute and 1,000 per hour per user. On the Claude side, the Free plan works with the config file setup in this guide. - Can Claude change anything in my Search Console? No. GSC PAP requests the read-only webmasters.readonly scope. Claude can read your verified sites, search analytics, sitemap status and URL inspection results. It cannot add or remove sites, submit sitemaps, or request indexing. - Can I connect Claude Desktop without editing the config file? Yes. Claude Desktop also supports custom connectors, which sign you in with OAuth instead of a pasted token. Add https://mcp.gscpap.com/mcp as a custom connector and approve the consent screen, as shown in the Claude.ai Connectors guide. Anthropic limits Free plans to one custom connector. ### Connect Cursor to Google Search Console URL: https://gscpap.com/integrations/cursor Client: Cursor Updated: 2026-09-18 Connect Google Search Console to Cursor through a hosted MCP server. Sign in with Google, paste one token into mcp.json, and skip the Google Cloud project. Cursor is an AI code editor whose agent can call Model Context Protocol (MCP) tools. Add GSC PAP as a remote MCP server and the agent can read your Search Console clicks, impressions, CTR and average position without leaving the editor. Once it is connected, you can ask things like "compare my top queries this week vs. last week" or "find pages where impressions dropped 20% in the last 30 days" in the same place you edit those pages. This guide assumes you have Cursor installed and are signed in. If not, download it from cursor.com. How to connect Google Search Console to Cursor 1. Sign in to GSC PAP and copy your token. Go to gscpap.com and click "Sign in with Google." Approve the read-only access it asks for. The connect page then shows your bearer token once, so copy it now. You paste it into Cursor's config in step 3. If you lose it, create a new one at app.gscpap.com/account/tokens; your other tokens keep working. 2. Open Cursor's MCP config file. For a server that works in every project, use the global mcp.json in your home directory. Create the file if it does not exist. Cursor also reads .cursor/mcp.json inside a project, but that file often ends up in git, so keep your token out of it (see the issues below). 3. Add the GSC PAP server. Paste the block below and replace YOUR_TOKEN with the token from step 1. If the file already lists other servers, add the gsc-pap entry inside the existing mcpServers object instead of pasting a second one. 4. Check that Cursor loaded the server. Open Cursor Settings and go to Tools & MCPs. (Cursor's docs also describe this list under Customize in the sidebar.) Find gsc-pap and make sure its toggle is on. Once it connects, its tools, such as list_sites, search_analytics_query and find_quick_wins, become available to the agent. 5. Ask a Search Console question. Open the agent chat and ask: "What are my top queries by clicks this week?" Cursor uses MCP tools from its Available Tools list when they fit the request, and you can also name a tool, for example "use list_sites". By default, Cursor asks for your approval before it runs an MCP tool. Cursor MCP setup: common issues - A tool call that fails with "Missing or invalid bearer token" means the token in mcp.json is wrong or was revoked. Create a new one at app.gscpap.com/account/tokens and paste it in. - If gsc-pap does not appear after you save mcp.json, check the file for JSON mistakes such as a trailing comma, then toggle the server off and on, or restart Cursor. - The URL must be exactly https://mcp.gscpap.com/mcp, including the /mcp path. - To keep the token out of a project-level .cursor/mcp.json, write the header value as "Bearer ${env:GSC_PAP_TOKEN}". Cursor fills in ${env:NAME} in url and headers from its environment, so GSC_PAP_TOKEN has to be set in the environment Cursor starts from. Questions - Do I need a Google Cloud project to use Search Console in Cursor? No. Running your own Search Console MCP server means creating a Google Cloud project, enabling the Search Console API, creating OAuth credentials, and looking after a JSON credentials file and refresh tokens. GSC PAP is already hosted: you sign in with Google at gscpap.com, copy one bearer token, and paste it into ~/.cursor/mcp.json. - Is the GSC PAP MCP server free to use with Cursor? Yes, while GSC PAP is in public preview. There is no credit card, no trial that runs out, and no paid tier holding tools back. Usage is capped at 60 MCP tool calls per minute and 1,000 per hour per user. - Why doesn't Cursor show the gsc-pap tools after I edit mcp.json? Check that the file is valid JSON and that the gsc-pap entry sits inside mcpServers. Then open Tools & MCPs in Cursor Settings, make sure gsc-pap is toggled on, and restart Cursor if it still shows no tools. If the server reports a token error, create a new token at app.gscpap.com/account/tokens. ### Connect Claude Code to Google Search Console URL: https://gscpap.com/integrations/claude-code Client: Claude Code Updated: 2026-09-18 Add Google Search Console to Claude Code with one claude mcp add command. Hosted and read-only: no Google Cloud project, no OAuth credentials, no Python. GSC PAP is a hosted Google Search Console MCP server, so connecting it to Claude Code takes one claude mcp add command with your token. There is no Google Cloud project to create, no Search Console API to enable, no OAuth credentials to download, and no local Python server to keep running. Claude Code is Anthropic's CLI agent for terminal-based work. It runs in any directory, has full access to your file system, and supports MCP servers natively. Unlike Claude Desktop and Cursor where you edit a JSON file by hand, Claude Code uses a single CLI command to register a server. User-scope (--scope user) means GSC PAP becomes available in every project where you run Claude Code - no per-repo configuration needed. Avoid --scope project for this server: it writes the command, including your bearer token, into .mcp.json, a file meant to be committed to git. This guide assumes Claude Code is installed (npm install -g @anthropic-ai/claude-code) and you are signed in. How to add the Search Console MCP server to Claude Code 1. Sign in to GSC PAP and copy your token. Visit gscpap.com and click "Sign in with Google." Grant the read-only Search Console scope. The connect page shows your one-time bearer token. Copy it. The next step needs it inside a CLI command. 2. Run claude mcp add. In any terminal, run the command below. Replace YOUR_TOKEN with the bearer from step 1. The --scope user flag makes the server available globally and keeps your token in your own user config, out of the repo. 3. Verify and use. Type claude inside any directory to start an interactive session. Run /mcp inside the chat to see registered servers - gsc-pap should be listed with its tools. Then ask: "List my Search Console sites and show top 5 queries on each from last week." Claude Code chains the tool calls automatically. Managing and troubleshooting the server in Claude Code - Run claude mcp list to see what is registered. Run claude mcp remove gsc-pap to delete the server (you can re-add later with a new token). - If /mcp says "failed to reconnect," the most common cause is the MCP server having restarted in the meantime. Just retry - GSC PAP runs in stateless mode so reconnects are instant. - The --scope user config lives in ~/.claude.json. You can edit it manually if needed, but the CLI is safer. - Claude Code's terminal mode disables some color sequences. If JSON output looks scrambled, redirect to a file: claude > out.txt and read it after. Questions - Do I need a Google Cloud project or API key for Claude Code? No. You sign in with Google at gscpap.com and copy a bearer token. GSC PAP calls the Search Console API with its own registered OAuth client, so you never create a project, enable the API, or handle a client secret JSON file. - Should I use --scope user, local or project? Use --scope user to have Search Console in every repo; Claude Code stores it in ~/.claude.json, private to you. To limit it to one repo, use local scope (the default), which is also private. Project scope writes the server, including your bearer token, to .mcp.json in the repo root, a file meant to be committed. If you use it, change the header in .mcp.json to Bearer ${GSC_PAP_TOKEN} and set that environment variable; Claude Code expands it. - Can Claude Code change my Search Console settings? No. GSC PAP requests the read-only webmasters.readonly scope. Claude Code can read your verified sites, search analytics, sitemap status and URL inspection results, but it cannot add or remove sites, submit sitemaps, or request indexing. - Is GSC PAP free? Yes, during the public preview. There is no credit card, no trial expiration and no feature gate. Each user can make 60 tool calls per minute and 1,000 per hour. ### Connect OpenAI Codex CLI to Google Search Console URL: https://gscpap.com/integrations/codex-cli Client: Codex CLI (OpenAI) Updated: 2026-09-18 Add Google Search Console, GA4 and PageSpeed data to OpenAI's Codex CLI with one TOML block and a bearer token. You never create a Google Cloud project. Codex CLI is OpenAI's terminal coding agent. It connects to remote MCP servers over Streamable HTTP and can read a bearer token from an environment variable, so the token does not have to sit in its config file. This guide goes from a fresh Codex install to your first Search Console question in about four minutes. How to add the Search Console MCP server to Codex CLI 1. Install Codex CLI and sign in. Install Codex with npm or Homebrew, then run codex login (or start codex and choose Sign in with ChatGPT). If Codex is already installed and signed in, skip this step. 2. Sign in to GSC PAP and copy your token. Go to gscpap.com and click "Sign in with Google." Approve the read-only access it asks for. The connect page then shows your bearer token once, so copy it now. If you lose it, create a new one at app.gscpap.com/account/tokens; your other tokens keep working. 3. Register gsc-pap with Codex. Run the command below. It adds a gsc-pap entry to ~/.codex/config.toml that points at the server and tells Codex to read the token from the GSC_PAP_TOKEN environment variable. You can also paste the same three lines into config.toml by hand. 4. Set the token and start Codex. Add the token to your shell profile so every new terminal has it, then start Codex. This keeps the token out of config.toml, but your shell profile now holds it in plain text, so do not commit or share that file. Use ~/.bashrc instead of ~/.zshrc if you use bash. Inside Codex, run /mcp to confirm gsc-pap is connected, then ask: "What sites are in my Search Console?" Codex calls list_sites and replies with your verified properties. Codex CLI MCP troubleshooting - Codex reads GSC_PAP_TOKEN when it starts. If you set the variable in one terminal and launch Codex from another, Codex has no token and gsc-pap offers no tools. Open a new terminal or run source ~/.zshrc before you start Codex. - codex mcp list shows the server and the variable name, but it does not test the connection. Run /mcp inside a Codex session to see whether gsc-pap connected. - The Codex IDE extension reads the same ~/.codex/config.toml, so you register the server once. The extension also needs GSC_PAP_TOKEN in the environment it starts from. - A tool call that fails with "Missing or invalid bearer token" means the token is wrong or was revoked. Create a new one at app.gscpap.com/account/tokens and update GSC_PAP_TOKEN. Your other tokens keep working. Questions - Do I need a Google Cloud project or API key to use Search Console in Codex? No. There is no Google Cloud project to create, no Search Console API to enable, and no OAuth client JSON to download. You sign in with Google at gscpap.com, and the bearer token you get there is the only credential Codex needs. Codex reads it from the GSC_PAP_TOKEN environment variable. - Does the Codex IDE extension use the same MCP config as the CLI? Yes. OpenAI's docs say the Codex CLI, the IDE extension and the ChatGPT desktop app share ~/.codex/config.toml, so you add the [mcp_servers.gsc-pap] block once instead of configuring each surface separately. - Can Codex change anything in my Search Console? No. GSC PAP holds read-only Google scopes: webmasters.readonly for Search Console and read-only access for GA4. Codex can read clicks, impressions, CTR, position, sitemap status and URL inspection results, but it cannot submit sitemaps, request indexing, or change settings. ### Connect GitHub Copilot in VS Code to Google Search Console URL: https://gscpap.com/integrations/vscode-copilot Client: VS Code (GitHub Copilot) Updated: 2026-09-18 Connect Google Search Console to GitHub Copilot in VS Code with one .vscode/mcp.json entry, then ask agent mode about GSC. You skip Google Cloud setup. GitHub Copilot in VS Code can use Model Context Protocol (MCP) servers from its agent. You configure servers in an mcp.json file: .vscode/mcp.json in a workspace, which you can commit and share with your team, or the mcp.json in your user profile, which stays private to you. This guide uses the workspace file with an input variable, so the file never holds a token and each teammate enters their own. How to connect Google Search Console to GitHub Copilot 1. Sign in to GSC PAP and copy your token. Go to gscpap.com and click "Sign in with Google." Approve the read-only access it asks for. The connect page then shows your bearer token once, so copy it now. If you lose it, create a new one at app.gscpap.com/account/tokens; your other tokens keep working. 2. Create .vscode/mcp.json in your workspace root. Add the gsc-pap server below. The ${input:gsc_pap_token} placeholder makes VS Code ask for the token the first time the server starts and store the value securely, so the token never goes into the file. To set this up only for yourself, run MCP: Open User Configuration from the Command Palette and add the same entry there instead. 3. Start the server and enter your token. In mcp.json, use the inline actions shown above the gsc-pap entry to start it, or run MCP: List Servers from the Command Palette, pick gsc-pap, and start it there. VS Code asks you to confirm that you trust the server, then prompts for the token. Paste the one from step 1. 4. Ask Copilot in Agent mode. Open the Chat view, select Agent from the agent picker, and ask: "What sites are in my Search Console?" Copilot calls list_sites and replies with your verified properties. It may ask you to approve each tool call. The Configure Tools button in the chat input shows the gsc-pap tools and lets you turn individual tools off. Copilot agent mode and MCP: common issues - MCP: List Servers lets you start, stop or restart gsc-pap and open its output log. If the tool list looks out of date, run MCP: Reset Cached Tools. - VS Code does not forward servers that use ${input:...} variables to Agent Host sessions. If gsc-pap works in a regular chat but is missing in an Agent Host session, that is the reason. The Agent Host reads its own MCP config from ~/.copilot/mcp-config.json or a workspace .mcp.json. - A tool call that fails with "Missing or invalid bearer token" means the token you entered is wrong or was revoked. Create a new one at app.gscpap.com/account/tokens. - Keep "type": "http" and the full URL, https://mcp.gscpap.com/mcp. VS Code requires the type field for remote servers. Questions - Do I have to create a Google Cloud project before connecting Copilot? No. GSC PAP already handles the Google Cloud side (the project, the Search Console API, the OAuth credentials). You sign in with Google at gscpap.com, copy a bearer token, and VS Code asks for it the first time the gsc-pap server starts. - Does GitHub Copilot need agent mode to read Search Console data? Yes. MCP tools are used by Copilot's agent, so select Agent in the chat input's agent picker before you ask your Search Console question. - Is it safe to commit .vscode/mcp.json with the GSC PAP server in it? Yes, with the config on this page. The file holds only the ${input:gsc_pap_token} placeholder, never the token itself. Each teammate is asked for their own token when the server first starts, and VS Code stores that value securely instead of writing it to the file. ### Connect Gemini CLI to Google Search Console URL: https://gscpap.com/integrations/gemini-cli Client: Gemini CLI (Google) Updated: 2026-09-18 Query Google Search Console (GSC) from your terminal with Gemini CLI. Register GSC PAP as an MCP server in settings.json, with no Google Cloud project. Gemini CLI is Google's open-source terminal agent. It supports Model Context Protocol (MCP) servers, so you can register GSC PAP once and ask Search Console questions from your terminal. Setup mirrors the other CLI agents: install, copy a token from gscpap.com, register the server, then check that it connects. How to connect Google Search Console to Gemini CLI 1. Install Gemini CLI and sign in. Install Gemini CLI with npm or Homebrew, or run it without installing through npx @google/gemini-cli. Start it with gemini and choose Sign in with Google when it asks how to authenticate. 2. Sign in to GSC PAP and copy your token. Go to gscpap.com and click "Sign in with Google." Approve the read-only access it asks for. The connect page then shows your bearer token once, so copy it now. If you lose it, create a new one at app.gscpap.com/account/tokens; your other tokens keep working. 3. Register gsc-pap. Run the command below with your token in place of YOUR_TOKEN. The --scope user flag saves the server in ~/.gemini/settings.json so it works in every folder; without it, Gemini CLI saves it to .gemini/settings.json in the current folder. To edit settings.json by hand instead, add an entry under mcpServers (camelCase) with httpUrl set to https://mcp.gscpap.com/mcp and a headers object that holds the Authorization line. 4. Trust the folder and check the connection. Gemini CLI connects to MCP servers only in folders you trust. The first time you run gemini in a folder, it asks whether to trust it; choose Trust folder. Then run gemini mcp list from that folder. You want the gsc-pap line to end in Connected. Disabled means the folder is not trusted yet. Disconnected usually means a wrong URL or token. 5. Ask a Search Console question. Start gemini in a trusted folder and ask: "List my Google Search Console sites and pull the top 5 queries from last week." Gemini asks you to confirm GSC PAP tool calls, then calls list_sites and search_analytics_query and answers in the terminal. Inside a session, /mcp list shows the server's status. Gemini CLI MCP config: known issues - The settings key is mcpServers. A block named mcp_servers is ignored, and gemini mcp list reports "No MCP servers configured." - In a hand-written entry, use httpUrl for GSC PAP. A plain url with no "type": "http" tells Gemini CLI to use the older SSE transport instead of Streamable HTTP. - In an untrusted folder, Gemini CLI skips every MCP server, including the ones in ~/.gemini/settings.json. Run /permissions inside Gemini CLI to change the current folder's trust. - To keep the token out of settings.json, write the header value as "Bearer $GSC_PAP_TOKEN" and export GSC_PAP_TOKEN in your shell. Gemini CLI fills in environment variables in settings.json strings when it loads them. - The URL must be exactly https://mcp.gscpap.com/mcp, including the /mcp path. Questions - Can I query Google Search Console from the command line? Yes. Once GSC PAP is registered, Gemini CLI can call Search Console tools such as list_sites and search_analytics_query from your terminal. You ask in plain English and get clicks, impressions, CTR and position back. If you want raw requests without an agent, the same server also answers curl calls; see the direct HTTP guide. - Does Gemini CLI need a Google Cloud project to read Search Console? No. Gemini CLI uses your Google account to sign you in to Gemini, and GSC PAP asks separately for read-only Search Console access through its own OAuth client. You never open the Google Cloud Console, enable an API, or download credentials. - Is the connection read-only? Yes. GSC PAP requests the webmasters.readonly scope for Search Console, plus read-only access for GA4. Gemini can read your data but cannot submit sitemaps, request indexing, or edit anything in your properties. ### Connect Windsurf to Google Search Console URL: https://gscpap.com/integrations/windsurf Client: Windsurf (Devin Desktop) Updated: 2026-09-18 Give Windsurf, now Devin Desktop, your Google Search Console data. Add GSC PAP as a remote MCP server with one bearer token and no Google Cloud project. Windsurf is now called Devin Desktop. Cognition renamed it in June 2026, and its new Devin Local agent replaced Cascade as the default agent for new tabs. Both agents can use remote MCP servers, but they read their MCP config from different files. This guide sets up Devin Local first, then covers the legacy Cascade agent. The gsc-pap block is the same for both; only the file changes. How to connect Google Search Console to Windsurf 1. Sign in to GSC PAP and copy your token. Go to gscpap.com and click "Sign in with Google." Approve the read-only access it asks for. The connect page then shows your bearer token once, so copy it now. If you lose it, create a new one at app.gscpap.com/account/tokens; your other tokens keep working. 2. Add gsc-pap to the Devin Local config. Devin Local reads MCP servers from the Devin CLI config files. For a server that works in every project, open or create ~/.config/devin/mcp_config.json (on Windows, %APPDATA%\devin\mcp_config.json) and add the block below with your token in place of YOUR_TOKEN. If the file already has an mcpServers object, add only the gsc-pap entry to it. Older builds kept mcpServers in ~/.config/devin/config.json; current builds move those entries into mcp_config.json automatically. 3. Using the legacy Cascade agent? Add it there too. Cascade reads a different file: ~/.codeium/windsurf/mcp_config.json. Add the same gsc-pap block there; Cascade accepts either url or serverUrl for remote servers. You can also reach Cascade's MCP list from the MCPs icon at the top right of the Cascade panel, or from Devin Settings > Cascade > MCP Servers. Skip this step if you only use Devin Local. 4. Open a new agent tab and ask. Start a new Devin Local session and ask: "Use the gsc-pap MCP server. Show me my top 10 queries by clicks last week." Devin Local asks for approval before it calls any MCP tool; you can allow a single tool or every gsc-pap tool, for this session or permanently. To confirm the server loaded, choose Open customizations from the new-tab menu in an agent space, which lists the MCP servers the session has loaded. Windsurf (Devin Desktop) MCP setup: common issues - A tool call that fails with "Missing or invalid bearer token" means the token is wrong or was revoked. Create a new one at app.gscpap.com/account/tokens and update the config file. - Cascade can use at most 100 tools at once across all MCP servers. If you run several servers, turn off the tools you do not need on each server's settings page. - For Cascade on Enterprise plans, MCP has to be turned on in settings first, and team admins can restrict which servers are allowed. An allowlist entry must match the server key, gsc-pap, exactly. - Cascade's mcp_config.json can read the token from an environment variable: write the header value as "Bearer ${env:GSC_PAP_TOKEN}". Questions - Do I need Google Cloud credentials to connect Windsurf to Search Console? No. You do not create a Google Cloud project, enable the Search Console API, or handle an OAuth JSON file. Sign in with Google at gscpap.com, copy the bearer token, and put it in the Authorization header of the gsc-pap entry. - Is Windsurf the same as Devin Desktop? Yes. Cognition renamed Windsurf to Devin Desktop in June 2026 through an automatic update, and your Windsurf settings carried over. The default agent is now Devin Local, which reads MCP servers from ~/.config/devin/mcp_config.json. The older Cascade agent reads ~/.codeium/windsurf/mcp_config.json. - Is GSC PAP free? Yes, during the public preview. You get every tool across Search Console, GA4 and PageSpeed Insights with no credit card and no trial clock. The only caps are 60 tool calls per minute and 1,000 per hour per user. ### Connect Zed to Google Search Console URL: https://gscpap.com/integrations/zed Client: Zed Editor Updated: 2026-09-18 Bring Google Search Console into Zed's AI assistant as an MCP context server. You add one settings.json block and a token, with no Google Cloud setup. Zed is an open-source code editor with a built-in AI agent. It talks to Model Context Protocol (MCP) servers, which it lists under context_servers in its settings, and it can connect to remote servers over HTTP. GSC PAP plugs in as a remote server. You add a URL and one Authorization header; there is no extension to install. How to add Google Search Console to Zed 1. Sign in to GSC PAP and copy your token. Go to gscpap.com and click "Sign in with Google." Approve the read-only access it asks for. The connect page then shows your bearer token once, so copy it now. If you lose it, create a new one at app.gscpap.com/account/tokens; your other tokens keep working. 2. Add gsc-pap as a remote MCP server. Open Settings > AI > MCP Servers, click Add Server, and choose Add Remote Server. Zed writes what you enter to your settings file. To edit that file directly, run zed: open settings file from the command palette and add the entry below under context_servers, with your token in place of YOUR_TOKEN. If context_servers already exists, add only the gsc-pap entry. 3. Check the status and ask a question. Go back to Settings > AI > MCP Servers. The dot next to gsc-pap turns green, with the tooltip "Server is active", once Zed connects. Then open the Agent Panel and ask: "Use gsc-pap to list my Search Console sites." Naming the server helps the model pick its tools. By default, Zed asks for approval before it runs a tool. Zed context server troubleshooting - Put url and headers directly on the gsc-pap entry, as shown above. Zed's docs do not use a nested transport object for remote servers. - Keep the Authorization header. When a remote server has no Authorization header, Zed starts the MCP OAuth sign-in flow instead of sending a token. - If the dot is not green, hover over it to read the status, then run zed: open log from the command palette and look for lines that mention gsc-pap. - A "Missing or invalid bearer token" error means the token is wrong or was revoked. Create a new one at app.gscpap.com/account/tokens. Questions - Do I need a Zed extension to use Google Search Console? No. GSC PAP is a remote HTTP server, so you add it under context_servers in settings.json or through Add Remote Server. There is nothing to install and no local process to keep running. - Is a Google Cloud project required to connect Zed to Search Console? No. GSC PAP is hosted and its Google OAuth client is already registered. Signing in with Google at gscpap.com gives you a bearer token, and that token is the only credential Zed needs to reach your Search Console data. - Can Zed's assistant change my Search Console data? No. Access is read-only: GSC PAP holds the webmasters.readonly scope, so it can read sites, search analytics, sitemaps and URL inspection results, but it cannot write, modify, or delete anything. ### Connect JetBrains AI Assistant to Google Search Console URL: https://gscpap.com/integrations/jetbrains Client: JetBrains IDEs Updated: 2026-09-18 Connect Google Search Console to IntelliJ, PyCharm, WebStorm and other JetBrains IDEs via AI Assistant's MCP settings, without a Google Cloud project. JetBrains AI Assistant can use Model Context Protocol (MCP) servers over STDIO, Streamable HTTP and SSE. You add them under Settings > Tools > AI Assistant > Model Context Protocol (MCP), the same page in IntelliJ IDEA, PyCharm, WebStorm, GoLand, RubyMine, PhpStorm and the other JetBrains IDEs that run AI Assistant. GSC PAP is a remote Streamable HTTP server that authenticates with a bearer token in the Authorization header. How to connect Google Search Console to JetBrains AI Assistant 1. Sign in to GSC PAP and copy your token. Go to gscpap.com and click "Sign in with Google." Approve the read-only access it asks for. The connect page then shows your bearer token once, so copy it now. If you lose it, create a new one at app.gscpap.com/account/tokens; your other tokens keep working. 2. Open the MCP settings. Go to Settings > Tools > AI Assistant > Model Context Protocol (MCP) and click Add. You can also get there by typing / in the AI Assistant chat and choosing Add Command. 3. Paste the gsc-pap configuration. In the New MCP Server dialog, choose the URL-based (remote) connection and paste the JSON below with your token in place of YOUR_TOKEN. Set the server level to Global so it is available in every project, then click OK and Apply. Apply starts the server. 4. Check the status and ask a question. The Status column shows whether AI Assistant connected. Click the icon in that column to see the tools gsc-pap provides. Then open the AI Assistant chat and ask: "What sites are in my Search Console? Give me the top 5 queries by clicks last week." AI Assistant calls the tools when they fit, or you can type / to run one directly. 5. If authentication fails, use a local bridge. Only needed if step 4 shows "Missing or invalid bearer token" even with a fresh token. JetBrains documents remote servers with a url only and does not mention headers, so if your build does not send the header, replace the entry with this STDIO configuration. It runs the open-source mcp-remote package through npx (Node.js required), which forwards requests to GSC PAP and adds the header. Keep Authorization:${AUTH_HEADER} without spaces; the value with the space goes in env. JetBrains MCP setup: common issues - "Missing or invalid bearer token" means the server did not receive a valid token. Create a new one at app.gscpap.com/account/tokens; if a fresh token still fails, use the bridge in step 5. - After you change a server's configuration, click Apply. To have new and changed servers start on their own, turn on Automatically enable new and changed MCP servers on the same settings page. - To reconnect, select gsc-pap and click Reconnect. To stop it, clear its checkbox and click Apply. - For logs, choose Help > Show Log in Finder (macOS) or Show Log in Explorer (Windows) and open the mcp folder. It holds one log per configured server. - If your organization manages AI Assistant centrally, an administrator may have preconfigured MCP servers and turned off adding your own. Questions - Which JetBrains IDEs can connect to Google Search Console? Any JetBrains IDE that runs AI Assistant, including IntelliJ IDEA, PyCharm, WebStorm, GoLand, RubyMine and PhpStorm. The Model Context Protocol (MCP) settings page is the same across them, so these steps apply to all of them. - Do I need a Google Cloud project to use Search Console in IntelliJ or PyCharm? No. You skip the Google Cloud Console entirely: no project, no API to enable, no OAuth credentials to create. Sign in with Google at gscpap.com and paste the bearer token into the gsc-pap entry in AI Assistant's MCP settings. - Can I reuse my Claude Desktop MCP setup? Yes. The MCP settings page has an Import from Claude button that adds the servers from your Claude Desktop configuration to the list, including a gsc-pap entry if you already set one up there. ### Connect Continue to Google Search Console URL: https://gscpap.com/integrations/continue Client: Continue (extension) Updated: 2026-09-18 Continue MCP setup for Google Search Console: add one mcpServers entry with a bearer token in VS Code or JetBrains. You do not need a Google Cloud project. Continue is an open-source AI coding assistant for VS Code and JetBrains IDEs. It reads MCP servers from the mcpServers list in its config.yaml and uses their tools in Agent mode. If Continue is already installed and set up with a model, this takes about four minutes. How to add Google Search Console to Continue 1. Sign in to GSC PAP and copy your token. Go to gscpap.com and click "Sign in with Google." Approve the read-only access it asks for. The connect page then shows your bearer token once, so copy it now. If you lose it, create a new one at app.gscpap.com/account/tokens; your other tokens keep working. 2. Save the token as a Continue secret. Continue's IDE extensions cannot read environment variables from your shell, so store the token in Continue's global .env file. Create ~/.continue/.env (on Windows, %USERPROFILE%\.continue\.env) with the line below, using your token with no quotes around it. Keep this file out of version control. 3. Add gsc-pap to config.yaml. Open the Continue sidebar (Cmd/Ctrl+L in VS Code, Cmd/Ctrl+J in JetBrains), click the config selector above the chat input, and click the gear icon next to your local config. That opens ~/.continue/config.yaml. Add the gsc-pap item under mcpServers; if the file already has an mcpServers list, add only the item. Save the file and Continue reloads the config on its own. 4. Ask in Agent mode. Continue only uses MCP tools in Agent mode. Switch the chat to Agent and ask: "List my Search Console sites." Continue calls list_sites from gsc-pap and shows your verified properties. Continue MCP config: common issues - The older config.json format is deprecated. When config.yaml exists, Continue loads it instead of config.json, so add the server to config.yaml. - "unresolved secrets: GSC_PAP_TOKEN" means Continue could not find the secret. Check that ~/.continue/.env exists and that the name matches exactly. Continue also looks in .env and .continue/.env at the workspace root. - Instead of requestOptions.headers, you can write apiKey: ${{ secrets.GSC_PAP_TOKEN }} on the server entry. Continue sends apiKey as an Authorization: Bearer header. - A "Missing or invalid bearer token" error means the token is wrong or was revoked. Create a new one at app.gscpap.com/account/tokens and update ~/.continue/.env. Questions - Does this work in both the VS Code and JetBrains versions of Continue? Yes. Both read the same ~/.continue/config.yaml and ~/.continue/.env, so the steps are identical. Continue reloads the config when you save it. - Does the same setup work in the Continue CLI? Yes. The Continue CLI (cn) accepts the same mcpServers entry. Unlike the IDE extensions, the CLI can also read GSC_PAP_TOKEN from your shell environment. - Do I need a Google Cloud project to add Search Console to Continue? No. GSC PAP runs the Google side for you, so there is no project to create, no Search Console API to enable, and no credentials file to manage. The only thing you give Continue is the bearer token from gscpap.com. - Is GSC PAP free? Yes. It is free during the public preview, with no credit card and no feature gate. Usage limits are 60 MCP tool calls per minute and 1,000 per hour per user. ### Add a Google Search Console connector to Claude.ai URL: https://gscpap.com/integrations/claude-ai-connectors Client: Claude.ai (browser) Updated: 2026-09-18 Add Google Search Console to Claude.ai as a custom connector. Paste one URL and approve access. No token to copy, no config file, no Google Cloud project. GSC PAP works as a Google Search Console (GSC) connector for Claude.ai. You paste its MCP URL into Claude's custom connector dialog, approve access, and Claude can read your Search Console, GA4 and PageSpeed data in the browser. You do not need a Google Cloud project, API credentials, or anything installed on your machine. Claude.ai is Anthropic's browser-based Claude, the one most users start with before installing the desktop app or Claude Code. As of 2025 it supports remote MCP servers through the Customize → Connectors panel, with full OAuth 2.0 + Dynamic Client Registration handling. GSC PAP exposes a fully-conformant OAuth 2.0 + DCR provider (RFC 7591), which means Claude.ai can register itself as a client, redirect you through the consent flow, and persist a refresh token, all without you ever touching a config file or copying a bearer. This is the lowest-friction integration we offer: three clicks, no tokens, no config. How to add the Search Console connector in Claude.ai 1. Open Claude.ai → Customize → Connectors. Go to claude.ai, click your avatar (bottom-left) → Customize → Connectors. The panel lists already-installed connectors and has an "Add custom connector" button at the top. 2. Add the GSC PAP MCP URL. Click "Add custom connector" and paste the MCP URL. Leave the auth method on OAuth (Claude.ai will discover the OAuth metadata automatically via /.well-known/oauth-authorization-server). Click Connect. 3. Approve the OAuth consent screen. Claude.ai redirects you to gscpap.com's consent page (showing what scope it's requesting on your behalf). Click "Authorise." You land back in Claude.ai with the connector active. Now ask any chat: "What sites are in my Search Console?". Claude calls list_sites and returns your verified properties. Things to know about the Claude.ai connector - The first time, Claude.ai also walks you through Google sign-in (gscpap.com → Sign in with Google) if you haven't done that before. Subsequent connector additions skip that step. - Custom connectors are available on all Claude plans (free and paid). If your Customize menu lacks the Connectors entry, your Claude.ai workspace may have it disabled by an admin, switch to your personal account. - Tokens issued via OAuth are revocable from app.gscpap.com/account/tokens just like manually-minted ones. They show as "Sign-in" source in the dashboard. - If GSC PAP rolls into the official Connectors directory (Anthropic's curated list), the install becomes a single click, no need to paste the URL. Until then the custom-connector flow is the path. Questions - Which Claude plans can add a custom connector? Anthropic offers custom connectors on Free, Pro, Max, Team and Enterprise plans, and limits Free users to one custom connector. On Team and Enterprise plans, an Owner adds connectors in Organization settings and members connect to them from Customize > Connectors. - Do I need a Google Cloud project or API key? No. The connector signs you in with Google through GSC PAP's own OAuth client, which is already registered with Google. You never create a Google Cloud project, enable the Search Console API, or download credentials. - Can the connector change anything in Search Console? No. GSC PAP requests the read-only webmasters.readonly scope. Claude can read your verified sites, search analytics, sitemap status and URL inspection results, but it cannot add or remove sites, submit sitemaps, or request indexing. - Is the GSC PAP connector free? Yes, during the public preview. There is no credit card, no trial expiration and no feature gate. Each user can make 60 tool calls per minute and 1,000 per hour. ### Call the Google Search Console MCP server over HTTP URL: https://gscpap.com/integrations/mcp-direct Client: Direct HTTP (curl, custom agents) Updated: 2026-09-18 Call the GSC PAP MCP server from curl or your own agent. It is JSON-RPC over HTTP with a bearer token, so you need no MCP client or Google Cloud project. If your AI client does not support MCP yet, or you are building your own agent, you can call GSC PAP directly over HTTP. MCP's Streamable HTTP transport is JSON-RPC sent in POST requests, so curl or any HTTP library can speak it. This guide shows the raw requests: the initialize handshake, listing tools, and calling a tool. Use it for testing, scripting, or as the starting point for a custom integration. How to call the GSC PAP MCP server over HTTP 1. Sign in to GSC PAP and copy your token. Go to gscpap.com and click "Sign in with Google." Approve the read-only access it asks for. The connect page then shows your bearer token once, so copy it now. If you lose it, create a new one at app.gscpap.com/account/tokens; your other tokens keep working. 2. Send the initialize request. POST a JSON-RPC initialize request with your token in the Authorization header, and send the Accept header exactly as shown. The server replies with HTTP 200 and a text/event-stream body: an event: message line, then a data: line holding the JSON-RPC result with the server's name, protocol version and capabilities. It does not return an Mcp-Session-Id header. 3. List the tools. Call tools/list to get every tool with its description and input schema. The server runs in stateless mode, so this request needs no session ID and nothing from the initialize response. The sed and jq part strips the event-stream framing and prints only the tool names; drop it to see the full response. 4. Call a tool. Use tools/call with the tool's name and an arguments object that matches its input schema. list_sites takes no arguments and returns your verified Search Console properties as JSON text in result.content. Swap in any other tool name from tools/list. Calling the server directly: common issues - Send Accept: application/json, text/event-stream. If you accept only application/json, the server rejects the request with "Not Acceptable: Client must accept both application/json and text/event-stream". - Responses use event-stream framing even for a single result, so read the JSON from the data: line instead of parsing the whole body as JSON. - A missing, wrong or revoked token gets HTTP 401 before the request reaches the MCP layer, with a WWW-Authenticate header that points at the server's OAuth metadata. Check the status code first. - Every authenticated MCP call counts toward the rate limits, tools/list included: 30 per minute and 500 per hour for each token, and 60 per minute and 1,000 per hour for your account across all its tokens. Over a limit, the server returns a JSON-RPC error that says how many seconds to wait. - For Python agents, the official mcp package (pip install mcp) handles the handshake and the event-stream parsing for you. Prefer it over raw curl unless you are writing a one-off shell script. - curl -v prints your Authorization header. Remove that line from any output you share for support. Questions - Do I need an MCP client or SDK to call GSC PAP? No. MCP over Streamable HTTP is JSON-RPC over HTTP, so curl or any HTTP library can call it. For Python agents, the official mcp package (pip install mcp) handles the handshake and tool calls for you. - Do I need to keep a session ID between requests? No. GSC PAP runs in stateless mode and does not return an Mcp-Session-Id header. Each request stands on its own, so send the bearer token in the Authorization header every time. - Why does the response start with event: message? GSC PAP answers in the Streamable HTTP transport's event-stream format, even when there is only one message. The JSON-RPC response is on the line that starts with data:. MCP SDKs parse this for you. - Do I need a Google Cloud project or a Search Console API key? No. Your GSC PAP bearer token is the only credential you send. GSC PAP calls Google's APIs for you, using the read-only Search Console and Analytics access you granted when you signed in with Google. ### Connect opencode to Google Search Console URL: https://gscpap.com/integrations/opencode Client: opencode Updated: 2026-10-19 Add Google Search Console to opencode as a remote MCP server. One config block with your token, no Google Cloud project, no local server to run. opencode is a terminal coding agent that can call Model Context Protocol (MCP) tools. Point it at GSC PAP and it can read your Search Console clicks, impressions, CTR and average position, plus GA4 and PageSpeed, from the same terminal you deploy from. opencode splits MCP servers into local ones, which it starts as a command, and remote ones, which it reaches over a URL. GSC PAP is hosted, so it is a remote server: nothing to install, nothing to keep running, and no Google Cloud project to create. This guide assumes opencode is already installed and working. If not, install it first from opencode.ai. How to connect Google Search Console to opencode 1. Sign in to GSC PAP and copy your token. Go to gscpap.com and click "Sign in with Google." Approve the read-only access it asks for, then pick which sites to grant. The connect page shows your bearer token once, so copy it now. If you lose it, create a new one at app.gscpap.com/account/tokens; existing tokens keep working. 2. Put the token in your shell environment. Keep the token out of the config file itself. opencode can read it from the environment at load time, which also means the same config works on another machine without editing. 3. Add the server to opencode.json. Open your opencode config, opencode.json or opencode.jsonc, and add the block below under the mcp key. Note that the key is mcp, not mcpServers: opencode uses its own shape rather than the one Claude Desktop and Cursor share. If the file already lists servers, add the gsc-pap entry inside the existing mcp object. 4. Check that opencode sees it. List the servers opencode knows about. gsc-pap should appear as a remote server. If a connection looks wrong, the debug command prints what happened during the handshake, which is the fastest way to tell a bad token from a bad URL. 5. Ask a Search Console question. Start opencode in a project and ask: "Using gsc-pap, what are my top queries by clicks over the last 28 days?" The agent calls list_sites first to find your property, then search_analytics_query. From there you can ask for quick wins, decaying pages or a period comparison without leaving the terminal. opencode MCP setup: common issues - The config key is mcp, and the server needs "type": "remote". Under mcpServers, or without the type, opencode will not load it. - Set "oauth": false when you authenticate with a header. Otherwise opencode can try to negotiate OAuth with the server and the bearer token never gets used. - If opencode.json lives in a repo, use the {env:GSC_PAP_TOKEN} form rather than pasting the token. A bearer token in a committed config is a token you have to rotate. - "Missing or invalid bearer token" means the environment variable was empty when opencode started, not that the token is wrong. Check it with echo $GSC_PAP_TOKEN in the same shell you launch opencode from. - Nothing here needs a Google Cloud project. If a guide tells you to download a credentials JSON, it is describing a self-hosted server, not this one. Questions - Does opencode support remote MCP servers? Yes. opencode separates local servers, which it starts as a command, from remote ones, which it reaches over a URL. A remote server is configured with "type": "remote" and a url, and it can carry custom request headers, which is how GSC PAP authenticates. - How do I pass an API token to an MCP server in opencode? Through the headers object on the server entry. opencode supports environment substitution in that value, so "Authorization": "Bearer {env:GSC_PAP_TOKEN}" keeps the token out of the file. Pair it with "oauth": false so opencode does not try an OAuth flow instead. - Can I use Google Search Console in opencode without a Google Cloud project? Yes, that is the point of a hosted server. GSC PAP registered the OAuth client once for everybody, so you sign in with Google, copy a token and paste one config block. Self-hosting is the path that needs your own Cloud project, OAuth client and credentials file. ### Connect Cline to Google Search Console URL: https://gscpap.com/integrations/cline Client: Cline Updated: 2026-10-19 Add Google Search Console to Cline in VS Code or the Cline CLI as a remote MCP server. One token, no Google Cloud project, read-only access. Cline is an autonomous coding agent that runs inside VS Code and JetBrains, and also as a CLI. It speaks Model Context Protocol, so it can call GSC PAP and read your Search Console, GA4 and PageSpeed data while it works on the pages that data is about. That combination is the useful part: the agent that edits a page can first ask which queries it ranks for, then check whether the change moved anything a week later. This guide covers both the editor extension and the CLI. Either way GSC PAP is a remote server reached over a URL, so there is nothing to install and no Google Cloud project to create. How to connect Google Search Console to Cline 1. Sign in to GSC PAP and copy your token. Go to gscpap.com, click "Sign in with Google" and approve the read-only access. Pick the sites you want to expose, then copy the bearer token the connect page shows once. You can mint more later at app.gscpap.com/account/tokens, scoped to a subset of your sites if you want a narrower one for a client project. 2. Open Cline's MCP settings. In VS Code or JetBrains, click the MCP Servers icon in the Cline sidebar, open the Configure tab and choose Configure MCP Servers, which opens the settings file. For the CLI the file lives in your home directory, and the CLINE_MCP_SETTINGS_PATH environment variable overrides the location if you keep it elsewhere. 3. Add the GSC PAP server. Paste the block below and replace YOUR_TOKEN with the token from step 1. The type matters: set it to streamableHttp. If you leave the type out, Cline falls back to the legacy SSE transport and the connection will not come up. 4. Or add it from the command line. The CLI can write the same entry for you, which is handy on a second machine. Keep the token in an environment variable rather than in your shell history if you can. 5. Ask a Search Console question. Open a Cline task and ask: "Use gsc-pap to list my sites, then show the top 10 queries by clicks for the last 28 days." Cline asks for approval before each tool call unless you have listed the tool in autoApprove. Read-only tools such as list_sites and search_analytics_query are reasonable candidates for that list; nothing in GSC PAP can change your property either way. Cline MCP setup: common issues - Set "type": "streamableHttp". Omitting it selects the older SSE transport, and the server will appear in the list but never connect. - The Remote Servers tab in the extension asks for a name, URL and transport but has no field for a header, so a token-authenticated server has to go through the settings file or the CLI. - A 401 with "Missing or invalid bearer token" means the token is wrong or revoked, not that the transport is wrong. Mint a new one at app.gscpap.com/account/tokens. - If the server shows no tools after connecting, restart the Cline extension host; the tool list is fetched once at connect time. - Keep cline_mcp_settings.json out of any repo. It holds a live token. Questions - Does Cline support remote MCP servers? Yes. A remote server is configured with a url instead of command and args, and it accepts a headers object for authentication. Set type to streamableHttp for a modern HTTP server; without it Cline uses the legacy SSE transport. - Where is Cline's MCP config file? For the CLI it is cline_mcp_settings.json under ~/.cline/data/settings/, and CLINE_MCP_SETTINGS_PATH can point somewhere else. In the editor extensions you reach the same file through the MCP Servers icon, then the Configure tab, then Configure MCP Servers. - Is it safe to auto-approve Search Console tools in Cline? GSC PAP only asks Google for read-only scopes, so no tool it exposes can change a property, submit a sitemap or remove a URL. Auto-approving its read tools saves a confirmation per call without giving the agent a way to break something. Approval is still worth keeping for servers that can write. ### Connect Warp to Google Search Console URL: https://gscpap.com/integrations/warp Client: Warp Updated: 2026-10-19 Add Google Search Console to Warp's agent as a remote MCP server. Paste one JSON block with your token, press Start, and ask about your traffic in the terminal. Warp is a terminal with an agent built into it, and that agent can call Model Context Protocol tools. Adding GSC PAP gives it read-only access to your Search Console, Google Analytics 4 and PageSpeed data, in the same window where you build and deploy the site. Warp adds MCP servers through its own UI rather than a config file you edit by hand, so this is mostly clicking, with one JSON block to paste. GSC PAP is hosted, which means you add it as a URL-based server. There is no local process, no Google Cloud project and no credentials file. How to connect Google Search Console to Warp 1. Sign in to GSC PAP and copy your token. Go to gscpap.com and click "Sign in with Google." Approve the read-only access, choose which sites to grant, and copy the bearer token shown on the connect page. It is shown once; you can create more at app.gscpap.com/account/tokens. 2. Open Warp's MCP servers panel. Go to Settings, then Agents, then MCP servers. You can also reach the same list from Warp Drive, under Personal, then MCP Servers. Both open the place where Warp keeps its servers. 3. Add a URL-based server. Click + Add and pick the "Streamable HTTP or SSE Server (URL)" type. Warp asks for JSON rather than separate fields. 4. Paste the server definition. Paste the block below, replacing YOUR_TOKEN with the token from step 1. Warp's shape is a bare object keyed by the server name: there is no mcpServers wrapper here, unlike Claude Desktop or Cursor. 5. Press Start, then ask something. Warp does not start a newly added server by itself, so click Start on the gsc-pap entry. Once it is running, ask the agent: "List my Search Console sites, then show the top queries by clicks for the last 28 days." If you deploy from this terminal, the follow-up worth asking is whether the pages you just shipped are indexed. Warp MCP setup: common issues - A newly added server stays stopped until you click Start. A server that looks added but answers nothing is usually just not started. - Do not wrap the JSON in mcpServers. Warp expects the server name as the top-level key. - Pick the URL server type, not the command type. GSC PAP is hosted, so there is no command for Warp to run. - "Missing or invalid bearer token" means the token is wrong or was revoked. Create a new one at app.gscpap.com/account/tokens and edit the entry. Questions - Does Warp support remote MCP servers? Yes. Warp connects to remote or locally hosted MCP endpoints over Streamable HTTP or SSE, and it can send custom request headers, which is how a bearer token reaches the server. - Where do I add an MCP server in Warp? Settings, then Agents, then MCP servers, or from Warp Drive under Personal, then MCP Servers. Click + Add, choose the Streamable HTTP or SSE Server (URL) type, paste the server JSON, then click Start. - Can Warp's agent change my Search Console property? Not through GSC PAP. It only requests read-only Google scopes, so no tool it exposes can edit a property, submit a sitemap or remove a URL, however the agent is prompted. ### Connect LM Studio to Google Search Console URL: https://gscpap.com/integrations/lm-studio Client: LM Studio Updated: 2026-10-19 Give a local model your Search Console data. Add GSC PAP to LM Studio's mcp.json as a remote server, with one token and no Google Cloud project. LM Studio runs language models on your own machine, and since version 0.3.17 it can also act as an MCP client for both local and remote servers. Adding GSC PAP means a model running on your laptop can read your Search Console, GA4 and PageSpeed data. The appeal is that the model stays local while the data stays yours: GSC PAP reads Google's APIs on your behalf with read-only scopes, and the analysis happens on hardware you own. The honest caveat is in the model, not the connection. Tool calling across a server with this many tools asks a lot of a small local model, so this works much better on a model with solid tool-use support. See the issues below before you judge the setup. How to connect Google Search Console to LM Studio 1. Check your LM Studio version. Remote MCP servers arrived in 0.3.17. On an older build the config file exists but a URL-based server will not connect, so update first if you are behind. 2. Sign in to GSC PAP and copy your token. Go to gscpap.com, click "Sign in with Google" and approve the read-only access. Choose which sites to grant, then copy the bearer token from the connect page. It is shown once, and you can mint more at app.gscpap.com/account/tokens. 3. Open mcp.json. In LM Studio, open the Program tab in the right-hand sidebar, then Install, then Edit mcp.json. The file opens in LM Studio's own editor, so you do not have to hunt for it on disk. 4. Add the GSC PAP server. Paste the entry below and replace YOUR_TOKEN with your token. If mcp.json already has servers in it, copy only the gsc-pap entry into the existing mcpServers object rather than pasting a second wrapper. 5. Load a tool-capable model and ask. Load a model that supports tool use, start a chat, and ask something narrow to begin with: "Call list_sites and show me the result." Narrow beats open-ended here, because naming the tool removes the hardest part of the job for a local model. Once that works, move up to "show my top 10 queries by clicks for the last 28 days". LM Studio MCP setup: common issues - Remote servers need LM Studio 0.3.17 or newer. Older builds only start local MCP servers. - The model has to support tool calling, and small quantized models are often unreliable at choosing between many tools. If the model answers in prose instead of calling a tool, name the tool in your prompt. - A long tool list costs context. On a model with a small context window, ask one question at a time rather than requesting a full report. - "Missing or invalid bearer token" is a token problem, not a model problem. Replace it from app.gscpap.com/account/tokens. - mcp.json holds a live token, so do not copy it into a shared repo or a gist when you ask for help. Questions - Can LM Studio connect to a remote MCP server? Yes, since version 0.3.17 LM Studio supports both local and remote MCP servers. A remote one is configured in mcp.json with a url, and custom headers such as Authorization are supported, which is what a hosted server like GSC PAP needs. - Where is LM Studio's mcp.json? You open it from inside the app: the Program tab in the right-hand sidebar, then Install, then Edit mcp.json. It opens in LM Studio's built-in editor. - Does my Search Console data go to a local model only? The model runs on your machine, so the conversation does. The data itself comes from Google through GSC PAP, which reads your Search Console and Analytics with read-only scopes and does not sell, share or train on it. So the path is Google to GSC PAP to your machine. - Which local model should I use for this? One with real tool-use support and enough context for a tool list. Reliability at choosing the right tool among many is where small models struggle, so if your model hesitates, name the tool in the prompt and keep each question to one thing. ### Connect ChatGPT to Google Search Console URL: https://gscpap.com/integrations/chatgpt Client: ChatGPT Updated: 2026-10-19 Add Google Search Console to ChatGPT as a custom MCP server. What the setup looks like, and the plan requirement that decides whether you can do it at all. ChatGPT can connect to a custom Model Context Protocol server, which is how it reads data from a service OpenAI has not built an app for. GSC PAP is such a server: a hosted bridge to Google Search Console, Google Analytics 4 and PageSpeed, with read-only Google scopes. Start with the part that decides everything else. Custom MCP server connections and full MCP support are a ChatGPT Business and Enterprise/Edu feature, on ChatGPT web. On a personal Free, Plus or Pro account you will not find the setting, and no configuration file will change that. We would rather say so here than have you spend twenty minutes looking for a menu that is not there. If you are on a personal plan, the fastest route to the same data is a different client. Claude.ai takes a connector URL with no admin involved, and Claude Desktop, Claude Code, Cursor, VS Code, opencode, Warp and the rest each take one config block. Every one of them reaches the same server and the same tools. This page was checked against OpenAI's own documentation on 19 October 2026. OpenAI has moved these controls more than once during 2026, so if a menu name below does not match what you see, trust your screen and tell us. How to connect Google Search Console to ChatGPT 1. Check that your workspace can add a custom MCP server. In a Business workspace, only admins and owners can create and publish a connection, and Workspace settings then Members shows who those are. On Enterprise and Edu, admins can grant the permission to selected members through role-based access control. The permission is named "Create plugins with MCPs". If you are not an admin and you do not have that permission, this is a request to send rather than a setting to find. 2. Sign in to GSC PAP. Go to gscpap.com and click "Sign in with Google." Approve the read-only access and choose which of your properties to authorize. For a connector you do not need to copy a token: GSC PAP implements OAuth 2.0 with Dynamic Client Registration, so ChatGPT registers itself and sends you through the consent screen instead. 3. Add the server from Plugins. In the current experience you add a custom MCP server from Plugins directly, and you do not need to switch on Developer Mode first. Select the plus button, then "Add custom MCP server". Enter a name, such as GSC PAP, and optionally a description. Under Connection, paste the endpoint below. Then configure authentication as OAuth, review the risk warning, tick "I understand and want to continue", and select "Create as a plugin". 4. Authorize and let it scan the tools. ChatGPT opens the GSC PAP consent screen. Approve it, and ChatGPT reads the tool list from the server. On the legacy Apps flow the same step is a "Scan Tools" button followed by Create, and the result shows up as a draft under Workspace settings then Apps then Drafts, labelled Dev. Either way, wait for the scan to finish before testing: a connection that looks live with an empty tool list is usually a scan that has not completed. 5. Test it, then publish it for the workspace. Install the plugin, start a new conversation, type @ and pick it. Ask something narrow first, such as "list my Search Console sites", then move on to "show my top queries by clicks for the last 28 days". When it behaves, an admin or owner publishes it from Workspace settings then Apps then Drafts. On Enterprise and Edu, Configure Actions lets you choose which tools the workspace may use and Configure Access limits who sees it. ChatGPT custom MCP servers: what to know first - Custom MCP connections are a Business and Enterprise/Edu feature on ChatGPT web. On Free, Plus or Pro the option is not there, whatever a third-party blog post says. - Only admins and owners can publish a connection to the whole workspace, even when a member was allowed to create and test it. - ChatGPT needs a refresh token to keep a connection alive, and it looks for offline_access in the authorization server's discovery metadata. GSC PAP advertises it and issues refresh tokens. If a different MCP server loses access after a while, that is usually the reason. - A local server started with npx or uvx cannot be used here. The endpoint has to be reachable over public HTTPS, which a hosted server already is. - The risk warnings in this flow are about servers that can take write actions. Nothing GSC PAP exposes can change a property, submit a sitemap or remove a URL, because it only ever asks Google for read-only scopes. - Treat the tool list as something to review. A custom connector is a tool an assistant will use on your company's data, and the review step exists for a reason. Questions - Can I add a custom MCP server to ChatGPT on a Plus or Pro plan? No. As documented by OpenAI in October 2026, custom MCP server connections and full MCP support are available to ChatGPT Business and Enterprise/Edu customers on ChatGPT web. A personal Plus or Pro account cannot create one. The same server works today in Claude.ai, Claude Desktop, Claude Code, Cursor, VS Code, opencode, Warp, LM Studio and any other MCP client. - Do I still need to turn on Developer Mode in ChatGPT? Not in the current Plugins experience. You add a custom MCP server from Plugins and acknowledge a risk warning for each server instead. Older guides describe a Developer Mode toggle under Connectors or Security, which is the flow that preceded this one. - What URL do I give ChatGPT for Google Search Console? https://mcp.gscpap.com/mcp, with OAuth as the authentication method. ChatGPT registers itself through Dynamic Client Registration, sends you to the GSC PAP consent screen, and then scans the tool list. There is no token to paste in this flow. - Can ChatGPT change my Search Console data through this? Not through GSC PAP. The Google scopes it requests are read-only, so there is no tool to submit a sitemap, request indexing or edit a property. That is a property of the server, not of how carefully the connector is configured. ### Connect Goose to Google Search Console URL: https://gscpap.com/integrations/goose Client: Goose Updated: 2026-10-19 Add Google Search Console to Goose as a streamable_http extension. One block in config.yaml with your token, no Google Cloud project, read-only access. Goose is an open-source agent that does work on your machine, and its capabilities come from extensions built on the Model Context Protocol. GSC PAP is a remote MCP server, so in Goose's vocabulary it is a streamable_http extension: a URL plus a header, no process for Goose to start. Added that way, the agent can read your Search Console clicks, impressions, CTR and average position, your GA4 sessions and conversions, and PageSpeed field data, all read-only. This guide edits config.yaml directly, because that is the shape Goose's configuration reference documents. If you prefer the interactive route, goose configure can add extensions too. How to connect Google Search Console to Goose 1. Sign in to GSC PAP and copy your token. Go to gscpap.com, click "Sign in with Google" and approve the read-only access. Choose which sites to authorize, then copy the bearer token the connect page shows once. More tokens, each scoped to a subset of your sites, are available at app.gscpap.com/account/tokens. 2. Open Goose's config file. Goose keeps its settings in YAML. config.yaml holds the provider, the model and the extensions. 3. Add GSC PAP as a streamable_http extension. Add the block below under the existing extensions key, next to developer and the other built-ins, and replace YOUR_TOKEN with your token. Note the field names: the URL goes in uri, not url, and the type must be streamable_http. 4. Optional: load only the tools you need. GSC PAP exposes 36 tools, and every tool description costs context in each session. Goose can filter the list per extension with available_tools: name the ones you want and only those load. Leave it out or empty to load all of them. A reporting setup rarely needs more than a handful. 5. Start a session and ask. Open a Goose session and ask: "Using gsc-pap, list my Search Console sites, then show the top 10 queries by clicks for the last 28 days." The first call is list_sites, because every other tool needs the exact property URL that returns. Goose extension setup: common issues - The key is uri, not url. A remote extension with url is silently incomplete and will not connect. - SSE is not supported. If you are migrating an older extension that used it, change the type to streamable_http. - Keep the token out of a config file you sync or share. Goose has env_keys and envs on the extension for exactly that, and secrets.yaml for file-based secret storage. - "Missing or invalid bearer token" is a token problem. Mint a new one at app.gscpap.com/account/tokens; your other tokens keep working. - Goose runs autonomously by default. That is worth knowing in general, though nothing GSC PAP exposes can change your Search Console property: its Google scopes are read-only. Questions - How do I add a remote MCP server to Goose? As an extension with type streamable_http in ~/.config/goose/config.yaml. The entry takes a uri for the endpoint and a headers map for authentication, plus enabled, name and timeout. Goose supports builtin, platform, stdio and streamable_http extension types; SSE is no longer supported. - Where is Goose's config file? ~/.config/goose/config.yaml on macOS and Linux, and %APPDATA%\Block\goose\config\config.yaml on Windows. Alongside it Goose keeps permission.yaml for tool permissions and secrets.yaml when it stores secrets in files. - Can I limit which tools an extension exposes in Goose? Yes, with available_tools on the extension. List the tool names you want and only those load, which keeps the token cost of a session down. Empty or absent means all tools load. - Do I need a Google Cloud project to use Search Console in Goose? No. GSC PAP is hosted and registered its OAuth client once for everyone, so you sign in with Google and paste one config block. The Cloud project, OAuth client and credentials file belong to the self-hosted route. ### Connect Google Antigravity to Google Search Console URL: https://gscpap.com/integrations/antigravity Client: Google Antigravity Updated: 2026-10-19 Add Search Console to Google Antigravity as a custom MCP server. It handles dynamic client registration, so the setup is a URL and a sign-in, with no token. Google Antigravity is Google's agent-first development environment, and it speaks Model Context Protocol across all three of its surfaces: the App, the IDE and the CLI. Adding GSC PAP gives its agents read-only access to your Search Console, Google Analytics 4 and PageSpeed data. There is a pleasing circularity to this one. Google does not ship a Search Console MCP server, so the fastest way to ask Google's own editor about your Google search traffic is a hosted bridge to Google's own API. Antigravity performs dynamic client registration for OAuth-enabled servers, and GSC PAP implements it. So unlike most editors, this setup needs no token at all: you paste a URL, approve a consent screen, and Antigravity stores and refreshes the tokens itself. The bearer-token route still works if you prefer it, and both are below. How to connect Google Search Console to Antigravity 1. Sign in to GSC PAP once. Go to gscpap.com, click "Sign in with Google" and approve the read-only access. Choose which of your properties to authorize. For the OAuth route in the next step you do not need to copy anything from this page; the authorization happens later, inside Antigravity. 2. Open your MCP server list. In the Antigravity App, click Settings at the bottom left, then Customizations, and find the Installed MCP Servers section. Clicking Add MCP opens the MCP Store, a searchable list of ready-made servers. GSC PAP is not in that store, so add it as a custom server using the configuration in the next step. The IDE and the CLI read the same standardized format. 3. Add GSC PAP with OAuth, no token. Every server lives under a single mcpServers object. A remote server is defined by serverUrl rather than command. With nothing else set, Antigravity discovers that the server supports OAuth, registers itself through dynamic client registration, and opens the GSC PAP consent screen the first time it connects. 4. Or use a bearer token instead. If you would rather authenticate with a header, copy a token from app.gscpap.com/account/tokens and put it in the headers object. This is the right choice for a token scoped to a subset of your sites, for example on a client project. 5. Approve the tools, then ask. By default any MCP tool Antigravity has not been told about runs in Ask mode, so the first call waits for your approval. Since nothing GSC PAP exposes can modify a property, allowing the whole server in your policy configuration is reasonable: mcp(gsc-pap/*) matches all of its tools, and mcp(gsc-pap/list_sites) matches one. Then ask: "List my Search Console sites, then show the top 10 queries by clicks for the last 28 days." Antigravity MCP setup: common issues - The key for a remote server is serverUrl, not url. A server entry needs either command for a local process or serverUrl for a remote one. - GSC PAP is not in the MCP Store, so Add MCP will not find it. Add it as a custom server with the JSON above. - With the OAuth route there is no token in your config at all. Antigravity keeps its access tokens in ~/.gemini/antigravity/mcp_oauth_tokens.json, refreshes them when they expire and removes invalid ones, and the server reconnects on its own after you authenticate. - authProviderType: "google_credentials" is for Google APIs that accept Application Default Credentials. It is not the setting for this server: GSC PAP has its own OAuth, so leave it out. - GSC PAP exposes 36 tools. If that is more than you want in the model's context, disabledTools takes a list of tool names to withhold. - Antigravity's own permissions system decides when a tool needs approval. A tool that silently never runs is usually waiting in Ask mode rather than failing to connect. Questions - Does Google Antigravity support remote MCP servers? Yes, on the App, the IDE and the CLI, with one standardized configuration format. A remote server is declared with serverUrl for Streamable HTTP or SSE, and it can carry custom headers, OAuth client credentials, or Google Application Default Credentials. - Can I connect an MCP server to Antigravity without pasting a token? Yes, if the server supports OAuth with dynamic client registration, which GSC PAP does. Give Antigravity only the serverUrl and it registers itself, sends you through the consent screen, and manages the tokens from then on. Manual client credentials are only needed for servers without dynamic registration, and those use https://antigravity.google/oauth-callback as the redirect URI. - Does Google have an official Search Console MCP server? Not as of October 2026. Google publishes MCP servers for several of its products, and Antigravity's MCP Store carries many of them, but Search Console is not among them. A hosted bridge such as GSC PAP covers it with read-only scopes, and the setup is one JSON entry. - How do I stop Antigravity asking before every Search Console call? Allow the server in your permissions policy. mcp(gsc-pap/*) matches every tool on the server, and a narrower mcp(gsc-pap/list_sites) matches one. Unconfigured MCP tools default to Ask mode, which is a sensible default for servers that can write, and unnecessary friction for a read-only one. ### Connect Roo Code to Google Search Console URL: https://gscpap.com/integrations/roo-code Client: Roo Code Updated: 2026-10-19 Add Google Search Console to Roo Code in VS Code as a streamable-http MCP server. One block with your token, no Google Cloud project, read-only. Roo Code is an autonomous coding agent in VS Code, and it reads Model Context Protocol servers from its own settings file. Add GSC PAP and the agent can pull your Search Console, Google Analytics 4 and PageSpeed numbers while it works on the pages those numbers describe. GSC PAP is hosted, so in Roo's terms it is a streamable-http server: a URL and a header, with no process for Roo to start and no Google Cloud project for you to create. If you have set this up in Cline before, read the transport name carefully. The two projects share a lineage and spell it differently, which is the single most common reason a working config stops working after a switch. How to connect Google Search Console to Roo Code 1. Sign in to GSC PAP and copy your token. Go to gscpap.com and click "Sign in with Google." Approve the read-only access, pick the sites you want to expose, and copy the bearer token the connect page shows once. More, each scoped to a subset of your sites, are at app.gscpap.com/account/tokens. 2. Open Roo's MCP settings file. Click the MCP icon in the top navigation of the Roo Code pane, scroll to the bottom of the MCP settings view, and click Edit Global MCP for mcp_settings.json or Edit Project MCP for .roo/mcp.json in the project root. Roo creates the project file if it does not exist. If both files define a server with the same name, the project one wins. 3. Add the GSC PAP server. Paste the block below and replace YOUR_TOKEN. The type is required and it is spelled streamable-http, with a hyphen. 4. Optional: auto-approve the read tools. alwaysAllow takes a list of tool names Roo may call without asking each time. Nothing GSC PAP exposes can change a property, so auto-approving its tools removes a confirmation per call without giving the agent a way to break something. 5. Ask a Search Console question. Open a Roo task and ask: "Use gsc-pap to list my sites, then show the top 10 queries by clicks over the last 28 days." The first call is always list_sites, because the other tools need the exact property URL it returns. Roo Code MCP setup: common issues - The transport is "streamable-http" with a hyphen. Cline spells the same thing "streamableHttp", so a config copied between the two will not connect until you change it. - A project .roo/mcp.json overrides a global entry with the same server name. If an edit to the global file seems to do nothing, look for a project file shadowing it. - Put the token in the global mcp_settings.json rather than .roo/mcp.json if the project is a git repo, or you will be rotating a committed token. - "Missing or invalid bearer token" means the token is wrong or revoked, not that the transport is wrong. Replace it at app.gscpap.com/account/tokens. - timeout and disabledTools also work on this transport, which is useful when you want only part of a 34-tool server in context. Questions - Does Roo Code support remote MCP servers? Yes. Streamable HTTP is the transport Roo recommends for new remote servers: set type to "streamable-http" and give a url, with an optional headers object for authentication. SSE is still accepted for older servers. - Where is Roo Code's MCP config file? Globally in mcp_settings.json, which you open from the MCP settings view with Edit Global MCP, and per project in .roo/mcp.json in the project root. The project file takes precedence for servers defined in both. - How do I stop Roo Code asking before each Search Console call? List the tool names in alwaysAllow on the server entry. Because GSC PAP only holds read-only Google scopes, there is no destructive call to guard against, so auto-approving its tools is a reasonable trade for fewer prompts. ### Connect Kilo Code to Google Search Console URL: https://gscpap.com/integrations/kilo-code Client: Kilo Code Updated: 2026-10-19 Add Google Search Console to Kilo Code as a remote MCP server. It can negotiate OAuth for you, or take a bearer token. No Google Cloud project either way. Kilo Code is an open-source coding agent for VS Code that reads Model Context Protocol servers from its own JSONC config. GSC PAP is hosted, so it goes in as a remote server: a URL, and either a token header or an OAuth handshake. Added that way, the agent can read your Search Console clicks, impressions, CTR and average position, your GA4 sessions and conversions, and PageSpeed field data, all with read-only Google scopes. Kilo tries Streamable HTTP first and falls back to SSE on its own, so you do not pick a transport. You pick where the config lives and how it authenticates. How to connect Google Search Console to Kilo Code 1. Sign in to GSC PAP. Go to gscpap.com, click "Sign in with Google" and approve the read-only access, then choose which properties to authorize. If you plan to use the OAuth route in step 4 you do not need to copy a token at all. 2. Open the Kilo config file. The global config is ~/.config/kilo/kilo.jsonc, which covers every project. A project can override it with ./kilo.jsonc, or ./.kilo/kilo.jsonc if the root is already taken. Project configuration takes precedence over global. The UI route is the Settings icon in the sidebar toolbar, then the Agent Behaviour tab, then MCP Servers. 3. Add GSC PAP with a token. Note the top-level key: it is mcp, not mcpServers. Paste the block and replace YOUR_TOKEN with a token from app.gscpap.com/account/tokens. 4. Or let it do the OAuth handshake. Kilo starts an OAuth 2.0 flow automatically when the server supports it, and GSC PAP does, including dynamic client registration. Drop the headers block and Kilo will send you through the consent screen instead, which leaves no token in your config at all. 5. Ask a Search Console question. In the VS Code extension you can also add a server from Settings, then MCP, then Add Server, then Remote (HTTP), filling in the URL and headers. Either way, start with "list my Search Console sites", then move to "show the queries where I rank between 5 and 20 with a CTR under 2%". Kilo Code MCP setup: common issues - The config key is mcp. The SSE example in Kilo's own docs uses mcpServers, which is the older shape; a remote server under mcpServers will be ignored. - If you authenticate with a header and Kilo still tries an OAuth flow, set "oauth": false on the server entry so it uses the token you gave it. - Project config overrides global. An edit that appears to do nothing usually means a project kilo.jsonc is shadowing it. - The files are JSONC, so comments are allowed. Trailing commas are still a parse error. - "Missing or invalid bearer token" is a token problem, not a transport problem. Mint a new one at app.gscpap.com/account/tokens. Questions - Does Kilo Code support remote MCP servers? Yes, with "type": "remote" and a url. Kilo attempts Streamable HTTP first and falls back to SSE automatically, and it supports custom headers as well as OAuth 2.0, which it starts on its own when the server advertises it. - Where is Kilo Code's MCP config? Globally in ~/.config/kilo/kilo.jsonc, and per project in ./kilo.jsonc or ./.kilo/kilo.jsonc. Project config wins. In the UI it is the Settings icon in the sidebar toolbar, then Agent Behaviour, then MCP Servers. - Can I connect without putting a token in the config? Yes. Leave the headers out and Kilo negotiates OAuth with the server, which GSC PAP supports along with dynamic client registration, so nothing sensitive ends up in a file you might commit. ### Connect Amp to Google Search Console URL: https://gscpap.com/integrations/amp Client: Amp Updated: 2026-10-19 Add Google Search Console to Amp as a remote MCP server, in settings or with one CLI command. No Google Cloud project, read-only scopes. Amp is Sourcegraph's coding agent, available in the editor and as a CLI, and it reads Model Context Protocol servers from its settings. Point it at GSC PAP and it can read your Search Console, Google Analytics 4 and PageSpeed data while it works in the repository those pages come from. GSC PAP is hosted, so the entry is a URL and a header. There is no local process and no Google Cloud project. Amp has three ways in: the settings file, one CLI command, or a remote definition stored on ampcode.com that keeps the token in a file rather than in settings. All three are below. How to connect Google Search Console to Amp 1. Sign in to GSC PAP and copy your token. Go to gscpap.com, click "Sign in with Google" and approve the read-only access. Choose which sites to authorize and copy the bearer token the connect page shows once. Further tokens, each limited to a subset of your sites, are at app.gscpap.com/account/tokens. 2. Put the token in your environment. Amp expands ${VAR_NAME} inside header values, so the token does not have to live in a settings file you might sync or commit. 3. Add the server to Amp's settings. User settings live in ~/.config/amp/settings.json and workspace settings in .amp/settings.json. The key is amp.mcpServers, written with the dotted prefix inside the JSON object. 4. Or add it from the CLI. The CLI writes the entry for you. It has no flag for a header, so add the headers block to settings afterwards, or use the remote form in the gotchas below, which keeps the bearer token in a file of its own. 5. Approve it if it came from the workspace, then ask. A server defined in .amp/settings.json needs approval before it runs: amp mcp approve gsc-pap. Then ask Amp "list my Search Console sites, then show the top 10 queries by clicks for the last 28 days". The first call is list_sites, since every other tool needs the exact property URL. Amp MCP setup: common issues - The settings key is amp.mcpServers, with the prefix as part of the key name. A bare mcpServers object will not be read. - Workspace servers are not trusted automatically. Until amp mcp approve runs, the server is configured and inert. - The CLI cannot attach a header. For a token-authenticated server, either edit settings after amp mcp add, or use the remote definition form: amp mcp remote add GscPap https://mcp.gscpap.com/mcp --auth bearer --bearer-token-file /path/to/token --personal - A url entry is treated as local configuration even when the server is on another machine, which is only a naming quirk, not a limitation. - "Missing or invalid bearer token" usually means the environment variable was empty when Amp started. Check it in the shell you launch Amp from. Questions - Does Amp support remote MCP servers? Yes. A server entry with a url is a remote server, and a headers object carries authentication such as a bearer token. ${VAR_NAME} in a header value expands from the environment. - Where does Amp keep its MCP configuration? Under the amp.mcpServers key, in ~/.config/amp/settings.json for your user or .amp/settings.json for a workspace. Workspace entries require amp mcp approve before they run. - Can I add a Search Console MCP server to Amp from the command line? Yes: amp mcp add gsc-pap https://mcp.gscpap.com/mcp. The command does not take a header, so add the Authorization header to settings afterwards, or use amp mcp remote add with --auth bearer and --bearer-token-file to keep the token in a separate file. ### Connect Kiro to Google Search Console URL: https://gscpap.com/integrations/kiro Client: Kiro Updated: 2026-10-19 Add Google Search Console to Kiro as a remote MCP server. One entry in mcp.json, the token read from an approved environment variable, read-only access. Kiro is AWS's agentic IDE, and it loads Model Context Protocol servers from an mcp.json it keeps per workspace and per user. GSC PAP is hosted, so it goes in as a remote server: an HTTPS URL plus an Authorization header. Once connected, Kiro's agent can read your Search Console clicks, impressions, CTR and average position, your GA4 numbers and PageSpeed field data, with read-only Google scopes and no Google Cloud project of your own. Kiro has one habit worth knowing before you start: it only expands environment variables in a config after you have explicitly approved them. That is the step people miss. How to connect Google Search Console to Kiro 1. Sign in to GSC PAP and copy your token. Go to gscpap.com, click "Sign in with Google" and approve the read-only access. Pick the properties you want to expose, then copy the bearer token shown once on the connect page. You can create more, scoped to fewer sites, at app.gscpap.com/account/tokens. 2. Put the token in your environment. Keeping it out of mcp.json matters here, because the workspace file is the one that tends to end up in a repository. 3. Open the right mcp.json. A workspace config lives at .kiro/settings/mcp.json and a user-level one at ~/.kiro/settings/mcp.json. If both exist Kiro merges them, and the workspace file takes precedence. For a token that should follow you across projects, use the user-level file. 4. Add the GSC PAP server. Paste the entry below. Saving the file reconnects the server, so there is nothing to restart. 5. Approve the variable, then ask. If Kiro warns about the variable instead of expanding it, add GSC_PAP_TOKEN to the "Mcp Approved Env Vars" setting. Then ask: "List my Search Console sites, then show me the queries ranking between 5 and 20 with a CTR under 2%." Kiro MCP setup: common issues - Kiro expands only environment variables you have approved. An unexpanded ${GSC_PAP_TOKEN} reaching the server looks exactly like a bad token, so check "Mcp Approved Env Vars" first. - The url has to be HTTPS. Plain HTTP is only allowed for localhost, which does not apply to a hosted server. - Workspace settings win over user settings when both define gsc-pap. If a change to the user file does nothing, look for .kiro/settings/mcp.json in the project. - Saving mcp.json reconnects the server by itself. If a tool list looks stale, save the file again rather than restarting the IDE. - Keep the token in the environment, not in a workspace mcp.json that a repository will carry. Questions - Does Kiro support remote MCP servers? Yes. A server entry with an HTTPS url is a remote server, and the headers object is passed to the server during connection, which is how a bearer token gets there. Plain HTTP is accepted only for localhost. - Where is Kiro's MCP config file? .kiro/settings/mcp.json for a workspace and ~/.kiro/settings/mcp.json for your user. When both exist they are merged, with the workspace file taking precedence. - Why is my environment variable not working in Kiro's mcp.json? Kiro expands only approved variables. Add the variable's name to the "Mcp Approved Env Vars" setting, then save mcp.json again. Until then the literal ${VAR} is sent, which the server rejects as an invalid token. ### Connect Raycast to Google Search Console URL: https://gscpap.com/integrations/raycast Client: Raycast Updated: 2026-10-19 Add Google Search Console to Raycast AI as an HTTP MCP server. Dynamic OAuth means no token to paste, and HTTP servers work on Raycast for iOS too. Raycast is a launcher with an AI that can call Model Context Protocol tools, which makes it the shortest path between a keystroke and an answer about your traffic. No editor, no terminal: hit the hotkey and ask what your top queries were this week. Two things make this one worth setting up. Raycast supports OAuth Dynamic Client Registration, and GSC PAP implements it, so there is no token to copy or store. And HTTP is the only MCP transport on Raycast for iOS, which means a hosted server is the kind that works on your phone. Everything here is in Raycast's own UI. There is no config file to edit. How to connect Google Search Console to Raycast 1. Sign in to GSC PAP once. Go to gscpap.com, click "Sign in with Google" and approve the read-only access, then choose which properties to authorize. Nothing needs copying: the authorization for Raycast happens inside Raycast in step 4. 2. Open the install flow. Search for the Install MCP Server command, or open Manage MCP Servers and choose Install New Server. The MCP Servers tab in Settings lists suggested servers only, so a custom one goes through the install command. 3. Fill in the server. Give it a name such as GSC PAP and an icon. Set the transport to HTTP, not Standard Input/Output, since there is no local process. Put the endpoint in the URL field. For OAuth Type choose Dynamic, which lets Raycast register itself as a client. Then press Install MCP Server. 4. Sign in to finish. An HTTP server with OAuth shows a Sign In prompt after installing, and no tools are available until you use it. Signing in sends you through the GSC PAP consent screen. Once it completes, the tools appear. 5. Ask from the launcher. Open Raycast AI and ask: "List my Search Console sites, then show the top queries by clicks for the last 28 days." This is where Raycast earns its place next to an editor: a weekly check becomes a hotkey rather than a tab. Raycast MCP setup: common issues - Pick HTTP as the transport. Standard Input/Output is for local processes and cannot reach a hosted server. - Dynamic is the right OAuth Type here. Static is for servers that need you to bring your own Client ID, Secret, Scopes and callback registration, which GSC PAP does not. - No tools appear until you complete the Sign In prompt. An empty tool list right after install usually means that step is still waiting. - If you would rather use a bearer token than OAuth, the HTTP Headers fields take key and value pairs that are sent with every request, so Authorization and Bearer YOUR_TOKEN work there. - On iOS, HTTP is the only transport available, so a hosted server is the only kind that works. This is a point in favour of a remote server rather than a local one. Questions - Can Raycast connect to a remote MCP server? Yes. Choose the HTTP transport when installing a server, enter the MCP endpoint in the URL field, and optionally add HTTP headers that are sent with every request. OAuth is supported in both Dynamic and Static forms. - Do I need a token to add an MCP server to Raycast? Not for a server that supports OAuth Dynamic Client Registration, which GSC PAP does. Choose Dynamic as the OAuth Type and Raycast registers itself, then prompts you to sign in. The header fields are there if you prefer a bearer token. - Does this work in Raycast for iOS? Yes, and it is the transport that does: HTTP is the only MCP transport on iOS. A hosted Search Console server therefore works on the phone, where a local stdio server cannot. ### Connect GitHub Copilot CLI to Google Search Console URL: https://gscpap.com/integrations/copilot-cli Client: GitHub Copilot CLI Updated: 2026-10-19 Add Google Search Console to GitHub Copilot CLI with one command or one JSON entry. Remote HTTP transport, your token in a header, read-only access. GitHub Copilot CLI is Copilot as a terminal agent, and it reads Model Context Protocol servers from its own config rather than from VS Code's. If you already connected GSC PAP to Copilot in the editor, this is a separate setup with a different file. GSC PAP is hosted, so it goes in as an HTTP server: a URL and an Authorization header. No Google Cloud project, no local process, and read-only Google scopes throughout. There are two routes, one command or one JSON entry, and both land in the same place. How to connect Google Search Console to Copilot CLI 1. Sign in to GSC PAP and copy your token. Go to gscpap.com, click "Sign in with Google" and approve the read-only access. Choose which properties to authorize, then copy the bearer token the connect page shows once. Additional tokens, each scoped to a subset of your sites, are at app.gscpap.com/account/tokens. 2. Add it with one command. The default transport is stdio, so --transport http is required for a remote server. --header can be repeated if a server needs more than one. 3. Or write the entry yourself. User-level servers live in ~/.copilot/mcp-config.json. A project can define its own in .mcp.json or .github/mcp.json. Set type to http, which is the Streamable HTTP transport; sse is the legacy one and is deprecated. 4. Decide which tools to expose. tools accepts * for everything, or a comma-separated list of names. GSC PAP has 36 tools, and a terminal session rarely needs all of them, so naming five keeps the model's context lean. 5. Ask a Search Console question. Start Copilot CLI and ask: "List my Search Console sites, then show the top 10 queries by clicks for the last 28 days." If you deploy from this terminal, the natural follow-up is whether the URLs you shipped are indexed, which batch_inspect_urls answers for up to 2,000 at a time. Copilot CLI MCP setup: common issues - --transport http is not optional. The default is stdio, and a remote server added without it will not connect. - This is a different config from Copilot in VS Code. Connecting one does not connect the other. - When a project file and the user file both define gsc-pap, the higher-priority source wins. For a one-off session, --additional-mcp-config adds servers without touching either. - Keep the token out of .mcp.json and .github/mcp.json if the repository is shared. The user-level ~/.copilot/mcp-config.json is the safer home for it. - "Missing or invalid bearer token" means the token is wrong or was revoked, not that the transport is wrong. Mint a new one at app.gscpap.com/account/tokens. Questions - Does GitHub Copilot CLI support remote MCP servers? Yes, with "type": "http" for the Streamable HTTP transport and a url. Custom headers are supported as key-value pairs, which is how a bearer token is sent. The legacy sse transport still works but is deprecated. - Where is Copilot CLI's MCP config file? ~/.copilot/mcp-config.json for your user. A project can also define servers in .mcp.json or .github/mcp.json, and --additional-mcp-config adds servers for a single session. - What does the tools key do? It selects which of the server's tools Copilot may call. * includes all of them, and a list of names includes only those. With a 34-tool server, naming the handful you actually use keeps the tool list small. - Is this the same as Copilot in VS Code? No. Copilot CLI keeps its own MCP configuration, so the two are set up separately even though they are the same Copilot. The VS Code setup is on its own page. ### Connect n8n to Google Search Console URL: https://gscpap.com/integrations/n8n Client: n8n Updated: 2026-10-19 Give an n8n AI Agent your Search Console data through the MCP Client Tool node, and schedule the SEO report you keep meaning to write. n8n is a workflow automation tool, and its AI Agent can call Model Context Protocol tools through the MCP Client Tool node. Attach GSC PAP and the agent gets read-only access to your Search Console, Google Analytics 4 and PageSpeed data inside a workflow. This is the one client on our list that runs without you. Everywhere else you ask a question and read the answer. Here a Schedule Trigger can run the same question every Monday at 08:00, hand the result to the agent, and post the summary to Slack or email it to a client. The weekly SEO report stops depending on you remembering. One warning before the steps, because it will save you twenty minutes. n8n's MCP Client Tool node started life SSE-only, and HTTP Streamable arrived later and then became the default. GSC PAP speaks HTTP Streamable and does not expose an SSE endpoint at all. So if your n8n only offers you an SSE Endpoint field, your instance is too old for this and the version gotchas below are the ones to read first. How to connect Google Search Console to n8n 1. Sign in to GSC PAP and copy your token. Go to gscpap.com, click "Sign in with Google" and approve the read-only access. Choose which properties to authorize, then copy the bearer token the connect page shows once. For a workflow that reports on one client, mint a token scoped to just that site at app.gscpap.com/account/tokens. 2. Create a Bearer Auth credential. In n8n, create a new credential of the Bearer Auth type and paste the token into it. Use the credential rather than typing the token into the node: credentials are stored encrypted and are not exported with the workflow JSON, which matters the first time you share a workflow with somebody. 3. Add an AI Agent, then the MCP Client Tool. Build the workflow as usual: a trigger, then an AI Agent node with a chat model attached. Then add the MCP Client Tool node and connect it to the agent's tool input. The MCP Client Tool is a sub-node, so it does not sit in the main flow; it hangs off the agent. 4. Point it at GSC PAP. Set the transport to HTTP Streamable and the endpoint to the URL below. For authentication choose Bearer and select the credential from step 2. The node also offers Header, Multiple Headers and OAuth2; Bearer is the right one here, because our OAuth uses dynamic client registration rather than a client id and secret you could paste into a credential. 5. Choose which tools the agent gets. Tools to Include defaults to All, which hands the agent all 36 tools. For a report workflow that is more than it needs and it costs tokens on every run, so switch to Selected and name the handful the prompt actually uses. All Except is there too, if it is easier to exclude a few. 6. Write the prompt once, then schedule it. Give the agent a specific instruction rather than a vague one, because a scheduled run has nobody to ask a follow-up question. Then swap the manual trigger for a Schedule Trigger and send the output wherever it belongs. n8n MCP Client Tool: common issues - If the node shows only an SSE Endpoint field, it is the older SSE-only shape and it cannot reach GSC PAP, which has no SSE endpoint. Update n8n. HTTP Streamable landed in the MCP Client Tool node later than SSE and then became its default, with SSE marked deprecated. - There have been reports of the transport dropdown being ignored at runtime, with the workaround of setting the transport as an expression, =httpStreamable. If the node insists on SSE despite the dropdown, try that before concluding the server is at fault. - Keep the /mcp path on the URL. https://mcp.gscpap.com without it is not an MCP endpoint. - A GET to our endpoint answers 405 by design, because the server does not offer a server-to-client stream over GET. That is the documented behaviour for a streamable server that does not support it, and a correct client carries on with POST. - n8n also has a standalone MCP Client step node, separate from the MCP Client Tool sub-node. On instances where the Tool variant was stuck on SSE, the step node already had HTTP Streamable, so it is a workable fallback. - GSC PAP is not in n8n's MCP server registry, so the one-click registry shortcut will not list it. Add it as above with a credential. - Scheduled workflows fail silently if nobody watches them. Our rate limits are 60 calls a minute and 1,000 an hour per user, which a weekly report will never reach, but a workflow retrying in a loop can. Questions - Can n8n connect to a remote MCP server? Yes, through the MCP Client Tool node attached to an AI Agent. It supports HTTP Streamable, which is now its default transport, and authentication by Bearer, Header, Multiple Headers or OAuth2. Older versions offered only SSE. - How do I automate a weekly SEO report in n8n? Attach the MCP Client Tool node to an AI Agent, point it at a Search Console MCP server, write one prompt that names the tools and the date windows, then replace the manual trigger with a Schedule Trigger. The agent calls the tools on each run and returns the report, which you can send to Slack, email or a database node. - Which authentication should I use for n8n with GSC PAP? Bearer, with the token in a Bearer Auth credential. The OAuth2 option expects a client id and secret you can paste, and GSC PAP issues clients dynamically instead, so a token is both simpler and the better fit for an unattended workflow. - Should the agent get all 36 tools? Not in a scheduled workflow. Every tool description is sent to the model on every run, so Tools to Include set to Selected with the five or six the prompt uses keeps each run cheaper and the agent's choices more predictable. ### Connect LibreChat to Google Search Console URL: https://gscpap.com/integrations/librechat Client: LibreChat Updated: 2026-10-19 Add GSC PAP to librechat.yaml as a streamable-http MCP server, and give every user on your install their own Search Console access rather than a shared one. LibreChat is a self-hosted chat interface that puts many models behind one UI, and it speaks Model Context Protocol natively through an mcpServers block in librechat.yaml. Point it at GSC PAP and the agent gets read-only access to Search Console, Google Analytics 4 and PageSpeed Insights. The thing that makes LibreChat different from every other client on this list is that it is usually not yours alone. A desktop client's config file belongs to one person, so one token is the whole story. A LibreChat install serves a team, and Search Console access is per person: the writer should see the blog's properties and nobody else's. LibreChat can ask each user for their own token and keep it to them, so one server entry gives ten people ten separate views. That is the configuration below, and it is the one worth starting from. One decision before the steps, because getting it wrong looks like a broken server. LibreChat guesses the transport from the URL when you do not say, and an https URL makes it guess SSE. GSC PAP speaks streamable HTTP and has no SSE endpoint at all, so the type has to be written out. How to connect Google Search Console to LibreChat 1. Sign in to GSC PAP and copy your token. Go to gscpap.com, click "Sign in with Google" and approve the read-only access. Choose which properties to authorize, then copy the bearer token the connect page shows once. Every person who will use the server does this for their own Google account, which is what keeps one install from mixing two people's properties. 2. Add the server to librechat.yaml. Open your librechat.yaml and add an entry under mcpServers. Write the type out rather than letting LibreChat infer it. The key you choose becomes part of every tool name, so keep it short and do not rename it later: renaming changes each tool key and breaks agents that were saved against the old ones. 3. Decide whose Search Console it reads. The block above uses one token from your environment, which means everybody on the install reads the same person's properties. For a shared install you want the other shape: customUserVars asks each user for their own token through the UI and substitutes it into the header. Note the braces, because this is the easiest thing to get wrong here. ${VAR} with one brace and a dollar is an environment variable read on the server; {{VAR}} with two braces is the per-user value. 4. Give the slow tools room. LibreChat's default request timeout is 30 seconds, and a few of these tools legitimately take longer because they are waiting on Google rather than on us. On our own traffic pagespeed_insights averages about 16 seconds and a bulk URL inspection costs roughly as long as the slowest page in the batch, which can be 50. Left at the default, the quick tools work and the slow ones fail, which reads like an unreliable server rather than a timeout. 120000 is comfortable. 5. Restart LibreChat and check the connection. LibreChat reads librechat.yaml at startup, so the new server will not appear until you restart. Then open the tool picker: with the shared-token shape the server connects at startup and the tools are there. With customUserVars it will show as not connected until you fill the token in, because a per-user server has no app-level connection to make, and that is expected rather than a failure. 6. Ask the first question. Attach the server to an agent or pick it in the chat tool menu, then ask something that names a property. The agent will call list_sites first if it does not know your properties yet. LibreChat MCP: common issues - Leave out type and LibreChat infers it from the URL, and an https URL means sse. GSC PAP has no SSE endpoint, so the connection fails for a reason the error will not name. Always write type: streamable-http. - ${GSCPAP_TOKEN} and {{GSCPAP_TOKEN}} are different things. One brace with a dollar is an environment variable resolved on the server; two braces is a per-user value from customUserVars. Use the wrong one and LibreChat sends the literal text as your token, which comes back 401. - requiresOAuth is auto-detected at startup, and our endpoint does advertise OAuth. With a static Authorization header set requiresOAuth: false, or LibreChat may start an OAuth flow instead of using the header you configured. - The default timeout is 30000 ms and initTimeout is 10000. Both are low for this server: the first is shorter than some Google calls take, and the second is tight for a cold start. - LibreChat's reference documents an oauth block whose required keys include client_id and client_secret, while the same page says Dynamic Client Registration is used when no client id and secret are given. We have not taken that path to a verified state, so the configurations here use a token. GSC PAP does implement DCR, which is how the Claude.ai connector works. - serverInstructions: true asks the server for usage guidance to inject into the agent's context. GSC PAP does not send instructions in the handshake today, so the option adds nothing. Leave it out rather than wondering why it changed nothing. - Keep the /mcp path on the URL. https://mcp.gscpap.com without it is not an MCP endpoint, and a GET to the endpoint answers 405 by design, which is correct behaviour rather than a fault. - Rate limits are per user, 60 tool calls a minute and 1,000 an hour. On a shared install with one shared token, everybody draws on the same allowance; with per-user tokens each person gets their own. Questions - Does LibreChat support remote MCP servers? Yes. An entry under mcpServers in librechat.yaml with type: streamable-http and a url connects to a remote server, and headers can carry a bearer token. LibreChat also supports sse, stdio and websocket, and infers the type from the URL when you do not set it. - How do I give each LibreChat user their own Search Console access? Define a customUserVars variable and reference it in the Authorization header with double braces. Each user is prompted for their own token in the UI, so one server entry serves a whole team without anybody seeing anybody else's properties. A server configured this way has no app-level connection, so it shows as not connected until a user supplies the value. - Why do some MCP tools time out in LibreChat but not others? LibreChat's default request timeout is 30 seconds. Tools that wait on a Google API, such as a PageSpeed run or a bulk URL inspection, can exceed that while the quick Search Console queries return in under a second. Raising timeout to 120000 fixes the pattern where only the heavy tools fail. - Do I need to set up OAuth, or is a token enough? A token is enough and it is what we document. Paste it into the Authorization header for a single-user install, or collect it per user with customUserVars for a shared one. GSC PAP supports OAuth with dynamic client registration, which is how the Claude.ai connector avoids tokens entirely, but LibreChat's own reference is ambiguous about whether its oauth block needs a client id and secret, so the token path is the one to trust here. ## SEO workflow guides ### How to find striking distance keywords in Google Search Console URL: https://gscpap.com/guides/find-seo-quick-wins Updated: 2026-09-18 Striking distance keywords rank just off page one of Google. Find them in Search Console, pick the ones worth fixing, and learn what to change on the page. Striking distance keywords are search queries your site already ranks for, just below the top of Google, usually on page two. Google has indexed the page, considers it relevant, and shows it to searchers; it just sits a few positions too low to get many clicks. That makes these queries the fastest SEO quick wins most sites have: you improve a page Google already ranks instead of starting a new one. This guide covers how to find striking distance keywords in Google Search Console by hand, how to decide which ones deserve work, and what to change on the page. Then it runs the same audit in one prompt with Claude and GSC PAP. What are striking distance keywords? A striking distance keyword is a query where your page ranks close to the first page of results but not high enough to earn much traffic. It is close enough that a focused edit can plausibly move it up, and far enough down that it gets few clicks today. There is no official definition. Search Console has no striking distance report, and SEO guides draw the line in different places: 11 to 20, 11 to 30, 8 to 20, 6 to 25, 5 to 20. A narrow band like 11 to 20 means strictly page two. Wider bands also take in the bottom of page one, where a result is visible but sits under several that get most of the clicks. Choose the band that gives you a list you can work through, and keep it the same from month to month so the numbers compare. The position in Search Console is an average across every search where your page appeared, which is why you see values like 12.4. Treat it as a band, not a fixed slot: a query averaging 12 may show higher on some searches and lower on others. Why are striking distance keywords the fastest SEO wins? Most of the hard work is already done. For a query to show up in your Performance report at all, Google had to index the page, judge it relevant, and show it to real searchers. What is left is the gap between being shown and being clicked. Clicks are concentrated at the top of the results, and page two gets very few of them. So the impressions you already have can turn into far more clicks once a page crosses onto page one. A new page has to earn indexing, relevance and position from scratch. A striking distance page only has to close a few positions. You also know the demand in advance. The impressions column is not a keyword tool's volume estimate; it counts how many times Google actually showed your page for that exact query. How do you find striking distance keywords in Google Search Console? You can pull the list by hand from the Performance report in a few minutes: - Open Search Console, pick your property, and go to Performance, then Search results. - Set the date range to the last 3 months. A longer window evens out week-to-week swings in position. - Click Average CTR and Average position above the chart to turn them on. Only clicks and impressions are on by default. - Stay on the Queries tab. Click the filter icon above the table, choose Position, and set Greater than to the bottom of your band (10 for a strict page-two list). - Sort the table by Impressions, highest first, and skip rows whose position is past the top of your band. What is left is your striking distance list, ordered by demand. - Click a query, then open the Pages tab to see which URL ranks for it. You need that URL to make the fix. - Watch the row limit. The Search Console interface shows and exports at most 1,000 rows, so a large site can run out. The Search Console API returns up to 25,000 rows per request. ![Search Console Performance report on the Queries tab, filtered to Position greater than 10 and sorted by impressions](https://gscpap.com/images/guides/find-seo-quick-wins.webp) The Performance report with a Position filter (1) and the table sorted by impressions (2). Recreated with example data for a made-up site. How do you prioritize striking distance keywords? A filtered list can run to hundreds of queries. Rank them before you edit anything: - Impressions first. A query with 2,000 impressions at position 12 has far more upside than one with 40 impressions at position 11. - Distance second. Position 11 needs a smaller move than position 19. - Intent fit. Drop queries your page matches by accident, where the searcher would not want what the page offers even at position one. - Business value. Favor queries that land on pages you care about, such as product, pricing and sign-up pages, over a stray old post. - Group by page. Several queries often point at the same URL, and one edit can lift all of them. Start with the pages that collect the most striking distance impressions. - One page per query. If two of your URLs share the impressions for a query, sort that out first. Our keyword cannibalization guide covers how. What should you change to move a striking distance keyword onto page one? Start with the smallest edit that closes the gap between the query and the page, and change one page at a time so you can tell what worked: - Say the query plainly. If the page ranks for a phrase that never appears in its title or headings, work that wording into the title tag, the H1 or a subheading where it reads naturally. - Answer early. Put a direct answer in the first sentences of the section that covers the query, then add the detail. - Fill the gaps. Look at the pages ranking above you and add the subtopics, examples or specifics they cover and you do not. - Fix the snippet when the page is already on page one but its CTR is low. Rewrite the title and meta description so they match what the searcher typed. - Link to it. Add internal links from related pages on your site, with anchor text close to the query. - Update what is stale: outdated facts, screenshots, prices or years in the copy. Example prompt: Use the gsc-pap MCP server. For my site https://example.com, find striking distance keywords from the last 90 days: queries at positions 11 to 20 with at least 200 impressions and a CTR under 5%. For the top 10 by impressions, show which page ranks for each query and suggest the smallest edit that could move it onto page one. - Claude calls find_quick_wins: The tool takes your site URL, a date range and four thresholds: minimum position, maximum position, minimum impressions and maximum CTR. Left at its defaults it looks at positions 5 to 20 with at least 100 impressions and a CTR under 5%, which catches both page-two queries and page-one results with a weak snippet. Claude maps your prompt onto those parameters (positions 11 to 20, at least 200 impressions) and gets back one row per query with clicks, impressions, CTR and average position. - Claude looks up the ranking page for each query: find_quick_wins works at the query level. To see which URL Google shows for each query, Claude calls search_analytics_query with the query and page dimensions over the same dates. If a query turns out to be split across two of your URLs, Claude can flag it as possible cannibalization instead of suggesting an on-page edit. - Claude compares query and page, then proposes edits: With the page content in hand (fetched with a web tool, or read from your repo when the client can open files), Claude checks whether the title, H1 and opening paragraph actually address the query. A typical line of output: "#3: /pricing averages position 14 for 'saas pricing comparison spreadsheet', with 1,240 impressions and 18 clicks in 90 days. The page never mentions a comparison or a spreadsheet. Edit: change the H1 from 'Pricing' to 'Pricing and plan comparison', and link a downloadable comparison spreadsheet in the first paragraph." Each suggestion is a sentence or a line of HTML, not a rewrite. Example answer (Illustrative answer for a made-up example.com. Your queries and numbers will differ.) Prompt: Find my striking distance keywords from the last 90 days, the page that ranks for each, and the smallest edit that could move it onto page one. Tool: `find_quick_wins` (positions 11 to 20, at least 200 impressions, CTR under 5%) | Query | Page | Position | Impressions | Clicks | |---|---|---|---|---| | saas pricing comparison spreadsheet | /pricing | 14.2 | 1,240 | 18 | | invoice template for freelancers | /templates/invoice | 11.8 | 980 | 21 | | recurring invoice software | /features/recurring | 12.9 | 610 | 12 | | how to send a payment reminder | /blog/payment-reminders | 16.5 | 560 | 9 | Start with /pricing: it ranks for a comparison query but never mentions a comparison or a spreadsheet. Change the H1 from "Pricing" to "Pricing and plan comparison" and link a downloadable comparison sheet in the first paragraph. /templates/invoice is closest to page one, so a title that leads with "Free invoice template for freelancers" is the next edit. Outcome: In about 30 minutes you have a short list of pages, each with a one-sentence change request and the impressions at stake. Hand it to whoever ships content and note the date. Four weeks later, run the same prompt over a period of the same length and see which queries moved onto page one. Follow-up questions worth asking: - Bias toward business impact: "only show striking distance keywords on /docs/ and /pricing/ URLs". - Look for snippet fixes on page one: ask for positions 1 to 10 with a CTR under 2%, where the page ranks but its title is being passed over. - After you ship an edit, run historical_position_trend on the target query to watch its daily position. It reads from your personal archive, which GSC PAP fills with your full 16 months when you sign in and keeps extending after that. - Use compare_periods to diff the four weeks before and after your edits across every query at once. Tools used: `find_quick_wins`, `search_analytics_query`, `historical_position_trend`, `compare_periods` Questions - What position range counts as striking distance? There is no official range. Common choices are 11 to 20 (strictly page two), 11 to 30, and wider bands such as 5 to 20 or 6 to 25 that include the bottom of page one. A narrow band gives a short, focused list; a wide one surfaces more candidates. GSC PAP's find_quick_wins tool defaults to positions 5 to 20 with at least 100 impressions and a CTR under 5%, and you can change each threshold in your prompt. - How many impressions should a striking distance keyword have? Enough that ranking higher would matter to you. There is no universal cutoff: on a small site a few dozen impressions over three months can be worth a look, while a large site may start at several hundred. Pick a threshold that leaves a list you can actually work through, then sort by impressions. - Why does Search Console show positions like 12.4? Position is an average across all the searches where your page appeared for that query in the date range. A page that showed at position 9 on some searches and 15 on others averages out somewhere in between, usually with a decimal. That is why it is safer to treat striking distance as a band than as an exact slot. - How long does it take a striking distance keyword to reach page one? Nobody can promise a timeline. Search Console data itself arrives a few days late, and rankings take longer than that to respond to a change. Compare periods of the same length a few weeks apart before you judge an edit, and change one thing per page at a time so you can tell what caused the move. - Do I need a paid SEO tool to find striking distance keywords? No. Google Search Console is free and already shows the queries you rank for, with average position and impressions, which is all this analysis needs. It reports what Google actually showed for your site rather than an estimate. GSC PAP, free during its public preview, lets you ask for the same list in plain language from Claude, Cursor or another MCP client. ### How to find keyword cannibalization in Google Search Console URL: https://gscpap.com/guides/detect-keyword-cannibalization Updated: 2026-09-18 Check for keyword cannibalization in Google Search Console: find queries where your pages compete, judge whether it hurts, and fix the cases that do. Keyword cannibalization is when two or more pages on your site show up for the same search query and compete with each other instead of one page clearly owning it. The typical signs: the URL Google shows for a query keeps changing, its position stalls, and clicks and links are split between pages that each rank worse than one strong page could. Google Search Console is the most direct place to check for it, because it records which of your URLs Google actually showed for each query. This guide covers how to find cannibalization there by hand, how to tell a real problem from harmless overlap, and how to fix the cases that matter. Then it runs the same audit in one prompt with Claude and GSC PAP. What is keyword cannibalization? It is the situation where several distinct pages on one site target the same search intent, so they end up competing for the same queries. Instead of one page collecting the relevance, internal links and clicks for a topic, they are spread across two or three pages, and Google has to keep choosing between them. It is not the same as duplicate content. Near-identical URLs, such as tracking parameters, filtered views or print versions of one page, are a canonicalization issue: Google groups them and picks one URL to show. Cannibalization is about separate pages, written separately, that answer the same question. How do you find keyword cannibalization in Google Search Console? Search Console has no cannibalization report, but the Performance report shows it one query at a time: - Open Performance, then Search results. Set the date range to the last 3 months and turn on Average position. - On the Queries tab, click a query you care about. Search Console adds it as a filter. - Switch to the Pages tab. Every URL listed was shown to searchers for that query during the period, each with its own clicks, impressions and average position. - Read the split. One URL with nearly all the impressions is healthy. Two or more URLs that each hold a real share is the pattern to investigate. - Check for flip-flopping. Keep the query filter, open the Compare tab in the date picker, and compare two periods. If the leading URL changed between them, Google is switching between your pages. - Repeat for your most important queries. ![Search Console Performance report filtered to one query, with the Pages tab showing two URLs that split its impressions](https://gscpap.com/images/guides/detect-keyword-cannibalization.webp) Click a query to filter on it (1), then open the Pages tab (2). Here two posts split the impressions and neither reaches page one. Recreated with example data for a made-up site. How do you check keyword cannibalization across a whole site? Checking query by query works for your top 20 terms, not for thousands. The Performance table shows one dimension at a time, so it cannot list query and page pairs side by side, and it shows at most 1,000 rows. For a full audit, pull query and page together from the Search Console API (up to 25,000 rows per request), group the rows by query, and keep the queries that more than one of your URLs appeared for. Sort them by the total impressions at stake. Set a minimum before you start, such as 100 impressions per query. Otherwise the list fills with noise: a second URL that appeared once at position 90 is not competing with anything. This is what the find_cannibalization tool in GSC PAP does in one call, as the worked example below shows. Is keyword cannibalization always a problem? No, and it is easy to overdiagnose. In a 2025 answer reported by Search Engine Journal, Google's John Mueller said that several of your pages appearing for the same query is not a problem just because there is more than one, and that pages "aren't duplicates just because they happen to appear in the same search results page." His advice: reduce unnecessary duplication, put your effort into one excellent page, and judge each case with knowledge of your site and your users. Overlap is usually fine when two of your pages rank on the same results page together, when a broad or branded query is served by different pages for different needs, when the pages match different intents (a how-to guide and a pricing page), or when the second URL has a handful of impressions at a deep position. It is worth fixing when: - Two pages answer the same question for the same reader, and neither ranks well for it. - The URL Google shows for the query keeps switching from one period to the next. - The wrong page leads: an old post, a thin tag page or an archive page shows instead of the page you want to rank. - You are about to publish a new page on a topic an existing page already covers. Expand the existing page instead. How do you fix keyword cannibalization? First decide which page should own the query. Usually it is the one with more clicks and links, or the one that better fits what the searcher wants. Then pick the lightest fix that makes that choice clear: - Consolidate. Move the useful parts of the weaker page into the owner, then 301 redirect the weaker URL to it. This is the right call when both pages answer the same question. - Redirect. If the weaker page adds nothing, 301 redirect it to the owner and drop it from your sitemap. - Differentiate. If both pages deserve to exist, give each a distinct intent, make the titles, H1s and opening paragraphs reflect it, and link the two pages to each other. - Fix internal links. Point links about the topic, with matching anchor text, at the owner instead of splitting them across both pages. - Canonical tag, for near-duplicates only. Use rel=canonical when both URLs must stay live but are versions of the same content. It is not a way to choose between two different pages, and Google can still pick a different canonical than the one you declare. - Noindex, as a last resort, for a page that has to exist for visitors but should not appear in search. - Before you redirect or remove anything, check the losing page for backlinks, conversions and internal links, and note the date so you can compare before and after. Example prompt: Use the gsc-pap MCP server. For https://example.com, find keyword cannibalization in the last 90 days: queries where 2 or more of my URLs got impressions, with at least 100 impressions per query. For each one, list the URLs with their clicks, impressions and position, tell me whether it looks like real cannibalization or harmless overlap, and recommend merge, redirect, differentiate, or leave alone. - Claude calls find_cannibalization: The tool takes your site URL, a date range, a minimum impressions threshold (default 100) and a minimum number of pages per query (default 2). It returns every query that more than one of your URLs appeared for, with the page count, total clicks and impressions, and a per-URL breakdown of clicks, impressions, CTR and average position. - Claude separates real overlap from noise: Not every flagged query deserves action. Claude looks at how the impressions split: if one URL has 480 of 490 impressions and a second appeared twice at position 60, that is noise. The ones worth a look have two or more URLs with a real share each, or a leading URL that is clearly the wrong page. Claude sorts those into three patterns: near-duplicate intent (merge and redirect), different intent on an overlapping query (differentiate and cross-link), and an old post outranking a newer, better one (redirect old to new). - Claude recommends the smallest fix: Sample output: "Query: 'customer interview templates', 4,200 impressions in 90 days. /blog/customer-interview-templates (position 12, 45 clicks) vs. /blog/user-research-interview-guides (position 18, 22 clicks). Pattern: near-duplicate intent. Action: move the unique sections of the second post into the first, 301 redirect /blog/user-research-interview-guides to /blog/customer-interview-templates, and update internal links that point at the old URL." For a closer look at intent, Claude can call get_search_by_page_query on each URL to see every query that page ranks for. Example answer (Illustrative answer for a made-up example.com. Your queries and numbers will differ.) Prompt: Find keyword cannibalization from the last 90 days and tell me which cases are worth fixing. Tool: `find_cannibalization` (at least 100 impressions per query, 2 or more pages) | Query | Page | Impressions | Clicks | Position | |---|---|---|---|---| | customer interview templates | /blog/customer-interview-templates | 2,650 | 45 | 12.1 | | customer interview templates | /blog/user-research-interview-guides | 1,550 | 22 | 18.4 | | user onboarding checklist | /blog/onboarding-checklist | 480 | 31 | 6.2 | | user onboarding checklist | /templates/onboarding | 10 | 0 | 60.3 | One case is worth fixing. "customer interview templates" is split between two posts that answer the same question, and neither reaches page one: move the unique sections of /blog/user-research-interview-guides into /blog/customer-interview-templates and 301 redirect it. "user onboarding checklist" is noise, with 10 of 490 impressions on the second URL at position 60. Leave it alone. Outcome: You end up with two lists: a short one of queries that are genuinely split, each with an owner page and one action, and a longer one you can safely leave alone. Most fixes are small: a redirect, a merged section, a retitled H1, a few internal links. Run the audit again a month after shipping and check that each fixed query now has one clear page. Follow-up questions worth asking: - Check branded queries separately ("only queries containing my brand name"). Several of your pages showing for your own brand is normal; what matters is whether the right one leads. - After a merge, run historical_position_trend on the query to confirm the surviving URL holds or climbs. - Before you publish a new post, ask Claude to run get_search_by_page_query on your closest existing page, so you can see which queries it already owns and expand it instead. - Re-audit every few months. New content keeps creating overlap with older posts you have forgotten. Tools used: `find_cannibalization`, `get_search_by_page_query`, `search_analytics_query`, `historical_position_trend` Questions - How do I check for keyword cannibalization in Google Search Console? Go to Performance, then Search results, click a query on the Queries tab, and switch to the Pages tab. If two or more of your URLs each hold a meaningful share of the impressions for that query, those pages are competing. To check every query at once, pull query and page data together from the Search Console API, or use a tool like GSC PAP's find_cannibalization that groups it for you. - Does Google penalize keyword cannibalization? No, it is not a penalty. The cost is indirect: Google has to choose between similar pages, the one it picks may not be your best, and links and clicks are split between them. Google's John Mueller has said that several of your pages appearing for one query is not a problem in itself. - Should I use a 301 redirect or a canonical tag? Use a 301 redirect when one page should replace the other for visitors and search engines alike. Use a canonical tag when both URLs have to stay reachable but are versions of the same content, such as filter or parameter variants. Even then, Google can choose a different canonical than the one you set. - How many pages ranking for one keyword is too many? There is no fixed number. Two of your pages on the same results page can be a good outcome. It becomes a problem when the pages serve the same intent and none of them ranks well, or when the URL Google shows keeps changing. Judge by the impressions split and the positions, not by the count. ### GSC clicks vs GA4 sessions: why they differ and how to tie clicks to conversions URL: https://gscpap.com/guides/correlate-organic-clicks-to-ga4-conversions Updated: 2026-10-25 A Search Console click and a GA4 session measure different things. Why the numbers never match, what gap is normal, and how to compare and combine them page by page. A Google Search Console click and a GA4 session are counted in different places. Google counts a click on its own servers the moment someone clicks your result. GA4 counts a session only when your tag runs in the visitor's browser. Everything that can happen between those two moments (a blocked tag, a declined cookie banner, a visitor who leaves before the page loads) pulls the numbers apart, so they almost never match. This guide covers what each metric counts, the well-documented reasons for the gap, how to tell a normal gap from broken tracking, how to compare the two page by page, why per-page figures never add up to the site total, and the four ways to combine Search Console and GA4 data, with what each one needs. The last section runs the comparison in Claude with GSC PAP, then adds conversions, so you can see which pages that earn clicks also earn outcomes. What is a GSC click, and how is it different from a GA4 session? A click in Search Console is a click on a Google search result that takes someone to a page outside Google. Clicks that keep the user inside Google are not counted. If someone clicks your result, comes back, and clicks the same result again, Google counts one click; clicking a different result of yours counts again. Clicks are credited to the canonical URL Google chose for the page. The Performance report shows Web search by default, with Image, Video and News as separate search types, and Discover and Google News have reports of their own. A session in GA4 is one visit: the interactions a visitor has with your site in one sitting. It starts when your GA4 tag runs in the browser and, by default, ends after 30 minutes without activity. GA4 then assigns the session to a channel. Visits from Google's organic results go into Organic Search, together with visits from Bing, DuckDuckGo and other search engines. In short, a click is an arrival as Google saw it, before your page loads. A session is a visit as your tag saw it, after the page loads. Why don't GSC clicks and GA4 sessions match? These are the well-documented reasons. Most of them make GA4 lower than Search Console. Where a click can fail to become a session 1. Someone clicks your result on Google (Search Console counts a click). Recorded on Google's servers, before your page exists for the visitor - Lost: They go back before the page loads 2. Your page loads in their browser - Lost: An ad blocker or privacy extension stops the tag - Lost: JavaScript is off - Lost: Analytics cookies are declined - Lost: The result was a PDF or another file that cannot run a tag 3. Your GA4 tag runs (GA4 counts a session). Recorded only if the tag runs and is allowed to send Every loss is a click with no session. Two differences sit outside this path: Search Console days run on Pacific Time and GA4 days on the property's time zone, and GA4's Organic Search channel also counts other search engines. - The GA4 tag is blocked. Ad blockers, privacy extensions and browsers with JavaScript turned off stop GA4 from recording the visit. Google's help notes that Analytics tracks only visitors with JavaScript enabled, while Search Console counts the click either way. - Consent. When a visitor declines analytics cookies, GA4 records nothing for that visit or only cookieless signals, depending on how your consent mode is set up. The click still counts in Search Console. - The visitor leaves before the tag fires. On a slow page, someone can click, wait, and press back before GA4 loads. That is a click with no session. - Different sources. Search Console counts Google only. GA4's Organic Search channel also includes other search engines, so compare Search Console with GA4's google / organic source and medium, not the whole channel. - Time zones. Search Console assigns clicks to days in Pacific Time (local time in California). GA4 uses your property's time zone, so daily numbers shift around midnight. - Files GA4 cannot track. Search Console counts clicks to PDFs and other non-HTML files. A PDF cannot run your GA4 tag, so those clicks never become sessions. - Redirects and canonicals. Search Console credits the canonical URL. GA4 records the URL the visitor actually loaded, after any redirect. The same visit can sit under different URLs in the two tools. - Different units. One visitor can click two of your results in one visit: two clicks, one session. A single click can become two sessions if the visitor goes idle past the session timeout and then carries on. How big a gap between GSC clicks and GA4 sessions is normal? There is no standard ratio, and figures quoted online describe other sites, not yours. The gap depends on how many of your visitors block trackers, your consent setup and where your visitors are, how fast your pages load, and how you define the GA4 side. The useful benchmark is your own site over time: a stable gap is a measurement difference, a moving one is a signal. Signs that you are looking at a tracking problem rather than a normal gap: - The gap jumps while Search Console clicks stay flat, often right after a site release, a tag manager change or a new consent banner. - A page has steady Search Console clicks but almost no GA4 sessions. The tag may be missing on that template, the URL may redirect to a path GA4 files elsewhere, or the URL may be a PDF. - The gap is much wider on one device, browser or country than on the rest of the site. That points to a page that breaks on one platform, or a consent or blocking pattern in one region. - GA4 shows far more google / organic sessions than Search Console shows clicks. Some excess is possible, since one click can become two sessions, but a large, sudden one is worth checking for a tag that fires twice. How do you compare GSC clicks and GA4 sessions by landing page? Compare like with like: Google organic traffic, per landing page, for the same dates. - In Search Console, open Performance, then Search results, set the dates, and use the Pages tab. - In GA4, build a report or exploration with the Landing page dimension and filter Session source / medium to google / organic. If you link Search Console to GA4, the Google Organic Search Traffic report puts Search Console clicks next to GA4 metrics for each landing page. That report collection is unpublished by default; publish it from the Library. - Match URLs on the path. Search Console reports full URLs (https://example.com/pricing), GA4 reports paths (/pricing). On a Domain property keep the host as well, or blog.example.com/ and example.com/ both collapse into "/". - Leave out the latest days. Search Console data usually settles within 2 to 3 days and its days run on Pacific Time, so compare a week or more that ends a few days ago. - Read the ratio page by page. A site-wide total can look fine while one template has lost its tag. ![GA4 Landing page report filtered to session source and medium google / organic](https://gscpap.com/images/guides/correlate-organic-clicks-to-ga4-conversions.webp) GA4's Landing page report with a Session source / medium filter for google / organic (1). Match its Landing page column (2) against the Pages tab in Search Console. Recreated with example data for a made-up site. Why don't per-page numbers add up to the site total? Before you compare page rows, check what adding them up gives you. In both tools the rows can sum to more than the tool's own total, and in GA4 by a wide margin, depending on the dimension and the metric. We measured it on our own properties: | Rows added up | Sum of the rows as a multiple of the total | |---|---| | Search Console impressions, by page | 1.11 | | Search Console clicks, by page | 1.02 | | GA4 sessions, by landing page | 1.00 | | GA4 sessions, by page path | 2.19 | | GA4 sessions, by day | 1.00 | | GA4 users, by landing page | 1.35 | | GA4 users, by day | 1.57 | Search Console: gscpap.com, web search, May 2 to October 21, 2026. GA4: our property, which also records our web app, July 27 to October 24, 2026. - Search Console counts impressions by property or by page. In Google's own example, one result card holding five of your links is one impression for the property and one for each of the five pages. Page rows sum to more than the total whenever several of your URLs appear together, so take the site total from a query with no dimensions, not from the sum of the page rows. - In GA4, Page path counts a session once for every page it viewed. Our sessions view about 4.6 pages each, partly because the property also records our own web app, so page path rows summed to 2.19 times the real number of sessions. Landing page files each session under the page it started on, which is the page a Search Console click lands on, and its rows matched the total. Use Landing page when you compare sessions with clicks. - Users never add up across rows. Someone who visits on three days is one user in a report for the whole period and three users in the daily rows, so ours summed to 1.57 times the real figure by day and 1.35 times by landing page. Take user counts from a report without the breakdown. What are the ways to combine Search Console and GA4 data? There are four common ways. They differ mostly in setup, and in how much history you have on the first day. None of them can attribute a conversion to a search query; the next section explains why, and what to do instead. | Option | What you need | What you get | Where it stops | |---|---|---|---| | GA4's Search Console link | Editor role on the GA4 property and verified ownership of the Search Console property. One web data stream links to one Search Console property. | Two GA4 reports: Google organic search queries, and Google organic search traffic, which puts Search Console and GA4 metrics side by side per landing page. | Search Console metrics combine only with Landing page, Device and Country. The query report takes no GA4 dimensions, and the reports have no time-series charts. | | Looker Studio | The Search Console connector (its Site Impression or URL Impression table) and the GA4 connector, blended in one report. | Dashboards that put clicks next to sessions and conversions for each page. | Search Console reports full URLs and GA4 reports paths, so you build the join key yourself. GA4 charts draw on the property's Data API quota, 40,000 tokens an hour on a standard property. | | BigQuery exports | A Google Cloud project with billing, Search Console's bulk data export and GA4's BigQuery export. Standard GA4 properties export up to 1 million events a day. | Row-level data you join in SQL. Search Console rows carry both the query and the URL. | Both exports start when you set them up, so the months before are missing. GA4 exports raw events, so each session's landing page has to be rebuilt in SQL. Usage above the free tier is billed. | | An MCP server such as GSC PAP | Sign in with Google once and add the server to an AI client. Read-only access, no Cloud project. | Answers in a conversation: correlate_gsc_to_ga4 puts each top page's clicks next to the Google organic sessions that landed on it, with their key events and revenue, and get_search_by_page_query lists the queries behind each page. History starts with the 16 months Google still holds. | It reads the same Google APIs, so the same limits apply, including no conversions per query. The page join covers your top pages by clicks, 30 by default, not every URL. | Sources: Google's help pages for the Search Console integration in GA4, Search Console bulk data export, GA4 BigQuery export and the Google Analytics Data API quotas, checked October 2026. How do you connect organic clicks to GA4 conversions? Once clicks and sessions line up by page, add the outcome: conversions (GA4 now calls them key events) and revenue for the same pages. The join answers questions neither tool answers alone: which pages earn clicks and convert, which earn clicks and do not, and which convert well but rank too low to get much traffic. The join stops at the page. Google does not pass the search query to your site, so no tool can tell you which query led to a conversion. You can estimate it by chaining two joins: Search Console's query and page dimensions give each query's share of a page's clicks, and GA4 gives the page's conversions. Split the conversions by that share and label the result an estimate, since it assumes visitors from every query convert at the same rate. By hand, that means exporting the reports and matching URLs in a spreadsheet. The next section does it in one conversation. Example prompt: Use the gsc-pap MCP server. Search Console site: https://example.com. GA4 property: properties/302550400 (if you are not sure, call list_ga4_properties first). For the last 28 days: 1. Get total clicks with get_performance_overview and Google organic sessions from the google / organic row of ga4_conversions_by_source. Give me the site-wide ratio. 2. Run correlate_gsc_to_ga4 and show a table sorted by gsc_clicks. 3. Flag three groups: pages with clicks but almost no GA4 sessions (likely tracking gaps), pages with clicks but no conversions, and pages that convert but rank below position 10. - Claude finds the GA4 property: If you do not know the property ID, Claude calls list_ga4_properties to list the GA4 accounts and properties you can access. You confirm the one that belongs to the site, and Claude uses its numeric ID for the GA4 calls. - Claude compares the site-wide totals: get_performance_overview returns Search Console clicks for the site. ga4_conversions_by_source returns sessions, conversions and revenue by source and medium, and its google / organic row is the like-for-like GA4 figure. Claude reports the ratio as a baseline to track, not a pass mark. Search Console's most recent 2 to 3 days are still filling in, so treat a single month's figure as approximate and watch how it moves. - Claude joins the two per page with correlate_gsc_to_ga4: The tool takes your top pages by Search Console clicks (30 by default) and, for the same dates, reads the GA4 sessions that landed on each page from google / organic, with the key events, revenue and engagement rate of those sessions. Landing sessions from Google are the like-for-like match for a click; counting every session that viewed the page would mix in other channels and internal navigation. It joins the two on host plus path, so subdomains on a Domain property do not merge into one "/" row, and a page with no Google organic landings in GA4 comes back as zero. Expect GA4 to sit somewhat below the clicks for the reasons above. The warning sign is a page with clicks and almost no sessions. - Claude sorts the pages into actions: Pages with clicks but almost no sessions go to a tracking check: the tag on that template, a redirect, or a URL that is really a PDF. Pages with clicks and no conversions are candidates for a closer match between search intent and the page, or a clearer next step. Pages that convert but rank below position 10 are where more visibility pays off, because the visitors they already get convert. Outcome: You come away with a site-level click-to-session ratio to track month over month, a short list of pages where tracking is likely broken, and the pages where better rankings would bring visitors who already convert. GSC PAP only reads your data, so fixes to tags, redirects and pages happen in your own stack. Follow-up questions worth asking: - Run the same prompt each month and ask Claude to compare the ratio with last month's. A sudden change is the signal worth chasing. - For a page flagged as a tracking gap, run inspect_url to see the Google-selected canonical and confirm Search Console is not crediting a different URL. - Pair with find_quick_wins: a page that already converts and ranks on page two is a strong candidate for a quick win. - Limit the table to business pages ("only /pricing and /docs/") to focus on the pages that carry revenue. Tools used: `correlate_gsc_to_ga4`, `get_search_by_page_query`, `get_performance_overview`, `ga4_conversions_by_source`, `list_ga4_properties`, `find_quick_wins` Questions - What counts as a click in Google Search Console? A click on a Google search result that takes the user to a page outside Google. Returning to the results and clicking the same link again counts once; clicking a different link counts again. Clicks that keep the user inside Google are not counted. Because Google records clicks on its side, they count even when your analytics tag never loads. - Why does GA4 show fewer sessions than Search Console shows clicks? Mostly because GA4 depends on a tag running in the visitor's browser. Ad blockers, declined cookie consent, disabled JavaScript and visitors who leave before the page loads all produce clicks without sessions. Clicks to PDFs, time zone differences (Search Console uses Pacific Time) and canonical or redirect URL differences widen the gap further. - Can GA4 show more organic sessions than Search Console shows clicks? Yes. GA4's Organic Search channel includes other search engines, one click can turn into two sessions if the visitor goes idle past the session timeout, and Search Console's Performance report shows Web search by default, with Image and Video search as separate filters. Compare against GA4's google / organic source and medium first. A large, sudden excess can also mean a tag that fires twice. - Is it normal for Search Console clicks and GA4 sessions to be different? Yes. They are measured in different places, so a gap is expected and there is no standard ratio. Track your own ratio over time. A gap that changes suddenly, or a page with clicks but almost no sessions, is the sign of a tracking problem. - What time zone does Google Search Console use? Pacific Time. Search Console labels each day by the local time in California, while GA4 uses the time zone set in your property, so daily totals will not line up exactly. Compare weeks or months instead of single days. - How do I combine Google Search Console and GA4 data? Link Search Console to GA4 for two built-in reports, blend the two connectors in Looker Studio, export both to BigQuery and join them in SQL, or ask an AI client connected through an MCP server such as GSC PAP. The GA4 link is the quickest but pairs Search Console metrics only with landing page, device and country. BigQuery is the most flexible but has no data from before you set it up. - Can I see GA4 conversions by Search Console query? Not directly. Google does not pass the search query to your site, so GA4 never sees it. Join queries to pages in Search Console and pages to conversions in GA4, then split each page's conversions by its queries' share of clicks. The result is an estimate, not a measurement. - Why do GA4 sessions by page add up to more than total sessions? The Page path dimension counts a session once for every page it viewed. Use Landing page, which files each session under the page it started on. On our property, page path rows summed to 2.19 times the real number of sessions, and landing page rows matched it. ### Audit Core Web Vitals across your site with AI URL: https://gscpap.com/guides/audit-core-web-vitals-with-ai Updated: 2026-09-18 Audit Core Web Vitals with Claude through a hosted PageSpeed Insights MCP server: Lighthouse lab data and real-user CrUX field data for your top pages. A Core Web Vitals audit answers two questions: which of your important pages fall short of Google's thresholds for real visitors, and what to fix first. PageSpeed Insights gives you the numbers one URL at a time. The work is running it across the pages that get search traffic and ranking the fixes. GSC PAP is a hosted MCP server with two PageSpeed Insights tools: `pagespeed_insights` for the Lighthouse lab run and `pagespeed_field_data` for CrUX field metrics at the 75th percentile. They share a 24-hour cache, so calling both for the same URL costs one PageSpeed request. This guide covers lab versus field data and the thresholds first, then walks a multi-URL audit prompt that reads your top Search Console pages, runs PSI on each, and produces an action-ranked report. Lab data vs field data: which Core Web Vitals numbers matter? PageSpeed Insights reports two kinds of numbers for every URL. Lab data comes from one Lighthouse run on Google's servers with a simulated device and network. It is repeatable enough to catch regressions and debug a slow page, but it is a single visit, and the score moves from run to run. Field data comes from the Chrome User Experience Report (CrUX): what real Chrome users experienced on that page over the last 28 days, reported at the 75th percentile. That is what your visitors actually get, so when lab and field disagree, trust the field numbers and use the lab run to find the cause. Two practical differences. Interaction to Next Paint (INP) needs real user interactions, so a lab run cannot measure it; Lighthouse reports Total Blocking Time (TBT) instead, which web.dev treats as a lab proxy for INP, not a substitute. And low-traffic URLs often have no URL-level field data because CrUX lacks enough samples. In that case `pagespeed_field_data` also returns origin-level data for your whole domain when CrUX has it. ![PageSpeed Insights report with field data from real users above the lab scores](https://gscpap.com/images/guides/audit-core-web-vitals-with-ai.webp) PageSpeed Insights puts field data from real Chrome users (1) above the lab run (2). When they disagree, the field numbers are what your visitors get. Recreated with example data for a made-up site. What are the Core Web Vitals thresholds? Google's thresholds, as published on web.dev, are measured at the 75th percentile of page loads, separately for mobile and desktop. A page passes when all three metrics are in the good range. Anything between good and poor is rated needs improvement. Core Web Vitals thresholds, at the 75th percentile | Metric | Good | Needs improvement | Poor | |---|---|---|---| | LCP (Largest Contentful Paint, loading) | 2.5 s or less | 2.5 s to 4 s | Above 4 s | | INP (Interaction to Next Paint, responsiveness) | 200 ms or less | 200 ms to 500 ms | Above 500 ms | | CLS (Cumulative Layout Shift, visual stability) | 0.1 or less | 0.1 to 0.25 | Above 0.25 | Source: web.dev. A page passes when all three are good, measured separately on mobile and desktop. Bars are not to scale. - Largest Contentful Paint (LCP), loading: good at 2.5 seconds or less, poor above 4 seconds. - Interaction to Next Paint (INP), responsiveness: good at 200 milliseconds or less, poor above 500 milliseconds. - Cumulative Layout Shift (CLS), visual stability: good at 0.1 or less, poor above 0.25. Example prompt: Use the gsc-pap MCP. For https://example.com, get my top 10 organic-traffic pages from the last 28 days via Search Console. For each one run pagespeed_insights mobile + pagespeed_field_data mobile. Build a table: page_path, perf_score, LCP_lab, LCP_field_p75, INP_field_p75, CLS_field_p75, and the #1 PSI opportunity by ms savings. Sort by perf_score asc so my worst-performing high-traffic pages bubble to the top. - AI fetches the top 10 organic-traffic pages: Claude calls `search_analytics_query` with dimension `page` for the last 28 days, takes the top 10 by clicks. This is your prioritization set: fixing CWV on a page nobody visits is wasted effort. - AI loops PSI calls (parallel-safe): For each page the AI calls `pagespeed_insights(url, mobile)` and `pagespeed_field_data(url, mobile)`. Both share GSC PAP's PSI cache so this is at most one Google PSI hit per (url, mobile) pair per 24h. - AI builds the report and surfaces fixes: Output is a sortable table with both lab and field metrics + the highest-impact opportunity per page. The AI also highlights pages where lab and field disagree (lab says fast, field says slow → environment-specific issue) or where field data is missing (low-traffic URL with no CrUX samples → fall back to lab and origin-level field data). Outcome: The pages to fix first are the ones with high organic traffic whose field LCP, INP or CLS sits outside the good range, even when their lab score looks fine. Those are the problems real visitors hit, on the pages Search sends them to. Field data covers a rolling 28-day window, so after you ship a fix, expect the field numbers to improve gradually over the following weeks rather than overnight. Follow-up questions worth asking: - Re-run weekly to catch regressions from new deploys. - Pair with `correlate_gsc_to_ga4` to weight CWV fixes by actual revenue impact. - For URL templates (e.g. blog posts or product pages) sample 3-5 representative URLs rather than auditing every one. Tools used: `pagespeed_insights`, `pagespeed_field_data`, `search_analytics_query`, `get_performance_overview` Questions - Is there a PageSpeed Insights MCP server? Yes. GSC PAP is a hosted MCP server that includes pagespeed_insights (a Lighthouse lab run) and pagespeed_field_data (CrUX real-user metrics), next to its Search Console and GA4 tools. You connect it by signing in with Google and pasting one bearer token into Claude, Cursor or Claude Code. There is no Google Cloud project to set up. - Can Claude audit Core Web Vitals for my whole site? It can work through a list of URLs, such as your top pages from Search Console, and call the PageSpeed tools for each one. Each URL costs one or two tool calls, and GSC PAP allows 60 tool calls per minute and 1,000 per hour per user. For large sites, audit the pages with the most traffic and sample a few URLs per template instead of every page. - Why does my page have no Core Web Vitals field data? CrUX only reports a URL when enough real Chrome users loaded it during the last 28 days. When URL-level data is missing, pagespeed_field_data still returns origin-level data for your whole domain if CrUX has it, and the pagespeed_insights lab run can still point to page-specific problems. The URL also has to be public: PageSpeed Insights cannot reach localhost or staging URLs that Google's servers cannot load. ### Google Search Console historical data: how to keep it past 16 months URL: https://gscpap.com/guides/recover-search-console-history-past-16-months Updated: 2026-09-18 Google Search Console keeps 16 months of historical data, then deletes it. Here is what it includes and how to keep it longer, from BigQuery to an archive. Google Search Console keeps 16 months of historical performance data. Every day, the oldest day in that window is deleted: the web interface stops showing it, the API stops returning it, and nothing can bring it back afterward. Any Search Console data you have from further back exists only because someone saved it before it expired. This page covers what that historical data includes, the four ways to keep it (manual export, the Search Console API, Google's BigQuery bulk export, and an automatic archive), and a worked example of querying an archive with Claude. GSC PAP's archive starts on its own when you sign in with Google: it saves the full 16 months Google still has, then adds each new day. How long does Google Search Console keep historical data? 16 months. That is the limit for the Performance report: clicks, impressions, click-through rate and average position. It is a rolling window, so each new day of data pushes the oldest day out. The Search Console API serves the same 16 months; there is no longer archive behind it. Google introduced the 16-month window in January 2018 with the new Performance report, the successor to the old Search Analytics report, to make longer-term trends and year-over-year comparisons easier. It is still 16 months today. At the recent end, new data usually shows up two to three days late. ![Search Console date range dialog with Last 16 months selected, the longest option](https://gscpap.com/images/guides/recover-search-console-history-past-16-months.webp) Last 16 months (1) is the longest range the date picker offers. Can you recover Search Console data older than 16 months? No. Once a day falls out of the 16-month window, Google deletes it on its side. The Performance report cannot show it, the API cannot return it, and no third-party tool can recover it, GSC PAP included. When a tool shows you older Search Console data, it is because that tool saved the data while it was still inside the window. So the useful question is not how to get old data back, but how to stop losing more of it. Until you start saving it somewhere, one more day of your site's history expires every day. What does Search Console historical data include? Four metrics (clicks, impressions, CTR and average position) that you can break down by query, page, country, device, search appearance and date, and filter by search type, such as web, image or video. How much of it you can actually see depends on where you look: - The Performance report in the web interface shows up to 1,000 rows per table. On a site with thousands of queries or pages, you see the top of the list and nothing below it. - The Search Analytics API returns up to 25,000 rows per request and lets you page through more. Google's documentation also caps it at 50,000 rows per day for each search type, sorted by clicks. - Google's BigQuery bulk export is not affected by that daily row limit. Google describes it as most useful for large sites with tens of thousands of pages, or of queries a day. - In the interface, the API and the BigQuery export alike, anonymized queries are left out of the query rows. Google defines them as very rare queries, not issued by more than a few dozen users over two to three months. Your totals still include their clicks and impressions, but no tool can show you the queries themselves. Why keep Search Console data past 16 months? Sixteen months covers one year-over-year comparison and a few months more. That is enough to compare this month with the same month last year, and not enough for anything longer, such as: - Comparing this year with two years ago, or following a query or a section of your site across several years. - Telling a seasonal dip from a real decline when the season you need to check is more than 16 months back. - Looking at traffic before and after a migration, a redesign or a Google core update once that date has aged out of the window. - Keeping a record for clients or stakeholders that does not quietly get shorter every day. How do you keep Search Console data longer than 16 months? There are four ways. They differ in setup, in how complete the data is, and in whether they can save the 16 months you already have. - Manual export. In the Performance report, export to CSV or Google Sheets on a schedule. It is free and needs no setup, but each table stops at 1,000 rows, the tables are separate summaries (you cannot later ask which page a query landed on in a given week), and it only works if someone remembers to do it. - The Search Console API. A script pulls one day at a time (the approach Google's documentation recommends) and stores the rows in your own database. It can also save the 16 months still in Search Console, but you need a Google Cloud project, OAuth credentials, a scheduler and somewhere to keep the data. - BigQuery bulk export. This is Google's official answer. A property owner connects Search Console to a Google Cloud project with billing enabled, enables the BigQuery API and gives Search Console's service account access; daily exports then start within 48 hours. It is the most complete record, but it only exports from the day you set it up, with no backfill of the 16 months already in Search Console, and you read it with SQL. - An automatic archive. A service reads the API for you, saves the full 16 months on day one and keeps adding days, with no code or Cloud project on your side. This is what GSC PAP does. It also works alongside BigQuery: BigQuery captures more rows from the day you turn it on, and the archive keeps the 16 months BigQuery never copies. How does GSC PAP keep your Search Console history? You sign in with Google and the archive starts by itself. There is no button to press, no Google Cloud project and no code. GSC PAP is read-only and free during the public preview, and you query the archive in plain language from Claude, Cursor or Claude Code. What Google keeps, and what the archive keeps - Search Console on the day you connect: 16 months - Search Console a year later: Deleted by Google; 16 months - GSC PAP archive: Every day since 16 months before you connected The archive starts with the 16 months Google still has on the day you connect and adds each new day. Days Google deleted before that are gone for everyone. - On sign-in, it backfills the full 16 months Google still has for every property your Google account can read. - After that, a daily job fetches each new day, about four days behind today, because Google's numbers take around three days to settle. - Days older than 16 months stay in your archive after Google deletes them, so from the day you connect, your history keeps growing past 16 months for as long as your account is active. - Questions about stable past data (older than about three days) are answered from the archive at zero Google API quota. Recent days still come live from Google. - The archive stores query, page, country, device and date, with clicks, impressions, CTR and position. It is private to your account. - What it cannot do: bring back days Google deleted before you connected, or show anonymized queries. It reads the same Search Analytics API, so on a very large site it holds what the API exposes, not every row a BigQuery export would. Example prompt: Use the gsc-pap MCP server. For https://example.com, check archive coverage with archive_status first. Then compare clicks and impressions for Q1 2025 (January 1 to March 31) with Q1 2026 using search_analytics_archive, since Search Console no longer has Q1 2025. Group by query and return the top 30 queries by Q1 2026 clicks, with their Q1 2025 numbers, the change and the percentage change. - Claude checks coverage with archive_status: archive_status(site_url) returns the earliest_date, latest_date and row count stored for the property. Here earliest_date is in late December 2024, so all of Q1 2025 is covered. A later earliest date would mean a partial quarter and a misleading comparison, which is why this check comes first. On a site you connect today, earliest_date sits about 16 months back, and the range you can compare grows by one day every day. - Claude calls search_analytics_archive for both quarters: Two calls, one per quarter, each with dimensions set to query. The archive aggregates the stored daily rows in its database, so neither call uses Google API quota and neither is bound by the 16-month window. Claude joins the two result sets on the query text and computes the change and percentage change for each query. - Claude summarizes what changed: You get the comparison table plus a short read of it: which queries grew, which shrank, and which appear in only one of the two quarters. Search Console cannot produce this table anymore, because one half of it is gone from Google. Outcome: A year-over-year view of a quarter Google has already deleted, built from your own daily rows instead of exports someone remembered to take. The same prompt works for any window your archive covers, and that coverage grows by one day for every day you stay connected. Follow-up questions worth asking: - Follow a single query across the whole archive with historical_position_trend, for example to see whether its position started slipping before or after a site change. - For two windows that are both still inside Google's 16 months, compare_periods runs the same kind of diff against live Search Console data. - There is no backfill to trigger. The archive page in your account (/account/archive) shows per-site coverage, and its manual backfill is still there if you ever want it. Tools used: `search_analytics_archive`, `archive_status`, `historical_position_trend`, `compare_periods` Questions - Can I see Search Console data older than 16 months? Not in Search Console. The Performance report and the API both stop at 16 months, and older days are deleted. You can only see older data if it was saved before it expired: in your own exports, in a BigQuery bulk export, or in an archive such as GSC PAP's. - Does the BigQuery bulk export include past Search Console data? No. It exports from the day you set it up onward, with daily exports starting within 48 hours of a successful setup. The 16 months already in Search Console are not copied, so if you want them too, save them through the API or an archive that backfills. - How far back will GSC PAP go for my site? The full 16 months Google still has on the day you sign in, then forward from there, one day at a time. Ask your AI client to run archive_status to see the earliest and latest date stored for each property. - How do I see my top queries for the last 16 months? In Search Console, open Performance, then Search results, set the date range to the last 16 months and open the Queries table. It lists up to 1,000 queries. For more rows, use the Search Analytics API, or ask GSC PAP from your AI client. - Does the old version of Search Console have older data? No. The old Search Analytics report kept less history, not more: Google introduced the 16-month window with the new Performance report in January 2018, after users asked for more data. Google began retiring the old interface in 2019. ### Build a weekly SEO health report with Claude URL: https://gscpap.com/guides/weekly-seo-health-report-via-claude Updated: 2026-09-18 Automate a weekly SEO report with Claude: one saved prompt pulls Search Console changes, quick wins, decaying pages, GA4 conversions and Core Web Vitals. GSC PAP exposes tools across Search Console, GA4, PageSpeed Insights and live Google results. Stitching 6 of them together inside one Claude conversation gives you a complete weekly report without a separate reporting tool. Once the prompt works, save it as a Claude project or Cursor command and re-run it weekly. This guide walks one prompt that produces a report covering: weekly performance vs the prior week, quick wins to act on this week, content decay alerts, ranking shifts on top queries, GA4 conversions from organic search, and Core Web Vitals on top pages. What should a weekly SEO report include? A weekly report has one job: tell you whether anything changed that needs action this week. Compare the last 7 days with the 7 days before, and end the window about 3 days before today, because recent Search Console data is still settling and an incomplete day looks like a drop. Leave slow trends to a monthly report; a week is too short to judge them. Keep every section to a one-line summary plus a small table with the exact queries, pages and numbers, so whoever reads it can act without opening Search Console. A useful weekly report covers: - Headline numbers: clicks, impressions, CTR and average position against the previous week. - Biggest movers: the queries and pages that gained or lost the most clicks or positions. - Quick wins: queries with high impressions on page one or two that earn few clicks, the cheapest ones to improve. - Content decay: pages whose clicks keep falling, flagged for a refresh. - Conversions from organic search in GA4, so traffic changes are tied to results. - Technical checks: Core Web Vitals on your top pages, plus indexing status for anything new or important. ![Search Console Performance report comparing the last 7 days with the previous 7 days, with queries sorted by click difference](https://gscpap.com/images/guides/weekly-seo-health-report-via-claude.webp) Compare mode (1) gives the headline numbers for both weeks, and sorting by Clicks Difference (2) lists the biggest movers. Recreated with example data for a made-up site. Example prompt: Use the gsc-pap MCP. Build my weekly SEO health report for https://example.com (GA4 property properties/123456789). Cover the last 7 complete days (ending 3 days ago) vs the prior 7 days. Sections: (1) Headline numbers, clicks/impressions/avg-pos delta via compare_periods. (2) Quick wins this week via find_quick_wins, top 5. (3) Content decay alerts via find_content_decay, anything down >25% WoW. (4) Top 5 queries with biggest position shift via historical_position_trend. (5) GA4 conversions by source for the same window via ga4_conversions_by_source, focus on Organic Search. (6) Core Web Vitals for the top 5 organic pages via pagespeed_field_data mobile, flag any metric outside Google's good range. Format as a Notion-friendly markdown report with H2 sections and tables. - AI fans out the tool calls in parallel where possible: Claude and Cursor recognize this is a multi-tool prompt and can run the GSC, GA4 and PSI calls in parallel: compare_periods, find_quick_wins, find_content_decay and ga4_conversions_by_source can all start at the same time. PSI calls are sequential because each one is slow, but cached for 24 hours after the first run. - AI assembles the report markdown: Each section becomes an H2 with a summary sentence + a markdown table. The AI captures dates, delta percentages, and exact URLs / queries so the report is actionable without flipping back to a tool. - Save the prompt as a reusable command: In Claude Code, save it as a custom slash command (a Markdown file in `.claude/commands/`). In Cursor, save it as a custom slash command. In Claude Desktop, keep it in a project. Next Monday you run the same prompt with no edits. Example answer (Illustrative answer for a made-up example.com. Your queries and numbers will differ.) Prompt: Build my weekly SEO health report: the last 7 complete days against the 7 days before. Tool: `compare_periods` (then find_quick_wins, find_content_decay, ga4_conversions_by_source and pagespeed_field_data) | Headline | This week | Week before | Change | |---|---|---|---| | Clicks | 3,420 | 3,610 | -5.3% | | Impressions | 98,200 | 101,500 | -3.3% | | CTR | 3.48% | 3.56% | -0.08 pt | | Average position | 11.8 | 11.6 | +0.2 (worse) | Clicks fell 5% along with impressions, so most of the drop is demand, not rankings. One page needs attention: /blog/onboarding-checklist lost 31% of its clicks as its position slipped from 4 to 7. The quick wins section lists two page-two queries with over 1,000 impressions each, and every top page passes Core Web Vitals on mobile. Outcome: The tab-by-tab Monday check becomes one prompt. Because every section names exact queries, pages and numbers, the output can go straight into Slack or Notion as the team's weekly digest, and a quietly decaying page or a slow top page shows up while it is still a small problem. Follow-up questions worth asking: - Make a monthly variant with 28 days vs the prior 28: same prompt, different windows. - If your AI client supports scheduled runs, schedule the saved prompt for Monday morning. - Add an indexing check with `batch_inspect_urls` for the pages you published that week. - Add a brand-monitoring section if you have specific brand queries to track. Tools used: `compare_periods`, `find_quick_wins`, `find_content_decay`, `historical_position_trend`, `ga4_conversions_by_source`, `pagespeed_field_data` Questions - How do I automate a weekly SEO report from Google Search Console? Connect Search Console to an AI client such as Claude through an MCP server like GSC PAP, save one prompt that lists the sections you want, and run it each week. The AI calls the Search Console, GA4 and PageSpeed tools itself and writes the report in the chat, ready to paste into Slack or Notion. - Why does the latest week of Search Console data look low? Search Console data takes about 3 days to settle, so the newest days can be incomplete and look like a drop. End the reporting week about 3 days before today and compare it with the 7 days before that. - Is a weekly SEO report too frequent? Weekly is the right pace for catching sudden problems, such as a page dropping out of the index or a traffic loss after a deploy. Clicks and rankings are noisy day to day, so judge slow trends on monthly or longer comparisons. The same prompt with 28-day windows gives you the monthly version. ### Bulk URL inspection in Google Search Console: diagnose indexing issues at scale URL: https://gscpap.com/guides/diagnose-indexing-issues-bulk-url-inspection Updated: 2026-09-18 Search Console inspects one URL at a time. The URL Inspection API allows 2,000 checks a day per property. How to inspect in bulk and find indexing issues. Google Search Console has no bulk URL inspection button. The URL Inspection tool checks one URL at a time, and the Page indexing report shows counts per reason rather than the status of a list you choose. To inspect URLs in bulk you use the URL Inspection API, which returns the same index data for each URL within a quota of 2,000 inspections per day and 600 per minute for each property. Below: what the API can and cannot do, what each coverage state means and which ones to act on, and a workflow for finding the one cause behind many unindexed pages. The last section runs the audit from Claude through GSC PAP, a read-only MCP server that calls the API for you. Can you inspect URLs in bulk in Google Search Console? Not in the interface. The URL Inspection tool takes one fully qualified URL, typed into the search bar at the top of Search Console or opened from the Inspect link next to a URL in a report. It shows what Google has stored for that page: whether it is indexed, when it was last crawled, which canonical Google chose, and any structured data it found. Checking 200 blog posts means 200 lookups. The Page indexing report covers the whole site, but it answers a different question: how many URLs sit under each reason. Its example lists stop at 1,000 URLs, and Google notes they are not guaranteed to include every affected URL. So it cannot give you the status of a specific set of pages, such as everything you published last quarter. For per-URL answers across a list, Google released the URL Inspection API in January 2022. Any tool that offers bulk inspection through this API works within the same quota and limits described below. How does the URL Inspection API work, and what are its limits? You send two things: the Search Console property and the URL to inspect. The API returns one inspection result for that URL: an overall verdict, the coverage state (such as "Crawled - currently not indexed"), whether robots.txt allows crawling, whether a noindex rule blocks indexing, whether Google could fetch the page, the last crawl time, the canonical you declared and the one Google selected, known sitemaps and referring URLs, plus rich result and AMP findings where present. Bulk inspection is one request per URL. The limits that shape any bulk workflow: - Quota: 2,000 inspections per day and 600 per minute, enforced per Search Console property (calls that query the same site). - Indexed version only. The API reports what Google stored at the last crawl. It cannot run the live test from the Search Console interface, so a fix you shipped yesterday will not show until Google recrawls the page. - It reads, it does not submit. The API has no way to request indexing. The Request indexing button exists only in the Search Console interface, one URL at a time, with a daily cap. Google's separate Indexing API only accepts pages with job posting or livestream video markup, so it is not a general way to get pages indexed. - Your properties only. You can inspect URLs only in properties your Google account has access to. - Mobile usability is deprecated. The response still has a mobile usability field, but Google has deprecated it, so do not base decisions on it. What do the coverage states mean, and which should you fix? The coverage state uses the same wording as the Page indexing report. Start from Google's own position: not every URL should be indexed. Redirects, duplicates and pages you excluded on purpose are working as intended, and Google says most sites have at least a few unindexed pages. What matters is that your important pages are indexed and that every exclusion has a reason you agree with. Where a URL can stop on its way into Google's index 1. The page exists on your site - Lost: URL is unknown to Google: nothing links to it and no sitemap lists it 2. Google discovers the URL. Through a link on a crawled page or a sitemap entry - Lost: Discovered - currently not indexed: the crawl was postponed - Lost: Blocked by robots.txt 3. Google crawls it. Fetches the page, if robots.txt allows it - Lost: Crawled - currently not indexed: Google chose not to index it for now - Lost: Excluded by 'noindex' tag - Lost: Duplicate, Google chose different canonical than user - Lost: Soft 404, server error (5xx) or redirect error 4. Google indexes it (Can appear in search) The names are the coverage states in the Page indexing report and the URL Inspection API. Some stops are intended: a redirect, an alternate page with a proper canonical tag, or a noindex you set on purpose. - Expected, just confirm they are intentional: "Page with redirect", "Alternate page with proper canonical tag", "Excluded by 'noindex' tag", "Blocked by robots.txt", and "Not found (404)" for pages you removed. - Technical errors, fix first: "Server error (5xx)", "Redirect error", "Soft 404", 401 or 403 responses on public pages, and any noindex you did not mean to ship. These tend to come from one template or server rule, so one fix can clear many URLs. - Canonical choices: "Duplicate without user-selected canonical" and "Duplicate, Google chose different canonical than user". Compare the user-declared and Google-selected canonical in the result. If Google folded a page into one you consider different, make the content more distinct or fix the signals that point elsewhere. - "Crawled - currently not indexed": Google fetched the page and chose not to index it for now. Google says it may be indexed later and there is no need to resubmit it. Treat it as a question about the page: improve it, merge it into a stronger page, or decide it does not need to be in search. - "Discovered - currently not indexed": Google knows the URL but has not crawled it yet. Google's usual explanation is that it postponed the crawl to avoid overloading your site. Check that the page is linked from pages Google crawls and listed in a sitemap. - "URL is unknown to Google": Google has not seen the URL at all. It needs an internal link from a crawled page or a sitemap entry before anything else. ![Search Console Page indexing report with the Why pages aren't indexed table](https://gscpap.com/images/guides/diagnose-indexing-issues-bulk-url-inspection.webp) The report lists the same coverage states. The two highlighted (1) mean Google found or crawled the pages and held them back, which is worth a look. Redirects, alternates with a proper canonical and noindex pages are usually working as intended. Recreated with example data for a made-up site. How do you diagnose indexing issues at scale? The quota rules out inspecting everything every day on a large site, so work from a shortlist and look for patterns rather than individual URLs. - Find where to look. In the Page indexing report, note which reasons have grown and since when. That points you to a template, a directory or a release date. - Build the list. Take the URLs you care about from one sitemap or directory, then drop the ones that already earn impressions in the Performance report, since a page that appears in results is indexed. What is left is your inspection list. - Inspect within the quota. At 2,000 per day per property, a 5,000-URL list takes three days, so inspect the pages that matter most first. - Group the results by coverage state and by URL pattern (directory, template, publish month). You are looking for one cause shared by many URLs: a template with a stray noindex, a section only reachable through deep pagination, a canonical tag pointing to the wrong version. - Fix the cause, then tell Google. For many new or updated pages, Google recommends a sitemap with accurate lastmod dates over requesting indexing URL by URL. If the issue shows in the Page indexing report, use Validate fix; Google says validation typically takes up to about two weeks. - Re-inspect the same list after Google recrawls to confirm the states changed. Example prompt: Use the gsc-pap MCP server. Site: https://example.com. 1. Run get_index_coverage_summary as a quick check that my top pages are indexed. 2. Here are the blog URLs from my sitemap: [paste the list]. Use search_analytics_query (dimension: page, last 90 days) to find which of them had no impressions. 3. Inspect those with batch_inspect_urls, 10 URLs per call. 4. Group the results by coverageState. For each URL that is not indexed, show the verdict, last crawl time, user-declared and Google-selected canonical, and the likely cause. 5. Tell me the pattern most unindexed URLs share and what to fix first. - Claude checks your top pages with get_index_coverage_summary: The tool takes your top pages by clicks over the last 28 days (up to 10), inspects each one, and counts verdicts and coverage states. It answers one question fast: are the pages that already earn traffic still indexed? It is a sample of your most visible pages, not a site-wide count; the Page indexing report in Search Console is the site-wide view. - Claude narrows the list and inspects it in batches of 10: search_analytics_query returns the pages that earned impressions, so Claude drops those from your list and keeps the rest. batch_inspect_urls accepts up to 10 URLs per call, inspects them one after another, and returns a result or an error for each URL, so 60 candidates take six calls. Every inspection counts toward Google's 2,000 per day quota for the property. For long lists, work one directory or template at a time so the results stay readable in the conversation. - Claude groups the results and names the cause: Claude buckets the URLs by coverageState and reads the fields that explain each bucket: robots.txt state, indexing state (a noindex in the robots meta tag or the X-Robots-Tag header), page fetch state, referring URLs, and the two canonicals. A readout might say: 23 URLs "Discovered - currently not indexed" with no crawl date and only deep pagination pages as referrers; 6 URLs "Duplicate, Google chose different canonical than user", all tag pages folded into their parent category. For any single URL, inspect_url returns the full result, including a link to the same inspection in Search Console. Outcome: You end with a few causes instead of a long list of URLs, each with the evidence behind it. GSC PAP is read-only (it uses the webmasters.readonly scope), so the fixes, the sitemap update and any Request indexing clicks happen on your site and in Search Console. After Google recrawls, run the same prompt on the same list to confirm the states moved. Follow-up questions worth asking: - Use list_sitemaps and get_sitemap_details to confirm the URLs sit in a submitted sitemap and that Google downloaded it without errors. - Two weeks after a fix, ask Claude to re-inspect only the URLs that were not indexed and report which coverage states changed. - Ask Claude for the unindexed URLs grouped by directory, as a table you can hand to whoever owns that template. Tools used: `batch_inspect_urls`, `inspect_url`, `get_index_coverage_summary`, `search_analytics_query`, `list_sitemaps` Questions - Is there a bulk URL inspection tool in Google Search Console? No. The Search Console interface inspects one URL at a time. Bulk inspection means calling the URL Inspection API for each URL, with your own script or a tool built on the API, within Google's quota of 2,000 inspections per day and 600 per minute per property. - What is the URL Inspection API quota? 2,000 queries per day and 600 queries per minute, enforced per Search Console property. At that rate a list of 5,000 URLs takes three days to inspect, so start with the pages that matter most. - Can the URL Inspection API request indexing? No. It only reads the indexed status of a URL. Request indexing is available only in the Search Console interface, one URL at a time and with a daily limit. For many new or updated pages, Google recommends submitting a sitemap with accurate lastmod dates. - Does the URL Inspection API run a live test? No. It returns data about the version in Google's index, from the last crawl. The live URL test is available only in the Search Console interface. - What does "Crawled - currently not indexed" mean? Google fetched the page and decided not to index it for now. Google says it may be indexed in the future and there is no need to resubmit the URL. Your options are to improve the page, merge it into a stronger one, or accept that it does not need to rank. ### Track keyword rankings in Google Search Console, past the 16-month limit URL: https://gscpap.com/guides/track-keyword-rankings-over-years Updated: 2026-09-18 See a keyword's position history in Google Search Console, what that average really measures, and how to keep ranking history past the 16-month limit. Google Search Console does track keyword rankings, in its own way. For every query your site shows up for, it records an average position for each day, and you can chart that number for a single keyword. Two things catch people out: the number is an average over real searches, not a daily rank check, and Google deletes it after 16 months. This guide answers the common questions first: what Search Console's position means, how to pull up a keyword's position history, how far back it goes, and how to keep that history for years. Then it walks through charting one keyword's full history with Claude and GSC PAP. Can Google Search Console track keyword rankings? Yes, for any property you can open in Search Console. The Performance report lists every query your pages appeared for, with clicks, impressions, CTR and average position, and it can show each of those day by day. For the keywords that actually earn you impressions, that is a free ranking history. The catch is what "position" means. Each time your site appears for a query, Search Console notes where your highest-ranking result sat. The number it reports is the average of those positions across every impression in the date range. A rank tracker works differently: it runs the search once a day from one location and device and records a single rank. So the two numbers rarely match, and neither one is wrong. Search Console's figure blends every country, device and results layout your real searchers saw. A rank tracker's figure is easier to read day to day, and it can follow competitors and keywords you don't appear for yet, which Search Console can't. - No impressions, no position. If your site wasn't shown for a query on a given day, that day has no position at all. It doesn't mean you ranked 100th. - Low-volume keywords swing. With only a few impressions a day, one search can move the average by several places. - Very rare searches are anonymized. Google leaves them out of the query list entirely, so they can't be tracked. - The data lags. A day's complete numbers usually take two to three days to arrive. How to see a keyword's position history in Search Console The Performance report can chart one keyword on its own. The same series is also available through the Search Analytics API: filter on the query and group by date. - Open Performance, then Search results, for the property. - Turn on the Average position card above the chart. Leave Impressions on as well, so you can see how much data sits behind each point. - Set the date range. Last 16 months is the longest option Google offers. - Add a filter: Query, then Exact query, and type the keyword. The chart now shows that keyword's average position day by day. - Open the Pages tab under the chart to see which of your URLs ranked for it. If the ranking page changed, that often explains a jump. - Use Compare in the date picker to put two periods side by side, for example the last three months against the same months a year earlier. ![Search Console Performance report for one query over the last 16 months, with impressions and average position charted](https://gscpap.com/images/guides/track-keyword-rankings-over-years.webp) Set the date range to Last 16 months (1), filter on the query (2) and turn on Average position (3). The dip in September 2025 is the kind of move to line up with a change on the site. Recreated with example data for a made-up site. How to use Search Console to identify ranking trends One day's position is rarely worth acting on. Trends show up when you look at longer windows and read position next to the other metrics. - Compare averages, not single days. A week or a month against the same stretch earlier tells you far more than one data point. - Weigh position by impressions. A two-place drop on 20 impressions is noise; the same drop on 20,000 is worth a look. - Read clicks and impressions alongside it. If position and impressions hold steady but clicks fall, look at the results page itself: something new may be taking the clicks above you. - Check the ranking URL, not only the query. Two of your pages trading places for one keyword shows up as a jumpy position line. - Look across queries at once. The Compare view lists each query's metrics for both periods, which surfaces your biggest risers and fallers. How far back does Search Console keyword history go? 16 months. Search Console keeps 16 months of performance data on a rolling basis, so every day the oldest day in the window is deleted. No setting or API call brings it back. That is enough to compare the last four months with the same four months a year earlier, and not much more. You can't set this spring against the spring two years ago, and once a site migration or a big content change is more than 16 months old, the rankings from before it are gone. How to keep keyword ranking history beyond 16 months Google won't keep it, so the only fix is to copy the data before it ages out. None of the options below can recover days Google deleted before you set them up; they protect you from losing more. In GSC PAP, the historical_position_trend tool reads one keyword's daily clicks, impressions, CTR and position from your archive, over any range the archive covers, without spending Google API quota. The worked example below uses it. - Manual exports. Download the Performance report every month and store the files. It works, but each export stops at 1,000 rows, and it only lasts as long as someone keeps doing it. - BigQuery bulk export. Google's official option sends daily data to your own BigQuery dataset. It needs a Google Cloud project with billing, you query it with SQL, and it starts on the day you set it up, with no backfill. - The GSC PAP archive. When you sign in with Google, GSC PAP automatically copies the 16 months Google still holds for every property your account can read. A daily job then adds each new day, about four days behind today while Google's data settles. Days that Google deletes stay in your archive, so your history keeps growing past 16 months. Example prompt: Use the gsc-pap MCP. For https://example.com, first run archive_status to see how far back my archive goes. Then call historical_position_trend for the query 'customer interview templates' over the full archived range. Roll the daily rows up to a weekly average position, weighted by impressions. Flag every week where position moved 3 or more places from the week before, and list those weeks with the position before and after and that week's impressions. Overlay these dates: site redesign 2025-03-10, URL migration 2025-09-01. - Claude checks how far back the archive goes: archive_status returns the earliest and latest archived date for the property. On the day you connect, that span is the 16 months Google still had; from then on it grows by a day at a time. Claude uses those dates as the range for the next call, so it never asks for days that aren't there. - Claude pulls the keyword's daily series: historical_position_trend returns one row per day with clicks, impressions, CTR and position for that exact query. Wrap the keyword in % signs (for example %interview template%) and it matches every query containing the phrase, combined into one daily series. The rows come from your archive, so the call uses no Google API quota however far back it reaches. - Claude smooths the noise and flags real moves: Daily positions for a mid-volume keyword bounce around, so Claude rolls them up to weekly averages weighted by impressions, computes the change from one week to the next, and flags the weeks that moved 3 places or more. Weeks with very few impressions are marked as low confidence rather than reported as drops. - Claude lines the moves up with your dates: Claude marks the redesign and migration dates on the series and says which flagged weeks fall near them. Paste in the dates of Google updates you care about and it does the same for those. A match is a lead to investigate, not proof of cause. Example answer (Illustrative answer for a made-up example.com. Your queries and numbers will differ.) Prompt: Show the weekly position history for 'customer interview templates' over my whole archive, flag weeks that moved 3 places or more, and mark the redesign (2025-03-10) and the URL migration (2025-09-01). Tool: `historical_position_trend` (full archived range, rolled up to weeks) | Week of | Position | Week before | Impressions | Lines up with | |---|---|---|---|---| | 2025-03-10 | 13.9 | 9.7 | 380 | Redesign | | 2025-03-31 | 10.2 | 13.6 | 410 | Recovery | | 2025-09-01 | 15.8 | 10.4 | 290 | URL migration | | 2025-09-29 | 11.1 | 14.9 | 350 | Recovery | Both big drops fall in the weeks of your own changes, and both recovered within a month, so they look like Google re-evaluating the changed pages rather than lasting losses. Impressions fell with the position each time. Since October 2025 the keyword has held between 9 and 11, with no week moving 3 places. Outcome: You get a dated answer instead of a hunch: the week the keyword started slipping, how far it fell, whether impressions fell with it, and whether any of your own changes landed that week. If nothing lines up, you are most likely looking at normal movement and can stop worrying about it. Follow-up questions worth asking: - Ask search_analytics_archive for the same query and window grouped by page, to see whether Google switched which of your URLs ranks for it. - Run the same check on your top 20 queries to tell whether one keyword slipped or the whole site did. - Use compare_periods to see the change in clicks, impressions and position across all queries between two recent windows. Tools used: `historical_position_trend`, `search_analytics_archive`, `archive_status`, `compare_periods` Questions - Is Search Console's average position the same as my Google ranking? Not exactly. Search Console averages the position of your highest result over every real impression, across all locations and devices. A rank checker records one search from one place. Expect the two to differ, most of all for keywords whose results vary by location. - Why does Search Console show no position for a keyword I rank for? It only reports a position when your site got an impression, so a keyword nobody searched in the date range has nothing to average. Very rare searches are also anonymized and left out of the query list, and the report's table shows at most 1,000 rows, so long-tail keywords on bigger sites can fall off it. - How often does Search Console update keyword positions? Daily, with a delay. A day's data typically becomes available two to three days later, and the newest days in the chart can still be incomplete, so don't read much into them yet. - Can I get keyword ranking data older than 16 months? Not from Google. Once a day passes the 16-month mark, Search Console deletes it and no tool can bring it back. What you can do is start keeping it now, either with BigQuery bulk export or by connecting GSC PAP, which copies the 16 months Google still has and keeps every day after that. - Can Search Console track competitors' keyword rankings? No. It only reports on properties you own or have been given access to. To follow a competitor's positions you need a rank tracker or an SEO tool with its own ranking data. ### Google Search Console anonymized queries: measure the traffic you can't see URL: https://gscpap.com/guides/google-search-console-anonymized-queries Updated: 2026-09-18 Search Console hides anonymized queries from query rows but counts them in totals. Learn what they are, why no tool reveals them, and how to measure them. Pull every query row Search Console will give you, add up the clicks, and the sum comes up short of the total shown above the chart. For most sites, that gap is anonymized queries: real searches that led to your site, which Google counts but won't name. No tool can show you what those searches were. Google doesn't release the text in the interface, the API or BigQuery, and that includes GSC PAP. What you can do is measure how much of your traffic they account for, and plan your reporting around it. This guide covers both. What are anonymized queries in Google Search Console? Google's definition: an anonymized query is one that wasn't issued by more than a few dozen users over a two-to-three-month period. Search Console withholds the text of those queries to protect the privacy of the people who typed them, since a search almost nobody else makes could point back to the person who made it. The traffic itself is real. Those searches showed your pages and some of the searchers clicked. Search Console counts every one of those impressions and clicks; it just won't tell you which words were typed. Rare doesn't mean unimportant. Long, specific searches are individually rare, and together they can add up to a meaningful share of a site's traffic. Where anonymized queries are counted, and where they're missing The rule is simple once you know it: the words are always hidden, but the numbers are counted everywhere except in query rows and query filters. - Query tables: missing. Anonymized queries never appear as rows in the Performance report's Queries table or in Search Analytics API responses, and there is no "other" row that collects them. - Chart totals: counted. The total clicks and impressions above the chart include them. - Query filters: missing. Filter by query and they drop out of the totals too, so "queries containing brand" plus "queries not containing brand" adds up to less than the unfiltered total. - Page, country and device filters: counted. Only a query filter removes them from the chart total. - BigQuery bulk export: counted, without the words. Anonymized queries arrive as rows with an empty query field. Can you see anonymized queries in the API, BigQuery or another tool? No. The text of an anonymized query never leaves Google. The Search Analytics API leaves those rows out, BigQuery bulk export ships them with an empty query field, and every tool built on Search Console data, GSC PAP included, receives exactly what Google releases. What the API does give you is more of the queries Google is willing to name. The Performance report's table stops at 1,000 rows, while the API returns up to 25,000 rows per request and can page further. On a site with a long tail, that is thousands of named queries the interface never showed you. It is a real gain, and it is what accessing "more hidden Search Console data" can honestly mean, but none of those extra rows are anonymized queries. How to measure how much of your traffic is anonymized It takes one subtraction. Get the property's total clicks and impressions for a date range with no dimension selected. Then add up clicks and impressions across every query row for the same range. The difference is traffic from queries Google didn't name; divide it by the total to get your anonymized share. With GSC PAP this is one question to your AI assistant. get_performance_overview returns the property's true total for the period, and search_analytics_query returns the query rows, up to 25,000 per request, which the assistant sums and subtracts. Share of gscpap.com's Search Console traffic from anonymized queries - Impressions: 63% - Clicks: 98% gscpap.com, web search, May 2 to October 21, 2026: the property total minus the sum of every named query row. Our site is young and most of its visitors arrive through rare, long questions, which pushes the share up. It varies a lot between sites, so measure your own. - Use the API rather than the interface on anything but a small site. The Performance table stops at 1,000 rows, so past that point the sum falls short for a second reason. - Keep both numbers on the same property, date range and search type, and work out the share for clicks and impressions separately. - On very large sites, treat the result as an upper bound. The API returns at most 50,000 rows per day per site and search type, so part of the gap can be rows lost to that cap rather than anonymized queries. ![Search Console totals for the same three months, without a query filter and with a regex query filter that matches every query](https://gscpap.com/images/guides/google-search-console-anonymized-queries.webp) The same three months without a query filter, and with a Query filter that matches every query (1). Any query filter leaves out anonymized queries, so the gap between the two totals is your anonymized share, no API needed. Recreated with example data for a made-up site. What to do about anonymized queries You can't recover the words, but you can stop the gap from skewing your analysis. - Report traffic from totals, and label query reports as partial. Property and page totals include anonymized traffic. A query-level report describes only the named part, so say so and nobody will expect it to add up. - Measure the gap page by page. Filter the Performance report to one page (not to a query): its chart total still includes anonymized queries, while its Queries tab lists only the named ones. The pages with the biggest gap are the ones earning the most rare searches. - Treat the named queries as clues. The queries Google does show for a page are your best evidence of what the hidden ones are about, though they are not proof. - Track the share over time. Rerun the measurement every month, so a change in the share shows up as a trend rather than a surprise. - For row-level data at scale, use BigQuery bulk export. It isn't limited by the daily row cap and keeps anonymized rows with an empty query field, so you can count that traffic by day and by the other fields in the row. It needs a Google Cloud project with billing, only a property owner can set it up, and it exports only from the day you turn it on. Example prompt: Use the gsc-pap MCP. For https://example.com, measure how much of my search traffic comes from anonymized queries. For the last 28 days: (1) call get_performance_overview for the property's total clicks and impressions; (2) call search_analytics_query with dimensions ['query'] and row_limit 25000, paging with start_row until a page comes back empty, and sum clicks and impressions across all rows; (3) report the total, the named sum and the difference for clicks and impressions, with the difference as a percentage of the total. Then repeat for the 28 days before that and tell me whether the share moved. - Claude gets the property's true total: get_performance_overview asks Search Console for the period with no dimensions, which is the same total the Performance report shows above its chart. Anonymized queries are counted in it. - Claude pulls every named query: search_analytics_query returns query rows, up to 25,000 per call. If there are more, Claude requests the next page with start_row and keeps going until Google returns nothing. The interface would have stopped at 1,000 rows. - Claude does the subtraction: Claude sums the query rows, subtracts them from the total, and reports the gap for clicks and impressions separately, both as raw numbers and as a share of the total. - Claude compares the two periods: Running the same steps on the previous 28 days shows whether the share is steady or moving. If it jumped, Claude says which metric moved: the total, the named queries, or both. Outcome: You end up with two numbers to put next to your query reports: the share of clicks and the share of impressions that came from queries Google doesn't name. That settles the tracking question, tells readers how much of your traffic a query-level report can describe, and gives you a baseline to check against next month. Follow-up questions worth asking: - Run the same check for one page: ask Claude for the page's daily clicks with search_analytics_query (grouped by date, filtered to that page) and its named queries with get_search_by_page_query at a high row_limit, then compare the two sums. - Ask for the share month by month across the last 16 months to see whether it is stable for your site. - Keep query-level reports honest: label them as named queries only, and take the headline traffic number from get_performance_overview. Tools used: `get_performance_overview`, `search_analytics_query`, `get_search_by_page_query` Questions - Why don't my Search Console query clicks add up to the total? Because the total counts anonymized queries and the query rows don't. In the interface there is a second reason: the table shows at most 1,000 queries. On very large sites, Google's daily row limits can drop some rows as well. - Can the Search Console API show anonymized queries? No. The API applies the same privacy filter as the interface, so anonymized queries never come back as rows. It does return far more named queries than the interface: up to 25,000 rows per request instead of 1,000. - Does BigQuery bulk export include anonymized queries? It includes their clicks and impressions, as rows with an empty query field, but never the query text. It is also not limited by the daily row cap. It needs a Google Cloud project with billing and a property owner to set it up, and it only exports data from the day you turn it on. - Can GSC PAP reveal anonymized queries? No. GSC PAP reads Search Console through Google's API with read-only access, so it receives exactly what Google releases. What it can do is measure how much of your traffic is anonymized in one question, and return up to 25,000 named queries per request instead of the interface's 1,000. - Are anonymized queries bad for SEO? No. The anonymization happens in reporting, after the search. The impressions and clicks are real and count in your totals; you just can't see the words. If your anonymized share is large, lean on page totals (filter by page, not by query), which still include that traffic. ### Good position, no clicks: find the SERP features eating your CTR URL: https://gscpap.com/guides/low-ctr-at-good-position-serp-features Updated: 2026-10-19 Ranking third and getting no clicks usually means something sits above you: an AI Overview, a featured snippet or a map pack. How to check which, query by query. Search Console tells you your position and your CTR. It does not tell you what else was on the result page, which is the one thing that explains the gap between them. To see that you need the live SERP, and to see it for twenty queries at once you need it automated. GSC PAP exposes three tools for this: `serp_features_audit` checks up to 25 queries at a time for click-eating features, `serp_top_results` returns the live top organic results and the features present for one query, and `serp_competitor_analysis` shows where your domain sits and who is around it. Combined with your own Search Console numbers, this turns a guess into a short list. The point of the exercise is triage. Some underperforming queries are worth a title rewrite, some are worth restructuring the page to answer one question in one paragraph, and some are worth leaving alone because the click is never coming back. The audit tells you which pile a query belongs in. Why is my CTR low even though I rank on page one? Average position is measured against the other organic results, not against the page. Position 3 means two organic links are above you. It says nothing about the AI Overview, the featured snippet, the video carousel, the map pack, the shopping row or the four People Also Ask questions that may sit between the top of the screen and your link. On a crowded result page, position 3 can be most of a scroll away from the fold. So a low CTR at a good position is rarely a title problem first. It is usually a geometry problem: your link is fine, it is just not where the eye lands. Rewriting the title of a query whose answer is already being given in an AI Overview wins very little. Knowing which of the two you have is the whole diagnosis, and Search Console cannot tell you, because it does not report what else was on the page. A first web result that starts below the first screen Search: how to calculate customer churn rate 1. Sponsored: Two ads 2. AI Overview: Answers the question on the results page 3. People also ask: Questions that expand in place (Bottom of the first phone screen) 4. Your page (your result): The first web result 5. Videos: A carousel of three Illustrative layout. Which features appear depends on the query and the country; serp_features_audit reports them for your own queries. - An AI Overview can push the first organic result below the fold entirely. - A featured snippet answers the question in place, so only people who want more click through. - People Also Ask boxes expand in place and keep the visit on Google. - A map pack takes the top of the page for anything with local intent. - Sitelinks or a video carousel on a competitor's result enlarge their listing and shrink yours. What CTR should I expect at each position? There is no universal table, and anyone quoting one to two decimal places is selling something. What is reliable is the shape: clicks fall off steeply after the first two or three results, branded queries pull far higher rates than generic ones, and a result page carrying an AI Overview or a featured snippet produces fewer organic clicks at every position than a plain one. The useful comparison is internal, not industry-wide. Take your own queries at a similar position on the same site, and look at which ones underperform the rest. That difference is almost always explained by what else is on the result page, which is the thing you can actually go and check. ![Search Console Queries table filtered to positions under 4, with one query earning a far lower CTR than the others](https://gscpap.com/images/guides/low-ctr-at-good-position-serp-features.webp) Compare queries at a similar position on your own site. The highlighted query (1) ranks as well as the rest but earns a tenth of their CTR, so check what else is on its result page. Recreated with example data for a made-up site. Can I get my page into an AI Overview? Not directly, and nobody can sell you a place in one. What AI Overviews and AI assistants consistently do is quote pages that answer a specific question plainly, near the top, in the question's own words, on a page that is reachable and fast. That is the same work as earning a featured snippet, and the two overlap heavily. The practical move is to find which of your queries now carry an AI Overview, read what the Overview says, and check whether your page answers that exact question in a paragraph that could be lifted whole. If the answer on your page is buried under three sections of preamble, it will not be lifted. Example prompt: Use the gsc-pap MCP. For https://example.com, take my top 25 queries by impressions over the last 28 days where average position is between 1 and 10 but CTR is under 2%. Run serp_features_audit on those queries for country us. Give me a table of query, impressions, position, CTR and which SERP features are present. Then split the list into three groups: queries where an AI Overview or featured snippet is taking the answer, queries where the SERP is plain and the title is the likely problem, and queries with a map pack or shopping row where organic intent is weak. For the top three in the second group, suggest a new title and meta description. - It pulls the underperforming queries first: `search_analytics_query` with the query dimension gives clicks, impressions, CTR and position. The filter that matters is the combination: a good position with a bad CTR. A bad position with a bad CTR is a ranking problem and belongs in a different session. - Then it checks what the result page actually looks like: `serp_features_audit` takes the list and reports, per query, which features are present. This is live Google, in the country you name, not a cached snapshot, so it reflects what a searcher sees today. Country matters more than people expect: the same query can carry an AI Overview in one market and not in another. - It groups the queries by what you would do about them: The grouping is the deliverable. An AI Overview on an informational query means the page should answer that question in a liftable paragraph. A plain SERP with a low CTR means the title and description are genuinely underselling you. A map pack means the query has local intent you probably cannot serve. - And it looks at who is above you where it matters: For the handful of queries worth fighting for, `serp_competitor_analysis` returns the full top ten around your position. Reading the three results above you is usually faster than any amount of guessing about what Google wants for that query. Outcome: Instead of a list of twenty queries with disappointing CTR, you get three short lists with three different actions, and the confidence that the title rewrite you are about to do is aimed at a query where a title rewrite can still win the click. Follow-up questions worth asking: - Re-run the same audit in your second-biggest country; SERP features vary by market. - Check the queries that already convert well in GA4 first, with `correlate_gsc_to_ga4`, so the effort goes where a click is worth the most. - Save the prompt and re-run it monthly: AI Overviews appear and disappear on a query without warning. - For queries where a featured snippet is held by a competitor, read their answer paragraph with `serp_top_results` and see whether yours is longer and less direct. Tools used: `serp_features_audit`, `serp_top_results`, `serp_competitor_analysis`, `find_quick_wins`, `search_analytics_query` Questions - Why is my CTR low when I rank in the top 3? Usually because something above the organic results is answering the query: an AI Overview, a featured snippet, People Also Ask, a map pack or a shopping row. Position is measured against other organic links only, so a top-3 position on a crowded result page can still sit well below the fold. Check the live SERP for the query before you rewrite anything. - How do I check if a query has an AI Overview? Search it yourself in the right country, or check it in bulk. With GSC PAP, `serp_features_audit` takes up to 25 queries at once and reports which SERP features are present on each, including AI Overviews, featured snippets, People Also Ask and map packs. - Does an AI Overview reduce organic clicks? On queries where the Overview answers the question completely, yes, measurably. On queries where it summarises and the searcher still needs a tool, a price, a download or a specific page, the effect is much smaller. Which of those you have is a property of the query, which is why checking query by query beats reading a study about averages. - Should I rewrite titles for queries with low CTR? Only for queries where the result page is plain. A better title on a query whose answer is already being given above the fold moves very little. Spend the title work on the queries where the click is genuinely still available. ### Find the pages quietly losing organic traffic, before the rankings go URL: https://gscpap.com/guides/find-pages-losing-organic-traffic Updated: 2026-10-19 Content decay is slow enough to miss on a dashboard. How to find the pages whose clicks keep sliding, tell decay from seasonality, and decide what to refresh. Search Console will show you this if you ask it page by page, with the right two windows, for every page on the site. That is the part nobody does by hand. `find_content_decay` does the comparison across your pages and returns the ones that are actually sliding. This guide runs the scan, separates real decay from seasonality and SERP changes, and ends with a short ranked list of pages to refresh. If you have been connected long enough to have history past Google's 16-month window, the same scan can run over years instead of months, which is where seasonality finally becomes visible. What is content decay? Content decay is a page losing organic traffic gradually, over months, without anything obviously breaking. No penalty, no deindexing, no traffic cliff on a Tuesday. The page simply drifts from position 4 to 6 to 9 while newer pages, fresher data and more direct answers take its place, and the clicks fall a little every month. It is easy to miss precisely because it is slow. A dashboard showing the last 28 days against the prior 28 reports a 6% dip, which looks like noise. The same page across twelve months has lost half its traffic. By the time it shows up as a problem at site level, the recovery is a rewrite rather than a refresh. How do I tell decay from seasonality or a Google update? Three checks separate them. Compare the page with the same period last year, not just the prior month, because seasonal queries fall every year on schedule and recover on schedule. Check whether the drop is site-wide or page-specific: an algorithm update usually moves many pages at once, while decay picks off individual pages. And look at impressions next to clicks, because a page losing impressions is losing ranking, while a page holding impressions and losing clicks is losing the click to something else on the result page. That last distinction decides what you do next. Falling impressions means the page is being outranked and the content needs work. Steady impressions with falling CTR usually means the result page changed around you, not that your page got worse. - Clicks down, impressions down, position down: you are being outranked. Refresh the content. - Clicks down, impressions flat, position flat: the result page changed. Check the SERP features. - Clicks down and up again every year at the same time: seasonality, not decay. - Everything down on the same date across many pages: look at what changed on the site or in the index that week. ![Search Console Performance report comparing the last 3 months with the same period last year, with pages sorted by click difference](https://gscpap.com/images/guides/find-pages-losing-organic-traffic.webp) Compare year over year (1) and sort pages by Clicks Difference (2). Impressions tell the cases apart: /blog/interview-questions kept its impressions and lost clicks, /templates/okr-template lost both. Recreated with example data for a made-up site. Which decaying pages are worth refreshing first? Not the biggest drop. The biggest recoverable drop. A page that fell from 40 clicks to 10 on a query nobody searches any more is not coming back no matter what you write. A page that fell from 400 to 250 while its query volume held steady is worth an afternoon. Rank the candidates by what you would gain, not by what you lost: current impressions still arriving, how far the position slipped, and whether the page converts. A decaying page that still converts at 3% deserves attention before a higher-traffic page that converts at nothing. Example prompt: Use the gsc-pap MCP. For https://example.com, run find_content_decay over the last 6 months and give me the 10 pages losing the most clicks. For each one, show clicks, impressions and average position for the last 90 days against the same 90 days a year ago, using compare_periods. Mark which ones lost impressions (being outranked) and which ones held impressions but lost CTR (the result page changed). Then rank the 5 best refresh candidates by recoverable clicks, and for the top 3 list the queries they used to rank for and have slipped on. - The scan finds the sliding pages: `find_content_decay` compares each page's recent performance with its earlier performance and returns the ones trending down, rather than the ones that happen to be down this week. A page with one bad fortnight is noise; a page down in three consecutive windows is decay. - Year-over-year separates decay from seasonality: `compare_periods` against the same window last year is the check that saves you from rewriting a page that simply has a seasonal query. If last year shows the same dip on the same dates, the page is fine and the calendar is doing its job. - Impressions versus CTR says which kind of problem you have: The split matters: losing impressions is a ranking problem that content can fix, while holding impressions and losing clicks points at the result page. For the second group, a SERP feature audit is the next step, not a rewrite. - Then it names the queries you slipped on: `get_search_by_page_query` returns the query mix behind one page, so a refresh can be aimed at the queries that actually moved instead of being a general tidy-up of the prose. Example answer (Illustrative answer for a made-up example.com. Your queries and numbers will differ.) Prompt: Which pages are losing organic traffic, and which are worth refreshing first? Tool: `find_content_decay` (last 6 months, then compare_periods against the same 90 days a year ago) | Page | Clicks now | A year ago | Impressions | Position | Loss | |---|---|---|---|---|---| | /blog/remote-onboarding-guide | 250 | 400 | -29% | 4.3 to 7.9 | Outranked | | /blog/interview-questions | 310 | 540 | +2% | 2.1 to 2.3 | Lost CTR | | /templates/okr-template | 40 | 160 | -71% | 6.0 to 18.4 | Outranked | Refresh /blog/remote-onboarding-guide first: it still gets 71% of last year's impressions, but it slid from 4 to 8 as newer pages outranked it, so the clicks are recoverable. /blog/interview-questions kept its impressions and position and lost clicks anyway, so the result page changed around it; run a SERP feature audit before touching the copy. /templates/okr-template fell off page one and comes last. Outcome: A ranked shortlist of pages worth refreshing, each with the reason it is on the list and the queries it lost, instead of a vague sense that the blog is not doing as well as it used to. Follow-up questions worth asking: - Run the same scan restricted to the pages that convert in GA4, using `correlate_gsc_to_ga4`, so refresh effort follows revenue. - For pages that held impressions but lost CTR, audit the SERP features on their main queries before rewriting anything. - After a refresh, set a reminder to compare the next 28 days with the 28 before the change, so you learn whether refreshes work on this site. - If a page has decayed past recovery and a newer page covers the same ground, consider consolidating them and checking for cannibalization first. Tools used: `find_content_decay`, `compare_periods`, `get_search_by_page_query`, `historical_position_trend`, `search_analytics_archive` Questions - How do I find pages losing traffic in Google Search Console? Compare each page's recent clicks with its earlier clicks over a long enough window, which Search Console will do one page at a time. To do it across the whole site at once, use a tool that runs the comparison for you: with GSC PAP, `find_content_decay` returns the pages trending down, and `compare_periods` checks any two windows side by side. - How long does content decay take to show up? Usually months. That is why month-on-month dashboards miss it: a 5% monthly slide reads as noise and compounds into half the traffic over a year. Comparing against the same period a year earlier makes it obvious, provided you still have the data, which Search Console only keeps for about 16 months. - Should I refresh or rewrite a decaying page? Refresh when the page still ranks and still matches what people search for: update the facts, dates and examples, and answer the queries it slipped on more directly. Rewrite when the search intent behind the query has moved on, or when the page was built for a query nobody uses any more. - Is a traffic drop always content decay? No. Check three things first: whether the drop repeats every year at the same time (seasonality), whether many pages moved on the same date (an update or a site change), and whether impressions fell with the clicks (a ranking loss) or stayed flat (a result-page change). Only the slow, page-specific, impression-losing kind is decay. ### Traffic changed: how to compare two Search Console periods and find out why URL: https://gscpap.com/guides/compare-search-console-date-ranges Updated: 2026-10-19 Clicks are down 18% and nobody knows why. How to compare two periods properly, avoid the three traps that fake a drop, and find the queries and pages behind it. A period comparison is only useful if it ends in a cause. This guide runs one comparison properly, checks the three traps that fake a drop, then drills from the site total into the queries and pages that actually moved, and finally checks whether the change reached conversions in GA4. The tools are `compare_periods` for the Search Console diff, `ga4_compare_periods` for the same two windows in Analytics, and `historical_position_trend` for the queries that look like they moved for ranking reasons. How do I compare two date ranges in Google Search Console? Search Console has a comparison mode in the date picker, and it works well for one dimension at a time: queries, or pages, or countries. What it does not do is tell you which of those explains the change. You end up exporting both windows and lining them up in a spreadsheet, which is the part people stop doing after the second time. A tool that holds both windows at once can do the subtraction for you across every dimension and return only the rows that moved. With GSC PAP that is `compare_periods`: any two windows, diffed by query, page or country, with the gains and losses ranked. ![Search Console date range dialog on the Compare tab with Compare last 28 days year over year selected](https://gscpap.com/images/guides/compare-search-console-date-ranges.webp) The Compare tab (1) of the date picker. Year over year (2) keeps seasonality out of the comparison. Three traps that make a normal week look like a crash Most reported drops are one of these three, and all three are avoidable before you alarm anybody. - Incomplete days. Search Console data settles over about three days, so a window that ends today always undercounts. End both windows at least three days before today, and make them the same length. - Mismatched weekdays. A 28-day window against a 30-day window compares four weekends with five. Compare equal numbers of weeks, aligned to the same weekday. - Seasonality read as decline. Many query sets fall every year in the same month. Compare year over year as well as month over month before concluding anything. Did the traffic move, or did the measurement move? Before investigating a drop, check whether anything about the property changed. A domain property and a URL-prefix property for the same site report different totals, so a dashboard that silently switched between them shows a cliff that never happened. A site migration, a canonical change or a country split does the same thing. The quick check is whether impressions moved with the clicks. A drop in clicks with impressions unchanged is a result-page or CTR story. A drop in both is a ranking or indexing story. A drop in both that starts on an exact date, across most pages, is usually something that happened to the site rather than to the market. Example prompt: Use the gsc-pap MCP. For https://example.com, compare the last 28 complete days (ending 3 days ago) with the prior 28 days using compare_periods, and also with the same 28 days a year ago. Give me the site totals first, then the 15 queries and 15 pages with the biggest click changes in both directions. Flag whether impressions moved with the clicks. For the 5 biggest query losses, show the position trend over the last 90 days with historical_position_trend. Then run ga4_compare_periods on the same windows for organic sessions and conversions, and tell me whether the change reached conversions or stopped at clicks. - Totals first, so you know the size of the thing: `compare_periods` returns clicks, impressions, CTR and average position for both windows and the delta. Reading the four together already narrows the diagnosis: clicks and impressions falling together is ranking, clicks alone is CTR, position improving while clicks fall is usually a mix shift towards queries with less volume. - Then the rows that moved, in both directions: Losses alone are misleading. A site can lose 400 clicks on one query, gain 350 on another and be fine. Ranking the gains next to the losses shows whether traffic moved or disappeared. - A year-over-year window as the control: The same two windows a year apart tell you whether this is a pattern. If you connected recently, Google's 16-month limit may be the constraint; an archive that has been running longer answers it anyway. - Then check whether it reached the business: `ga4_compare_periods` on the same dates says whether the click change became a session and conversion change. A click drop that does not reach conversions is often queries that never converted, which changes how urgent this is. Example answer (Illustrative answer for a made-up example.com. Your queries and numbers will differ.) Prompt: Compare the last 28 complete days with the 28 before and with the same days last year. Is the drop ranking or CTR, and did it reach conversions? Tool: `compare_periods` (28 days ending 3 days ago, against the prior 28 and the same 28 a year ago) | Metric | Last 28 days | Prior 28 days | Change | Year over year | |---|---|---|---|---| | Clicks | 12,480 | 13,950 | -10.5% | +4.2% | | Impressions | 402,000 | 405,300 | -0.8% | +9.1% | | CTR | 3.10% | 3.44% | -0.34 pt | -0.15 pt | | Average position | 8.4 | 8.3 | +0.1 | -0.6 | Clicks fell 10.5% while impressions held, so this is a CTR story, not rankings. Most of it is one query: "pricing calculator" lost 1,140 clicks at an unchanged position, which points at the result page, so a SERP feature audit is the next step. Year over year you are still up 4%, and GA4 shows organic conversions flat, so the drop stopped at clicks. Outcome: A one-paragraph answer with numbers behind it: what changed, where it changed, whether it is ranking or CTR, whether it happened last year too, and whether it touched conversions. Good enough to reply to the dashboard screenshot the same hour. Follow-up questions worth asking: - Save the prompt with your own property and GA4 id, and re-run it whenever a number moves. - If the losses are concentrated on one page, pull that page's query mix before touching the content. - If positions held and CTR fell, audit the SERP features on those queries. - Run the same comparison on the country dimension if you sell in more than one market; one market moving can carry the whole total. Tools used: `compare_periods`, `ga4_compare_periods`, `historical_position_trend`, `search_analytics_query`, `detect_duplicate_properties` Questions - Why do my last few days of Search Console data look low? Search Console data takes roughly three days to settle, so the most recent days are always incomplete and always look like a decline. End both of your comparison windows at least three days before today. - How far back can I compare in Search Console? About 16 months, after which Google deletes the older data permanently. Year-over-year comparisons work while the earlier window is still inside that limit. To compare beyond it you need your own stored copy, which is what the GSC PAP archive keeps from the day you connect. - Clicks dropped but impressions did not. What does that mean? You are still ranking and still being shown, and fewer people are clicking. That points at the result page rather than your rankings: an AI Overview, a featured snippet or a competitor's richer listing. Check the SERP features on the affected queries before rewriting the pages. - Was it a Google update or something I did? Updates tend to move many pages across a site within a few days, and affect sites of a similar kind at the same time. A change you made tends to start on an exact date and to concentrate on the pages or templates you touched. Comparing the date the change starts with your own deploy history settles it faster than any ranking tracker. ### AI queries in Google Search Console: how to tell people, AI Mode and agents apart URL: https://gscpap.com/guides/ai-queries-in-google-search-console Updated: 2026-10-25 Search Console mixes AI Mode follow-ups, AI agent searches and scripts into your query report. How to spot each one, with regex filters and real data. Search Console has never said where a query came from, and for years it didn't need to: a query was something a person typed into Google. In 2026 the same report also holds follow-up questions from AI Mode conversations, searches an AI assistant ran on someone's behalf, and the odd script. They all arrive as plain rows in the Queries table. We sorted every query our own site received between May 2 and October 21, 2026 into five groups by their shape. This guide shows what each group looks like, with real examples, the regex filters that find them, what they do to your CTR and average position, and where the same visits show up in Google Analytics 4. Every number here comes from gscpap.com, our own property, so you can follow the method end to end before running it on yours. One caution before the numbers. Our site is about AI tools for SEO, a topic AI assistants research all the time, so we see more agent activity than most sites will. The method carries over; the percentages won't. Does Search Console show AI queries? Yes, but without labels. Google's John Mueller has said that Search Console includes AI Overviews and AI Mode in the general Performance report, and that someone who asks a follow-up question in AI Mode is "essentially performing a new query", with that response's impressions, position and clicks counted against the new query. Nothing in the report marks which rows those are. Searches made by other AI assistants can appear too. When an assistant runs a Google search to answer someone, your page can earn an impression from it like from any other search. In November 2025 this became hard to miss, when whole ChatGPT prompts began showing up as queries in some sites' reports; OpenAI said it had fixed a glitch affecting a small number of searches. A search an assistant runs through a different engine never reaches Search Console at all. The generative AI performance reports Google began rolling out in June 2026 break AI visibility down by page, country, device and date, but not by query. So the query text is still the only place to look, and reading it means inferring where a query came from by its shape. Nothing below is a label Google provides. It is pattern matching you can check row by row. Five kinds of searcher in one query report Sorted by shape, the queries on our site fell into five groups. The examples are verbatim from our report. | Group | What it looks like | Example from gscpap.com | Who is behind it | |---|---|---|---| | Short keyword queries | One to five words: a topic, maybe a modifier | google search console historical data | Mostly people searching the classic way | | Long natural-language queries | Six or more words that read like a sentence or a spoken question | what is the difference between ga4 sessions and gsc clicks | People typing full questions, or the opening question of an AI Mode conversation. The two look the same | | Conversational follow-ups | Means nothing without the turns before it; no topic word at all | there must be a way | A follow-up inside an AI Mode conversation, which Google counts as a query of its own | | Agent-written queries | Instructions, templates, fragments of documents, rephrased variants ending in "official" | which tools detect cannibalization across posts and suggest which article to merge or redirect? explain how recommendations are generated. | An AI assistant searching Google to complete a task for its user | | Automated queries | Numbered queries, placeholders, code identifiers, search operators | 12161: how to track keywords | Scripts: test sets run through a search tool, scrapers, index checks | The groups are defined by the regex patterns further down, applied from the bottom of this table up: automated first, then agent-written, then follow-ups, then word count. What the five groups looked like on our own site Search Console names only part of a site's queries, and only named queries can be classified. On our site, between May 2 and October 21, 2026, the named queries covered 37% of impressions and about 2% of clicks. Nearly every click came from a query Search Console does not show, and that is worth keeping in mind through everything that follows. Within the named queries, the groups split like this: | Group | Share of named queries | Share of named impressions | Median position | Queries in the top 10 | |---|---|---|---|---| | Short keyword queries | 64% | 48.1% | 58 | 12% | | Long natural-language queries | 15% | 43.2% | 79 | 6% | | Conversational follow-ups | 1% | 0.1% | 4 | 100% | | Agent-written queries | 12% | 6.2% | 23 | 42% | | Automated queries | 8% | 2.5% | 18 | 25% | gscpap.com, Search Console API, web search, May 2 to October 21, 2026. Median position is the median of each query's average position. Agent-written queries, share of named impressions by month - May: 0.6% - June: 4.9% - July: 4.7% - August: 6.6% - September: 11.3% - October: 7.8% gscpap.com, Search Console API. May starts on the 2nd, October ends on the 21st. - Agent-written queries were 6.2% of named impressions over the whole period, and their share grew: under 1% in May, about 5% in June and July, 7% in August, 11% in September and 8% in the first three weeks of October. - They ranked far better than everything else. 42% of agent-written queries showed our page in the top 10, against 12% of short queries. A query with five requirements in it matches very few pages, and one specific guide is often the best of them. - Every conversational follow-up ranked 3 or 4, and one of them produced a click. - Agent-written and automated queries together were 8.7% of named impressions, and earned no clicks at all. Conversational follow-ups: queries with no topic in them These queries on our site contain no word about Search Console, analytics or SEO. Each one still showed one of our pages near the top. | Query | Position | Page it showed | |---|---|---| | there must be a way | 4 | Our guide to anonymized queries in Search Console | | is it free to use? | 3 | Our FAQ on whether GSC PAP is free | | i want to do it for free | 4 | Our home page | gscpap.com, Search Console API, May 2 to October 21, 2026. - Google could only have matched these to our pages using the earlier turns of a conversation. That fits Mueller's description of AI Mode, where a follow-up is a new query that carries the conversation with it. - "there must be a way" reads like a reply to being told that anonymized queries can't be recovered, which is exactly what the page it surfaced explains. - You can't target these words, and shouldn't try. What they tell you is which page ended up answering a conversation. Treat them as a signal about that page, not as keywords. - Most follow-ups are probably too rare for Google to name, so the few you can see are a floor, not a count. Agent-written queries: what an AI searching for its user looks like These are the clearest sign of an assistant at work: queries no person would type, because they still carry the machinery of the task. On our site they came in five recognizable shapes. | Shape | Example from gscpap.com | What gives it away | |---|---|---| | Prompt scaffolding | context: location: united states (not for language). do not include location references in your response. question: which is more reliable for finding cannibalization ... | Instructions meant for the model were sent as the search | | Research briefs | compare options that merge ga and gsc to map keywords to landing pages and reclaim hidden traffic drivers, and show what connectors are required. | A whole task with deliverables, phrased as an instruction | | Rephrased bursts | google search console performance report data retention 16 months official | Six reorderings of the same words, each with "official" added, on 15 days between June 5 and July 2 | | Working documents | keyword,category,current position,previous position,position trend,last 3mo clicks ... | A spreadsheet header, searched on 36 days between July 15 and October 20 | | Plan headings | b. quick wins ... gsc striking distance (already ranking positions 11-30, snapshot 2026-07-13) | An outline heading with a fixed snapshot date, searched on 42 days between August 26 and October 21 | Examples ending in ... or containing ... are shortened; the rest are verbatim. - None of the agent-written queries produced a click. An agent reads the results and fetches what it needs instead of clicking through like a person, so these queries add impressions without adding visits. - The repeats are worth noticing. A heading with a fixed snapshot date, searched on 42 different days, looks like a scheduled agent rerunning the same research. Somewhere there is likely a recurring report about striking-distance keywords whose research step keeps landing on our quick wins guide. - Read them as briefs. The research brief above is a spec for a page: combine GA4 and Search Console, map keywords to landing pages, list the connectors required. It showed our anonymized queries guide at position 6, which covers only the hidden traffic. Our guide that joins Search Console and GA4 page by page did not appear, and at the time it did not compare the ways to combine the two or say what each one needs. In October 2026 we added that section to it. - When a page does answer every clause, it wins. The cannibalization question in the first table ranked our cannibalization guide at position 1. Automated queries: test sets, scrapers and index checks The last group is neither people nor AI assistants. These queries come from scripts, and they look like it. - Numbered queries: "12161: how to track keywords", "12197: keyword rank change", "15627: keyword tracking" and five more with five-digit prefixes, all about rank tracking, on and off from May to October. That is a numbered list of questions being run through a search tool, most likely an evaluation or test set. - Placeholders: "keyword2692" and "keyword-papsbzvc", the kind of value a template fills in before anyone replaces it. - Dataset names: "gooaq?" shares its name with GooAQ, a public research dataset of questions collected from Google. - Footprints: "gsc-cursor-current-page" and "gsc.page" are a class name and a URL fragment from Google's Programmable Search element. Searching for them finds sites that embed it, and we matched on the letters gsc. - Index checks: site: searches, from people or tools checking what Google has indexed. - Exclude this group from CTR, position and keyword research. It tells you nothing about demand. Regex filters that find each group in Search Console In Search Console, open Performance, then Search results, add a Query filter, choose Custom (regex) and paste one of the patterns below. The filter uses RE2 syntax and matches anywhere in the query unless you anchor it with ^ or $. Queries in the report are lowercase, and so are the patterns. Apply them in order, because they overlap: a sentence an agent wrote can start with "no " and look like a follow-up. Mark automated queries first, then agent-written ones, then follow-ups, and sort whatever is left into long and short by word count. We tested every pattern against the Search Console API on October 25, 2026. 1. Automated queries: Numbered queries, placeholders, dataset names, search operators and quoted code identifiers. Add the footprints you find on your own site. ```regex (^\d{3,6}: |^keyword[-0-9]|gooaq|^(site|inurl|intitle):|"[a-z]+-[a-z-]+") ``` 2. Agent-written queries: Prompt scaffolding, instructions, "official" added to a query, outline numbering, comma-separated lists and site: operators written with a dot. It catches the shapes we saw; extend it with the ones you see. ```regex (context:|question:|do not include|explain how|compare options|\bofficial\b|snapshot \d{4}|^[a-z]\. |[a-z],[a-z]|^site\.) ``` 3. Conversational follow-ups: Queries that open the way a reply does. Expect false positives, such as product names that start with "it", and read the matches before you count them. ```regex ^(i |i'm |im |is it |there |yes|no |ok |can you |what about |and |but |it |this |that ) ``` 4. Long natural-language queries: Six words or more. Change the 5 to 9 for ten words or more, a common cutoff for conversational searches. ```regex ^(\S+\s+){5,}\S+$ ``` - To get a group's share, compare its filtered totals with the totals for a filter that matches every query, such as .*, not with the unfiltered totals. Any query filter drops anonymized queries, so the unfiltered total is the wrong denominator. - The patterns describe shapes, not origins. Read the matches before you report a number. - In the Search Analytics API, the same patterns go into a dimension filter with the includingRegex operator. ![Search Console Query filter dialog set to Custom (regex) with a pattern that matches queries of six words or more](https://gscpap.com/images/guides/ai-queries-in-google-search-console.webp) Add a Query filter, choose Custom (regex) (1) and paste a pattern (2), here pattern 4 for six words or more. What these queries do to your CTR and average position Each group pulls your averages in a different direction, so a site with a growing share of AI-shaped queries can watch its metrics move while nothing changes for the people who visit. - CTR falls. Agent-written and automated queries earn impressions and almost never clicks. On our site they were 8.7% of named impressions with no clicks at all. Take them out before you compare CTR across months. - Average position improves on paper. Agent-written queries ranked well (a median of 23, against 58 for short queries), so they pull the average up while bringing no visitors. - Impressions grow without visits. When impressions rise and clicks stay flat, check how much of the rise comes from these two groups before blaming titles or AI Overviews. - The visible part is a floor. Long, unique questions are exactly the ones Google anonymizes. On our site, named queries covered 37% of impressions and about 2% of clicks, so any share you measure from named queries understates how much AI-shaped searching reaches you. The rest of the trail: server logs and GA4 An impression in Search Console is only the first footprint an AI answer leaves. When an assistant decides to read your page, its fetcher requests the page from your server. When the person reading the answer clicks the source link, Google Analytics records a visit. Each footprint lives in a different tool, and none of them sees the whole trail. | Where | What it records | What it misses | |---|---|---| | Search Console | Google searches that showed your page, including AI Mode and agents searching Google | Searches made through other engines, and most long, rare queries, which are anonymized | | Server or CDN logs | Fetches by AI user agents: ChatGPT-User and OAI-SearchBot (OpenAI), Claude-User and Claude-SearchBot (Anthropic), Perplexity-User and PerplexityBot (Perplexity) | The question that triggered the fetch, and whether anyone read the answer | | Google Analytics 4 | People who clicked through from an assistant, in the AI Assistant channel | Bot fetches, which never run the tracking script, and visits that arrive without a referrer | Training crawlers such as GPTBot and ClaudeBot show up in logs too. They collect pages for model training, not to answer a particular question. How many visits AI assistants send, measured in GA4 In May 2026 Google Analytics added an AI Assistant channel to the default channel group. When a session's referrer is a recognized assistant, GA4 sets the medium to ai-assistant and files the session under that channel, with no setup. On our property it changed the picture fast. From April 28 to October 24, 2026, AI assistants sent almost as many sessions as Google organic search. From October 1 to 24 they sent nearly four times as many. | Assistant | Share of assistant sessions | Filed under AI Assistant | |---|---|---| | ChatGPT | 58% | 82% | | Claude | 38% | 100% | | Perplexity and Gemini | 4% | 67% | | All assistants | 100% | 88% | gscpap.com and app.gscpap.com share one GA4 property. April 28 to October 24, 2026. - The channel caught 88% of assistant sessions. The ones it missed were ChatGPT sessions from May, before the channel existed, which stayed under Referral and Unassigned, and Perplexity sessions that arrived with a utm_source but no medium. Search sessionSource for chatgpt, perplexity, claude, gemini and copilot to find yours. - Clicks from AI Overviews and AI Mode come from Google's own results page, so they sit in Organic Search with everything else, not in AI Assistant. Search Console is the only place they can be told apart, and only by the shape of the query. - Assistant visitors arrived closer to signing up. They landed on our home page, the sign-in page, the setup guide for Claude connectors and the pricing page, while Google organic visitors landed on the home page and the guides. 58% of assistant sessions were engaged against 56% from Google organic, with 2.4 pages per session against 1.4. What to do with AI queries in your Search Console data None of this needs new tracking. It needs a monthly habit and a few changes to how you read the reports. - Measure the groups every month. Run the four filters, write down impressions and clicks per group, and watch the agent-written line. It is the most direct evidence that assistants are researching your topic. - Report CTR and position without the automated and agent-written groups, and say in the report that you did. - Read agent-written queries as briefs. Each one lists what an assistant was asked to find. Check which of your pages it showed and whether that page answers every clause. If it answers half, that is the page to extend. - Write for the requirements, not only the keyword. The queries that ranked us highest carried requirements: which tool, how its recommendations are generated, what connectors are needed. Pages that state how something is computed, what it requires and how the options compare are the ones that match. - Don't chase the wording of follow-ups. Improve the page the conversation landed on. - Check that your CDN or bot protection isn't blocking the fetchers you want. Some security settings block AI agents by default, and an assistant that can't fetch your page answers without it. - Look at the landing pages of AI Assistant sessions in GA4. They show which of your pages assistants cite when they send someone your way. Limits of this method Shape-based classification is useful, and it is easy to overstate. Keep these in view when you report on it. - It is inference. Search Console doesn't record where a query came from. The groups describe shapes, and some people write long, formal queries too. - It sees only named queries. Most long and unique queries are anonymized, so every share here is a share of what Google chose to name. - One site is not a benchmark. Ours is about AI tools for SEO, which assistants research constantly. Expect the method to transfer and the percentages not to. - The patterns will age. Agents change how they search, so when the shapes in your report change, update the patterns. - Queries can contain other people's words. In 2025 some leaked prompts in Search Console included personal details. We quote only queries without personal or company information, and shortened three of them. Example prompt: Use the gsc-pap MCP. For sc-domain:example.com, last 90 days: 1) Call search_analytics_query with dimensions ["query"] and row_limit 25000, paging with start_row until a page comes back empty. 2) Classify every query in this order. Automated if it matches (^\d{3,6}: |^keyword[-0-9]|gooaq|^(site|inurl|intitle):|"[a-z]+-[a-z-]+"). Agent-written if it matches (context:|question:|do not include|explain how|compare options|\bofficial\b|snapshot \d{4}|^[a-z]\. |[a-z],[a-z]|^site\.). Follow-up if it matches ^(i |i'm |im |is it |there |yes|no |ok |can you |what about |and |but |it |this |that ). Long if it has six or more words. Short otherwise. 3) For each group, report queries, impressions, clicks, CTR, impression-weighted position and share of named impressions, with the ten biggest queries. 4) Call get_performance_overview for the same range and tell me what share of total impressions and clicks the named queries cover. 5) Call list_ga4_properties, find this site's property, then call ga4_traffic_sources with dimension "channel" and again with "source". Report AI Assistant sessions, and any chatgpt, perplexity, claude, gemini or copilot sessions filed under another channel. - Claude pulls every named query: search_analytics_query returns up to 25,000 query rows per call, and Claude keeps paging until Google has nothing left. The Performance report would have stopped at 1,000. - Claude sorts them into five groups: The patterns run in order, so a sentence an agent wrote is never counted as a follow-up just because it starts with "no". Claude lists the matches per group, which is where you catch a false positive. - Claude measures what each group does to your numbers: Impressions, clicks, CTR and position per group show whether the CTR drop sits in the agent-written and automated groups or in the queries people type. - Claude puts the named share in context: get_performance_overview returns the property's total, anonymized queries included. The share of it that named queries cover tells you how much of the picture the classification can see. - Claude checks the visits: The AI Assistant channel in GA4 shows the visits assistants sent. Claude then looks for assistant referrers under Referral and Unassigned, which the channel doesn't catch. Outcome: You get a monthly breakdown of your Search Console queries by who most likely made them, a CTR and position you can compare across months without agents and scripts mixed in, and the number of visits AI assistants actually sent. If the agent-written group is growing, you also get the list of briefs assistants are researching on your topic. Follow-up questions worth asking: - Ask for the agent-written queries with dimensions ["query", "page"] to see which page each one showed, and whether that page answers every part of the brief. - Run the same classification on the 90 days before and compare the agent-written share. - Ask for GA4 landing pages filtered to the AI Assistant channel to see which pages assistants send people to. - Report branded queries separately before you classify, so your own name doesn't blur the short and long groups. Tools used: `search_analytics_query`, `get_performance_overview`, `get_search_by_page_query`, `ga4_traffic_sources` Questions - Can Search Console tell me which queries came from AI? No. Search Console has no field for where a query came from. AI Mode and AI Overviews are counted in the standard Performance report as ordinary queries, and searches other assistants run on Google look like any other search. You can only infer the origin from the shape of the query, which is what this guide does. - Are AI Mode searches included in Search Console? Yes. Google has said AI Mode is included in the general Performance report, and that a follow-up question in AI Mode counts as a new query with its own impressions, position and clicks. The generative AI reports Google began rolling out in June 2026 don't include query data. - Why do AI agent queries get impressions but no clicks? An agent reads the results and fetches the pages it needs directly. It doesn't click through the results page the way a person does, so the search counts as an impression for your page, and the visit, if there is one, shows up as a bot request in your server logs rather than as a click. - Do ChatGPT searches show up in Search Console? Some searches AI assistants make show up as Google searches, and in 2025 whole ChatGPT prompts appeared as queries on some sites until OpenAI fixed what it called a glitch. A query in your report doesn't tell you which assistant made it, and searches an assistant runs through another search engine never reach Search Console. - How do I see ChatGPT traffic in Google Analytics 4? Use the AI Assistant channel in the default channel group, which GA4 added in May 2026. Then search sessionSource for chatgpt under Referral and Unassigned: sessions from before the channel existed, and visits tagged with a utm_source but no medium, stay outside it. - Should I exclude AI queries from my SEO reports? Exclude automated queries everywhere, and report agent-written queries separately. Keep them in your keyword research, though: an agent-written query is a precise description of what someone asked an assistant to find. ## Frequently asked questions ### Do I need a Google Cloud project to use GSC PAP? URL: https://gscpap.com/faq/do-i-need-a-google-cloud-project Category: Setup Updated: 2026-09-18 No. The whole reason GSC PAP exists is to remove the Google Cloud setup step. When you sign in with Google through gscpap.com, you grant permission to our OAuth client (which we registered with Google one time). We then call the Search Console API on your behalf using your refresh token. You never touch the Google Cloud Console. If you were running an MCP server yourself, you would need to create a GCP project, enable the Search Console API, create OAuth 2.0 credentials, download a JSON file, distribute it across machines, manage refresh token rotation, and re-authenticate every time the token expires. That setup typically takes 30-45 minutes the first time and breaks in confusing ways when something rotates. GSC PAP handles all of that for you. You sign in with Google, copy a single bearer token, paste it into Claude Desktop, Cursor, or Claude Code, and start asking questions. Total time from first visit to first query is around 60 seconds. ### Which AI clients support GSC PAP? URL: https://gscpap.com/faq/which-ai-clients-are-supported Category: Setup Updated: 2026-09-18 GSC PAP is exposed as an MCP (Model Context Protocol) server. Any AI client that speaks MCP can connect. We have setup guides for Claude Desktop, Cursor, Claude Code (the Anthropic CLI), Claude.ai Connectors, OpenAI Codex CLI, VS Code with GitHub Copilot, Gemini CLI, Windsurf, Zed, JetBrains AI Assistant and Continue, plus direct HTTP for custom agents. See /integrations for each one. The Model Context Protocol is an open standard published by Anthropic in late 2024. It lets AI assistants call external tools through a uniform JSON-RPC interface, with the server advertising what tools it has and the client invoking them as the conversation needs them. Any new AI client that adds MCP support will work with us automatically - no changes on our side. If your client only supports stdio-mode MCP (an older transport), you can wrap our HTTP endpoint with a small bridge such as mcp-proxy. As more clients add MCP support, we add setup guides for them once they reach a usable state. ### How do I add GSC PAP to Claude Desktop, Cursor, or Claude Code? URL: https://gscpap.com/faq/how-to-add-to-claude-cursor-claude-code Category: Setup Updated: 2026-09-18 The flow is the same for all three clients: sign in with Google at gscpap.com, copy the bearer token shown on the connect screen, then paste a JSON config or run a single CLI command in your AI client. Total time about 60 seconds, all from the same web page. For Claude Code, run a single claude mcp add command; the connect screen generates it with your token already filled in. For Cursor, add a url and headers entry to ~/.cursor/mcp.json. Claude Desktop is different: its config file only accepts servers it starts as a local command, so the connect screen gives you a claude_desktop_config.json that runs the mcp-remote bridge through npx (Node.js required). Put it at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows, then restart the app. Each client has a step-by-step guide under Integrations. If you ever lose the token, you can mint a new one anytime from /account/tokens. Existing tokens stay valid (multi-bearer model), so you can rotate without breaking other clients. To revoke a specific token without affecting others, click revoke next to it in the same page - the rest keep working. ### What Search Console data can GSC PAP access? URL: https://gscpap.com/faq/what-data-does-gsc-pap-access Category: Privacy & Security Updated: 2026-10-27 GSC PAP requests the webmasters.readonly OAuth scope - the same read-only level you would grant to any third-party Search Console viewer. Specifically we can read your verified site list, search analytics (clicks, impressions, CTR, position by query, page, country, device, date), sitemap submission status, and URL inspection results. This is exactly the data you see in your own Search Console UI. It also has the same gaps: Google leaves anonymized queries out of query rows in both the UI and the API, so GSC PAP cannot reveal them either. If you also connect Google Analytics, GSC PAP holds the analytics.readonly scope as well, and any Analytics data it keeps for you follows the same rules as your archive. We cannot write, modify, or delete anything in your Search Console: not sites, not sitemaps, not indexing requests, not anything. The OAuth scope we request technically excludes write operations, so even if our service were compromised, an attacker could not change your Search Console state. The worst case is read-only data exposure - which is why we encrypt every refresh token at rest with AES-256-GCM. Beyond what Google provides natively, GSC PAP keeps a Personal Archive of your data. When you sign in it automatically copies the 16 months Google still has for every property you can read, then adds each new day, so your history keeps growing past Google's 16-month window. Your archive is private to your account; no other GSC PAP user can see it. See our Privacy Policy for the full storage and retention details. ### Can other users see my data? URL: https://gscpap.com/faq/can-other-users-see-my-data Category: Privacy & Security Updated: 2026-10-27 No. Your Search Console data, OAuth tokens, MCP sessions, archive, and tool call history are all isolated to your user account in our database. Every query passes through bearer-token authentication that resolves to a specific user, and every database query scopes results by user_id. There is no UI, API endpoint, or feature that exposes one user's data to another user. This isolation is enforced at multiple layers: row-level filtering in every Postgres query, application-layer middleware that fails closed if user_id is missing from a request, and rate limits scoped per-user so one user's traffic cannot affect another's quota. The Personal Archive uses partitioned tables but the partition key is date, not user - rows from all users coexist physically but are filtered logically by user_id on every read. The one exception is the operator (us), and it is narrow. A person on our side looks at an individual account's data only for support you asked for, to investigate a bug or abuse, or when the law requires it, and every such access is written to an audit log with the reason. Otherwise we work only with aggregates that identify no account. We never sell your data, and never use it to train AI models. If you delete your account, your data is deleted within 30 days of the request. The Privacy Policy has the details. ### How do I revoke access? URL: https://gscpap.com/faq/how-to-revoke-access Category: Privacy & Security Updated: 2026-09-18 You have three independent ways to revoke. First, revoke a single MCP token from /account/tokens - this kills only that bearer, leaving other tokens (e.g. on different machines) working. Useful if you suspect one token has been exposed but want to keep using GSC PAP elsewhere. Second, revoke the entire Google OAuth grant from your Google Account at myaccount.google.com/permissions - this severs our ability to call the Search Console API at all, even with a valid bearer. Useful if you want to cut us off completely without deleting your account. Third, delete your account from /account/profile (Danger zone). This is the nuclear option: every MCP token is revoked, the Google OAuth grant is revoked at Google's side, your encrypted refresh token is marked revoked in our database, and a 30-day soft-delete grace period begins. After 30 days everything is hard-deleted including your Personal Archive. The grace period exists so you can recover an accidentally deleted account by signing in again before the timer expires. ### Is GSC PAP free? What are the limits? URL: https://gscpap.com/faq/is-gsc-pap-free Category: Limits & Pricing Updated: 2026-09-18 Yes, GSC PAP is completely free during the public preview (v0.x). There is no credit card required, no trial expiration, and no premium feature gate. The only limits are technical ones to protect the service: 60 MCP tool calls per minute and 1,000 per hour per user. These limits are generous - typical AI assistant usage is 5-20 calls per question, so you can ask hundreds of questions per hour without hitting them. Once we reach v1.0 and the service is stable, we will move to a paid model. Pricing is not finalized but the principles are: pay-as-you-go, transparent per-tool-call cost, and a free tier that covers light personal use. We will give all preview users at least 60 days notice and free-tier credits before any pricing change takes effect. For the underlying Google Search Console API, Google enforces its own Search Console API quotas: for search analytics, 1,200 queries per minute per site and per user, and 40,000 per minute per project. We aggressively cache and deduplicate calls so you stay under these limits even with multiple AI clients connected to the same account. If you do hit a Google quota error, we surface it transparently in the tool response so your AI can back off gracefully. ### How far back does my data go? URL: https://gscpap.com/faq/how-far-back-does-my-data-go Category: Limits & Pricing Updated: 2026-09-18 Google Search Console itself only retains the most recent 16 months of data. Anything older drops off Google's side and cannot be recovered, even with API access - this is a hard limit Google enforces on every Search Console user, including direct users of the official Google Search Console UI. GSC PAP solves this with the Personal Archive. When you sign in with Google, it automatically backfills the full 16 months Google still has, for every property your Google account can read. There is no button to press. After that, a daily job fetches each new day, about 4 days behind today because Google's data takes about 3 days to settle. When Google deletes data older than 16 months on its side, your archive keeps it, so your history grows past 16 months from the day you connect. The archive cannot recover data Google deleted before you connected: it protects you from future loss. A manual backfill is still available at /account/archive, but you do not need it. Queries for stable past data (older than about 3 days) are served from your archive at zero Google API quota, while the most recent days still come from the live Google API. The search_analytics_archive, historical_position_trend and archive_status tools work on the archive directly, so once your archive holds more than 16 months you can ask questions like "show me query trends over the last 24 months", further back than Google's own UI goes. ### Does GSC PAP use fewer tokens than calling the Search Console API directly? URL: https://gscpap.com/faq/token-usage-vs-search-console-api Category: Limits & Pricing Updated: 2026-10-22 Yes, about a third fewer. We measured it on 1,000 real rows from three different properties, serialising the same rows two ways: the shape the Search Console API returns, and the compact format our server sends. The raw API response came to 34,044, 34,535 and 36,237 tokens. The same data from GSC PAP came to 22,933, 23,260 and 23,975. That is 33 to 34% fewer tokens for identical numbers, measured with tiktoken cl100k_base. The saving is smaller than a byte count suggests, and the difference is worth knowing if you are comparing MCP servers. The same payload shrinks 57% in bytes but only 34% in tokens, because JSON's punctuation is nearly free to tokenise while the text inside it costs the same either way. Any comparison quoting a percentage off the response size is overstating what you get back in context. We had this wrong on our own admin dashboard, measured against a pretty-printed baseline, and it showed roughly double the real benefit until we remeasured. Where it matters is the responses big enough to crowd out the conversation itself. At a thousand rows the raw shape costs around 36,000 tokens and ours around 24,000, so a 200,000-token context holds five of those responses instead of eight. The format is a per-tool operator setting rather than something you configure: we default to the shape every client understands, and switch individual tools to a compact one once it has been measured on production traffic. ## Changelog Every change that reached production, newest first. The log begins on 2026-09-03; the page is https://gscpap.com/changelog. - **2026-10-27, faster: New days reach your archive two days sooner.** The archive used to wait four days before saving a day, although Search Console usually finalises its data after two. It now asks Google which days are final and saves each one within an hour, so questions about last week are answered from your archive sooner. - **2026-10-27, fixed: Day-over-day Analytics comparisons are right.** ga4_compare_periods with days=1 now compares today with yesterday. Before, every "last N days" Analytics window was one day longer than asked and the two compared windows shared a day, so a day-over-day question got a muddled answer. Windows are now exactly N days in your property's time zone. - **2026-10-27, fixed: A clear message when the Search Console permission is missing.** If you left the Search Console box unticked on Google's consent screen, every Search Console tool passed on Google's bare "invalid_scope" error. Your assistant now hears that the permission is missing and gets a link to the page that shows how to grant it, and the Analytics tools keep working in the meantime. - **2026-10-27, fixed: Pressing Back after signing in no longer shows an expired session.** Going Back after signing in replays Google's consent page, which used to end on "Sign-in session expired" although you were signed in. You now land on your account instead. When a sign-in link really has expired, the page says why: it was reused after Back, or it is over ten minutes old. - **2026-10-25, added: Guides now show the screens they describe.** Each guide now has a screen from Search Console, GA4 or PageSpeed Insights at the step it explains, with numbered marks the caption walks through. The screens are recreated with example data for a made-up site, so they show where to click without showing anyone's account. - **2026-10-25, added: Every guide now shows a diagram or a sample answer.** Each workflow guide now draws its main point: where a click can fail to become a session, where a URL can stop on its way into Google's index, the Core Web Vitals thresholds, or what the assistant's answer looks like for a made-up site. The figures are built from text, so they follow dark mode and come through in the Markdown version of each page. - **2026-10-25, added: A guide to the AI queries in your Search Console report.** Search Console mixes AI Mode follow-ups, searches that AI agents run for their users and scripted queries into the same report, with nothing marking which is which. The new guide shows what each group looked like on our own site, gives a tested regex filter for each, and measures what they do to CTR and average position, along with how many visits AI assistants send according to GA4. - **2026-10-25, fixed: ga4_top_pages no longer calls its rows landing pages.** The tool groups sessions by page path, so a session counts on every page it views, but its description said landing pages. An assistant taking that at face value could add the rows up as total sessions, which on our own property overstates them 2.19 times. The description now says what the rows count, and points to ga4_overview for totals and correlate_gsc_to_ga4 for landing sessions. - **2026-10-25, changed: Guide examples in the AI client you use.** The worked example in each guide was written for Claude, though the prompts run in any MCP client. A switch above it now rewrites the example for ChatGPT, Codex, Cursor, Gemini CLI or Copilot and links that client's setup guide. The choice is remembered in your browser. - **2026-10-25, changed: The clicks vs sessions guide now covers combining the two.** It compares the four ways to combine Search Console and GA4 data (GA4's Search Console link, Looker Studio, BigQuery and an MCP server) by what each needs and where each stops, and shows on our own data why per-page rows never add up to the site total: GA4 sessions by page path came to 2.19 times the real figure, by landing page exactly 1. - **2026-10-22, changed: Conversions now come with the key events behind them.** A GA4 property marks whatever its owner likes as a key event, so one conversions total can be mostly things nobody would call a conversion: add to cart, login, even logout. ga4_conversions_by_source now returns that total broken out by event name, and reports transactions next to revenue, so a shop's actual purchase rate is visible instead of a session key-event rate that counts ten different things at once. The two can differ by a factor of ten on the same property in the same month. Responses also carry the property's currency and time zone, which Google sends on every report and which we had been discarding, so revenue is no longer a bare number and a date range names the zone it was cut in. - **2026-10-22, changed: compare_periods answers in TOON.** compare_periods now returns TOON instead of a markdown table, 20% fewer tokens on the same rows. The format is per tool and search_analytics_query stays on markdown, so the two can be compared on live calls rather than on a fixture. Worth saying what the number is not: the same payload shrinks 22% in bytes, and byte counts overstate the context win because JSON punctuation is nearly free to tokenise. Against the raw Search Console API response, TOON is 45% smaller in tokens on this tool and a third smaller on search_analytics_query. - **2026-10-20, added: Two tools for the pages that never worked.** find_new_pages lists the pages Search Console started showing in the last week and whether each has earned a click, because 90% of the clicks a new page ever earns arrive in its first seven days: a page still silent after that rarely becomes anything. find_dead_pages is the other end, the pages appearing for months that have never earned a click, split by whether Google is showing them and nobody clicks or barely showing them at all. Those need opposite work, and only one of them is a title problem. - **2026-10-19, faster: The index coverage summary is ten times faster.** get_index_coverage_summary inspected its sample one page at a time, so it cost the sum of ten URL inspections. The inspections now run together and the tool costs about as much as its slowest single page. Measured on the same property with the same ten URLs: 69 seconds before, 7 after. - **2026-10-19, added: Every page has a Markdown version.** Add .md to any page's path and you get that page as clean Markdown, with a canonical link back to the HTML. It is there for assistants that would rather read a page than parse one, and for anyone who wants to paste a guide into a prompt without the navigation coming along. - **2026-10-19, added: Setup guides for fourteen more clients.** opencode, Cline, Roo Code, Kilo Code, Warp, LM Studio, ChatGPT, Goose, Antigravity, Amp, Kiro, Raycast, GitHub Copilot CLI and n8n. Each configuration comes from that client's own documentation rather than from the shape the others use, because the key names genuinely differ. Twenty-six clients in total. - **2026-10-19, added: LibreChat, the twenty-seventh client.** LibreChat is the first client on the list that is usually not one person's: a self-hosted install serves a team, and Search Console access is per person. The guide therefore leads with the configuration that asks each user for their own token, so one server entry gives a team separate views of their own properties rather than a shared one. - **2026-10-19, added: A pricing page, with the price in the first sentence.** The answer used to live in a comparison card and an FAQ answer, which was enough for summaries of the site to say to go and check the pricing page. There is one now, and it says $0 in the heading, in the table and in the page's structured data. - **2026-10-19, added: A comparison of Search Console MCP servers.** The hosted and self-hosted options side by side, each claim dated and linked to its source. It includes the cases where something else is the better fit, because a comparison that never says that is not a comparison. - **2026-10-19, fixed: ChatGPT connectors can refresh their access.** Our OAuth metadata did not list offline_access, which ChatGPT reads before it treats a connection as refreshable. It is listed now. Note that custom MCP connectors in ChatGPT remain a Business, Enterprise and Edu feature, which is OpenAI's rule rather than ours. - **2026-10-19, fixed: The server reports its own version in the handshake.** On connecting, we were sending the version of the framework underneath us instead of ours, so clients logged and displayed the wrong number. The handshake now says 0.3.0. - **2026-10-19, fixed: The sign-in bot check retries by itself.** Cloudflare's widget retries a failed check on its own, and our error handling was reporting the failure before that retry could run. A recoverable hiccup could therefore end as a blocked sign-in. The retry runs now, and only a second failure is reported. - **2026-10-19, fixed: Legal page dates no longer depend on where the page was built.** The effective date on the Privacy Policy and Terms was formatted in whatever timezone built the site, so it could render a day early. It is pinned to UTC and marked up as a machine-readable date. - **2026-10-18, faster: The slow tools stopped waiting in line.** Tools that make several independent Google calls now make them at the same time instead of one after another. batch_inspect_urls with ten URLs went from about 50 seconds to 7, and the Search Console to GA4 correlation stopped running its two halves back to back. - **2026-10-18, faster: The archive reads from a database sized for it.** Postgres was still on the settings it ships with, against an archive that had long outgrown them. Queries over your archived history return quicker as a result, and the slow ones now record themselves so the next complaint starts from evidence. - **2026-09-19, added: We notice when Google stops letting us read a property.** If a property's access disappears on Google's side, through a permission change in Search Console, that is recorded and shown. Before, it looked indistinguishable from a property with no data. - **2026-09-18, fixed: Archive totals no longer drop anonymized traffic.** Search Console withholds the query text for rare searches, and we were summing the rows we could see. Archived totals therefore came in under the real number. Totals now come from Search Console's own daily figures, which include the traffic whose queries it will not name. - **2026-09-18, fixed: The performance overview reported one query as the whole site.** Under some date ranges get_performance_overview returned a single query's clicks and impressions as the site total, which is the kind of wrong number that looks plausible for weeks. It reports the site total. - **2026-09-18, fixed: The weekly digest compares two full weeks.** It was putting four days up against seven, so the comparison read as a collapse every time regardless of what the site did. - **2026-09-18, added: One-click connector for Claude.ai.** The MCP endpoint advertises itself to OAuth clients and accepts clients that register themselves, so Claude.ai and other connector clients can connect with a Google sign-in. No token to copy and no configuration file to edit. - **2026-09-18, fixed: Claude Desktop accepts the config we hand out.** Onboarding offered a configuration file that Claude Desktop rejected when it loaded it, which made the first run fail for the client most people start with. - **2026-09-18, changed: Four tools that were live but unlisted.** The catalog said 30 tools while the server answered 34. The four it had missed are listed and documented, so what the site promises and what the server does are the same set. - **2026-09-03, added: The archive starts filling the moment you connect.** Backfill used to wait for the next scheduled run, and the schedule could skip an account without saying anything. It now starts from the sign-in itself, so the sixteen months Google still holds are copied while you are setting up your client. - **2026-09-03, added: An email when Google stops accepting our token.** A Google grant can break without anyone touching GSC PAP, through a password change or a revoked permission. That now sends you a message asking you to reconnect, instead of turning into answers that are empty for no stated reason. ## Policies and contact - Google Search Console MCP servers compared (hosted and self-hosted options, with prices and sources): https://gscpap.com/google-search-console-mcp-servers - Pricing: https://gscpap.com/pricing - Privacy Policy: https://gscpap.com/privacy - Terms of Use: https://gscpap.com/terms - KVKK notice (Türkiye): https://gscpap.com/kvkk - About the operator: https://gscpap.com/about - Sitemap: https://gscpap.com/site-map