MCP, MCP server
membro
Membro is a memory for AI assistants that runs on your own computer.
Compatibility: Not stated.
Grade C
One Medium finding. Read the report before installing.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
NETWORK_HOST_FROM_INPUT
Why this grade
- NETWORK_HOST_FROM_INPUT Medium
A file takes a URL or endpoint as input and has no fixed host list.
bench_memory/safety.py, line 143
with urllib.request.urlopen(url, timeout=timeout) as resp:
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
Concern
can delete files.
PERMISSION_DELETE_FILES
bench_memory/live/launcher.py, line 93
proc: subprocess.Popen
bench_memory/live/launcher.py, line 111
proc = subprocess.Popen(
bench_memory/live/launcher.py, line 174
proc = subprocess.run(["lsof", "-nP", f"-iTCP:{handle.port}",
Show more
bench_memory/live/launcher.py, line 184
out = subprocess.run(["ps", "-o", "ppid=", "-p", str(pid)],
bench_memory/live/launcher.py, line 231
shutil.rmtree(root)
bench_memory/live/launcher.py, line 408
shutil.rmtree(pair.folder, ignore_errors=True)
bench_memory/live/run.py, line 140
shutil.rmtree(tmp, ignore_errors=True)
bench_memory/live/run.py, line 144
shutil.rmtree(dest, ignore_errors=True)
bench_memory/live/worktree.py, line 36
proc = subprocess.run(["git", "-C", str(repo_root), *args],
scripts/fold_changelog.py, line 84
r = subprocess.run(
Install and update
Concern
dependencies are not pinned.
INSTALL_UNPINNED
requirements.txt, line 1
fastapi>=0.141.1
Network
Serious
accepts a host from input, with no fixed list in this file.
NETWORK_HOST_FROM_INPUT
bench_memory/safety.py, line 143
with urllib.request.urlopen(url, timeout=timeout) as resp:
bench_memory/live/launcher.py, line 135
with urllib.request.urlopen(req, timeout=timeout) as resp:
memory_service/api.py, line 456
# the MCP admin server / curl ever uses (Authorization: Bearer, unchanged by
Show more
memory_service/api.py, line 744
const or_ = await fetch("/webauthn/login/options", {{method: "POST"}});
memory_service/api.py, line 761
const rr = await fetch("/webauthn/login", {{method: "POST",
memory_service/api.py, line 2106
"a forgotten password, or to use curl or MCP, set "
memory_service/restore.py, line 49
with urllib.request.urlopen(url, timeout=timeout):
scripts/import_claude_export.py, line 288
with socket.create_connection(("127.0.0.1", SERVICE_PORT), timeout=0.5):
scripts/raise_approved_confidence.py, line 175
with urllib.request.urlopen(url, timeout=3) as resp:
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
start.sh, line 15
# ---- load .env if present (keys stay out of the shell profile) ----
start.sh, line 16
if [ -f .env ]; then
start.sh, line 17
# .env holds live API keys and the owner token: owner-only, always. Tightened
Show more
start.sh, line 20
chmod 600 .env 2>/dev/null || true
start.sh, line 23
source .env
start.sh, line 62
warn "# Copy .env.example to .env and add keys to enable full capability. #"
bench_memory/live/env_allowlist.py, line 15
loudly. ``.env`` is never read by this package.
bench_memory/live/launcher.py, line 7
done. Nothing here reads your ``.env``, runs ``start.sh``, runs from a live
memory_service/config.py, line 169
if os.environ.get("MEMORY_AUTH_TOKEN"):
memory_service/embeddings.py, line 38
if os.environ.get("OPENAI_API_KEY"):
memory_service/embeddings.py, line 60
if not os.environ.get("OPENAI_API_KEY"):
memory_service/llm.py, line 147
if not os.environ.get("OPENAI_API_KEY"):
memory_service/llm.py, line 158
if not os.environ.get("OPENAI_API_KEY"):
memory_service/llm.py, line 274
if not os.environ.get("ANTHROPIC_API_KEY"):
memory_service/llm.py, line 313
if not os.environ.get("ANTHROPIC_API_KEY"):
memory_service/mcp_admin_server.py, line 59
tok = os.environ.get("MEMORY_AUTH_TOKEN", "")
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 a0f5ee3e1269. 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.
Date and source
Date checked:
github.com
Commit graded: a0f5ee3e126975388a4d876bf54a14392d9ad544
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.