1. Conduid
  2. AI
  3. Web Search Tool
MCP server · AI

Web Search Tool

An MCP server providing real-time web search capabilities to any AI model.

65Good

Scored 2 hours ago · breakdown

About Web Search Tool

Web Search Tool is an MCP server published by gabrimatic in the AI category: an MCP server providing real-time web search capabilities to any AI model.

The repository has 16 stars and 3 forks, with the last commit yesterday. Recent commit activity is the strongest signal that reported issues will get attention.

Install

From source
git clone https://github.com/gabrimatic/mcp-web-search-tool

This server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.

Ask AI

✦

Ask AI about Web Search Tool

Powered by Claude · Grounded in docs

I know everything about Web Search Tool. Ask me about installation, configuration, usage, or troubleshooting.

Security checks

Static checks derived from the repository 2 hours ago. Heuristics on the source, not an audit.

  • ✓README presentThe repository ships documentation.
  • ✓License declaredUsable under a stated license.
  • ✓Tests presentA test suite exists in the repository.
  • ✓Dependencies pinnedA lockfile pins dependency versions.
  • ✓No dynamic code executionSource scan found no eval, dynamic Function, or shell execution.
  • !Scoped permissionsDoesn't declare a permission scope. Assume it can do anything its process can.

Releases

v2.1.1v2.1.1 · 16 Oct 2026Fixed Calling an unknown tool now returns JSON-RPC error `-32602` (Invalid params), as the MCP tools spec requires, instead of `-32601`. The Codex snippet in `MCP_CLIENTS.md` uses the `[mcp_servers.<name>]` table that Codex reads. The npm…
v2.1.0v2.1.0 · 15 Oct 2026Added npm package** — install and run with `npx -y mcp-web-search-tool`; a tag-triggered workflow publishes future releases through npm trusted publishing. Changed MCP TypeScript SDK v2** — the server now uses…
v2.0.0v2.0.0 · 14 Jul 2026A ground-up overhaul that turns the original single-purpose Brave wrapper into a production-grade web access layer for MCP clients. Closes #1 (Glama listing missing Dockerfile). Added Four new tools**: `news_search`, `image_search`,…

README

MCP Web Search Tool

An MCP server that gives an assistant live web search, full-page reading, and source citations. Stdio transport, pluggable providers, no scraper dependencies.

Claude Desktop Example

CI Node

Quick start · Tools · Configuration · Clients · Security · Changelog


Overview

Five tools: web_search, news_search, image_search, fetch_url, list_providers. Search returns ranked summaries with stable ids; fetch_url reads the page behind any id. Brave Search is the primary provider; DuckDuckGo runs without a key as a fallback.

Requirements

Node.js >= 20.18 (uses native fetch)
npm >= 10
Brave Search API key optional. Without it, DuckDuckGo handles web_search. news_search and image_search require a key.

Quick start

From npm:

npx -y mcp-web-search-tool

Point your MCP client at npx with args ["-y", "mcp-web-search-tool"] and pass BRAVE_API_KEY through the client's env block.

From source:

git clone https://github.com/gabrimatic/mcp-web-search-tool.git
cd mcp-web-search-tool
npm install
cp .env.example .env   # edit BRAVE_API_KEY if you have one
npm run build
npm start

Run with Docker:

docker build -t mcp-web-search .
docker run --rm -i -e BRAVE_API_KEY mcp-web-search

For Claude Desktop, Claude Code, Codex, VS Code, Cursor, or Windsurf integration, see MCP_CLIENTS.md.


Tools

Search tools return an untrusted-content banner, a Markdown rendering for the model, and a fenced JSON block with the structured payload; fetch_url returns the readable page text plus a links block. Errors come back as isError: true content with an actionable message; only unknown-tool calls throw a protocol error.

web_search

Live web search. Use first for current, source-backed answers.

Parameter Type Description
search_term string, required Query string.
provider enum "brave search" or "duckduckgo". Defaults to Brave when a key is set, otherwise DuckDuckGo.
count int (1–20) Number of results. Default 10.
offset int Pagination offset (web only).
cursor string Opaque cursor from a previous response.
freshness string pd (24h), pw (week), pm (month), py (year), or YYYY-MM-DDtoYYYY-MM-DD.
country string ISO country code.
search_lang string UI language, e.g. en.
safesearch enum off, moderate, strict.
include_domains string[] Restrict results to these hosts.
exclude_domains string[] Drop results from these hosts (hostname-suffix match).

news_search

Recent news with source name and publish date. Brave only.

image_search

Image results with thumbnails. Brave only.

fetch_url

Reads a search result or arbitrary http(s) URL. Pass a result id from a previous search (preferred) or a full URL.

Parameter Type Description
id_or_url string A result id (e.g. r_a1b2c3d4e5f6) or a full http(s) URL.
url string Deprecated alias for id_or_url.
max_chars int (200–200 000) Soft cap on returned characters. Default 8000.
cursor string Cursor from a previous response to continue reading.

Returns the page title, readable text (scripts, styles, nav, footer, and aside stripped), the first 25 outbound links, HTTP status, content-type, byte length, and a nextCursor when truncated.

Refuses non-http(s) schemes and any host that resolves to a private, loopback, link-local, multicast, or IPv4-mapped IPv6 private address. Details: SECURITY.md.

list_providers

Returns the registered providers and the current default. Call this once if you are unsure whether news_search or image_search are available in this session.


Configuration

All configuration is environment-driven. Reference: .env.example.

Variable Default Purpose
BRAVE_API_KEY empty Brave Search API key. When unset, DuckDuckGo is used.
MAX_RESULTS 10 Default result count (clamped 1–50).
REQUEST_TIMEOUT 10000 Per-request timeout in ms (1 000–60 000).
DEFAULT_PROVIDER auto Force a specific provider (e.g. duckduckgo).
ALLOW_KEYLESS true When false, the server refuses to start without BRAVE_API_KEY.
CACHE_MAX_ENTRIES / CACHE_TTL_MS 256 / 300000 Search cache.
FETCH_CACHE_MAX / FETCH_CACHE_TTL_MS 128 / 600000 URL-fetch cache.
FETCH_TIMEOUT_MS / FETCH_MAX_BYTES 15000 / 2000000 Per-request budget for fetch_url.
RESULT_ID_CACHE_MAX / RESULT_ID_TTL_MS 2000 / 3600000 How many result ids fetch_url can resolve, and for how long.

Project layout

src/
├── index.ts                    MCP server: tool registry, dispatch, rendering
├── config.ts                   env loader, validation, defaults
├── providers/
│   ├── SearchProvider.ts       abstract contract and shared types
│   ├── SearchProviderFactory   registry and default selection
│   ├── BraveSearchProvider     web/news/images via Brave API
│   └── DuckDuckGoProvider      keyless HTML-lite fallback
├── services/
│   ├── SearchService.ts        provider dispatch, LRU+TTL cache
│   └── FetchService.ts         safe URL fetch, readable extraction
└── utils/
    ├── http.ts                 native fetch, retry/backoff/timeout
    ├── html.ts                 zero-dep HTML to text + links
    ├── cache.ts                LRU+TTL cache
    └── ids.ts                  stable result-id minting and resolution
tests/                          vitest suite

Add a provider

import { SearchProvider, SearchResponse, SearchOptions } from './SearchProvider.js';

export class MyProvider extends SearchProvider {
  getName() { return 'My Provider'; }
  override requiresApiKey() { return true; }
  async search(query: string, _opts: SearchOptions = {}): Promise<SearchResponse> {
    const out = this.emptyResponse(query, 'web');
    out.results = mapped; // shape: SearchResult[]
    return out;
  }
}

Register it in SearchProviderFactory.setupDefaults. Result ids are minted automatically when you call mintResultId(url) on each entry.


Development

npm run dev          # tsx watch mode
npm test             # vitest suite
npm run lint         # eslint + prettier
npm run typecheck    # tsc --noEmit
npm run format
npm run build

CI runs lint, format check, type check, build, and tests on Node 22 and 24; a Docker image build runs when the image inputs change. Tests cover the LRU+TTL cache, HTML extractor, DuckDuckGo parser, search-service caching, HTTP retry/backoff, SSRF guard, domain match, and the result-id resolver.


Example prompts

  • "What are analysts saying about the MVP race after tonight's NBA games?"
  • "Summarise the top three results for RAG benchmarks 2025 and pull the abstract from the first paper."
  • "Find images of the Webb telescope's latest deep field, then open the NASA page and quote the caption."
  • "What's the weather in Berlin right now?"

License

MIT License

Developer

By Soroush Yousefpour

© All rights reserved.

YouTube Video

A short demo of MCP Web Search Tool with Claude:

Claude + MCP Web Search – Live Demo

Medium Article

Background on the project and how it works:

Deep Dive into MCP Web Search Tool

Support

README fetched from the repository 2 hours ago. The original is authoritative.

Questions

About Web Search Tool

How do I install Web Search Tool?

No package has been published for this server, so install it from source: clone the repository and follow its README.

Is Web Search Tool safe to use with an AI agent?

Its trust score is 65 out of 100 (good). It passes 5 of the 6 static security checks run so far; the failures are listed above. It has no ConduID identity yet, so agent calls to it are not receipted.

Is Web Search Tool still maintained?

Yes — the latest release is v2.1.1 (16 Oct 2026), and the last commit was yesterday. The repository has 16 stars.