Free SEO, GEO, and AEO audits: analyze any page or domain, AI-crawler access, agent readiness.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Fetches any public URL and returns structured on-page SEO signals: title, meta description, canonical (+ canonicalCount), lang, heading counts, schema types (JSON-LD including @graph and nested entities, plus microdata and schema.org RDFa; schemaTypesBySyntax splits them), OpenGraph/Twitter cards (any attribute order), internal/external link counts, word count (body text without scripts, templates, comments; see wordCountMethod), and whether markdown is served for Accept: text/markdown. Text values are entity-decoded. pageLoaded:false means the checker was refused or got an error or challenge page; then title, schemaTypes and wordCount are null (unknown, not empty). markdownNegotiation is null with markdownNegotiationChecked:false when the markdown probe was refused.
Absolute http(s) URL
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Fetches any public URL and returns structured on-page SEO signals: title, meta description, canonical (+ canonicalCount), lang, heading counts, schema types (JSON-LD including @graph and nested entities, plus microdata and schema.org RDFa; schemaTypesBySyntax splits them), OpenGraph/Twitter cards (any attribute order), internal/external link counts, word count (body text without scripts, templates, comments; see wordCountMethod), and whether markdown is served for Accept: text/markdown. Text values are entity-decoded. pageLoaded:false means the checker was refused or got an error or challenge page; then title, schemaTypes and wordCount are null (unknown, not empty). markdownNegotiation is null with markdownNegotiationChecked:false when the markdown probe was refused.
| Argument | Type | Description |
|---|---|---|
| url* | string | Absolute http(s) URL |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Absolute http(s) URL"
}
},
"additionalProperties": false
}Probes a domain root for site-wide AI-discovery signals: /llms.txt; /robots.txt parsed per RFC 9309 for GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, Claude-User, PerplexityBot, Perplexity-User, GoogleOther, Google-Extended, CCBot, Applebot-Extended, Meta-ExternalAgent, meta-externalfetcher, Amzn-SearchBot, MistralAI-User, DuckAssistBot (aiBotStatus is the verdict for the homepage path / only; aiBotDisallows lists rules that still block an allowed bot elsewhere); the sitemap (/sitemap.xml or robots.txt Sitemap lines, sitemap indexes followed, gzip read): urlCount is unique page URLs, urlCountComplete says whether every sitemap file was read; /.well-known/agent-skills/index.json, /.well-known/api-catalog, /.well-known/mcp/server-card.json; and the homepage Link header. Every file reports found: true, false (checked and absent, including HTML catch-all pages), or null with checked:false (blocked, erroring or timed out: unknown).
| Argument | Type | Description |
|---|---|---|
| domain* | string | Root domain or full URL (e.g. "example.com" or "https://example.com") |
{
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "Root domain or full URL (e.g. \"example.com\" or \"https://example.com\")"
}
},
"additionalProperties": false
}Asks Ask Momentic a question and returns its answer, written by AI from momenticmarketing.com pages, with the Momentic pages it is based on as sources. Use it for questions about Momentic (services, Atlas, the team, case studies, pricing) and about SEO and AI search topics Momentic publishes research on, such as AI chatbot market share, AI Overviews, llms.txt, AI crawlers or query fan out. A question someone asked before returns at once; a new one takes about 30 seconds. If the result says the answer is still being written, call the tool again with the same question after about 30 seconds.
| Argument | Type | Description |
|---|---|---|
| question* | string | The question, in plain words (2 to 200 characters). |
{
"type": "object",
"required": [
"question"
],
"properties": {
"question": {
"type": "string",
"description": "The question, in plain words (2 to 200 characters)."
}
},
"additionalProperties": false
}Probes a URL with AI crawler user agents, using the operators' current documented strings (GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, Claude-User, PerplexityBot, Perplexity-User, GoogleOther, Google-Agent, CCBot, Applebot, meta-externalagent, meta-externalfetcher, Amzn-SearchBot, MistralAI-User, DuckAssistBot) in parallel, plus a regular Chrome browser request as a baseline, and returns per-bot reachability (status, key WAF/CDN headers, verdict). Reveals WAF/CDN-layer blocks that robots.txt audits miss. Verdicts: reachable, blocked-403, blocked-4xx, challenged-by-cdn (including 200 challenge pages), rate-limited-429, redirected-to-block-page, inconclusive-not-bot-specific (the browser baseline was refused too, so the block is not aimed at the bot), not-found, server-error-5xx, timeout, fetch-error. summary.blocked counts only bot-specific blocks; timeouts and errors are counted separately. Requests come from Cloudflare's network, not the bot operators' IPs (see probe.note). Google-Extended and Applebot-Extended are robots.txt tokens, not user agents, and are not probed.
| Argument | Type | Description |
|---|---|---|
| url* | string | Absolute http(s) URL to probe |
| timeoutMs | number | Per-fetch timeout in ms (default 5000) |
| userAgents | array | Optional UA strings to test. Defaults to the bots listed above (robots.txt tokens such as Google-Extended and Applebot-Extended are not probed). |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Absolute http(s) URL to probe"
},
"timeoutMs": {
"type": "number",
"description": "Per-fetch timeout in ms (default 5000)"
},
"userAgents": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional UA strings to test. Defaults to the bots listed above (robots.txt tokens such as Google-Extended and Applebot-Extended are not probed)."
}
},
"additionalProperties": false
}Pure graph computation over a crawled page set. Input: an array of {url, internalLinks: [{href, anchor}, ...], title?, bodyText?}. Returns orphan pages (in-degree 0, excluding the homepage), hubs (top-N by in-degree), authorities (top-N by out-edges to hubs), PageRank-lite ranking, anchor-diversity issues (all-anchors-same, no-descriptive-anchors), connected components, and isolated clusters. With options.findMentions=true and title+bodyText supplied, also returns mention-not-linked suggestions. URL normalization (trailing slash, lowercased host, dropped utm_*/fbclid/gclid/etc.) is on by default.
| Argument | Type | Description |
|---|---|---|
| pages* | array | Array of crawled pages |
| options | object |
{
"type": "object",
"required": [
"pages"
],
"properties": {
"pages": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"internalLinks"
],
"properties": {
"url": {
"type": "string"
},
"title": {
"type": "string"
},
"bodyText": {
"type": "string"
},
"internalLinks": {
"type": "array",
"items": {
"type": "object",
"required": [
"href"
],
"properties": {
"href": {
"type": "string"
},
"anchor": {
"type": [
"string",
"null"
]
}
}
}
}
}
},
"description": "Array of crawled pages"
},
"options": {
"type": "object",
"properties": {
"hubCount": {
"type": "number",
"description": "Number of top hubs to return. Default 10."
},
"findMentions": {
"type": "boolean",
"description": "Default false. If true (and pages include title+bodyText), include mentioned-not-linked suggestions. O(N^2) — slow on large inputs."
},
"rankingLimit": {
"type": "number",
"description": "Max ranking entries to return. Default 50."
},
"normalizeUrls": {
"type": "boolean",
"description": "Default true. Strip trailing slashes, lowercase host, drop tracking params."
},
"authorityCount": {
"type": "number",
"description": "Number of top authorities to return. Default 10."
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}Pure HTML parser. Given a single page's HTML and its baseUrl, returns every <a href> resolved to absolute, separated into internal vs external by host, with cleaned anchor text, rel attribute, and nofollow flag. Skips fragments, mailto:, tel:, javascript:, and empty hrefs. Designed to feed compute_link_graph: the agent crawls pages on the user's machine (their IP, no Cloudflare subrequest cap) and calls extract_links per page, then ships the structured page data into compute_link_graph.
| Argument | Type | Description |
|---|---|---|
| html* | string | Raw HTML of the page |
| baseUrl* | string | Absolute URL of the page (used to resolve relative links and identify internal vs external) |
{
"type": "object",
"required": [
"html",
"baseUrl"
],
"properties": {
"html": {
"type": "string",
"description": "Raw HTML of the page"
},
"baseUrl": {
"type": "string",
"description": "Absolute URL of the page (used to resolve relative links and identify internal vs external)"
}
},
"additionalProperties": false
}Returns the canonical AI-readable description of Momentic from /llms.txt. Use for authoritative brand info, positioning, services, and contact.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Fetches a Momentic page as Markdown (uses Cloudflare's Markdown for Agents). Pass an absolute path like "/team/jane-doe" or a full momenticmarketing.com URL.
| Argument | Type | Description |
|---|---|---|
| path* | string | Absolute path or full URL on momenticmarketing.com |
{
"type": "object",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "Absolute path or full URL on momenticmarketing.com"
}
},
"additionalProperties": false
}Lists pages on momenticmarketing.com from sitemap.xml. Optional `section` filter: team, case-studies, capabilities, services, blog, seo-news, content-academy, google-updates, blog-categories, careers, about, contact, pricing.
| Argument | Type | Description |
|---|---|---|
| section | string | Section slug (e.g. "team", "case-studies"). Omit to list all. |
{
"type": "object",
"properties": {
"section": {
"type": "string",
"description": "Section slug (e.g. \"team\", \"case-studies\"). Omit to list all."
}
},
"additionalProperties": false
}Resolves a brand/topic/person to a structured entity record built from Wikidata + Wikipedia (free APIs, no auth). Pass exactly one of: `name` (search by string), `qid` (Wikidata Q-number to skip search), or `wikipediaTitle` (resolves to QID via the article's wikibase_item). Returns: qid, label, description, instanceOf (P31 with resolved labels), sameAs (Wikipedia + claim-derived URLs for Twitter/Instagram/Facebook/GitHub/LinkedIn/YouTube/Crunchbase/official site), sitelinks (top 10 language wikis) and sitelinkCount, Wikipedia summary + thumbnail, Wikipedia section outline (canonical sub-topic structure for content briefs), and alternativeMatches when a name search returned multiple candidates. Powers entity-graph alignment checks (Stage 4 trustworthiness, Stage 10B verification) and feeds the content-brief skill's outline.
| Argument | Type | Description |
|---|---|---|
| qid | string | Wikidata Q-number (e.g. "Q12345") to fetch directly, skipping search. |
| name | string | Brand/topic/person name to search Wikidata for. The top match is resolved; runners-up are returned in alternativeMatches. |
| skipWikipedia | boolean | If true, return Wikidata-only (no Wikipedia summary/sections). Default false. |
| wikipediaTitle | string | English Wikipedia article title (e.g. "Acme_Corporation"). Resolves to QID via pageprops, then proceeds. |
{
"type": "object",
"oneOf": [
{
"required": [
"name"
]
},
{
"required": [
"qid"
]
},
{
"required": [
"wikipediaTitle"
]
}
],
"properties": {
"qid": {
"type": "string",
"pattern": "^[Qq][0-9]+$",
"description": "Wikidata Q-number (e.g. \"Q12345\") to fetch directly, skipping search."
},
"name": {
"type": "string",
"description": "Brand/topic/person name to search Wikidata for. The top match is resolved; runners-up are returned in alternativeMatches."
},
"skipWikipedia": {
"type": "boolean",
"description": "If true, return Wikidata-only (no Wikipedia summary/sections). Default false."
},
"wikipediaTitle": {
"type": "string",
"description": "English Wikipedia article title (e.g. \"Acme_Corporation\"). Resolves to QID via pageprops, then proceeds."
}
},
"additionalProperties": false
}Pure parser (no fetching). Given HTML plus optional response headers and a sitemap entry for the same URL, extracts every freshness marker on the page — HTTP Last-Modified, sitemap lastmod, JSON-LD dateModified/datePublished (including @graph), OpenGraph article:modified_time/published_time, meta updated/dc.date.modified/dcterms.modified/itemprop dateModified, and the first labelled visible date (Last updated / Updated / Published). Returns per-source ISO dates, the freshest source, cross-source agreement spread, and heuristic flags (stale year in title, suspicious future date, only-published-not-modified, none-at-all). Powers the geo-aeo-readiness skill's freshness check — `Last-Modified` headers and `dateModified` JSON-LD are weighted heavily for AI grounding eligibility.
| Argument | Type | Description |
|---|---|---|
| url | string | URL the HTML was fetched from (for context) |
| html* | string | Full HTML of the page |
| headers | object | Response headers as a plain object with lowercased keys (e.g. {"last-modified": "..."}) |
| sitemapEntry | object | Parsed sitemap entry for this URL, e.g. {"lastmod": "2026-04-15"} |
{
"type": "object",
"required": [
"html"
],
"properties": {
"url": {
"type": "string",
"description": "URL the HTML was fetched from (for context)"
},
"html": {
"type": "string",
"description": "Full HTML of the page"
},
"headers": {
"type": "object",
"description": "Response headers as a plain object with lowercased keys (e.g. {\"last-modified\": \"...\"})",
"additionalProperties": {
"type": "string"
}
},
"sitemapEntry": {
"type": "object",
"properties": {
"lastmod": {
"type": "string"
}
},
"description": "Parsed sitemap entry for this URL, e.g. {\"lastmod\": \"2026-04-15\"}",
"additionalProperties": true
}
},
"additionalProperties": false
}Full-text search across every page on momenticmarketing.com (blog posts, research, the Google update tracker with each update's status and dates, case studies, Content Academy guides, Atlas, team pages, careers, the SEO news feed item by item, and Momentic's agent tools and skills), including pages published since Webflow's sitemap was last rebuilt. Returns up to 10 pages ranked by relevance (newest first when the query asks for the latest, newest or most recent; tracker pages by the date Google announced the update), each with its URL, title, content type, published date, author and the passage that best matches the query. Read a full page with get_page.
| Argument | Type | Description |
|---|---|---|
| type | string | Optional: only pages of this content type. |
| query* | string | Search term or question |
| format | string | Optional: json returns structured results (url, title, type, date, author, image, passage; tracker pages also tracker: status, announced, started, completed, kind). |
| recent | boolean | Optional: newest first among relevant pages (also implied by words like latest, newest, most recent in the query). Tracker pages sort by the date Google announced the update. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"type": {
"enum": [
"research",
"blog",
"google-update",
"case-study",
"guide",
"atlas",
"event",
"team",
"service",
"news",
"agent",
"page"
],
"type": "string",
"description": "Optional: only pages of this content type."
},
"query": {
"type": "string",
"description": "Search term or question"
},
"format": {
"enum": [
"text",
"json"
],
"type": "string",
"description": "Optional: json returns structured results (url, title, type, date, author, image, passage; tracker pages also tracker: status, announced, started, completed, kind)."
},
"recent": {
"type": "boolean",
"description": "Optional: newest first among relevant pages (also implied by words like latest, newest, most recent in the query). Tracker pages sort by the date Google announced the update."
}
},
"additionalProperties": false
}