Connects Claude to Google Search Console's API with OAuth2 refresh token auth. You get ten tools covering the main GSC workflows: query search analytics for clicks, impressions, CTR, and position data; manage sitemaps (list, submit, delete); inspect URL indexing status; and handle site property administration. Built by crunchtools with security-focused design (credentials as SecretStr, automatic token scrubbing, Pydantic validation). Setup requires a one-time OAuth flow to generate a refresh token, then the server handles access token rotation automatically. Useful when you're building SEO dashboards, automating sitemap submissions, or investigating indexing issues without leaving your chat context.
Public tool metadata for what this MCP can expose to an agent.
GOOGLE_SEARCH_CONSOLE_GET_SITEMAPRetrieves information about a specific sitemap for a site.2 paramsRetrieves information about a specific sitemap for a site.
feedpathstringsite_urlstringGOOGLE_SEARCH_CONSOLE_INSPECT_URLInspects a URL for indexing issues and status in Google Search Console.4 paramsInspects a URL for indexing issues and status in Google Search Console.
urlstringsite_urlstringlanguage_codestringinspection_urlstringGOOGLE_SEARCH_CONSOLE_LIST_SITEMAPSLists all sitemaps for a site in Google Search Console.2 paramsLists all sitemaps for a site in Google Search Console.
site_urlstringsitemap_indexstringGOOGLE_SEARCH_CONSOLE_LIST_SITESLists all sites owned by the authenticated user in Google Search Console.Lists all sites owned by the authenticated user in Google Search Console.
No parameter schema in public metadata yet.
GOOGLE_SEARCH_CONSOLE_SEARCH_ANALYTICS_QUERYQueries Google Search Console for search analytics data including clicks, impressions, CTR, and position metrics.10 paramsQueries Google Search Console for search analytics data including clicks, impressions, CTR, and position metrics.
end_datestringsite_urlstringrow_limitintegerstart_rowintegerdata_statestringdimensionsarraystart_datestringsearch_typestringaggregation_typestringdimension_filter_groupsarrayGOOGLE_SEARCH_CONSOLE_SUBMIT_SITEMAPSubmits a sitemap to Google Search Console for indexing.2 paramsSubmits a sitemap to Google Search Console for indexing.
feedpathstringsite_urlstringSecure MCP server for Google Search Console. Query search analytics (clicks, impressions, CTR, position), manage sitemaps, inspect URL indexing status, and manage site properties.
claude mcp add mcp-google-search-console-crunchtools \
--env GSC_CLIENT_ID=your_client_id \
--env GSC_CLIENT_SECRET=your_client_secret \
--env GSC_REFRESH_TOKEN=your_refresh_token \
-- uvx mcp-google-search-console-crunchtools
pip install mcp-google-search-console-crunchtools
podman run -d -p 8017:8017 \
--env-file ~/.config/mcp-env/mcp-google-search-console.env \
quay.io/crunchtools/mcp-google-search-console \
--transport streamable-http --host 0.0.0.0
This server authenticates to Google using OAuth2 with a refresh token. This is a one-time setup — once you have the three credentials, you store them as environment variables and never need to touch OAuth again.
| Credential | What it is | Where it comes from |
|---|---|---|
GSC_CLIENT_ID | Identifies your OAuth app to Google | Google Cloud Console |
GSC_CLIENT_SECRET | Secret key for your OAuth app | Google Cloud Console |
GSC_REFRESH_TOKEN | Long-lived token that lets the server get access tokens | One-time browser consent flow |
https://www.googleapis.com/auth/webmastersRun this in your terminal to start the consent flow:
# Set your credentials from Step 1
export GSC_CLIENT_ID="your_client_id_here"
export GSC_CLIENT_SECRET="your_client_secret_here"
# Generate the authorization URL
echo "Open this URL in your browser:"
echo ""
echo "https://accounts.google.com/o/oauth2/v2/auth?client_id=${GSC_CLIENT_ID}&redirect_uri=http://127.0.0.1&response_type=code&scope=https://www.googleapis.com/auth/webmasters&access_type=offline&prompt=consent"
http://127.0.0.1/?code=XXXX&scope=...code= value from the URL bar (everything between code= and &scope)Now exchange the authorization code for a refresh token:
# Paste the code value from the URL bar (the part between code= and &scope)
AUTH_CODE="paste_your_code_here"
curl -s -X POST https://oauth2.googleapis.com/token \
-d "client_id=${GSC_CLIENT_ID}" \
-d "client_secret=${GSC_CLIENT_SECRET}" \
-d "code=${AUTH_CODE}" \
-d "grant_type=authorization_code" \
-d "redirect_uri=http://127.0.0.1" | python3 -m json.tool
The response will include a refresh_token field — copy it. This is the long-lived credential that lets the server authenticate without a browser.
Note: If you don't see
refresh_tokenin the response, add&prompt=consentto the authorization URL and try again. Google only returns the refresh token on the first consent or when explicitly prompted.
Create an env file:
cat > ~/.config/mcp-env/mcp-google-search-console.env << 'EOF'
GSC_CLIENT_ID=your_client_id
GSC_CLIENT_SECRET=your_client_secret
GSC_REFRESH_TOKEN=your_refresh_token
EOF
chmod 600 ~/.config/mcp-env/mcp-google-search-console.env
The server never stores or manages tokens on disk. On each API call:
The refresh token itself never expires unless you explicitly revoke it in your Google Account permissions.
| Category | Count | Tools |
|---|---|---|
| Sites | 4 | list_sites, get_site, add_site, delete_site |
| Search Analytics | 1 | query_search_analytics |
| Sitemaps | 4 | list_sitemaps, get_sitemap, submit_sitemap, delete_sitemap |
| URL Inspection | 1 | inspect_url |
SecretStr (never logged)extra="forbid"See SECURITY.md for the full security design document.
uv sync --all-extras
uv run ruff check src tests
uv run mypy src
uv run pytest -v
gourmand --full .
podman build -f Containerfile .
com.mcparmory/google-search
io.github.pipeworx-io/brave-search
marcopesani/mcp-server-serper
brave/brave-search-mcp-server
com.mcparmory/google-search-console
acamolese/google-search-console-mcp