The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Open WebSearch listing page.
open-websearch provides an MCP server, CLI, and local daemon, and can also be paired with skill-guided agent workflows for live web search and content retrieval without API keys.
Swiftproxy provides high-quality static residential proxies with stable IPs for multi-account management, automation, web scraping, and secure online operations. Protect your accounts with clean IPs and reliable proxy infrastructure. Static proxy traffic is valid for 30 days with unlimited usage. Get 10% off with code
PROXY90.
MCP
open-websearch to Claude Desktop, Cherry Studio, Cursor, or another MCP client.CLI
Local daemon
status, GET /health, and POST /search / POST /fetch-*. Start it explicitly with open-websearch serve and check it with open-websearch status.Skill
Install the open-websearch skill for your agent first:
On first use, the skill typically follows this path: detect whether a usable open-websearch path already exists, guide setup/enablement if it does not, validate that the capability is active, and only then continue with search or fetch through the smallest working path.
If the current environment cannot complete setup or activation automatically, you can explicitly have the agent start the local daemon first:
Keep installation proxy settings separate from runtime proxy settings:
open-websearch, playwright, or other npm packages.search / fetch work.open-websearch network traffic after serve starts, for example:If the agent can only get through the package-install step with npm proxy settings, but live search/fetch also needs a proxy after startup, those are two separate configuration steps and should be handled separately.
CLI is for one-shot execution. The local daemon is a long-lived local HTTP service for repeated calls with lower startup friction. Use open-websearch serve as the explicit daemon start command and open-websearch status as the explicit daemon status command.
Action commands such as search and fetch-web try the default local daemon first when it is available. If you pass --daemon-url, that daemon path becomes explicit and silent fallback to direct execution is disabled.
Build first:
Start the local daemon:
Check status:
Run a one-shot local CLI search:
Notes:
open-websearch is the MCP server compatibility entrypoint, not the recommended daemon start command for agent automation.fetch-web.For the local daemon HTTP API (serve, status, GET /health, POST /search, POST /fetch-*), see docs/http-api.md.
If you are using open-websearch as an MCP server, continue with the MCP-oriented setup below.
The fastest way to get started:
Environment Variables:
| Variable | Default | Options | Description |
|---|---|---|---|
ENABLE_CORS | false | true, false | Enable CORS |
CORS_ORIGIN | * | Any valid origin | CORS origin configuration |
DEFAULT_SEARCH_ENGINE | bing | bing, duckduckgo, exa, brave, baidu, csdn, linuxdo, juejin, startpage, sogou, hackernews | Default search engine |
USE_PROXY | false | true, false | Enable HTTP proxy |
PROXY_URL | http://127.0.0.1:7890 | Any valid URL | Proxy server URL |
FAKE_IP_CIDRS | empty | Comma-separated CIDR list | Treat DNS answers in these CIDRs as synthetic fake-IP results and do not block them as private-network DNS answers. Literal private/local targets and other private-network DNS answers remain blocked |
FETCH_WEB_INSECURE_TLS | false | true, false | Disable TLS verification only for the request leg of fetchWebContent; it does not affect Playwright browser navigation. Use only for broken certificate chains |
MODE | both | both, http, stdio | Server mode: both HTTP+STDIO, HTTP only, or STDIO only |
PORT | 3000 | 1-65535 | Server port |
ALLOWED_SEARCH_ENGINES | empty (all available) | Comma-separated engine names | Limit which search engines can be used; if the default engine is not in this list, the first allowed engine becomes the default |
SEARCH_MODE | auto | request, auto, playwright | Search strategy. Currently only affects Bing: force HTTP request mode (request), force Playwright mode (playwright), or let the agent choose (auto, default). Forced modes never expose a searchMode override to the agent. In auto mode the server checks whether Playwright is really usable (the client module can actually be loaded, and for local launches a real browser binary exists: explicit PLAYWRIGHT_EXECUTABLE_PATH, bundled browser, or system Chrome/Edge); if available, the search tool exposes a searchMode parameter and directs the agent to stay on the default auto and only retry with playwright when request results fail, return empty, or look blocked; otherwise it behaves as forced request mode. If playwright is forced but not usable, searches fail with a browser_unavailable error |
PLAYWRIGHT_PACKAGE | auto | auto, playwright, playwright-core | Which Playwright client package to resolve when browser mode is enabled |
PLAYWRIGHT_MODULE_PATH | empty | Absolute path or project-relative path | Reuse an existing Playwright client package outside this project |
PLAYWRIGHT_EXECUTABLE_PATH | empty | Any valid browser binary path | Launch an existing Chromium/Chrome executable without installing bundled browsers |
PLAYWRIGHT_WS_ENDPOINT | empty | Valid Playwright ws:// / wss:// endpoint | Connect to an existing remote Playwright browser server |
PLAYWRIGHT_CDP_ENDPOINT | empty | Valid Chromium CDP endpoint | Connect to an existing Chromium instance over CDP |
PLAYWRIGHT_HEADLESS | true | true, false | Whether Playwright Chromium runs in headless mode |
PLAYWRIGHT_NAVIGATION_TIMEOUT_MS | 20000 | Positive integer | Timeout for Playwright navigation and Bing result waits |
OPEN_WEBSEARCH_PROFILE_DIR | <tmpdir>/open-websearch-browser-profiles | Any writable directory | Base directory for persistent local browser profiles (see browser state note below) |
MCP_TOOL_SEARCH_NAME | search | Valid MCP tool name | Custom name for the search tool; set to <disabled> (quote as '<disabled>' in bash/zsh, "<disabled>" in Windows cmd) to disable the tool. Invalid names fallback to default with a warning |
MCP_TOOL_FETCH_LINUXDO_NAME | fetchLinuxDoArticle | Valid MCP tool name | Custom name for the Linux.do article fetch tool; set to <disabled> (quote as '<disabled>' in bash/zsh, "<disabled>" in Windows cmd) to disable the tool. Invalid names fallback to default with a warning |
MCP_TOOL_FETCH_CSDN_NAME | fetchCsdnArticle | Valid MCP tool name | Custom name for the CSDN article fetch tool; set to <disabled> (quote as '<disabled>' in bash/zsh, "<disabled>" in Windows cmd) to disable the tool. Invalid names fallback to default with a warning |
MCP_TOOL_FETCH_GITHUB_NAME | fetchGithubReadme | Valid MCP tool name | Custom name for the GitHub README fetch tool; set to <disabled> (quote as '<disabled>' in bash/zsh, "<disabled>" in Windows cmd) to disable the tool. Invalid names fallback to default with a warning |
MCP_TOOL_FETCH_JUEJIN_NAME | fetchJuejinArticle | Valid MCP tool name | Custom name for the Juejin article fetch tool; set to <disabled> (quote as '<disabled>' in bash/zsh, "<disabled>" in Windows cmd) to disable the tool. Invalid names fallback to default with a warning |
MCP_TOOL_FETCH_WEB_NAME | fetchWebContent | Valid MCP tool name | Custom name for generic web/Markdown fetch tool; set to <disabled> (quote as '<disabled>' in bash/zsh, "<disabled>" in Windows cmd) to disable the tool. Invalid names fallback to default with a warning |
Common configurations:
Note: The
<disabled>sentinel contains shell-special characters. In bash/zsh, quote it as'<disabled>'; in Windows cmd, use double quotes"<disabled>".
Browser-enhanced Bing fallback is opt-in. The published package does not bundle Playwright anymore. Enable it manually with one of these setups:
This is the most practical setup when you want to reuse your own logged-in or previously verified browser session.
Windows PowerShell example:
Mode behavior:
request: only uses request-based Bing scraping; the search tool exposes no searchMode parameter and no mode guidanceplaywright: forces Playwright; the search tool exposes no searchMode parameter and no mode guidance. Playwright availability is checked at startup and an invalid configuration logs a warning; searches then fail with a clear browser_unavailable errorauto: checks whether Playwright is really usable (the client module actually loads; for local launches a real browser binary must exist). If available, the search tool exposes a searchMode parameter (request / auto / playwright) and directs the agent to stay on the default auto, retrying with playwright only when request results fail, return empty, or look blocked; otherwise the server behaves as request modeNotes:
PLAYWRIGHT_MODULE_PATH takes precedence over PLAYWRIGHT_PACKAGEPLAYWRIGHT_WS_ENDPOINT takes precedence over PLAYWRIGHT_CDP_ENDPOINTPLAYWRIGHT_EXECUTABLE_PATH and local proxy launch flagsfetchWebContent stays on the request-only path. Public pages can still work, but pages that require browser cookies or browser-rendered HTML may fail.Browser state note (local shared profiles):
PLAYWRIGHT_WS_ENDPOINT/PLAYWRIGHT_CDP_ENDPOINT instead of relying on local shared profiles, or point each caller at its own OPEN_WEBSEARCH_PROFILE_DIR.PLAYWRIGHT_WS_ENDPOINT/PLAYWRIGHT_CDP_ENDPOINT) inherit the connected browser's state, so pointing them at a personal logged-in browser also shares that browser's login and personalization state with this service.OPEN_WEBSEARCH_PROFILE_DIR (default: <tmpdir>/open-websearch-browser-profiles) while no local browser is running.This installs the core MCP server only. Browser fallback remains optional until you install or connect a Playwright client yourself. 3. Build the server:
Cherry Studio:
VSCode (Claude Dev Extension):
Claude Desktop:
NPX Command Line Configuration:
Windows NPX configuration:
Proxy and TLS notes:
USE_PROXY + PROXY_URL path.USE_PROXY=true, all Axios-based network requests follow the configured PROXY_URL path instead of mixing direct requests with environment-proxy behavior.PROXY_URL points to a local rule-based proxy client, that client can still decide which destinations go DIRECT and which ones are proxied.PROXY_URL points to a fixed upstream proxy or overseas egress, region-sensitive sites such as Baidu, CSDN, Juejin, Linux.do, or GitHub may behave differently than before.HTTP_PROXY or HTTPS_PROXY, they will no longer override the server's internal request behavior.NODE_EXTRA_CA_CERTS on Windows when a site has a missing intermediate CA.FETCH_WEB_INSECURE_TLS=true only as a last resort for the request leg of fetchWebContent; it weakens TLS verification and does not affect Playwright browser navigation.Local STDIO Configuration for Cherry Studio (Windows):
Quick deployment using Docker Compose:
Or use Docker directly:
Environment variable configuration:
| Variable | Default | Options | Description |
|---|---|---|---|
ENABLE_CORS | false | true, false | Enable CORS |
CORS_ORIGIN | * | Any valid origin | CORS origin configuration |
DEFAULT_SEARCH_ENGINE | bing | bing, duckduckgo, exa, brave, baidu, csdn, linuxdo, juejin, startpage, sogou, hackernews | Default search engine |
USE_PROXY | false | true, false | Enable HTTP proxy |
PROXY_URL | http://127.0.0.1:7890 | Any valid URL | Proxy server URL |
FAKE_IP_CIDRS | empty | Comma-separated CIDR list | Treat DNS answers in these CIDRs as synthetic fake-IP results and do not block them as private-network DNS answers. Literal private/local targets and other private-network DNS answers remain blocked |
PORT | 3000 | 1-65535 | Server port |
Then configure in your MCP client:
The server provides six tools: search, fetchLinuxDoArticle, fetchCsdnArticle, fetchGithubReadme, fetchJuejinArticle, and fetchWebContent.
For the local daemon HTTP API (serve, status, GET /health, POST /search, POST /fetch-*), see docs/http-api.md.
Usage example:
Response example:
Used to fetch complete content of CSDN blog articles.
Usage example:
Response example:
Used to fetch complete content of Linux.do forum articles.
Usage example:
Response example:
Used to fetch README content from GitHub repositories.
Usage example:
Supported URL formats:
https://github.com/owner/repohttps://github.com/owner/repo.gitgit@github.com:owner/repo.githttps://github.com/owner/repo?tab=readmeResponse example:
Fetch content directly from public HTTP(S) links, including Markdown files (.md), ordinary pages, and JavaScript-rendered pages when Playwright is configured.
request never starts a browser or uses browser cookies. auto preserves the existing request-first behavior and uses browser assistance only when needed. browser renders the page directly and returns a clear error if Playwright or its browser target is unavailable. Initial and final URLs remain subject to public-network safety checks.
Browser requests are revalidated before continuation, but this process does not pin DNS answers to Chromium's eventual socket. Remote Playwright/CDP endpoints must therefore enforce their own trusted DNS and egress policy.
Usage example:
Response example:
Used to fetch complete content of Juejin articles.
Usage example:
Supported URL format:
https://juejin.cn/post/{article_id}Response example:
Since this tool works by scraping multi-engine search results, please note the following important limitations:
Rate Limiting:
Result Accuracy:
Legal Terms:
Search Engine Configuration:
DEFAULT_SEARCH_ENGINE environment variableProxy Configuration:
USE_PROXY=truePROXY_URLFAKE_IP_CIDRS (for example 198.18.0.0/15)Welcome to submit issue reports and feature improvement suggestions!
If you want to fork this repository and publish your own Docker image, you need to make the following configurations:
To enable automatic Docker image building and publishing, please add the following secrets in your GitHub repository settings (Settings → Secrets and variables → Actions):
Required Secrets:
GITHUB_TOKEN: Automatically provided by GitHub (no setup needed)Optional Secrets (for Alibaba Cloud ACR):
ACR_REGISTRY: Your Alibaba Cloud Container Registry URL (e.g., registry.cn-hangzhou.aliyuncs.com)ACR_USERNAME: Your Alibaba Cloud ACR usernameACR_PASSWORD: Your Alibaba Cloud ACR passwordACR_IMAGE_NAME: Your image name in ACR (e.g., your-namespace/open-web-search)The repository includes a GitHub Actions workflow (.github/workflows/docker.yml) that automatically:
Trigger Conditions:
main branchv*)Build and Push to:
Image Tags:
ghcr.io/your-username/open-web-search:latestyour-acr-address/your-image-name:latest (if ACR is configured)main branch or create version tags