pvl-webtools
Web search (via SearXNG) and fetch tools with MCP server.
Installation
pip install pvl-webtools
# With MCP server support
pip install pvl-webtools[mcp]
# With markitdown for LLM-friendly markdown output (recommended)
pip install pvl-webtools[markdown]
# With trafilatura for article text extraction
pip install pvl-webtools[extraction]
# Everything
pip install pvl-webtools[all]
Usage
Direct Usage
import asyncio
from pvlwebtools import web_search, web_fetch
async def main():
# Search (requires SEARXNG_URL env var)
results = await web_search("python async best practices", max_results=5)
for r in results:
print(f"{r.title}: {r.url}")
# Fetch and extract article
page = await web_fetch("https://example.com/article")
print(page.content)
asyncio.run(main())
With SearXNG Client
from pvlwebtools import SearXNGClient
client = SearXNGClient(url="http://localhost:8888")
if client.check_health():
results = await client.search("query", domain_filter="wikipedia.org")
As MCP Server
# Set SearXNG URL
export SEARXNG_URL="http://localhost:8888"
# Optional: enable verbose logging (sent to stderr)
export VERBOSE=1
# Run server
uvx pvl-webtools-mcp
Docker (Streamable HTTP)
# Pull and run
docker run -d -p 8000:8000 \
-e SEARXNG_URL="http://your-searxng:8888" \
ghcr.io/pvliesdonk/pvl-webtools:latest
# MCP endpoint available at http://localhost:8000/mcp
See Docker Deployment for full documentation.
Configuration
| Environment Variable | Description |
|---|---|
SEARXNG_URL |
SearXNG instance URL (required for web_search) |
LOG_LEVEL |
Optional logging level for the MCP server (DEBUG, INFO, TRACE, etc.). TRACE removes dependency filtering so every log (including FastMCP internals) is emitted. |
VERBOSE |
Convenience flag; set to 1/true for debug logging without exposing dependency noise. |
Tools
web_search
Search the web via SearXNG metasearch engine.
query: Search querymax_results: 1-20 (default 5)domain_filter: Limit to domain (e.g., "wikipedia.org")recency: "all_time", "day", "week", "month", "year"
web_fetch
Fetch and extract content from URLs.
url: URL to fetchextract_mode:"markdown"(default): LLM-friendly markdown via markitdown"article": Plain text via trafilatura"raw": Raw HTML (truncated)"metadata": Title, description, Open Graph tags
License
MIT
Metadata
Release files for pvl-webtools 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| pvl_webtools-1.0.1.tar.gz | 23.4 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pvl_webtools-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 39.2 kB
Release files / pvl_webtools-1.0.1.tar.gz
| Download URL | pvl_webtools-1.0.1.tar.gz |
|---|---|
| Size | 23.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2f084fec8c95fb8d4484d5a00153185ed22ec5cc8922f0f1a43fa2f3539b8103
|
|
BLAKE2b-256 checksum How to use checksums |
e1ae8c4d946cb4e00bbf9cb33c922e79040c70bf4750102fa17f5eca544273e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 5, 2026.
Transparency logRelease files / pvl_webtools-1.0.1-py3-none-any.whl
| Download URL | pvl_webtools-1.0.1-py3-none-any.whl |
|---|---|
| Size | 15.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a7e12ef7628787d1edd8e4028955762f3c44e903dda2c4b90139c607662f4294
|
|
BLAKE2b-256 checksum How to use checksums |
5d5e16b03eeddc24d2fc1e455a0353715f6369127e9b3c7d18070a58b8083966
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 5, 2026.
Transparency logSecurity for pvl-webtools 1.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for pvl_webtools-1.0.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 5, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.