Atlas / MCP servers / n24q02m / wet

wetBLOCK

mcp/n24q02m/wet

Open-source MCP server for AI agents: web search, content extraction, and library docs -- 5-strategy scraping, runs without API keys.

Verdict
BLOCK
Grade
D
Trust score
69 /100
Exposed tools
—
Transport
stdio · streamable-http
License
Apache-2.0
Stars
19
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Renamed (2026-09-13): repo is now wet — CLI-first (wet command). PyPI package stays wet (PyPI policy blocks new project wet); MCP server is a secondary surface: run wet with no subcommand.

mcp-name: io.github.n24q02m/wet

Renamed: the repo, CLI and Python module are now wet. The PyPI distribution stays `wet-mcp` (install pip install wet-mcp / uvx wet-mcp). The MCP server remains available: run wet with no subcommand (bare = MCP passthrough); the legacy wet-mcp console alias still works.

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

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.

[](https://mcp.n24q02m.com/get-started/modes-overview/) [](https://github.com/n24q02m/wet/actions/workflows/ci.yml) [](https://codecov.io/gh/n24q02m/wet) [](https://pypi.org

Read from source at commit b2931c963ab2OBSERVED · 2026-10-10
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (pypi)
claude mcp add wet-mcp --env OPENROUTER_API_KEY=${OPENROUTER_API_KEY} --env GITHUB_TOKEN=${GITHUB_TOKEN} -- uvx wet-mcp==3.19.2
03

Trust audit

BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (5 observation(s))
Shell
declared (2 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/wet/security.py:175
{"passwd", "shadow", "group", "sudoers", "id_rsa", "id_ed25519"}
Why it matters. touches a credential store
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/wet/cli.py:505
print(hash_token(args.token))  # never echo the token itself
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/test_search_backends.py:77
secret = "tvly-SECRET-DEADBEEF"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/test_search_backends.py:144
secret = "brave-test-token-not-real"  # noqa: S105 - low-entropy fake for leak test
LOWInventory / provenance · inv.hidden_file · CWE-1104
.coderabbit.yaml
.coderabbit.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.gitguardian.yaml
.gitguardian.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.infisical.json
.infisical.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.mise.toml
.mise.toml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.pre-commit-config.yaml
.pre-commit-config.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/test_console_encoding.py:67
exec(guard, {"sys": fake_sys, "io": io})  # noqa: S102 - trusted project source
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
tests/test_security.py:269
f = ssh_dir / "id_rsa"
Why it matters. touches a credential store
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/test_crawler_comprehensive.py:515
["http://safe.com/../../etc/passwd"], str(tmp_path)
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/test_full_live.py:433
"output_dir": "/tmp/evil/../../../etc",
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/test_live_mcp.py:499
"output_dir": "/tmp/evil/../../../etc",
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/test_live_protocol.py:388
"output_dir": "/tmp/evil/../../../etc",
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
tests/test_db.py:941
{"content": "flurb gorb exfil quux"},
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
tests/test_db.py:957
assert rows[0]["content"] == "flurb gorb exfil quux"
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/test_docs_coverage.py:100
request = httpx.Request("GET", "http://169.254.169.254/latest/meta-data/")
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/test_full_live.py:408
{"action": "extract", "urls": ["http://169.254.169.254/latest/meta-data"]},
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/test_live_mcp.py:457
"urls": ["http://169.254.169.254/latest/meta-data"],
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/test_live_protocol.py:365
{"action": "extract", "urls": ["http://169.254.169.254/latest/meta-data"]},
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/test_security.py:26
assert not is_safe_url("http://169.254.169.254")
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:151
endpoint is `http://127.0.0.1:8000/mcp` (Streamable HTTP) and the config root
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:160
uv run wet                        # serves http://127.0.0.1:8000/mcp
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:200
claude mcp add --transport http wet http://127.0.0.1:8000/mcp \

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha b2931c963ab2full audit observations/trust-audit/mcp-server/n24q02m__wet.json · Report an issue / request a re-scan
04

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10b2931c963ab2BLOCKD69first audit
05

Questions

What is the wet MCP server?

Open-source MCP server for AI agents: web search, content extraction, and library docs -- 5-strategy scraping, runs without API keys.

Is wet safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (69/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on.

What credentials does wet need?

It reads CONTEXT7_API_KEY, GH_TOKEN, GITHUB_TOKEN, OPENROUTER_API_KEY, SEARXNG_AUTH_PASS, TAVILY_API_KEY, WET_TEST_PROXY_API_KEY and WET_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does wet run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as demo-nodejs-npm at 0.1.0.

How current is this page?

The grade is for one exact copy of the source (b2931c963ab2), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement