Tag Pilot Search Console

io.github.tagpilotPublished by GitHub account tagpilotv0.1.0Updated Nov 3, 2026

Free, read-only Google Search Console: performance, opportunities, URL inspection. No GCP setup.

The publisher's own server: QuickBooks Connector by Meridian

Overview

AI-generated overview

Read-only Google Search Console MCP server that lets an assistant query clicks, impressions, CTR, positions, sitemaps and index status for your properties.

What you can do
  • List Search Console properties and their permission levels, and list or inspect submitted sitemaps
  • Query Search Analytics by date, query, page, country, device or search appearance, with filters and paging
  • Compare two periods by query or page, with deltas and property totals
  • Surface SEO opportunities such as low-CTR page-one rows and striking-distance rankings
  • Inspect a single URL's indexed version: verdict, coverage, last crawl, canonicals, rich results
  • Connect this computer and check connection status
When to use it
Useful when you want to ask an assistant about your organic search performance without setting up a Google Cloud project: which queries lost clicks, what changed month over month, which pages are close to page one, or whether a specific URL is indexed.
Requirements
Runs locally over stdio via npx, so Node.js 18 or newer is needed (the Claude Desktop extension needs no Node.js). No Google Cloud project or API key is required: the first request starts a browser sign-in to a free Tag Pilot account plus read-only Google Search Console consent. TAGPILOT_API_KEY is optional for headless or CI use. Network access to Google and Tag Pilot is required.
Before you install
Read-only: only the webmasters.readonly scope is requested and no tool changes Search Console. Search Console data is fetched from your machine directly from Google, while Tag Pilot brokers the OAuth token exchange and stores no Google tokens; credentials are kept locally in a config directory. Approving the sign-in grants read-only access to your Search Console properties, and the device can be revoked later. Google quotas apply, notably 2,000 URL inspections per day.

Installation

In SourceWeft

  1. Open Tag Pilot Search Console in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Tag Pilot Search Console MCP

A free, read-only Model Context Protocol server for Google Search Console. Ask Claude, Cursor or any MCP client about your organic search: clicks, impressions, CTR and positions by query or page, what changed between two periods, SEO opportunities, Google's index status for a URL, and your sitemaps.

No Google Cloud setup, no API key to copy. You don't need a GCP project, OAuth client, service account or gcloud. Add the server, ask a question, and approve once in your browser.

bash
claude mcp add search-console -- npx -y @tagpilot/search-console-mcp

Get started

  1. Install in your AI client (below). No configuration needed.
  2. Ask something, e.g. "Which queries lost the most clicks this month?" The first time, a browser window opens (or your AI shows a link and a code like ABCD-1234):
    • sign in to your free Tag Pilot account, or create one;
    • check that the code matches and approve this computer;
    • sign in with the Google account that can see your Search Console properties and allow read-only Search Console access.
  3. Ask again. You're connected; the computer shows up under Connected devices on the Search Console MCP page.

Already use the Tag Pilot GA4 MCP? This is a separate server with its own connection (and its own Google consent), so you can install either or both.

Install

[Add to Cursor] [Install in VS Code]

ClientHow
Claude DesktopDownload the extension and open it (no Node.js needed)
Claude Codeclaude mcp add search-console -- npx -y @tagpilot/search-console-mcp
CursorAdd to Cursor, or the mcp.json below
VS CodeInstall in VS Code
Windsurf, Zed, …command npx, args ["-y", "@tagpilot/search-console-mcp"] (stdio)
Gemini CLIclone the repo, then gemini extensions install ./ga4-mcp/packages/search-console-mcp

Everything except the Claude Desktop extension runs the npm package with npx, so it needs Node.js 18 or newer. In the MCP Registry it's io.github.tagpilot/search-console-mcp.

Claude Desktop config file (claude_desktop_config.json), Cursor (~/.cursor/mcp.json) and similar clients:

json
{  "mcpServers": {    "search-console": {      "command": "npx",      "args": ["-y", "@tagpilot/search-console-mcp"]    }  }}

Headless and CI: where nobody can approve in a browser, create a gsc:mcp key on the Search Console MCP page and set TAGPILOT_API_KEY=tpk_… in the server's environment. The device connect is then skipped and only the Google sign-in link is shown.

How connecting works, and what Tag Pilot sees

The same flow as the GA4 MCP (RFC 8628-style device connect, like gh auth login): it works from any browser on any device, also over SSH, in containers or WSL, because nothing listens on your machine.

  • Your Search Console data goes from your machine straight to Google (www.googleapis.com/webmasters/v3, searchconsole.googleapis.com). It never passes through Tag Pilot.
  • Tag Pilot only brokers the token exchange. It adds Tag Pilot's Google OAuth client credentials to Google's token endpoint and returns Google's answer. It stores no Google tokens and never logs them; it holds the one-time sign-in code for at most 10 minutes, and that code is useless without the PKCE verifier that stays on your machine.
  • Read-only. The only Google scope requested is webmasters.readonly. None of the tools can change anything in Search Console (no sitemap submits, no deletes).
  • Your credentials stay on your machine, in ~/.config/tagpilot/search-console-mcp/device.json (readable only by you).
  • Disconnecting: revoke the device on the Search Console MCP page, run npx -y @tagpilot/search-console-mcp logout, and remove the app's access at myaccount.google.com/permissions.

Tools

All tools are read-only. site_url is the property exactly as list_sites shows it: sc-domain:example.com for a domain property, or a URL prefix with its trailing slash (https://www.example.com/).

ToolWhat it does
list_sitesProperties you can read (domain and URL-prefix) with your permission level. Start here.
search_analyticsClicks, impressions, CTR and position by date, hour, query, page, country, device, searchAppearance; filters; search type (web, image, video, news, Discover, Google News); data state; aggregation; paging (up to 25,000 rows per call).
compare_periodsPeriod-over-period by query or page: both periods, deltas, new/lost rows, and property totals. Default: last 28 days vs the 28 days before.
find_opportunitiesTag Pilot analysis. low_ctr: page-one rows with many impressions but under half a typical CTR for their position. striking_distance: rows at average positions ~5–20 with enough impressions.
inspect_urlURL Inspection: Google's indexed version of one URL (verdict, coverage, last crawl, robots.txt, canonical chosen by Google vs declared, sitemaps, rich results).
list_sitemaps / get_sitemapSubmitted sitemaps: type, last submitted/downloaded, errors, warnings, submitted URL counts.
connectConnects this computer: returns a link and a code for you to approve in the browser (your AI shows them; clients that support MCP URL elicitation offer to open the link). Say "connect my Search Console" to start it explicitly.
connection_statusConnected (with the device name), waiting for approval (link and code again), not connected, or what went wrong. Waits up to 25 s for an open sign-in to finish.

Things to know about Search Console data

  • Lag: data is typically available after 2–3 days. The default date range is the 28 days ending 3 days ago. data_state: "all" adds fresher, still-changing data; the result says from which date data is incomplete.
  • Dates are Pacific Time (Search Console's day boundary). Relative dates ("yesterday", "7daysAgo") are computed in Pacific Time too.
  • Anonymised queries: queries too rare to show (privacy) are left out of rows grouped or filtered by query, so per-query rows add up to less than the totals by date, country or device. compare_periods reports property totals separately for that reason.
  • Row limits: a call returns up to 25,000 rows (use start_row to page), and Google exposes at most 50,000 rows per day per search type, sorted by clicks.
  • Aggregation: grouping or filtering by page counts each URL separately (byPage), so totals differ from property-level totals.
  • Discover and Google News don't support aggregation_type: "byProperty".
  • Quotas (Google's): Search Analytics allows 1,200 queries per minute per site and per user, plus a load quota that long, query-and-page-level requests use up faster. URL Inspection allows 2,000 inspections per day and 600 per minute per property, so inspect_url is for a handful of important URLs, not whole sitemaps.

find_opportunities uses a rough benchmark CTR curve (position 1 ≈ 28%, 3 ≈ 10%, 10 ≈ 2%) to rank rows. It's a rule of thumb for prioritising, not Google data or a forecast.

Troubleshooting

"Not connected yet" (a link and a code like ABCD-1234): your AI shows them. Open the link in any browser (it doesn't have to be on this machine), sign in to Tag Pilot, check that the code matches, approve, and allow Search Console access, then tell your AI you're done: it retries your question (or calls connection_status). The server keeps checking in the background, so nothing needs restarting. The code is valid for 10 minutes; after that, ask again (or say "connect Search Console") for a new one. To connect from a terminal instead (e.g. over SSH), run npx -y @tagpilot/search-console-mcp login: it shows the link, the code in a box and a countdown, and waits until you approve.

"The signed-in Google account has no access to the Search Console property …": use list_sites and pass site_url exactly as listed (sc-domain: for domain properties, trailing slash for URL prefixes). To use another Google account, run npx -y @tagpilot/search-console-mcp logout and connect again.

"This computer was disconnected from Tag Pilot": the device was revoked; ask again to reconnect. "Your Google sign-in expired or was revoked": ask again and approve again.

Quota errors: wait a few minutes (Search Analytics) or until tomorrow (URL Inspection).

Check the setup: npx -y @tagpilot/search-console-mcp status. Logs go to stderr.

Configuration

Nothing is required. All variables are optional:

Variable
TAGPILOT_API_KEYA gsc:mcp key for headless/CI setups. Skips the device connect.
TAGPILOT_API_URLTag Pilot API base URL. Default https://api.tagpilot.io.
SEARCH_CONSOLE_MCP_NO_BROWSER1 to only print/return the link instead of opening a browser.
SEARCH_CONSOLE_MCP_BROWSERBrowser to open (macOS app name, or a command on Linux/Windows).
SEARCH_CONSOLE_MCP_AUTH_WAIT_SECONDSHow long a tool call waits for the connect before returning the link. Default 45.
SEARCH_CONSOLE_MCP_CONFIG_DIRCredential directory. Default ~/.config/tagpilot/search-console-mcp.

Commands: npx -y @tagpilot/search-console-mcp [serve|login|logout|status|--help|--version].

Development

See the repo README. SEARCH_CONSOLE_MCP_WEBMASTERS_API_URL and SEARCH_CONSOLE_MCP_INSPECTION_API_URL point the Google calls at a mock (used by npm run e2e).

License

Apache License 2.0. Copyright 2026 Tag Concierge sp. z o.o. The license does not cover the Tag Pilot name or logo (see NOTICE).

Source: packages/search-console-mcp/README.md at commit 4ceb8f8

Tools

9

list_sites

List Search Console properties

Lists every Search Console property the signed-in Google account can see: domain properties ("sc-domain:example.com", covering all subdomains and protocols) and URL-prefix properties ("https://www.example.com/"), with the permission level (owner, full, restricted, unverified). Start here: other tools need site_url exactly as listed.

Takes no parameters.

list_sitemaps

List sitemaps

Sitemaps submitted for a property (or listed in a sitemap index): type, last submitted/downloaded, pending, errors, warnings and submitted URL counts per content type. Google no longer reports indexed counts per sitemap; use inspect_url for single URLs.

Parameterssite_urlrequiredsitemap_index

get_sitemap

Get one sitemap

Details of one submitted sitemap (same fields as list_sitemaps).

Parameterssite_urlrequiredsitemap_urlrequired

search_analytics

Search performance (Search Analytics)

Clicks, impressions, CTR (0–1) and average position from Google Search, grouped by date, query, page, country, device or search appearance, with filters and paging. Defaults: last 28 days of final data, web search, 100 rows sorted by clicks. Search Console data typically lags 2–3 days; the default range ends 3 days ago (Pacific Time). Pass data_state "all" to include fresher, still-changing data. Grouping or filtering by query omits anonymised (rare) queries, so query rows add up to less than the totals by date, country or device. Google exposes at most 50,000 rows per day per search type.

Parametersfiltersend_datesite_urlrequiredrow_limitstart_rowdata_statedimensionsstart_datesearch_typeaggregation_type

compare_periods

Compare two periods

Period-over-period change by query or page: clicks, impressions, CTR and position for both periods with deltas, plus property totals (which include anonymised queries). Default: the last 28 days of final data vs the 28 days before. Biggest movers first. Search Console data typically lags 2–3 days; the default range ends 3 days ago (Pacific Time). Pass data_state "all" to include fresher, still-changing data. Grouping or filtering by query omits anonymised (rare) queries, so query rows add up to less than the totals by date, country or device. Uses 4 Search Analytics queries.

Parameterstopsortfiltersend_datesite_urlrequireddimensionstart_datesearch_typerows_per_periodcompare_end_datecompare_start_date

find_opportunities

Find SEO opportunities

Tag Pilot SEO check over one period, by query (default) or page. low_ctr: rows on page one (avg position ≤ 10) with plenty of impressions but a CTR under half of a typical CTR for that position, so the title/snippet likely underperforms. striking_distance: rows ranking around positions 5–20 (configurable) with enough impressions, where a small ranking gain pays off. "Typical CTR" is a rough industry benchmark curve, not Google data. Search Console data typically lags 2–3 days; the default range ends 3 days ago (Pacific Time). Pass data_state "all" to include fresher, still-changing data. Grouping or filtering by query omits anonymised (rare) queries, so query rows add up to less than the totals by date, country or device.

Parameterstopfiltersend_datesite_urlrequireddimensionstart_datesearch_typemax_positionmin_positionrows_to_scanmin_impressions

inspect_url

Inspect a URL (index status)

URL Inspection: Google's indexed version of one URL in the property: indexing verdict and coverage state, last crawl, robots.txt and fetch state, Google-selected vs declared canonical, sitemaps and referring URLs, rich results. It is not a live test. Quota: 2,000 inspections per day and 600 per minute per property, so inspect a handful of important URLs, not whole sitemaps.

Parametersurlrequiredsite_urlrequiredlanguage_code

connect

Connect Search Console MCP

Connects this computer to Tag Pilot Search Console MCP (free Tag Pilot account + read-only Google Search Console access). Call it when the user asks to connect, or when another tool says the computer is not connected. It returns a link and a code: show both to the user as given (a clickable link), ask them to open it, approve and allow Google access, and tell you when done; then call connection_status. Never ask the user to run terminal commands. If already connected, it says so.

Takes no parameters.

connection_status

Search Console MCP connection status

Whether this computer is connected to Tag Pilot Search Console MCP: "connected" (with the device name), "waiting" (a sign-in link is open; shows the link and code again), "not_connected" (call connect) or "error" (with the next step). While a sign-in is open it waits up to 25 seconds for the approval before answering, so call it after the user says they approved, not in a fast loop.

Parameterswait

Version history

1
  1. v0.1.0LatestOct 29, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

Other Pilot integrations