Web Search
How SurfSense web search works and how to add Tavily or Linkup via a Custom MCP connector
Web Search
SurfSense performs public web search through the built-in Google Search specialist. When the assistant needs real-time or public information (news, prices, weather, exchange rates, current events, or "who ranks for X"), it delegates the query to the Google Search subagent, which returns ranked results the assistant can cite and hand off for crawling.
There is nothing to configure — Google web search is available in every workspace out of the box.
Google-only web search
SurfSense previously bundled a multi-engine web-search tool backed by SearXNG, Tavily, Linkup, and Baidu. Those have been consolidated: public web search now runs exclusively through the Google Search specialist. The Tavily, Linkup, Baidu Search, and SearXNG connectors are deprecated and can no longer be connected.
How It Works
When the assistant decides a request needs the open web:
- The main agent delegates the query to the
google_searchspecialist. - The specialist runs a Google search and returns ranked result items (title, URL, snippet).
- The assistant summarizes the findings and can follow up by crawling a specific result page.
SearXNG fallback
Google occasionally walls every exit IP, in which case a search would return nothing. The Docker stack bundles a SearXNG container that serves organic results as a last resort in that case. It works out of the box — there is nothing to configure.
It only fires after Google's own retry ladder is exhausted, and it only serves organic results plus query suggestions. Ads, People Also Ask, AI Overviews, and result totals are Google-only and come back empty, so requests that specifically ask for paid ads are never served from the fallback. Fallback pages are tagged with resultsProvider: "searxng" and are not billed at the Google SERP rate.
The container is internal-only in production. The dev and deps-only stacks publish its UI on http://localhost:8888 (SEARXNG_PORT) if you want to query it directly.
Configuration
| Variable | Value |
|---|---|
SEARXNG_URL | Where the scraper looks. Compose sets it to the bundled service; set it empty to turn the fallback off, or to another base URL to use your own instance |
SEARXNG_TIMEOUT_S | Request timeout in seconds (default 10) |
SEARXNG_SECRET | Session secret for the bundled container |
The instance's own settings live in docker/searxng/settings.yml. Two entries there are load-bearing. search.formats includes json, which is the API the scraper calls — remove it and every request comes back HTTP 403, with no environment variable to re-enable it. And the google engine is disabled on purpose: this instance only runs after Google walled you, so querying Google again from the same address is self-defeating. DuckDuckGo, Brave, Bing, and Wikipedia tolerate server IPs far better and are what make the fallback useful.
SearXNG reads that file only at startup, so restart the container after editing it.
Using your own instance
Point SEARXNG_URL at it and, if you like, remove the searxng service from your compose file. Your instance must have json in search.formats for the same reason as above; if it does not, SurfSense logs the 403 and names the setting.
Nothing depends on the service being healthy, so a SearXNG that is down or misconfigured degrades searches to Google alone rather than blocking the stack.
Not the SearXNG connector
This is an operator-level setting for the Google Search scraper. The SearXNG connector remains deprecated and still cannot be connected.
Google web search is workspace-scoped and is not available in the free / anonymous (no-login) chat, which answers purely from the model's own knowledge.
Still want Tavily or Linkup?
If you relied on Tavily or Linkup, you can add them back yourself through the generic Custom MCP connector (the MCPs card in the Connectors dashboard). Both providers expose a hosted MCP server that authenticates with an API key sent as a request header:
| Provider | MCP server URL | Auth header |
|---|---|---|
| Tavily | https://mcp.tavily.com/mcp/ | Authorization: Bearer <your Tavily API key> |
| Linkup | https://mcp.linkup.so/mcp | Authorization: Bearer <your Linkup API key> |
Steps:
- Open the Connectors dashboard and choose MCPs (Custom MCP connector).
- Enter the provider's MCP server URL from the table above.
- Add an
Authorizationheader with the valueBearer <your API key>. - Save. The provider's search tools become available to the assistant through the connected-apps specialist.
No SurfSense API keys needed
Tavily/Linkup keys live only in your Custom MCP connector configuration. SurfSense no longer ships first-party Tavily, Linkup, Baidu, or SearXNG integrations.
Deprecated connectors
The following connectors are deprecated. Existing rows remain readable/manageable, but new connections are refused (HTTP 410), and their catalog cards show a Deprecated badge:
- Tavily — add via Custom MCP connector (see above).
- Linkup — add via Custom MCP connector (see above).
- Baidu Search — no longer bundled; use the built-in Google Search or a Custom MCP connector for a provider of your choice.
- SearXNG — no longer a connectable source. The bundled
searxngcontainer still ships, but serves only as the Google Search scraper's fallback (see above).