Skip to main content
Glama
ariangibson

firecrawl-lite-mcp-server

by ariangibson

Firecrawl Lite MCP Server

Web scraping for AI agents, minus the infrastructure. One process. Your machine. No scraping cloud in the loop.

npm version Docker Pulls Image Size Build Tests Node MCP License: MIT


Your agent needs to read web pages. Firecrawl is great at that, but self-hosting it means Redis, a Playwright service, API workers, and a weekend. Firecrawl Lite is the other option: a single Node.js process with headless Chrome (stealth-patched) that turns URLs into clean Markdown, and speaks the two protocols agents actually use:

  • MCP — for Claude Desktop, Claude Code, Cursor, and anything else that talks Model Context Protocol.

  • Firecrawl-compatible REST API — for any agent or harness that already speaks the Firecrawl SDK. Point FIRECRAWL_API_URL at it and it quietly impersonates a self-hosted Firecrawl (scrape only — no crawl or search).

Nothing leaves your box except the page requests themselves. No Firecrawl account. No API keys required at all unless you want the optional LLM-powered extraction tools — and for those, you bring your own model.

60-second start

As an MCP server (Claude Code shown; Claude Desktop and Cursor configs are below):

claude mcp add firecrawl-lite npx -- -y firecrawl-lite-mcp-server

As a Firecrawl-compatible API (for agents, scripts, anything HTTP):

docker run -d -p 3000:3000 ariangibson/firecrawl-lite-mcp-server:latest
curl -X POST localhost:3000/v2/scrape -H 'Content-Type: application/json' -d '{"url":"https://example.com"}'

That's a working scraper. Everything below is optional.

Related MCP server: Hyperbrowser MCP Server

What you get

Tool

Does

Needs an LLM?

scrape_page

URL → clean Markdown. Renders JS, waits for the DOM to settle, strips the junk.

No

batch_scrape

Same, for up to 10 URLs, with polite delays between them.

No

screenshot

URL → PNG (base64). Viewport or full page.

No

extract_data

"Get me the price and the release date" → JSON, via your LLM.

Yes

extract_with_schema

Same, but you hand it a JSON Schema and get exactly that shape back.

Yes

The Firecrawl-compatible API exposes scrape_page as POST /v2/scrape. See the API section for the exact contract.

Hook it up

MCP clients

The env block is only needed for the extract_* tools; leave it out otherwise.

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json · Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "firecrawl-lite": {
      "command": "npx",
      "args": ["-y", "firecrawl-lite-mcp-server"],
      "env": {
        "LLM_API_KEY": "sk-...",
        "LLM_PROVIDER_BASE_URL": "https://api.openai.com/v1",
        "LLM_MODEL": "gpt-5.5"
      }
    }
  }
}
claude mcp add firecrawl-lite \
  --env LLM_API_KEY=your_key \
  --env LLM_PROVIDER_BASE_URL=https://api.openai.com/v1 \
  --env LLM_MODEL=gpt-5.5 \
  -- npx -y firecrawl-lite-mcp-server

Drop the --env lines if you don't need the LLM tools. For a remote instance: claude mcp add -t http firecrawl-lite http://your-server:3000/mcp.

The env block is only needed for the extract_* tools; leave it out otherwise.

{
  "mcpServers": {
    "firecrawl-lite": {
      "command": "npx",
      "args": ["-y", "firecrawl-lite-mcp-server"],
      "env": {
        "LLM_API_KEY": "sk-...",
        "LLM_PROVIDER_BASE_URL": "https://api.openai.com/v1",
        "LLM_MODEL": "gpt-5.5"
      }
    }
  }
}

Agents that speak Firecrawl

Any framework with a "self-hosted Firecrawl" option works unchanged — set its Firecrawl URL to your Firecrawl Lite instance. The server implements the scrape endpoint the SDKs call; search returns a clear 501 because this is a renderer, not a search engine, so pair it with whatever search provider your agent supports.

Hermes uses Firecrawl for web_extract and lets you split search and extract across providers.

# ~/.hermes/.env
FIRECRAWL_API_URL=http://your-server:3000
# FIRECRAWL_API_KEY=...   only if you set one on the server
# ~/.hermes/config.yaml
web:
  search_backend: ddgs        # DuckDuckGo, no key. Or searxng, brave-free, ...
  extract_backend: firecrawl  # → Firecrawl Lite

Hermes's native web_extract now renders through your local browser. It also supports MCP servers if you want screenshot and extract_with_schema too.

from firecrawl import Firecrawl

fc = Firecrawl(api_key="unused", api_url="http://your-server:3000")
doc = fc.scrape("https://example.com", formats=["markdown"])
print(doc.markdown)

The JS SDK works the same way with apiUrl.

Configuration

Everything is an environment variable, and everything has a default. Full annotated list in .env.example.

Endpoints

Running via npx with nothing set = MCP over stdio. Enable any of these and it becomes an HTTP server on PORT (default 3000) instead. The Docker image turns on /mcp and the Firecrawl API out of the box.

Variable

ENABLE_FIRECRAWL_API

POST /v2/scrape — the Firecrawl-compatible API

FIRECRAWL_API_KEY

Optional. If set, that API requires Authorization: Bearer <key>

ENABLE_HTTP_STREAMABLE_ENDPOINT

/mcp — remote MCP for Claude Code and friends

ENABLE_SSE_ENDPOINT

/sse — legacy MCP transport (Claude Desktop via mcp-proxy). Deprecated.

/health is always there when HTTP is on. Without Docker: ENABLE_FIRECRAWL_API=true npx -y firecrawl-lite-mcp-server.

LLM (only for extract_*)

Variable

LLM_PROVIDER_BASE_URL

Any OpenAI-compatible base URL; the server calls {base}/chat/completions

LLM_MODEL

Model name

LLM_API_KEY

Your key

LLM_TEMPERATURE · LLM_MAX_TOKENS · LLM_TOP_P · LLM_REASONING_EFFORT

Optional tuning, passed straight through. Defaults 0.1 / 2000 / unset / unset.

# OpenAI
LLM_PROVIDER_BASE_URL=https://api.openai.com/v1        LLM_MODEL=gpt-5.5
# Anthropic
LLM_PROVIDER_BASE_URL=https://api.anthropic.com/v1     LLM_MODEL=claude-haiku-4-5
# xAI
LLM_PROVIDER_BASE_URL=https://api.x.ai/v1              LLM_MODEL=grok-4
# OpenRouter
LLM_PROVIDER_BASE_URL=https://openrouter.ai/api/v1     LLM_MODEL=openai/gpt-5.5
# Ollama (local)
LLM_PROVIDER_BASE_URL=http://localhost:11434/v1        LLM_MODEL=llama3.3

Scraping behaviour

Variable

Default

SCRAPE_USER_AGENT

a current Chrome UA

One string, or a JSON array to rotate through (keep it on one line)

SCRAPE_VIEWPORT_WIDTH / _HEIGHT

1920 / 1080

SCRAPE_DELAY_MIN / _MAX

1000 / 3000

Random pause before navigating (ms)

SCRAPE_BATCH_DELAY_MIN / _MAX

2000 / 5000

Random pause between batch URLs (ms)

SCRAPE_SETTLE_MAX_MS

3000

How long to wait for a page to stop changing. Raise it for sites that inject content on a slow setTimeout.

SCRAPE_STRIP_LINK_URLS

false

Replace [text](url) with text in the Markdown. Inline URLs are 40–60% of the tokens on link-heavy pages; the Firecrawl API returns them in links instead.

SCRAPE_MAX_CHARS

0 (unlimited)

Hard cap on Markdown/text output, ending in a [truncated — N more characters] marker.

FIRECRAWL_RETRY_MAX_ATTEMPTS

3

Attempts per scrape, each advancing the proxy / UA rotation

Proxy

PROXY_SERVER_URL=http://proxy.example.com:10001-10010   # a port range = automatic rotation
PROXY_SERVER_USERNAME=...
PROXY_SERVER_PASSWORD=...
PROXY_LLM_API=false   # proxies are for target sites; LLM calls go direct unless you say otherwise

Deploying

docker run -d -p 3000:3000 \
  -e LLM_API_KEY=... -e LLM_PROVIDER_BASE_URL=... -e LLM_MODEL=... \
  ariangibson/firecrawl-lite-mcp-server:latest

Or use the bundled docker-compose.yml with a .env file. It uses a wget health check on purpose: the Alpine image has no curl, and a curl check will restart-loop the container (see Troubleshooting).

Images are multi-arch (amd64 / arm64), published to ariangibson/firecrawl-lite-mcp-server on Docker Hub and ghcr.io/ariangibson/firecrawl-lite-mcp-server. Tags: latest moves on every push to main; stable only moves on releases — track stable in production (it pairs well with Watchtower for hands-off updates); version tags (1.5.0, 1.5, 1) pin exactly.

Remote MCP clients: Claude Code → claude mcp add -t http firecrawl-lite http://your-server:3000/mcp. Claude Desktop → Settings → Connectors with an HTTPS URL, or mcp-proxy http://your-server:3000/sse if you don't have a certificate (needs ENABLE_SSE_ENDPOINT=true).

Firecrawl-compatible API

Implements the slice of the Firecrawl v2 API that SDK clients use for extraction.

Endpoint

POST /v2/scrape (alias /v1/scrape)

Request: { "url", "formats": ["markdown","html"], "onlyMainContent": true }. Response: { "success": true, "data": Document } with markdown / html / rawHtml / links per requested format, plus metadata (title, description, language, sourceURL, url, statusCode).

POST /v2/search (alias /v1/search)

501 with a message telling you to use a real search backend.

formats defaults to ["markdown"] and accepts both "markdown" and { "type": "markdown" }; screenshot is accepted but ignored. Two extensions beyond stock Firecrawl: stripLinkUrls (boolean) and maxChars (number) override the SCRAPE_STRIP_LINK_URLS / SCRAPE_MAX_CHARS defaults per request — and when link URLs are stripped, links is always included so nothing is lost. With FIRECRAWL_API_KEY set, both endpoints return 401 before anything else. Crawl, map, batch jobs, and the other async endpoints aren't implemented.

Troubleshooting

Could not find Chrome — the npx postinstall step downloads Chrome the first time; if it's missing: npx puppeteer browsers install chrome. Corrupted? rm -rf ~/.cache/puppeteer and run it again.

Scraping works, extract_* doesn't — it's the LLM call. The server logs the provider's status and response body to stderr. 401 = bad key. 400 = wrong model name or a tuning param the model rejects. 429 = you're being rate limited.

Container restart-loops with SIGTERM right after "listening on port 3000" — a curl health check is failing because the image has no curl. Use wget --spider http://localhost:3000/health (the bundled compose file already does).

Agent says Firecrawl isn't configured / extract failscurl http://your-server:3000/health should show endpoints.firecrawlApi = "enabled". If you set FIRECRAWL_API_KEY on the server, the agent needs the same value. Search failing is expected unless the agent has a separate search provider.

Under the hood

For the curious or the contributing: config.ts parses every env var once into a typed object; browser.ts owns one stealth browser session (launch flags, proxy, UA, navigation, cleanup, retries); scraper.ts puts rotation, retries, and scroll/settle heuristics behind two methods, scrape and screenshot; htmlToMarkdown.ts does the cleaning and conversion; index.ts is just MCP tool definitions, LLM extraction, and transports. The browser and clock are injected, so the whole scrape pipeline is tested through a stub browser — npm test needs no Chrome and no network.

npm install && npm run build && npm test

Releases: bump version, git tag vX.Y.Z, push the tag. CI publishes to npm (with provenance) and Docker Hub / GHCR.

Credits

Inspired by the Firecrawl team and their official MCP server. This is an independent, deliberately small take on the same idea. If you want the managed, enterprise-grade version with crawling, search, and a team behind it, that's firecrawl.com.

License

MIT — see LICENSE.

Available Tools

5 tools
batch_scrapeA

Scrape multiple URLs in a single request

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsYesArray of URLs to scrape
onlyMainContentNoExtract only main content

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It only states the basic action, offering no information about failure handling, rate limits, concurrency, return format, or whether partial failures are tolerated. This is a significant gap for a batch operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that conveys the core functionality without any wasted words. It is appropriately concise for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the simple schema, the lack of annotations and output schema means the description must explain return values and operational nuances. It does not, leaving an agent uncertain about response format, error behavior, or batch limits. The description is incomplete for a batch tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both 'urls' and 'onlyMainContent'. The description adds no additional parameter semantics beyond what the schema provides, matching the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Scrape multiple URLs in a single request' clearly states the verb (scrape), the resource (multiple URLs), and the batching aspect, which distinguishes it from siblings like scrape_page (single page) and extract_data (extracting specific data). The purpose is immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for scenarios involving multiple URLs in one request, which provides clear context. However, it does not explicitly mention when not to use it or name alternatives, so it falls slightly short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extract_dataB

Extract structured data from webpages using LLM

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsYesURLs to extract data from
promptYesInstructions for what data to extract

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are absent, so the description carries the full burden. The phrase 'using LLM' is genuinely useful behavioral context — it signals non-determinism, cost, and latency. However, nothing is disclosed about failure behavior, result format, rate limits, or the read-only nature of extraction beyond what the verb 'extract' implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single tight clause with the verb front-loaded and zero filler words. It is appropriately brief for a tool whose parameters are already well-documented in the schema, though it could afford a bit more substance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with complete schema coverage and no output schema, the description is mostly adequate on inputs. But it does not address the ambiguity with 'extract_with_schema', nor does it clarify what a successful extraction returns. These are notable gaps for a tool of moderate complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both 'urls' and 'prompt' already described in the schema ('URLs to extract data from' and 'Instructions for what data to extract'). The tool description adds nothing beyond this, so it sits at the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('extract'), resource ('structured data from webpages'), and method ('using LLM'), so the core purpose is clear. However, it does not distinguish itself from the sibling 'extract_with_schema', which likely exists precisely for schema-driven extraction. Without differentiation, an agent cannot tell which variant to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No usage guidance is provided at all. The description does not say when to choose this tool over the closely related siblings (scrape_page, batch_scrape, extract_with_schema), nor does it mention any exclusions or prerequisites such as LLM cost or token limits.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extract_with_schemaC

Extract structured data using a JSON schema

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsYesURLs to extract data from
promptNoOptional instructions for extraction
schemaYesJSON schema defining the data structure to extract

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It only says 'Extract structured data' — it doesn't reveal whether it executes live HTTP requests, how it handles multiple URLs, whether output is validated/returned against the schema, or what happens on failure. For a data-extraction tool with zero annotation coverage, this is a significant transparency gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with no wasted words, which is good for conciseness. However, the brevity masks missing critical context; it is underspecified rather than appropriately concise, so it doesn't earn full marks for effective structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 3 parameters, nested schema objects, no output schema, and no annotations, this description is markedly incomplete. It fails to explain the relationship between prompt and schema, the behavior with multiple URLs, expected output format, or error handling. An agent cannot fully know how to construct a correct call or interpret results from this description alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all three parameters with descriptions. The description's 'using a JSON schema' merely echoes the schema parameter's purpose without adding syntax, format, or interaction details — e.g., how 'prompt' modifies the schema-driven extraction. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb (Extract), a resource (structured data), and a mechanism (using a JSON schema), giving the agent a basic sense of what the tool does. However, it doesn't differentiate from the sibling 'extract_data' — with two extraction tools present, the description leaves the agent unsure how extract_with_schema differs from extract_data beyond the name's hint about schema-driven extraction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus siblings like extract_data, scrape_page, or batch_scrape. There is no when/to-use, when-not-to-use, or alternative routing. The name and description imply a schema-based extraction use case, but the agent must infer the selection criteria entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scrape_pageA

Extract content from a single webpage

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesWebpage URL to scrape
onlyMainContentNoExtract only main content

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the basic extraction action and does not explain output format, handling of JavaScript-heavy pages, what 'main content' means, or any limitations. This is a significant gap for a scraping tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the verb and resource. Every word earns its place, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 2-parameter tool with no output schema, the description covers the basics. However, it lacks context about how this tool compares to sibling tools like extract_data and extract_with_schema, and does not hint at what the returned content might include, leaving some ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both url and onlyMainContent already described. The description adds no additional meaning beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('extract'), the resource ('content'), and the scope ('a single webpage'), which distinguishes it from batch_scrape. It is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'single webpage' implies a single-page use case compared to batch_scrape, but there is no explicit guidance on when to use this tool versus alternatives like extract_data or extract_with_schema. No exclusions or alternative recommendations are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screenshotB

Take a screenshot of a webpage using stealth browser

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesWebpage URL to screenshot
widthNoViewport width in pixels
heightNoViewport height in pixels
fullPageNoCapture full page height

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions 'stealth browser' which hints at anti-detection behavior, but it does not disclose other relevant traits such as how the page is loaded (e.g., JavaScript execution), what happens on failures, or any return format. This leaves significant gaps in understanding the tool's runtime behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no wasted words. It is front-loaded with the core action. However, it lacks the substance to fully support other dimensions, but as a concise statement it is efficient and appropriate for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations and output schema, the description is incomplete. It fails to explain what the screenshot output looks like (e.g., image format, whether it returns binary data or a URL), or any additional context about usage, limitations, or integration with other tools. For a tool with four parameters and no output schema, this is a clear gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides 100% coverage for all parameters with clear descriptions (url, width, height, fullPage). The tool description itself does not add any additional parameter semantics beyond what the schema already states, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool takes a screenshot of a webpage using a stealth browser. This specific verb+resource combination ('take a screenshot of a webpage') clearly distinguishes it from sibling tools like scrape_page or extract_data, which focus on data extraction rather than visual capture.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives (e.g., scrape_page for text extraction). It does not mention any prerequisites, limitations, or typical use cases. The context is implied but not explicitly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 2 tool updatesv1.5.0
    • Changedextract_data1 field changed
      • removedInput schema / properties / enableWebSearch
        Removed value: -{
        -  "default": false,
        -  "description": "Enable web search for additional context",
        -  "type": "boolean"
        -}
    • Changedextract_with_schema1 field changed
      • removedInput schema / properties / enableWebSearch
        Removed value: -{
        -  "default": false,
        -  "description": "Enable web search for additional context",
        -  "type": "boolean"
        -}
  2. 5 tool updatesv1.3.0
    • First observedbatch_scrape
    • First observedextract_data
    • First observedextract_with_schema
    • First observedscrape_page
    • First observedscreenshot

TDQS

B3.4/5.0

Scored across 5 tools

Disambiguation4/5

Most tools have clearly distinct purposes: scraping, batch scraping, LLM extraction, schema-based extraction, and screenshots. The only potential confusion is between extract_data and extract_with_schema, but their descriptions make the distinction clear.

Naming Consistency4/5

All names use lowercase with underscores and mostly follow a verb-first pattern (scrape_page, batch_scrape, extract_data, extract_with_schema). 'screenshot' breaks the verb_noun pattern but is still a familiar, predictable command.

Tool Count5/5

Five tools is well-scoped for a 'lite' server: it covers single scraping, batch scraping, two flavors of structured extraction, and screenshots. Each tool earns its place without redundancy or bloat.

Completeness4/5

The core web data collection lifecycle is covered: raw content extraction, batch processing, structured extraction, and visual capture. Missing crawls or search features, but those are likely intentionally excluded from a lite server.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables browser automation, web content extraction, and LLM-powered data transformation using Playwright. Supports session management, authentication flows, and works with local LLMs (Ollama, JAN AI) or external providers to clean and structure extracted web data.
    10 npm
    6
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables LLMs to extract content from websites using automated static and dynamic scraping engines with built-in anti-bot protections. It provides tools for web data retrieval and stores results in MongoDB with support for JSON and CSV exports.
    -