Skip to main content
Glama
Screaming Frog SEO Spider MCP Server

Screaming Frog SEO Spider MCP Server

Screaming Frog SEO Spider MCP Server (headless)

A headless MCP (Model Context Protocol) server for Screaming Frog SEO Spider. It drives the SF command line and saved crawl database directly, so Claude (or any MCP-compatible client) can run crawls, export crawl data, and analyze the results with the Screaming Frog GUI closed: on your laptop, on a server, or inside scheduled audits and CI pipelines.

This is a community project, not affiliated with Screaming Frog. Since SEO Spider v24 there is also an official MCP built into the app. The two work differently and solve different problems.

How this differs from the official Screaming Frog MCP

Screaming Frog shipped an official MCP server in SEO Spider v24. It's substantial: around 29 tools covering crawl control (start, pause, resume, progress), reports and bulk exports with field selection, URL-level inspection, screenshots, embeddings exports, and optionally a Node.js script runner with npm and filesystem read/write tools. It runs in two modes, either a Streamable HTTP server inside the open app, or a STDIO mode where the MCP client launches the Spider itself, headless. Setup is documented for Claude Desktop and LM Studio.

If you want maximum capability in an interactive session (visualizations, crawl comparison, screenshots, scripted post-processing of exports), use the official MCP. It does far more, and it's maintained by the vendor.

This server makes a different trade: it's a small, deliberately limited wrapper around SF's CLI and the saved crawl database, built for runs where nobody is watching.

Locked-down by design. Nine read-and-export tools, nothing else. No script runner, no npm install, no filesystem write access. The official MCP offers all three, and its own docs note that enabling the Node runtime "allows the execution of arbitrary code on your system" and should only be granted to a fully trusted client. There's also an SF_ALLOWED_DOMAINS allowlist to restrict what an agent is able to crawl. When an agent runs unattended on a schedule, a tool surface this small is a feature.

Installs anywhere, plainly. A pip/uv-installable Python package with a one-line stdio config on any MCP client (Claude Code, Cursor, whatever) on macOS, Linux, or Windows. The official STDIO mode ships as a Claude Desktop extension (.mcpb); the HTTP mode means opening the app and starting the server from its settings.

Light process model. Screaming Frog only runs while a tool actually needs it. The official server is the Spider application running for the whole session, whichever mode you pick.

A few tools the official set doesn't have: aggregate_crawl_data for counts and distributions computed server-side (the official path to "how many 404s" is a full export, or a Node script), delete_crawl and storage_summary for cleaning up SF's crawl database (their sf_clear_crawl clears a paused crawl, it doesn't manage stored ones), regex filtering across any column of any export via read_crawl_data, and sf_check pre-flight diagnostics that catch license problems and GUI database locks before you waste a crawl.

What it feels like from chat. The official server is stateful: you ask it to load a crawl by ID, the Spider holds it in memory for the session, and follow-up questions answer in under a second. The cost is that the session owns SF's database the whole conversation, and exports come back as full inline dumps unless the model saves files and writes Node scripts to slice them (the approach their own docs recommend for staying inside the context window). This server is stateless: each export spawns the SF CLI fresh, so the first answer on a crawl takes longer, but you can just ask ("list my crawls, export the latest one") without managing IDs or sessions, reads return only the filtered rows you asked for, and the database is released between calls. For "show me the 404s on a 100k-URL crawl", the difference is the whole export in context versus a page of matching rows.

Typical split: crawl interactively in the GUI with your full config, close it, and let this server handle the unattended side. That covers scheduled audits, CI checks, and agents querying the saved data. Both need a licensed Screaming Frog install on the same machine; neither is a cloud crawler. Note that this server requires the GUI to be closed (SF's database allows one process at a time).

Related MCP server: Screaming Frog MCP Server

See it in action

The Pre-Launch Website Audit skill for Claude Code uses this MCP server for its technical SEO and on-page audits, site-wide crawl data, custom extractions, bulk analysis across all URLs. The skill runs 5 coordinated sub-audits and works without SF (bash fallbacks), but Screaming Frog is the biggest upgrade for crawl-dependent checks.

Prerequisites

  1. Screaming Frog SEO Spider installed on your machine (tested with v23.x and v24.x, should work with v16+). Download from: https://www.screamingfrog.co.uk/seo-spider/

  2. A valid Screaming Frog license. The free version has a 500-URL crawl limit. Most MCP features (headless CLI, saving/loading crawls, exports) require a paid license.

  3. Database storage mode in Screaming Frog ('File > Settings > Storage Mode'; the default on current installs). list_crawls, export_crawl, and the other data tools read SF's internal crawl database. In memory storage mode, crawl_site still works but saves each crawl as a .seospider file (the status output tells you where), and the data tools cannot see it.

  4. Python 3.10+

Important: How the Workflow Works

Screaming Frog uses an internal database that can only be accessed by one process at a time. This means:

You must close the Screaming Frog GUI before the MCP server can access crawl data.

The typical workflow is:

  1. Run your crawl — either through the SF GUI (with all your custom settings, filters, etc.) or via the MCP crawl_site tool.

  2. Close the Screaming Frog GUI — the GUI locks the crawl database. The MCP server's headless CLI cannot read or export data while the GUI is running.

  3. Use the MCP tools — once the GUI is closed, you can list crawls, export data, read CSVs, and more through your AI assistant.

If you forget to close the GUI, the server will detect it and show a clear error message telling you to quit SF first.

Setup

Install as a persistent uv tool so the server starts instantly:

uv tool install screaming-frog-mcp

This puts a screaming-frog-mcp executable on your PATH (typically ~/.local/bin/screaming-frog-mcp). Update later with uv tool upgrade screaming-frog-mcp.

Alternatively, install with pip:

pip install screaming-frog-mcp

Avoid uvx screaming-frog-mcp in MCP client configs. uvx resolves and downloads the package environment at launch. On a cold cache this can exceed the client's 60-second initialize timeout, causing intermittent "Could not attach to MCP server" errors. A persistent install never touches the network at startup.

Option B: Clone and install from source

git clone https://github.com/bzsasson/screaming-frog-mcp.git
cd screaming-frog-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Configure the CLI path

The default Screaming Frog CLI path works for macOS. If you're on Linux or Windows, set the SF_CLI_PATH environment variable:

OS

Default Path

macOS

/Applications/Screaming Frog SEO Spider.app/Contents/MacOS/ScreamingFrogSEOSpiderLauncher

Linux

/usr/bin/screamingfrogseospider

Windows

C:\Program Files (x86)\Screaming Frog SEO Spider\ScreamingFrogSEOSpiderCli.exe

If you cloned the repo, copy .env.example to .env and edit it.

Add to Claude Code

If installed via uv tool install or pip:

{
  "mcpServers": {
    "screaming-frog": {
      "command": "/path/to/screaming-frog-mcp",
      "args": [],
      "env": {
        "SF_CLI_PATH": "/path/to/ScreamingFrogSEOSpiderLauncher"
      }
    }
  }
}

Find the executable path with which screaming-frog-mcp (e.g. ~/.local/bin/screaming-frog-mcp for uv tool installs). Use the full absolute path, since GUI apps don't inherit your shell's PATH.

If cloned from source:

{
  "mcpServers": {
    "screaming-frog": {
      "command": "/path/to/screaming-frog-mcp/.venv/bin/python",
      "args": ["/path/to/screaming-frog-mcp/sf_mcp.py"]
    }
  }
}

Add to Claude Desktop

Add to your Claude Desktop config (claude_desktop_config.json), using the same absolute executable path:

{
  "mcpServers": {
    "screaming-frog": {
      "command": "/path/to/screaming-frog-mcp",
      "args": [],
      "env": {
        "SF_CLI_PATH": "/path/to/ScreamingFrogSEOSpiderLauncher"
      }
    }
  }
}

Restart Claude Desktop after editing the config.

Available Tools

Tool

Description

sf_check

Verify Screaming Frog is installed, check version and license status

crawl_site

Start a headless background crawl (see note below)

crawl_status

Check progress of a running crawl

list_crawls

List all saved crawls with their Database IDs

export_crawl

Export crawl data as CSV files (many export options available)

read_crawl_data

Read exported CSV data with pagination, filtering, and column selection

aggregate_crawl_data

Counts and group-by breakdowns over exported data ("how many 404s", "status code distribution") without reading rows into context

delete_crawl

Permanently delete a crawl from the database

storage_summary

Show disk usage of SF's crawl storage

Usage Examples

Check installation

"Is Screaming Frog installed and licensed?"

The assistant will call sf_check and report version/license info.

For most use cases, crawl in the Screaming Frog GUI where you have full control over configuration, JavaScript rendering, crawl scope, custom extraction, etc. Then close the GUI and use the MCP to analyze the results:

After you've crawled a site in the Screaming Frog GUI and closed it:

"List my saved crawls" "Export the crawl for example.com" "Show me all pages with missing meta descriptions" "What are the 404 pages?"

Crawl a site via MCP (optional)

"Crawl https://example.com"

The crawl_site tool can kick off headless crawls via CLI. This is useful for quick re-crawls or automated workflows, but note the limitations compared to the GUI:

  • Uses default crawl settings (no custom extraction, JavaScript rendering config, etc.)

  • You can pass a .seospiderconfig file to customize settings (including crawl URL limits), but the GUI is easier for complex setups

  • The crawl must finish and save before you can export data

Export options

The server supports all of Screaming Frog's export tabs, bulk exports, and reports. Ask the assistant to read the screaming-frog://export-reference resource for the full list, or specify them directly:

export_tabs: "Internal:All,Response Codes:All,Page Titles:All"
bulk_export: "All Inlinks,All Outlinks"
save_report: "Crawl Overview"

Configuration

Environment variables

Variable

Description

Default

SF_CLI_PATH

Path to the Screaming Frog CLI executable

macOS default path

SF_ALLOWED_DOMAINS

Comma-separated list of allowed crawl target domains. When set, crawl_site only accepts URLs matching these domains.

Empty (all domains allowed)

SF_CONFIG_DIR

Directory containing .seospiderconfig files that crawl_site can load.

~/.config/sf-mcp/configs/

SF_EXPORT_TTL_SECONDS

How long exported CSV files are kept before auto-cleanup. Increase for multi-hour audit sessions.

3600 (1 hour)

SF_EXPORT_TIMEOUT_SECONDS

Max time to wait for an export_crawl operation to complete. Increase for very large crawls (100k+ URLs).

300 (5 minutes)

Filtering modes

read_crawl_data supports three filter modes via the filter_mode parameter:

Mode

Behavior

Example

contains (default)

Case-insensitive substring match

filter_value="4" matches 400, 204, 1450

exact

Case-insensitive exact match

filter_value="404" matches only 404

regex

Python regex (case-insensitive)

filter_value="^[45]" matches 4xx and 5xx

Temp file cleanup

Exported CSVs are stored in ~/.cache/sf-mcp/exports/ and are automatically cleaned up after 1 hour (configurable via SF_EXPORT_TTL_SECONDS).

Troubleshooting

Server won't connect at all? ("Could not attach to MCP server", "failed to connect") See TROUBLESHOOTING.md for a step-by-step diagnostic guide: testing the server manually, verifying the MCP handshake, and finding your client's logs.

Problem

Solution

"GUI is already running" error

Quit the Screaming Frog application, then retry

Empty CSV exports (headers only, 0 data rows)

The GUI likely has the database locked — close it and re-export

CLI not found

Check that SF_CLI_PATH in .env points to the correct executable

Crawl not appearing in list_crawls

Make sure you saved the crawl in the GUI (File > Save) before closing. If you crawled via crawl_site, check SF is in database storage mode: in memory mode the crawl is saved as a file, and crawl_status reports its path

"crawl.seospider exists in output directory" FATAL

Fixed in v0.4.2: each crawl now gets its own output folder. Update with uv tool upgrade screaming-frog-mcp or pip install -U screaming-frog-mcp. The error itself means SF is in memory storage mode; switch to database storage mode ('File > Settings > Storage Mode') for the full workflow

Export times out

Large crawls may need more time — set SF_EXPORT_TIMEOUT_SECONDS to a higher value (e.g. 600), or export fewer tabs

list_crawls fails on Windows

Fixed in v0.2.2 — update with uv tool upgrade screaming-frog-mcp or pip install -U screaming-frog-mcp

"Could not attach to MCP server" / initialize timeout

Your config launches the server via uvx, which downloads dependencies at startup and can exceed the 60s handshake timeout on a cold cache. Switch to a persistent install (uv tool install screaming-frog-mcp) and point command at the installed executable, per Setup

License

MIT

Available Tools

9 tools
aggregate_crawl_dataA
Read-only

Aggregate CSV data from an export: row counts and group-by breakdowns. Use instead of read_crawl_data when the question needs counts or a distribution ("how many 404s", "status code breakdown") rather than the rows themselves.

Args: export_id: The export_id from export_crawl file: CSV filename to aggregate (from the file list in export_crawl output) group_by: Optional column name; counts rows per distinct value of it top: Max distinct values to show, most common first (default 20, max 100) filter_column: Optional column name to filter by before aggregating filter_value: Optional value to match in the filter column filter_mode: How to match filter_value: "contains" (default), "exact", or "regex"

Returns: Total matching row count, plus per-value counts with percentages when group_by is set.

Inputs: file (required), export_id (required), top, group_by, +3 more. Returns: result

crawl_siteA

Start a background Screaming Frog crawl that saves to SF's internal database.

Args: url: The URL to crawl (e.g. https://example.com) config_file: Optional path to a .seospiderconfig file for crawl settings. To limit the number of URLs crawled, set the limit in a config file (Configuration > Spider > Limits in the SF GUI) and pass it here. label: Optional label for identifying this crawl (e.g. 'freshgovjobs')

Returns: A crawl_id to use with crawl_status to check progress. The crawl runs in the background - use crawl_status to poll.

Inputs: url (required), label, config_file. Returns: result

crawl_statusA
Read-only

Check the status of a running or completed crawl.

Args: crawl_id: The crawl_id returned by crawl_site

Inputs: crawl_id (required). Returns: result

delete_crawlA
DestructiveIdempotent

Delete a crawl from Screaming Frog's internal database to free disk space.

Args: db_id: The Database ID from list_crawls

WARNING: This permanently deletes the crawl data. It cannot be undone.

Inputs: db_id (required). Returns: result

export_crawlA

Load a saved crawl from SF's database and export data as CSV files.

Args: db_id: The Database ID from list_crawls (e.g. '1234' or a crawl identifier) export_tabs: Comma-separated export tabs (default: Internal:All,Response Codes:All,Page Titles:All,Meta Description:All,H1:All,H2:All,Images:All,Canonicals:All,Directives:All). See the export-reference resource for all options. bulk_export: Optional bulk export types (e.g. 'Links:All Inlinks,Content:Soft 404 Inlinks') save_report: Optional reports to save (e.g. 'Crawl Overview')

Returns: An export_id and list of generated CSV files. Use read_crawl_data to read them.

Inputs: db_id (required), bulk_export, export_tabs, save_report. Returns: result

list_crawlsA
Read-only

List all crawls saved in Screaming Frog's internal database. Returns crawl names, Database IDs, and sizes. Use the Database ID with export_crawl or delete_crawl.

Inputs: no named parameters. Returns: result

read_crawl_dataA
Read-only

Read CSV data from an export. Use after export_crawl.

Args: export_id: The export_id from export_crawl file: CSV filename to read (from the file list in export_crawl output) limit: Max rows to return (default 100, max 1000) offset: Number of rows to skip (for pagination) filter_column: Optional column name to filter by filter_value: Optional value to match in the filter column filter_mode: How to match filter_value: "contains" (default, case-insensitive substring), "exact" (case-insensitive exact match), or "regex" (Python regex) columns: Optional comma-separated column names to return. Wide exports (Internal:All has dozens of columns) flood the context; request just the ones you need, e.g. "Address,Status Code".

Returns: CSV data as formatted text with column headers.

Inputs: file (required), export_id (required), limit, offset, +4 more. Returns: result

sf_checkA
Read-only

Verify that Screaming Frog SEO Spider is installed and the CLI is accessible. Returns version info and license status.

Inputs: no named parameters. Returns: result

storage_summaryA
Read-only

Show disk usage of Screaming Frog's internal crawl storage. Returns total size and per-crawl breakdown of ProjectInstanceData.

Inputs: no named parameters. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.3/5.0

    Scored across 9 tools

    Disambiguation5/5

    Each tool maps to a distinct step in the crawl lifecycle: install check, start, status, list, storage, export, read, aggregate, and delete. Even the most similar pair, read_crawl_data and aggregate_crawl_data, is clearly separated by row-level versus count/group-by output.

    Naming Consistency4/5

    Most tools follow a clear verb_noun snake_case pattern (crawl_site, export_crawl, delete_crawl), but sf_check is a noun_verb exception and storage_summary is noun-only. The naming is still predictable and readable overall.

    Tool Count5/5

    Nine tools cover crawl initiation, monitoring, storage management, export, data access, and cleanup without redundancy. The count is appropriate for the server's focused SEO crawling purpose.

    Completeness4/5

    The full crawl workflow is covered: start, check status, list crawls, export results, read/aggregate data, and delete to free space. The main gap is no way to stop or cancel an in-progress background crawl, which could leave agents with no abort path for long-running crawls.

    Maintenance

    ActivityMaintained
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      B
      maintenance
      Enables AI assistants to crawl websites, extract dynamic content, navigate links, and save structured Markdown files via the MCP protocol, with support for anti-bot bypass, CSS selectors, and custom JavaScript execution.
      1
      75 PyPI
      45
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI agents to analyze Screaming Frog SEO Spider crawl files directly, offering SEO audits, issue summaries, custom SQL queries, and comparisons without manual exports.
      MIT