MCP App Store
Business & Operations
SiteGuru icon

SiteGuru

by SiteGuru.co

Overview

SiteGuru helps marketers optimize their website for SEO. It runs an extensive technical, link and content audit, and gets your keyword and visit data from Google. Combined, this gives you a prioritized SEO todo list, advanced rank tracking, and detailed insights into your site's SEO.

Tools

find_pages

ChatGPT
List and search a site's pages by SEO health — to find a specific page or surface the worst-scoring ones. Returns each page's path, title, type and a health_score (the passing percentage of its on-page checks, same as the SiteGuru dashboard — higher is healthier), plus the previous score for a trend. Worst-first by default, so "find my worst pages" is one call. Use search to find a specific page by path or title (e.g. "pricing") or to scope to a whole section (e.g. "/seo-academy"), sort to order by "worst" or "best", and limit to cap results. Results are paginated: the response carries a pagination block with the total match count and a next_offset — to read a whole section, keep calling with offset = next_offset until has_more is false. Pass the site domain from list_sites. Follow up on any page with get_page_report.

get_collection_issues

ChatGPT
Find the Shopify collections (category pages) that need SEO work — collections ranked by health score, lowest (most issues) first, each with its failing checks (title, meta description, H1, thin content, description relevance, internal links and more). Pass a collection handle (from the list) to drill into that one collection's full SEO checklist. Only Shopify sites have collections: for any other site the status is "not_shopify". This is the "what to fix" angle — to rank collections by traffic or sales, use get_top_collections. Pass the site domain (from list_sites).

get_declining_content

ChatGPT
Find declining content (content decay) for a site — pages whose Google Search Console clicks have meaningfully dropped over the last 6 complete months, biggest decline first. This is a long-term monthly trend, NOT a date-range view: it reveals gradual decay a 30-day comparison would miss, so it takes no dates. The response lists the 6 months (oldest first); each page has a clicks map of month (YYYY-MM) to clicks (a null value = that month has not been fetched yet, distinct from 0 clicks; a trailing not-yet-fetched month is omitted entirely), plus net_change and percent_change (negative = declined) and its oldest/newest month clicks. Refresh these pages to reclaim lost traffic. Pass the site domain (from list_sites). If the 6-month history is still being gathered, data_status is "not_collected".

get_focus_keywords

ChatGPT
Get the site's focus keywords with how they are performing for a date range — the keywords the user has chosen to track and rank for. Each focus keyword has a target page plus its clicks, impressions and average Google position (each with the change vs the comparison period). For average position, avg_position.change is the absolute move in ranking (current minus previous) — a NEGATIVE change means it moved UP and improved, not a percentage. Pass the site domain (from list_sites); omit the dates to use the user's default period. Set include_actions=true only when the user asks how to improve or what to do for a focus keyword: it adds optimization_actions (a short title + status per on-page area) for each one.

get_growing_content

ChatGPT
Find growing content (rising content) for a site — pages whose Google Search Console clicks have meaningfully grown over the last 6 complete months, biggest growth first. This is a long-term monthly trend, NOT a date-range view, so it takes no dates. The response lists the 6 months (oldest first); each page has a clicks map of month (YYYY-MM) to clicks (a null value = that month has not been fetched yet, distinct from 0 clicks; a trailing not-yet-fetched month is omitted entirely), plus net_change and percent_change (positive = grew) and its oldest/newest month clicks. These are pages with momentum worth doubling down on. Pass the site domain (from list_sites). If the 6-month history is still being gathered, data_status is "not_collected".

get_keyword_cannibalization

ChatGPT
Find keyword cannibalization for a site and date range — search queries where two or more of the site's own pages compete for the same keyword (also called competing pages). This can split clicks between pages and hold rankings back. Each result is a keyword with its combined clicks, impressions and average Google position (each with the change vs the comparison period) and a competing_pages list — every competing page with its own clicks, impressions and position. Only keywords with real traffic are included (each page must take a meaningful share of the keyword's clicks), and hreflang / localized alternates are not counted as cannibalization. For average position, avg_position.change is the absolute move in ranking (current minus previous, NEGATIVE = moved up), not a percentage. Pass the site domain (from list_sites); omit the dates to use the user's default period.

get_lost_keywords

ChatGPT
Get the site's lost Google Search Console keywords for a date range — queries that used to rank in the top 30 (with more than 5 impressions in the comparison period) but have since fallen out of the top 30 (now ranking beyond position 30, or no longer ranking at all). It is the mirror of get_new_keywords. Each keyword includes its current and previous clicks, impressions and average position; the current position is null when the keyword no longer ranks. For average position, avg_position.change is the absolute move in ranking (current minus previous) and is positive because the keyword fell. Up to 50 are returned, the ones with the most prior traffic first. Pass the site domain (from list_sites); omit the dates to use the user's default period.

get_low_hanging_fruit

ChatGPT
Get up to 20 low-hanging-fruit keywords for a site and date range — queries already getting impressions that rank just below the click-winning positions, i.e. the quickest opportunities to improve. Each item includes the page path so you can follow up with get_page_report. Pass the site domain (from list_sites); omit the dates to use the user's default period.

get_new_keywords

ChatGPT
Get the site's new Google Search Console keywords for a date range — queries it has started ranking for this period (now in roughly the top 30 with real impressions) that it was not ranking for in the comparison period. Each keyword includes its clicks, impressions and current average position; because the keyword is new, its previous position is null. Up to 50 are returned, the ones with the most clicks first. For average position, avg_position.change is the absolute move in ranking (negative = up) and is null here since there is no previous ranking. Pass the site domain (from list_sites); omit the dates to use the user's default period.

get_page_content_trend

ChatGPT
Drill into ONE page's keyword trends over the last 6 complete months — the "why" behind a declining or growing page from get_declining_content / get_growing_content. Pass the site domain and the page page (a path like "/blog/post", e.g. copied from those tools). Returns the 6 months (oldest first) and the page's keywords, biggest movers first; each keyword has a clicks map of month (YYYY-MM) to clicks plus net_change and percent_change (negative = declined, positive = grew). Note: keyword totals can be lower than the page total — Google hides rare queries from the per-keyword breakdown. This keyword data is gathered on demand: if it has not been fetched for this page yet, the response has keywords_status "fetching" — tell the user it is being gathered (usually a few seconds) and to ask again shortly; do not retry in a loop.

get_page_report

ChatGPT
Get the full SEO audit for a single page on a site. Returns the page's actual content (title, first H1, meta description, canonical URL, page speed score), its indexation status (including Google's coverage state when GSC is connected), and the list of issues (warnings + suggestions) and compliments from every check the audit ran. Use this when the user asks about one specific page — e.g. "what's wrong with my homepage", "audit /about", "list everything on this page". For check-by-check rollups across many pages, use get_seo_report instead. Modes: "summary" (default) returns the page block + counts only; "issues" adds the warnings + suggestions list; "all" also adds the compliments.

get_product_issues

ChatGPT
Find the Shopify products that need SEO work — products ranked by health score, lowest (most issues) first, each with its failing checks (title, meta description, H1, thin content, internal links and more). Pass a product handle (from the list) to drill into that one product's full SEO checklist. Only Shopify sites have products: for any other site the status is "not_shopify". This is the "what to fix" angle — to rank products by traffic or sales, use get_top_products. Pass the site domain (from list_sites).

get_search_topics

ChatGPT
Get the site's Search Topics (also known as keyword clusters) — each Search Topic groups related keywords the site ranks for. Called WITHOUT a topic, it lists every Search Topic with its combined clicks, impressions, CTR and average Google position (each with the change vs the comparison period), its keyword_count and search volume, and a preview of its top keywords. Pass topic="<name>" (a name from the list) to drill into ONE Search Topic and get its full keyword list, each keyword with the same metrics plus its search volume. For average position, avg_position.change is the absolute move in ranking (current minus previous, NEGATIVE = moved up and improved); a position is null when the topic or keyword is not ranking. Search volume is shown only when already known in SiteGuru — it is never fetched on demand, and search_volume.complete tells you whether every keyword had a known volume. Pass the site domain (from list_sites); omit the dates to use the user's default period.

get_seo_report

ChatGPT
Get an SEO report for a site. Reports: indexation, page titles, meta descriptions, headings, image alt texts, structured data, canonical urls, page speed, og tags, orphan pages, hreflangs, broken links, redirected urls, error pages, sitemap, lorem ipsum, backlinks, site-wide checks. Common aliases work (e.g. "h1", "alt tags", "title", "schema", "og", "orphans", "hreflang", "sitemaps", "lorem", "dummy content", "redirects", "inbound links"). Pass the site domain (from list_sites), the report name, and a "mode": "summary" (default) returns counts + severity; "issues" returns per-page rows for the problem pages only — use for "fix my X", "what's broken"; "all" returns per-page rows for EVERY page with its status — use whenever the user asks for "all my X", "every X", "list all my X", "show me all", or any audit/inventory intent. If the user says "all X" they almost always want mode="all" — do not silently filter to issues. Most page-level reports support all three modes. site-wide checks is summary-only — it has no per-page rows. broken links and redirected urls only check internal links (links between pages on the same site); external links are not validated. error pages lists pages that themselves return a 4xx/5xx (or failed to load) — distinct from broken links (internal links pointing at a 404); summary + issues only. sitemap supports summary + issues only; its payload is structured (sitemap files list, plus pages_missing_from_sitemap, redirected_urls_in_sitemap, and error_urls_in_sitemap arrays in issues mode) — not the usual items shape. backlinks is only available on plans that include DataForSEO backlink data; data refreshes weekly (anything > 6 weeks old is reported as missing with a refresh prompt). The indexation report's per-page rows include each page's indexability status (indexable / noindex meta tag / noindex header / blocked by robots.txt) and, when GSC is connected, Google's coverage state. Each summary response advertises its available_modes. mode=issues/all results are paginated: read total + has_more and call again with the returned next_offset, or narrow a large site with path_contains (e.g. "/blog/").

get_todo_list

ChatGPT
Get the prioritized SEO to-do list for a site — the most important issues to fix, grouped into technical, content and opportunity categories. Pass the site's domain (from list_sites). Each item has a severity and a report_url; include the report_url as a link so the user can open the full report in SiteGuru.

get_top_collections

ChatGPT
Get a Shopify store's top collections (category pages) for a date range — collections ranked by revenue then Search Console clicks. Each collection has its clicks and impressions (Google Search Console, for the collection page) and, when Google Analytics 4 is connected, revenue — the combined sales of every product in the collection — each carrying the change vs the comparison period. Only Shopify sites have collections: for any other site the status is "not_shopify". This is the performance angle — to see what to fix on collection pages, use get_collection_issues. Pass the site domain (from list_sites); omit the dates to use the user's default period.

get_top_keywords

ChatGPT
Get the site's top 100 Google Search Console keywords for a date range — clicks, impressions, CTR and average position, each with the change vs the comparison period. Pass the site domain (from list_sites); omit the dates to use the user's default period. Note on average position: avg_position.change is the absolute change in Google ranking (current minus previous), NOT a percentage. Position 1 is the top of Google, so a NEGATIVE change means the keyword moved UP and improved, and a positive change means it dropped — describe it that way to the user.

get_top_pages

ChatGPT
Get the site's top pages by Google Search Console clicks for a date range — each with clicks, impressions and average position (each with the change vs the comparison period), plus the single keyword that page wins the most clicks on (its top_keyword, with full metrics). When the site has Google Analytics 4 connected, each page also includes pageviews (GA4, with the change vs the comparison period); GSC-only sites omit it. Returns the top 50 by default; results are paginated, so the response carries a pagination block with the total page count and a next_offset — to walk deeper than the first page, keep calling with offset = next_offset until has_more is false (use limit up to 200 to fetch more per call). Use it to see which pages drive the most search traffic and what query each one ranks for; follow up on any page with get_page_report. Pass the site domain (from list_sites); omit the dates to use the user's default period. For average position, avg_position.change is the absolute move in Google ranking (current minus previous) — a NEGATIVE change means the page or keyword moved UP and improved, not a percentage.

get_top_products

ChatGPT
Get a Shopify store's top products for a date range — products ranked by revenue then Search Console clicks. Each product has its clicks and impressions (Google Search Console) and, when Google Analytics 4 is connected and the product has sales, revenue (with its currency), each carrying the change vs the comparison period. Only Shopify sites have products: for any other site the status is "not_shopify". This is the performance angle — to see what to fix on product pages, use get_product_issues. Pass the site domain (from list_sites); omit the dates to use the user's default period.

get_traffic_overview

ChatGPT
Get a traffic overview for a site and date range from its two data sources, plus its top pages and top search queries. The payload has a search_console block (Google Search Console: clicks, impressions, CTR) and an analytics block (Google Analytics 4: sessions, users, and revenue for ecommerce sites) — each metric carries the change vs the comparison period, and each block has its own status. The analytics status is "ok" with the metrics, "not_connected" if the site has no Google Analytics 4 connection (about half of sites are Search Console only), or "not_fetched" if GA data hasn't been pulled for this date range yet — report the Search Console figures regardless. Pass the site domain (from list_sites); omit the dates to use the user's default period. Each top page includes its path so you can follow up with get_page_report.

get_traffic_sources

ChatGPT
Get the site's main traffic sources from Google Analytics 4 for a date range — the channels (e.g. Organic Search, Direct, Referral, Paid Search, Organic Social) sending sessions, largest first. Each source has its sessions and a share_pct (its percentage of total sessions), plus revenue for ecommerce sites; sessions and revenue each carry value, previous and the change vs the comparison period, and the response includes total_sessions. This is Google Analytics data, so analytics_status is "ok" with the sources, "not_connected" if the site has no Google Analytics 4 connection (about half of sites are Search Console only), or "not_fetched" if GA data has not been pulled for this date range yet. Pass the site domain (from list_sites); omit the dates to use the user's default period.

list_sites

ChatGPT
List the SiteGuru sites you can access, by domain. Call this first to discover which sites are available; the other tools reference a site by its domain. Each site includes a health_score (the passing percentage of its SEO checks, same as the SiteGuru dashboard — higher is healthier), so you can compare sites and answer "which site needs the most attention" (lowest score) without another call; a site with no completed audit yet has health_score null and audit_status "pending". Each site also includes available_ranges (the cached Search Console periods, with concrete dates) and default_range — pass one of those range values to the performance tools for an instant cache hit. Each site also has a data_sources object showing which sources are connected — search_console and analytics (Google Analytics 4) — each with connected and, when connected, a headline number for the default period (search_console.clicks, analytics.sessions). About half of sites are Search Console only (analytics.connected false), so check this before promising traffic or revenue figures, and don't call the analytics-backed parts for sites without it.

App Stats

23

Tools

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily