google-seo-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_HOST | No | Host to bind when using HTTP mode. | |
| MCP_PATH | No | HTTP path for the MCP endpoint when using HTTP mode. | |
| MCP_PORT | No | Port to bind when using HTTP mode. | |
| WP_SITES | No | JSON array of WordPress sites reachable over SSH. Omit to disable wp_* tools. | |
| CRUX_API_KEY | No | Google Chrome UX Report API key. | |
| GITHUB_TOKEN | No | GitHub token for GitHub tools. Falls back to `gh auth token`. | |
| INDEXNOW_KEY | No | Optional IndexNow key for IndexNow submissions. | |
| BRAVE_API_KEY | No | Optional Brave API key for brand mentions. | |
| MCP_TRANSPORT | No | Set to http to run as a Streamable HTTP server; defaults to stdio. | |
| GOOGLE_API_KEY | No | Google Knowledge Graph Search API key. Falls back to PAGESPEED_API_KEY. | |
| MCP_AUTH_TOKEN | No | Bearer token used for authentication in HTTP mode. | |
| SEO_MCP_TOOLSETS | No | Comma-separated list of toolsets: gsc,ga4,web,geo,analysis,wordpress,github. | |
| PAGESPEED_API_KEY | No | Google PageSpeed Insights API key. Without it, the public quota is shared and often exhausted. | |
| SEO_MCP_READ_ONLY | No | Set to 1 to register no write tools. | |
| PERPLEXITY_API_KEY | No | Optional Perplexity API key for AI citation checks. | |
| GOOGLE_PLACES_API_KEY | No | Optional Google Places API key for Google reviews. | |
| INDEXNOW_KEY_LOCATION | No | Optional IndexNow key location. | |
| GOOGLE_CREDENTIALS_JSON | No | Inline Google service account JSON key. Alternative to GOOGLE_APPLICATION_CREDENTIALS. | |
| GOOGLE_APPLICATION_CREDENTIALS | No | Path to the Google service account JSON key file for Search Console and GA4 authentication. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| google_auth_statusA | Verify which Google credentials are in use and that an access token can be obtained. Run this first if other tools fail. |
| page_auditA | Fetch a page like a crawler and report: final URL and redirect chain, status, title, meta description, robots (meta + X-Robots-Tag), canonical, lang/hreflang, Open Graph, H1/H2/H3 outline, images missing alt, internal/external/nofollow link counts, word count, JSON-LD schema types, HTML size and fetch time, plus a list of flagged issues. Works for any site, no authorization needed. |
| pagespeedA | Run Google PageSpeed Insights for a URL. Returns Lighthouse category scores (performance, SEO, accessibility, best practices), lab metrics (LCP, CLS, TBT, FCP, Speed Index), real-user CrUX field data (LCP, CLS, INP) when available, and the top improvement opportunities with estimated savings. Set PAGESPEED_API_KEY for a higher quota. Each run takes 15-60 s; Google caches results for a short while, so if a call times out simply call again. A 'Lighthouse returned error' after retry usually means the page never becomes idle (endless animations/JS) and cannot be audited by PSI. |
| sitemap_checkA | Fetch a sitemap (sitemap index supported, .gz supported), list its URLs, and check the HTTP status of a sample (or all) of them to find 404s, redirects and server errors. Pass a site root to auto-discover the sitemap from robots.txt or /sitemap.xml. |
| robots_checkA | Fetch a site's robots.txt, show its groups and sitemap lines, and test whether specific URLs are crawlable for a given user agent (default Googlebot) using Google's longest-match rules. |
| ai_crawler_accessA | Check whether AI and search crawlers (GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended, Googlebot, Bingbot, Applebot, Amazonbot, Meta, CCBot, Bytespider...) can reach a page: robots.txt rules for the site root and for the URL, plus a live request with each bot's User-Agent to detect UA-based blocks (e.g. Cloudflare 'block AI bots', WAF rules). Being blocked from OAI-SearchBot, PerplexityBot or Claude-SearchBot means the site cannot be cited by those assistants. |
| llms_txt_checkA | Check /llms.txt and /llms-full.txt: existence, size, structure (H1 title, blockquote summary, H2 sections with markdown links), robots access, and whether the linked URLs respond 200. |
| llms_txt_generateA | Crawl the sitemap (up to maxPages), read each page's title and meta description, and produce a draft llms.txt in the standard format (H1, blockquote summary, H2 sections grouped by first path segment, '- title: description' lines). Review and edit the draft before publishing it at /llms.txt. |
| structured_data_auditA | Extract JSON-LD from one or more pages, validate required/recommended properties per schema type (Organization, LocalBusiness, TravelAgency, TouristTrip, Product/Offer, Event, Article/BlogPosting, FAQPage, BreadcrumbList, WebSite, Person, Review...), flag invalid JSON and bad dates, and check entity consistency across pages (organization name, telephone, address, sameAs must match everywhere). Pass explicit urls or a sitemap to sample. |
| geo_page_scoreA | Score how easily AI answer engines (ChatGPT, Perplexity, Google AI Overviews) can extract and cite a page: direct answer in the first paragraph, question-style headings, FAQ section and FAQPage schema, lists/tables, quotable statistics, summary section, author and dates (E-E-A-T), outbound citations, structured data. Returns a 0-100 score, the signals found and concrete fixes. |
| eeat_auditA | Site-level trust signals that search and AI engines weigh: About and Contact pages, privacy/terms, visible address and phone, Organization/LocalBusiness schema on the homepage, review/rating schema, social profiles (sameAs), author pages, HTTPS, plus a sample of articles checked for bylines and dates. Returns a pass/fail checklist with what to add. |
| indexnow_submitA | Submit up to 1000 changed URLs to IndexNow (Bing, Yandex, Naver, Seznam; Bing's index feeds ChatGPT search and Copilot). Requires INDEXNOW_KEY and the key file published at https:///.txt (or set INDEXNOW_KEY_LOCATION). The tool verifies the key file before submitting. Google does not support IndexNow. |
| ai_citation_checkA | Ask Perplexity's Sonar API a question a customer might ask and report which sources it cites, whether your domain is among them, and the answer text. Useful to see if the site is being cited by AI search for target queries. Requires PERPLEXITY_API_KEY (paid, cents per call). ChatGPT and Google AI Overviews have no such API. |
| schema_validateA | Validate one or more JSON-LD objects before publishing: required/recommended properties per type (same rules as structured_data_audit), FAQ/Breadcrumb structure, ISO dates, @context presence. Returns the normalized, compact JSON ready to inject. |
| schema_generateA | Generate draft JSON-LD from an existing page: 'faq' extracts question-style headings and the paragraph(s) that follow them into FAQPage; 'article' builds Article/BlogPosting from title, meta description, dates, author and og:image; 'breadcrumb' from the URL path; 'all' returns every applicable block. Review the text (answers are trimmed to ~600 chars) then publish with wp_set_schema or by editing the site code. |
| site_crawlA | Breadth-first crawl from a start URL (same host only, respects robots.txt for Googlebot), auditing each HTML page like page_audit. Returns a site-level summary: status code counts, broken internal links with their referrers, redirect chains, duplicate titles and descriptions, pages missing title/description/H1, noindex pages, thin pages, images without alt, orphan pages (in sitemap but never linked), click depth from the start page and inbound-link counts per page. Use maxPages to bound the run; a 200-page crawl takes 1-3 minutes. |
| hreflang_checkA | For a page (or a sitemap sample), read its hreflang alternates and verify: every alternate URL is reachable, points back (reciprocal) to the source, has a self-referencing entry, uses valid language-region codes, has an x-default, and that canonicals do not contradict the alternates. Also compares with the declared hreflang. |
| compare_pagesA | Audit several URLs (yours plus pages ranking above you) side by side: word count, title/description, heading counts and outline, lists/tables, images, internal/external links, schema types, fetch time, HTML size. Also extracts the most frequent content terms of each page and lists terms competitors use that your page lacks (content-gap hint). |
| social_preview_checkA | Validate how a page previews when shared (social networks, messaging apps, AI chat link cards): og:title/description/image/url/type, twitter:card, image reachability, dimensions (recommended 1200x630), file size and content type, plus fallbacks used when tags are missing. |
| keyword_suggestA | Expand a seed keyword using Google Autocomplete suggestions (free, no key): the seed itself, question prefixes (how/what/why/best/cómo/qué...), and optionally a-z suffix expansion. Set language (hl) and country (gl) to match the market, e.g. hl='es', gl='es' or hl='en', gl='gb'. Returns deduplicated suggestions grouped by prefix, useful for long-tail and FAQ ideas. |
| gsc_list_sitesA | List all Search Console properties (sites) the authorized account can access, with permission level. |
| gsc_search_analyticsA | Query Google Search performance data (clicks, impressions, CTR, average position) grouped by query, page, country, device, date or searchAppearance. Supports filtering (e.g. only rows where page contains '/blog/') and pagination. |
| gsc_compare_periodsA | Compare search performance between a current and a previous period for a single dimension (query or page). Returns rows with deltas, sorted by biggest click change, so you can spot winners and losers. |
| gsc_inspect_urlA | Run the URL Inspection API for a page: index status, last crawl time, canonical selection, robots.txt state, mobile usability, rich results and AMP status. Quota: ~2000 calls/day per property. |
| gsc_list_sitemapsA | List sitemaps submitted for a property, with last submitted/downloaded times, errors, warnings and URL counts. |
| gsc_submit_sitemapA | Submit (or resubmit) a sitemap URL for a property. |
| gsc_opportunitiesA | Find queries with high impressions but average position in a range (default 8-20): pages already ranking on page 1-2 that can be pushed into the top results with title/content/internal-link work. Groups results by page and, when a WordPress site is configured for this domain, maps each page to its post ID so you can edit it directly. |
| gsc_cannibalizationA | Find queries for which two or more pages of the site receive impressions, i.e. pages competing against each other for the same keyword. Each result lists the competing pages with clicks, impressions and position so you can consolidate or differentiate them. |
| gsc_index_coverageA | Run the URL Inspection API over a list of URLs (or the first N URLs of the site's sitemap) and summarize index status: indexed / not indexed, coverage state, robots state, last crawl, canonical mismatch. Costs one inspection call per URL against the ~2000/day quota, so keep batches small. |
| gsc_question_queriesA | Find question-style queries (how, what, why, best, is it, cómo, qué, cuánto, dónde...) the site already gets impressions for, grouped by page. Optionally fetches each page to check whether a heading matches the question and whether FAQPage schema exists, so you know where to add FAQ answers. These queries are the ones AI Overviews and answer engines pick up. |
| gsc_rich_results_reportB | Show how the site appears in Google results: clicks and impressions per search appearance type (rich results, FAQ, review snippet, video, AMP, translated results, Discover...), and the top pages for each appearance type. |
| gsc_site_snapshotA | One call that answers 'how is the site doing': totals for the period and the previous period of equal length (clicks, impressions, CTR, position with deltas), top queries, top pages, device and country split, and the biggest winners/losers by page. Use this first when asked for an overview or a report. |
| gsc_ctr_opportunitiesA | Queries already ranking in the top positions whose CTR is far below the typical CTR for that position, weighted by impressions: the fastest wins from rewriting titles and meta descriptions. Benchmark CTR by position: 1: 28%, 2: 15%, 3: 11%, 4: 8%, 5: 7%, 6-10: 5-3%. |
| ga_list_propertiesA | List all Google Analytics accounts and GA4 properties the authorized account can access. Requires the Analytics Admin API to be enabled. |
| ga_run_reportB | Run a Google Analytics 4 Data API report. Common dimensions: date, pagePath, landingPage, sessionDefaultChannelGroup, sessionSource, sessionMedium, country, deviceCategory, eventName. Common metrics: sessions, activeUsers, totalUsers, newUsers, screenPageViews, engagementRate, averageSessionDuration, bounceRate, conversions, eventCount, keyEvents. Use ga_get_metadata to discover more. Optionally add a comparison date range. |
| ga_run_realtime_reportA | Real-time (last 30 minutes) GA4 data. Dimensions: country, city, deviceCategory, unifiedScreenName, eventName, minutesAgo. Metrics: activeUsers, screenPageViews, eventCount, keyEvents. |
| ga_get_metadataA | List the dimensions and metrics available for a GA4 property (including custom ones). Filter by a search string to keep the output small. |
| ga_compare_periodsA | Compare GA4 metrics between a current and a previous period, broken down by dimensions (default: channel group). Returns per-row current/previous/delta/percent change plus period totals. Use it for 'how did organic traffic change vs last month'. |
| ga_landing_page_seoA | One table per landing page combining GA4 organic-search behaviour (sessions, engagement rate, bounce rate, avg. session duration, key events) with Search Console performance (clicks, impressions, CTR, position) for the same period. Requires both the GA4 property and the Search Console property of the same site. |
| migration_checkA | Before pointing a domain at a new (static) site, verify that every URL that matters on the old site still works on the new one. Collects old URLs from Search Console (pages with impressions in the period) and the old sitemap, rewrites each to the new host (e.g. a pages.dev preview), follows redirects, and classifies: OK (200 same path), REDIRECTED (301/302 to a 200 page), REDIRECT_TO_HOME (traffic likely lost), CHAIN (2+ hops), NOT_FOUND (404/410), ERROR. Results are sorted by old-site clicks so the costliest gaps come first. |
| cross_site_linksA | For two Search Console properties you own on the same topic, find pages that rank for the same or overlapping queries and suggest links between them (site A page -> site B page and vice versa). Optionally fetches the top candidate pages to check whether a cross-domain link already exists. |
| content_refresh_candidatesA | Find pages whose clicks or impressions dropped between two periods and that have not been updated recently (sitemap lastmod), with the queries they lost the most on. These are the best candidates for a content refresh: update facts, expand answers, add FAQ, re-publish with a new dateModified. |
| knowledge_graph_checkA | Check whether a brand/business/place exists as an entity in Wikidata (free, no key) and in Google's Knowledge Graph Search API (needs the 'Knowledge Graph Search API' enabled on the GCP project and a key in GOOGLE_API_KEY or PAGESPEED_API_KEY). AI engines and Google rely on entities to know 'who' a site is; if none exists, the result includes the steps to establish one. |
| crux_historyA | Real-user Core Web Vitals from the Chrome UX Report History API for an origin or URL: weekly p75 of LCP, INP, CLS, FCP, TTFB over the last ~25 weeks and the share of good/needs-improvement/poor. Needs the 'Chrome UX Report API' enabled on the GCP project and a key in CRUX_API_KEY / GOOGLE_API_KEY / PAGESPEED_API_KEY. Returns 404 when the page has too little traffic for CrUX; try the origin instead. |
| brand_mentionsA | Search the web for pages mentioning a brand name that are not on your own domain, and check whether each mentioning page links to you. Unlinked mentions are outreach targets for links; the list also shows what context AI engines associate with the brand. Requires BRAVE_API_KEY (free tier available at brave.com/search/api). |
| reviews_snapshotA | Fetch rating, review count and the latest reviews of a Google Business Profile via the Places API (New). Use it as the source for AggregateRating schema and to monitor reputation. Requires GOOGLE_PLACES_API_KEY with 'Places API (New)' enabled (billing must be enabled on the project; Google grants a monthly free allowance). |
| github_get_fileA | Read a file (text) from a repository branch. Returns content, sha (needed for edits), size and the branch's latest commit. Files over 1 MB are refused; use github_list_dir to browse. |
| github_list_dirB | List files and folders at a path in a repository (name, type, size, sha). |
| github_search_codeA | Search file contents in one repository (GitHub code search syntax, e.g. 'og:image path:src', 'canonical extension:astro'). Returns matching files with fragments. Indexed for the default branch only. |
| github_list_commitsB | List recent commits of a branch, optionally only those touching a path. |
| github_commit_filesA | Create one commit on a branch that adds/updates/deletes several files atomically (Git Data API), then the branch is updated so the site's CI/CD (e.g. Cloudflare Pages) deploys it. Send the full new content of each file; read the current content first with github_get_file and apply your edit locally. Set createBranch to work on a new branch off the default branch instead of committing directly. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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/Akxan/google-seo-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server