mcp-web-tools
Allows performing web searches via the Brave Search API as a fallback when Perplexity is not configured.
Allows performing web searches via DuckDuckGo as a final fallback search engine.
Allows performing web searches via a lightweight Google workaround as a secondary fallback.
Allows performing web searches via the Perplexity Search API with ranked snippets and citations.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-web-toolsfetch and extract the content from https://example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Web Tools
This package provides a powerful MCP server to equip LLMs with web access, going beyond naive methods of searching, fetching and extracting content.
Introduction
I created this package out of the frustration that most MCP servers enabling web access to LLMs, didn't perform as well as I hoped. Some of these shortcomings I wanted fix, include:
Good search results without requiring an API key
Sophisticated fetching for more complex JavaScript sites
Extracting content in nicely formatted Markdown
Support for extracting content from PDFs
Support for loading and displaying images
Capture rendered webpage screenshots for visual context
Usage options for advanced cases like loading raw HTML
Related MCP server: web-search-mcp
Installation
Claude Desktop
Claude Code
claude mcp add web-tools uvx mcp-web-toolsOr to also set the Brave Search API key:
claude mcp add web-tools uvx mcp-web-tools -e BRAVE_SEARCH_API_KEY=<key>Provide a Perplexity Search API key to prioritize their fresh, citation-rich index:
claude mcp add web-tools uvx mcp-web-tools -e PERPLEXITY_API_KEY=<key>You can mix both environment variables to fall back from Perplexity to Brave seamlessly.
Internals
The package is written in Python using powerful libraries and services under the hood to improve results.
Searching
We use the Perplexity Search API when a PERPLEXITY_API_KEY is configured. It delivers ranked snippets with citations from Perplexity's continuously refreshed index. If no Perplexity key is available, we fall back to the Brave Search API (via BRAVE_SEARCH_API_KEY), then a lightweight Google workaround, and finally DuckDuckGo. While we recommend adding at least one API key, the chained fallbacks continue working for most workloads.
Fetching
The fetching of web content is based on Zendriver, a fork of nodriver for next level webscraping and performance. It should stay undetected for most anti-bot solutions and fetch content even from complex JS-based sites.
Extracting
For web extraction, we use Trafilatura which consistently outperforms other alternatives for extracting content from HTML pages. For PDFs, we use PyMuPDF4LLM which similarly extracts content in an easy-to-read format for LLMs, with advanced layout support.
Screenshots
Rendered page previews are powered by Zendriver. The view_website tool navigates to a URL in a headless Chromium session and returns the resulting page as a PNG screenshot. By default only the current viewport is captured, but callers can request a full-page image by setting the full_page argument to true.
Contributing
While it's impossible to support all pages and layouts, we thrive to make this package better over time. For unsupported sites, problems, or feature requests open an issue.
CI, Releases, and Publishing
This repo includes a GitHub Actions workflow that:
Runs tests via
uvon PRs and pushes tomain.On push to
main, ifproject.versioninpyproject.tomlchanged, it:Builds distributions with
uv build.Creates a GitHub Release tagged
v<version>with autogenerated notes.Publishes the package to PyPI using
uv publish.
Merge a PR that bumps
project.versioninpyproject.tomlto trigger a release.
Rollback:
If a release was created erroneously, delete the GitHub Release and tag
v<version>.Yank the version on PyPI if needed.
Available Tools
3 toolsfetch_urlB
Universal content loader that fetches and processes content from any URL. Automatically detects content type (webpage, PDF, or image) based on URL.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The remote URL to load content from. | |
| offset | No | Character/content offset to start from (for text content). | |
| raw | No | Return raw content instead of cleaned Markdown when possible. | |
| fetch_provider | No | Choose the fetching backend. 'auto' tries lightweight fetchers before Zendriver. | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description indicates read behavior ('fetches') and content type auto-detection, but lacks details on safety (e.g., no explicit read-only declaration), error handling, rate limits, or side effects. Since annotations are absent, the description should cover more behavioral traits.
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 sentences, highly concise, no redundant information. The core purpose is front-loaded in the first sentence.
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?
The tool has no output schema, so the description should explain return values or behavior. It only says 'fetches and processes content' without specifying output format, pagination, or error scenarios. Incomplete for a context with 4 parameters and no output schema.
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% with clear parameter descriptions. The tool description adds minimal new meaning beyond the schema (e.g., 'auto-detects content type' is relevant to raw parameter but not explicit). Baseline 3 is appropriate.
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 clearly states 'fetches and processes content from any URL' and mentions auto-detection of content types. However, it does not explicitly differentiate from siblings like search_web or view_website, which could also involve URL fetching.
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?
No guidance on when to use this tool versus alternatives. The description labels it as 'universal' but does not specify contexts where search_web or view_website would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_webA
Execute a web search using the given search query.
Returns a list of results including title, URL, and a rich content snippet.| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The search query to use. | |
| limit | No | Number of results (max 20). | |
| offset | No | To scroll through more results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It discloses that results include title, URL, snippet, but does not mention any rate limits, authentication, or potential side effects. For a read-only web search, this is adequate but minimal.
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 sentences with no redundancy. First sentence states purpose directly, second sentence describes output. Highly efficient.
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?
Given no output schema, the description adequately describes return format. However, it could mention pagination behavior with offset explicitly, but schema provides that detail. Overall complete for a simple search tool.
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 has 100% description coverage. The description repeats the schema's parameter descriptions without adding new meaning. Baseline 3 is appropriate.
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 clearly states it executes a web search and returns results with title, URL, and snippet. This distinguishes it from siblings fetch_url and view_website, which are for fetching content or viewing a website.
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 implies usage for web search, but does not explicitly say when to use this tool instead of siblings. No guidance on when not to use or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
view_websiteA
Capture and return a rendered screenshot of a website. Helpful when not just the data but also the visuals are relevant.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The webpage URL to capture. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. The description states basic behavior but lacks details on output format, page load handling, or permissions. Minimal transparency.
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?
Description is two succinct sentences, front-loaded with action and followed by context. No unnecessary words.
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?
Given the simple tool with one parameter and no output schema, the description covers purpose and usage. Minor gap: no mention of output representation (e.g., image format).
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% and the description for 'url' is identical to the schema. No additional semantics added beyond what schema provides, baseline 3.
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 clearly states the tool captures and returns a rendered screenshot, and adds context about when visuals are relevant. It implicitly differentiates from sibling tools like fetch_url and search_web.
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 provides a usage scenario ('when not just the data but also the visuals are relevant'), giving clear context but no explicit exclusions or alternatives.
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. Dates show when Glama detected each change.
3 tool updates
v0.9.1- First observed
fetch_url - First observed
search_web - First observed
view_website
TDQS
Each tool has a distinct purpose: fetching URL content, performing web search, and capturing website screenshots. No overlap in functionality.
All tool names follow a consistent verb_noun pattern with underscores (fetch_url, search_web, view_website), making them predictable and easy to understand.
Three tools is appropriate for a web utilities server, covering the core needs without being too minimal or excessive.
The tool set covers key web interactions: fetching content, searching, and visual capture. A minor gap might be the lack of a dedicated tool for downloading files or parsing specific formats, but fetch_url addresses most content types.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read a URL as clean markdown, screenshot a website, url to PDF. Web access for agents, no signup.
LLM-ready web search + instant answers + URL-to-clean-text fetch for agents and RAG.
Web search, fetch, extract, and research for AI agents. Markdown output + AI-synthesized answers.
Web search, URL content extraction to Markdown, site mapping, and recursive web crawler.
Related MCP Servers
- AlicenseBqualityBmaintenanceEnables LLMs to interact with web pages, take screenshots, and execute JavaScript in a real browser environment10277299MIT
- AlicenseNot gradedqualityDmaintenanceProvides web search and page fetch capabilities using a browser-based approach, enabling LLMs to search DuckDuckGo, Google, or Yandex and retrieve rendered HTML from URLs.3MIT
- AlicenseNot gradedqualityCmaintenanceEnables LLMs to fetch and extract web content using browser automation, OCR, and multiple extraction methods, handling JavaScript rendering and anti-scraping techniques.17MIT
- AlicenseAqualityAmaintenanceProvides LLMs with real-time web search and content extraction capabilities, including text/news search, full-text URL reading, and targeted technical documentation search.324MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/pietz/mcp-web-tools'
If you have feedback or need assistance with the MCP directory API, please join our Discord server