Grades are a hygiene check, not a security guarantee.

MCP, MCP server

longbrain

Shared long-term memory for Claude Code, Codex, Hermes Desktop, and any MCP-compatible AI agent. Longbrain is a self-hosted, Docker-packaged memory system that lets multiple agents share the same project-aware context.

Compatibility: Not stated.

Grade B

Minor issues only, no Medium or High. Worth a quick look at the findings below before installing.

Graded by PlugVetRubric v2

Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.

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.

    setup.sh, line 91 if curl -fsS http://localhost:8800/health >/dev/null 2>&1; then

  • SECRETS_PATH_DOTENV Low

    Mentions a .env file.

    setup.sh, line 33 # 2. .env

  • PERMISSION_SHELL_DECLARED Note

    Runs shell commands, and the manifest or description says so.

    adapters/python_minimal/adapter.py, line 53 out = subprocess.run(

  • INSTALL_DOCUMENTED_INSTALLER Note

    Documentation shows an installer that pipes a download into a shell.

    README.md, line 154 curl -fsSL https://raw.githubusercontent.com/ngocthanh06/longbrain/main/install.sh | bash

  • SECRETS_ENV_READ Note

    Reads an environment variable whose name contains KEY, SECRET, TOKEN, PASSWORD or CREDENTIAL.

    adapters/python_minimal/adapter.py, line 30 API_KEY = os.environ.get("LONGBRAIN_API_KEY", "")

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

    adapters/python_minimal/adapter.py, line 53

    out = subprocess.run(

    hooks/claude/common.py, line 131

    out = subprocess.run(

    hooks/codex/turn_ended.py, line 238

    subprocess.Popen(command + forwarded_args)

    Show more

    scripts/configure_claude.py, line 208

    legacy = subprocess.run(

    scripts/configure_claude.py, line 212

    removed = subprocess.run(

    scripts/configure_claude.py, line 222

    probe = subprocess.run(

    scripts/configure_claude.py, line 232

    subprocess.run(

    scripts/configure_claude.py, line 236

    add = subprocess.run(

  • Install and update

    Note

    README documents an installer that pipes a download into a shell.

    INSTALL_DOCUMENTED_INSTALLER

    README.md, line 154

    curl -fsSL https://raw.githubusercontent.com/ngocthanh06/longbrain/main/install.sh | bash

  • Network

    Concern

    can reach a host that is not written as a fixed address.

    NETWORK_NO_FIXED_HOST

    setup.sh, line 91

    if curl -fsS http://localhost:8800/health >/dev/null 2>&1; then

    setup.sh, line 208

    curl -fsS http://localhost:8800/health | "$HERMES_PY" -m json.tool 2>/dev/null || true

    setup.sh, line 212

    echo " curl http://localhost:8800/health # last_written_at must update after every chat turn"

    Show more

    adapters/python_minimal/adapter.py, line 42

    with urllib.request.urlopen(req, timeout=timeout) as resp:

    hooks/on_session_end.py, line 45

    urllib.request.urlopen(request, timeout=5)

    hooks/on_session_start.py, line 33

    urllib.request.urlopen(request, timeout=5)

    hooks/post_llm_call.py, line 222

    urllib.request.urlopen(request, timeout=5)

    hooks/pre_llm_call.py, line 74

    with urllib.request.urlopen(request, timeout=TIMEOUT) as resp:

    hooks/claude/common.py, line 108

    with urllib.request.urlopen(request, timeout=timeout) as resp:

    hooks/claude/common.py, line 118

    with urllib.request.urlopen(request, timeout=timeout) as resp:

    hooks/codex/turn_ended.py, line 179

    with urllib.request.urlopen(request, timeout=timeout):

    scripts/enable_doc_search.sh, line 48

    if curl -fsS http://localhost:8800/health 2>/dev/null | grep -q '"doc_embedder_ready":true'; then

    scripts/repair_stalled_consolidation.py, line 113

    " curl -X POST http://localhost:8800/memory/consolidate-pending"

  • Secrets

    Concern

    reads a credential or environment file.

    SECRETS_ENV_READ SECRETS_PATH_DOTENV

    setup.sh, line 33

    # 2. .env

    setup.sh, line 34

    step "Configuring .env"

    adapters/python_minimal/adapter.py, line 30

    API_KEY = os.environ.get("LONGBRAIN_API_KEY", "")

    Show more

    setup.sh, line 35

    if [ ! -f .env ]; then

    setup.sh, line 36

    cp .env.example .env

    setup.sh, line 37

    echo "Created .env from .env.example (default: local fastembed, no API key needed)."

    setup.sh, line 40

    echo ".env already exists, keeping it as-is."

    setup.sh, line 43

    # Docker Compose reads .env automatically, but host-side Python configurators

    setup.sh, line 48

    env_exports="$(set -a; . ./.env; printf 'export LONGBRAIN_API_KEY=%q DOCUMENTS_COLLECTION=%q\n' \

    hooks/api_auth.py, line 74

    return os.environ.get("LONGBRAIN_API_KEY", "")

    llamaindex-service/app/config.py, line 103

    CHAT_MEMORY_TOKEN_LIMIT = int(os.getenv("CHAT_MEMORY_TOKEN_LIMIT", "3000"))

    llamaindex-service/app/config.py, line 299

    API_KEY = os.getenv("LONGBRAIN_API_KEY", "")

    llamaindex-service/app/providers.py, line 76

    api_key=os.getenv("NVIDIA_API_KEY", ""),

    scripts/configure_codex.py, line 48

    API_KEY = os.environ.get("LONGBRAIN_API_KEY", "")

    scripts/configure_hermes.py, line 135

    api_key = os.environ.get("LONGBRAIN_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 ceb96cd1b591. 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:

View source

github.com

Commit graded: ceb96cd1b591efda73c9dc112166dc281f208faf

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.

Read how this letter is chosen