# GSC-MCP-Server > Google Search Console MCP Server β€” Connect Google Search Console to Claude, Cursor, and other MCP clients. [![npm version](https://img.shields.io/npm/v/@appsyogi/gsc-mcp-server.svg)](https://www.npmjs.com/package/@appsyogi/gsc-mcp-server) [![npm downloads](https://img.shields.io/npm/dm/@appsyogi/gsc-mcp-server.svg)](https://www.npmjs.com/package/@appsyogi/gsc-mcp-server) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![CI](https://github.com/AppsYogi-com/gsc-mcp-server/actions/workflows/ci.yml/badge.svg)](https://github.com/AppsYogi-com/gsc-mcp-server/actions/workflows/ci.yml) ## Features - πŸ” **Search Analytics** β€” Query clicks, impressions, CTR, and position data - πŸ“Š **SEO Opportunities** β€” Find low-CTR keywords, detect cannibalization issues - πŸ“ˆ **Reports** β€” Weekly summaries, period comparisons - πŸ—ΊοΈ **Sitemaps** β€” List, submit, and manage sitemaps - πŸ”Ž **URL Inspection** β€” Check indexing status (requires full scope) - πŸ’Ύ **Caching** β€” SQLite cache for faster repeated queries - πŸ” **Secure** β€” OAuth tokens stored in OS keychain ## Quick Start ```bash # Install globally npm install -g @appsyogi/gsc-mcp-server # Set up OAuth credentials gsc-mcp init # Verify setup gsc-mcp doctor # Start the server (for MCP clients) gsc-mcp run ``` ## Prerequisites ### 1. Create Google Cloud OAuth Credentials You need to create your own OAuth credentials in Google Cloud Console: 1. Go to [Google Cloud Console](https://console.cloud.google.com/) 2. Create a new project or select an existing one 3. Enable the **Google Search Console API**: - Go to "APIs & Services" β†’ "Library" - Search for "Google Search Console API" - Click "Enable" 4. Create OAuth credentials: - Go to "APIs & Services" β†’ "Credentials" - Click "Create Credentials" β†’ "OAuth client ID" - Choose "Desktop application" - Name it (e.g., "GSC-MCP") - Click "Create" 5. Copy the **Client ID** and **Client Secret** 6. Add test users (required while app is in testing mode): - Go to "APIs & Services" β†’ "OAuth consent screen" - Scroll to "Test users" section - Click "Add users" - Add the Google account email(s) you'll use to authenticate - Click "Save" > **Note:** While your app's publishing status is "Testing", only test users can authenticate. You can add up to 100 test users. ### 2. Configure GSC-MCP Run the init command and enter your credentials: ```bash gsc-mcp init ``` This will: - Prompt for your Client ID and Client Secret - Open a browser for Google authentication - Store your refresh token securely in the OS keychain ## Usage ### CLI Commands ```bash # Initialize with OAuth (interactive) gsc-mcp init # Initialize with service account gsc-mcp init --service-account /path/to/key.json # Initialize with full scope (for sitemap submission, URL inspection) gsc-mcp init --scope full # Check configuration and connectivity gsc-mcp doctor gsc-mcp doctor --verbose # Start MCP server (stdio mode) gsc-mcp run # Start in HTTP mode (for debugging) gsc-mcp run --http 3333 # View current configuration gsc-mcp config # Clear credentials gsc-mcp logout ``` ### MCP Client Configuration #### Claude Desktop Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS): ```json { "mcpServers": { "gsc": { "command": "gsc-mcp", "args": ["run"] } } } ``` #### VS Code (Copilot) Add to your VS Code MCP settings (`~/.vscode/mcp.json` or workspace settings): ```json { "servers": { "gsc": { "command": "gsc-mcp", "args": ["run"], "type": "stdio" } } } ``` #### Cursor Add to your Cursor MCP config: ```json { "mcpServers": { "gsc": { "command": "npx", "args": ["-y", "@appsyogi/gsc-mcp-server", "run"] } } } ``` ## Available Tools ### Search Analytics | Tool | Description | |------|-------------| | `searchanalytics.query` | Query search performance data with dimensions and filters | | `report.comparePeriods` | Compare two time periods | ### Sitemaps | Tool | Description | Scope | |------|-------------|-------| | `sitemaps.list` | List all sitemaps | readonly | | `sitemaps.get` | Get sitemap details | readonly | | `sitemaps.submit` | Submit a sitemap | full | | `sitemaps.delete` | Delete a sitemap | full | ### URL Inspection | Tool | Description | Scope | |------|-------------|-------| | `urlInspection.inspect` | Inspect a URL's indexing status | full | | `urlInspection.batchInspect` | Inspect multiple URLs | full | ### SEO Opportunities | Tool | Description | |------|-------------| | `opportunities.lowCtrHighPos` | Find quick-win keywords (position 4-20, low CTR) | | `opportunities.cannibalization` | Detect keyword cannibalization | | `report.weeklySummary` | Generate weekly performance summary | ### Export | Tool | Description | |------|-------------| | `export.csv` | Export data as CSV | | `export.json` | Export data as JSON | ## LLM Optimization (v0.2.0+) All tools support parameters to reduce token consumption for LLM use cases: ### Compact Response Format Add `format: "compact"` to any tool for LLM-optimized output: ```json { "siteUrl": "sc-domain:example.com", "startDate": "2026-01-01", "endDate": "2026-01-28", "dimensions": ["query"], "format": "compact" } ``` **Compact format features:** - Short key names (`imp` instead of `impressions`, `pos` instead of `position`) - CTR as percentage string (`"5.41%"` instead of `0.054123...`) - Natural language summary field - URL prefixes stripped from page paths **Example compact response:** ```json { "summary": "Top query 'example keyword' got 150 clicks at position 3.2", "rows": [ {"key": "example keyword", "clicks": 150, "imp": 2800, "ctr": "5.36%", "pos": 3.2} ] } ``` ### Date Rollup Granularity For date dimension queries, use `granularity` to reduce row count: ```json { "siteUrl": "sc-domain:example.com", "startDate": "2025-07-01", "endDate": "2026-01-28", "dimensions": ["date"], "granularity": "weekly" } ``` **Options:** - `daily` β€” Default, returns daily data - `weekly` β€” Aggregates by week (Monday-based) - `monthly` β€” Aggregates by month - `auto` β€” Picks based on date range (>90 days = monthly, >21 days = weekly) ### Default Row Limits Default `rowLimit` is **25** (optimized for LLM context windows). Use higher values when needed: ```json { "siteUrl": "sc-domain:example.com", "rowLimit": 100 } ``` Maximum: 25,000 rows. ## Resources The server exposes browsable resources: - `gsc://sites` β€” List all properties - `gsc://sites/{siteUrl}/sitemaps` β€” List sitemaps for a property ## Scopes GSC-MCP supports two permission levels: ### Readonly (default) - Search analytics queries - List sitemaps - SEO analysis tools ```bash gsc-mcp init # Uses readonly by default ``` ### Full - Everything in readonly, plus: - Submit/delete sitemaps - URL inspection ```bash gsc-mcp init --scope full ``` ## Configuration Files GSC-MCP stores configuration in platform-specific locations: | Platform | Config Path | |----------|-------------| | macOS | `~/.config/gsc-mcp/` | | Linux | `~/.config/gsc-mcp/` | | Windows | `%APPDATA%/gsc-mcp/` | Files: - `config.json` β€” OAuth client ID/secret, scope settings - `cache.sqlite` β€” Query cache and saved presets Tokens are stored securely in the OS keychain when available. ## Service Account Setup For automated/server use, you can use a service account instead of OAuth: 1. Create a service account in Google Cloud Console 2. Download the JSON key file 3. Add the service account email as an owner in Google Search Console 4. Initialize: ```bash gsc-mcp init --service-account /path/to/key.json ``` ## API Quotas Google Search Console API has a default quota of **1,200 queries per day**. GSC-MCP includes: - Automatic retry with exponential backoff - Query caching to reduce API calls - Pagination handling for large result sets ## Examples ### Find Quick-Win Keywords ``` Use gsc-mcp to find quick-win opportunities for my site https://example.com ``` ### Weekly Report ``` Generate a weekly performance summary for https://example.com ``` ### Compare Periods ``` Compare search performance for https://example.com between last week and the week before ``` ### Export Data ``` Export the top 1000 queries for https://example.com in the last 28 days as CSV ``` ## Development ```bash # Clone the repo git clone https://github.com/AppsYogi-com/gsc-mcp-server.git cd gsc-mcp-server # Install dependencies npm install # Build npm run build # Run in dev mode npm run dev # Test locally node dist/cli/index.js doctor ``` ## License MIT ## Contributing Contributions are welcome! Please open an issue or PR. ## Credits Built with: - [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk) - [googleapis](https://github.com/googleapis/google-api-nodejs-client) - [commander](https://github.com/tj/commander.js) - [better-sqlite3](https://github.com/WiseLibs/better-sqlite3)