Skills/PyPI/pdf-mcp

pdf-mcp@3.8.0

VERIFIED· not started

Publisher claims: "Agentic RAG over one PDF or a whole folder, with page-level evidence to check every answer: hybrid search, selective page reads, tables, OCR, charts, and CJK layouts." Observed in sandbox: no network, touches nothing outside the project, writes no memory.

Registry PyPI (MCP server)Publisher jztan · publishing for 417 daysInstalls 4,974Last detonated 1 h ago
$claude mcp add pdf-mcp -- uvx pdf-mcp
WatchReport an issue

Coverage

Not started: dependency install failed; the server itself was not observed.
Tested
the dependency install step · every file read, file written and host contacted by what ran
Not tested
server startup · the tool list · tool behavior

What this means for the label: Verified here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.

Before you give it your token

It will ask for
PDF_MCP_AUTH_TOKENConfiguration, not credentials: FPS, LOSSY, MAXCOLORS, OUT_GIF, PDF_MCP_ALLOW_ANY_PATH, PDF_MCP_BACKEND, PDF_MCP_BACKGROUND_EMBED, PDF_MCP_BACKGROUND_OCR, PDF_MCP_CACHE_DIR, PDF_MCP_CACHE_MAX_MB, PDF_MCP_CACHE_TTL, PDF_MCP_CUDA, PDF_MCP_HTTP_HOST, PDF_MCP_HTTP_PATH, PDF_MCP_HTTP_PORT, PDF_MCP_MAX_WORKERS, PDF_MCP_OCR, PDF_MCP_VECTOR_CACHE_MB, SCENE_H, SCENE_W, TESSDATA_PREFIX
Where it talks to
no vendor host named in the codeAlso sourceforge.net, arxiv.org — not the publisher's domain; check what for before connecting.
What the honeypot saw
no credential files read · no network
What we could not test
server startup · the tool list · tool behavior

Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names sourceforge.net, arxiv.org as well as its own vendor. The guard injects PDF_MCP_AUTH_TOKEN only into requests to the host you bind (and its subdomains) and refuses the rest.

$vet-skills run --net declared -- uvx pdf-mcp

Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.

Is [email protected] safe to install?

KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; not started: dependency install failed; the server itself was not observed) on 2026-11-14 and scored it 89/100 (Verified). In what ran, nothing we could detect went wrong: no undeclared network egress, no credential reads, no persistent instruction writes. What it does with a real credential was not observed; the static findings and the publisher carry the rest of the score. Summary: no network, touches nothing outside the project, writes no memory.

Behavior trace

Honeypot run · 0 s · 2 scenarios · 0 deviations
t+CategoryObserved action
0.0sprocessno install scripts in bundle
0.1sprocessdependency install exit 1 ·
0.1sclaimednot started: dependency install failed (exit 1); the server itself was not observed
0.2sprocessscript backend runs setup only
0.2sprocessno install scripts to re-run

Static findings

MEDIUM
Python subprocess execution detectedscripts/eval_multiturn_fanout.py:96 · Python subprocess execution detectedresult = subprocess.run(Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.
AST05
MEDIUM
npx invocation of non-well-known packagescripts/demo-recorder/record.mjs:10 · npx invocation of non-well-known package — may execute untrusted code// npx playwright install chromiumFix: Pin versions and sources; vendor anything fetched at install time.
AST06
MEDIUM
Python subprocess execution detectedsrc/pdf_mcp/extractor.py:190 · Python subprocess execution detectedresult = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedscripts/_mcp_client.py:22 · Python subprocess execution detectedself.proc = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedscripts/bedrock_kb_stack.py:102 · Python subprocess execution detectedsubprocess.run(cmd, cwd=INFRA_DIR, env=_cdk_env(), check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedscripts/release.py:873 · Python subprocess execution detectedresult = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedscripts/eval_coherence.py:199 · Python subprocess execution detectedresult = subprocess.run(Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.
AST05
MEDIUM
Python subprocess execution detectedscripts/release.py:101 · Python subprocess execution detectedresult = subprocess.run(cmd, capture_output=capture_output, text=True, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedscripts/release.py:980 · Python subprocess execution detectedsubprocess.run([*shlex.split(editor), str(path)], check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedscripts/author_corpus_queries.py:233 · Python subprocess execution detectedresult = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedsrc/pdf_mcp/extractor.py:1788 · Python subprocess execution detectedsubprocess.run([exe, "--version"], capture_output=True, check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedscripts/release.py:295 · Python subprocess execution detectedlogin_result = subprocess.run(["gh", "auth", "login"], check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
File permission modification commandsrc/pdf_mcp/url_fetcher.py:174 · File permission modification command — agent changes file ownership/permissions# different user, where chmod raises PermissionError. A best-effortFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.
AST05

Cost to the agent

Instructions loaded
≈75 tok
1 file · 81 in bundle
Tool list per prompt
≈0 tok
0 tools · 0 per tool
Handshake
no reply
launch to tools/list, stdio
Undocumented tools
0
description under 20 chars · avg 0

Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.

Known vulnerabilities

No advisories in OSV for pdf-mcp@3.8.0 as of 50 min ago. This is the package itself, not its dependencies.