You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
websearch: Firecrawl provider always returns "No search results found" #50217
Built-in websearch with provider: firecrawl consistently returns No search results found. Please try a different query. for queries that succeed against the Firecrawl API directly with the same key. Likely response-shape handling bug in the Firecrawl adapter.
Environment
opencode version: 2.0.11
OS: Darwin 27.2.0 arm64
Terminal: Apple_Terminal, xterm-256color
Shell: /bin/zsh
Install/channel: latest
Active plugins: none found in config
Reproduction
Set websearch.provider to firecrawl in opencode.jsonc and provide a valid FIRECRAWL_API_KEY.
Run any current-info prompt, e.g. opencode run --model openai/gpt-5-nano "Search the web and tell me the latest Bun release version number."
Observe Web Search via Firecrawl tool calls completing in <1s with No search results found. Please try a different query.
Control: POST the same query to https://api.firecrawl.dev/v1/search (and /v2/search) with the same key returns HTTP 200 success:true with results.
Expected Behavior
Firecrawl results returned to the model, same as the direct API returns.
Actual Behavior
Every search via the built-in tool returns No search results found. Please try a different query. Tool state shows status: completed, metadata: {provider: firecrawl, truncated: false}. Reproduced 5/5 across 5 distinct queries (latest Bun release x2, Starmind FCC, Starship launch, Tesla Robotaxi).
Confirmed on Linux (CachyOS, x64), opencode 2.0.32, desktop build. Not a flake, and here's the wire evidence for exactly why it comes back empty.
Root cause: Firecrawl returns an auth failure as a successful MCP result
POST https://mcp.firecrawl.dev/v2/mcp → HTTP 200, serverInfo: firecrawl-fastmcp 3.30.3. Handshake is fine.
Then tools/call → firecrawl_search:
{
"result": {
"content": [
{
"type": "text",
"text": "Anonymous keyless access is unavailable for this request.\n\nFix: Create an API key at https://firecrawl.dev/k/... and then:\n- Set the header: Authorization: Bearer YOUR_API_KEY on https://mcp.firecrawl.dev/v2/mcp\nThen start a new session."
}
],
"structuredContent": {
"code": "KEYLESS_ACCESS_NOT_AVAILABLE",
"auth_mode": "keyless",
"request_id": "...",
"message": "Anonymous keyless access is unavailable for this request."
}
}
}
So the provider call succeeds at the protocol level and carries no results / data.web at all. The plugin reads the result array, finds nothing, ?? [], and the tool renders "No search results found. Please try a different query." The real error — a specific, actionable, machine-readable KEYLESS_ACCESS_NOT_AVAILABLE — is discarded.
Contrast: Parallel works fine keyless
POST https://search.parallel.ai/mcp → 200, web_search with no API key returns:
Honour websearch.providerID (and OPENCODE_WEBSEARCH_PROVIDER) on the tool execution path, not just in the provider list. Right now the pin appears to be ignored and selection falls back to the first registered provider — firecrawl — which is exactly the broken one.
Rotate on "provider answered with no results and no key", not only on 429.
Docs: the hosted keyless path no longer covers Firecrawl search (auth_mode: keyless is explicitly rejected). Worth stating which providers keyless actually covers, since users reasonably assume "hosted" means it just works.
Thanks for the detailed report. I can reproduce the silent "No search results found" on 2.0.11, and it still happens on the latest dev (fa1260d). I couldn't test with a valid Firecrawl key, though.
What I found:
The built-in provider doesn't call the REST /v1/search or /v2/search endpoints you tested. It calls Firecrawl's MCP endpoint (https://mcp.firecrawl.dev/v2/mcp, tool firecrawl_search). FIRECRAWL_API_KEY is sent there as a Bearer token.
When that endpoint can search, its response is in the layout opencode expects. A keyless search returned 8 results.
When the MCP endpoint rejects the request, it still answers HTTP 200 but with an error, e.g. "The Firecrawl API key is invalid or revoked…". opencode drops that error and returns an empty list, so the tool says "No search results found" with no key or config error. That matches what you're seeing.
So your key is probably getting an error back from the MCP endpoint even though the REST API accepts it, and opencode hides the reason. The script below prints the raw MCP response for a key next to what opencode's provider returns. If you run it with your key and share the raw response (without the key), we'll know the exact cause.
Activity
UnixUserDev commentedon Oct 18, 2026
Confirmed on Linux (CachyOS, x64), opencode 2.0.32, desktop build. Not a flake, and here's the wire evidence for exactly why it comes back empty.
Root cause: Firecrawl returns an auth failure as a successful MCP result
POST https://mcp.firecrawl.dev/v2/mcp→ HTTP 200,serverInfo: firecrawl-fastmcp 3.30.3. Handshake is fine.Then
tools/call→firecrawl_search:{ "result": { "content": [ { "type": "text", "text": "Anonymous keyless access is unavailable for this request.\n\nFix: Create an API key at https://firecrawl.dev/k/... and then:\n- Set the header: Authorization: Bearer YOUR_API_KEY on https://mcp.firecrawl.dev/v2/mcp\nThen start a new session." } ], "structuredContent": { "code": "KEYLESS_ACCESS_NOT_AVAILABLE", "auth_mode": "keyless", "request_id": "...", "message": "Anonymous keyless access is unavailable for this request." } } }So the provider call succeeds at the protocol level and carries no
results/data.webat all. The plugin reads the result array, finds nothing,?? [], and the tool renders "No search results found. Please try a different query." The real error — a specific, actionable, machine-readableKEYLESS_ACCESS_NOT_AVAILABLE— is discarded.Contrast: Parallel works fine keyless
POST https://search.parallel.ai/mcp→ 200,web_searchwith no API key returns:So keyless hosted access still works for at least one provider. It is specifically Firecrawl that now refuses anonymous search.
The configured provider is not honoured on the tool path
This is the part that makes it sticky, and it's why "random"/ANY selection never rotates away:
~/.config/opencode/env.shhasexport OPENCODE_WEBSEARCH_PROVIDER=parallel.opencode-cli serve --service, verified via/proc/<pid>/environ)."websearch": { "providerID": "parallel" }to~/.config/opencode/opencode.jsoncchanged nothing either.GET /api/websearch/providerlistsexa, firecrawl, parallel, tavily, tinyfish— so the endpoint knows about parallel.websearchcall, for unrelated queries (tesla roadster,linux kernel 6.18), still returnsNo search results found.Reproduced across three separate queries and two provider configurations. Direct Parallel MCP calls from the same machine return 10/10 results.
Suggested fixes
structuredContent.code/ MCPisError/ non-emptycontenttext should become a tool error, not[]. fix(core): report MCP web search tool errors instead of empty results #56700 and fix(core): make web search limits non-fatal and report real errors #50938 look like the intended direction here.websearch.providerID(andOPENCODE_WEBSEARCH_PROVIDER) on the tool execution path, not just in the provider list. Right now the pin appears to be ignored and selection falls back to the first registered provider — firecrawl — which is exactly the broken one.auth_mode: keylessis explicitly rejected). Worth stating which providers keyless actually covers, since users reasonably assume "hosted" means it just works.Environment
opencode-cli serve --service)-cachyos, x64, bashFIRECRAWL_API_KEY, noEXA_API_KEY, noTAVILY_API_KEY, noPARALLEL_API_KEYconfigured~/.config/opencode/opencode.jsonc,shell: bashopencodejr commentedon Oct 28, 2026
Thanks for the detailed report. I can reproduce the silent "No search results found" on 2.0.11, and it still happens on the latest
dev(fa1260d). I couldn't test with a valid Firecrawl key, though.What I found:
/v1/searchor/v2/searchendpoints you tested. It calls Firecrawl's MCP endpoint (https://mcp.firecrawl.dev/v2/mcp, toolfirecrawl_search).FIRECRAWL_API_KEYis sent there as a Bearer token."The Firecrawl API key is invalid or revoked…". opencode drops that error and returns an empty list, so the tool says "No search results found" with no key or config error. That matches what you're seeing.So your key is probably getting an error back from the MCP endpoint even though the REST API accepts it, and opencode hides the reason. The script below prints the raw MCP response for a key next to what opencode's provider returns. If you run it with your key and share the raw response (without the key), we'll know the exact cause.
Related:
provider: "random"Reproduction script (firecrawl-repro.sh)
Run it:
bash firecrawl-repro.sh