Skip to main content
Glama
acamolese

Google Search Console Audit MCP

gsc_indexing_issues

Check indexing status for multiple URLs and identify common issues like robots.txt blocks, crawl errors, or page-fetch failures.

Instructions

Bulk indexing check for multiple pages using the URL Inspection API.

Use this tool to quickly verify whether a batch of URLs is indexed by Google and spot common issues (blocked by robots.txt, crawl errors, page-fetch failures, not yet indexed). For each URL it returns a compact summary; to get the full inspection payload (mobile usability, rich results, AMP) for a single page, use gsc_inspect_url instead.

Quota note: the URL Inspection API enforces ~60 requests per minute and ~2000 per day per property. Keep the pages list reasonable in size.

Args: site_url: Verified property URL. Domain property format "sc-domain:example.com" or URL-prefix format "https://example.com/". pages: List of fully qualified page URLs to check. They must belong to the site_url property.

Returns: JSON array, one entry per input URL, each with: - url: the input URL - verdict: one of PASS, PARTIAL, FAIL, NEUTRAL, VERDICT_UNSPECIFIED - coverageState: human-readable coverage description - robotsTxtState: e.g. ALLOWED / DISALLOWED - indexingState: e.g. INDEXING_ALLOWED / BLOCKED_BY_META_TAG - lastCrawlTime: ISO-8601 timestamp of Google's last crawl attempt - pageFetchState: SUCCESSFUL / SOFT_404 / ACCESS_DENIED / etc. - crawledAs: DESKTOP / MOBILE If a single URL fails, its entry contains an error field instead of the fields above; the rest of the batch still returns normally.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
site_urlYes
pagesYes

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Implementation Reference

  • The `gsc_indexing_issues` handler function, decorated with @mcp.tool(). It performs a bulk indexing check for multiple page URLs using the Google URL Inspection API, iterating over each page, calling the API, and returning a JSON array of results (verdict, coverageState, robotsTxtState, indexingState, lastCrawlTime, pageFetchState, crawledAs). Errors per URL are caught and reported in an 'error' field.
    def gsc_indexing_issues(site_url: str, pages: list[str]) -> str:
        """Bulk indexing check for multiple pages using the URL Inspection API.
    
        Use this tool to quickly verify whether a batch of URLs is indexed by Google and
        spot common issues (blocked by robots.txt, crawl errors, page-fetch failures, not
        yet indexed). For each URL it returns a compact summary; to get the full
        inspection payload (mobile usability, rich results, AMP) for a single page, use
        `gsc_inspect_url` instead.
    
        Quota note: the URL Inspection API enforces ~60 requests per minute and
        ~2000 per day per property. Keep the `pages` list reasonable in size.
    
        Args:
            site_url: Verified property URL. Domain property format "sc-domain:example.com"
                or URL-prefix format "https://example.com/".
            pages: List of fully qualified page URLs to check. They must belong to the
                `site_url` property.
    
        Returns:
            JSON array, one entry per input URL, each with:
            - url: the input URL
            - verdict: one of PASS, PARTIAL, FAIL, NEUTRAL, VERDICT_UNSPECIFIED
            - coverageState: human-readable coverage description
            - robotsTxtState: e.g. ALLOWED / DISALLOWED
            - indexingState: e.g. INDEXING_ALLOWED / BLOCKED_BY_META_TAG
            - lastCrawlTime: ISO-8601 timestamp of Google's last crawl attempt
            - pageFetchState: SUCCESSFUL / SOFT_404 / ACCESS_DENIED / etc.
            - crawledAs: DESKTOP / MOBILE
            If a single URL fails, its entry contains an `error` field instead of the
            fields above; the rest of the batch still returns normally.
        """
        results = []
        for page in pages:
            try:
                data = _api_post(
                    f"{INSPECT_BASE}/urlInspection/index:inspect",
                    {"inspectionUrl": page, "siteUrl": site_url},
                )
                result = data.get("inspectionResult", {})
                index_status = result.get("indexStatusResult", {})
                results.append({
                    "url": page,
                    "verdict": index_status.get("verdict", "UNKNOWN"),
                    "coverageState": index_status.get("coverageState", ""),
                    "robotsTxtState": index_status.get("robotsTxtState", ""),
                    "indexingState": index_status.get("indexingState", ""),
                    "lastCrawlTime": index_status.get("lastCrawlTime", ""),
                    "pageFetchState": index_status.get("pageFetchState", ""),
                    "crawledAs": index_status.get("crawledAs", ""),
                })
            except Exception as e:
                results.append({"url": page, "error": str(e)})
        return json.dumps(results, indent=2, ensure_ascii=False)
  • The @mcp.tool() decorator registers `gsc_indexing_issues` as an MCP tool with FastMCP.
    @mcp.tool()
    def gsc_indexing_issues(site_url: str, pages: list[str]) -> str:
  • The function signature defines the input schema: `site_url: str` and `pages: list[str]`. The docstring documents the return schema (JSON array with fields: url, verdict, coverageState, robotsTxtState, indexingState, lastCrawlTime, pageFetchState, crawledAs, or error).
    def gsc_indexing_issues(site_url: str, pages: list[str]) -> str:
        """Bulk indexing check for multiple pages using the URL Inspection API.
    
        Use this tool to quickly verify whether a batch of URLs is indexed by Google and
        spot common issues (blocked by robots.txt, crawl errors, page-fetch failures, not
        yet indexed). For each URL it returns a compact summary; to get the full
        inspection payload (mobile usability, rich results, AMP) for a single page, use
        `gsc_inspect_url` instead.
    
        Quota note: the URL Inspection API enforces ~60 requests per minute and
        ~2000 per day per property. Keep the `pages` list reasonable in size.
    
        Args:
            site_url: Verified property URL. Domain property format "sc-domain:example.com"
                or URL-prefix format "https://example.com/".
            pages: List of fully qualified page URLs to check. They must belong to the
                `site_url` property.
    
        Returns:
            JSON array, one entry per input URL, each with:
            - url: the input URL
            - verdict: one of PASS, PARTIAL, FAIL, NEUTRAL, VERDICT_UNSPECIFIED
            - coverageState: human-readable coverage description
            - robotsTxtState: e.g. ALLOWED / DISALLOWED
            - indexingState: e.g. INDEXING_ALLOWED / BLOCKED_BY_META_TAG
            - lastCrawlTime: ISO-8601 timestamp of Google's last crawl attempt
            - pageFetchState: SUCCESSFUL / SOFT_404 / ACCESS_DENIED / etc.
            - crawledAs: DESKTOP / MOBILE
            If a single URL fails, its entry contains an `error` field instead of the
            fields above; the rest of the batch still returns normally.
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, but the description fully discloses behavioral traits: rate limits (60 req/min, 2000 req/day), partial failure handling (error field for failed URLs while rest succeed), and return field semantics (verdict, coverageState, etc.).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is fairly long but well-structured: a concise summary, then usage guidance, quota note, args, and returns. Every sentence adds value; however, the return field enumeration could be slightly more compact without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema (unseen), the description independently details the return format and error behavior, making it self-contained. It covers parameter semantics, quota limits, and sibling differentiation, leaving no critical gaps for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds substantial meaning: it explains the 'site_url' parameter format ('sc-domain:' vs 'https://' prefix) and specifies that 'pages' must be fully qualified URLs belonging to the property. This goes well beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it performs a 'bulk indexing check' for multiple pages via the URL Inspection API, and explicitly distinguishes from the sibling tool 'gsc_inspect_url' which handles single-page inspection. This gives a specific verb-resource pairing with clear differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use (verify indexing status of a batch of URLs) and when-not-to-use (for full single-page payload, use gsc_inspect_url). It also includes quota notes to guide reasonable usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

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/acamolese/google-search-console-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server