Skip to main content
Glama
micaelmalta

Websearch MCP Server

by micaelmalta

Websearch MCP Server

An MCP server for web search and page fetching. Converts HTML to clean markdown using html-to-markdown (Rust-based, ~200 MB/s), cutting token usage by ~60% when LLMs consume web content.

No API keys required — search is powered by DuckDuckGo.

Token Savings

Run uv run python benchmark.py to reproduce. Results from fetching real pages:

Page

HTML tokens

MD tokens

Saved

GitHub Blog

90,829

50,733

44%

Hacker News

11,884

4,381

63%

MDN — JavaScript

51,862

23,326

55%

BBC News

123,997

28,918

77%

Go pkg — net/http

119,994

60,344

50%

Python docs — asyncio

6,686

2,405

64%

Rust Lang

5,107

1,515

70%

Total

410,359

171,622

58%

At Sonnet pricing ($3/M input tokens), that's $0.72 saved per batch of 7 pages.

Tools

Tool

Description

websearch_search

Search the web via DuckDuckGo

websearch_fetch_page

Fetch a URL and return content as markdown

websearch_search_and_fetch

Search + fetch top results in one call

Parameter

Type

Default

Description

query

str

required

Search query

max_results

int

10

Number of results (1–20)

region

str

"wt-wt"

Region code ("us-en", "wt-wt" for global)

websearch_fetch_page

Parameter

Type

Default

Description

url

str

required

URL to fetch

max_chars

int

20000

Truncate output (1,000–100,000)

extract_metadata

bool

False

Include YAML frontmatter (title, meta tags)

heading_style

str

"atx"

"atx" (#) or "underlined"

websearch_search_and_fetch

Parameter

Type

Default

Description

query

str

required

Search query

max_results

int

3

Pages to fetch (1–5)

max_chars_per_page

int

5000

Max characters per page (1,000–50,000)

Setup

Requires uv.

uv sync

Usage

MCP Inspector (dev)

uv run mcp dev server.py

Claude Code

claude mcp add websearch -- uv run --directory /path/to/mcp-websearch-server python server.py

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "websearch": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/mcp-websearch-server", "python", "server.py"]
    }
  }
}

Benchmark

uv run python benchmark.py

Fetches a set of real pages, counts tokens with tiktoken (cl100k_base), and reports HTML vs markdown savings with cost estimates for Sonnet and Opus pricing.

Dependencies

  • mcp — FastMCP framework

  • httpx — async HTTP client

  • html-to-markdown — Rust-based HTML-to-Markdown converter

  • ddgs — DuckDuckGo search (no API key)

  • truststore — system certificate store for SSL

  • tiktoken — token counting (dev dependency, for benchmark)

Available Tools

3 tools
websearch_fetch_pageA
Read-onlyIdempotent

Fetch a URL and return its content as clean markdown. Uses html-to-markdown for high-performance conversion that dramatically reduces token usage.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL to fetch
extract_metadataNoInclude YAML frontmatter with page metadata
heading_styleNoHeading style: "atx" (#) or "underlined"atx
max_charsNoMaximum characters in output

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, non-destructive, idempotent, and open-world behavior. The description adds valuable context beyond annotations by specifying the conversion method ('html-to-markdown'), performance aspect ('high-performance'), and token usage reduction, which helps the agent understand practical implications. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose and followed by implementation details and benefits. Every sentence adds value: the first defines the tool's function, and the second explains the conversion method and efficiency gains, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity, rich annotations (covering safety and behavior), and the presence of an output schema (which handles return values), the description is complete enough. It covers the purpose, method, and key benefits, leaving structured fields to detail parameters and outputs, making it well-rounded for agent use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all parameters. The description does not add any parameter-specific details beyond what the schema provides, such as explaining URL validation or metadata content. It only mentions the overall output format ('clean markdown'), which aligns with the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('fetch a URL'), resource ('its content'), and transformation ('as clean markdown'), distinguishing it from siblings like websearch_search (which likely returns search results) and websearch_search_and_fetch (which combines search and fetch). It explicitly mentions the conversion method ('html-to-markdown') and benefit ('dramatically reduces token usage').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by stating it fetches a URL and converts to markdown, but it does not explicitly say when to use this tool versus alternatives like websearch_search_and_fetch. It mentions the benefit of reduced token usage, which provides some context, but lacks clear guidance on prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

websearch_search_and_fetchA
Read-only

Search the web and fetch top result pages as markdown. Combines search + fetch in one call for efficiency.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query
max_resultsNoNumber of top results to fetch
max_chars_per_pageNoMaximum characters per fetched page

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety (readOnlyHint: true, destructiveHint: false) and idempotency (idempotentHint: false), but the description adds useful context about efficiency and the combined operation. It doesn't contradict annotations and provides additional behavioral insight, though it could mention rate limits or authentication needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded, consisting of two sentences that efficiently convey the tool's purpose and usage without unnecessary details. Every sentence adds value, making it well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity, rich annotations (including readOnlyHint, destructiveHint, idempotentHint, openWorldHint), and the presence of an output schema, the description is complete enough. It covers purpose, efficiency, and differentiation from siblings, which is sufficient for an agent to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents parameters. The description mentions 'top result pages' and 'fetch as markdown,' which adds some context beyond the schema, but doesn't provide detailed semantics. Baseline 3 is appropriate as the schema handles most parameter information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with specific verbs ('search the web' and 'fetch top result pages as markdown') and distinguishes it from siblings by noting it 'combines search + fetch in one call for efficiency.' This explicitly differentiates it from websearch_search and websearch_fetch_page.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance by stating it's for efficiency when combining search and fetch operations, implying alternatives (using separate search and fetch tools) and when to use this tool (for combined operations). This helps the agent choose between this tool and its siblings.

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.

  1. 3 tool updatesv0.1.0
    • First observedwebsearch_fetch_page
    • First observedwebsearch_search
    • First observedwebsearch_search_and_fetch

TDQS

A4.1/5.0

Scored across 3 tools

Disambiguation4/5

The tools are mostly distinct with clear purposes: websearch_search for search results, websearch_fetch_page for fetching specific URLs, and websearch_search_and_fetch as a combined operation. However, websearch_search_and_fetch overlaps with the other two tools, which could cause some confusion about when to use it versus separate calls.

Naming Consistency5/5

All tool names follow a consistent snake_case pattern with a 'websearch_' prefix and descriptive verb_noun combinations (e.g., fetch_page, search, search_and_fetch). This makes the set predictable and easy to understand.

Tool Count5/5

With 3 tools, this server is well-scoped for web search functionality. Each tool serves a clear purpose: searching, fetching, and a combined operation. This count is appropriate and avoids unnecessary complexity.

Completeness4/5

The toolset covers core web search operations effectively: searching, fetching content, and a combined workflow. A minor gap is the lack of advanced search features like filtering or pagination, but agents can work around this with the provided tools.

Related MCP Connectors