searxNcrawl, a self-hosted Jina Reader alternative
Jina Reader turns a web page into text for language models when you put https://r.jina.ai/ in front of its address. searxNcrawl does the same job on your own machine, as a CLI and as an MCP server for AI agents. This page compares the two, with the same page read by both.
searxNcrawl and Jina Reader compared
| Capability | searxNcrawl | Jina Reader |
|---|---|---|
| How you call it | crawl <url> in the shell, the crawl MCP tool or the Python API | An HTTP request to r.jina.ai/<url> |
| Where pages are fetched | From your machine and network | From the servers of Jina |
| API key | None | Optional for the Reader; required for search |
| Rate limit | Your hardware and the sites you crawl | 20 requests per minute without a key, 500 with a free or paid key |
| Usage | Not metered; you run the machine | Counted in tokens of the output |
| Web search | search through SearXNG and/or You.com | s.jina.ai with a key |
| Whole sites | crawl --site and crawl_site with limits | One URL per request |
| Licence | MIT | Apache-2.0 for the code on GitHub |
Jina facts as published in its rate-limit table, on the Reader page and in its GitHub repository, fact-checked on 2026-11-04. searxNcrawl facts describe version 0.33.1.
What each one is built for
Jina Reader is a hosted conversion service. You send it an address, its servers load the page, and you receive the text with a title, the source address and, where the page states one, its publication time. Nothing runs on your side, which makes it the shortest path from a URL to text in a script, a notebook or a prompt that allows web requests. With a key, the same family of endpoints also searches the web and returns the results as text.
searxNcrawl is a crawler that runs where your agents run. It renders the page in Chromium on your machine, removes sections that repeat within the page and returns Markdown, either in the shell or as an MCP tool. Because it is a local process, it reads pages that no hosted service can reach, such as an intranet wiki, and the addresses you read never pass through a third party.
Both answer the same question, what does this page say, in a form a language model reads well. The difference is where the work happens and who sees the request.
The output differs in its frame. Jina Reader puts a few header lines before the text: the title, the source address, the publication time if the page states one, and the label Markdown Content. The CLI of searxNcrawl writes the Markdown of the page as it is; the MCP tool adds a heading with the address and the time of the crawl, so an agent that reads several pages can tell them apart and cite them. With --json, searxNcrawl returns the Markdown in a field next to the status code, the title, the description and the links of the page, which suits scripts that store pages or check them before use.
The same page, read by both
We read the search API page of the SearXNG documentation with both tools on the same day, Jina Reader without a key:
curl -s https://r.jina.ai/https://docs.searxng.org/dev/search_api.html
uvx --from searxncrawl crawl https://docs.searxng.org/dev/search_api.html -o page.md
Jina Reader answered 200 in 1.1 seconds with 2,989 characters: a header with title, source address and publication time, followed by the text under Markdown Content. searxNcrawl wrote 3,221 characters in 8.3 seconds, starting with the heading of the page. Both kept the endpoints, the parameter descriptions, the curl examples and the links of the page.
The local run includes starting Chromium; a hosted service answers from servers that are already running. For an agent that reads a few pages per task, the difference is seconds. For a batch of many addresses, crawl takes them all in one call and reads three at a time by default, which --concurrency raises.
When searxNcrawl fits
- Your agents read pages through MCP and should not depend on a hosted service or its rate limit.
- The pages are internal or behind a login, or the addresses themselves are confidential.
- You read many pages and want no per-token billing.
- You also need web search and site crawls from the same tool.
Privacy is the quiet argument. A hosted reader sees every address you send it, and with it the topics your agents work on. A local crawler only talks to the sites it reads. For a company this can decide whether a tool may be used at all: addresses taken from internal tickets, customer projects or a private repository say more than they seem to, and a local crawler keeps them inside your own network.
When Jina Reader fits better
- You need text from a URL without installing anything, for example in a notebook or a quick script.
- Your machine cannot run Chromium, or about 550 MB for the browser download is too much.
- The pages block requests from your network but answer the servers of a hosted service.
The two combine well: keep the hosted reader for one-off conversions and give your agents a local crawler for the pages they read every day. An agent can use both: the local crawler by default and the hosted reader as a way out when a site blocks requests from your network.
Use it from the shell
crawl takes one or many addresses. With one address and -o it writes a file; with several it writes one file per page into a directory. These options shape the output:
- --json
- Markdown plus metadata: status code, title, references and the counts of the deduplication
- --remove-links
- Markdown without links, the shortest form for a language model
- --links-only
- Only the links of the page, as references
- --concurrency
- How many pages are read at the same time; 3 by default
- --storage-state
- A saved browser session for pages behind a login
- --dedup-mode off
- Keeps sections that repeat within a page
uv downloads the package on the first run and caches it, so later runs start quickly. The first crawl also downloads Chromium once.
Use it from an AI agent
Run uvx searxncrawl setup to register searxNcrawl with Claude Code, Codex, Gemini CLI, Cursor, VS Code and Claude Desktop, or add this block to any client that reads an mcpServers file:
{
"mcpServers": {
"crawler": {
"command": "uvx",
"args": ["searxncrawl"],
"env": { "SEARXNG_URL": "http://your-searxng:8888" }
}
}
}| Jina Reader request | searxNcrawl MCP tool |
|---|---|
r.jina.ai/<url> | crawl with urls |
s.jina.ai/<query> | search with include_content=true |
| One request per page of a site | crawl_site with max_depth and max_pages |
The web crawler MCP server page shows the MCP calls in a real run, and the SearXNG MCP server page explains search with page content.
Scripts that call Jina Reader switch with one line. Where a script runs curl against r.jina.ai with the page address appended, it runs uvx --from searxncrawl crawl with the same address instead and reads the Markdown from standard output, or from the file given with -o. Several addresses go into one call, which reads them in parallel and writes one file per page. Nothing else changes in the script: there is no key to pass, no rate limit to wait for and no header to strip from the text.
How we tested this page
We ran both commands above on 2026-11-04, Jina Reader without a key and searxNcrawl 0.33.1 with Crawl4AI 0.9.5. Times and sizes vary with the network and the page. Jina is a trademark of its owner; searxNcrawl is not affiliated with it.
We reviewed these facts on 2026-11-04 against the linked sources. Our editorial and corrections policy says how we keep them current and fix errors.
Frequently asked questions
Is there a self-hosted alternative to Jina Reader?
Yes. searxNcrawl is MIT licensed and runs on your machine: crawl prints any page as Markdown, and the same crawler is an MCP tool for AI agents. The code of Jina Reader is on GitHub under Apache-2.0 as well, but Jina documents it as the hosted service at r.jina.ai.
Does Jina Reader need an API key?
Not for basic use. Without a key r.jina.ai allows 20 requests per minute, with a free or paid key 500, and the search endpoint s.jina.ai needs a key, according to the rate-limit table of Jina.
How do I convert a URL to Markdown for an LLM from the command line?
With searxNcrawl: uvx --from searxncrawl crawl https://example.com -o page.md. Add --json for metadata and links, or --remove-links for text without links.
Can an AI agent convert URLs to Markdown through MCP?
Yes. The crawl tool of searxNcrawl takes one or many URLs and returns their Markdown; uvx searxncrawl setup registers it with Claude Code, Codex, Cursor and other clients.