Tools Reference
Complete reference for all 11 tools available in Glippy MCP Server.
analyze_domain
Run a comprehensive GEO readiness analysis on a domain. Checks robots.txt, llms.txt, homepage HTML (16 scoring categories), sitemap.xml, and security headers.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to analyze (e.g., "example.com"). No https:// prefix. |
max_pages | integer | No | Pages to crawl (1-10). Default: 10. |
page_type | enum or object | No | What kind of page the homepage is. One id applies to the homepage; a map of URL to id also sets crawled pages it names. Without it, checks that depend on the page type are shown but not scored. See Page Type. |
render_mode | enum | No | "static" (default), "auto" (static with Chrome fallback on bot-block), or "chrome" (always Chrome). See Render Modes. |
output_format | enum | No | "text" (default) or "json". Use JSON to pass results to export_report. |
Analyze example.com for GEO readiness
- Overall GEO score (0-100) with letter grade
- The page type line: set by the assistant, or not confirmed with the detected type and why
- 16 category scores with pass/fail/warn checks
- robots.txt analysis with AI crawler access
- llms.txt presence and content preview
- Sitemap discovery status
check_robots_txt
Check a domain's robots.txt specifically for AI crawler access rules. Reports which crawlers (GPTBot, ClaudeBot, etc.) are blocked or allowed.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to check. No https:// prefix. |
Which AI crawlers are blocked on example.com?
GPTBot, Google-Extended, CCBot, anthropic-ai, ClaudeBot, Bytespider, PerplexityBot, ChatGPT-User, AmazonBot, cohere-ai
Auditing your own site? Make sure GlippyBot itself is allow-listed — see the GlippyBot crawler info & allow-list guide for the User-Agent string and robots.txt snippets.
check_llms_txt
Check if a domain has an llms.txt file — the emerging standard for providing context to LLMs about a site's purpose and content.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to check. No https:// prefix. |
Does example.com have an llms.txt file?
check_agent_access
Run a live agent-access probe against one URL: 12 sequential requests from the machine running the server that differ only in User-Agent (a browser baseline, GlippyBot as a generic-bot control, 8 AI crawlers, a spoofed Googlebot, and a closing browser baseline). Only a difference between those same-IP requests counts as a block. A bare 403 can just mean the IP has a poor reputation, so anything short of differential evidence is reported as "could not tell from this vantage", never as blocked.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain or full URL to probe, e.g. "example.com" or "https://example.com/pricing". A bare domain probes the homepage. |
output_format | enum | No | "text" (default) for a readable report, or "json" for the raw verdict, controls, and per-crawler states. |
Can ChatGPT and Perplexity actually fetch https://example.com/pricing?
- A session verdict:
open,ua_block,allowlist_block,verifies_identity,blanket_bots,vantage_blocked,rate_limited_vantage,inconclusive, ornot_probed - A state per probed crawler:
ok,ok_degraded,ua_blocked,charged,inconclusive, ornot_probed - The control requests each verdict is judged against
- Impact by crawler role: blocks on citation crawlers cost GEO score, blocks on live fetchers are a lesser warning, and blocks on training crawlers are informational only
- A vantage caveat naming the network the probe ran from
Can AI and LLMs access my page? explains how the probe works and how to read each state.
get_geo_summary
Get a concise GEO readiness summary: overall score, grade, top 3 strengths, and top 3 issues. Use for quick assessments.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to check. No https:// prefix. |
page_type | enum | No | What kind of page the homepage is (one id). See Page Type. |
render_mode | enum | No | "static" (default), "auto", or "chrome". See Render Modes. |
Give me a quick GEO summary of example.com
extract_page_content
Extract one page's main content, cleaned and structured, so the AI model you are working with can judge what heuristics cannot: whether the positioning is distinctive or generic, whether claims are supported, which questions the page leaves unanswered, and which sections do not stand alone. It runs the same content engine as Glippy's content checks. Use analyze_urls when you want a scored audit instead.
It is also the first step of the classify-then-analyse flow: the output names the page type Glippy detected, with its reason, and lists every valid id, so the model can decide the type from the text and pass it to analyze_urls. The beta wording checks are never scored; the model may judge them itself from the returned sections.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Full URL of one public page, e.g. "https://example.com/pricing". Include https://. |
page_type | enum | No | Optional here: leave it out on a first call to get the detected type, or pass one id to score the content scores for that type. See Page Type. |
max_sections | integer | No | Sections to return, in page order (1-100). Default: 30. |
max_chars | integer | No | Cap on the total page text returned (1,000-100,000). Default: 15000. Section texts are trimmed first, then the lowest-ranked quotable passages are dropped. |
render_mode | enum | No | "static" (default), "auto", or "chrome". robots.txt is checked first in every mode. See Render Modes. |
Read https://example.com/pricing with extract_page_content and tell me which positioning lines are generic, which claims need evidence, and how to rewrite the sections that do not stand alone.
- Detected language, content type, and word count
detected_page_typeanddetected_page_type_reason,page_type(whether a type was set), andvalid_page_types(every id with a one-line description)- Title, meta description, H1, and lead paragraph
- Sections in page order, flagged as self-contained, answer-first, or opening with a reference back
- The most quotable passages, statistical claims and proof points, and positioning sentences
- Content scores per category with their failing and warning checks
- A review guide that tells the model what to judge
Reads one public page as GlippyBot and checks robots.txt first. If the rules disallow the URL, or robots.txt cannot be read, nothing else is fetched and the tool explains why. See the GlippyBot crawler info.
compare_domains
Analyze multiple domains in parallel and compare their GEO scores side by side. Perfect for competitive analysis.
| Parameter | Type | Required | Description |
|---|---|---|---|
domains | array[string] | Yes | 2-50 domains to compare. No https:// prefix. For more than 50, run multiple times and merge the results. |
max_pages | integer | No | Pages per domain (1-10). Default: 10. |
page_type | enum or object | No | One id for every domain's homepage, or a map of domain to id, e.g. {"a.com": "homepage", "b.com": "service"}. See Page Type. |
render_mode | enum | No | "static" (default), "auto", or "chrome". Applied per domain. See Render Modes. |
output_format | enum | No | "text" (default) or "json". Use JSON to pass results to export_bulk_report. |
Compare GEO scores: example.com, competitor1.com, competitor2.com
analyze_sitemap
Fetch a sitemap XML, extract URLs, and analyze each page. Supports regular sitemaps and sitemap index files.
| Parameter | Type | Required | Description |
|---|---|---|---|
sitemap_url | string | Yes | Full URL to sitemap (e.g., "https://example.com/sitemap.xml") |
max_urls | integer | No | Max URLs to analyze (1-50,000). Default: all found. |
rate_limit | number | No | Requests/second per domain (0.1-100). Default: 5. |
render_mode | enum | No | "static" (default), "auto", or "chrome". Applied per URL. See Render Modes. |
output_format | enum | No | "text" (default) or "json". Use JSON to pass results to export_bulk_report. |
Analyze all pages in https://example.com/sitemap.xml
analyze_urls
Run GEO analysis on a specific list of URLs. URLs can span multiple domains.
| Parameter | Type | Required | Description |
|---|---|---|---|
urls | array[string] | Yes | Full URLs to analyze (1-50,000). Include https://. |
page_type | enum or object | No | One id for every URL, or a map of URL to id. A URL the map does not name runs unconfirmed. See Page Type. |
rate_limit | number | No | Requests/second per domain (0.1-100). Default: 5. |
render_mode | enum | No | "static" (default), "auto", or "chrome". Applied per URL. See Render Modes. |
output_format | enum | No | "text" (default) or "json". Use JSON to pass results to export_bulk_report. |
Analyze these pages: https://example.com/about, https://example.com/pricing
export_report
Generate a styled, shareable report in Markdown or HTML format — matching the Glippy browser extension's export.
| Parameter | Type | Required | Description |
|---|---|---|---|
format | enum | Yes | "markdown", "markdown_full", or "html" |
domain | string | No* | Domain to analyze. No https:// prefix. |
max_pages | integer | No | Pages to crawl (1-10). Default: 10. Ignored if analysis_result provided. |
render_mode | enum | No | "static" (default), "auto", or "chrome". Ignored if analysis_result provided. See Render Modes. |
analysis_result | object | No* | Pre-computed result from analyze_domain (with output_format='json'). |
*Provide either domain or analysis_result
Generate an HTML report for example.com
export_bulk_report
Generate a styled report for bulk analysis: domain comparison, URL list, or sitemap crawl.
| Parameter | Type | Required | Description |
|---|---|---|---|
format | enum | Yes | "markdown" or "html" |
domains | array[string] | No* | Compare 2-50 domains. No https:// prefix. |
urls | array[string] | No* | Analyze 1-50,000 URLs. Include https://. |
sitemap_url | string | No* | Full URL to sitemap to crawl. |
analysis_results | object | No* | Pre-computed results from compare_domains, analyze_urls, or analyze_sitemap (with output_format='json'). |
max_pages | integer | No | For domains: pages per domain (1-10). Default: 10. |
max_urls | integer | No | For sitemap: max URLs to analyze (1-50,000). |
rate_limit | number | No | Requests/second per domain (0.1-100). Default: 5. |
render_mode | enum | No | "static" (default), "auto", or "chrome". Ignored if analysis_results provided. See Render Modes. |
*Provide exactly one of: domains, urls, sitemap_url, or analysis_results
Generate an HTML comparison report for example.com and competitor.com
Page Type
Some content checks only make sense for one kind of page: a product page is not expected to cite sources the way an article is, and an article does not need a price. Glippy used to guess the page type, and every serious content-check error came from a wrong guess. So the page type now comes from the AI assistant that calls the tools, through the optional page_type parameter of analyze_urls, analyze_domain, get_geo_summary, compare_domains and extract_page_content.
- Decide what kind of page it is: look at it, or call
extract_page_content, which returnsdetected_page_typewith its reason, the list of valid ids, and the text. - Pass
page_typeto the scoring tool. Where your reading disagrees with the detected type, yours wins.
extract_page_content { "url": "https://example.com/pricing" }
-> detected_page_type: "article", detected_page_type_reason: "Detected from og:type=article, ..."
analyze_urls { "urls": ["https://example.com/pricing"], "page_type": "product" }
Every check that depends on the page type is shown with its finding but carries no points, with the reason "Not scored: this check depends on the page type, which has not been confirmed." The other checks score as usual. "auto" is the same as leaving it out.
Only the ids below are accepted (case and surrounding spaces are ignored). Any other value is ignored with a note in the output (pageTypeNotes in JSON), and that page runs unconfirmed; there is no fuzzy matching. For the multi-URL tools, pass one id for every page or a map of URL (or domain) to id. Reports state the page type of every page, Page type: Article (set by the assistant). or Page type: not confirmed (detected: Article, from og:type=article, which many sites put on every page)., and flag a set type that Glippy's own detection disagrees with.
| id | Page type | Use for |
|---|---|---|
homepage | Homepage | The front page of a site or brand: what it offers and where to go next. |
product | Product page | One product for sale, with its price, options and details. |
category | Category page | A shop listing of several products, often with filters and sorting. |
article | Article | A news story, blog post, guide or essay. |
index | Index or hub page | A news front, blog index or hub page that lists and links to other pages. |
docs | Documentation | Technical documentation, a reference page or a dictionary entry. |
faq | FAQ or help page | Questions and answers, or a help-centre article about a product or service. |
service | Service or local business | A business selling a service: trades, practices, restaurants, agencies or software. |
lodging | Hotel or holiday rental | A hotel, B&B, campsite or holiday rental with rooms to book. |
event | Event | One event, concert or show with its date, venue and tickets. |
recipe | Recipe | A recipe with ingredients and steps. |
info | Public information page | Information from a government body or a nonprofit organisation. |
contact | Contact, about or legal page | Contact details, an about page, terms, privacy or an imprint. |
forum | Forum or Q&A thread | A discussion thread, or a question with answers from users. |
The domain tools analyse the homepage, which is usually homepage; a news front or blog index is index, a one-page local business site is service, a single-product site is product.
Render Modes
ReferenceEvery analysis tool accepts a render_mode parameter controlling how HTML is fetched for scoring. Some sites (Cloudflare, Akamai, DataDome, PerimeterX, Incapsula) block plain Node fetches; Chrome-backed modes drive a real browser to get past them. Auditing your own site? The cleaner fix is to allow-list the GlippyBot User-Agent — see the GlippyBot allow-list guide.
| Mode | Behavior | Use when |
|---|---|---|
static (default) | Plain Node fetch. Fast, no Chrome needed. | Targets don't block bots, or you want the static-crawler view. |
auto | Static first; retry via Chrome if the response looks bot-blocked (401/403/407/429/503 or empty 2xx). | Mixed workloads — most sites stay on the fast path, only blocked ones pay the Chrome cost. Recommended for competitive audits. |
chrome | Every URL fetched via Chrome. Slowest, most resilient. | Target aggressively detects headless, or you want uniform Chrome rendering. |
The returned analysis includes a renderMode field indicating which path ran:
| Value | Meaning |
|---|---|
static | Static fetch succeeded; Chrome not invoked. |
chrome | Launched directly via Chrome (explicit mode). |
chrome-fallback | Static fetch was blocked; Chrome recovered a 2xx. |
chrome-blocked-<code> | Chrome was tried but also got blocked with the given status. |
static-blocked | Static fetch failed and Chrome was unavailable or errored. |
Auto and chrome modes need a local Chrome/Chromium binary. The server auto-detects from CHROME_PATH, PUPPETEER_EXECUTABLE_PATH, or common install paths (Windows: C:\Program Files\Google\Chrome\Application\chrome.exe; macOS: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome; Linux: /usr/bin/google-chrome). If none is found, render_mode: "static" continues to work; other modes will record static-blocked.
Sites that fingerprint the headless build can still block the server-launched browser. Launch a separate Chrome with remote debugging and have the server attach to it by setting CHROME_REMOTE_URL in the MCP server env:
# macOS
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
--remote-debugging-port=9222 --user-data-dir=/tmp/glippy-chrome &
# Windows (PowerShell)
& "C:\Program Files\Google\Chrome\Application\chrome.exe" `
--remote-debugging-port=9222 --user-data-dir=C:\Temp\glippy-chrome
# Linux
google-chrome --remote-debugging-port=9222 --user-data-dir=/tmp/glippy-chrome &
# Then in your MCP config env:
# CHROME_REMOTE_URL=http://localhost:9222
Using a dedicated --user-data-dir keeps this session isolated from your normal browsing. When attached, the fetcher leaves UA/headers/stealth untouched so requests look identical to a human browsing from that profile.