CrawlGraph MCP — backlink intelligence on the public Common Crawl webgraph (4.4B edges, 120M domains)
CrawlGraph MCP demonstrates solid tool design with clear, domain-specific naming and comprehensive descriptions. All 6 tools have well-structured input schemas with proper type definitions and required field declarations. Descriptions are detailed (150-250 chars) and explain use cases effectively. However, output schemas are completely absent, critical for LLM planning and chaining. Parameter descriptions are thorough but could benefit from explicit format/constraint documentation. Error handling is present but lacks recovery guidance. No tool annotations (readOnlyHint, idempotentHint) despite all tools being read-only operations.
Referring domains for a target domain from the Common Crawl webgraph (4.4B edges, 120M domains). Returns linking domains ranked by CrawlGraph authority — useful for SEO audits, competitor backlink profiles, link-building gap research, and verifying who is citing a brand. One call = one quota credit.
Quarter-over-quarter diff of referring domains for a domain — what was added or lost between two Common Crawl releases. Useful for catching link rot, sudden spikes (PR coverage), and outreach campaign attribution. Counts as one call against the backlinks quota.
Backlink gap analysis: find domains linking to your competitors but NOT to you. Submit your domain + 1–5 competitor domains and CrawlGraph runs an async job (typically completes in seconds; longer for large profiles). This tool polls up to ~10s and either returns the full gap list, or — if still running — returns the job_id so you can resume via crawlgraph_gap_status. Counts against the gap-analysis quota when the job is submitted.
The warm-outreach play: gap_analysis filtered to ONLY the linking domains that link to EVERY competitor you listed but not to you. These are the highest-conviction outreach candidates — every competitor in the set has the link, so the topic/audience is verified. Same async pattern as crawlgraph_gap_analysis (polls up to ~10s; returns job_id if still running). Counts as one gap-analysis quota call.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., job_id from gap_analysis for use in gap_status). This breaks tool chaining and forces agents to guess response structure.
API key exposed as _apiKey parameter. Although extracted and deleted before use, this pattern risks leaking credentials into logs, traces, and LLM context. Should use server-side secret injection via environment variables.
No tool annotations (readOnlyHint, idempotentHint, destructiveHint). All 6 tools are read-only and idempotent, annotating them would help LLMs reason about retry safety and side effects.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2025-06-18+ | v2 |
Poll a previously-submitted gap analysis job by ID. Use this when crawlgraph_gap_analysis or crawlgraph_gap_outreach_targets returned status=pending with a job_id — call this with the same job_id to retrieve the result once status=completed. Read-only; no quota cost.
List the Common Crawl releases CrawlGraph has indexed (used as release_id in backlinks). Free; not counted against quota.
Error messages lack recovery guidance. cgFetch() throws generic 'CrawlGraph error' or 'timeout' messages without suggesting next steps (e.g., 'Check API key validity' or 'Retry with crawlgraph_releases to verify connectivity').
Parameter constraints not fully documented. 'limit' accepts 1 - 10000 but description only says 'default 1000, max 10000', minimum is missing. 'competitor_domains' minItems=2 for outreach_targets but description says '2 - 5' without explaining why 2 is required.