Brave Search MCP server tool surface audit

A96/100composite score
Token footprint
~25,498
Tools
8
Findings
8
Scanned

Engine mcp-surface-lint@0.3.3 · reported as brave-search-mcp-server v2.1.3

Every conversation with the Brave Search MCP server begins with 8 tool definitions already in context — about 25,498 tokens of it. MCP Surface Lint scores that surface 96 out of 100 (grade A), with 8 scored findings spread across 2 of the six rule categories.

The spread runs from 100/100 for naming down to 85/100 for surface. It is catalogued here under Search and Browsing, alongside other servers agents reach for in the same kind of work.

Token footprint

Measured against a 200,000-token window, the surface consumes about 13% of it before the conversation starts, and keeps consuming it on every turn. That averages 3,187 tokens per tool definition, counted with the o200k_base encoding.

Compared with the Search and Browsing median of 2,728 tokens, Brave Search is roughly 835% above.

surface85
naming100
descriptions100
schemas88
annotations100
design100

Findings

Findings are listed by severity; the rule pages explain the reasoning in full.

7 findings come from `schemas/complexity-budget`. Deeply nested inputs, very wide property lists, and stacked oneOf/anyOf force the model to solve a constraint puzzle before every call. Flatter, narrower inputs get filled correctly more often. On this surface it fires on `brave_web_search`, `brave_local_search` and `brave_news_search`, among 2 others.

`surface/token-budget` contributes one finding. The serialized tools/list payload is injected into every conversation that connects the server, before any work happens. Its token cost is a per-message tax. It applies to the surface as a whole rather than to one tool.

warn 8 findings

Findings that measurably degrade tool selection.

Input schema has 15 top-level properties (budget 12).

Deeply nested inputs, very wide property lists, and stacked oneOf/anyOf force the model to solve a constraint puzzle before every call. Flatter, narrower inputs get filled correctly more often.

Input schema uses oneOf/anyOf 3 times (budget 2).

Deeply nested inputs, very wide property lists, and stacked oneOf/anyOf force the model to solve a constraint puzzle before every call. Flatter, narrower inputs get filled correctly more often.

schemas/complexity-budgetbrave_local_search
Input schema has 15 top-level properties (budget 12).

Deeply nested inputs, very wide property lists, and stacked oneOf/anyOf force the model to solve a constraint puzzle before every call. Flatter, narrower inputs get filled correctly more often.

schemas/complexity-budgetbrave_local_search
Input schema uses oneOf/anyOf 3 times (budget 2).

Deeply nested inputs, very wide property lists, and stacked oneOf/anyOf force the model to solve a constraint puzzle before every call. Flatter, narrower inputs get filled correctly more often.

schemas/complexity-budgetbrave_news_search
Input schema uses oneOf/anyOf 3 times (budget 2).

Deeply nested inputs, very wide property lists, and stacked oneOf/anyOf force the model to solve a constraint puzzle before every call. Flatter, narrower inputs get filled correctly more often.

schemas/complexity-budgetbrave_llm_context
Input schema has 26 top-level properties (budget 12).

Deeply nested inputs, very wide property lists, and stacked oneOf/anyOf force the model to solve a constraint puzzle before every call. Flatter, narrower inputs get filled correctly more often.

schemas/complexity-budgetbrave_place_search
Input schema has 17 top-level properties (budget 12).

Deeply nested inputs, very wide property lists, and stacked oneOf/anyOf force the model to solve a constraint puzzle before every call. Flatter, narrower inputs get filled correctly more often.

tools/list footprint is ~25498 tokens (o200k_base, approximate) — above the 10000-token budget. Every conversation pays this before the first user message.

The serialized tools/list payload is injected into every conversation that connects the server, before any work happens. Its token cost is a per-message tax.

info 6 findings

Advisory only — these deduct nothing from the score.

Enum [ALL, AR, AU, AT, BE, BR, CA, CL, DK, FI, FR, DE, HK, IN, ID, IT, JP, KR, MY, MX, NL, NZ, NO, CN, PL, PT, PH, RU, SA, ZA, ES, SE, CH, TW, TR, GB, US] is shared across 2 tools. If not every combination is valid, the schema cannot express it — encode constraints or document the invalid pairs.

When the same enum is reused across tools but not every combination is valid (e.g. not every product supports every tier), the schema cannot say so — the model finds out via runtime errors. Flag shared enums for a validity review.

brave_web_search/properties/country; brave_local_search/properties/country

Enum [ar, eu, bn, bg, ca, zh-hans, zh-hant, hr, cs, da, nl, en, en-gb, et, fi, fr, gl, de, gu, he, hi, hu, is, it, jp, kn, ko, lv, lt, ms, ml, mr, nb, pl, pt-br, pt-pt, pa, ro, ru, sr, sk, sl, es, sv, ta, te, th, tr, uk, vi] is shared across 2 tools. If not every combination is valid, the schema cannot express it — encode constraints or document the invalid pairs.

When the same enum is reused across tools but not every combination is valid (e.g. not every product supports every tier), the schema cannot say so — the model finds out via runtime errors. Flag shared enums for a validity review.

brave_web_search/properties/search_lang; brave_local_search/properties/search_lang

Enum [es-AR, en-AU, de-AT, nl-BE, fr-BE, pt-BR, en-CA, fr-CA, es-CL, da-DK, fi-FI, fr-FR, de-DE, zh-HK, en-IN, en-ID, it-IT, ja-JP, ko-KR, en-MY, es-MX, nl-NL, en-NZ, no-NO, zh-CN, pl-PL, en-PH, ru-RU, en-ZA, es-ES, sv-SE, fr-CH, de-CH, zh-TW, tr-TR, en-GB, en-US, es-US] is shared across 3 tools. If not every combination is valid, the schema cannot express it — encode constraints or document the invalid pairs.

When the same enum is reused across tools but not every combination is valid (e.g. not every product supports every tier), the schema cannot say so — the model finds out via runtime errors. Flag shared enums for a validity review.

brave_web_search/properties/ui_lang; brave_local_search/properties/ui_lang; brave_place_search/properties/ui_lang

Enum [off, moderate, strict] is shared across 3 tools. If not every combination is valid, the schema cannot express it — encode constraints or document the invalid pairs.

When the same enum is reused across tools but not every combination is valid (e.g. not every product supports every tier), the schema cannot say so — the model finds out via runtime errors. Flag shared enums for a validity review.

brave_web_search/properties/safesearch; brave_local_search/properties/safesearch; brave_place_search/properties/safesearch

Enum [ar, eu, bn, bg, ca, zh-hans, zh-hant, hr, cs, da, nl, en, en-gb, et, fi, fr, gl, de, el, gu, he, hi, hu, is, it, jp, kn, ko, lv, lt, ms, ml, mr, nb, pl, pt-br, pt-pt, pa, ro, ru, sr, sk, sl, es, sv, ta, te, th, tr, uk, vi] is shared across 2 tools. If not every combination is valid, the schema cannot express it — encode constraints or document the invalid pairs.

When the same enum is reused across tools but not every combination is valid (e.g. not every product supports every tier), the schema cannot say so — the model finds out via runtime errors. Flag shared enums for a validity review.

brave_llm_context/properties/search_lang; brave_place_search/properties/search_lang

Enum [application/json, */*] is shared across 2 tools. If not every combination is valid, the schema cannot express it — encode constraints or document the invalid pairs.

When the same enum is reused across tools but not every combination is valid (e.g. not every product supports every tier), the schema cannot say so — the model finds out via runtime errors. Flag shared enums for a validity review.

brave_llm_context/properties/accept; brave_place_search/properties/accept

What this surface does well

4 of the six categories come through clean: naming, descriptions, annotations and design. In practice that means the tool names follow one convention end to end, every tool carries a description long enough to disambiguate it, read and write operations are machine-distinguishable before a client runs them and the surface is shaped around user intents rather than mirrored REST endpoints.

Tool inventory

`brave_place_search` is the most expensive definition at 17,302 tokens — about 68% of the whole surface — against 309 for `brave_summarizer`. Every tool carries a description, ranging from 315 to 1,390 characters.

All 8 declare annotations, so a client can tell a read from a write before running one. Input schemas average 13 top-level parameters and nest 2 levels deep at their worst.

All 8 tools as published, heaviest first. Token counts use the o200k_base encoding and are approximate.

Every tool on this surface with its token cost and schema shape.
ToolTokensDescriptionParamsRequiredDepthAnnotations
brave_place_search17,3021390 chars1701yes
brave_llm_context2,556887 chars2612yes
brave_local_search1,418801 chars1512yes
brave_web_search1,398682 chars1512yes
brave_news_search1,0051175 chars1112yes
brave_image_search817315 chars611yes
brave_video_search691441 chars911yes
brave_summarizer309903 chars311yes

How this compares

Brave Search ranks 4 of 4 scanned Search and Browsing servers, 3 points below the category median of 99.

The closest comparisons in this directory are Hugging Face, Exa and Fetch, which sit nearest on score and face the same kind of surface-design pressure.

Category
Search and Browsing
Rank in category
4
Category median score
99
Category median tokens
2,728
Want this surface fixed, not just measured?

A fix plan turns these findings into an ordered set of changes with the token saving of each one.

Get a fix plan

This page is a static analysis of Brave Search's published tools/list surface on the date shown. It is not a security review, a performance benchmark, or a judgement of the product behind the surface. Read how the score is computed, or browse every audited server.