gsc-doctor
Provides tools for diagnosing page indexing issues, inspecting individual URLs, viewing search analytics, and managing sitemaps in Google Search Console.
Click on "Install 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-doctorWhy aren't my pages indexed?"
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-doctor
An MCP server for Google Search Console, built around one question that the existing tools answer badly: why are my pages not indexed?
Google exposes the Pages report in the Search Console UI, but there is no bulk API for it. You can only inspect URLs one at a time. Most Search Console MCP servers stop at thin one-tool-per-endpoint wrappers and leave you to do that fan-out by hand. gsc-doctor does it for you: it reads your sitemap, inspects every URL, groups the results by coverage state, and annotates each group with what the state actually means and what to do about it.
Tools
Tool | What it does |
| Reads URLs from your sitemap (or an explicit list), inspects each, and returns a grouped coverage report with plain-language guidance. This is the reason the project exists. |
| Lists the properties your service account can read, with permission levels. Run this first to get the exact |
| Full URL Inspection result for a single page: index status, Google's chosen canonical, crawl details, mobile usability, rich results. |
| Clicks, impressions, CTR and average position, broken down by query, page, country, device, date or search appearance. |
| Every submitted sitemap with last download time, errors, warnings and URL counts. |
| Submits a sitemap. Only registered when |
Beyond the raw coverage state, diagnose_indexing flags problems that are easy to miss in the UI:
Pages where Google picked a different canonical than the one you declared
noindexarriving via meta tag orX-Robots-Tagheaderrobots.txt blocks
Failed page fetches
Indexed pages that no submitted sitemap references
Related MCP server: Google Search Console MCP Server
Setup
1. Enable the API and create a service account
Open the Google Cloud Console and create (or pick) a project.
Enable the Google Search Console API for that project.
Go to IAM & Admin > Service Accounts and create a service account.
Under its Keys tab, add a key of type JSON and download it.
2. Grant it access to your property
Open Search Console, then Settings > Users and permissions > Add user. Paste the service account's client_email (it looks like name@project.iam.gserviceaccount.com) and give it Full or Restricted access.
This step is the one people forget. Without it every call returns HTTP 403.
3. Install
git clone https://github.com/gerald-guledew/gsc-doctor.git
cd gsc-doctor
npm install
npm run build4. Register with Claude Code
claude mcp add gsc-doctor --env GSC_CREDENTIALS_PATH=/absolute/path/to/key.json -- node /absolute/path/to/gsc-doctor/dist/index.jsOr add it to your MCP client config directly:
{
"mcpServers": {
"gsc-doctor": {
"command": "node",
"args": ["/absolute/path/to/gsc-doctor/dist/index.js"],
"env": {
"GSC_CREDENTIALS_PATH": "/absolute/path/to/key.json"
}
}
}
}Configuration
Variable | Purpose |
| Path to the service account JSON key. |
| The key as an inline JSON string, for environments that inject secrets as env vars. Takes precedence over the path. |
| Set to |
If neither credential variable is set, the server falls back to Application Default Credentials.
Usage
Ask your assistant things like:
"Why aren't my pages indexed?"
"Diagnose indexing for sc-domain:example.com"
"Which queries drove impressions last month but almost no clicks?"
"Is https://example.com/pricing/ indexed, and which canonical did Google choose?"
Property identifiers must match Search Console exactly: sc-domain:example.com for a domain property, https://example.com/ for a URL-prefix property. Use list_properties if you are unsure.
Security
Writes are opt-in. With
GSC_ALLOW_WRITESunset the server requests the read-only OAuth scope, so the token it holds is incapable of mutating your property even if something tried.Credentials never leave your machine. The server runs locally and talks only to Google's API.
.gitignorealready excludes the common service account key filename patterns. Keep your key out of the repo.
Limitations
These are constraints of Google's API, not of this server:
No "Request Indexing". The UI button has no API equivalent. The separate Indexing API officially accepts only
JobPostingandBroadcastEventmarkup. Tools that point it at ordinary pages are working outside Google's documented policy.No bulk Pages report. URL Inspection is per-URL, quota roughly 2,000 per day and 600 per minute per property.
diagnose_indexingdefaults to 50 URLs per run for that reason.No Removals, manual actions or security issues. Not exposed by the API at all.
No Core Web Vitals. That data lives in the separate CrUX API.
Search Console data lags real time by about three days, which is why
search_analyticsdefaults its end date accordingly.
License
MIT
Available Tools
5 toolsdiagnose_indexingDiagnose index coverageARead-only
Explains why pages are or are not indexed. Reads URLs from the site's sitemap (or takes an explicit list), inspects each one, and groups the results by coverage state with plain-language guidance. This reconstructs the Pages report, which Google exposes in the UI but not as a bulk API.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | Specific URLs to inspect. When omitted, URLs are read from the sitemap. | |
| maxUrls | No | Cap on URLs inspected (default 50). Daily inspection quota is about 2,000. | |
| siteUrl | Yes | Property identifier exactly as Search Console lists it: "sc-domain:example.com" for a domain property, or "https://example.com/" for a URL-prefix property. | |
| sitemapUrl | No | Sitemap to read URLs from. Defaults to <origin>/sitemap.xml. | |
| concurrency | No | Parallel inspections (default 5). The per-minute limit is about 600. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, and the description consistently describes read-only operations. It adds meaningful behavioral context beyond the annotation: it reads from sitemaps, inspects URLs, groups by coverage state, and produces plain-language guidance. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no wasted words. The core purpose is front-loaded, followed by operational detail and then a rationale that aids selection. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description, rich parameter schema, and read-only annotation together cover the tool's purpose, input selection, behavior, and output shape at a useful level. An output schema is absent, but the description gives enough return expectation by mentioning grouping by coverage state and guidance. Minor detail about exact response format is not critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description reinforces the sitemap-vs-explicit-list behavior for `urls` and `sitemapUrl`, but adds no new parameter meaning beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: it 'Explains why pages are or are not indexed' and details the mechanism ('Reads URLs from the site's sitemap', 'inspects each one', 'groups the results by coverage state'). It also distinguishes itself by noting it reconstructs the Pages report not available as a bulk API.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly communicates when to use it: for batch index-coverage diagnostics via sitemap or explicit URL list, especially when the Pages report is needed outside the UI. It does not explicitly name sibling alternatives or state exclusions, but the bulk-report framing provides strong usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_urlInspect a single URLARead-only
Returns the full URL Inspection result for one page: index status, canonical Google selected, crawl details, mobile usability and detected rich results.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The full URL to inspect. Must belong to the property. | |
| siteUrl | Yes | Property identifier exactly as Search Console lists it: "sc-domain:example.com" for a domain property, or "https://example.com/" for a URL-prefix property. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, lowering the bar. The description adds useful behavioral context by specifying exactly what the result includes, such as 'index status', 'canonical Google selected', 'crawl details', and 'mobile usability'. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tightly written sentence that front-loads the core action and resource ('Returns the full URL Inspection result for one page') and then efficiently lists the included result categories. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description compensates by naming the main result categories an agent should expect. It does not cover error conditions or authentication nuances, but for a read-only inspection tool with only two well-documented parameters, this is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters fully. The description adds no additional parameter-level detail beyond mentioning a single 'page', but the baseline of 3 is appropriate when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Returns'), a specific resource ('URL Inspection result for one page'), and enumerates the result categories (index status, canonical, crawl details, mobile usability, rich results). This clearly distinguishes it from sibling tools like search_analytics or list_sitemaps, which operate on different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this is for inspecting a single URL, which gives context for when to use it. It does not explicitly name alternatives or say when not to use it, but the 'one page' scope is sufficient directional guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_propertiesList Search Console propertiesARead-only
Lists every Search Console property the configured service account can read, with its permission level. Run this first to discover the exact siteUrl string other tools need.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, and the description reinforces this by saying the properties are those the service account 'can read.' It also adds context about the permission level being included and the purpose of discovering siteUrl strings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core action and result are front-loaded, and the usage guidance is compact and directly actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, parameterless list tool with no output schema, the description fully covers what the tool returns, its access scope, and how it should be used first. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so there is nothing for the description to explain. The baseline of 4 is appropriate for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb ('Lists'), the exact resource ('every Search Console property the configured service account can read'), and the useful detail that it includes permission level. This clearly distinguishes it from sibling tools like diagnose_indexing or search_analytics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit sequencing guidance: 'Run this first' to discover the siteUrl string needed by other tools. It does not explicitly enumerate alternatives or exclusions, but the intended when-to-use context is unmistakable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sitemapsList submitted sitemapsARead-only
Shows every sitemap submitted for the property with its last download time, warnings, errors and per-type URL counts.
| Name | Required | Description | Default |
|---|---|---|---|
| siteUrl | Yes | Property identifier exactly as Search Console lists it: "sc-domain:example.com" for a domain property, or "https://example.com/" for a URL-prefix property. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation, and the description adds useful behavioral context by enumerating the returned information (download time, warnings, errors, per-type counts). No contradiction exists between description and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the action and resource, then lists the returned data compactly. It contains no filler and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one required parameter fully covered by the schema, and although there is no output schema, the description enumerates the key return elements. It is sufficient for an agent to understand the tool's purpose and call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already fully documents the siteUrl parameter with format examples. The description adds no additional parameter semantics beyond referring to 'the property', so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Shows every sitemap submitted for the property' and details the output fields (last download time, warnings, errors, per-type URL counts). This clearly distinguishes it from siblings like list_properties or inspect_url.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use the tool: whenever the agent needs submitted sitemaps and their status for a property. It does not explicitly mention when not to use it, but the context is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_analyticsQuery search performanceARead-only
Returns clicks, impressions, CTR and average position from the Performance report, broken down by the dimensions you choose.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Search type (default "web"). | |
| endDate | No | YYYY-MM-DD. Defaults to 3 days ago (data lags). | |
| siteUrl | Yes | Property identifier exactly as Search Console lists it: "sc-domain:example.com" for a domain property, or "https://example.com/" for a URL-prefix property. | |
| rowLimit | No | Rows to return (default 25). | |
| startDate | No | YYYY-MM-DD. Defaults to 30 days ago. | |
| dimensions | No | Breakdown dimensions (default ["query"]). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
the readOnlyHint annotation establishes that this is a safe read operation, so the description doesn't need to restate that. The description adds valuable behavioral context by naming the exact return metrics, which is especially important given the absence of an output schema. It doesn't cover details like pagination or rate limits, but the schema already provides rowLimit and date handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, information-dense sentence that front-loads exactly what the tool returns and mentions the key customizability. No filler or redundant restatement of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The combination of schema (full parameter documentation), annotation (safe read), and description (returned metrics) covers almost everything an agent needs to call the tool correctly. The only meaningful gap is the lack of explicit usage guidance, but the sibling tool set is distinct enough that confusion is unlikely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each of the six parameters already documented (defaults, formats, enums, required field). The description only says 'dimensions you choose', which adds no information beyond what the schema's dimensions parameter already states, so it doesn't lift the score above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Returns'), names the exact resource ('Performance report'), and lists the concrete metrics (clicks, impressions, CTR, average position) plus the key option (dimensions). This clearly differentiates it from siblings like list_properties, inspect_url, and list_sitemaps, which target different concerns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The tool's purpose of querying search performance is clear from the title and description, but there is no explicit guidance on when to choose it over alternatives or any stated exclusions. Usage is implied rather than explicitly framed, leaving the agent to infer it is the right tool for search analytics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct Search Console concern: property discovery, sitemap listing, bulk indexing analysis, single-URL inspection, and performance analytics. The potential overlap between diagnose_indexing and inspect_url is clearly separated by bulk versus single-page scope.
Most names follow a verb_noun snake_case pattern, with list_properties and list_sitemaps being perfectly parallel. diagnose_indexing uses a gerund object and search_analytics reads as a domain term rather than a clear verb_noun action, so the pattern is not perfectly uniform.
Five tools is a tight, well-scoped set for a diagnostic Search Console server. Each tool earns its place and there are no redundant or filler tools.
The read-only diagnostic workflow is covered end-to-end: discover the property, inspect sitemaps, analyze indexing at scale, drill into a single URL, and query performance metrics. Mutation tools would be out of scope for a 'doctor' server.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Turn Search Console data into SEO actions, content, publishing, indexing, and AI insights.
Which pages Google actually indexed, which dropped out and when, and why the rest did not.
Search rankings, clicks, and indexing for your site — in chat.
Checks llms.txt, AI crawler access in robots.txt, and sitemap - with a 0-100 AI readiness score.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables SEO auditing and site analysis by crawling websites, identifying issues, and generating reports like sitemaps and markdown exports.5114MIT
- FlicenseNot gradedqualityFmaintenanceEnables interacting with Google Search Console via natural language, supporting search analytics, URL inspection, sitemap management, and site listing.24
- AlicenseNot gradedqualityCmaintenanceEnables querying Google Search Console and Google Analytics 4 through natural language, with tools for SEO analysis like anomaly detection, cannibalization detection, and opportunity scoring.291MIT
- AlicenseAqualityBmaintenanceTurns Google Search Console into an SEO copilot by enabling natural language queries for search analytics, URL inspection, sitemap management, and opportunity discovery.16MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/gerald-guledew/gsc-doctor'
If you have feedback or need assistance with the MCP directory API, please join our Discord server