LLM-native open source SEO crawler and technical auditor with native MCP server
crawlforge has 8 well-named tools with clear verb-noun patterns (crawl_run, list_crawls, query_urls, etc.). All tools have descriptions (avg ~120 chars, within baseline 34-392 range). Input schemas are present and typed for all tools. However, output schemas are NOT documented, tools return JSON strings without declared field structures, forcing LLMs to parse unstructured text. Parameter descriptions are present but sparse (e.g., 'Path to the DuckDB crawl database' repeated 6 times). Error handling is minimal: query_urls has a basic keyword check but no actionable recovery guidance. No tool annotations (readOnlyHint/destructiveHint). crawl_run is a WRITE operation but lacks confirmation/dry-run pattern. Overall: solid naming and basic schemas, but missing output documentation and error guidance that would elevate this to 70+.
Return a condensed SEO audit summary: counts by severity, top rules, indexability.
Crawl a website and save results to DuckDB. Returns the path of the saved .duckdb file. Use list_issues, query_urls and audit_summary against that path to inspect results.
Find URLs that have no internal incoming links (orphan pages).
Find redirect chains with at least min_hops hops.
List recent crawls saved by crawlforge in the default crawl dir.
List issues from a crawl, optionally filtered by severity/rule_id/category.
List all 269 SEO rules implemented in crawlforge with their metadata.
Output schemas not documented. All tools return JSON strings without declared field structures (columns, rows, count, etc.). LLMs must parse unstructured text, increasing hallucination risk and token waste.
crawl_run is a destructive WRITE operation (creates database, persists HTML) but lacks confirmation/dry-run pattern and has no destructiveHint annotation. Agents may trigger expensive crawls without safeguards.
Error handling is minimal. query_urls has a basic keyword check but returns 'ERROR: only read-only queries allowed' without guidance on what queries ARE allowed. No recovery hints for missing databases, permission errors, or malformed SQL.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
Run a read-only SQL query against a crawl database. Schema reference: tables `urls`, `links`, `redirects`, `hreflang`, `structured_data`, `resources`, `issues`, `crawl_meta`. See docs/SCHEMA.md for column details.
Parameter descriptions are repetitive and lack constraints. 'Path to the DuckDB crawl database' appears 6 times. No guidance on format, validation rules, or what happens if the path is invalid. Numeric parameters (max_urls, max_depth, concurrency, limit) lack min/max bounds.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe read-only tools from destructive ones without explicit hints. crawl_run should be marked destructive; all query/list tools should be marked readOnly.