web-search-mcp
A local MCP server that gives Claude Code web search capabilities using DuckDuckGo, enabling discovery of URLs from natural language queries.
README
<div align="center">
<h1>WebSearch-mcp</h1>
<p>A local MCP server that gives Claude Code web search capabilities on any provider.</p>
</div>
Why this exists
Claude Code routed through LiteLLM or AWS Bedrock has WebFetch (client-executed — reads a known URL) but not WebSearch (server-executed — discovers URLs). The distinction:
- WebFetch works on any provider because Claude Code itself makes the HTTP request.
- WebSearch is an Anthropic-run server-side tool that Bedrock doesn't support.
The only missing primitive is discovery — turning a question into a list of relevant URLs. This MCP server fills that gap with a single web_search tool backed by ddgs (DuckDuckGo metasearch). Claude Code's native WebFetch handles reading whatever pages it finds interesting.
How it works
You ask Claude Code a question that needs live web info
│
▼
Claude calls web_search("your query")
│
▼
This MCP server queries DuckDuckGo via ddgs
│
▼
Returns: titles + URLs + snippets
│
▼
Claude uses WebFetch on the URLs it wants to read
Setup
Prerequisites
- Python 3.13+
- uv package manager
- Claude Code CLI
# Install uv (if you don't have it)
curl -LsSf https://astral.sh/uv/install.sh | sh
Install
git clone https://github.com/victormacaubas/web-search-mcp.git
Register with Claude Code
Replace /absolute/path/to/web-search-mcp with the actual path to your clone (run pwd inside the repo to get it):
# Get the path first
cd web-search-mcp && pwd
# Example output: /Users/yourname/projects/web-search-mcp
# Then register (substitute your actual path)
claude mcp add --scope user web-search -- uv run --directory /Users/yourname/projects/web-search-mcp python -m web_search_mcp
(Optional) Then allow-list the tool in ~/.claude/settings.json so claude doesn't always prompt for permission:
{
"permissions": {
"allow": [
"mcp__web-search__web_search"
]
}
}
Restart Claude Code and the web_search tool is available in all sessions.
Usage
Once registered, Claude Code will automatically use it when it needs to search the web. You can also prompt it directly:
"Search for the latest Anthropic MCP documentation"
The tool returns JSON with results:
{
"results": [
{
"title": "Model Context Protocol Documentation",
"url": "https://modelcontextprotocol.io/docs",
"snippet": "The Model Context Protocol (MCP) is an open protocol..."
}
]
}
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
query |
string | required | Search query (1-500 chars) |
max_results |
int | 5 | Number of results (1-20) |
region |
string | null | Locale code (e.g. us-en, br-pt) |
Architecture
src/web_search_mcp/
├── __main__.py # Entry point (python -m web_search_mcp)
├── server.py # FastMCP instance + web_search tool
├── search.py # SearchBackend protocol + DdgsSearchBackend
└── models.py # SearchResult dataclass + WebSearchInput validation
Key design decisions:
- Swappable backend —
SearchBackendis a Python Protocol. The ddgs implementation can be replaced with SearXNG or a licensed SERP API without touching the MCP layer. - stdio transport — Runs as a subprocess of Claude Code. stdout is the MCP wire, stderr for logs.
- No
fetch_urltool — Redundant with Claude Code's native WebFetch.
Development
# Run tests
uv run pytest
# Lint + format check
uv run ruff check . && uv run ruff format --check .
# Type check (strict)
uv run mypy src/
# Run the server directly
uv run python -m web_search_mcp
Swapping the search backend
The SearchBackend protocol has a single method:
class SearchBackend(Protocol):
async def search(self, query: str, max_results: int, region: str | None) -> list[SearchResult]: ...
To use a different backend (e.g., SearXNG, Brave API), implement this protocol and swap the backend variable in server.py.
Disclaimer
This tool is designed for ad-hoc, conversational web searches — a developer occasionally checking docs, verifying a fact, or looking something up mid-session. It is not intended for:
- High-volume agentic workflows that issue dozens of searches per minute
- Production systems with uptime requirements
- Commercial applications at scale
The ddgs library scrapes DuckDuckGo's frontend. At conversational volume (a few searches per hour) this works reliably. At high volume, you will hit rate limits or CAPTCHAs. If your use case requires production-grade search at scale, swap in a licensed Search API via the SearchBackend protocol.
Limitations
- ddgs relies on scraping — If DuckDuckGo changes their frontend, searches break until the package is updated.
- Rate limits — DuckDuckGo can rate-limit or CAPTCHA under heavy load. At conversational volume this is unlikely.
- No guaranteed uptime — This is a personal tool, not a service.
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。