About Ferris Search
Ferris Search is an MCP server in the Search category: a blazing-fast MCP (Model Context Protocol) server for multi-engine web search, written in Rust. It has been installed 0 times through Conduid.
Install
git clone https://github.com/lispking/ferris-searchThis server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.
Ask AI
Ask AI about Ferris Search
Powered by Claude · Grounded in docs
Security checks
- ·README presentNot checked yet.
- ·License declaredNot checked yet.
- ·Tests presentNot checked yet.
- ·Dependencies pinnedNot checked yet.
- ·No dynamic code executionNot checked yet.
- ·Scoped permissionsNot checked yet.
README
ferris-search 🦀
A blazing-fast MCP server for multi-engine web search, written in Rust.
Why ferris-search?
Claude Code's built-in web search works great in ideal network conditions — but in practice, many developers run into environments where it's unreliable or unavailable: corporate networks, restricted regions, air-gapped setups, or simply spotty connectivity.
While looking for a workaround, I came across open-webSearch, a Node.js MCP server that routes search queries through multiple engines. It solved the problem well. But I have a thing for Rust — and spinning up a Node.js runtime just to proxy a few HTTP requests felt heavier than it needed to be.
So I rewrote the same idea in Rust:
- No Node.js runtime — single self-contained binary, ~8 MB
- Lower latency — Rust async I/O, concurrent fan-out across engines
- Smaller footprint — negligible memory usage
- Proxy support — HTTP/SOCKS5 proxy via env var, for networks that need it
If Claude Code's search isn't working in your environment, this is for you.
Enterprise & Internal Use
ferris-search is also a good foundation for enterprise internal search scenarios. Since it's a standard MCP server written in Rust, you can fork it and add custom search engines that connect to your internal knowledge bases — Confluence, Notion, internal wikis, code repositories, or proprietary document stores.
Some ideas:
- Add an engine that searches your internal Elasticsearch or OpenSearch cluster
- Integrate with your company's Confluence or GitLab search API
- Connect to a private RAG (Retrieval-Augmented Generation) service
- Route queries to different backends based on query language or topic
With Claude Code as the AI layer and ferris-search as the search backbone, your team gets a local AI coding assistant that can actually find and reference internal documentation — without sending anything to external search engines.
Features
- Multi-engine fan-out — search across multiple engines simultaneously with a single call
- 14 search engines — Bing, DuckDuckGo, Brave, Baidu, CSDN, Juejin, Exa, Firecrawl, Zhihu, LinuxDo, Jina, Tavily, GitHub (repo search), GitHub Code (code search)
- 7 MCP tools —
web_search+ 6 article/content fetchers - No API keys required for most engines (Brave, Exa, Firecrawl, Jina, and Tavily require API keys)
- Single binary — ~8 MB, no runtime dependencies
- Proxy support — HTTP/SOCKS5 proxy via env var
Quick Install
Linux / macOS (one-liner)
curl -fsSL https://raw.githubusercontent.com/lispking/ferris-search/main/install.sh | bash
Or from a local clone:
bash install.sh
The script will:
- Build and install the binary via
cargo install - Register the MCP server with Claude Code (
claude mcp add -s user) if the CLI is found - Install Claude Code skills for ferris-search
Windows (PowerShell)
irm https://raw.githubusercontent.com/lispking/ferris-search/main/install.ps1 | iex
Or from a local clone:
.\install.ps1
Prerequisite: Rust must be installed before running either script.
Quick Start
Install from source
cargo install --path .
This installs the ferris-search binary to ~/.cargo/bin/ferris-search. Make sure ~/.cargo/bin is in your PATH.
To find the installed binary path:
which ferris-search
# or
echo "$(cargo home 2>/dev/null || echo $HOME/.cargo)/bin/ferris-search"
Claude Desktop / Cursor configuration
{
"mcpServers": {
"ferris-search": {
"command": "/Users/<you>/.cargo/bin/ferris-search",
"env": {
"DEFAULT_SEARCH_ENGINE": "bing"
}
}
}
}
Replace the path with the output of which ferris-search.
Claude Code (claude mcp add)
Add for the current project only:
claude mcp add ferris-search $(which ferris-search)
Add globally for all projects (-s user):
claude mcp add -s user ferris-search $(which ferris-search)
With environment variables:
claude mcp add -s user ferris-search $(which ferris-search) \
-e DEFAULT_SEARCH_ENGINE=bing \
-e ALLOWED_SEARCH_ENGINES=bing,duckduckgo,brave
-s userregisters the server in your user-level config (~/.claude.json) so it is available across all projects, not just the current one.
Behind the GFW (proxy setup)
claude mcp add -s user ferris-search $(which ferris-search) \
-e USE_PROXY=true \
-e PROXY_URL=http://127.0.0.1:7890 \
-e DEFAULT_SEARCH_ENGINE=bing
MCP Tools
web_search
Search the web using one or more engines simultaneously.
{
"query": "rust async runtime",
"engines": ["bing", "duckduckgo"],
"limit": 10
}
| Parameter | Type | Default | Description |
|---|---|---|---|
query |
string | required | Search query |
engines |
string[] | server default | Engines to search (fan-out if multiple) |
limit |
number | 10 | Max results per engine (1–50) |
Supported engines: bing, duckduckgo, brave, baidu, csdn, juejin, exa, firecrawl, zhihu, linuxdo, jina, tavily, github, github_code
fetch_web_content
Fetch and extract text content from any public URL.
| Parameter | Type | Default | Description |
|---|---|---|---|
url |
string | required | Public HTTP/HTTPS URL |
max_chars |
number | 30000 | Max characters to return |
fetch_github_readme
Fetch the README from a GitHub repository.
| Parameter | Type | Description |
|---|---|---|
url |
string | GitHub repository URL |
fetch_csdn_article / fetch_juejin_article / fetch_zhihu_article / fetch_linuxdo_article
Domain-specific fetchers with better content extraction than the generic fetch_web_content.
| Tool | URL Constraint |
|---|---|
fetch_csdn_article |
must contain csdn.net |
fetch_juejin_article |
must contain juejin.cn and /post/ |
fetch_zhihu_article |
must contain zhihu.com |
fetch_linuxdo_article |
must contain linux.do and /topic/ |
Configuration
All configuration is done via environment variables.
| Env Var | Default | Description |
|---|---|---|
DEFAULT_SEARCH_ENGINE |
bing |
Engine used when engines param is omitted |
ALLOWED_SEARCH_ENGINES |
all engines | Comma-separated allow-list |
BRAVE_API_KEY |
— | Required for brave engine |
EXA_API_KEY |
— | Required for exa engine |
FIRECRAWL_API_KEY |
— | Required for firecrawl engine |
JINA_API_KEY |
— | Required for jina engine |
TAVILY_API_KEY |
— | Required for tavily engine |
GITHUB_TOKEN |
— | Optional for github / github_code engines (raises rate limit from 60 to 5000 req/hr) |
USE_PROXY |
false |
Enable HTTP/SOCKS5 proxy |
PROXY_URL |
http://127.0.0.1:7890 |
Proxy address |
ENABLE_HTTP_SERVER |
false |
Enable HTTP/SSE transport alongside stdio |
MODE |
stdio |
Transport mode: stdio, http, or both |
RUST_LOG |
info |
Log level: debug, info, warn, error |
Common configurations
Privacy-focused:
claude mcp add -s user ferris-search $(which ferris-search) \
-e DEFAULT_SEARCH_ENGINE=duckduckgo \
-e ALLOWED_SEARCH_ENGINES=duckduckgo,brave
Chinese developer workflow:
claude mcp add -s user ferris-search $(which ferris-search) \
-e DEFAULT_SEARCH_ENGINE=bing \
-e ALLOWED_SEARCH_ENGINES=bing,baidu,csdn,juejin,zhihu
With Exa AI search:
claude mcp add -s user ferris-search $(which ferris-search) \
-e DEFAULT_SEARCH_ENGINE=exa \
-e EXA_API_KEY=exa-xxxx \
-e ALLOWED_SEARCH_ENGINES=exa,bing,duckduckgo
Acknowledgements
Inspired by open-webSearch — this project reimplements the same idea in Rust for performance and portability.
License
Apache-2.0
README mirrored from the source repository 5 months ago. The original is authoritative.