More search providers for the websearch tool built into OpenCode 2.x: your own SearXNG server, Brave Search, Kagi, Perplexity Search, Linkup and Serper.
They sit next to the providers OpenCode ships (Exa, Tavily, Parallel, Firecrawl, TinyFish). The agent keeps using the same websearch tool, so there's no MCP server to run and no extra tool for the model to learn.
| Provider | What you need | Free tier, October 2026 |
|---|---|---|
| SearXNG | The URL of a SearXNG server with the JSON format on | Free, you run the server |
| Brave Search | An API key from api-dashboard.search.brave.com | $5 of credit each month, about 1,000 searches |
| Kagi | An API key from kagi.com/api/keys | None, $12 per 1,000 searches |
| Perplexity Search | An API key from console.perplexity.ai | None, $5 per 1,000 searches |
| Linkup | An API key from app.linkup.so | $20 of credit each month for work email accounts |
| Serper | An API key from serper.dev | 2,500 searches once |
Serper returns Google results. Kagi and Brave use their own indexes. Prices change, so check the provider's page before you rely on a number here.
A provider shows up in OpenCode only after you give it a key or a server URL. OpenCode's default choice, "any available provider", picks from every provider it knows and stays with the one it picked, so a provider without a key would fail your searches.
opencode plugin add @openchamber/opencode-search-providersOr add it to ~/.config/opencode/opencode.json yourself:
{
"$schema": "https://opencode.ai/config.json",
"plugins": ["@openchamber/opencode-search-providers"]
}In OpenChamber, install it from the Integrations page.
In OpenChamber: open Settings → Web search. Every provider from this plugin has a row under API keys. Paste the key, or the server URL for SearXNG, and the provider joins the search provider choices above.
In OpenCode: run /connect and pick the provider, or set its environment variable before you start OpenCode:
| Provider | Environment variable |
|---|---|
| SearXNG | SEARXNG_URL, for example http://localhost:8888 |
| Brave Search | BRAVE_API_KEY |
| Kagi | KAGI_API_KEY |
| Perplexity Search | PERPLEXITY_SEARCH_API_KEY |
| Linkup | LINKUP_API_KEY |
| Serper | SERPER_API_KEY |
Perplexity Search reads its own variable on purpose. PERPLEXITY_API_KEY is usually set for Perplexity's models, and reading it would turn on search billed to that key without you asking.
Then pick the provider, or keep "any available provider":
{
"websearch": { "provider": "brave" }
}The ids are searxng, brave, kagi, perplexity-search, linkup and serper.
SearXNG answers JSON only when the server allows it. Add json to search.formats in its settings.yml and restart it:
search:
formats:
- html
- jsonMost public instances keep JSON off, so this is meant for a server you run. If the server has the limiter on, requests from OpenCode can be blocked like any other bot. Turn the limiter off, or allow the address OpenCode runs on.
Want DuckDuckGo, Google or Bing results? Turn those engines on in your SearXNG server. DuckDuckGo has no official search API, and this plugin doesn't scrape it.
Each provider is an OpenCode integration with the same id. OpenCode keeps the key with its other credentials, and the plugin reads it on every search, so a replaced key works from the next search on. When you save or remove a key, the plugin adds or drops the provider without a restart.
A search sends the query and nothing else to the provider you picked, and returns up to 8 results with up to 2,000 characters of text each.
The integrations carry metadata: { websearch: true }. OpenChamber uses it to list them under Web search before they are connected and to keep them out of the model providers. Another plugin that adds web search providers can set the same marker.
bun install
bun test
bun run buildTo load your checkout in OpenCode, put its absolute path in plugins:
{
"plugins": ["/absolute/path/to/opencode-search-providers"]
}MIT