MCP, MCP server
PyEuropePMC
PyEuropePMC is a Python client for Europe PMC.
Compatibility: Not stated.
Grade D
Two or more Medium findings, or a High finding. Only try it in a sandbox.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
Rescanned at commit 8f782b55455a.
INSTALL_REMOTE_SCRIPT NETWORK_HOST_FROM_INPUT
Why this grade
- INSTALL_REMOTE_SCRIPT Medium
Fetches a script from the network and runs it (a pipe to a shell, or an install hook with a URL).
examples/scripts/codescene_analysis.sh, line 30
echo "Installation: curl -s https://downloads.codescene.io/enterprise/cli/install-cs-tool.sh | bash -s -- -y" - NETWORK_HOST_FROM_INPUT Medium
A file takes a URL or endpoint as input and has no fixed host list.
src/pyeuropepmc/core/exceptions.py, line 1045
... response = requests.get(url)
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.
If you think this grade is wrong, email [email protected] with the entry link and your evidence. We aim to acknowledge within two working days and decide within seven. If we confirm an error, we aim to correct it within 24 hours of confirming it. These are aims, not guarantees.
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
Concern
can delete files.
PERMISSION_DELETE_FILES
examples/07-advanced/04-mecfs-kg-readiness-demo.py, line 331
shutil.rmtree(self.cache_dir)
examples/scripts/create_suggestions.py, line 33
result = subprocess.run(
examples/scripts/create_suggestions.py, line 85
result = subprocess.run(
Show more
examples/scripts/local_test.py, line 35
result = subprocess.run(
examples/scripts/local_test.py, line 53
result = subprocess.run(
src/pyeuropepmc/cache/cache.py, line 143
os.remove(str(db_path))
.github/workflows/analyze_repo.yml, line 532
result = subprocess.run(cmd, capture_output=True, text=True)
.github/workflows/analyze_repo.yml, line 536
result = subprocess.run(
.github/workflows/changelog.yml, line 87
return subprocess.run(
src/pyeuropepmc/features/fulltext/extensions/mathml.py, line 1381
subprocess.run( # nosec B603, B607
Install and update
Serious
install fetches a script from the network.
INSTALL_REMOTE_SCRIPT
examples/scripts/codescene_analysis.sh, line 30
echo "Installation: curl -s https://downloads.codescene.io/enterprise/cli/install-cs-tool.sh | bash -s -- -y"
.github/workflows/analyze_repo.yml, line 61
curl -s https://downloads.codescene.io/enterprise/cli/install-cs-tool.sh | bash -s -- -y
.github/workflows/cdci.yml, line 187
run: curl -sSf https://downloads.codescene.io/enterprise/cli/install-cs-tool.sh | bash -s -- -y
Network
Serious
accepts a host from input, with no fixed list in this file.
NETWORK_HOST_FROM_INPUT
src/pyeuropepmc/core/exceptions.py, line 1045
... response = requests.get(url)
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
examples/09-enrichment/advanced_enrichment.py, line 50
semantic_scholar_api_key=os.getenv("SEMANTIC_SCHOLAR_API_KEY"),
examples/10-semantic-scholar/demo_semantic_scholar.py, line 15
api_key = os.environ.get("SEMANTIC_SCHOLAR_API_KEY")
examples/10-semantic-scholar/semantic_scholar_demo.py, line 6
api_key = os.environ.get("SEMANTIC_SCHOLAR_API_KEY")
Show more
examples/10-semantic-scholar/test_rate_limit.py, line 12
api_key = os.environ.get("SEMANTIC_SCHOLAR_API_KEY")
src/pyeuropepmc/agentic/llm_client.py, line 104
self.api_key = api_key or os.getenv("OPENAI_API_KEY")
src/pyeuropepmc/benchmark/dataset.py, line 362
token = os.environ.get("HUGGINGFACE_API_KEY") or os.environ.get("HF_TOKEN")
src/pyeuropepmc/cli/agentic.py, line 28
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
src/pyeuropepmc/features/bibliography/zotero.py, line 67
self._api_key = api_key or os.getenv("ZOTERO_API_KEY", "")
examples/10-semantic-scholar/test_rate_limit.py, line 7
env_path = Path(__file__).parent / ".env"
examples/10-semantic-scholar/test_rate_limit.py, line 10
print(f"Loaded .env from: {env_path}")
examples/scripts/codescene_analysis.sh, line 8
# Load environment variables from .env file if it exists
examples/scripts/codescene_analysis.sh, line 9
if [ -f ".env" ]; then
examples/scripts/codescene_analysis.sh, line 10
echo "🔧 Loading environment variables from .env file..."
examples/scripts/codescene_analysis.sh, line 12
source .env
src/pyeuropepmc/benchmark/dataset.py, line 354
# Load HF token from .env if available
src/pyeuropepmc/cli/__init__.py, line 14
Automatically loads ``.env`` files from (in order):
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Concern
contains an encoded blob in a file that should be readable.
OBFUSCATION_ENCODED_BLOB
poetry.lock, line 1
# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand.
benchmarks/benchmark_output/small_test/benchmark_knowledge_graph.ttl, line 1
@prefix bibo: <http://purl.org/ontology/bibo/> .
examples/04-fulltext-parser/03-modular-parsing.ipynb, line 1
{
Show more
examples/07-advanced-analytics/04-analytics-demo.ipynb, line 1
{
examples/09-enrichment/enrichment_demo.ipynb, line 1
{
examples/enrichment_responses/merged_10_1002_ana_27128.json, line 1
{
examples/enrichment_responses/merged_10_1038_s41467-025-66220-x.json, line 1
{
examples/enrichment_responses/raw_openalex_10_1038_s41467-025-66220-x.json, line 1
{
examples/07-advanced-analytics/04-analytics-demo.ipynb, line 883
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKAAAAJICAYAAABWnpxpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQ
examples/07-advanced-analytics/04-analytics-demo.ipynb, line 962
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKAAAAJICAYAAABWnpxpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQ
examples/07-advanced-analytics/04-analytics-demo.ipynb, line 1007
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9YAAAJQCAYAAABrd/zDAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQ
examples/07-advanced-analytics/04-analytics-demo.ipynb, line 1140
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9gAAAJICAYAAACaO0yGAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQ
examples/07-advanced-analytics/04-analytics-demo.ipynb, line 1200
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9gAAAJICAYAAACaO0yGAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQ
examples/07-advanced-analytics/04-analytics-demo.ipynb, line 1313
"image/png": "iVBORw0KGgoAAAANSUhEUgAABWgAAAJmCAYAAADB3mm6AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQ
examples/07-advanced-analytics/04-analytics-demo.ipynb, line 1344
"image/png": "iVBORw0KGgoAAAANSUhEUgAABWgAAAJmCAYAAADB3mm6AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQ
examples/07-advanced-analytics/04-analytics-demo.ipynb, line 1375
"image/png": "iVBORw0KGgoAAAANSUhEUgAABgQAAAOtCAYAAABOvw6GAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQ
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 8f782b55455a. can delete files. install fetches a script from the network. accepts a host from input, with no fixed list in this file. reads a credential or environment file. contains an encoded blob in a file that should be readable.
Date and source
Date checked:
github.com
Commit graded: 8f782b55455a2a64641f32500d834bd16e640e8a
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.