MCP server for performing web and local searches using the Brave Search API
The Brave Search MCP has two tools with basic schemas and descriptions. Both tools are named with action verbs (brave_web_search, brave_local_search) which is a positive. However, the implementation exhibits significant gaps in definition quality: descriptions are minimal (under 100 chars each, below the 194-char baseline for production tools), output schemas are not documented, parameter descriptions lack detail about formats and constraints, and error handling provides no recovery guidance. The tools return unstructured plaintext responses instead of structured JSON, forcing LLMs to parse free-form text. Neither tool accepts human-friendly identifiers or provides pagination guidance despite potentially returning many results.
Searches for local businesses using Brave's Local Search API.
Performs a web search using the Brave Search API.
Output schema not documented. Both tools return plain strings instead of structured JSON with typed fields. LLMs cannot plan downstream operations or extract specific fields.
Minimal tool descriptions (under 100 chars). 'Performs a web search using the Brave Search API' provides no guidance on WHEN to use this tool vs alternatives, what the agent should expect, or required setup. Production baseline is 194 chars.
Parameter descriptions lack format and constraint details. 'count' says 'Number of results to return' but does not state range (1-20 observed in code via min(count, 20)), and 'offset' has no guidance on pagination behavior or maximum offset.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 45 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
No error recovery guidance. When 'No search results found' is returned, the agent has no direction: should it retry with a different query, broaden the search, or give up? Error responses must include next steps.
Results not paginated. brave_web_search accepts 'count' and 'offset' but returns all matched results as a single plaintext block. For large result sets (100+ items), this wastes tokens and degrades LLM reasoning. No total count or next_cursor returned.
brave_local_search fallback behavior undocumented. If no locations are found, the function silently calls brave_web_search(). This hidden multi-step behavior violates tool semantics, the agent thinks it called a local search but gets web results instead.
No input validation or constraint enforcement. If an LLM passes count=1000 or offset=-5, the code silently clamps count via min(count, 20) but does not validate offset. No error message guides the LLM to valid ranges.
API key exposed in environment variable without vault integration. While not technically a parameter leak, the BRAVE_API_KEY is loaded via dotenv and used globally. No mention of secure credential rotation or audit logging.