Google Search Console MCP Server
Connects AI assistants to Google Search Console data for SEO analysis, including search analytics, URL inspection, sitemaps, indexing, and opportunity detection.
README
Google Search Console MCP Server (Unofficial)
An unofficial, open-source Model Context Protocol (MCP) server for Google Search Console. Connect your AI assistant to real SEO data — search analytics, URL inspection, sitemaps, indexing, and smart opportunity detection.
5 steps, under 10 minutes to set up. No coding experience required.
Works with: Claude Desktop, Cursor, VS Code, Windsurf, and any MCP-compatible client.
Available Tools
| Tool | Description | Read-Only |
|---|---|---|
search_analytics |
Query search performance data with full filtering, all dimensions, and all search types | Yes |
compare_periods |
Compare two date ranges with automatic delta calculations | Yes |
find_opportunities |
Identify quick wins, declining pages, and emerging queries | Yes |
diagnose_traffic_drops |
Find pages that lost traffic and diagnose why (ranking loss, CTR collapse, or demand decline) | Yes |
cannibalization |
Detect keywords where multiple pages compete against each other | Yes |
content_decay |
Find pages with 3+ consecutive months of traffic decline | Yes |
ctr_benchmarks |
Compare your CTR against industry averages by position | Yes |
topic_clusters |
Analyze performance of all pages under a URL path prefix | Yes |
verify_claim |
Self-check a data claim before presenting it (anti-hallucination) | Yes |
inspect_url |
Inspect a single URL's index status, mobile usability, rich results, and AMP | Yes |
batch_inspect_urls |
Inspect multiple URLs at once (max 100, rate-limited to 2K/day) | Yes |
list_sitemaps |
List all sitemaps with status, error counts, and content details | Yes |
submit_sitemap |
Submit a new sitemap to Search Console | No |
delete_sitemap |
Remove a sitemap from Search Console tracking | No |
list_properties |
List all accessible Search Console properties with permission levels | Yes |
notify_url_update |
Send a URL update or deletion notification via the Indexing API | No |
get_indexing_status |
Check Indexing API notification status for a URL | Yes |
What Can You Do With This?
Search Performance Analysis
- Pull your top queries, pages, countries, and devices with full filtering
- Use regex filters to segment branded vs. non-branded traffic
- Access all search types: Web, Discover, Google News, Image, Video
- Get hourly traffic data (via the April 2025 GSC API update)
- Retrieve up to 25,000 rows per request
Track Changes Over Time
- Compare any two date ranges side-by-side
- See click, impression, CTR, and position deltas at a glance
- Detect the impact of algorithm updates, deployments, or SEO changes
Find SEO Opportunities Automatically
- Quick wins — Queries ranking 5-20 with high impressions but low CTR (optimize titles/descriptions)
- Declining content — Pages losing traffic compared to the prior period
- Emerging queries — New or rapidly growing queries you should capitalize on
Diagnose Traffic Issues
- Traffic drop diagnosis — Find pages that lost traffic and learn why: ranking loss, CTR collapse, or demand decline
- Keyword cannibalization — Detect queries where multiple pages compete against each other
- Content decay — Surface pages with 3+ consecutive months of decline before they disappear from SERPs
- CTR benchmarks — Compare your click-through rates against industry averages by position
- Topic cluster analysis — See aggregate performance for all pages under a URL path (like
/blog/seo/)
Anti-Hallucination Safeguards
- Data provenance — Every response includes a
_metablock confirming the data source, tool, and parameters used - Guardrail prompts — Tool descriptions instruct the AI to report exact numbers and avoid speculation
- Verify claim — A dedicated tool lets the AI self-check any claim by re-querying the API before presenting it
Monitor Technical SEO
- Inspect any URL's index status, mobile usability, rich results, and AMP
- Batch inspect up to 100 URLs at once with built-in rate limiting
- Check canonical status and detect mismatches
- List, submit, and delete sitemaps
- Send URL update/deletion notifications via the Indexing API
Quick Start
npx gluska-seo-gsc-mcp
Setup
Prerequisites
- A Google Cloud Project with the Search Console API enabled
- OAuth 2.0 credentials (Desktop app) or a Service Account
- Node.js >= 18
Step 1: Enable the Search Console API
- Go to the Google Cloud Console
- Select or create a project
- Go to APIs & Services > Library
- Search for "Google Search Console API" and click Enable
- If you plan to use the Indexing API tools, also enable the Web Search Indexing API
Step 2: Create Credentials
Option A: Service Account (Recommended)
Best for automation, CI/CD, and MCP servers — no browser interaction needed.
- In Google Cloud Console, go to APIs & Services > Credentials
- Click Create Credentials > Service Account
- Give it a name (e.g., "gsc-mcp") and click Create
- Skip the optional permissions steps and click Done
- Click on the newly created service account
- Go to the Keys tab > Add Key > Create new key > JSON
- Save the downloaded JSON file somewhere safe
Then add the service account to Search Console:
- Go to Google Search Console
- Select your property
- Go to Settings > Users and permissions > Add user
- Paste the
client_emailfrom the JSON file (looks likename@project.iam.gserviceaccount.com) - Set permission to Full and click Add
Set the environment variable:
export GSC_SERVICE_ACCOUNT_PATH=/path/to/service-account.json
Option B: OAuth 2.0 (Interactive)
Best for personal use when you want to authenticate as yourself.
- In Google Cloud Console, go to APIs & Services > Credentials
- Click Create Credentials > OAuth client ID
- Select Desktop app as the application type
- Download the credentials JSON file
Set the environment variable:
export GSC_OAUTH_CREDENTIALS_PATH=/path/to/credentials.json
On first run, a browser window opens for authentication. Tokens are cached automatically for subsequent use.
Step 3: Configure Your MCP Client
<details> <summary><strong>Claude Desktop</strong></summary>
Add to your claude_desktop_config.json:
{
"mcpServers": {
"google-search-console": {
"command": "npx",
"args": ["-y", "gluska-seo-gsc-mcp"],
"env": {
"GSC_SERVICE_ACCOUNT_PATH": "/path/to/service-account.json"
}
}
}
}
Config file location:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
</details>
<details> <summary><strong>Cursor</strong></summary>
Add to your .cursor/mcp.json:
{
"mcpServers": {
"google-search-console": {
"command": "npx",
"args": ["-y", "gluska-seo-gsc-mcp"],
"env": {
"GSC_SERVICE_ACCOUNT_PATH": "/path/to/service-account.json"
}
}
}
}
</details>
<details> <summary><strong>VS Code</strong></summary>
Add to your .vscode/mcp.json:
{
"servers": {
"google-search-console": {
"command": "npx",
"args": ["-y", "gluska-seo-gsc-mcp"],
"env": {
"GSC_SERVICE_ACCOUNT_PATH": "/path/to/service-account.json"
}
}
}
}
</details>
<details> <summary><strong>Windsurf</strong></summary>
Add to your ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"google-search-console": {
"command": "npx",
"args": ["-y", "gluska-seo-gsc-mcp"],
"env": {
"GSC_SERVICE_ACCOUNT_PATH": "/path/to/service-account.json"
}
}
}
}
</details>
Example Prompts
Here are some things you can ask your AI assistant once the MCP is connected:
Search Performance
| What You Can Ask | Tool Used |
|---|---|
| "Show me my top 20 queries by clicks for the last 7 days" | search_analytics |
| "What are my top performing pages?" | search_analytics |
| "Break down my traffic by device type" | search_analytics |
| "Which countries drive the most impressions?" | search_analytics |
| "Show me all queries containing 'tutorial' with regex" | search_analytics |
| "What's my Discover traffic look like?" | search_analytics |
| "Show me hourly traffic data for the past 3 days" | search_analytics |
| "Filter my queries to only non-branded terms" | search_analytics |
Comparisons
| What You Can Ask | Tool Used |
|---|---|
| "Compare this week's performance to last week" | compare_periods |
| "How did March compare to February?" | compare_periods |
| "Show me which queries gained or lost the most clicks week over week" | compare_periods |
Opportunities
| What You Can Ask | Tool Used |
|---|---|
| "Find quick win opportunities — high impressions but low CTR" | find_opportunities |
| "What content is declining in traffic?" | find_opportunities |
| "Are there any new emerging queries I should know about?" | find_opportunities |
| "Give me a full SEO opportunity analysis" | find_opportunities |
Traffic Diagnosis & Optimization
| What You Can Ask | Tool Used |
|---|---|
| "Which pages lost traffic recently and why?" | diagnose_traffic_drops |
| "Are any of my pages cannibalizing each other?" | cannibalization |
| "Which pages are slowly dying?" | content_decay |
| "How does my CTR compare to benchmarks?" | ctr_benchmarks |
| "Show me CTR benchmarks for my top queries" | ctr_benchmarks |
| "How is my /blog/ section performing?" | topic_clusters |
| "Show me the performance of all pages under /docs/" | topic_clusters |
Technical SEO
| What You Can Ask | Tool Used |
|---|---|
| "Is https://example.com/my-page indexed?" | inspect_url |
| "Check these 10 URLs and tell me which have indexing issues" | batch_inspect_urls |
| "List all my sitemaps and their status" | list_sitemaps |
| "Submit my new sitemap at https://example.com/sitemap-blog.xml" | submit_sitemap |
| "Which Search Console properties do I have access to?" | list_properties |
| "Notify Google that I updated https://example.com/page" | notify_url_update |
Multi-Tool Combinations
| What You Can Ask | Tools Used |
|---|---|
| "List my properties, then show top queries for each one" | list_properties + search_analytics |
| "Find quick wins and then inspect the top opportunity pages" | find_opportunities + batch_inspect_urls |
| "Compare this week to last week, then find what's declining" | compare_periods + find_opportunities |
| "Check my sitemaps, then inspect URLs from any with errors" | list_sitemaps + batch_inspect_urls |
Example Outputs
Here's what the tool output actually looks like. Examples use hiretalent.ph with sample data for illustration:
search_analytics — "Show me my top queries"
Search Analytics for sc-domain:hiretalent.ph
Period: 2026-03-15 to 2026-03-22 | Search Type: web | Data: all
Total: 14.8K clicks, 412.5K impressions, 3.59% avg CTR, 5.2 avg position
Showing 10 rows
Query | Clicks | Impressions | CTR | Position
----------------------------------------- | ------ | ----------- | ------ | --------
hire talent philippines | 1.8K | 5.2K | 34.62% | 1.3
hire remote filipino workers | 1.4K | 8.1K | 17.28% | 2.1
outsource to philippines | 1.2K | 15.3K | 7.84% | 3.5
filipino virtual assistant | 980 | 22.4K | 4.37% | 4.2
philippine staffing agency | 870 | 6.8K | 12.79% | 2.8
best hiring platform philippines | 640 | 4.1K | 15.61% | 1.9
remote workers philippines cost | 520 | 18.7K | 2.78% | 5.6
hire developers philippines | 410 | 9.3K | 4.41% | 3.7
hiretalent | 380 | 620 | 61.29% | 1.0
outsourcing vs hiring in-house | 290 | 31.2K | 0.93% | 7.8
search_analytics — "Break down traffic by device"
Search Analytics for sc-domain:hiretalent.ph
Period: 2026-03-15 to 2026-03-22 | Search Type: web | Data: all
Total: 14.8K clicks, 412.5K impressions, 3.59% avg CTR, 5.2 avg position
Showing 3 rows
Device | Clicks | Impressions | CTR | Position
------- | ------ | ----------- | ----- | --------
MOBILE | 8.2K | 265.8K | 3.09% | 5.8
DESKTOP | 6.1K | 134.2K | 4.55% | 4.3
TABLET | 510 | 12.5K | 4.08% | 5.1
find_opportunities — "Find quick win opportunities"
Opportunity Analysis for sc-domain:hiretalent.ph
Recent: 2026-03-15 to 2026-03-22 | Prior: 2026-02-15 to 2026-02-22
## Quick Wins
High-impression queries ranking 5-20 with low CTR. Optimizing titles/descriptions could boost clicks significantly.
Query | Page | Clicks | Impressions | CTR | Position
------------------------------------ | ------------------------------------------------------- | ------ | ----------- | ----- | --------
outsourcing vs hiring in-house | https://hiretalent.ph/blog/outsourcing-vs-inhouse/ | 290 | 31.2K | 0.93% | 7.8
how much to pay filipino VA | https://hiretalent.ph/blog/filipino-va-salary-guide/ | 145 | 24.6K | 0.59% | 9.4
remote team management tips | https://hiretalent.ph/blog/managing-remote-teams/ | 82 | 18.9K | 0.43% | 11.2
philippines tech talent market | https://hiretalent.ph/blog/ph-tech-talent-2026/ | 54 | 12.3K | 0.44% | 8.6
best countries to outsource to | https://hiretalent.ph/blog/top-outsourcing-countries/ | 38 | 9.7K | 0.39% | 10.1
compare_periods — "Compare this week to last week"
Period Comparison for sc-domain:hiretalent.ph
Period 1: 2026-03-08 to 2026-03-14
Period 2: 2026-03-15 to 2026-03-21
Overall: Clicks 12.1K → 14.8K (+22.3%)
Impressions 358.9K → 412.5K (+14.9%)
Top changes (sorted by absolute click delta):
Query | P1 Clicks | P2 Clicks | Delta | Change | P1 Pos | P2 Pos
-------------------------------- | --------- | --------- | ----- | ------- | ------ | ------
hire remote filipino workers | 890 | 1.4K | +510 | +57.3% | 3.4 | 2.1
outsource to philippines | 980 | 1.2K | +220 | +22.4% | 4.1 | 3.5
filipino virtual assistant | 1.1K | 980 | -120 | -10.9% | 3.8 | 4.2
hire talent philippines | 1.6K | 1.8K | +200 | +12.5% | 1.5 | 1.3
remote workers philippines cost | 620 | 520 | -100 | -16.1% | 4.9 | 5.6
inspect_url — "Is this page indexed?"
URL Inspection: https://hiretalent.ph/blog/outsourcing-vs-inhouse/
## Index Status
Verdict: PASS
Coverage: Submitted and indexed
Indexing: INDEXING_ALLOWED
Robots.txt: ALLOWED
Page fetch: SUCCESSFUL
Last crawl: 2026-03-20T14:32:00Z
Crawled as: DESKTOP
Google canonical: https://hiretalent.ph/blog/outsourcing-vs-inhouse/
User canonical: https://hiretalent.ph/blog/outsourcing-vs-inhouse/
Sitemaps: https://hiretalent.ph/sitemap.xml
## Mobile Usability
Verdict: PASS
View in Search Console: https://search.google.com/search-console/inspect?...
batch_inspect_urls — "Check these URLs for indexing issues"
Batch URL Inspection for sc-domain:hiretalent.ph
Inspected: 5/5 | Errors: 0
Quota remaining: 1995/day
## Summary
PASS: 3
NEUTRAL: 1
FAIL: 1
## URLs With Issues
NEUTRAL | https://hiretalent.ph/blog/old-salary-data-2024/
coverage=Crawled - currently not indexed, indexing=INDEXING_ALLOWED, crawled=2026-03-18
FAIL | https://hiretalent.ph/staging/new-landing-page/
coverage=Blocked by robots.txt, indexing=BLOCKED_BY_ROBOTS_TXT, crawled=never
list_sitemaps — "Show me my sitemaps"
Sitemaps for sc-domain:hiretalent.ph
Total: 2 sitemap(s)
Sitemap URL | Type | Status | Last Submitted | Errors | Warnings
------------------------------------------ | ------- | --------- | -------------- | ------ | --------
https://hiretalent.ph/sitemap.xml | Index | Processed | 2026-03-01 | 0 | 0
https://hiretalent.ph/sitemap-blog.xml | Sitemap | Processed | 2026-03-18 | 0 | 1
## Content Details
https://hiretalent.ph/sitemap.xml:
web: 1450 submitted, 1380 indexed
https://hiretalent.ph/sitemap-blog.xml:
web: 285 submitted, 264 indexed
list_properties — "Which properties do I have access to?"
Search Console Properties
Total: 2 property/properties
Property | Type | Permission
----------------------------- | ---------- | ----------
sc-domain:hiretalent.ph | Domain | siteOwner
https://blog.hiretalent.ph/ | URL Prefix | siteFullUser
Use any of these site URLs with other tools (e.g., search_analytics, inspect_url).
Environment Variables
| Variable | Description | Required |
|---|---|---|
GSC_SERVICE_ACCOUNT_PATH |
Path to service account JSON | One of these |
GSC_OAUTH_CREDENTIALS_PATH |
Path to OAuth credentials JSON | is required |
GSC_OAUTH_TOKEN_PATH |
Path to store OAuth tokens (default: ~/.gsc-mcp-token.json) |
No |
GSC_DATA_STATE |
Default data freshness: final, all, or hourly_all (default: all) |
No |
GSC_DEFAULT_SITE_URL |
Default site URL to use when not specified | No |
GSC_DEBUG |
Set to true for verbose debug logging |
No |
API Rate Limits
This server has built-in rate limiting to respect Google's API quotas:
| API | Rate Limit | Daily Limit |
|---|---|---|
| Search Analytics | 1,200 requests/min | — |
| URL Inspection | 600 requests/min | 2,000/day |
| Indexing API (publish) | 200 requests/min | 200/day |
| Indexing API (metadata) | 600 requests/min | 600/day |
| All other endpoints | 200 requests/min | — |
You don't need to worry about hitting these — the server manages them automatically. If a quota is reached, you'll get a clear error message explaining what happened and when to retry.
Troubleshooting
"User does not have sufficient permission for site"
- Make sure you added the service account email (or your OAuth user) to the property in Search Console
- Go to Settings > Users and permissions in Search Console and verify the email is listed
- For domain properties, use the format
sc-domain:example.com - For URL-prefix properties, include the protocol and trailing slash:
https://example.com/
"No data found" for a query
- GSC data has a 2-3 day delay for finalized data. Try setting
dataStateto"all"for fresher (but potentially partial) data - Verify the date range — data is available for the last 16 months
- Check that the site actually has search traffic for the specified search type
"Service account file not found"
- Double-check the path in
GSC_SERVICE_ACCOUNT_PATH— it must be an absolute path or relative to where the server runs - Make sure the JSON file was downloaded correctly from Google Cloud Console
OAuth browser window doesn't open
- This is a known limitation with stdio-based MCP servers. The server tries to open your default browser, but some MCP clients block this
- Workaround: Use a Service Account instead (recommended for MCP use)
- Or run the server manually once (
npx gluska-seo-gsc-mcp) in a terminal to complete the OAuth flow, then use the cached token in your MCP client
"spawn npx ENOENT" on macOS
- Claude Desktop and other MCP clients may not inherit your shell's PATH
- Fix: Use the full path to npx in your config. Find it with
which npxin your terminal - Example: Replace
"command": "npx"with"command": "/usr/local/bin/npx"(use your actual path)
Indexing API returns 403
- The Indexing API requires separate enablement — make sure you enabled "Web Search Indexing API" in Google Cloud Console
- Note: The Indexing API is officially supported only for pages with
JobPostingorBroadcastEventstructured data
Development
git clone https://github.com/justingluska/gluska-seo-gsc-mcp.git
cd gluska-seo-gsc-mcp
npm install
npm run build
npm test
Running Tests
npm test # Run all tests
npm run test:watch # Watch mode
npm run test:coverage # With coverage report
Project Structure
src/
cli.ts # Entry point (stdio transport)
server.ts # MCP server with all tool registrations
auth/
client.ts # OAuth 2.0 + Service Account authentication
api/
search-console.ts # Google Search Console API wrapper
indexing.ts # Google Indexing API wrapper
tools/
search-analytics.ts # search_analytics tool
compare-periods.ts # compare_periods tool
find-opportunities.ts # find_opportunities tool
traffic-drops.ts # diagnose_traffic_drops tool (NEW)
cannibalization.ts # cannibalization detection tool (NEW)
content-decay.ts # content_decay tool (NEW)
ctr-benchmarks.ts # ctr_benchmarks tool (NEW)
topic-clusters.ts # topic_clusters tool (NEW)
verify-claim.ts # verify_claim anti-hallucination tool (NEW)
inspect-url.ts # inspect_url + batch_inspect_urls tools
sitemaps.ts # list/submit/delete sitemap tools
properties.ts # list_properties tool
indexing.ts # notify_url_update + get_indexing_status tools
utils/
rate-limiter.ts # Token bucket rate limiter + daily quota tracker
dates.ts # Date utilities
formatting.ts # Response formatting (tables, numbers, CTR)
meta.ts # Data provenance metadata (NEW)
logger.ts # stderr-only logger
tests/
tools/ # Tool-level tests with mocked APIs
utils/ # Utility function tests
Contributing
Contributions are welcome! Please open an issue first to discuss what you'd like to change.
- Fork the repository
- Create your feature branch (
git checkout -b feature/my-feature) - Make your changes
- Run tests (
npm test) - Commit your changes
- Push to the branch and open a Pull Request
Acknowledgments
The anti-hallucination features in this project — data provenance (_meta blocks), guardrail prompts, and the verify_claim tool — were inspired by Suganthan Mohanadasan's work on his GSC MCP server and his blog post about building trust into AI-powered SEO tools. The ideas for dedicated cannibalization detection, content decay tracking, CTR benchmarks, traffic drop diagnosis, and topic cluster analysis were also informed by his write-up. Thanks Suganthan for sharing your work with the community.
Disclaimer
This is an unofficial, community-built tool and is not affiliated with, endorsed by, or sponsored by Google. Google Search Console is a trademark of Google LLC. This project uses the Google Search Console API under Google's Terms of Service.
License
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。