GSC SEO MCP
This server connects Google Search Console to AI assistants (Cursor, Claude, Gemini), enabling plain-English SEO analysis and management.
Server Management
Check server health, list/add/delete GSC properties
Search Analytics
Flexible queries with custom dimensions, filters, date ranges (up to 50,000 rows)
Top queries & pages, performance overviews, period comparisons, dimension breakdowns, and page-query matrices
SEO Analysis
Quick wins – keywords ranking positions 4–15 ready to push to page 1
CTR opportunities – underperforming snippets relative to ranking position
Content decay – pages with declining traffic across multiple periods
Traffic drop diagnosis – classify drops as ranking loss, CTR loss, demand decline, or mixed
Cannibalization – queries where multiple pages split traffic
Brand vs. non-brand split, search intent breakdown, device/country opportunities
Long-tail questions, page refresh priorities, internal link opportunities
Query-page fit – analyze a URL's query mix and intent alignment
Title/meta briefs – data-backed refresh briefs from high-impression, low-CTR queries
Anomaly alerts – detect abnormal click/impression losses
Indexing, Sitemaps & URL Inspection
Inspect individual or batches of URLs for index status, canonicalization, and crawl issues
Summarize index coverage across a URL list
List, submit, and delete sitemaps
Send Indexing API URL_UPDATED/URL_DELETED signals for eligible pages (JobPosting/BroadcastEvent)
Reporting & Verification
Multi-site dashboards, generate Markdown SEO reports
Re-query GSC to verify numeric SEO claims before presenting to stakeholders
Provides tools for querying Google Search Console data, including search analytics, performance snapshots, quick-win keywords, content decay analysis, CTR opportunities, cannibalization checks, brand vs non-brand split, search intent breakdown, URL inspection, sitemap management, Indexing API notifications, multi-site dashboards, and Markdown report generation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@GSC SEO MCP Find high-impression keywords ranking positions 4 to 15."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
GSC SEO MCP
Connect Google Search Console to Cursor, Claude, or Gemini. Ask questions in plain English and get real SEO data back.
What you can ask your AI once it's set up
Show me the biggest SEO opportunities for my site.
Which pages are losing clicks?
Find keywords ranking positions 4–15 that I can push to page 1.
Split branded vs non-branded traffic for the last 90 days.
Which pages have bad CTR for their ranking position?
Inspect these URLs and tell me what's wrong with indexing.
Generate a Markdown SEO report for the last 28 days.Related MCP server: mcp-gsc-advanced
Setup
There are two parts:
Google — give the MCP access to your Search Console data
Your AI app — tell Cursor / Claude / Gemini how to run it
Pick your Google auth method first:
Service Account | OAuth | |
Best for | Agencies, client sites, teams | Personal sites, your own account |
How it works | JSON key file, no browser login | Signs in via browser once |
Recommended? | Yes, simpler for MCP | Works too |
Part 1 — Google Setup
Step 1: Create a Google Cloud project
This is just a container for API access. It is not your website.
Go to console.cloud.google.com
Click the project dropdown at the top → New Project
Name it
GSC SEO MCPand click CreateMake sure it's selected in the top dropdown after creation
Step 2: Enable the Search Console API
Go to APIs & Services → Library
Search Google Search Console API → click it → click Enable
Optional: also enable Indexing API if you want the
indexing_*tools (only useful for JobPosting/livestream pages)
Option A: Service Account (recommended)
1. Create the service account
Go to IAM & Admin → Service Accounts
Click Create service account
Name:
gsc-seo-mcp→ click Create and continueSkip the role assignment → click Continue → click Done
Copy the service account email — looks like:
gsc-seo-mcp@your-project-id.iam.gserviceaccount.com
2. Download the key file
Click the service account you just created
Go to the Keys tab → Add key → Create new key → JSON → Create
Google downloads a
.jsonfile — save it somewhere safe, like:Mac/Linux:
/Users/your-name/keys/gsc-seo-mcp.jsonWindows:
C:/Users/your-name/keys/gsc-seo-mcp.json
Don't commit this file to GitHub. Treat it like a password.
3. Add it to Search Console
Select your property
Go to Settings → Users and permissions → Add user
Paste the service account email, set permission to Full, click Add
You need to be a property owner to do this.
4. Your MCP config
{
"mcpServers": {
"gsc-seo": {
"command": "npx",
"args": ["-y", "gsc-seo-mcp"],
"env": {
"GSC_AUTH_MODE": "service_account",
"GSC_KEY_FILE": "/absolute/path/to/gsc-seo-mcp.json",
"GSC_SITE_URL": "sc-domain:example.com"
}
}
}
}Windows path tip — use forward slashes or double backslashes:
"GSC_KEY_FILE": "C:/Users/your-name/keys/gsc-seo-mcp.json"Option B: OAuth (sign in with Google)
Use this if you want to connect with your own Google account via browser login.
1. Set up the OAuth consent screen
Go to APIs & Services → OAuth consent screen
Choose External (works for Gmail accounts) → fill in app name, email → save
If the app is in testing mode, add your Gmail under Test users
2. Create the OAuth client
Go to APIs & Services → Credentials → Create credentials → OAuth client ID
Application type: Desktop app → name it
GSC SEO MCP Desktop→ click CreateClick Download JSON — save it like:
Mac/Linux:
/Users/your-name/keys/gsc-oauth-client.jsonWindows:
C:/Users/your-name/keys/gsc-oauth-client.json
3. Your MCP config
{
"mcpServers": {
"gsc-seo": {
"command": "npx",
"args": ["-y", "gsc-seo-mcp"],
"env": {
"GSC_AUTH_MODE": "oauth",
"GSC_OAUTH_SECRETS_FILE": "/absolute/path/to/gsc-oauth-client.json",
"GSC_TOKEN_FILE": "/absolute/path/to/gsc-oauth-token.json",
"GSC_SITE_URL": "sc-domain:example.com"
}
}
}
}GSC_TOKEN_FILE is where the MCP saves your login token after the first browser sign-in. If you leave it out, it saves to ~/.gsc-seo-mcp/token.json by default.
4. First run
Restart your MCP client, then ask it to run server_health or list_properties. A browser window will open — sign in with Google and approve access. That's it, no repeat login needed.
If Google shows an "unverified app" warning, click Advanced → Continue — this is your own OAuth app, it's fine.
Part 2 — Add to your AI app
Node.js 20+ is required. Download here if you don't have it.
Cursor
Create .cursor/mcp.json in your project folder (or use global MCP settings):
{
"mcpServers": {
"gsc-seo": {
"command": "npx",
"args": ["-y", "gsc-seo-mcp"],
"env": {
"GSC_AUTH_MODE": "service_account",
"GSC_KEY_FILE": "/absolute/path/to/service-account.json",
"GSC_SITE_URL": "sc-domain:example.com",
"GSC_BRAND_TERMS": "mybrand,mybrand.com"
}
}
}
}Claude Desktop
Edit claude_desktop_config.json:
Mac:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"gsc-seo": {
"command": "npx",
"args": ["-y", "gsc-seo-mcp"],
"env": {
"GSC_AUTH_MODE": "service_account",
"GSC_KEY_FILE": "/absolute/path/to/service-account.json",
"GSC_SITE_URL": "sc-domain:example.com"
}
}
}
}Restart Claude Desktop after saving.
Claude Code
Create .mcp.json in your project:
{
"mcpServers": {
"gsc-seo": {
"command": "npx",
"args": ["-y", "gsc-seo-mcp"],
"env": {
"GSC_AUTH_MODE": "service_account",
"GSC_KEY_FILE": "/absolute/path/to/service-account.json",
"GSC_SITE_URL": "sc-domain:example.com"
}
}
}
}Or via CLI:
claude mcp add --transport stdio \
--env GSC_AUTH_MODE=service_account \
--env GSC_KEY_FILE=/absolute/path/to/service-account.json \
--env GSC_SITE_URL=sc-domain:example.com \
gsc-seo -- npx -y gsc-seo-mcpGemini CLI
Edit ~/.gemini/settings.json (or .gemini/settings.json in your project):
{
"mcpServers": {
"gsc-seo": {
"command": "npx",
"args": ["-y", "gsc-seo-mcp"],
"env": {
"GSC_AUTH_MODE": "service_account",
"GSC_KEY_FILE": "/absolute/path/to/service-account.json",
"GSC_SITE_URL": "sc-domain:example.com"
},
"timeout": 120000,
"trust": false
}
}
}Property URL format
Use the exact format from Search Console:
sc-domain:example.com ← domain property (recommended)
https://www.example.com/ ← URL-prefix property (include the trailing slash)All config variables
Variable | Required | What it does |
| Recommended | Default property. Example: |
| Optional | Comma-separated properties for multi-site dashboards |
| Optional |
|
| Service account | Path to service account JSON key |
| Service account | Alternative path variable |
| OAuth | Path to OAuth client secret JSON |
| OAuth alternative | Client ID if not using a secrets file |
| OAuth alternative | Client secret if not using a secrets file |
| Optional | Where OAuth token is saved after login |
| Optional | Comma-separated brand terms for |
| Optional | Folder for Markdown reports. Defaults to |
| Optional |
|
Tools
Core
Tool | What it does |
| Shows config status, auth mode, and tool count |
| Lists all Search Console properties you have access to |
| Gets permission details for one property |
| Adds a site to your account |
| Removes a site from your account |
Search Analytics
Tool | What it does |
| Full query with dimensions, filters, search type, and data state |
| Pulls up to 50,000 rows for deeper audits |
| Top queries, optionally filtered by page |
| Top pages, optionally filtered by query |
| Site snapshot with period comparison, daily trend, devices |
| Current vs previous period by page, query, country, or device |
| Performance by one dimension |
| Maps pages to the queries driving them |
SEO Analysis
Tool | What it answers |
| Which keywords are close enough to improve fast? |
| Which snippets underperform for their ranking position? |
| Which pages are declining across multiple periods? |
| Was the drop rankings, CTR, demand, coverage, or mixed? |
| Which queries are split across competing pages? |
| How much traffic is brand vs non-brand? |
| How do queries split across informational, commercial, transactional, navigational, local? |
| Which device/country/page segments have weak CTR or ranking? |
| Which question queries deserve content expansion? |
| Which pages should be updated first? |
| Which strong pages can support weaker pages? |
| What does one page rank for, and does the content match? |
| Which queries should inform title/meta refreshes? |
| Which pages had abnormal losses recently? |
Indexing, Sitemaps, URLs
Tool | What it does |
| Checks one URL for index status, canonical, crawl, coverage |
| Inspects multiple URLs |
| Summarizes inspection results across a URL list |
| Lists submitted sitemaps with errors and indexed counts |
| Details for one sitemap |
| Submits or refreshes a sitemap |
| Deletes a submitted sitemap |
| Sends an Indexing API notification for an eligible URL |
| Sends multiple Indexing API notifications |
| Checks latest Indexing API notification status for a URL |
Reporting
Tool | What it does |
| Compares multiple properties in one view |
| Saves a Markdown SEO report to disk |
| Re-queries GSC to check a number before you report it to a client |
Troubleshooting
Tools don't show up in my AI app
Make sure Node.js 20+ is installed. Check your MCP config uses npx -y gsc-seo-mcp exactly. All file paths must be absolute (not ~/ or relative).
Service account shows no properties You need to add the service account email to Search Console under Settings → Users and permissions.
URL Inspection fails
The URL must belong to the property in GSC_SITE_URL. For URL-prefix properties, use the exact prefix with protocol and trailing slash.
OAuth doesn't open the browser
Set GSC_OAUTH_PORT=0 to let it pick a free port. If you're on a remote machine, you'll need to run this locally instead.
Data notes
Search Analytics rows are sorted by clicks. The API has internal row limits, so not every possible row is included.
GSC_DATA_STATE=allincludes fresh data. Usefinalfor finalized reporting numbers.URL Inspection shows Google's index state, not a live crawl.
The Indexing API is for JobPosting and BroadcastEvent pages only — it's not a general indexing shortcut.
Security
Never commit service account keys, OAuth secrets, or token files to Git.
Use read-only Search Console permissions if you don't need write tools.
Review
delete_site,delete_sitemap,submit_sitemap, andindexing_publish_urlcalls before approving them.
Official docs
License
MIT. If this saves you time, star the repo.
Available Tools
40 toolsadd_siteA
Add a site to the authenticated account. Requires write scope and verification still happens in Search Console.
Inputs: siteUrl (required).
advanced_filter_queryC
Pull up to 50,000 Search Analytics rows with advanced filters for deeper audits.
Inputs: siteUrl, startDate, endDate, days, +5 more.
anomaly_alertsB
Detect recent page/query anomalies using the latest period versus the immediately previous period.
Inputs: siteUrl, days, minLostClicks, limit.
batch_inspect_urlsB
Inspect multiple URLs sequentially. Keep batches small to respect URL Inspection API quotas.
Inputs: urls (required), siteUrl, languageCode.
brand_nonbrand_splitC
Split performance into brand and non-brand search demand using configured or supplied brand terms.
Inputs: siteUrl, startDate, endDate, days, +2 more.
cannibalization_checkC
Find queries where multiple pages compete and split impressions or clicks.
Inputs: siteUrl, startDate, endDate, days, +3 more.
compare_periodsC
Compare current vs previous period by page, query, country, device, or search appearance.
Inputs: siteUrl, startDate, endDate, days, +3 more.
content_decayC
Detect pages declining across multiple equal periods, not just one noisy comparison.
Inputs: siteUrl, periodDays, periods, minOldestClicks, +1 more.
ctr_opportunitiesB
Find queries and pages where CTR is below an expected CTR curve for the current average position.
Inputs: siteUrl, startDate, endDate, days, +3 more.
delete_siteA
Remove a site from the authenticated account. Destructive: use only when explicitly requested.
Inputs: siteUrl (required).
delete_sitemapA
Delete a submitted sitemap from Search Console. Destructive: use only when explicitly requested.
Inputs: feedpath (required), siteUrl.
device_country_opportunitiesB
Find device and country segments with high impressions but weak CTR or ranking.
Inputs: siteUrl, startDate, endDate, days, +2 more.
dimension_breakdownC
Break performance down by a single dimension such as country, device, date, or search appearance.
Inputs: siteUrl, startDate, endDate, days, +3 more.
generate_markdown_reportC
Generate a Markdown SEO performance report and save it to GSC_REPORT_DIR.
Inputs: siteUrl, startDate, endDate, days, +2 more.
get_siteB
Get permission details for a specific Search Console property.
Inputs: siteUrl.
get_sitemapC
Get details for one sitemap URL.
Inputs: feedpath (required), siteUrl.
index_coverage_summaryC
Summarize indexed/not-indexed/canonical coverage for a supplied list of URLs.
Inputs: urls (required), siteUrl, languageCode.
indexing_batch_publishC
Publish multiple Indexing API URL notifications sequentially. Use only for eligible pages and respect quota.
Inputs: urls (required), type.
indexing_get_metadataB
Check the latest Indexing API update/remove notification metadata for a URL.
Inputs: url (required).
indexing_publish_urlB
Notify Google that an eligible URL was updated or removed through the Indexing API.
Inputs: url (required), type.
inspect_urlC
Inspect a URL's indexed status, canonical, crawl, robots, and coverage signals.
Inputs: inspectionUrl (required), siteUrl, languageCode.
internal_link_opportunitiesA
Suggest internal linking opportunities from stronger pages to weaker pages sharing valuable queries.
Inputs: siteUrl, startDate, endDate, days, +2 more.
list_propertiesA
List Search Console properties available to the authenticated user or service account.
Inputs: no named parameters.
list_sitemapsA
List submitted sitemaps with status, errors, warnings, and indexed URL counts.
Inputs: siteUrl.
long_tail_questionsC
Surface question and long-tail queries that can become FAQ sections, support docs, or content expansions.
Inputs: siteUrl, startDate, endDate, days, +3 more.
multi_site_dashboardC
Compare configured Search Console properties in one health dashboard.
Inputs: siteUrls, days.
page_query_matrixA
Map pages to the queries that drive them. Great for content briefs and cannibalization review.
Inputs: siteUrl, startDate, endDate, days, +6 more.
page_refresh_prioritiesB
Prioritize pages to update using lost clicks, declining impressions, CTR gaps, and position changes.
Inputs: siteUrl, startDate, endDate, days, +2 more.
performance_overviewB
Return a site-level snapshot with previous-period comparison, daily trend, devices, and search appearances.
Inputs: siteUrl, startDate, endDate, days.
query_page_fitB
Analyze one URL's query mix, intent fit, and content angles based on the queries it already ranks for.
Inputs: pageUrl (required), siteUrl, startDate, endDate, +2 more.
quick_winsB
Find keywords ranking around positions 4-15 where better content, internal links, or snippets can win traffic.
Inputs: siteUrl, startDate, endDate, days, +4 more.
search_analyticsC
Run a flexible Search Analytics query. Use this for exact data pulls with custom dimensions and filters.
Inputs: siteUrl, startDate, endDate, days, +6 more.
search_intent_breakdownC
Classify queries into informational, commercial, transactional, navigational, and local intent buckets.
Inputs: siteUrl, startDate, endDate, days, +2 more.
server_healthA
Show server configuration, enabled defaults, and tool count without exposing secrets.
Inputs: no named parameters.
submit_sitemapA
Submit or refresh a sitemap in Search Console. Requires write scope.
Inputs: feedpath (required), siteUrl.
title_meta_briefA
Create a data-backed title/meta refresh brief from high-impression, low-CTR queries for one page.
Inputs: pageUrl (required), siteUrl, startDate, endDate, +3 more.
top_pagesB
Find top pages with optional query filtering, useful for landing page and folder audits.
Inputs: siteUrl, startDate, endDate, days, +3 more.
top_queriesB
Find top queries with optional page filtering, useful for keyword and content research.
Inputs: siteUrl, startDate, endDate, days, +3 more.
traffic_drop_diagnosisB
Explain page or query traffic losses as ranking loss, CTR loss, demand decline, or mixed signal.
Inputs: siteUrl, startDate, endDate, days, +3 more.
verify_claimC
Re-query GSC to verify a numeric SEO claim before presenting it to a client or stakeholder.
Inputs: siteUrl, startDate, endDate, days, +6 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 40 tools
Most tools have clearly distinct purposes, with descriptions that differentiate similar operations (e.g., search_analytics vs. specialized queries). A few pairs like indexing_publish_url and indexing_batch_publish could cause minor confusion, but overall boundaries are clear.
Tools consistently use snake_case, but naming patterns vary between verb_noun (add_site, inspect_url) and noun_verb (cannibalization_check, content_decay). The mix is understandable and readable, with only a few deviations from a strict pattern.
With 40 tools, the server is heavily overloaded. While each tool has a specific function, the sheer number exceeds a manageable scope and risks overwhelming agents or users. Many tools could be consolidated or are redundant.
The tool set covers a broad range of Google Search Console functionality: site management, sitemaps, URL inspection, indexing, analytics, and specialized SEO analyses. Minor gaps exist (e.g., no tool for user permissions or manual actions), but core workflows are well supported.
Maintenance
Related MCP Connectors
Google Search Console, GA4 and PageSpeed MCP server for Claude, ChatGPT and Cursor. Free, hosted.
SEO MCP server for keyword research, SERP analysis, audits, and Search Console workflows.
Remote MCP server that gives Claude, ChatGPT, Cursor or any MCP client Google search volume, CPC, competition and similar keywords for 50+ countries. Works with no signup at 20 lookups a day; sign in with OAuth or an API key for higher limits, or $4.99 a month for unlimited.
SEO MCP server for keyword research, live SERPs, backlinks, site audits and AI visibility.
Related MCP Servers
- AlicenseBqualityBmaintenanceSEO audit and Google Search Console MCP server with 23 tools. Search analytics, URL inspection, Indexing API, Core Web Vitals (CrUX), striking distance keywords, keyword cannibalization detection, branded query analysis, and automated site audits.433MIT
- AlicenseAqualityDmaintenanceMCP server for advanced Google Search Console analysis — keyword cannibalization detection, page-level query deep dive, and rank change tracking.3MIT
- AlicenseCqualityBmaintenanceMCP server providing 32 tools for Google Search Console and Google Analytics 4, enabling search analytics, URL inspection, indexing, and cross-platform analysis via natural language.8159 PyPI24MIT
- AlicenseNot gradedqualityDmaintenanceRead-only MCP server that gives AI clients access to Google Search Console data, enabling natural language queries about traffic, rankings, and SEO opportunities.153 npmMIT