CompetLab MCP Tools Reference
How to read this reference
A few things hold across every tool:
- Authentication isn’t a parameter. Your API key travels on the request (a
CL-API-Keyheader, or?api_key=on the URL) — see Connect. A tool sees exactly what your key can see over the REST API. - Most tools are project-scoped. They need a
projectId, which you get fromlist_projects. IDs are 24-character hex strings. - Read vs. state-changing. 30 of the 33 tools only read. The three exceptions —
start_tech_stack_scan,start_trust_signals_scan, andstart_agent_adoption_scan— start a live scan and return ascanIdyou poll. - Rate limits. The free-tool routes are limited per API key: most at 1,000 requests
per minute, with
fetch_urlheld tighter at 60 per minute. - Errors. A missing or malformed key is rejected by the server with an HTTP 401
(
api_key_missing/api_key_invalid) before any tool runs. Once a call reaches a tool, failures come back as an MCP tool error (isError: true) with a machine-readable code — for examplescan_not_foundorapi_unreachable— rather than throwing.
Shared parameters
| Parameter | Type | Notes |
|---|---|---|
projectId | string | A project’s 24-character hex ID, from list_projects. Required by every project-scoped tool. |
page | integer | 1-indexed page number. Default 1. |
limit | integer | Items per page. Default 20, max 100. Check pagination.hasMore to page. |
The tools at a glance
| Tool | Area | Read-only | What it does |
|---|---|---|---|
list_projects | Projects | ✔ | List accessible projects and their status. |
get_project | Projects | ✔ | One project’s per-dimension freshness and prompts. |
list_competitors | Competitors | ✔ | Competitors in a project (incl. your own domain). |
get_competitor | Competitors | ✔ | One competitor’s detail and monitored pages. |
get_ai_visibility_dashboard | AI Visibility | ✔ | Latest AI Visibility Score and per-engine breakdown. |
get_ai_visibility_history | AI Visibility | ✔ | Paginated AI Visibility check history. |
get_ai_visibility_check_detail | AI Visibility | ✔ | Full detail for one AI Visibility check. |
get_ai_visibility_trend | AI Visibility | ✔ | AI Visibility trend over time. |
get_positioning_dashboard | Positioning | ✔ | Latest homepage-messaging analysis. |
get_positioning_history | Positioning | ✔ | Paginated Positioning run history. |
get_positioning_run_detail | Positioning | ✔ | Full data for one Positioning run. |
get_pricing_dashboard | Pricing | ✔ | Latest structured pricing and gap analysis. |
get_pricing_history | Pricing | ✔ | Paginated Pricing run history. |
get_pricing_run_detail | Pricing | ✔ | Full data for one Pricing run. |
get_content_dashboard | Content | ✔ | Latest content categorization and gap analysis. |
get_content_history | Content | ✔ | Paginated Content run history. |
get_content_run_detail | Content | ✔ | Full data for one Content run. |
get_content_changelog | Content | ✔ | Detected content changes per competitor over time. |
get_tech_trust_dashboard | Tech & Trust | ✔ | Latest security, trust, and tech-stack profile. |
get_tech_trust_history | Tech & Trust | ✔ | Paginated Tech & Trust run history. |
get_tech_trust_run_detail | Tech & Trust | ✔ | Full data for one Tech & Trust run. |
list_alerts | Alerts | ✔ | Competitive alerts across dimensions. |
list_schedules | Schedules | ✔ | Monitoring schedules for the five dimensions. |
get_briefing | Strategic Briefing | ✔ | The synthesized Strategic Briefing. |
check_sitemap | Free Tools | ✔ | Live sitemap analysis for any domain. |
check_ai_crawlers | Free Tools | ✔ | Live AI-crawler access check for any domain. |
fetch_url | Free Tools | ✔ | Fetch and clean any public URL. |
start_tech_stack_scan | Free Tools | — | Start an async tech-stack scan. |
get_tech_stack_scan | Free Tools | ✔ | Poll a tech-stack scan. |
start_trust_signals_scan | Free Tools | — | Start an async trust-signals scan. |
get_trust_signals_scan | Free Tools | ✔ | Poll a trust-signals scan. |
start_agent_adoption_scan | Free Tools | — | Start an async Agent Adoption Check. |
get_agent_adoption_scan | Free Tools | ✔ | Poll an Agent Adoption Check. |
Projects
list_projects
Lists the projects your key can access, with status, competitor count, and last-monitored
time. This is the starting point — it’s how you discover the projectId values the other
tools need. It takes no parameters.
{ "name": "list_projects", "arguments": {} }Returns the accessible projects, each with status, competitor count, and last-monitored timestamp.
get_project
Returns one project’s details, including per-dimension monitoring freshness (Tech & Trust, Content, Positioning, Pricing, AI Visibility), the AI monitoring prompts, and overall status. Use it to see when each dimension was last updated.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
Competitors
list_competitors
Lists every competitor monitored for a project, including your own domain (marked
isOwn: true for self-comparison). Returns domain, name, and status for each.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
get_competitor
Returns one competitor’s detail, including the pages CompetLab monitors (homepage and pricing-page URLs).
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
competitorId | string | Yes | Competitor ID, from list_competitors. |
AI Visibility
The AI Visibility tools use a checkId rather than a runId: each check is one query
cycle of 3 prompts across 3 AI engines (9 queries).
get_ai_visibility_dashboard
Returns the latest AI Visibility Score (a 0–100 composite), Mention Rate (the fraction of queries where a brand is mentioned), per-engine breakdowns for ChatGPT (OpenAI), Claude, and Gemini, and how your competitors compare.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
get_ai_visibility_history
Paginated history of AI Visibility checks.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
page | integer | No | Page number. Default 1. |
limit | integer | No | Items per page. Default 20, max 100. |
get_ai_visibility_check_detail
Full detail for one AI Visibility check — per-competitor comparison, mention rates, AI Visibility Scores, and per-engine results.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
checkId | string | Yes | Check ID, from get_ai_visibility_history. |
get_ai_visibility_trend
AI Visibility trend over time (up to 200 data points). Without a provider filter it returns
the aggregate Mention Rate plus the AI Visibility Score. With a provider filter it returns
that engine’s Mention Rate only — the AI Visibility Score is a single cross-engine
composite, so it comes back null when a provider is set.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
dateFrom | string | No | Start date, ISO-8601 (e.g. 2026-01-01). |
dateTo | string | No | End date, ISO-8601. |
provider | string | No | One of openai, claude, gemini. Omit for the aggregate view. |
{
"name": "get_ai_visibility_trend",
"arguments": {
"projectId": "65a1b2c3d4e5f6a7b8c9d0e1",
"dateFrom": "2026-01-01",
"provider": "claude"
}
}Filtering by claude returns Claude’s Mention Rate over time; the AI score fields are
null under a provider filter.
Positioning
get_positioning_dashboard
Returns the latest homepage-messaging analysis for every competitor: page title, headline, tagline, value proposition, primary and secondary CTAs, key offerings, target audience, main differentiator, pricing mentions, and free-trial info.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
get_positioning_history
Paginated history of Positioning monitoring runs.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
page | integer | No | Page number. Default 1. |
limit | integer | No | Items per page. Default 20, max 100. |
get_positioning_run_detail
Full competitor-by-competitor data for one historical Positioning run.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
runId | string | Yes | Run ID, from get_positioning_history. |
Pricing
get_pricing_dashboard
Returns the latest structured pricing for every competitor — plans (each with a name, a
price such as $49/month, and a summary; up to five per competitor) — plus market pricing
statistics and a pricing gap analysis.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
get_pricing_history
Paginated history of Pricing monitoring runs.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
page | integer | No | Page number. Default 1. |
limit | integer | No | Items per page. Default 20, max 100. |
get_pricing_run_detail
Full competitor-by-competitor data for one historical Pricing run.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
runId | string | Yes | Run ID, from get_pricing_history. |
Content
get_content_dashboard
Returns the latest Content Intelligence for every competitor: sitemap URL counts, strategic URL identification, content categorization across 11 categories, sitemap structure, and a content gap analysis.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
get_content_history
Paginated history of Content monitoring runs.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
page | integer | No | Page number. Default 1. |
limit | integer | No | Items per page. Default 20, max 100. |
get_content_run_detail
Full competitor-by-competitor data for one historical Content run.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
runId | string | Yes | Run ID, from get_content_history. |
get_content_changelog
Detected content changes per competitor sitemap over time — URLs added and removed, with
per-category counts and up to three sample URLs per category by default. Filter by
competitor and/or category to scope it. Set allUrlsPerCategory: true for the full URL
list per category; high-activity competitors can produce large responses, so combine it
with filters and watch the truncated flag in the response.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
page | integer | No | Page number. Default 1. |
limit | integer | No | Items per page. Default 20, max 100. |
competitorId | string | No | Filter by competitor ID, from list_competitors. |
category | string | No | One of blog, docs, tools, landing, legal, caseStudies, comparison, integrations, changelog, webinars, other. |
allUrlsPerCategory | boolean | No | Default false (up to 3 sample URLs per category). Set true for full URL lists. |
Tech & Trust
get_tech_trust_dashboard
Returns the latest Tech & Trust profile for every competitor: security headers (an A–F grade, plus HSTS, CSP, X-Frame-Options, and X-Content-Type-Options), trust signals (34 signals across five categories), the detected technology stack, robots.txt AI-bot blocking status, and DNS infrastructure.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
get_tech_trust_history
Paginated history of Tech & Trust runs, with completion timestamps.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
page | integer | No | Page number. Default 1. |
limit | integer | No | Items per page. Default 20, max 100. |
get_tech_trust_run_detail
Full competitor-by-competitor data for one historical Tech & Trust run.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
runId | string | Yes | Run ID, from get_tech_trust_history. |
Alerts
list_alerts
Returns paginated competitive alerts — detected changes across all monitored dimensions, with change diffs and action hints. Filter by dimension, severity, and/or competitor.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
page | integer | No | Page number. Default 1. |
limit | integer | No | Items per page. Default 20, max 100. |
dimension | string | No | One of tech-trust, content, positioning, pricing, ai-visibility. |
severity | string | No | One of critical, high, medium, info. |
competitorId | string | No | Filter by competitor ID, from list_competitors. |
{
"name": "list_alerts",
"arguments": {
"projectId": "65a1b2c3d4e5f6a7b8c9d0e1",
"dimension": "pricing",
"severity": "critical"
}
}Schedules
list_schedules
Returns the monitoring schedules for all five monitored dimensions: enabled/disabled status, interval in days, and the next- and last-run timestamps for each.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
Strategic Briefing
get_briefing
Returns the project’s Strategic Briefing — the synthesized, prioritized read across all
13 dimensions: what changed, what it means, and what to do about it. This is the analyzed,
as-of read, not raw monitoring; for live per-dimension data use the get_<dimension>_dashboard
tools. It’s generated automatically per project and refreshed roughly monthly.
By default it returns the executive hub — a cheap digest (headline, top moves, and a
per-dimension verdict that names the deeper section to open next) that answers most
questions in a single call. Request extra sections only when a question needs them.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | string | Yes | Project ID, from list_projects. |
sections | string[] | No | Which sections to return. Default ["hub"]. See the values below. |
includeCharts | boolean | No | Default false. Set true to include full chart series (larger payload). |
Valid sections values (pass any combination):
hub actions competitors all
deep-ai-visibility deep-positioning deep-pricing deep-content deep-tech-trust
deep-agent-readiness deep-ai-ecosystem deep-customer-voice deep-funding-capital
deep-hiring-gtm deep-landscape deep-product-launches deep-reliability-statusThere’s one deep- section per dimension — the five monitored plus the eight researched
dimensions researched for the briefing (13 in all). (deep-agent-readiness is a frozen API
identifier; the dimension is Agent Adoption.) The hub’s verdicts tell you which
deep- section to open, so you rarely need to guess. all returns the entire briefing and
is large — use it for export or a full read only.
{ "name": "get_briefing", "arguments": { "projectId": "65a1b2c3d4e5f6a7b8c9d0e1" } }{
"name": "get_briefing",
"arguments": {
"projectId": "65a1b2c3d4e5f6a7b8c9d0e1",
"sections": ["actions", "deep-pricing"]
}
}Free Tools
The free tools run live against any public domain — they don’t need a project. Three of
them are async: a start_* call kicks off a scan and returns a scanId, and the matching
get_* call polls for the result.
check_sitemap
Live sitemap analysis for any domain — discovers URLs, categorizes them by section, and flags content gaps and depth.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to scan, e.g. example.com. |
sitemapUrl | string | No | Full URL to a specific sitemap (with http:// or https://). Skips discovery. |
check_ai_crawlers
Live check of AI-crawler access via robots.txt and meta tags — covering GPTBot, ClaudeBot, Google-Extended, PerplexityBot, and others — with a per-crawler allow/block verdict.
| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to scan, e.g. example.com. |
industry | string | No | Industry context for benchmarking. One of news-media, arts-entertainment, law-government, finance-healthcare, saas-tech, ecommerce, other. |
{ "name": "check_ai_crawlers", "arguments": { "domain": "example.com" } }fetch_url
Fetches any public URL with automatic JS-rendering and common bot-protection handling, and
returns the body, headers, and clean-up stats. cleanHtml strips HTML noise while keeping
the text — a real token saving when an agent is about to read the page.
| Parameter | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Target URL. Must be http(s) and resolve to a public host. |
bodyNeeded | boolean | No | Include body and contentType in the response. |
headersNeeded | boolean | No | Include headers and headersAvailable. Some sites block header retrieval — then headersAvailable is false. |
cleanHtml | boolean | No | For HTML responses, strip scripts/styles/comments and keep text. Requires bodyNeeded. |
maxTimeoutMs | integer | No | Timeout budget in ms. Range 1000–120000. |
bodyMaxBytes | integer | No | Response body cap in bytes. Range 1024–104857600 (1 KiB–100 MiB). |
At least one of bodyNeeded or headersNeeded must be true. This tool has the tighter
rate limit of the free tools — 60 requests per minute per key.
{
"name": "fetch_url",
"arguments": { "url": "https://example.com", "bodyNeeded": true, "cleanHtml": true }
}start_tech_stack_scan · get_tech_stack_scan
starts a scan
start_tech_stack_scan begins an async tech-stack detection on a domain — 117 detection
rules spanning the tech stack (hosting, frameworks, CMS, payments), the growth stack
(analytics, marketing, CRM, advertising), and the engagement stack (support, forms, video,
monitoring). It returns a scanId immediately; scans typically finish in seconds, up to
~90 seconds for heavy-render sites.
get_tech_stack_scan returns the current status while running and the detected
technologies (with confidence scores) once complete — poll every 2–5 seconds.
| Tool | Parameter | Type | Required | Description |
|---|---|---|---|---|
start_tech_stack_scan | domain | string | Yes | Domain to scan, e.g. example.com. |
get_tech_stack_scan | scanId | string | Yes | Scan ID, from start_tech_stack_scan. |
{ "name": "start_tech_stack_scan", "arguments": { "domain": "example.com" } }{ "name": "get_tech_stack_scan", "arguments": { "scanId": "65a1b2c3d4e5f6a7b8c9d0e1" } }start_trust_signals_scan · get_trust_signals_scan
starts a scan
start_trust_signals_scan begins an async trust-signals analysis on a domain — 34 signals
across five categories: enterprise readiness, third-party validation, social proof, brand
authority, and risk reversal. It returns a scanId; get_trust_signals_scan returns the per-signal verdicts
and an overall tier verdict once complete. Poll every 2–5 seconds.
| Tool | Parameter | Type | Required | Description |
|---|---|---|---|---|
start_trust_signals_scan | domain | string | Yes | Domain to scan, e.g. example.com. |
get_trust_signals_scan | scanId | string | Yes | Scan ID, from start_trust_signals_scan. |
start_agent_adoption_scan · get_agent_adoption_scan
starts a scan
start_agent_adoption_scan begins an async Agent Adoption Check on a domain — 25 checks
across discoverability, access control, content readability, and agent endpoints, following
the open Agent-Adoption Specification. It returns a scanId; get_agent_adoption_scan
returns the current status while running and the complete results once finished. Poll every
2–5 seconds.
| Tool | Parameter | Type | Required | Description |
|---|---|---|---|---|
start_agent_adoption_scan | domain | string | Yes | Domain to scan, e.g. example.com. |
get_agent_adoption_scan | scanId | string | Yes | Scan ID, from start_agent_adoption_scan. |
Next steps
- Connect to the server → — configs for every client.
- Back to the overview → — how it works, auth, and the FAQ.