search-boost-mcp
search-boost-mcp
Multi-Engine-Web-Suche MCP-Server für Coding-Agenten. Eine CLI-Installation bindet ihn in Cursor, Cursor CLI, Codex, Claude Code, Grok Build und Antigravity ein.
search-boost-Familie
Projekt
Für
Link
search-boost (dieses Repo)
Cursor · Codex · Claude · Grok · Antigravity via MCP
Sie sind hier
DeepSeek Harness Bundle-Plugin
pi Erweiterung
Suchmaschinen sind in lib/search/ eingebunden (ursprünglich von dsh-search-boost): In der kostenlosen Schicht laufen Bing, DuckDuckGo, Yahoo und Exa-frei parallel; die api-Schicht fügt Antigravity CLI (wenn verfügbar) und beliebig viele tastaturgestütze Tavily-/Brave-/Exa-Engines hinzu, die Sie konfigurieren (ein Schlüssel reicht; alle drei werden für die beste Fusion empfohlen). Ebenfalls enthalten: X/Twitter-Fallback, Jina-Seitenabruf und Deep-Research-Durchläufe.
Chinesische Dokumentation → README_zh.md
Neu in v0.1.4
Single-Engine-API-Schicht – die API-Stufe verwendet die von Tavily/Brave/Exa, die Sie konfigurieren oder aktivieren; es sind nicht alle drei Schlüssel erforderlich.
Pro-Engine-Routing – optionale
enabledEnginesoder pro-Engineenabled: falsein~/.search-boost-keys.json.Teilschlüssel-Meldungen – doctor, status, keys-Wizard und
fused_searchwarnen, wenn weniger als drei schlüsselbasierte Engines aktiv sind, und empfehlen, alle drei zu konfigurieren.
Neu in v0.1.2
Eigenständiger Engine-Pool in
lib/search/: Bing + DuckDuckGo + Yahoo + Exa-frei für allgemeine Suche; derselbe Pool versorgt denx_search-Fallback mitsite:-Abfragen.x_search-Fallback fügt automatischsite:x.comfür die Domainensuche über mehrere Engines hinzu, sodass der Schlüsselwortmodus ohne XAI-Anmeldeinformationen funktioniert.Keine externe dsh-Repo- oder npm-Abhängigkeit – die Engine-Logik ist in diesem Repository enthalten.
Installation (empfohlen)
Erfordert Node ≥ 22.13.
npm install -g search-boost-mcp
search-boost setup # interactive: keys → layer → agents
# or non-interactive:
search-boost install -y # all detected agentsStarten Sie jeden Agenten nach der Installation neu, damit MCP neu geladen wird.
Einzeiler nach Agent
search-boost install -t cursor -y
search-boost install -t codex,claude -y --auto-allow
search-boost install -t grok -y --auto-allow
search-boost install -t antigravity --workspace --auto-allow -yVorschau ohne Schreiben: search-boost install --dry-run -y
Installation überprüfen
search-boost doctor # health checks (offline, pass/warn/fail)
search-boost doctor --json # machine-readable report for CI/scripts
search-boost status # install dashboard (keys, layer, agents)Exit-Codes: 0 fehlerfrei · 1 Fehler (oder Warnungen mit --strict) · 2 nur Warnungen.
Optional: search-boost doctor --probe fügt einen Live-Such-Smoke-Test hinzu (benötigt Netzwerk; Phase 2).
Dann bestätigen Sie in Ihrem Agent:
Agent | Kurzprüfung |
Cursor | Einstellungen → MCP → |
Cursor CLI | Gleicher MCP-Eintrag in |
Codex |
|
Claude Code | MCP-Bedienfeld zeigt |
Grok Build |
|
Antigravity | MCP-Konfiguration enthält |
Wenn Tools erscheinen, Aufrufe jedoch fehlschlagen, führen Sie search-boost serve in einem Terminal aus, um Startfehler zu sehen.
Installations-Flags (Kurzreferenz)
Flag | Wirkung |
| Welche(n) Agent(en) einbinden ( |
| Nicht-interaktiv: überspringt den Schlüssel-/Ebenen-Assistenten, verwendet |
| Immer noch nicht-interaktiv für dieses Ziel und ersetzt dennoch standardmäßig die native Suche – impliziert jedoch nicht |
| Genehmigt search-boost MCP-Tools vorab in der Agentenkonfiguration (Cursor CLI Allowlist, Codex |
| Deaktiviert oder behält die integrierte Websuche bei, wo der Agent einen Schalter unterstützt (Codex |
| Aktionen anzeigen, ohne Dateien zu schreiben |
Für die vollständige Erstkonfiguration (API-Schlüssel + Ebenenauswahl) führen Sie search-boost setup oder search-boost install ohne -y aus.
Related MCP server: gemini-search-mcp
Was Sie erhalten
MCP-Tool | Zweck |
| Parallele Suche über mehrere Engines, Deduplizierung, Cross-Ranking |
| Vollständiger Seitentext (Jina + HTML-Fallback, optionaler |
| X/Twitter-Stichwort / Benutzer / Thread |
| Ein Durchlauf pro Aufruf – mit |
|
|
| Cache-Treffer, Engine-Verfügbarkeit, Diagnose |
Auch: Ressource search-boost://policy · Prompt search_routing
Ebenen
free – Bing + DuckDuckGo + Yahoo + Exa-frei; keine API-Schlüssel.
api – Engines der Kostenlos-Stufe plus Antigravity CLI (wenn verfügbar) und beliebige von Tavily / Brave / Exa, die Sie konfigurieren (ein Schlüssel funktioniert; alle drei für die beste Cross-Engine-Fusion empfohlen)
Schlüssel: search-boost config keys → ~/.search-boost-keys.json (Legacy ~/.dsh-search-boost-keys.json wird weiterhin gelesen; oder env TAVILY_API_KEY, BRAVE_API_KEY, EXA_API_KEY). Optionales Routing: enabledEngines: ["exa"] oder "engines": { "brave": { "enabled": false } } in der Schlüsseldatei.
Schlüssel erhalten: Tavily · Brave Search API · Exa
X/Twitter-Authentifizierung (optional): Verbessert die offizielle x_search, wenn Anmeldeinformationen vorhanden sind. Gespeichert in ~/.search-boost-xauth.json (Legacy ~/.dsh-search-boost-xauth.json wird weiterhin gelesen) oder via XAI_API_KEY / Grok /x-login. Dateipfad überschreiben: SEARCH_BOOST_XAUTH_FILE.
Konfigurationsdatei-Überschreibungen: SEARCH_BOOST_KEYS_FILE, SEARCH_BOOST_LAYER_FILE, SEARCH_BOOST_XAUTH_FILE (optionale Umgebungsvariablen, die auf benutzerdefinierte Pfade verweisen).
CLI-Spickzettel
Befehl | Wirkung | ||
| Interaktives TUI | ||
| Erstkonfiguration (Schlüssel + Ebene + Installation) | ||
| MCP + Prompts in Agenten einbinden / entfernen | ||
| MCP stdio-Server ausführen (von Agenten verwendet) | ||
| Schlüssel, Ebene, konfigurierter Status pro Agent | ||
`search-boost doctor [--quick | --probe] [--json] [--strict]` | Konfigurations-/Agenten-/Engine-Gesundheitschecks mit bestanden/warnen/fehlgeschlagen | |
| Schlüssel, Ebene, Installationsstatus pro Agent (kein Urteil) | ||
`search-boost config keys | layer | search` | Schlüssel, Standardschicht, natives Suchersatz |
| MCP-Ausschnitt ohne Schreiben anzeigen | ||
| Maschinenlesbare Agentenliste |
Installations-Flags: -t cursor,codex,…|auto|all · -y (nicht-interaktiv; impliziert --auto-allow + --replace-native) · --dry-run · --auto-allow (MCP-Tools vorab genehmigen – siehe Tabelle oben) · --replace-native / --keep-native · --scope user|project (Grok) · --workspace (Antigravity .agents/)
Unterstützte Agenten
Agent | MCP-Konfiguration | Installiert außerdem |
Cursor IDE |
| Hook, Skill |
Cursor CLI |
| Hook, Skill (CLI-Variante), optionales CLI-Auto-Allow |
Codex CLI |
| AGENTS.md, Skill |
Claude Code |
| CLAUDE.md, Skill, Berechtigungen |
Grok Build |
| Regel, Skill · grok-plugin |
Antigravity |
| AGENTS.md, GEMINI.md, Skill, optionaler Workspace |
Prompts verwenden Ermessensspielraum-des-Modells-Formulierungen (Suche, wenn Sie sich entscheiden – nicht bei jedem Zug erzwungen). Siehe agents/ für agentspezifische Vorlagen.
Native Websuche: Codex web_search und Claude WebSearch können mit --replace-native deaktiviert werden (Standard im nicht-interaktiven Modus). Cursor / Antigravity verlassen sich nur auf Skill- und Hook-Präferenz. Grok Native-Browsen bleibt eingeschaltet.
Antigravity + agy CLI: Auf der api-Ebene tritt die optionale Antigravity-CLI-Engine (agy im PATH) nur in den mittleren und komplexen fused_search-Stufen auf – nicht bei einfachen Suchvorgängen. Sie ist von einer lokalen Anmeldung und dem Plattform-Kontingent abhängig; Timeouts betragen ca. 45 s.
Grok-Plugin
Das Plugin wird im npm-Paket ausgeliefert (MCP per portablem npx, plus Skill).
Eine erneute Installation ist idempotent: search-boost install -t grok entfernt vor dem Schreiben eines neuen Blocks jeglichen vorherigen [permission]-Block von search-boost (markiert oder veraltet), sodass doppelte [permission]-Schlüssel den Start von grok nicht beeinträchtigen können. Wenn [ui] permission_mode = "always-approve" bereits gesetzt ist, überspringt --auto-allow das Einfügen von [permission] (always-approve genehmigt MCP-Tools global). search-boost doctor warnt vor doppelten oder redundanten Berechtigungsblöcken.
Aus einem Git-Clone (Repository-Stamm):
grok plugin install ./grok-plugin --trust
search-boost install -t grok -y --auto-allowNach npm install -g search-boost-mcp (kein Clone erforderlich):
# bash / macOS / Linux
grok plugin install "$(npm root -g)/search-boost-mcp/grok-plugin" --trust
# Windows PowerShell
grok plugin install "$(npm root -g)\search-boost-mcp\grok-plugin" --trust
search-boost install -t grok -y --auto-allowDie gebündelte .mcp.json verwendet npx -y search-boost-mcp serve, sodass das Plugin auf jedem Rechner mit Node ≥ 22.13 funktioniert.
Details → grok-plugin/README.md
Fehlerbehebung
Symptom | Was zu tun ist |
Ist search-boost in Ordnung? |
|
Installation schlägt sofort fehl | Node ≥ 22.13 ( |
MCP-Server fehlt im Agent | Installation erneut ausführen, Agent neu starten, |
Toolaufrufe blockiert / Genehmigung bei jedem Schritt | Erneut mit |
Keine Ergebnisse / leere Engines |
|
Netzwerk-/Proxy-Probleme | Phase 2: |
MCP startet nicht |
|
Grok-Plugin MCP startet nicht |
|
| Doppelter |
Antigravity | Erfordert api-Ebene, |
Timeouts / Abruffehler | Unternehmensproxy oder Firewall blockiert möglicherweise Bing/DDG/Jina; |
Entwicklung
git clone https://github.com/Mr-remon219/search-boost.git
cd search-boost && npm install
npm run check && npm run test:install && npm run smoke
node cli.mjs install --dry-run -yLokale Clone-Installationen schreiben node /path/to/cli.mjs serve (nicht npx). Es ist kein paralleles Checkout oder SEARCH_BOOST_DSH_ROOT erforderlich.
Lizenz
MIT
Links: Probleme · dsh-search-boost · pi-search-boost
Freundlicher Link: LINUX DO 社区
Available Tools
5 toolsfetch_pageFetch PageARead-only
Read a known HTTP(S) URL without searching again. Returns readable HTML or locally extracted PDF text, with retrieval route and any extraction limitations. Long bodies use bounded windows; continue from nextOffset using the cached read, not a new request. A focus miss is not evidence of absence: retry without focus. Binary bodies and PDFs with no extractable text return errors, not page text. Network safety, proxy policy, cancellation and size limits remain enforced through all supported fallbacks. This is not an authenticated browser.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | http(s) URL to fetch | |
| focus | No | Keep matching paragraphs; omit for the readable body. Output may still be windowed; inspect nextOffset and limitations | |
| offset | No | Character offset into the page body (default 0); pass nextOffset from a previous call to continue a long page from cache |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| via | Yes | |
| offset | No | |
| tookMs | Yes | |
| content | Yes | |
| focusMiss | No | |
| truncated | No | |
| limitation | No | |
| nextOffset | No | |
| totalChars | No | |
| windowNote | No | |
| word_count | Yes | |
| requestedUrl | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, openWorld, non-destructive); the description adds substantial behavior beyond them: binary bodies and text-less PDFs return errors, long bodies are windowed and continued from cache, network safety/proxy/cancellation/size limits persist through fallbacks, and it is explicitly not an authenticated browser. These are exactly the operational caveats an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then dense but purposeful sentences covering return format, pagination, focus retry, error cases, and the auth boundary. No filler and no repetition of the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is not required, and the description still covers error outcomes, extraction limitations, pagination continuation, and the unauthenticated boundary. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real semantics: offset continuation should use the cached read rather than a new request, and focus should be dropped on a miss because a miss is not evidence of absence. That goes beyond the schema's parameter descriptions without restating them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb (read/fetch) and resource (a known HTTP(S) URL) plus a distinguishing constraint ('without searching again') that separates it from the search siblings. It also states the return shape (readable HTML or locally extracted PDF text with retrieval route). An agent can select this over fused_search or x_search without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly sets the context of use (a URL you already know, avoiding a re-search) and gives concrete recovery guidance: 'A focus miss is not evidence of absence: retry without focus.' It stops short of explicitly naming the search siblings as the alternative when the URL is unknown, so routing is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fused_searchFused Web SearchARead-only
Use for the vast majority of public-web research tasks, from precise lookups to difficult investigations. This general-purpose multi-engine search does not require Jev. If adaptive_search is unavailable, disabled or Jev is not configured, use enabled fused_search normally; do not delay research or require Jev setup. When both tools are available, choose fused_search for direct retrieval, varied query angles or explicit source control. Prefer adaptive_search for higher-quality intent-guided evidence selection when a medium-to-high difficulty or uncertain question benefits from screening noisy or mixed-relevance results. Choose by the evidence need, not merely by which tools are configured. Returns ranked extracts, source attribution and execution diagnostics, including failures and warnings. Normally omit engines; request-local choices do not change persistent defaults. Add X community voices when relevant; use x_search for X-only tasks. Scores do not verify claims, and multiple engines finding the same page do not independently corroborate it. Use fetch_page to read decisive sources when extracts are insufficient. Optional live status: search-boost://capabilities Resource.
| Name | Required | Description | Default |
|---|---|---|---|
| layer | No | Deprecated compatibility alias: free→free pool, api→hybrid pool; engine_pool takes precedence; not persisted | |
| query | Yes | Search query (site:, -site:, "phrase", A OR B) | |
| engines | No | Optional exact engine selection overriding engine_pool; unavailable or disabled engines are skipped with warnings | |
| queries | No | Distinct query angles, not paraphrases; complexity caps total variants at 1/2/3, including query and OR alternatives | |
| ranking | No | Final engine-weight preset only; default balanced | |
| recency | No | Favor recent dated results; omit for historical or version-pinned documentation | |
| community | No | Add X developer/community voices when relevant; default false; shares final max_results | |
| min_score | No | Minimum consensus-v2 quality score; old thresholds need recalibration, default 0 | |
| complexity | No | Budget, query variants and depth only; default medium | |
| engine_pool | No | Which engines to search. Omitted: compatibility layer free→free, api→hybrid | |
| max_results | No | Max results (default 6) | |
| engine_weights | No | Override preset engine weights; zero still calls the engine. Never enables or selects engines | |
| exclude_domains | No | Exclude these hostnames from results | |
| include_domains | No | Restrict results to these hostnames, e.g. nodejs.org; useful for official sources |
Output Schema
| Name | Required | Description |
|---|---|---|
| tier | Yes | |
| layer | Yes | |
| query | Yes | |
| tookMs | Yes | |
| ranking | Yes | |
| results | Yes | |
| cacheHit | Yes | |
| warnings | No | |
| enginePool | Yes | |
| engineStats | No | |
| enginesUsed | No | |
| resultCount | Yes | |
| scoreVersion | Yes | |
| communityUsed | Yes | |
| effectiveWeights | Yes | |
| enginesRequested | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, openWorldHint, non-destructive), and the description adds substantial behavior beyond them: returns ranked extracts plus source attribution and execution diagnostics including failures/warnings, scores do not verify claims, agreement across engines is not independent corroboration, request-local choices do not alter persistent defaults, and disabled engines are skipped with warnings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary use case and the routing decision, and most sentences carry distinct information. However, it runs long and contains mild redundancy, e.g. 'do not delay research or require Jev setup' restates the preceding clause and 'choose by the evidence need' restates the routing rule already given.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter tool with nested objects, enums, and an output schema, the description covers routing, fallbacks, parameter defaults, return contents, and caveats about interpreting results. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description still adds non-obvious meaning: engines should normally be omitted, request-local selections are not persisted, community adds X voices and shares the final max_results budget, and engine_pool takes precedence over the deprecated layer alias.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('general-purpose multi-engine search') and explicitly distinguishes itself from siblings: x_search for X-only tasks, fetch_page for reading decisive sources, and adaptive_search for intent-guided evidence selection. An agent can route between these without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('vast majority of public-web research tasks', 'direct retrieval, varied query angles or explicit source control'), explicit when-to-prefer-the-alternative (adaptive_search for medium-to-high difficulty or noisy results), and explicit fallback behavior if Jev is unavailable. The selection criterion is stated as a principle ('choose by the evidence need') rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_layerSearch LayerA
Inspect the current search layer with layer=show (default, no change). layer=free or api persists a new default: only change it when authorized. free = free — compatibility default engine_pool=free (keyless). api = api — compatibility default engine_pool=hybrid (keyless plus configured APIs). For a single search, use fused_search.engine_pool instead; legacy api maps to hybrid, not the strict api pool.
| Name | Required | Description | Default |
|---|---|---|---|
| layer | No | show (default) reads current state; free/api persist a new default and require authorization |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=false and destructiveHint=false, but the description adds critical behavioral context: layer=show causes no change, while free/api persist a new default and require authorization. It also discloses the compatibility mapping (legacy api maps to hybrid, not strict api pool), which goes beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but mostly earns its length, with the default behavior and key warning front-loaded. The 'free = free' and 'api = api' phrasing is slightly redundant and could be tightened, but it remains efficient and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter, full schema coverage, and no output schema, the description covers all essential context: default behavior, persistence side effects, authorization requirement, engine_pool mapping, and the alternative tool for single searches. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaning beyond the enum descriptions by explaining the engine_pool implications of each value: free maps to engine_pool=free (keyless), api maps to engine_pool=hybrid, and legacy api does not map to the strict api pool. This is valuable semantic nuance that the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (the search layer) and a clear action set: inspect with layer=show or persist a new default with free/api. It also explicitly differentiates this tool from fused_search, making its purpose and scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: use layer=show to inspect, only change the default when authorized, and for a single search use fused_search.engine_pool instead. This routes the agent to the correct sibling in the exact condition that matters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_statsSearch StatsARead-only
Read-only search diagnostics: cache activity, engine configuration readiness and recent searches. Inspect result warnings as well; empty results do not prove absence or authorize changing credentials, permissions or defaults.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| layer | Yes | |
| recent | Yes | |
| engines | Yes | |
| xSource | Yes | |
| cacheHits | Yes | |
| startedAt | Yes | |
| xOfficial | Yes | |
| tierCounts | Yes | |
| cacheMisses | Yes | |
| keyedEngines | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false), so the bar is lower. The description adds genuine value beyond them: it discloses the diagnostic surfaces returned and warns that empty results do not authorize changing credentials, permissions, or defaults — a meaningful behavioral caveat for an agent acting on ambiguous results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two front-loaded sentences: the first defines scope, the second carries the caution. No filler, though the second sentence packs three distinct warnings and is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. With zero parameters and annotations covering the safety profile, the description supplies everything an agent needs to call this correctly, including the caveat about interpreting empty results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline of 4 applies; the description neither helps nor hurts parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete resource and enumerates what it exposes: cache activity, engine configuration readiness, and recent searches. It clearly reads as a diagnostics tool, distinct from the search/retrieval siblings (fused_search, fetch_page, search_layer), though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives interpretive guidance ('inspect result warnings', 'empty results do not prove absence') but never states when to call this tool versus the search siblings or when not to. Usage is implied by the diagnostics framing rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
x_searchX (Twitter) SearchARead-only
Find X/Twitter posts, account material or available thread content. Credential-free retrieval is supported; configured authentication can improve coverage. Results include source attribution and diagnostics. Author/date filters require verifiable metadata; unverified candidates are omitted. Coverage may be incomplete, stale or empty. A post sample does not establish platform-wide sentiment, and a thread result need not contain the full conversation.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Mode: keyword (default) or semantic uses query; user uses username; thread uses post_id | |
| query | No | Search terms and X filters (e.g. from:OpenAI), or a natural-language topic for semantic mode | |
| post_id | No | Real X post ID or status URL for type=thread | |
| to_date | No | Inclusive end date, YYYY-MM-DD (UTC) | |
| username | No | X account handle for type=user | |
| from_date | No | Inclusive start date, YYYY-MM-DD (UTC) | |
| max_results | No | Requested result limit, 1–10 | |
| allowed_x_handles | No | Only these authors; mutually exclusive with excluded_x_handles | |
| excluded_x_handles | No | Exclude these authors; mutually exclusive with allowed_x_handles |
Output Schema
| Name | Required | Description |
|---|---|---|
| via | Yes | |
| note | No | |
| items | Yes | |
| tookMs | Yes | |
| results | Yes | |
| cacheHit | No | |
| inFlight | No | |
| warnings | No | |
| engineStats | No | |
| enginesUsed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnly/openWorld/no-destructive, and the description adds substantial context: credential-free vs authenticated coverage, that results include source attribution and diagnostics, that author/date filters require verifiable metadata and unverified candidates are dropped, and that coverage may be incomplete, stale or empty. It even warns that a sample does not establish platform-wide sentiment. This is exactly the kind of behavior disclosure annotations cannot supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six compact sentences, each carrying distinct information (capability, auth, output, filter constraint, coverage limits, interpretation caveat). Front-loaded with the core capability and free of filler, though the telegraphic style gives it a slightly dense, checklist feel.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, and it correctly focuses on credentials, filter constraints and coverage limitations. For a 9-parameter, open-world search tool it covers what an agent needs to call it responsibly, though it never clarifies the division of labor with the sibling search tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter baseline is 3. The description earns above baseline by adding a behavioral constraint on the filter parameters: author/date filters require verifiable metadata and unverified candidates are omitted, which tells the agent those parameters may silently narrow results. It still doesn't add syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Find X/Twitter posts, account material or available thread content'), so an agent immediately knows the domain and operation. It does not, however, distinguish this tool from siblings like fused_search or search_layer, leaving the agent to infer the boundary. Clear but not differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied ('Credential-free retrieval is supported; configured authentication can improve coverage') and caveats are given for when filters work, but there is no explicit when-to-use guidance relative to the sibling search tools. The mode selection (keyword/semantic/user/thread) is left entirely to the schema. Adequate but with a clear gap in routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.2.4- Changed
fetch_page7 fields changed- changed
Input schema / properties / focus / descriptionPrevious value: -"Keep paragraphs matching these terms (optional; full page is returned when omitted)"New value: +"Keep matching paragraphs; omit for the readable body. Output may still be windowed; inspect nextOffset and limitations" - added
Input schema / properties / offsetAdded value: +{ + "description": "Character offset into the page body (default 0); pass nextOffset from a previous call to continue a long page from cache", + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / nextOffsetAdded value: +{ + "type": "number" +} - added
Output schema / properties / offsetAdded value: +{ + "type": "number" +} - added
Output schema / properties / requestedUrlAdded value: +{ + "type": "string" +} - added
Output schema / properties / totalCharsAdded value: +{ + "type": "number" +} - added
Output schema / properties / windowNoteAdded value: +{ + "type": "string" +}
- Changed
fused_search2 fields changed- changed
Input schema / properties / engine_weights / descriptionPrevious value: -"Override preset engine weights; never enables or selects engines"New value: +"Override preset engine weights; zero still calls the engine. Never enables or selects engines" - changed
Input schema / properties / queries / descriptionPrevious value: -"Distinct query angles, not paraphrases; use up to 3 variants"New value: +"Distinct query angles, not paraphrases; complexity caps total variants at 1/2/3, including query and OR alternatives"
- Changed
x_search4 fields changed- added
Output schema / properties / engineStatsAdded value: +{ + "additionalProperties": { + "additionalProperties": false, + "properties": { + "attempts": { + "type": "number" + }, + "errors": { + "type": "number" + }, + "note": { + "type": "string" + }, + "successes": { + "type": "number" + }, + "used": { + "type": "boolean" + } + }, + "required": [ + "used", + "errors" + ], + "type": "object" + }, + "type": "object" +} - added
Output schema / properties / enginesUsedAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / inFlightAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +}
1 tool update
v0.2.3- Removed
adaptive_search
7 tool updates
v0.2.2- Added
adaptive_search - Removed
deep_research - Changed
fetch_page3 fields changed- changed
Input schema / properties / focus / descriptionPrevious value: -"Keep paragraphs matching these terms (~90% token savings)"New value: +"Keep paragraphs matching these terms (optional; full page is returned when omitted)" - added
Output schema / properties / focusMissAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / limitationAdded value: +{ + "additionalProperties": false, + "properties": { + "kind": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "kind", + "message" + ], + "type": "object" +}
- Changed
fused_search37 fields changed- added
Input schema / properties / communityAdded value: +{ + "description": "Add X developer/community voices when relevant; default false; shares final max_results", + "type": "boolean" +} - added
Input schema / properties / complexity / descriptionAdded value: +"Budget, query variants and depth only; default medium" - changed
Input schema / properties / complexity / enumPrevious value: -[ - "auto", - "simple", - "medium", - "complex" -]New value: +[ + "simple", + "medium", + "complex" +] - added
Input schema / properties / engine_poolAdded value: +{ + "description": "Which engines to search. Omitted: compatibility layer free→free, api→hybrid", + "enum": [ + "free", + "api", + "hybrid" + ], + "type": "string" +} - added
Input schema / properties / engine_weightsAdded value: +{ + "additionalProperties": false, + "description": "Override preset engine weights; never enables or selects engines", + "properties": { + "anysearch": { + "minimum": 0, + "type": "number" + }, + "bing": { + "minimum": 0, + "type": "number" + }, + "brave": { + "minimum": 0, + "type": "number" + }, + "ddg": { + "minimum": 0, + "type": "number" + }, + "exa": { + "minimum": 0, + "type": "number" + }, + "exa-free": { + "minimum": 0, + "type": "number" + }, + "tavily": { + "minimum": 0, + "type": "number" + }, + "yahoo": { + "minimum": 0, + "type": "number" + } + }, + "type": "object" +} - changed
Input schema / properties / engines / descriptionPrevious value: -"Engine subset override"New value: +"Optional exact engine selection overriding engine_pool; unavailable or disabled engines are skipped with warnings" - changed
Input schema / properties / engines / items / enumPrevious value: -[ - "bing", - "ddg", - "yahoo", - "exa-free", - "antigravity", - "tavily", - "brave", - "exa" -]New value: +[ + "bing", + "ddg", + "yahoo", + "exa-free", + "anysearch", + "tavily", + "brave", + "exa" +] - added
Input schema / properties / engines / minItemsAdded value: +1 - added
Input schema / properties / exclude_domains / descriptionAdded value: +"Exclude these hostnames from results" - added
Input schema / properties / include_domains / descriptionAdded value: +"Restrict results to these hostnames, e.g. nodejs.org; useful for official sources" - added
Input schema / properties / layer / descriptionAdded value: +"Deprecated compatibility alias: free→free pool, api→hybrid pool; engine_pool takes precedence; not persisted" - added
Input schema / properties / min_scoreAdded value: +{ + "description": "Minimum consensus-v2 quality score; old thresholds need recalibration, default 0", + "minimum": 0, + "type": "number" +} - changed
Input schema / properties / queries / descriptionPrevious value: -"Extra query variants (max 3)"New value: +"Distinct query angles, not paraphrases; use up to 3 variants" - added
Input schema / properties / rankingAdded value: +{ + "description": "Final engine-weight preset only; default balanced", + "enum": [ + "balanced", + "research", + "fresh" + ], + "type": "string" +} - added
Input schema / properties / recency / descriptionAdded value: +"Favor recent dated results; omit for historical or version-pinned documentation" - added
Output schema / properties / communityUsedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / effectiveWeightsAdded value: +{ + "additionalProperties": { + "type": "number" + }, + "type": "object" +} - added
Output schema / properties / enginePoolAdded value: +{ + "enum": [ + "free", + "api", + "hybrid" + ], + "type": "string" +} - added
Output schema / properties / engineStats / additionalProperties / properties / attemptsAdded value: +{ + "type": "number" +} - added
Output schema / properties / engineStats / additionalProperties / properties / successesAdded value: +{ + "type": "number" +} - added
Output schema / properties / rankingAdded value: +{ + "enum": [ + "balanced", + "research", + "fresh" + ], + "type": "string" +} - added
Output schema / properties / results / items / properties / consensusBoostAdded value: +{ + "type": "number" +} - added
Output schema / properties / results / items / properties / contributionsAdded value: +{ + "additionalProperties": { + "type": "number" + }, + "type": "object" +} - added
Output schema / properties / results / items / properties / dateStatusAdded value: +{ + "enum": [ + "known", + "unknown", + "conflicting" + ], + "type": "string" +} - added
Output schema / properties / results / items / properties / engineRanksAdded value: +{ + "additionalProperties": { + "type": "number" + }, + "type": "object" +} - added
Output schema / properties / results / items / properties / evidenceScoreAdded value: +{ + "type": "number" +} - added
Output schema / properties / results / items / properties / idAdded value: +{ + "type": "string" +} - added
Output schema / properties / results / items / properties / kindAdded value: +{ + "enum": [ + "web", + "x" + ], + "type": "string" +} - added
Output schema / properties / results / items / properties / metadataDeltaAdded value: +{ + "type": "number" +} - added
Output schema / properties / results / items / properties / provenanceAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "engine": { + "type": "string" + }, + "published": { + "type": [ + "string", + "null" + ] + }, + "rank": { + "type": "number" + }, + "snippet": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + }, + "variant": { + "type": "string" + } + }, + "required": [ + "engine", + "rank", + "url", + "title", + "snippet", + "published" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results / items / properties / rankScoreAdded value: +{ + "type": "number" +} - added
Output schema / properties / results / items / properties / scoreVersionAdded value: +{ + "type": "string" +} - added
Output schema / properties / results / items / properties / selectionScoreAdded value: +{ + "type": "number" +} - added
Output schema / properties / results / items / properties / usernameAdded value: +{ + "type": "string" +} - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "title", - "url", - "domain", - "snippet", - "score", - "engines", - "published" -]New value: +[ + "title", + "url", + "domain", + "snippet", + "score", + "scoreVersion", + "rankScore", + "evidenceScore", + "consensusBoost", + "metadataDelta", + "engineRanks", + "contributions", + "provenance", + "dateStatus", + "engines", + "published" +] - added
Output schema / properties / scoreVersionAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "query", - "layer", - "tier", - "tookMs", - "cacheHit", - "resultCount", - "results" -]New value: +[ + "scoreVersion", + "query", + "layer", + "tier", + "tookMs", + "cacheHit", + "resultCount", + "enginePool", + "ranking", + "effectiveWeights", + "communityUsed", + "results" +]
- Changed
search_layer1 field changed- added
Input schema / properties / layer / descriptionAdded value: +"show (default) reads current state; free/api persist a new default and require authorization"
- Changed
search_stats2 fields changed- added
Output schema / properties / keyedEnginesAdded value: +{ + "additionalProperties": false, + "properties": { + "configured": { + "type": "number" + }, + "enabled": { + "type": "number" + }, + "enabledNames": { + "items": { + "type": "string" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "configured", + "enabled", + "total", + "enabledNames" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "startedAt", - "layer", - "cacheHits", - "cacheMisses", - "tierCounts", - "engines", - "xOfficial", - "xSource", - "recent" -]New value: +[ + "startedAt", + "layer", + "cacheHits", + "cacheMisses", + "tierCounts", + "keyedEngines", + "engines", + "xOfficial", + "xSource", + "recent" +]
- Changed
x_search10 fields changed- added
Input schema / properties / allowed_x_handlesAdded value: +{ + "description": "Only these authors; mutually exclusive with excluded_x_handles", + "items": { + "type": "string" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / excluded_x_handlesAdded value: +{ + "description": "Exclude these authors; mutually exclusive with allowed_x_handles", + "items": { + "type": "string" + }, + "maxItems": 20, + "type": "array" +} - changed
Input schema / properties / from_date / descriptionPrevious value: -"YYYY-MM-DD"New value: +"Inclusive start date, YYYY-MM-DD (UTC)" - added
Input schema / properties / max_results / descriptionAdded value: +"Requested result limit, 1–10" - added
Input schema / properties / post_id / descriptionAdded value: +"Real X post ID or status URL for type=thread" - added
Input schema / properties / query / descriptionAdded value: +"Search terms and X filters (e.g. from:OpenAI), or a natural-language topic for semantic mode" - changed
Input schema / properties / to_date / descriptionPrevious value: -"YYYY-MM-DD"New value: +"Inclusive end date, YYYY-MM-DD (UTC)" - added
Input schema / properties / type / descriptionAdded value: +"Mode: keyword (default) or semantic uses query; user uses username; thread uses post_id" - added
Input schema / properties / username / descriptionAdded value: +"X account handle for type=user" - added
Output schema / properties / noteAdded value: +{ + "type": "string" +}
2 tool updates
v0.1.6- Changed
deep_research1 field changed- added
Input schema / properties / roundAdded value: +{ + "description": "Research round number (auto-increments when omitted)", + "minimum": 1, + "type": "integer" +}
- Changed
fused_search4 fields changed- added
Output schema / properties / engineStatsAdded value: +{ + "additionalProperties": { + "additionalProperties": false, + "properties": { + "errors": { + "type": "number" + }, + "note": { + "type": "string" + }, + "used": { + "type": "boolean" + } + }, + "required": [ + "used", + "errors" + ], + "type": "object" + }, + "type": "object" +} - added
Output schema / properties / enginesRequestedAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / enginesUsedAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +}
6 tool updates
v0.1.2- First observed
deep_research - First observed
fetch_page - First observed
fused_search - First observed
search_layer - First observed
search_stats - First observed
x_search
TDQS
Scored across 5 tools
Tools have mostly distinct purposes: fused_search for general web search, x_search for X/Twitter, fetch_page for URL reading, and search_stats/search_layer for diagnostics/configuration. However, search_stats and search_layer both touch engine configuration, and fused_search's description references a non-existent adaptive_search tool, which could cause mild confusion.
All names use snake_case, which is consistent. However, the naming patterns vary: fused_search (adjective_noun), fetch_page (verb_noun), x_search (noun_noun), search_stats (noun_noun), search_layer (noun_noun). There is no single predictable verb_noun convention, though names remain readable.
5 tools is well-scoped for a search server: core search, specialized X search, page fetch, diagnostics, and configuration. Each tool has a clear role without redundancy.
The surface covers general search, X search, page fetch, stats, and layer configuration. However, the descriptions reference an adaptive_search tool for higher-quality intent-guided evidence selection that is not present, indicating a notable gap in the intended tool set.
Maintenance
Related MCP Connectors
Free web search for AI agents. No API key required. Hosted MCP in active development.
Search GitHub, npm, PyPI, StackOverflow, ArXiv from one MCP — built for coding agents.
Scrape, crawl and search the web for AI agents via MCP.
Docs: https://docs.keenable.ai/mcp-server Keenable is a free, remote MCP server that gives agents access to the web index. Search the web with ranked results and date/site filters, then fetch any indexed page as clean markdown. Works out of the box with no account or API key.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server that enables coding agents to search X/Twitter and the web through the local Grok CLI, providing better search results than default Codex or Claude search without requiring an API key.24 npm7MIT
- AlicenseAqualityFmaintenanceMCP server for web search powered by Google AI Mode (Gemini). Enables any AI agent to search the web in real-time for free and without rate limits.2183MIT
- AlicenseNot gradedqualityBmaintenanceA zero-config web search and fetch MCP server for LLM agents, featuring multi-backend metasearch, persistent rolling cache, and structured error envelopes for retry-friendly interactions.MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for multi-engine web search and web page fetching, supporting parallel search, content extraction, and optional LLM-powered search summarization and deep search.5MIT