MCP, MCP server
mengram
mengram, an MCP server listed in the PlugVet directory.
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 e90a8caa819f, unchanged since the check below.
NETWORK_HOST_FROM_INPUT OBFUSCATION_ENCODED_BLOB
Why this grade
- NETWORK_HOST_FROM_INPUT Medium
A file takes a URL or endpoint as input and has no fixed host list.
cli.py, line 1728
with urllib.request.urlopen(req, timeout=15, context=_ssl_context()) as resp: - OBFUSCATION_ENCODED_BLOB Medium
Contains a long base64 shaped string in a file that should be readable.
cloud/api.py, line 1
"""
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
cli.py, line 1606
r = subprocess.run(f"{command} --help", shell=True, capture_output=True,
cli.py, line 2182
subprocess.run(["pbcopy"], input=post.encode(), check=True)
cli.py, line 2425
r = subprocess.run([mengram_bin, "doctor"], capture_output=True, text=True, timeout=90)
Show more
cli.py, line 2831
os.remove(f)
benchmarks/locomo_bench.py, line 410
os.remove(STATE_FILE)
local/resume.py, line 70
out = subprocess.run(["git", "-C", str(cwd), *args], capture_output=True, text=True, timeout=timeout)
Install and update
Concern
dependencies are not pinned.
INSTALL_UNPINNED
requirements.txt, line 1
pyyaml>=6.0
Network
Serious
accepts a host from input, with no fixed list in this file.
NETWORK_HOST_FROM_INPUT
cli.py, line 1728
with urllib.request.urlopen(req, timeout=15, context=_ssl_context()) as resp:
cli.py, line 2006
with urllib.request.urlopen(req, timeout=30, context=ctx) as r:
cli.py, line 2036
with urllib.request.urlopen(req, timeout=15, context=ctx) as r:
Show more
benchmark/local-extraction/bench.py, line 99
with urllib.request.urlopen(req, timeout=self.timeout) as resp:
benchmarks/locomo_bench.py, line 392
print(" wget -O benchmarks/data/locomo10.json \\")
cloud/billing.py, line 49
with urllib.request.urlopen(req) as resp:
cloud/client.py, line 146
with urllib.request.urlopen(req, context=_SSL_CTX) as resp:
cloud/client.py, line 289
with urllib.request.urlopen(req, context=_SSL_CTX) as resp:
cloud/store/_webhooks.py, line 211
urllib.request.urlopen(req, timeout=10)
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
cli.py, line 269
print(f" Source: {'env MENGRAM_API_KEY' if os.environ.get('MENGRAM_API_KEY') else _cloud_config_path()}")
cli.py, line 388
api_key = os.environ.get("MENGRAM_API_KEY", "")
cli.py, line 1794
key = os.environ.get("MENGRAM_API_KEY", "").strip()
Show more
cli.py, line 2264
existing_key = os.environ.get("MENGRAM_API_KEY", "")
cli.py, line 2916
where = "env" if os.environ.get("MENGRAM_API_KEY") else "~/.mengram/config.json"
cli.py, line 3197
api_key = os.environ.get("MENGRAM_API_KEY", "")
mengram.py, line 98
key = api_key or os.getenv("ANTHROPIC_API_KEY", "")
mengram.py, line 101
key = api_key or os.getenv("OPENAI_API_KEY", "")
examples/customer-support-agent/README.md, line 14
cp .env.example .env
examples/customer-support-agent/README.md, line 15
# Edit .env and add your keys
examples/devops-agent/README.md, line 14
cp .env.example .env
examples/devops-agent/README.md, line 15
# Edit .env and add your Mengram API key (get one at https://mengram.io/dashboard)
examples/personal-assistant/README.md, line 14
cp .env.example .env
examples/personal-assistant/README.md, line 15
# Edit .env and add your keys
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
cloud/api.py, line 1
"""
cloud/dashboard.html, line 1
<!DOCTYPE html>
cloud/landing.html, line 1
<!DOCTYPE html>
Show more
README.md, line 4
<source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/badge/Mengram-a855f7?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53
README.md, line 5
<img alt="Mengram" src="https://img.shields.io/badge/Mengram-a855f7?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb
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 e90a8caa819f. can delete files. dependencies are not pinned. 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: e90a8caa819f5f75fdb3cecb262e1b5071de894b
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.