Brave Search MCP Server: web results, images, videos, rich results, AI summaries, and more.
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 oper
A call is made on an account: it counts against an allowance and the publisher sees it, which is why this one asks who you are first.
What it does
Crawl and scrape the web into clean markdown. Built from firecrawl-mcp, Firecrawl's own server, and run on mcprush hosting: there is no endpoint to keep alive and nothing to deploy yourself. It asks for your own Firecrawl API key (Dashboard › Variables), and your calls count against your Firecrawl plan. The image is pinned, so what answers today is what answered yesterday.
Quickstart
# 1 — buy it first ($29 a month): mcprush.com/checkout?server=firecrawl-hosted-mcp
# a key alone is not enough: the gateway refuses every call until it is bought
# 2 — sign in with a key of the account that bought it: npx mcprush@latest login
# the key is at mcprush.com/dashboard#access
# 3 — install
npx mcprush@latest add mcpdevpro/firecrawl-hosted-mcp
# 4 — ask your agent for something these tools do
# firecrawl_scrape, firecrawl_map, firecrawl_search and 24 more
Windows PowerShell says 'running scripts is disabled on this system'? Run Set-ExecutionPolicy -Scope CurrentUser RemoteSigned once, or type npx.cmd instead of npx (codex.cmd, gemini.cmd, grok.cmd likewise). PowerShell 7 needs neither.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine — this server runs on infrastructure we host behind our gateway, and what you install is the connection to it.
Claude Code has its own MCP command, and the key rides on it as a header — the gateway refuses a call that carries none. Claude Code reads MCPRUSH_KEY each time it connects, so the key stays out of its config: export your key from Access in your shell profile (macOS, Linux), or run setx MCPRUSH_KEY <your key> and open a new terminal (Windows). Or let npx mcprush@latest add mcpdevpro/firecrawl-hosted-mcp write the entry with the key for you; --scope user makes it available in every project. The first connection after a quiet spell starts the server, which takes up to a minute: if your client says it failed to connect, reconnect after that (/mcp in Claude Code).
Buy it first — $29 a month. A key alone is not enough: until this account has bought it, the gateway refuses every call. Subscribe, then use a key of the account that bought it.
claude mcp add --transport http --scope user firecrawl-hosted-mcp https://mcprush.com/gw/firecrawl-hosted-mcp/mcp --header 'Authorization: Bearer ${MCPRUSH_KEY}'Reconnect, or start a new session, and the tools appear in the model’s tool list.
It reaches a system of yours, so it needs your own credential rather than the publisher’s: FIRECRAWL_API_KEY — Your Firecrawl API key (starts with fc-), from firecrawl.dev/app/api-keys; a free Firecrawl account has one.. You set it after installing; the value is sealed here and handed to the server when it starts.
One config entry pointing at the gateway. The server itself runs on infrastructure we host, so nothing from this listing executes on your machine.
27 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
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 oper
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | — |
| formats | array | no | — |
| jsonOptions | object | no | — |
| queryOptions | object | no | — |
| screenshotOptions | object | no | — |
| parsers | array | no | — |
| pdfOptions | object | no | — |
| onlyMainContent | boolean | no | — |
| redactPII | boolean | no | — |
| includeTags | array | no | — |
| excludeTags | array | no | — |
| waitFor | number | no | — |
| actions | array | no | — |
| mobile | boolean | no | — |
| skipTlsVerification | boolean | no | — |
| removeBase64Images | boolean | no | — |
| location | object | no | — |
| storeInCache | boolean | no | — |
| zeroDataRetention | boolean | no | — |
| maxAge | number | no | — |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | — |
| search | string | no | — |
| sitemap | string | no | — |
| includeSubdomains | boolean | no | — |
| limit | number | no | — |
| ignoreQueryParameters | boolean | no | — |
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, PDF, or developer sources. For a programming question, add `categories: ["deve
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | — |
| highlights | boolean | no | Return query-relevant highlights for each search result. Set to false to keep the original search snippets. |
| limit | number | no | — |
| tbs | string | no | — |
| filter | string | no | — |
| location | string | no | — |
| includeDomains | array | no | — |
| excludeDomains | array | no | — |
| sources | array | no | — |
| categories | array | no | Limit results to specific source types. github searches GitHub repositories, code, issues, and docs; research restricts ordinary web results to research-affiliated websites and returns page snippe |
| enterprise | array | no | — |
| scrapeOptions | object | no | — |
Records schema-validated quality feedback for a prior firecrawl_search UUID searchId. A good rating requires a valuable source, partial a valuable source or at least one missingContent entry, and bad at least one missingContent entry or a query suggestion; caps are 50 valuableSources and 20 missingContent entries. Eligibility is limited to successful searches within the feedbac
| Parameter | Type | Required | Notes |
|---|---|---|---|
| searchId | string | yes | — |
| rating | string | yes | — |
| valuableSources | array | no | — |
| missingContent | array | no | Array of specific pieces of content the agent expected to find but did not. One entry per distinct topic. Each entry has a short topic and optional longer description. |
| querySuggestions | string | no | — |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| endpoint | string | yes | — |
| jobId | string | yes | — |
| rating | string | yes | — |
| issues | array | no | — |
| tags | array | no | — |
| note | string | no | — |
| valuableSources | array | no | — |
| missingContent | array | no | — |
| querySuggestions | string | no | — |
| url | string | no | — |
| pageNumbers | array | no | — |
| metadata | object | no | — |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | — |
| prompt | string | no | — |
| excludePaths | array | no | — |
| includePaths | array | no | — |
| maxDiscoveryDepth | number | no | — |
| sitemap | string | no | — |
| limit | number | no | — |
| allowExternalLinks | boolean | no | — |
| allowSubdomains | boolean | no | — |
| crawlEntireDomain | boolean | no | — |
| delay | number | no | — |
| maxConcurrency | number | no | — |
| webhook | string | no | — |
| webhookHeaders | object | no | — |
| deduplicateSimilarURLs | boolean | no | — |
| ignoreQueryParameters | boolean | no | — |
| scrapeOptions | object | no | — |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | — |
Deprecated compatibility entry point. Use firecrawl_scrape once per known URL with formats: ["json"] and jsonOptions containing the prompt and schema. Use firecrawl_search or firecrawl_agent before Scrape when URLs are not known.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| urls | array | yes | — |
| prompt | string | no | — |
| schema | object | no | — |
| allowExternalLinks | boolean | no | — |
| enableWebSearch | boolean | no | — |
| includeSubdomains | boolean | no | — |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| prompt | string | yes | — |
| urls | array | no | — |
| schema | object | no | — |
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 request
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | — |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scrapeId | string | no | — |
| url | string | no | — |
| prompt | string | no | — |
| code | string | no | — |
| language | string | no | — |
| timeout | number | no | — |
| scrapeOptions | object | no | — |
Stop the live interact session associated with a scrapeId and release its resources. Returns a success confirmation.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| scrapeId | string | yes | — |
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, up
| Parameter | Type | Required | Notes |
|---|---|---|---|
| formats | array | no | — |
| jsonOptions | object | no | — |
| queryOptions | object | no | — |
| parsers | array | no | — |
| pdfOptions | object | no | — |
| onlyMainContent | boolean | no | — |
| redactPII | boolean | no | — |
| includeTags | array | no | — |
| excludeTags | array | no | — |
| removeBase64Images | boolean | no | — |
| skipTlsVerification | boolean | no | — |
| storeInCache | boolean | no | — |
| zeroDataRetention | boolean | no | — |
| maxAge | number | no | Ignored: parse never reuses or stores indexed content. |
| proxy | string | no | — |
| filePath | string | yes | Absolute or relative path to a local file to parse. Supported: .html, .htm, .pdf, .docx, .doc, .odt, .rtf, .xlsx, .xls |
| contentType | string | no | Optional MIME type override. If omitted, the server infers the file kind from the extension. |
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-em
| Parameter | Type | Required | Notes |
|---|---|---|---|
| body | object | no | — |
| page | string | no | — |
| pages | array | no | — |
| queries | array | no | — |
| searchWindow | string | no | — |
| maxResults | integer | no | — |
| includeDomains | array | no | — |
| excludeDomains | array | no | — |
| goal | string | no | — |
| name | string | no | — |
| scheduleText | string | no | — |
| timezone | string | no | — |
| string | no | — | |
| includeDiffs | boolean | no | — |
| webhookUrl | string | no | — |
List monitors for the authenticated account with optional pagination controls. Returns one page of monitor records and pagination metadata.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | — |
| offset | integer | no | — |
Retrieve one monitor by ID, including its configuration and current state. This does not run or modify the monitor.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | — |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | — |
| body | object | yes | — |
Permanently delete a monitor by ID and stop its future schedule. This operation cannot be undone and returns deletion status.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | — |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | — |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | — |
| limit | integer | no | — |
| offset | integer | no | — |
| status | string | no | — |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | — |
| checkId | string | yes | — |
| limit | integer | no | — |
| skip | integer | no | — |
| pageStatus | string | no | — |
Search paper metadata and abstracts with a natural-language query across the indexed corpus, which spans biomedical, life-science, and clinical literature (PubMed, bioRxiv, medRxiv) alongside arXiv and other scientific sources. Optional author, category, and date filters constrain results. Several distinct framings of the same question surface different papers than a single query does. Returns
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Natural-language research topic or question, including methods, systems, conditions, populations, interventions, or outcomes when relevant. |
| k | integer | no | Number of ranked papers to return (default 40). |
| authors | array | no | Author substring filter(s); ALL must match (case-insensitive). |
| categories | array | no | Paper category filter(s) (e.g. cs.LG); ALL provided values must match. |
| from | string | no | Inclusive lower bound on created/updated date (YYYY-MM-DD). |
| to | string | no | Inclusive upper bound on created/updated date (YYYY-MM-DD). |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| paperId | string | yes | Canonical paperId or primaryId such as arxiv:1706.03762, pmcid:PMC12530322, pmid:40953549, or doi:10.1016/j.neunet.2025.108095. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| seed_ids | array | yes | — |
| intent | string | yes | — |
| mode | string | no | — |
| k | integer | no | — |
| rerank | boolean | no | Apply an additional rerank over the fused candidates. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| paperId | string | yes | Canonical paperId or primaryId such as arxiv:1706.03762, pmcid:PMC12530322, pmid:40953549, or doi:10.1016/j.neunet.2025.108095. |
| question | string | yes | — |
| k | integer | no | Number of passages to return (default 4). |
Search indexed public GitHub issue, pull-request, and README content. Returns ranked matches with repository, URL, snippet, and full matched markdown when available.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | — |
| k | integer | no | — |
For a developer question — code behaviour, a library or framework, an API contract, an error message, or a known bug — search an index built for coding agents. The index covers GitHub issues, merged pull requests, repository READMEs, and curated documentation sites. Set skills to "only" to limit the search to agent-skill files. Returns ranked results with an ID, source type, URL, title, and the
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Natural-language developer question or search phrase, including the library, error message, or API involved when relevant. |
| k | integer | no | Number of ranked results to return (default 10). |
| skills | string | no | Set to "only" to search only agent-skill files. |
- 50,000 calls a month, included
- 120 calls a minute at peak
- Every tool the listing has
- Cancel any time — the unused days are credited
- Runs behind the gateway, so cancelling stops it
What counts against the 50,000 calls a month on Starter
| Tool | Unit | Calls used | Out of the monthly allowance |
|---|---|---|---|
| firecrawl_scrape | write | 2 | 0.0040% |
| firecrawl_map | call | 1 | 0.0020% |
| firecrawl_search | call | 1 | 0.0020% |
| firecrawl_search_feedback | write | 2 | 0.0040% |
| firecrawl_feedback | write | 2 | 0.0040% |
| firecrawl_crawl | write | 2 | 0.0040% |
| firecrawl_check_crawl_status | call | 1 | 0.0020% |
| firecrawl_extract | call | 1 | 0.0020% |
Failed calls, timeouts and anything the gateway rejects never count. When the allowance runs out the gateway returns an error naming the plan limit — nothing is billed beyond the subscription, ever.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | moderate | capability blast radius (moderate) — client exposure if the model is manipulated | −3 |
| verification-discount | source | publisher verification (provenance) — cryptographic build provenance ties the artifact to its source | −0 |
| coverage-honesty | source | inspection depth (source) — how much of the target the scan could see | −0 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
Tools were statically extracted from the published source (30 recovered), not enumerated from a running server. Tool-poisoning, Unicode-smuggling, capability and toxic-flow analysis ran on this inferred surface, but a mis-parsed registration could be missed or mis-attributed, so tool-derived findings are capped below “confirmed”. To grade the real runtime surface, scan the running server: --command "npx -y <package>".
1 of the 30 recovered tools are registered only when !SEARCH_FEEDBACK_DISABLED && !isLocalKeylessStartup() holds (dist/index.js:4893) — typically when a key or option is configured. They are part of the server's surface and were analysed; a server started without that configuration exposes only the other 28.
1 of the 30 recovered tools are registered only when alexandriaFeedbackAvailable() holds (dist/index.js:5012) — typically when a key or option is configured. They are part of the server's surface and were analysed; a server started without that configuration exposes only the other 28.
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. moderate is the level these add up to.
28 tools are registered unconditionally · (1) 1 more only when !SEARCH_FEEDBACK_DISABLED && !isLocalKeylessStartup() holds (dist/index.js:4893) · (2) 1 more only when alexandriaFeedbackAvailable() holds (dist/index.js:5012) — typically when a key or option is configured. All 30 are in the table below and were analysed; the conditional ones are marked.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| firecrawl_developer_search | no tags | |
| firecrawl_gov_search | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| firecrawl_monitor_create | external-sink | external-sink: keyword "webhook" |
| firecrawl_monitor_list | no tags | |
| firecrawl_monitor_get | no tags | |
| firecrawl_monitor_update | no tags | |
| firecrawl_monitor_delete | no tags | |
| firecrawl_monitor_run | no tags | |
| firecrawl_monitor_checks | no tags | |
| firecrawl_monitor_check | no tags | |
| firecrawl_research_search_papers | no tags | |
| firecrawl_research_inspect_paper | no tags | |
| firecrawl_research_related_papers | no tags | |
| firecrawl_research_read_paper | no tags | |
| firecrawl_research_search_github | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| firecrawl_credit_usage | no tags | |
| firecrawl_scrape | untrusted-inputexternal-sink | untrusted-input: keyword "scrape"; external-sink: handler sends an HTTP POST ( client.http.post("/v2/scrape") at dist/index.js:4697, handler sends an HTTP POST (fetch(${resolveApiBaseUrl()}${path2}) at dist/index.js:4800 |
| firecrawl_map | no tags | |
| firecrawl_search | untrusted-inputexternal-sink | untrusted-input: keyword "search web", declares openWorldHint: true (interacts with entities outside the server); external-sink: handler sends an HTTP POST (fetch(${resolveApiBaseUrl()}${path2}) at dist/index.js:4800 |
| firecrawl_find_tools | untrusted-inputexternal-sink | untrusted-input: keyword "browse"; external-sink: handler sends an HTTP POST ( client.http.post("/v2/scrape") at dist/index.js:4697 |
| firecrawl_search_feedback conditional (1) | external-sink | external-sink: handler sends an HTTP POST (fetch(endpoint) at dist/index.js:4970 |
| firecrawl_feedback conditional (2) | external-sink | external-sink: handler sends an HTTP POST (fetch(${apiBase}/v2/feedback) at dist/index.js:5109 |
| firecrawl_crawl | untrusted-inputexternal-sink | untrusted-input: keyword "scrape"; external-sink: handler sends an HTTP POST ( client.http.post("/v2/crawl") at dist/index.js:5200 |
| firecrawl_check_crawl_status | untrusted-input | untrusted-input: keyword "crawl" |
| firecrawl_extract | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| firecrawl_agent | no tags | |
| firecrawl_agent_status | no tags | |
| firecrawl_interact | no tags | |
| firecrawl_interact_stop | external-sink | external-sink: handler sends an HTTP DELETE ( client.http.delete(/v2/scrape/${encodeURIComponent(scrapeId)}/interact) at dist/index.js:5564 |
| firecrawl_parse | external-sink | external-sink: handler sends an HTTP POST (fetch(endpoint) at dist/index.js:5639, handler sends an HTTP POST (fetch(${resolveApiBaseUrl()}${pathName}) at dist/index.js:4356, handler sends an HTTP POST (fetch(${resolveApiBaseUrl()}${path2}) at dist/index.js:4800 |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
The gateway serves every install the publisher’s current release, so a release cannot be pinned or rolled back to here yet. The history below is for reading; the current release on file is 0.1.0.
- The version this listing went live with, after review.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Firecrawl can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.