greenfish-webtools-mcp
This server gives AI assistants real-time web access through two core tools — web search and URL content extraction — without requiring any API keys, using a self-hosted SearXNG instance.
Web Search (
greenfish_websearch): Performs live web searches and returns ranked, deduplicated results.Accepts a search query (up to 500 characters)
Supports language (ISO 639-1, e.g.
en) and region filtering (ISO 3166-1, e.g.US)Optional safe search filtering to exclude explicit content
Configurable number of results (1–20, default 5)
URL Content Fetching (
greenfish_fetch_url): Fetches a specific web page and returns its main readable content, stripped of navigation menus, ads, and boilerplate.Accepts any valid URL
Configurable character limit for returned text (100–50,000 characters, default 8,000)
No API keys required: All search traffic routes through your own SearXNG instance, keeping things private and self-hosted. Setup only requires Python,
uv, and a Docker-based SearXNG instance.
Provides web search capabilities by querying a self-hosted SearXNG instance, enabling AI assistants to perform real-time searches without proprietary APIs.
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., "@greenfish-webtools-mcpsearch for recent breakthroughs in renewable energy"
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.
About The Project
greenfish-webtools-mcp is a Model Context Protocol server that equips AI assistants with live web access. It exposes two tools: web search and URL content extraction.
The key design choice is that this server does not talk to any proprietary search API. Instead, it delegates all search work to your own SearXNG instance — a self-hosted, actively maintained meta-search engine that aggregates results from multiple search providers and exposes a stable JSON API that won't change or be deprecated without notice. You spin up SearXNG, this server connects to it and passes results straight to the model.
greenfish_websearch sends a query to SearXNG and returns a ranked, deduplicated list of results. greenfish_fetch_url fetches a specific page and returns its main readable content, stripped of navigation, ads, and boilerplate using trafilatura.
Related MCP server: noapi-google-search-mcp
Built With
Getting Started
Before anything else, make sure you have Python 3.10+ and uv installed. You will also need a running SearXNG instance with JSON output enabled. The quickest way to get one is via Docker:
docker run -d --name searxng -p 1818:8080 searxng/searxngAfter that, open the SearXNG admin interface, go to Preferences → General, and enable json as an output format. Alternatively, find settings.yml in the SearXNG container and add json to the search.formats list, then restart the container.
Now clone this repository and install the Python dependencies:
git clone https://github.com/DumbGreenFish/GreenFishWebtoolsMCP.git
cd greenfish-webtools-mcp
uv syncThat's it. No API keys, no accounts.
Usage
You can run greenfish-webtools-mcp either as a local stdio MCP server or as a regular HTTP server.
Stdio
Register the server in your MCP client configuration file. The example below works for Claude Desktop and most other clients that accept the standard JSON format:
{
"mcpServers": {
"greenfish-webtools": {
"command": "uv",
"args": [
"--directory",
"/path/to/greenfish-webtools-mcp",
"run",
"app-stdin.py"
],
"env": {
"SEARXNG_URL": "http://127.0.0.1:1818/search"
}
}
}
}Replace /path/to/greenfish-webtools-mcp with the actual path to the cloned repository on your machine, and adjust SEARXNG_URL to match the address where your SearXNG instance is running.
HTTP server
Alternatively, you can run the MCP server as a regular HTTP server using app.py:
uv run app.pyBy default, the MCP endpoint is available at:
http://localhost:1235/mcpFor MCP clients that support remote HTTP servers, the configuration can look like this:
{
"mcpServers": {
"greenfish-webtools": {
"url": "http://localhost:1235/mcp"
}
}
}Once connected using either method, the AI assistant will have access to greenfish_websearch and greenfish_fetch_url automatically.
Docker
To run the HTTP server with the bundled SearXNG instance, create .env and set SEARXNG_SECRET:
Then start the services with:
docker compose upIf you already have your own SearXNG instance, set SEARXNG_URL in .env to the address of your SearXNG instance and use the plain Compose configuration instead:
docker compose -f docker-compose.plain.yml upRoadmap
Support for additional SearXNG parameters (time range, search categories)
Configurable result ranking and deduplication strategy
Multi-language documentation
See the open issues for a full list of proposed features and known issues.
Contributing
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also open an issue with the tag "enhancement". Don't forget to give the project a star — thanks!
License
Distributed under the GNU GPLv3 License. See LICENSE for more information.
Contact
Project Link: https://github.com/DumbGreenFish/GreenFishWebtoolsMCP
Acknowledgments
This project would not exist without SearXNG, which does all the actual search work. Thanks also to the authors of FastMCP, trafilatura, and httpx.
Available Tools
2 toolsfetch_urlARead-onlyIdempotent
Fetches a web page and returns its main readable content, stripped of navigation, ads and boilerplate. Use this to read the full text of a specific article or documentation page when you already have its URL.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. Description adds that content is stripped of navigation and boilerplate, beyond annotations. No contradictions.
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: first explains what the tool does, second gives usage guidance. No wasteful words, front-loaded with key information.
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?
For a simple read-only tool with an output schema and two well-described parameters, the description covers purpose, usage, and behavior adequately. No missing critical details.
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?
The input schema already provides clear descriptions for both 'url' and 'max_chars' parameters, so the description adds minimal parameter-specific value but does clarify the output quality (stripped content). 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 it fetches a web page and returns main readable content, stripping boilerplate. It distinguishes from sibling 'websearch' by specifying 'when you already have its URL'.
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?
Explicitly says to use this tool for reading a specific article or documentation page when you have the URL, implying not for search (which is the sibling tool's role).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
websearchARead-onlyIdempotent
Performs a web search and returns the results. This tool allows searching the live web for current information without requiring API keys. It is ideal for retrieving news, documentation, or general facts. Example: Use this tool when you need to find information about recent events or technical documentation.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, idempotentHint, and openWorldHint, covering safety and idempotency. The description adds minor context about not requiring API keys, but does not go beyond what annotations imply. No contradictions.
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?
The description is reasonably concise at five lines, including an example. However, there is some redundancy (e.g., 'Performs a web search' and 'allows searching the live web'), and the structure could be tightened without losing clarity.
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 description covers purpose, usage, and behavioral context (no API keys). With an output schema presumably present, it does not need to detail return values. It could be more complete by explicitly contrasting with 'fetch_url' or listing limitations, but overall it's adequate.
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?
The input schema provides detailed descriptions for all five parameters, so baseline is 3. The description does not add additional meaning or context about parameters beyond what the schema already provides.
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 performs a web search and returns results, specifying it searches the live web for current information. It distinguishes itself from the sibling tool 'fetch_url' by being a search rather than a URL fetch, and provides concrete examples of use cases (news, documentation, facts).
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 gives clear context for when to use the tool (retrieving news, documentation, general facts) and includes an example (recent events, technical documentation). However, it does not explicitly state when not to use it or compare with the sibling 'fetch_url', missing an opportunity for clearer guidance.
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.
2 tool updates
v0.1.0- First observed
fetch_url - First observed
websearch
TDQS
The two tools have clearly distinct purposes: fetch_url retrieves content from a known URL, while websearch performs a search query. There is no overlap or ambiguity.
Both tool names follow a consistent verb_noun pattern in snake_case: fetch_url and websearch (where 'web' is the noun and 'search' is the verb).
With only 2 tools, the server is minimal but still reasonable for a basic web tools utility. It covers the essential functions of searching and fetching, though additional tools like list search results could be useful.
The server covers the basic web access workflow: search to find URLs, then fetch to read content. Minor gaps exist (e.g., no pagination or result filtering), but core functionality is present.
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
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
Docs: https://docs.keenable.ai/mcp-server Keenable is a free, remote MCP server that gives agents access to the web index. Search the web with ranked results and date/site filters, then fetch any indexed page as clean markdown. Works out of the box with no account or API key.
An MCP server that gives your AI access to the source code and docs of all public github repos
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA lightweight MCP server that enables LLMs to search the web via DuckDuckGo, search GitHub code repositories, and extract clean content from web pages in LLM-friendly formats.8-
- AlicenseAqualityBmaintenanceAn MCP server that gives local LLMs access to Google search, live feeds, YouTube transcriptions, OCR, and more — all without API keys, using headless Chromium and open-source models.38125MIT
- AlicenseAqualityCmaintenanceAn MCP server that enables AI assistants to fetch web content in multiple formats (HTML, JSON, text, Markdown) with intelligent content extraction, chunk management, and browser automation support.55215MIT

Wickofficial
FlicenseNot gradedqualityAmaintenanceAn MCP server that provides browser-grade web access for AI agents, using Chrome's actual network stack to bypass anti-bot protections and return clean markdown.8-
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/DumbGreenFish/GreenFishWebtoolsMCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server