A competitor pricing watch
Every Monday at 8:00, fetch the pricing pages of my three competitors, compare each one with what you saved last week, and write only the changes to pricing-watch.md with the date and the old and new numbers side by side.
Verified MCP server: Firecrawl
The short answer
Last verified 2026-08-03
Firecrawl is the MCP server that gives an AI assistant the open web: fetch one page as clean markdown, enumerate every URL on a site, crawl a whole documentation section, search the web, extract structured fields, watch a page for changes, and read research papers. We ran it on a Mac with a real Firecrawl API key already stored on the machine, spoke the protocol to it, and it answered tools/list with 26 tools. Then we scraped example.com for real and kept the raw reply, along with the exact errors it returns when the key is missing, wrong, or the URL is malformed. One thing to know before you start: the pages are fetched by Firecrawl's cloud, not by your Mac, so every scrape spends credits on your Firecrawl account. Without a key the server still starts and still lists all 26 tools, but only scrape and search actually work. [1][3][7]
Verification
Method
We spawned the server with npx over stdio, completed the MCP initialize handshake, sent notifications/initialized, and called tools/list, which answered with 26 tools. The credential was a real Firecrawl API key already stored on this Mac and read from the environment, so this is a full run and not a placeholder one. Then we made one harmless read-only call, firecrawl_scrape on example.com asking for markdown. It came back with the page and a metadata block, and the excerpt below is the opening of that answer, word for word. The tool table is that same capture, rendered straight out of the raw JSON.
Startup banner
npm warn deprecated koa-router@14.0.0: Please use @koa/router instead, starting from v9!
One real tool call
tools/call firecrawl_scrape {"url": "https://example.com", "formats": ["markdown"]}{
"markdown": "# Example Domain\n\nThis domain is for use in documentation examples without needing permission. Avoid use in operations.\n\n[Learn more](https://iana.org/domains/example)",
"metadata": {Real lines from the captured result: enough to prove the call answered.
Tools
The server answered tools/list with 26 tools on 2026-08-03. The names, descriptions and parameters below are its own words, copied from that response and never edited.
| Tool | What it does |
|---|---|
| firecrawl_scrapeurl*formatsjsonOptionsqueryOptionsscreenshotOptionsparserspdfOptionsonlyMainContentredactPIIincludeTagsexcludeTagswaitForactionsmobileskipTlsVerificationremoveBase64ImageslocationstoreInCachezeroDataRetentionmaxAgelockdownproxyprofile | Retrieve and extract content from one supplied URL through Firecrawl. Use this when the request identifies a page and needs its content or defined fields. It can return markdown, HTML, links, screenshots, branding data, a targeted answer, or JSON matching a supplied schema; JSON is useful when the requested result has defined fields, while markdown preserves readable page content. This tool operates on a known page. For a set of pages use `firecrawl_crawl`, and to discover page URLs use `firecrawl_map` or `firecrawl_search`. Options include JavaScript render delay, cache age, main-content filtering, PII redaction, and lockdown cache-only retrieval. Browser actions may change the live page when interactive actions are enabled. Returns the selected content formats and page metadata. |
| firecrawl_mapurl*searchsitemapincludeSubdomainslimitignoreQueryParameters | Enumerate URLs indexed under one website through Firecrawl without fetching each page's content. Use this when the request asks for a site's URL inventory, when several relevant pages must be located, or when the desired page URL is unknown. An optional `search` term narrows the URL list, while sitemap, subdomain, query-parameter, and result-limit options control coverage. Returns matching URLs rather than page bodies. Retrieve one page with `firecrawl_scrape`; collect content across multiple pages with `firecrawl_crawl`. |
| firecrawl_searchquery*highlightslimittbsfilterlocationincludeDomainsexcludeDomainssourcescategoriesenterprisescrapeOptions | Search web, news, or image sources and return ranked results. Operators include quoted phrases, `-term`, `site:host`, `inurl:term`, `intitle:term`, and `related:host`; the set is non-exhaustive. `includeDomains` and `excludeDomains` are mutually exclusive hostname filters; categories limit results to GitHub, research, or PDF sources. `scrapeOptions` can attach extracted page content. Returns source-type result groups, an `id` for optional search feedback, and usage metadata. |
| firecrawl_search_feedbacksearchId*rating*valuableSourcesmissingContentquerySuggestions | Records schema-validated quality feedback for a prior `firecrawl_search` UUID `searchId`. A `good` rating requires a valuable source, `partial` a valuable source or missing topic, and `bad` a missing topic or query suggestion; caps are 50 `valuableSources` and 20 `missingContent` entries. Eligibility is limited to successful searches within the feedback age window. The record is idempotent per search ID. Returns submission and daily-cap status with accounting fields. |
| firecrawl_feedbackendpoint*jobId*rating*issuestagsnotevaluableSourcesmissingContentquerySuggestionsurlpageNumbersmetadata | Submit concise quality feedback for a completed search, scrape, parse, or map job. Provide the endpoint, job ID, rating, and relevant issue codes or small contextual fields; omit large page contents and raw outputs. Returns submission status, feedback ID, and accounting fields. |
| firecrawl_crawlurl*promptexcludePathsincludePathsmaxDiscoveryDepthsitemaplimitallowExternalLinksallowSubdomainscrawlEntireDomaindelaymaxConcurrencywebhookwebhookHeadersdeduplicateSimilarURLsignoreQueryParametersscrapeOptions | Start a multi-page crawl at a website URL, poll it to a terminal state, and return the final status and collected data. Scope can be bounded with include/exclude paths, depth, page limit, subdomain/external-link controls, sitemap handling, delay, and scrape options. Crawl results can be large; use conservative limits when full-site coverage is unnecessary. Webhooks and interactive scrape actions are unavailable in safe mode. Returns the crawl ID, status, and page data. |
| firecrawl_check_crawl_statusid* | Retrieve the current status, progress, and available results for an existing crawl ID. This only reads Firecrawl job state and does not start or modify the crawl. |
| firecrawl_extracturls*promptschemaallowExternalLinksenableWebSearchincludeSubdomains | Extract structured information from one or more URLs with an optional natural-language prompt and JSON schema. It can include subdomains, follow external links, or use web search when those options are enabled. Use this for a defined structured result rather than full page content. Returns data shaped by the supplied schema or prompt. |
| firecrawl_agentprompt*urlsschema | Start an asynchronous web research job from a prompt, optional seed URLs, and an optional JSON schema. Use this for a requested synthesis across multiple sources when the task can wait for asynchronous completion. The agent can search, navigate, read pages, and assemble a structured result. This call returns only a job ID, not the research result. Read the job with `firecrawl_agent_status` until it reaches `completed` or `failed`; research commonly takes several minutes. If the job cannot finish within the task's available time, `firecrawl_search` and `firecrawl_scrape` can gather evidence synchronously. |
| firecrawl_agent_statusid* | Retrieve progress or final results for a `firecrawl_agent` job ID. A `processing` response is non-terminal and does not contain the final research result. Check again after 15–30 seconds until the status is `completed` or `failed`; complex jobs can take several minutes. If the job cannot finish within the task's available time, use `firecrawl_search` and `firecrawl_scrape` to complete the requested output. Returns job status, progress information, and result data when completed. |
| firecrawl_interactscrapeIdurlpromptcodelanguagetimeoutscrapeOptions | Open or reuse a live browser session to navigate a page, click controls, fill fields, or run browser code. Provide either `url` or `scrapeId`, and either a natural-language `prompt` or executable `code`; code can run as Bash, Python, or Node with a bounded timeout. This acts on the live site, so actions such as form submission can create persistent external side effects. Returns execution output, stdout/stderr, exit status, and session viewing URLs. |
| firecrawl_interact_stopscrapeId* | Stop the live interact session associated with a `scrapeId` and release its resources. Returns a success confirmation. |
| firecrawl_parseformatsjsonOptionsqueryOptionsparserspdfOptionsonlyMainContentredactPIIincludeTagsexcludeTagsremoveBase64ImagesskipTlsVerificationstoreInCachezeroDataRetentionmaxAgeproxyfilePath*contentType | Parse one supported document into markdown, HTML, links, summary, targeted answers, or JSON matching a schema. Supported inputs include common HTML, PDF, Word, RTF, OpenDocument, and spreadsheet files; PDF parsing can be bounded with `pdfOptions.maxPages`. Local MCP reads `filePath` from the server filesystem. Hosted MCP uses two calls: first provide `filePath` to receive upload instructions, upload locally, then call again with the returned `uploadRef`; do not send both fields together. Remote web URLs belong in `firecrawl_scrape`. Set `redactPII` to request redaction of personally identifiable information in the returned content. `zeroDataRetention` requires an eligible authenticated account; omit it for anonymous keyless use. Returns upload instructions for hosted phase one or parsed document content for the final call. |
| firecrawl_monitor_createbodypagepagesqueriessearchWindowmaxResultsincludeDomainsexcludeDomainsgoalnamescheduleTexttimezoneemailincludeDiffswebhookUrl | Create a recurring scrape, crawl, or search monitor that compares each check with its retained predecessor. The simple form accepts `page`/`pages` or `queries` plus a plain-language `goal`; the advanced `body` form controls targets, schedule, change-tracking formats, judging, retention, webhook, and notifications. In the simple form, a `goal` is required. If `queries` contains one or more non-empty values and is supplied with `page`/`pages`, `queries` create the search target and page targets are ignored. A monitor schedules future network checks and can send configured email or webhook notifications. Returns the created monitor. |
| firecrawl_monitor_listlimitoffset | List monitors for the authenticated account with optional pagination controls. Returns one page of monitor records and pagination metadata. |
| firecrawl_monitor_getid* | Retrieve one monitor by ID, including its configuration and current state. This does not run or modify the monitor. |
| firecrawl_monitor_updateid*body* | Patch an existing monitor by ID. The body can change its name, active/paused status, schedule, targets, goal, judging, webhook, notifications, or retention; these changes affect future scheduled checks. Returns the updated monitor. |
| firecrawl_monitor_deleteid* | Permanently delete a monitor by ID and stop its future schedule. This operation cannot be undone and returns deletion status. |
| firecrawl_monitor_runid* | Queue an immediate check for a monitor outside its normal schedule. This starts network work for the monitor's configured targets and returns the queued check. |
| firecrawl_monitor_checksid*limitoffsetstatus | List historical checks for a monitor, optionally filtered by status and bounded by a result limit. Returns one page of check summaries and pagination metadata. |
| firecrawl_monitor_checkid*checkId*limitskippageStatus | Retrieve one monitor check and its page-level results, optionally filtered by page status. Pages report `same`, `new`, `changed`, `removed`, or `error`; configured goal judging can add a meaningful-change decision. Markdown tracking returns a unified text diff, JSON tracking returns field paths with previous/current values and a current snapshot, and mixed tracking returns both. Returns one page of results plus a `next` URL when more pages exist. |
| firecrawl_research_search_papersquery*kauthorscategoriesfromto | For topics represented in the indexed corpus, search paper metadata and abstracts with a natural-language query. Optional author, category, and date filters constrain results. Returns ranked papers with canonical IDs, titles, authors, and abstracts. |
| firecrawl_research_inspect_paperpaperId* | Retrieve canonical metadata for one paper ID, such as an arXiv, PMC, PMID, or DOI identifier. Returns the title, abstract, authors, categories, source IDs, and dates as markdown. |
| firecrawl_research_related_papersseed_ids*intent*modekrerank | Find citation-graph candidates from one to ten `seed_ids`; the first ID is the primary seed and later IDs are anchors. `mode` defaults to `similar` (co-citation/bibliographic coupling); `citers` returns papers citing a seed and `references` papers cited by a seed. `intent` ranks candidates. Returns ranked candidates and the evaluated pool size. |
| firecrawl_research_read_paperpaperId*question*k | Retrieve in-body passages from one paper that are relevant to a specific question. Full text is available only for indexed papers; `k` controls the number of passages. Returns matching passages or a notice when full text is unavailable. |
| firecrawl_research_search_githubquery*k | Search indexed public GitHub issue, pull-request, and README content. Returns ranked matches with repository, URL, snippet, and full matched markdown when available. |
Parameters marked with * are required.
Setup
Copy the block for the app you use. Each one is the configuration this server was verified with.
Open the file ~/Library/Application Support/Claude/claude_desktop_config.json (in Claude Desktop: Settings, then Developer, then Edit Config) and add:
{
"mcpServers": {
"firecrawl": {
"url": "https://mcp.firecrawl.dev/v2/mcp-oauth"
}
}
}That is the hosted server, and it asks you to sign in to Firecrawl in your browser the first time, so there is no key to paste. If your Claude Desktop is older and cannot open a remote MCP server, use the local package instead: "command": "npx", "args": ["-y", "firecrawl-mcp"], and an "env" block holding FIRECRAWL_API_KEY. That local shape is the one we verified. Quit and reopen Claude Desktop after saving. [8][5]
One command in your terminal. The first line is the hosted server with a browser sign-in, the second is the local package with your own key:
claude mcp add --transport http firecrawl https://mcp.firecrawl.dev/v2/mcp-oauth claude mcp add firecrawl -e FIRECRAWL_API_KEY=fc-your-api-key -- npx -y firecrawl-mcp@3.23.0
Everything after the double dash in the second line is the exact command Claude Code will run. The docs pin the version on purpose: this package ships often, and a pinned line keeps a working setup working. [8]
Add to ~/.cursor/mcp.json for every project, or to .cursor/mcp.json inside one project:
{
"mcpServers": {
"firecrawl": {
"command": "npx",
"args": [
"-y",
"firecrawl-mcp"
],
"env": {
"FIRECRAWL_API_KEY": "fc-your-api-key"
}
}
}
}Cursor picks the file up on restart. Treat that file the way you treat any file with a key in it: it is plain text on disk, so keep it out of a repository you push. Cursor can also open the hosted server at https://mcp.firecrawl.dev/v2/mcp with a "url" field instead of a command. [8]
No JSON file and no terminal. In Routines: Settings, then Assistant, then Connections, then Add MCP Server. Switch the form to Command (stdio) and enter:
Name Firecrawl Command npx Arguments -y firecrawl-mcp Environment Variables FIRECRAWL_API_KEY fc-your-api-key
The Arguments field splits on spaces, so keep it to exactly those three words. The key goes in Environment Variables, never in Arguments. Click Test Connection first: a working server answers with its tool count, twenty-six for this one. If you would rather use the hosted server, leave the form in URL (SSE/HTTP) mode and enter https://mcp.firecrawl.dev/v2/mcp instead. [11][8]
No terminal needed
If you have never opened Terminal and never want to, this is your path. Routines is a Mac app that runs MCP servers for you: fill in a few fields once, and this server's tools are available to your AI in chat and in scheduled routines. The only detour is the Firecrawl key, and it is a two-minute stop on Firecrawl's own site.
01
Download the app from getroutines.ai/download, drag it to Applications, and sign in.
02
Go to firecrawl.dev, create an account, and open the API Keys page in the dashboard. Copy the key that starts with fc-. The free plan comes with a monthly credit allowance, and one page scrape costs one credit, which is what our verification call spent.
03
Back in Routines, click your account at the bottom of the sidebar and choose Settings. Open the Assistant section, then the Connections tab, scroll to MCP Servers, and click Add MCP Server.
04
The form opens in URL (SSE/HTTP) mode. Switch it to Command (stdio): the local package is a command, not a web address. Name: Firecrawl. Command: npx. Arguments: -y firecrawl-mcp, exactly those three words.
05
In Environment Variables add FIRECRAWL_API_KEY with your fc- key. Click Test Connection: Routines starts the server without saving it and reports how many tools it found, twenty-six for this one. Then click Add Server.
06
The tools work in chat right away, so you can paste a URL and ask for the page in plain words. To let a scheduled routine use them, open the routine, find the Tools & connections card, and tick the server under Apps.
Routine ideas
Once the server is connected, a scheduled routine can use its tools while you are away. Copy a prompt, paste it into Routines, and pick a time.
Every Monday at 8:00, fetch the pricing pages of my three competitors, compare each one with what you saved last week, and write only the changes to pricing-watch.md with the date and the old and new numbers side by side.
Every weekday at 9:00, read the changelog and release-notes pages of the tools my team depends on, list anything published in the last 24 hours in three lines or fewer each, and save it as changelog-digest.md in my Notes folder.
Every Friday at 15:00, search the web for new articles about my product category from the past seven days, keep the ones that are actually about it, and write a short annotated list to market-sweep.md with a link and one line on why each matters.
Troubleshooting
Real errors captured during the verification run, printed exactly as the server returned them.
What you see
No FIRECRAWL_API_KEY or FIRECRAWL_API_URL set — running in keyless mode. firecrawl_scrape and firecrawl_search are free (rate-limited per IP) against the Firecrawl cloud; other tools require an API key (get one free at https://firecrawl.dev).
The fix
This is the trap worth knowing about. With no key the server does not refuse to start: it prints this one line to stderr, boots, and still lists all 26 tools, so an assistant can believe it has the full set. Only firecrawl_scrape and firecrawl_search really work in that state, rate-limited by your IP address. Most MCP clients hide stderr, so if tools are failing for no visible reason, check that the key actually reached the server.
What you see
Tool 'firecrawl_map' execution failed: Unauthorized: API key is required when not using a self-hosted instance
The fix
Same cause as above, seen from the other side: this is what a keyless server returns the moment you call crawl, map, extract, agent, monitor or research. We triggered it on purpose by starting the server with no key. Put FIRECRAWL_API_KEY in the env block in Claude Desktop or Cursor, in Environment Variables in Routines, or point FIRECRAWL_API_URL at your own self-hosted Firecrawl instead.
What you see
Tool 'firecrawl_map' execution failed: Unauthorized: Invalid token
The fix
The key reached the server and Firecrawl rejected it. We produced this with a deliberately fake fc- key. Check that you pasted the whole key with no trailing space, that it is a Firecrawl API key and not some other credential, and that it has not been rotated or revoked in the dashboard.
What you see
MCP error -32602: Tool 'firecrawl_scrape' parameter validation failed: url: Invalid URL. Please check the parameter types and values according to the tool's schema.
The fix
We got this by passing example.com without a scheme. The url parameter is validated as a full URI, so it needs the https:// in front. If the assistant is building the URL from something you typed, tell it to include the scheme. Leaving url out entirely gives the same error code with a different tail: url: Invalid input: expected string, received undefined.
What you see
node:events:486
throw er; // Unhandled 'error' event
^
Error: listen EADDRINUSE: address already in use 127.0.0.1:3000The fix
Only relevant if you set HTTP_STREAMABLE_SERVER=true to run the server as a local web address instead of a command. It listens on port 3000, which a lot of dev servers also want. Stop whatever holds the port, or leave the server in the default stdio mode, which is what every config on this page uses. When it does bind, http://localhost:3000/health answers ok.
The fix
The npx command belongs to Node.js. If Node is not installed on your Mac, every local config on this page fails at the spawn step before the server can say anything. Install Node from nodejs.org, restart your MCP client, and try again. The hosted URL at mcp.firecrawl.dev needs no Node at all, which is the quickest way around this.
FAQ
It is a small program that sits between an AI assistant and the Firecrawl web-data service and speaks the Model Context Protocol. Once connected, an assistant such as Claude can fetch a page as clean markdown, list every URL on a site, crawl a section of a site, search the web, pull structured fields out of pages, watch a page for changes, and read research papers. It is published by Firecrawl itself, and you can run it as a local command on your Mac or point your client at Firecrawl's hosted endpoint. [7][1]
The running server exposes 26 tools. The everyday four are firecrawl_scrape for one page, firecrawl_map for a site's URL inventory, firecrawl_search for the web, and firecrawl_crawl for a whole section, with firecrawl_check_crawl_status for the job it starts. Around those sit structured extraction (firecrawl_extract, firecrawl_agent, firecrawl_agent_status), live browser control (firecrawl_interact, firecrawl_interact_stop), local file parsing (firecrawl_parse), an eight-tool change-monitoring family (firecrawl_monitor_create and friends), five research-paper tools, and two feedback tools. The table above is the live tools/list output, word for word.
Yes for anything beyond the basics. A Firecrawl account and an API key starting with fc- unlock all 26 tools, and you set it as FIRECRAWL_API_KEY. Without it the server still starts and still lists everything, but only firecrawl_scrape and firecrawl_search work, rate-limited by your IP address, and the rest answer Unauthorized. If you host Firecrawl yourself, FIRECRAWL_API_URL pointed at your own instance replaces the key. [5][6]
The honest answer has two halves. The server itself is read-oriented: nothing in the tool list writes to your Mac, and the one local-file tool, firecrawl_parse, reads a file you name. The half people miss is where the fetching happens: pages are retrieved by Firecrawl's cloud, not by your Mac, so the URLs you ask about are sent to Firecrawl and each fetch spends credits on your account. Our verification call reported creditsUsed 1 for a single page. If a routine crawls on a schedule, cap it with the limit parameter and watch the dashboard.
No. In Routines you fill in the fields in Settings and click Test Connection; the walkthrough above shows every click, including the Firecrawl side. Claude Desktop needs one small JSON file edited once, or nothing at all if you use the hosted URL with its browser sign-in. Only Claude Code is terminal-first by nature. [11][8]
No, and it is the easiest mistake to make here. The official package is firecrawl-mcp. The unscoped mcp-server-firecrawl is the original third-party implementation, its last release is version 1.2.4 from February 2025, and npm marks it deprecated with the line Package no longer supported. It still pulled 806 downloads in the week we checked, which means people are typing the wrong name from memory. Install firecrawl-mcp. [9][10][1]
Any MCP client at all, because it comes in both shapes. Clients that launch a local command, including Claude Desktop, Claude Code, Cursor and Routines, run the npx line and the exact config for each is above. Clients that prefer a remote server can point at Firecrawl's hosted endpoint instead, which needs no Node and no install. The tools are the same either way. [8][11]
Sources
Anything on this page we did not observe in the run is linked here, with the date we read it. The run itself is the receipt for the rest.
[1]
Latest version 3.23.0, published 2026-07-29, license MIT, bin firecrawl-mcp.
[2]
81,898 downloads for the week of 2026-07-26 to 2026-08-01.
[3]
7,111 stars, MIT, last push 2026-08-02, 164 open issues, not archived, per the GitHub API.
[4]
Answers 301 Moved Permanently to the same repository id under the firecrawl org, which is the record of the rename from Mendable AI.
[5]
The npx install lines, the client config blocks and the FIRECRAWL_API_KEY and FIRECRAWL_API_URL variables.
[6]
Where the keyless path, the credential checks and the transport selection live.
[7]
The overview, which now leads with the hosted endpoint and treats the local install as the second route.
[8]
The exact Claude Desktop, Claude Code, Cursor and n8n config blocks, including the pinned firecrawl-mcp@3.23.0 examples.
[9]
The unscoped original by vrknetha. Latest version 1.2.4, published 2025-02-11, flagged deprecated: Package no longer supported.
[10]
806 downloads for the week of 2026-07-26 to 2026-08-01, on a package nobody maintains.
[11]
How Routines runs one-click OAuth connectors and any MCP server.
This page describes Firecrawl as it behaved in one dated run on one Mac. Versions move: if something here no longer matches what you see, the capture date at the top says how old the reading is.
Behind this directory
Routines, the app behind this directory, runs MCP servers like this one without a terminal: see how connectors work. The digests it writes stay markdown files on your Mac, and there is no cloud bill. Download Routines