mcpField
M
MCP Web Search Tool

MCP Web Search Tool

Local
medium.comSearch16Updated 2w ago

About MCP Web Search Tool

MCP Web Search Tool is an MCP server that gives AI assistants live web and news search, image search, and readable page extraction. Its provider design uses Brave Search when configured and DuckDuckGo as a keyless web-search fallback.

Key features

  1. 01Live web search with filters
  2. 02Recent news and image search
  3. 03Readable text extraction from URLs
  4. 04Pluggable search providers
  5. 05DuckDuckGo web-search fallback
  6. 06Structured results with stable IDs

Use cases

  1. 01Find current information for an assistant response
  2. 02Search recent news and inspect sources
  3. 03Locate images and read their source pages
  4. 04Retrieve readable content from a URL

MCP support

The MCP server exposes five tools to MCP clients: web_search, news_search, image_search, fetch_url, and list_providers. It uses stdio transport.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"web-search-tool": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"build"
]
}
}
}
Run commanddocker run -i --rm build

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
ocibuild

Tools

No tool list yet

Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.

Details

From the project 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 License: MIT 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 keyoptional. 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.

ParameterTypeDescription
search_termstring, requiredQuery string.
providerenum"brave search" or "duckduckgo". Defaults to Brave when a key is set, otherwise DuckDuckGo.
countint (1–20)Number of results. Default 10.
offsetintPagination offset (web only).
cursorstringOpaque cursor from a previous response.
freshnessstringpd (24h), pw (week), pm (month), py (year), or YYYY-MM-DDtoYYYY-MM-DD.
countrystringISO country code.
search_langstringUI language, e.g. en.
safesearchenumoff, moderate, strict.
include_domainsstring[]Restrict results to these hosts.
exclude_domainsstring[]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.

ParameterTypeDescription
id_or_urlstringA result id (e.g. r_a1b2c3d4e5f6) or a full http(s) URL.
urlstringDeprecated alias for id_or_url.
max_charsint (200–200 000)Soft cap on returned characters. Default 8000.
cursorstringCursor 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.

VariableDefaultPurpose
BRAVE_API_KEYemptyBrave Search API key. When unset, DuckDuckGo is used.
MAX_RESULTS10Default result count (clamped 1–50).
REQUEST_TIMEOUT10000Per-request timeout in ms (1 000–60 000).
DEFAULT_PROVIDERautoForce a specific provider (e.g. duckduckgo).
ALLOW_KEYLESStrueWhen false, the server refuses to start without BRAVE_API_KEY.
CACHE_MAX_ENTRIES / CACHE_TTL_MS256 / 300000Search cache.
FETCH_CACHE_MAX / FETCH_CACHE_TTL_MS128 / 600000URL-fetch cache.
FETCH_TIMEOUT_MS / FETCH_MAX_BYTES15000 / 2000000Per-request budget for fetch_url.
RESULT_ID_CACHE_MAX / RESULT_ID_TTL_MS2000 / 3600000How 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

Buy Me A Book

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.