multifetch-mcp
v0.2.0
Published
MCP server for fetching URLs and searching the web via Jina Reader with markdown.new and defuddle.md fallbacks. Zero config, works for Claude Code and Claude Desktop.
Maintainers
Readme
multifetch-mcp
A zero-config MCP server that lets Claude fetch any URL and search the web, with content returned as clean Markdown.
- Primary backend: Jina Reader (
r.jina.ai+s.jina.ai) - Automatic fallback: markdown.new (URL → Markdown) and
markdown.new/search(web search via Serper.dev) - Second fallback for
fetch: defuddle.md (URL → Markdown with YAML frontmatter) - No API key required for
fetch(r.jina.aiis free).searchuses the free markdown.new provider by default; setJINA_API_KEYto route search through Jina too and to raisefetchrate limits. - Distributed via npm — runs with a single
npxcommand.
Install
Claude Desktop
Open claude_desktop_config.json and add:
{
"mcpServers": {
"multifetch": {
"command": "npx",
"args": ["-y", "multifetch-mcp"]
}
}
}Then restart Claude Desktop. That's it.
Claude Code
Bash / zsh / Git Bash:
claude mcp add multifetch -- npx -y multifetch-mcpPowerShell (needs the --% stop-parsing token, otherwise PowerShell consumes the -- separator before it reaches claude):
claude mcp add multifetch --% -- npx -y multifetch-mcpWindows CMD:
claude mcp add multifetch -- npx -y multifetch-mcpIf both forms fail in your shell, edit ~/.claude.json directly (see Manual config below).
Manual config
If the claude mcp add command misbehaves in your shell, you can edit ~/.claude.json directly. Find the mcpServers object (create it if missing) and add:
"mcpServers": {
"multifetch": {
"type": "stdio",
"command": "npx",
"args": ["-y", "multifetch-mcp"]
}
}Optional: higher rate limits
Set JINA_API_KEY (get a free one at jina.ai) to bypass the anonymous rate limit:
{
"mcpServers": {
"multifetch": {
"command": "npx",
"args": ["-y", "multifetch-mcp"],
"env": {
"JINA_API_KEY": "jina_..."
}
}
}
}Tools
fetch
Convert any URL to clean Markdown.
| Param | Type | Description |
|---|---|---|
| url | string (required) | Absolute URL to fetch |
| format | markdown | frontmatter | html | text | Output format (Jina only). Default markdown |
| no_cache | boolean | Bypass cached version |
| target_selector | string | CSS selector to extract content from (Jina only) |
| timeout | integer (1–180) | Max seconds to wait (Jina only) |
| max_tokens | integer (≥500) | Truncate response to N tokens (Jina only) |
| engine | auto | browser | Force a fetching engine. Use browser for JS-heavy sites |
Behavior: tries r.jina.ai first. If it fails (network / 4xx / 5xx / rate limit), falls back to markdown.new/<url>, then to defuddle.md/<url>. Returns a clear error only if all three providers fail.
search
Search the web and get the top results as Markdown.
| Param | Type | Description |
|---|---|---|
| query | string (required) | Search query |
| site | string[] | Restrict to specific domains (Jina only) |
| n | integer (1–5) | Number of results (markdown.new fallback). Default 3 |
| no_cache | boolean | Bypass cached SERP (Jina only) |
Behavior: Jina's search endpoint (s.jina.ai) requires JINA_API_KEY — without one it returns 401. So by default (no key) search goes straight to markdown.new/search/<query> (powered by Serper.dev, top N pages) without a wasted Jina round-trip. When a key is set, it tries s.jina.ai first and falls back to markdown.new on any error.
Example prompts
Fetch https://example.com and summarize it.
Search the web for "MCP protocol" and give me the highlights from the top results.
Fetch https://news.ycombinator.com using the browser engine (JS-heavy site).
Develop locally
npm install
npm run build
node dist/index.js # starts MCP server on stdioTo wire your local build into Claude Desktop, point the command at the absolute path of dist/index.js:
{
"mcpServers": {
"multifetch": {
"command": "node",
"args": ["C:\\path\\to\\multifetch\\dist\\index.js"]
}
}
}Smoke-test with the official MCP inspector:
npx @modelcontextprotocol/inspector node dist/index.jsLicense
MIT
