ga4-seo-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_HOST | No | HTTP bind address. | 127.0.0.1 |
| MCP_PORT | No | HTTP bind port. | 8000 |
| MCP_TRANSPORT | No | MCP transport: stdio, streamable-http or sse. | stdio |
| MCP_AUTH_TOKEN | No | Require Authorization: Bearer <token> on every HTTP request. | |
| GA4SEO_TOOLSETS | No | Comma-separated toolsets to enable. Same as --toolsets. | admin,data,gsc,psi |
| DATAFORSEO_LOGIN | No | DataForSEO login for the dataforseo toolset. | |
| MCP_CORS_ORIGINS | No | Comma-separated exact origins for a browser client. Never *. | |
| MCP_ALLOWED_HOSTS | No | Comma-separated host/IP values clients use. Required when binding 0.0.0.0 and connecting over the LAN. | |
| PAGESPEED_API_KEY | No | Recommended PageSpeed Insights API key. The anonymous quota is shared and often exhausted. | |
| DATAFORSEO_PASSWORD | No | DataForSEO password for the dataforseo toolset. | |
| GA4SEO_ENABLE_WRITES | No | Set to 1 to enable write tools. Same as --enable-writes. | 0 |
| GOOGLE_ADS_DEVELOPER_TOKEN | No | Google Ads developer token for the ads toolset. | |
| GOOGLE_ADS_LOGIN_CUSTOMER_ID | No | Google Ads login customer ID, only when operating through a manager (MCC) account. | |
| GOOGLE_APPLICATION_CREDENTIALS | No | Service account key file. Unset means Application Default Credentials from gcloud. |
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": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_account_summariesA | List every GA4 account you can access, with a summary of its properties. Start here to find the account_id and property_id the other tools need. |
| list_propertiesA | List the GA4 properties under an account. Args: account_id: numeric account ID or 'accounts/123456789'. include_deleted: also return properties in the trash (soft-deleted, kept 35 days). |
| get_propertyB | Get the full settings of a GA4 property (time zone, currency, industry, type). |
| list_data_streamsB | List the data streams (web, iOS, Android) of a GA4 property. Web streams include their measurement ID (G-XXXXXXX) and default URI. |
| get_data_streamB | Get one data stream, including the measurement ID of a web stream. |
| list_key_eventsC | List the key events (formerly conversions) declared on a GA4 property. |
| list_custom_dimensionsB | List the custom dimensions declared on a GA4 property, with their scope. |
| list_google_ads_linksC | List the links between a GA4 property and Google Ads accounts. |
| bootstrap_site_measurementA | Plan, and optionally apply, the full measurement setup of a website. With apply=False (default) nothing is changed: it detects what already exists for the site (GA4 property and web stream matched by the site's domain, key events, custom dimensions, Search Console domain property) and returns the steps that would run. Show this plan to the user and get explicit confirmation before calling apply=True. With apply=True (requires the server to run with --enable-writes) it creates only the missing pieces, skipping what exists, so it is safe to re-run. It returns a step-by-step report with the GA4 measurement ID (G-...) and the DNS TXT token for Search Console. DNS verification and sitemap submission stay manual follow-up steps (sc_verify_site_dns, sc_submit_sitemap) because the TXT record must be published first. Args: site_url: the site, e.g. 'https://example.com'. account_id: GA4 account that owns (or will own) the property; see list_account_summaries. property_display_name: name for a new property; also used to find an existing one. time_zone: IANA time zone for a new property, e.g. 'America/Mexico_City'. currency_code: ISO 4217 currency for a new property, e.g. 'USD'. key_events: event names to mark as key events, e.g. ['generate_lead']. custom_dimensions: parameters to register as custom dimensions. apply: False = plan only (default); True = execute the plan. |
| run_reportA | Run a flexible GA4 report. Args: property_id: numeric ID or 'properties/123456789'. metrics: e.g. ['sessions', 'activeUsers', 'keyEvents']. Catalog: https://developers.google.com/analytics/devguides/reporting/data/v1/api-schema#metrics dimensions: optional, e.g. ['date', 'sessionSource', 'pagePath']. Catalog: https://developers.google.com/analytics/devguides/reporting/data/v1/api-schema#dimensions date_start: 'YYYY-MM-DD', 'today', 'yesterday' or 'NdaysAgo' (e.g. '28daysAgo'). date_end: same formats as date_start. limit: maximum rows (default 25). order_by_metric: sort by this metric, e.g. 'sessions'. order_desc: sort descending (default True). Returns the dimension and metric names, the date range, row_count and the rows. |
| run_realtime_reportA | Realtime report for the last 30 minutes. Useful to confirm that a new event fires in production right after a deploy. Args: metrics: default ['activeUsers']; 'eventCount' also works. dimensions: default ['eventName']; also 'unifiedScreenName', 'country', 'deviceCategory'. |
| top_pagesC | Top pages by sessions, with active users, bounce rate and average session duration. |
| events_summaryA | Count of every event that fired, to audit what is actually being measured. Compare it with list_key_events to find key events that never fire. |
| traffic_sourcesC | Top traffic sources (source / medium) with sessions, active users and conversions. |
| conversions_summaryC | Conversions and total users per event name: a summary of the active key events. |
| web_vitals_summaryA | Core Web Vitals reported by your own site as GA4 events. Requires the site to send web-vitals events with the parameters |
| audit_portfolioB | Summary metrics for several GA4 properties in one call. Returns sessions, active users, conversions, bounce rate and average session duration per property, plus the properties that failed and why. Args: property_ids: e.g. ['123456789', '987654321']. |
| sc_list_sitesA | List the Search Console sites you can access. Each entry has |
| sc_top_queriesA | Top search queries with clicks, impressions, CTR (%) and average position. Args: site_url: 'sc-domain:example.com' or 'https://example.com/', exactly as in sc_list_sites. date_start: 'YYYY-MM-DD'. date_end: 'YYYY-MM-DD'. Search Console data lags 2-3 days. limit: rows to return (max 25000). country: optional ISO 3166-1 alpha-3 code to filter by, e.g. 'mex' or 'usa'. |
| sc_page_performanceC | Top pages in Google Search by clicks, with impressions, CTR (%) and average position. |
| sc_query_breakdown_by_pageB | Which search queries bring traffic to one specific page. Useful to decide which keywords to strengthen in that page's content. |
| sc_list_sitemapsA | List the sitemaps submitted for a Search Console site, with errors and warnings. |
| psi_auditA | Run a PageSpeed Insights audit (Lighthouse lab test + CrUX field data) on a public URL. Takes 30-90 seconds. Without PAGESPEED_API_KEY the anonymous quota is small and Google may answer 429; set the key for regular use. Args: url: absolute public URL, e.g. 'https://example.com/'. strategy: 'mobile' (default) or 'desktop'. categories: subset of ['performance', 'accessibility', 'best-practices', 'seo']. Default: all four. Returns 0-100 category scores, lab Core Web Vitals (LCP, FCP, CLS, TBT, SI, TTFB) and, when Chrome has enough real-user traffic, CrUX p75 field data for the URL and its origin. |
| psi_field_data_onlyA | Only the CrUX field data (real Chrome users, p75 over 28 days) for a URL and its origin. PageSpeed Insights still runs a performance-only Lighthouse pass, so expect 15-40 seconds.
|
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| audit_ga4_setup | Audit the measurement setup of a GA4 property: streams, key events, dimensions, Ads links. |
| seo_360_audit | 360° audit of organic search and web performance (Search Console + GA4 + PageSpeed). |
| portfolio_performance_digest | Consolidated performance digest for several GA4 properties. Args: property_ids: comma-separated GA4 property IDs, e.g. '123456789,987654321'. |
| launch_site_measurement | Guided end-to-end measurement setup for a site: plan, confirm, apply, verify, baseline. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 24 tools
Most tools have distinct resource+action targets, and the descriptions clearly separate similar pairs (psi_audit vs psi_field_data_only, web_vitals_summary vs psi_field_data_only). However, top_pages, events_summary, traffic_sources and conversions_summary are all essentially preset versions of run_report, creating mild overlap an agent must reason about.
Names use consistent snake_case verb_noun within each domain (list_properties, get_property, run_report; sc_list_sites, sc_top_queries; psi_audit). The sc_/psi_ prefixes are meaningful namespacing, though GA4 tools carry no prefix, leaving a minor stylistic inconsistency across domains.
24 tools is on the heavy side for the stated scope and exceeds the comfortable 3-15 range. Several reporting tools (top_pages, events_summary, traffic_sources, conversions_summary) are convenience wrappers around run_report, so the surface is somewhat inflated.
Reporting, GA4 admin reads, Search Console analytics and PageSpeed are well covered, and bootstrap_site_measurement handles provisioning. Gaps exist: no GA4 config write/update tools and no sc_verify_site_dns/sc_submit_sitemap tools despite bootstrap referencing them as follow-up steps.