A Model Context Protocol (MCP) server that provides programmatic access to Google Search Console API data through Claude Code and Cursor.
New to this MCP server? Jump to Step-by-Step Setup Guide for complete instructions.
- 🔍 List Sites - Get all Search Console properties you have access to
- 📊 Search Analytics - Query search performance data with flexible filtering
- 🗺️ Sitemap Information - Retrieve sitemap status and indexing statistics
- 🔎 URL Inspection - Check detailed indexing status of specific URLs
- 📤 Submit URL for Indexing - Request Google to index or remove URLs
- 📈 Compare Periods - Compare search performance between two time periods
- 🛡️ Robust Error Handling - Detailed error messages with actionable guidance
- 🔄 Automatic Retry Logic - Handles rate limits and transient failures
- ✅ Input Validation - Validates all parameters before API calls
Before using this MCP server, you need:
- Site registered in Search Console
- Site ownership verified
- Access to the Search Console property you want to query
- A GCP project (free tier is sufficient)
- Google Search Console API enabled
- OAuth 2.0 Client ID credentials (Desktop app type)
- (Optional) Indexing API enabled if you want to use
submit_url_for_indexing
💡 Note: You only need to set up GCP once. The CLIENT_ID and CLIENT_SECRET are reusable across multiple sites in your Search Console.
Create .mcp.json in your project root:
{
"mcpServers": {
"google-search-console": {
"command": "npx",
"args": ["-y", "-p", "google-search-console-mcp-server", "google-search-console-mcp"],
"env": {
"GOOGLE_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
"GOOGLE_CLIENT_SECRET": "your-client-secret",
"GOOGLE_REFRESH_TOKEN": "your-refresh-token"
}
}
}
}args must include all three parts:
"-y"- Auto-confirm npx prompt"-p", "google-search-console-mcp-server"- Package name"google-search-console-mcp"- Executable name (different from package name!)
💡 Note: GOOGLE_REDIRECT_URI defaults to http://localhost:8080 and doesn't need to be specified unless you want to use a different port.
💡 Tip: You can use an existing OAuth 2.0 Client ID from other services (Supabase, Firebase, etc.) or create a new one.
- Go to Google Cloud Console
- Create or select a project
- Enable APIs:
- Navigate to "APIs & Services" → "Enable APIs and Services"
- Search and enable "Google Search Console API"
- (Optional) Enable "Indexing API" if you want to use
submit_url_for_indexing
- Create or use existing OAuth 2.0 Client ID:
- Go to "APIs & Services" → "Credentials"
- Option A: Use existing OAuth 2.0 Client (skip to step 5)
- Option B: Create new → "OAuth 2.0 Client ID" → Application type: Desktop app
- Configure Authorized redirect URIs:
- Click on the OAuth 2.0 Client ID
- Under "Authorized redirect URIs", click "Add URI"
- Add:
http://localhost:8080(no trailing slash!) - Click "Save"
⚠️ IMPORTANT: Add test users (if OAuth consent screen is in Testing mode):- Go to "OAuth consent screen"
- Check the "Publishing status" - if it shows "Testing":
- Scroll to "Test users" section
- Click "+ ADD USERS"
- Add your Google account email (the one you'll use to authenticate)
- Click "Save"
- Without this step, you'll get
access_deniederrors!
💾 Save your credentials: Copy the CLIENT_ID and CLIENT_SECRET. You'll need them in the next step.
Run the interactive setup command:
npx -y -p google-search-console-mcp-server google-search-console-mcp-setupYou'll be prompted to enter:
GOOGLE_CLIENT_ID(from step 2)GOOGLE_CLIENT_SECRET(from step 2)GOOGLE_REDIRECT_URI(press Enter for default:http://localhost:8080)
A browser window will open for authentication. After authorizing, the command will output the complete .mcp.json configuration with all three credentials including the GOOGLE_REFRESH_TOKEN.
Copy the configuration and paste it into your .mcp.json, then reload Claude Code window.
Once configured, you can use the tools in Claude Desktop or Claude Code:
Show me my Google Search Console sites
or
Get search performance data for example.com for the last 7 days
Get all Search Console sites you have access to.
Parameters: None
Example:
Search Consoleのサイト一覧を教えて
Query search performance data for a specified date range.
Parameters:
siteUrl(required): Site URL (e.g., "https://example.com/")startDate(required): Start date (YYYY-MM-DD)endDate(required): End date (YYYY-MM-DD)dimensions(optional): Array of dimensions ["query", "page", "country", "device", "searchAppearance"]rowLimit(optional): Max rows (default: 100, max: 25000)startRow(optional): Starting row for pagination
Example:
example.comの過去7日間のトップクエリを取得して
example.comの2025年1月1日から1月31日までの、
ページ別とデバイス別のパフォーマンスを500件取得して
Retrieve sitemap information for a site.
Parameters:
siteUrl(required): Site URL
Example:
example.comのサイトマップ情報を確認して
Inspect the indexing status of a specific URL.
Parameters:
siteUrl(required): Site URL (e.g., "https://example.com/")inspectionUrl(required): Full URL to inspect
Example:
https://example.com/blog/article のインデックス状態を検査して
Submit a URL to Google for indexing or request URL removal using the Indexing API.
Parameters:
url(required): Full URL to submit (e.g., "https://example.com/page")type(optional): Notification type - "URL_UPDATED" (default) or "URL_DELETED"
Example:
https://example.com/new-article をインデックスに送信して
https://example.com/old-page を削除申請して(type: URL_DELETED)
Note: Requires Indexing API to be enabled in Google Cloud Console and the https://www.googleapis.com/auth/indexing scope.
Compare search performance metrics between two time periods (e.g., this week vs last week).
Parameters:
siteUrl(required): Site URL (e.g., "https://example.com/")currentStartDate(required): Current period start date (YYYY-MM-DD)currentEndDate(required): Current period end date (YYYY-MM-DD)previousStartDate(required): Previous period start date (YYYY-MM-DD)previousEndDate(required): Previous period end date (YYYY-MM-DD)dimensions(optional): Array of dimensions to group byrowLimit(optional): Max rows (default: 100, max: 25000)
Example:
Compare this week vs last week performance for example.com
Compare query performance for example.com between January 2025 and December 2024
(currentStartDate: 2025-01-01, currentEndDate: 2025-01-31,
previousStartDate: 2024-12-01, previousEndDate: 2024-12-31,
dimensions: ["query"])
- Daily quota: 2,000 requests per project
- Per 100 seconds: 600 requests
- Data availability: Up to 16 months of historical data
- Data latency: Typically 2-3 days
This MCP server includes comprehensive error handling:
- Rate Limiting (429): Automatically retries with exponential backoff
- Server Errors (5xx): Retries up to 3 times with increasing delays
- Transient Failures: Smart retry logic with jitter to prevent thundering herd
All tools validate inputs before making API calls:
- Site URL: Validates URL format and structure
- Dates: Validates YYYY-MM-DD format and logical date ranges
- Row Limits: Ensures limits are within API constraints (1-25,000)
Error messages include:
- Clear description of what went wrong
- HTTP status code
- Actionable steps to resolve the issue
Example:
Access denied for list sites (403)
Verify your authentication credentials and ensure you have access to this Search Console property.
You may need to add your account as a test user in Google Cloud Console.
Problem: When running the setup command, you get Error during authentication: invalid_client.
Causes & Solutions:
-
CLIENT_ID and CLIENT_SECRET mismatch
- Verify they're from the same OAuth 2.0 Client in GCP Console
- Copy them again directly from Google Cloud Console
-
Missing
http://localhost:8080in Authorized redirect URIs- If you're reusing OAuth credentials from other services (Supabase, Firebase, etc.)
- Solution: Add
http://localhost:8080to "Authorized redirect URIs" in the OAuth 2.0 Client settings - You can have multiple redirect URIs (e.g.,
https://xxx.supabase.co/auth/v1/callbackANDhttp://localhost:8080)
-
CLIENT_SECRET was regenerated
- If you reset the secret in GCP Console, use the new one
- Old secrets become invalid immediately
Problem: npx google-search-console-mcp-server fails with "could not determine executable to run".
Solution: The package name and executable name are different. Use the correct .mcp.json configuration:
{
"mcpServers": {
"google-search-console": {
"command": "npx",
"args": ["-y", "-p", "google-search-console-mcp-server", "google-search-console-mcp"],
"env": { ... }
}
}
}Debugging steps:
-
Check the error details:
- In Claude Code's MCP status screen, press Enter on the failed server
- Scroll down to see the stderr (error output)
-
Test manually:
cd your-project-directory export GOOGLE_CLIENT_ID="your-id" export GOOGLE_CLIENT_SECRET="your-secret" export GOOGLE_REFRESH_TOKEN="your-token" npx -y google-search-console-mcp-server
-
Common causes:
- Search Console API not enabled: Enable it in GCP Console
- Wrong credentials: Verify CLIENT_ID, CLIENT_SECRET, and REFRESH_TOKEN
- Expired token: Run the setup command again to get a new REFRESH_TOKEN
- npx cache issue: Clear npx cache:
rm -rf ~/.npm/_npx
-
Reload Claude Code: After fixing
.mcp.json, reload the window (Ctrl/Cmd + Shift + P → "Developer: Reload Window")
Make sure your .mcp.json file has all three environment variables: GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, and GOOGLE_REFRESH_TOKEN.
Ensure http://localhost:8080 (no trailing slash!) is added to Authorized redirect URIs in the OAuth 2.0 Client settings in Google Cloud Console.
⚠️ Most common cause - OAuth consent screen is in Testing mode:- Go to "OAuth consent screen" in GCP Console
- If "Publishing status" shows "Testing", you MUST add your email to "Test users"
- Click "+ ADD USERS" in the "Test users" section
- Add your Google account email (the one you're authenticating with)
- Click "Save"
- This is the #1 cause of access_denied errors!
- API not enabled: Enable "Google Search Console API" in GCP Console
- No access to the site: Verify you have access to the Search Console property you're querying
Site URLs must be complete URLs like:
https://example.com/(for URL-prefix properties)sc-domain:example.com(for domain properties)
Search Console data is only available for the last 16 months.
The tool will automatically retry with backoff. If you continue to hit limits:
- Wait a few minutes between requests
- Reduce
rowLimitin analytics queries - API Limits: 2,000 requests/day, 600 requests/100 seconds
If you see authentication errors, your refresh token may have expired. Re-run the authentication setup:
npx -y -p google-search-console-mcp-server google-search-console-mcp-setupCopy the new GOOGLE_REFRESH_TOKEN to your .mcp.json.
npm run buildnpm run devnode build/auth/setup-auth.jssrc/
├── index.ts # MCP server entry point
├── auth/
│ ├── google-auth.ts # OAuth 2.0 client
│ └── setup-auth.ts # Authentication CLI
├── tools/
│ ├── list-sites.ts # List sites tool
│ ├── get-analytics.ts # Search analytics tool
│ ├── get-sitemaps.ts # Sitemap info tool
│ ├── inspect-url.ts # URL inspection tool
│ ├── submit-url.ts # Submit URL for indexing
│ └── compare-periods.ts # Compare time periods
├── types/
│ └── index.ts # Type definitions
└── utils/
└── error-handler.ts # Error handling & validation
- Never commit
.envor.mcp.jsonfiles to version control - Keep your refresh token secure
- Use readonly scope (
webmasters.readonly) when possible - Refresh tokens provide persistent access - store them securely
MIT
Contributions are welcome! Please feel free to submit issues or pull requests.