AEO audits, AI citation checks and backlink research. No sign-in. Read-only.
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.
Crawl a URL, parse its HTML and structured data, and score it for answer-engine optimization (AEO). Returns an AEO-focused summary, AI-bot access, and crawl-hint files.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http aeo-research https://aeo.advancelabs.dev/api/mcp/research/mcp
Crawl a URL, parse its HTML and structured data, and score it for answer-engine optimization (AEO). Returns an AEO-focused summary, AI-bot access, and crawl-hint files.
| Argument | Type | Description |
|---|---|---|
| url* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
}Query Perplexity Sonar with a prompt and inspect its citations to determine whether the given URL is cited as a source, and at what rank.
| Argument | Type | Description |
|---|---|---|
| url* | string | The site URL to check for citations. |
| prompt* | string | The end-user question to test. |
| perplexityApiKey* | string | Your Perplexity API key (BYOK). Request-scoped; never stored or logged. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"prompt",
"url",
"perplexityApiKey"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "The site URL to check for citations."
},
"prompt": {
"type": "string",
"minLength": 1,
"description": "The end-user question to test."
},
"perplexityApiKey": {
"type": "string",
"minLength": 1,
"description": "Your Perplexity API key (BYOK). Request-scoped; never stored or logged."
}
},
"additionalProperties": false
}Return a Wayback Machine timeline for a URL: total snapshots, first/last archived dates, and a bounded list of snapshot records with direct archive links.
| Argument | Type | Description |
|---|---|---|
| url* | string | The URL to look up in the Wayback Machine. |
| limit | integer | Max snapshots to return (default 50). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "The URL to look up in the Wayback Machine."
},
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Max snapshots to return (default 50)."
}
},
"additionalProperties": false
}Run one Perplexity Sonar query and rank several competitor URLs by whether and where each is cited for the prompt.
| Argument | Type | Description |
|---|---|---|
| urls* | array | Two or more competitor URLs to rank. |
| prompt* | string | |
| perplexityApiKey* | string | Your Perplexity API key (BYOK). Request-scoped; never stored or logged. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"prompt",
"urls",
"perplexityApiKey"
],
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"minItems": 2,
"description": "Two or more competitor URLs to rank."
},
"prompt": {
"type": "string",
"minLength": 1
},
"perplexityApiKey": {
"type": "string",
"minLength": 1,
"description": "Your Perplexity API key (BYOK). Request-scoped; never stored or logged."
}
},
"additionalProperties": false
}Generate realistic user prompts a site should aim to be cited for on a topic, using Perplexity Sonar. Optionally tests a few of them for live visibility.
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| topic* | string | The topic / niche to generate prompts for. |
| testCount | integer | How many generated prompts to live-test (default 3). |
| perplexityApiKey* | string | Your Perplexity API key (BYOK). Request-scoped; never stored or logged. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url",
"topic",
"perplexityApiKey"
],
"properties": {
"url": {
"type": "string",
"format": "uri"
},
"topic": {
"type": "string",
"minLength": 1,
"description": "The topic / niche to generate prompts for."
},
"testCount": {
"type": "integer",
"maximum": 10,
"minimum": 0,
"description": "How many generated prompts to live-test (default 3)."
},
"perplexityApiKey": {
"type": "string",
"minLength": 1,
"description": "Your Perplexity API key (BYOK). Request-scoped; never stored or logged."
}
},
"additionalProperties": false
}Fetch a page and extract contact emails (including de-obfuscated and mailto links) and social media handles (Twitter/X, LinkedIn, Facebook, Instagram, GitHub, YouTube).
| Argument | Type | Description |
|---|---|---|
| url* | string | The page URL to extract contact info from. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "The page URL to extract contact info from."
}
},
"additionalProperties": false
}Approximate the pages linking to a competitor using free web-search signals (domain mentions and brand mentions). De-duplicates by host and excludes the competitor's own domain. Not a complete backlink index — a free, directional starting point for prospecting.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max sources (default 20). |
| competitorUrl* | string | Competitor's URL or domain (e.g. https://competitor.com or competitor.com). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"competitorUrl"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 40,
"minimum": 1,
"description": "Max sources (default 20)."
},
"competitorUrl": {
"type": "string",
"minLength": 1,
"description": "Competitor's URL or domain (e.g. https://competitor.com or competitor.com)."
}
},
"additionalProperties": false
}Find linked and unlinked mentions of a brand across the web via web search results. When a domain is supplied, classifies each mention as linked (on the brand domain) or unlinked (a third-party page — a potential backlink opportunity).
| Argument | Type | Description |
|---|---|---|
| brand* | string | Brand or product name to search mentions for. |
| limit | integer | Max results (default 20). |
| domain | string | The brand's own domain (e.g. acme.com) — used to classify linked vs unlinked. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"brand"
],
"properties": {
"brand": {
"type": "string",
"minLength": 1,
"description": "Brand or product name to search mentions for."
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Max results (default 20)."
},
"domain": {
"type": "string",
"description": "The brand's own domain (e.g. acme.com) — used to classify linked vs unlinked."
}
},
"additionalProperties": false
}Find guest-post, resource-page, and roundup link-building prospects for a topic by running classic outreach footprints through web search and merging the results by host.
| Argument | Type | Description |
|---|---|---|
| topic* | string | Niche or topic to find link-building prospects for. |
| limitPerAngle | integer | Max results per outreach angle (default 8). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"topic"
],
"properties": {
"topic": {
"type": "string",
"minLength": 1,
"description": "Niche or topic to find link-building prospects for."
},
"limitPerAngle": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Max results per outreach angle (default 8)."
}
},
"additionalProperties": false
}Draft a short, personalized cold outreach email from a contact + context object using your own LLM key (BYOK). Returns a subject line and body. The API key is request-scoped and is never persisted or logged.
| Argument | Type | Description |
|---|---|---|
| model* | string | Model id (e.g. claude-sonnet-4-20250514). |
| apiKey* | string | BYOK API key — request-scoped, never persisted or logged. |
| contact* | object | The recipient. All fields optional; more detail yields better personalization. |
| context* | object | The outreach angle and sender context. |
| provider* | string | LLM provider for @advance-labs/llm. |
| maxTokens | integer | |
| temperature | number |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"contact",
"context",
"provider",
"model",
"apiKey"
],
"properties": {
"model": {
"type": "string",
"minLength": 1,
"description": "Model id (e.g. claude-sonnet-4-20250514)."
},
"apiKey": {
"type": "string",
"minLength": 1,
"description": "BYOK API key — request-scoped, never persisted or logged."
},
"contact": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"role": {
"type": "string"
},
"site": {
"type": "string"
},
"email": {
"type": "string"
}
},
"description": "The recipient. All fields optional; more detail yields better personalization.",
"additionalProperties": false
},
"context": {
"type": "object",
"required": [
"fromBrand",
"reason"
],
"properties": {
"tone": {
"type": "string",
"description": "Desired tone (default: concise, friendly, professional)."
},
"notes": {
"type": "string",
"description": "Personalization notes to weave in."
},
"reason": {
"type": "string",
"minLength": 1,
"description": "Why you are reaching out (broken link, resource page fit, guest post, etc.)."
},
"fromName": {
"type": "string",
"description": "Your name, for the sign-off."
},
"fromBrand": {
"type": "string",
"minLength": 1,
"description": "Your brand or site doing the outreach."
},
"targetUrl": {
"type": "string",
"description": "The page you want linked or featured."
}
},
"description": "The outreach angle and sender context.",
"additionalProperties": false
},
"provider": {
"enum": [
"anthropic",
"openai",
"groq",
"perplexity",
"gateway"
],
"type": "string",
"description": "LLM provider for @advance-labs/llm."
},
"maxTokens": {
"type": "integer",
"maximum": 4096,
"minimum": 1
},
"temperature": {
"type": "number",
"maximum": 2,
"minimum": 0
}
},
"additionalProperties": false
}Combine an AEO audit of a URL with per-prompt AI-visibility checks into a single report with an overall citation rate.
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| prompts* | array | Prompts to test for visibility. |
| perplexityApiKey* | string | Your Perplexity API key (BYOK). Request-scoped; never stored or logged. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url",
"prompts",
"perplexityApiKey"
],
"properties": {
"url": {
"type": "string",
"format": "uri"
},
"prompts": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"minItems": 1,
"description": "Prompts to test for visibility."
},
"perplexityApiKey": {
"type": "string",
"minLength": 1,
"description": "Your Perplexity API key (BYOK). Request-scoped; never stored or logged."
}
},
"additionalProperties": false
}Fetch a page and confirm whether it contains a link to the target domain, reporting anchor text and rel attributes (nofollow/sponsored/ugc) and whether the link is dofollow.
| Argument | Type | Description |
|---|---|---|
| url* | string | The page URL to inspect. |
| targetDomain* | string | The domain the link should point to (e.g. yoursite.com). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url",
"targetDomain"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "The page URL to inspect."
},
"targetDomain": {
"type": "string",
"minLength": 1,
"description": "The domain the link should point to (e.g. yoursite.com)."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 15, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.