Skip to main content
Glama
n24q02m

WET - Web Extended Toolkit

by n24q02m

WET - Web Extended Toolkit MCP Server

mcp-name: io.github.n24q02m/wet-mcp

Open-source MCP server for AI agents: web search, content extraction, and library docs.

Phase

Status

Scope

Phase 1

Shipped

web-core ScrapingAgent migration, smart chunks output, search polish, media slim

Phase 2

Shipped

Context7-level docs search: library index (Tier 1 + Tier 2), version-aware queries with token cap, project lock (Cabinets)

Phase 3

Shipped

extract.agent multi-step research with cited synthesis, extract.interact click/fill/submit via patchright (optional session persistence), docs_004_chunk_summaries migration, media.analyze removed (v2.0.0)

Current release: v3.x. media(action="analyze") was removed in the v2.0.0 BREAKING release. Use imagine-mcp's understand action for vision/audio/video analysis. See docs/migration.md for the upgrade recipe.

CI codecov PyPI License: Apache-2.0

Python SearXNG MCP semantic-release Renovate

Project

Tagline

Tag

agent-chat-plugin

Peer AI agents chat in a shared folder — no human relay, no orchestrator, wor...

Tooling

better-code-review-graph

Knowledge graph for token-efficient code reviews -- semantic search and call-...

MCP

better-drive

2-way Google Drive sync with .driveignore filter — rclone engine, Windows tray

Tooling

better-email-mcp

IMAP/SMTP email for AI agents -- read, send, organize folders, and manage att...

MCP

better-godot-mcp

Composite MCP server for Godot Engine -- 17 composite tools for AI-assisted g...

MCP

better-notion-mcp

Markdown-first Notion for AI agents -- pages, databases, blocks, and comments...

MCP

better-semantic-release

Drop-in python-semantic-release fork with built-in release-safety guards (orp...

Tooling

better-telegram-mcp

Telegram for AI agents -- messages, chats, media, and contacts across both bo...

MCP

better-workspace-mcp

Google Workspace MCP server (Docs/Drive/Calendar/Gmail/Sheets/Slides/Tasks/Ch...

MCP

claude-plugins

Claude Code plugin marketplace for the n24q02m MCP servers -- install web sea...

Marketplace

imagine-mcp

Image and video understanding + generation for AI agents -- across Gemini, Op...

MCP

jules-task-archiver

Chrome Extension for bulk operations on Jules tasks via batchexecute API -- a...

Tooling

mcp-core

Shared foundation for building MCP servers -- Streamable HTTP transport, OAut...

MCP

mnemo-mcp

Persistent AI memory with hybrid search and embedded sync. Open, free, unlimi...

MCP

fastretrieval

Multi-model embedding and reranking runtime via ONNX and GGUF

Library

skret

Secrets without the server.

CLI

tacet

A self-distilling neuro-symbolic cascade that amortises LLM cost across knowl...

Tooling

web-core

Shared web infrastructure package for search, scraping, HTTP security, and st...

Library

wet-mcp

Open-source MCP server for AI agents: web search, content extraction, and lib...

MCP

Table of contents

Related MCP server: Nexus MCP Server

Features

  • Web Search -- Embedded SearXNG metasearch (Google, Bing, DuckDuckGo, Brave) with query expansion, TTL cache (1 h general / 5 min time-sensitive), standardized citation format, and 200-token snippet cap. Optional cloud search backends (Tavily, Brave, Exa) as a fallback chain via SEARCH_BACKENDS

  • Academic Research -- Search Google Scholar, Semantic Scholar, arXiv, PubMed, CrossRef, BASE

  • Library Docs -- Auto-discover and index documentation with FTS5 hybrid search, HyDE-enhanced retrieval, and version-specific docs

  • Content Extract -- 5-strategy escalation chain via n24q02m-web-core ScrapingAgent (basic_http -> tls_spoof -> render backends from BROWSER_BACKENDS (native / browserless / cf-browser-rendering) -> optional key-gated captcha), markitdown bridge for low-tier HTML/MD fallback, smart chunks structured output (clean text + markdown + JSON-LD + code blocks + metadata), batch processing (up to 50 URLs), deep crawling, site mapping

  • Local File Conversion -- Convert PDF, DOCX, XLSX, CSV, HTML, EPUB, PPTX to Markdown

  • Media -- List + download images / videos / audio files. analyze was removed in v2.0.0 -- use imagine-mcp.understand for vision/audio inference

  • Anti-bot -- Stealth strategies bypass Cloudflare, Medium, LinkedIn, Twitter

  • Zero Config -- Built-in local reference embedding + reranking through fastretrieval, no API keys needed. Optional cloud providers (Jina AI, Gemini, OpenAI, Cohere, xAI, Anthropic) selected per task via the EMBEDDING_MODELS / RERANK_MODELS / LLM_MODELS model chains for higher-quality vectors and LLM features

  • Sync -- Cross-machine sync of indexed docs via Google Drive (OAuth Device Code, no browser redirect)

Quick install

# Method 1 (default): plugin install via Claude Code
/plugin marketplace add n24q02m/claude-plugins
/plugin install wet-mcp@n24q02m-plugins

# Method 2 (CLI): direct uvx invocation
claude mcp add wet -- uvx wet-mcp

# Method 3 (source-built container for HTTP / multi-device / OAuth)
docker build --target http -t wet-mcp:local .
docker run -d --name wet-mcp-http -p 8084:8080 \
  -v wet-data:/data -e PUBLIC_URL=https://wet.example.com \
  wet-mcp:local

# Method 4 (remote): point a client at an HTTP deployment
claude mcp add --transport http wet https://<your-host>/mcp

Public OCI image publication is discontinued. Existing historical registry tags remain untouched; new container deployments build from source or use the Cloudflare-managed registry.

The HTTP endpoint speaks Streamable HTTP and is OAuth-gated -- your client is prompted to authenticate in the browser on first connect (no API key to paste). Stand one up via Method 3 or the Deploy to Cloudflare section.

Full setup matrices live at the canonical docs site mcp.n24q02m.com/servers/wet-mcp/setup/ and the paste-to-agent snippets at claude-plugins/plugins/wet-mcp/setup-with-agent.md (per Spec F single source of truth).

Configuration

wet runs zero-config out of the box: web search uses an embedded local SearXNG, and embedding/reranking fall back to the bundled local ONNX models through fastretrieval when no cloud keys are set. For higher-quality results, point each task at a cloud model chain. All settings are plain environment variables (no app prefix) -- in the HTTP self-host mode they are entered through the browser setup form instead.

Model chains (CSV provider/model,provider/model; order = fallback). Leave a chain empty to use the local ONNX models (embedding/rerank) or to disable LLM features (LLM):

Env var

Task

Empty default

EMBEDDING_MODELS

Embeddings for docs search

Local fastretrieval ONNX

RERANK_MODELS

Result reranking

Local fastretrieval cross-encoder

LLM_MODELS

extract(action="agent") synthesis

LLM features disabled

Provider keys -- the provider is inferred from each model's prefix; supply the matching key (litellm <PROVIDER>_API_KEY convention):

Model prefix

Key env var

Get it at

jina_ai/

JINA_AI_API_KEY

jina.ai/api-key

gemini/

GEMINI_API_KEY

aistudio.google.com/apikey

vertex_express/

GOOGLE_VERTEX_EXPRESS_API_KEY

cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview

openai/ (or bare)

OPENAI_API_KEY

platform.openai.com

cohere/

COHERE_API_KEY

dashboard.cohere.com

xai/

XAI_API_KEY

console.x.ai

anthropic/

ANTHROPIC_API_KEY

console.anthropic.com

Any other litellm provider works via env passthrough -- see litellm provider docs for its key name.

FASTRETRIEVAL_CACHE_PATH controls the local model cache.

Search backends -- SEARCH_BACKENDS (CSV, runtime fallback chain) over searxng (default, local) plus optional cloud providers tavily / brave / exa. Point at an external SearXNG with SEARXNG_URL. Cloud providers need TAVILY_API_KEY / BRAVE_API_KEY / EXA_API_KEY.

Browser render backends -- BROWSER_BACKENDS (CSV, escalation chain) picks the headless render leg of extract: native (in-process chromium, the zero-config default), browserless (self-host render service -- set BROWSERLESS_URL + BROWSERLESS_TOKEN), and cf-browser-rendering (Cloudflare Browser Rendering -- set CF_ACCOUNT_ID + CF_BROWSER_RENDERING_TOKEN). Empty chain falls back to native. Set CAPSOLVER_API_KEY to append an optional, key-gated CAPTCHA tier as the last escalation step.

Robots policy -- set RESPECT_ROBOTS_TXT=true to enforce robots.txt across both the extract strategy chain and the Crawl4AI-backed crawl, sitemap, and list_media actions. The default is false to preserve existing deployment behaviour; configure this process-level policy explicitly when the operator requires robots enforcement.

Disable local fallbacks -- opt out of the heavy in-process local fallbacks per capability (e.g. on a slim container that renders/searches/embeds via cloud backends only): DISABLE_LOCAL_BROWSER, DISABLE_LOCAL_SEARCH, DISABLE_LOCAL_EMBED, DISABLE_LOCAL_RERANK.

Docs sync -- SYNC_ENABLED (default true), GOOGLE_DRIVE_CLIENT_ID (required for sync), SYNC_FOLDER (default wet-mcp), SYNC_INTERVAL (default 300s). Sync uses Google Drive over the OAuth Device Code flow (no browser redirect).

HTTP self-host -- MCP_TRANSPORT=http, PUBLIC_URL=<your-domain>. The setup form is gated by MCP_RELAY_PASSWORD; multi-user deployments require CREDENTIAL_SECRET (per-user vault key), MCP_JWT_SIGNING_SECRET (rotatable OAuth JWT key), and MCP_DCR_SERVER_SECRET.

Example stdio config (cloud chains):

{
  "mcpServers": {
    "wet": {
      "command": "uvx",
      "args": ["wet-mcp"],
      "env": {
        "EMBEDDING_MODELS": "jina_ai/jina-embeddings-v5-text-small",
        "RERANK_MODELS": "jina_ai/jina-reranker-v3",
        "LLM_MODELS": "gemini/gemini-3-flash-preview",
        "JINA_AI_API_KEY": "jina_xxx",
        "GEMINI_API_KEY": "AIza_xxx"
      }
    }
  }
}

Status

Stable architecture with two transports: stdio (default, local) and HTTP (self-host, OAuth-gated). No daemon-bridge layer and no auto-spawn from stdio. The media.analyze action was removed in the v2.0.0 BREAKING release -- see docs/migration.md for the upgrade recipe. Current release line: v3.x.

Documentation

Full docs at mcp.n24q02m.com/servers/wet-mcp/setup/:

  • Setup -- install methods for Claude Code, Codex, Gemini CLI, Cursor, Windsurf, mcp.json

  • Modes overview -- stdio / local-relay / remote-relay / remote-oauth

  • Multi-user setup -- per-JWT-sub credential model

In-repo references (Spec F single source of truth: setup docs live in claude-plugins/plugins/wet-mcp/):

  • docs/ARCHITECTURE.md -- web-core ScrapingAgent integration, strategy chain, storage layout, LLM provider dispatch

  • docs/BENCHMARKS.md -- v1.x baseline coverage / latency placeholders + tier-1 fixture metrics

Install with AI agent -- paste this to your AI coding agent:

Install MCP server wet-mcp following the steps at https://raw.githubusercontent.com/n24q02m/claude-plugins/main/plugins/wet-mcp/setup-with-agent.md

Tools

6 MCP tools (3 domain + config + help + config__open_relay). The legacy setup tool merged into config action dispatch.

Tool

Description

search

Web (SearXNG metasearch), news, images, academic research (Scholar / arXiv / PubMed / CrossRef / Semantic Scholar / BASE), library docs (HyDE + FTS5), find similar pages. Includes docs_resolve (library name -> ranked id), docs_query (version-aware + topic + 5000-token cap), docs_lock_project (Cabinets project pin via pyproject / package.json / go.mod / Cargo.toml manifest detection).

extract

URL -> smart chunks dict (clean_text + markdown + structured_data + code_blocks + metadata) via web-core 5-strategy chain. Batch processing (up to 50 URLs), deep crawling, site mapping, local file conversion (PDF/DOCX/XLSX/PPTX/EPUB), structured extraction (JSON Schema)

media

list (discover URLs from gallery pages), download (SSRF-safe). analyze was removed in v2.0.0 -- use imagine-mcp.understand instead

config

status, set, cache_clear, docs_reindex, warmup, setup_sync, setup_status, setup_skip, setup_reset, setup_complete

help

Per-tool documentation: search, extract, media, config

config__open_relay

Re-trigger the zero-config relay setup flow (prints a fresh relay URL for the browser form). Registered via mcp-core's register_open_relay_tool so an LLM can restart setup without a manual restart.

Media boundary: For vision / audio understanding (image captioning, OCR, audio transcription, video summarization), use imagine-mcp. media.analyze was removed in wet v2.0.0 -- use imagine-mcp.understand instead.

CLI

The wet-mcp console script starts the server and also exposes a few one-shot operator subcommands. A bare invocation (or any leading-dash flag) starts the server; a leading positional argument is dispatched as a subcommand.

wet-mcp                        # start the server over stdio (default transport)
wet-mcp --http                 # start the server over Streamable HTTP (self-host mode)

wet-mcp auth google            # authorize the Google credential provider for Drive sync
wet-mcp logout                 # clear the local Google Drive sync token
wet-mcp warmup                 # pre-download local models + run auto-setup (SearXNG, browser) to avoid first-run delays
wet-mcp docs reindex <library> # drop the cached docs index for <library>; the next docs search re-indexes it

auth google accepts an optional bring-your-own OAuth client via --client-id and --client-secret (single-user / local machine only; the token is written to the local store). Each subcommand prints a JSON result and exits.

Capability

wet-mcp

Brave Search

Tavily

Firecrawl

Context7

Web search

Yes (SearXNG aggregation)

Yes

Yes

No

No

Extract URL

Yes (5-strategy chain)

No

Yes (basic)

Yes

No

Media list / download

Yes

No

No

No

No

Library docs search

Yes (Tier 1 curated + Tier 2 on-demand, version-aware, Cabinets)

No

No

No

Yes

Academic research

Yes (6 providers)

No

No

No

No

Self-hostable

Yes

No

No

No

Yes

Free tier

Yes (open source)

Limited

Limited

Limited

Yes

Security

  • SSRF prevention -- URL validation on crawl targets

  • Graceful fallbacks -- Cloud → Local embedding, multi-tier crawling

  • Error sanitization -- No credentials in error messages

  • File conversion sandboxing -- Optional CONVERT_ALLOWED_DIRS restriction

Build from Source

git clone https://github.com/n24q02m/wet-mcp.git
cd wet-mcp
uv sync
uv run wet-mcp

Deploy to Cloudflare

Deploy to Cloudflare

Run your own single-user wet instance serverless on Cloudflare (Containers + D1 + Vectorize + KV).

Prerequisites: a Cloudflare account on the Workers Paid plan — required for Containers, D1, and Vectorize (the Cloudflare free tier does not include them) — and the wrangler CLI.

  1. git clone https://github.com/n24q02m/wet-mcp && cd wet-mcp

  2. wrangler login

  3. Provision resources and apply the D1 schema:

    wrangler d1 create wet-docs
    wrangler d1 execute wet-docs --file migrations/0001_init_wet.sql --remote
    wrangler d1 execute wet-docs --file migrations/0002_project_context.sql --remote
    wrangler d1 execute wet-docs --file migrations/0003_version_index_state.sql --remote
    wrangler vectorize create wet-docs-vectors --dimensions 768 --metric cosine
    wrangler kv namespace create wet-kv

    Paste the returned IDs into wrangler.jsonc.

  4. Build the slim HTTP image from this checkout and push it directly to Cloudflare's managed registry (CF Containers cannot pull from external registries):

    docker build --target http --build-arg SLIM=1 -t wet-mcp:beta .
    wrangler containers push wet-mcp:beta   # prints registry.cloudflare.com/<ACCOUNT_ID>/wet-mcp:beta
  5. Set secrets (TAVILY_API_KEY is required when SEARCH_BACKENDS includes tavily; Cloudflare Browser Run is the default headless render backend):

    wrangler secret put CREDENTIAL_SECRET
    wrangler secret put MCP_JWT_SIGNING_SECRET
    wrangler secret put JINA_AI_API_KEY
    wrangler secret put GOOGLE_VERTEX_EXPRESS_API_KEY
    wrangler secret put XAI_API_KEY
    wrangler secret put MCP_RELAY_PASSWORD
    wrangler secret put MCP_DCR_SERVER_SECRET
    wrangler secret put TAVILY_API_KEY
    wrangler secret put CF_BROWSER_RENDERING_TOKEN
  6. wrangler deploy and complete setup in the browser relay form at your Worker domain.

Storage maps to Cloudflare via MCP_STORAGE_BACKEND=cf-kv (credentials/tokens, encrypted), DOCS_DB_BACKEND=cf-d1 (docs + BM25 full-text), and Vectorize (embeddings). The example Worker uses SEARCH_BACKENDS=tavily,duckduckgo,startpage and BROWSER_BACKENDS=cf-browser-rendering; embed/rerank are forced cloud via EMBEDDING_MODELS/RERANK_MODELS.

Smithery

wet-mcp ships a smithery.yaml so it can be installed and run through Smithery. The manifest declares a stdio start command (uvx --python 3.13 wet-mcp) with an empty config schema -- no config is required to start, and providers and credentials are configured at runtime via the server's own config flow (see Configuration).

Trust Model

This plugin implements TC-Local (machine-bound, single trust principal). See mcp-core trust model for full classification.

Mode

Storage

Encryption

Who can read your data?

stdio (default)

~/.wet-mcp/config.json

AES-GCM, machine-bound key

Only your OS user (file perm 0600)

HTTP self-host

Same as stdio

Same

Only you (admin = user)

License

Apache-2.0 -- See LICENSE.

Available Tools

6 tools
configC
Idempotent

Server config and management. Actions: status|set|cache_clear|docs_reindex|warmup|setup_sync|setup_status|setup_start|setup_skip|setup_reset|setup_complete. Use help tool with tool_name='config' for full docs.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNo
forceNo
valueNo
actionYes
remote_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.6/5.0
Behavior2/5

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

The description does not disclose behavioral traits such as side effects, permissions, reversibility, or what happens on success/failure. The annotations indicate idempotent and non-destructive, but the description does not elaborate on these, leaving the actual behavior of actions like set or cache_clear unclear.

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

Conciseness4/5

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

The description is appropriately sized: it opens with a clear summary then lists actions in a compact, pipe-separated format. It is front-loaded with the main purpose and does not include unnecessary fluff.

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

Completeness2/5

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

Given the tool's apparent complexity (many distinct actions), the description is incomplete. It does not explain what each action does, any side effects, or required parameters for each action. It relies on the help tool for full docs, which is not sufficient for a complete understanding.

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

Parameters1/5

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

The description adds no meaning to the schema parameters. It lists actions but does not explain the role of 'key', 'force', 'value', or 'remote_type'. The schema provides types and defaults but no descriptions, so the parameter semantics are entirely undocumented.

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

Purpose4/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 as 'Server config and management' and enumerates specific actions (status, set, cache_clear, etc.), which gives a good high-level understanding. It is distinct enough from sibling tools, though it does not explicitly compare with them.

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

Usage Guidelines2/5

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

The description does not explicitly state when to use this tool versus alternatives. It only suggests using the help tool for full documentation, which is a weak form of guidance. There is no indication of prerequisites or typical use cases for the listed actions.

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

config__open_relayA

Get the relay configuration URL for wet-mcp, opening it in the user's browser when possible. Returns the relay URL, whether the browser launched, and the current status.

ParametersJSON Schema
NameRequiredDescriptionDefault
ctxYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the responsibility for disclosing behavior. It mentions the side effect of opening a browser 'when possible', and lists return values (URL, browser launched, status). However, it omits potential failures, permission requirements, or any side effects beyond the browser action.

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 concise sentences, front-loaded with the primary purpose, and includes all essential behavioral information without superfluous details. It earns its length efficiently.

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

Completeness4/5

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

Given the tool's simplicity and the presence of an output schema (likely documenting the return values), the description covers the core purpose and side effects adequately. It lacks details on error handling or integration with other tools, but for a straightforward config command it is sufficiently complete.

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

Parameters2/5

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

The only parameter is 'ctx', a standard context object, but the description does not mention or explain it. Schema coverage is 0% as the description adds no parameter-specific meaning. While the ctx parameter is typically auto-injected, the description should at least note its presence or purpose, making this a gap.

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 verb 'Get' and the resource 'relay configuration URL', and specifies the browser-opening behavior. It distinguishes itself from the sibling 'config' tool by focusing on the relay URL retrieval and browser action.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives, no preconditions, and no mention of when it should not be used. It simply states what the tool does without contextual advice.

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

extractA
Read-only

Read and return full page content from URLs or local files. Use this when you have a specific URL and need its content. For finding URLs first, use the search tool instead.

Actions:

  • extract: Get clean content from URLs. Example: extract(action="extract", urls=["https://example.com/article"])

  • batch: Batch extract with per-domain rate limiting (max 50 URLs). Example: extract(action="batch", urls=["https://a.com/1", "https://b.com/2"])

  • crawl: Deep crawl following links from root URLs. Example: extract(action="crawl", urls=["https://docs.example.com"], depth=2)

  • map: Discover site URL structure without extracting content. Example: extract(action="map", urls=["https://example.com"])

  • convert: Convert local files (PDF, DOCX, PPTX, XLSX) to Markdown. Example: extract(action="convert", paths=["/home/user/report.pdf"])

  • extract_structured: Extract structured data using JSON Schema + LLM. Example: extract(action="extract_structured", urls=["https://example.com/pricing"], schema={"type": "object", "properties": {"price": {"type": "string"}}})

  • agent: Multi-step research orchestration -- search the web, extract top results, synthesize a cited Markdown answer. Example: extract(action="agent", query="latest pydantic 2 changes", max_urls=5)

  • interact: Drive a page with click/fill/submit via patchright. Example: extract(action="interact", url="https://example.com/login", actions=[{"type": "fill", "selector": "#email", "value": "x@y.com"}, {"type": "submit", "selector": "form"}])

  • diff: Track content changes across fetches of the same URL(s). Example: extract(action="diff", urls=["https://example.com/pricing"])

Key parameters:

  • urls (required for extract/batch/crawl/map/extract_structured/diff): List of URLs

  • paths (required for convert): List of local file paths

  • query (required for agent): Research question to answer

  • url (required for interact): Page URL to drive

  • actions (required for interact): List of {type, selector?, description?, value?} ops

  • max_urls (agent): Default 5, hard cap 20

  • synthesis_model (agent): Override LLM model for the synthesis step

  • token_budget (agent): Max prompt tokens (default 10000)

  • session (interact): Persistent session id; reuses browser across calls

  • screenshot (interact): Capture post-interaction screenshot

  • format: Output format -- "markdown" (default), "text", "html"

  • depth: Crawl depth (default: 2, max: 5)

  • max_pages: Max pages for crawl/map (default: 20, max: 100)

  • stealth: Enable anti-bot bypass for protected sites (default: false)

  • schema: JSON Schema dict for extract_structured

  • refetch (diff): Fetch a fresh copy before comparing (default: true). Set false to compare already-recorded snapshots without a new network fetch.

Use help tool with tool_name="extract" for full parameter documentation.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
urlsNo
depthNo
pathsNo
queryNo
actionYes
formatNomarkdown
promptNo
schemaNo
actionsNo
refetchNo
sessionNo
stealthNo
max_urlsNo
max_pagesNo
screenshotNo
token_budgetNo
synthesis_modelNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Annotations declare readOnlyHint and openWorldHint, but the description adds substantial behavioral context: batch per-domain rate limiting (max 50 URLs), crawl depth and max_pages constraints, stealth anti-bot bypass, persistent browser sessions, refetch behavior, and the ability to click/fill/submit via interact. This goes well beyond the annotations and sets accurate expectations.

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 long but well-structured: opening purpose, actionable examples for each of nine modes, and a key-parameters section. It front-loads the core use case and search distinction. Every sentence earns its place given the tool's complexity; the final pointer to 'help' is a minor but useful note.

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?

For an 18-parameter, multi-action tool, the description is remarkably complete. It documents every action mode with examples, covers nearly all parameters with defaults and constraints, and notes the existence of an output schema. No critical gaps remain for an agent to select and invoke the tool correctly.

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

Parameters5/5

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

The input schema has 0% description coverage, so the description carries the full burden. It compensates with action-specific mappings, defaults (max_urls=5, depth=2, token_budget=10000), constraints (max crawl depth 5, max_pages 100), and concrete examples showing how to pass parameters. Only 'prompt' is not explicitly described, but overall semantics are richly defined.

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 'Read and return full page content from URLs or local files' and enumerates nine specific action modes (extract, batch, crawl, map, convert, extract_structured, agent, interact, diff). It distinguishes itself from the sibling 'search' tool by explicitly saying 'For finding URLs first, use the search tool instead.'

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?

Provides explicit when-to-use guidance: 'Use this when you have a specific URL and need its content.' It names the alternative search tool, and each action includes an example with concrete parameter usage. The key parameters section further clarifies which parameters apply to which action.

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

helpA
Read-onlyIdempotent

Get detailed documentation for any tool. Call this when you need full parameter reference or usage examples.

Valid tool_name values: search, extract, media, config.

Quick guide -- which tool to use:

  • Need to FIND information? Use search (returns result listings with URLs)

  • Need to READ a page? Use extract (returns full page content from a URL)

  • Need media files? Use media (discover, download images/videos/audio)

  • Need server settings? Use config (status, cache, settings, warmup, sync setup)

ParametersJSON Schema
NameRequiredDescriptionDefault
tool_nameNosearch

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, covering safety. Description adds that it returns detailed documentation, but no extra behavioral traits beyond what annotations convey. Consistent but not additive.

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?

Efficient: first sentence states purpose, second lists valid values, then a concise quick guide in bullet-style. No fluff, every sentence earns its place.

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?

The tool has one parameter; description covers purpose, usage guidelines, valid values, and sibling differentiation. Output schema exists but return values are self-explanatory. Complete for the tool's simplicity.

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

Parameters4/5

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

Schema coverage is 0% with only type 'string' and a default. Description compensates by explicitly listing valid tool_name values ('search, extract, media, config') and explaining each's usage in the guide, adding meaning beyond the schema.

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 'Get detailed documentation for any tool,' using a specific verb and resource. It distinguishes from siblings via the quick guide that maps each sibling tool to its purpose.

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?

Explicitly says 'Call this when you need full parameter reference or usage examples.' Provides a quick guide comparing sibling tools, stating when to use each (e.g., 'Need to FIND information? Use search'), giving clear when-to-use and when-not-to-use context.

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

mediaA

Discover and download media files (images, videos, audio) from web pages.

Actions:

Key parameters:

  • url (required for list): Page URL to scan

  • media_urls (required for download): List of media URLs to download

  • media_type: Filter for list -- "images", "videos", "audio", "files", "all" (default: "all")

  • output_dir: Download directory (default: ~/.wet-mcp/downloads)

  • prompt: Reserved -- accepted for backward compatibility, ignored

Typical workflow: list (discover) -> download (save locally). For LLM analysis (vision/audio/video), hand the downloaded path to imagine-mcp's understand action. The legacy media(action="analyze") was REMOVED in wet v2.0.0 (deprecated since v1.x.y); calling it now returns the standard unknown-action error.

Use help tool with tool_name="media" for full documentation.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
actionYes
promptNoDescribe this image in detail.
max_itemsNo
media_typeNoall
media_urlsNo
output_dirNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

The description openly discloses that the tool downloads files to local storage (a side effect consistent with readOnlyHint=false), and it explains the reserved 'prompt' parameter is ignored. It also describes the legacy action removal, adding context beyond the annotations.

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

Conciseness4/5

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

The description is structured with bullet points and examples, front-loaded with the core purpose. It is somewhat verbose due to the workflow and legacy notes, but every section adds value and aids usage.

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?

The description covers actions, parameters, workflow, and even directs to the help tool for full documentation. Given the output schema exists and the tool is complex, the description is remarkably complete and self-sufficient.

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

Parameters4/5

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

With 0% schema coverage, the description compensates well by explaining url, media_urls, media_type, output_dir, and prompt behavior. It also gives defaults and examples, though it omits 'max_items' and detailed accepted values for 'action'.

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 it discovers and downloads media files, lists specific actions (list, download) with examples, and distinguishes from sibling tools like extract and search by naming the resource type (media) and workflow. The purpose is specific and unambiguous.

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 explicitly explains the typical workflow (list then download), tells when to use which action, and points to the alternative for LLM analysis (imagine-mcp's understand action). It also warns that the legacy 'analyze' action is removed, preventing misuse.

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.

  1. 1 tool updatev3.10.0
    • Changedsearch3 fields changed
      • addedInput schema / properties / parallel
        Added value: +{
        +  "default": false,
        +  "title": "Parallel",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / refine
        Added value: +{
        +  "default": false,
        +  "title": "Refine",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / region
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Region"
        +}
  2. 5 tool updatesv3.7.3
    • Addedconfig
    • Addedconfig__open_relay
    • Addedextract
    • Addedmedia
    • Addedsearch
  3. 5 tool updatesv3.6.0
    • Removedconfig
    • Removedconfig__open_relay
    • Removedextract
    • Removedmedia
    • Removedsearch
  4. 4 tool updatesv3.5.0
    • Changedconfig4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"configOutput"New value: +"configDictOutput"
    • Changedextract5 fields changed
      • addedInput schema / properties / refetch
        Added value: +{
        +  "default": true,
        +  "title": "Refetch",
        +  "type": "boolean"
        +}
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"extractOutput"New value: +"extractDictOutput"
    • Changedmedia4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"mediaOutput"New value: +"mediaDictOutput"
    • Changedsearch9 fields changed
      • addedInput schema / properties / exclude_handles
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Exclude Handles"
        +}
      • addedInput schema / properties / from_date
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "From Date"
        +}
      • addedInput schema / properties / handles
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Handles"
        +}
      • addedInput schema / properties / to_date
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "To Date"
        +}
      • addedInput schema / properties / video
        Added value: +{
        +  "default": false,
        +  "title": "Video",
        +  "type": "boolean"
        +}
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "title": "Result",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • changedOutput schema / title
        Previous value: -"searchOutput"New value: +"searchDictOutput"
  5. 4 tool updatesv3.1.0
    • Changedconfig2 fields changed
      • addedInput schema / properties / force
        Added value: +{
        +  "default": false,
        +  "title": "Force",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / remote_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Remote Type"
        +}
    • Addedconfig__open_relay
    • Changedextract11 fields changed
      • addedInput schema / properties / actions
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Actions"
        +}
      • addedInput schema / properties / max_urls
        Added value: +{
        +  "default": 5,
        +  "title": "Max Urls",
        +  "type": "integer"
        +}
      • addedInput schema / properties / paths
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Paths"
        +}
      • addedInput schema / properties / prompt
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Prompt"
        +}
      • addedInput schema / properties / query
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Query"
        +}
      • addedInput schema / properties / schema
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Schema"
        +}
      • addedInput schema / properties / screenshot
        Added value: +{
        +  "default": false,
        +  "title": "Screenshot",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / session
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Session"
        +}
      • addedInput schema / properties / synthesis_model
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Synthesis Model"
        +}
      • addedInput schema / properties / token_budget
        Added value: +{
        +  "default": 10000,
        +  "title": "Token Budget",
        +  "type": "integer"
        +}
      • addedInput schema / properties / url
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Url"
        +}
    • Changedsearch7 fields changed
      • addedInput schema / properties / enrich
        Added value: +{
        +  "default": false,
        +  "title": "Enrich",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / exclude_domains
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Exclude Domains"
        +}
      • addedInput schema / properties / expand
        Added value: +{
        +  "default": false,
        +  "title": "Expand",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_domains
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Include Domains"
        +}
      • addedInput schema / properties / project_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Project Path"
        +}
      • addedInput schema / properties / time_range
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Time Range"
        +}
      • addedInput schema / properties / topic
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Topic"
        +}
  6. 5 tool updatesv2.13.0
    • First observedconfig
    • First observedextract
    • First observedhelp
    • First observedmedia
    • First observedsearch

TDQS

A3.7/5.0

Scored across 6 tools

Disambiguation4/5

Search, extract, and media have clearly separated primary roles, and config/help are distinct management tools. Minor ambiguity exists between config__open_relay and config, and the extract agent sub-action overlaps with search, but descriptions are explicit enough to guide correct selection.

Naming Consistency3/5

Five tools use simple lowercase single-word names (search, extract, media, help, config), but config__open_relay breaks the pattern with a double-underscore namespaced style. The sub-action naming inside search and extract also mixes conventions, though these are not top-level tool names.

Tool Count4/5

Six top-level tools is a reasonable size for the server's broad web research/extraction scope. The count is slightly padded by config__open_relay being exposed separately from config, and several tools are actually large action bundles, making the surface bigger than the count suggests.

Completeness5/5

The surface covers search, content extraction, crawling, structured extraction, browser automation, media discovery/download, local file conversion, change tracking, and server configuration. This is comprehensive for a web extended toolkit; no obvious dead ends or missing core operations were found.

Maintenance

ActivityActive
ResponsivenessResponsive

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

Related MCP Servers

Latest Blog Posts

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/n24q02m/wet-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server