MCP, MCP server
Paper Distill MCP
Paper Distill MCP, an MCP server listed in the PlugVet directory.
Compatibility: Not stated.
Grade B
Minor issues only, no Medium or High. Worth a quick look at the findings below before installing.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
Rescanned at commit 90096c6cd40e, unchanged since the check below.
NETWORK_NO_FIXED_HOST SECRETS_PATH_DOTENV PERMISSION_SHELL_DECLARED INSTALL_DOCUMENTED_INSTALLER SECRETS_ENV_READ
Why this grade
- NETWORK_NO_FIXED_HOST Low
Makes a network call whose host is not written as a fixed address.
mcp_server/server.py, line 932
httpx.post(deploy_hook, timeout=10) - SECRETS_PATH_DOTENV Low
Mentions a .env file.
bot/notifier.py, line 140
env_path = Path(__file__).resolve().parent.parent / ".env" - PERMISSION_SHELL_DECLARED Note
Runs shell commands, and the manifest or description says so.
mcp_server/server.py, line 920
subprocess.run(["git", "add"] + files_to_add, cwd=str(repo), check=True, capture_output=True) - INSTALL_DOCUMENTED_INSTALLER Note
Documentation shows an installer that pipes a download into a shell.
README.md, line 40
> No `uv`? → `curl -LsSf https://astral.sh/uv/install.sh | sh` or `brew install uv` - SECRETS_ENV_READ Note
Reads an environment variable whose name contains KEY, SECRET, TOKEN, PASSWORD or CREDENTIAL.
bot/notifier.py, line 143
token = os.getenv("TELEGRAM_BOT_TOKEN")
Any High, or two or more Medium findings, give D. One Medium gives C. Low findings or a security Note give B. Each code names a finding behind the letter.
Grades are a hygiene check of the source at the commit shown, on the date checked, not a security audit or a guarantee. The free directory grades are automated. Before release, a PlugVet engineer reviews every paid report and any grade we hold back, including all F grades, against the source code and the evidence we quote.
What was checked
Plain notes from the hygiene checks.
Permissions
Note
requests shell access. The manifest names this permission.
PERMISSION_SHELL_DECLARED
mcp_server/server.py, line 920
subprocess.run(["git", "add"] + files_to_add, cwd=str(repo), check=True, capture_output=True)
mcp_server/server.py, line 921
subprocess.run(
mcp_server/server.py, line 925
subprocess.run(["git", "push"], cwd=str(repo), check=True, capture_output=True)
Install and update
Note
README documents an installer that pipes a download into a shell.
INSTALL_DOCUMENTED_INSTALLER
README.md, line 40
> No `uv`? → `curl -LsSf https://astral.sh/uv/install.sh | sh` or `brew install uv`
Network
Concern
can reach a host that is not written as a fixed address.
NETWORK_NO_FIXED_HOST
mcp_server/server.py, line 932
httpx.post(deploy_hook, timeout=10)
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
bot/notifier.py, line 140
env_path = Path(__file__).resolve().parent.parent / ".env"
bot/notifier.py, line 143
token = os.getenv("TELEGRAM_BOT_TOKEN")
curate/ranker.py, line 279
env_path = Path(__file__).resolve().parent.parent / ".env"
Show more
generate/daily_digest.py, line 336
env_path = Path(__file__).resolve().parent.parent / ".env"
generate/non_pushed_papers.py, line 126
env_path = Path(__file__).resolve().parent.parent / ".env"
generate/obsidian_note.py, line 433
load_dotenv(project_root / ".env")
generate/obsidian_note.py, line 436
api_key = os.getenv("ZOTERO_API_KEY", "")
generate/obsidian_note.py, line 589
env_path = Path(__file__).resolve().parent.parent / ".env"
integrations/zotero_api.py, line 10
Requires ZOTERO_LIBRARY_ID and ZOTERO_API_KEY in .env.
integrations/zotero_api.py, line 468
env_path = project_root / ".env"
integrations/zotero_api.py, line 472
api_key = os.getenv("ZOTERO_API_KEY", "")
integrations/zotero_api.py, line 532
api_key = os.getenv("ZOTERO_API_KEY", "")
integrations/zotero_api.py, line 570
api_key = os.getenv("ZOTERO_API_KEY", "")
integrations/zotero_api.py, line 618
api_key = os.getenv("ZOTERO_API_KEY", "")
search/core_search.py, line 82
api_key = os.getenv("CORE_API_KEY", "")
search/deepseek.py, line 226
api_key = api_key or os.getenv("DEEPSEEK_API_KEY", "")
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Pass
No encoded or minified payload found.
Licence
Pass
A licence file is present (LICENSE).
Maintainer activity
Pass
The latest commit is within the last 365 days.
Note
Hygiene check of commit 90096c6cd40e. requests shell access. The manifest names this permission. README documents an installer that pipes a download into a shell. can reach a host that is not written as a fixed address. reads a credential or environment file.
Date and source
Date checked:
github.com
Commit graded: 90096c6cd40ecab87dc515851877fe6c967dca94
This link goes to the original host. PlugVet does not host or check what you download from there, and installing it is your own decision and risk.