Growthr SEO + GEO MCP

SEO + GEO tools in your AI editor: scan as ChatGPT and Google crawlers see it, fix order, llms.txt.

Should I use this

Quality & Safety

A
Description quality
95%
Schema completeness
100%
Naming quality
80%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (3)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool 'growthr_llms_txt' description contains placeholder textin growthr_llms_txt
  • INFOTool description contains placeholder or incomplete textin growthr_llms_txt

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,292Tokens (tool definitions)
~1.9 KBTypical response size
Moderate attention impact (1.01% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "seo-geo-mcp": {
      "url": "https://mcp.growthr.com/mcp"
    }
  }
}

Remote endpoints

https://mcp.growthr.com/mcpstreamable-http

What it can do

Tool inventory

Tools (4)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢growthr_scan(domain)

Fetch a public domain the way search engines and AI crawlers do (ChatGPT's GPTBot, Claude's ClaudeBot, and the fetchers behind Perplexity and Google AI Overviews: from a datacenter IP, no JavaScript) and run 22 weighted checks: reachability as a browser, GPTBot, and ClaudeBot; server-rendered content; metadata; strict JSON-LD and Organization schema; robots.txt access for AI crawlers; llms.txt and an in-page link to it; sitemap; honest 404s; markdown negotiation; trust pages; speed; and on-page SEO (title, description, single h1, viewport, alt text, favicon). Returns a 0-100 score and every check with pass/fail, what was found, and a fix hint. Reads about a dozen public URLs once. Growthr logs the domain and tool name for usage stats.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "Public domain, e.g. example.com (no path)"
    }
  },
  "required": [
    "domain"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string"
    },
    "score": {
      "type": "integer",
      "description": "0-100"
    },
    "checks": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "pass": {
            "type": "boolean"
          },
          "detail": {
            "type": "string"
          },
          "weight": {
            "type": "number"
          }
        },
        "required": [
          "id",
          "label",
          "pass"
        ]
      }
    },
    "throttledCount": {
      "type": "integer",
      "description": "Requests the site answered with HTTP 429"
    }
  },
  "required": [
    "domain",
    "score",
    "checks"
  ]
}
🟢growthr_llms_txt(domain)

Read a site's homepage, sitemap (or homepage links), and up to twelve pages, then draft an llms.txt in the llmstxt.org format: H1 name, blockquote summary, grouped page list with one-line descriptions, contact, profiles, links. The 'When to use' section is left as a marked placeholder on purpose; it is a judgment about the business that no crawler can write. Returns the draft plus notes on anything skipped.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "Public domain, e.g. example.com"
    }
  },
  "required": [
    "domain"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string"
    },
    "pages": {
      "type": "integer",
      "description": "Pages read"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "llmsTxt": {
      "type": "string",
      "description": "The draft, llmstxt.org format"
    }
  },
  "required": [
    "domain",
    "llmsTxt"
  ]
}
🟢growthr_fix_order(domain)

Run the scan and sort every failed check into buckets: blockers (fix before anything else, they hide everything downstream), this afternoon (metadata, llms.txt, trust pages, on-page), needs a sprint (schema, markdown negotiation, speed), and the off-site work no scan can measure (reviews, directories, third-party mentions), which is what decides whether AI engines recommend a business.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "Public domain, e.g. example.com"
    }
  },
  "required": [
    "domain"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string"
    },
    "score": {
      "type": "integer"
    },
    "blockers": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Check ids to fix before anything else"
    },
    "afternoon": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "sprint": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "other": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "domain",
    "score",
    "blockers",
    "afternoon",
    "sprint"
  ]
}
🟢growthr_ai_visibility(prompt, brand, domain)

Run one buyer-shaped prompt through Gemini with Google Search grounding (a real, cited web search, the same mechanism behind Google AI Overviews) and report where the brand lands on the five-rung ladder: absent, cited (a page of the brand's site is a source), mentioned (named in the text), recommended (on the shortlist), or recommended against. Also returns the other names on the shortlist and the source domains the answer was built from. One prompt per call; limited to a few calls per day per user because grounded requests are billed per query.

Input Schema

{
  "type": "object",
  "properties": {
    "prompt": {
      "type": "string",
      "description": "The question a buyer would ask, e.g. 'best corporate event photographer in New York'"
    },
    "brand": {
      "type": "string",
      "description": "Brand name to look for, e.g. 'Growthr'"
    },
    "domain": {
      "type": "string",
      "description": "Optional brand domain, e.g. growthr.com, to detect citations"
    }
  },
  "required": [
    "prompt",
    "brand"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "rung": {
      "type": "string",
      "enum": [
        "absent",
        "cited",
        "mentioned",
        "recommended",
        "recommended against"
      ]
    },
    "cited": {
      "type": "boolean"
    },
    "mentioned": {
      "type": "boolean"
    },
    "recommended": {
      "type": "boolean"
    },
    "against": {
      "type": "boolean"
    },
    "shortlist": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Providers the answer put forward"
    },
    "shortlistSource": {
      "type": "string",
      "enum": [
        "llm",
        "heuristic"
      ]
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Source domains the answer was built from"
    },
    "engine": {
      "type": "string"
    }
  },
  "required": [
    "rung",
    "shortlist",
    "sources",
    "engine"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded4 tools
verifiedversion not recorded4 tools