memex-mcp@1.0.3
CAUTION· not startedPublisher claims: "Open-source MCP server and hook service that keeps Claude Code and Codex engineering context current as the code changes." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Not started: dependency install failed; the server itself was not observed.- Tested
- the dependency install step · every file read, file written and host contacted by what ran
- Not tested
- server startup · the tool list · tool behavior
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
GEMINI_API_KEYMEMEX_LLM_API_KEYNEO4J_PASSWORDNVIDIA_API_KEYNVIDIA_NIM_API_KEYConfiguration, not credentials: CODEX_HOME, DEBOUNCE_WINDOW, DECAY_HOUR, DECAY_HOURS_THRESHOLD, DECAY_MINUTE, EMBEDDING_MODEL, GEMINI_MODEL, GRAPHITI_LOG_LEVEL, MEMEX_EMBEDDING_DIM, MEMEX_EMBEDDING_MODEL, MEMEX_HOOK_CREATED, MEMEX_HOOKD, MEMEX_HOOKD_IDLE_SECONDS, MEMEX_IGNORED_PATTERNS, MEMEX_INTROSPECTION_ONLY, MEMEX_LIVE_CONTEXT, MEMEX_LIVE_NEO4J_URI, MEMEX_LLM_BASE_URL, MEMEX_LLM_MODEL, MEMEX_LLM_PROVIDER, MEMEX_MCP_TRANSPORT, MEMEX_NEO4J_CHECK_SECONDS, MEMEX_REGISTRY_PATH, NEO4J_DATABASE, NEO4J_URI, NEO4J_USER, NVIDIA_BASE_URL, NVIDIA_NIM_BASE_URL, POLL_INTERVAL, REPORT_DAY_OF_WEEK, REPORT_HOUR, REPORT_MINUTE, REPORT_PERIOD_DAYS, USERNAME- Where it talks to
- no vendor host named in the codeAlso ai.studio, astral.sh, d3js.org, opentelemetry.io — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- server startup · the tool list · tool behavior
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names ai.studio, astral.sh, d3js.org, opentelemetry.io as well as its own vendor. The guard injects GEMINI_API_KEY, MEMEX_LLM_API_KEY, NEO4J_PASSWORD, NVIDIA_API_KEY, NVIDIA_NIM_API_KEY only into requests to the host you bind (and its subdomains) and refuses the rest.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; not started: dependency install failed; the server itself was not observed) on 2026-11-11 and scored it 68/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Access to sensitive file paths; Access to sensitive file paths; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
serve_parser.add_argument("--env-file", dest="env_file", help="Path to an .env file to load before startup (in addition to <repo>/.env)")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Load .env file if it existsFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.repo_env = Path(path) / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.print("[FAIL] uv not found. Install via 'curl -LsSf https://astral.sh/uv/install.sh | sh'")Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.diff = subprocess.check_output(["git", "diff", "HEAD~1", "HEAD"], cwd=repo_root).decode().strip()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.message = subprocess.check_output(["git", "log", "-1", "--pretty=%B"], cwd=repo_root).decode().strip()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.done = subprocess.run([sys.executable, "-I", "runner.py"], cwd=root, capture_output=True,Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.return int(subprocess.run(command, capture_output=True, text=True, check=True).stdout.strip())Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."`memex serve --env-file <path/to/.env>`."Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Bearer-auth pattern is inspired by ``memex/mcp_server/http.py`` butFix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.subprocess.run(["git", "init", "-q", "-b", "main", str(repo)], check=True)Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.subprocess.run([editor, path], check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.from memex.mcp_server.http import run_http_serverFix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.hooks_dir = Path(subprocess.check_output(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.if relative.name.lower().startswith(".env") or "cred" in relative.name.lower():Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.absent) doesn't kill the whole export.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.memex/mcp_server/http.py) has no config knob here; it isn't a choice."""Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.raw = subprocess.check_output([Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.check_output(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.docker_ver = subprocess.check_output([docker_cmd, "--version"]).decode().strip()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.logger.debug("could not chmod bearer key file (likely non-POSIX); continuing")Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.sha = subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=repo_root).decode().strip()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return str(v).replace('\x00', '').replace('', '')Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.uv_ver = subprocess.check_output([uv_cmd, "--version"]).decode().strip()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.logged but do not raise, so a transient Neo4j blip cannot kill theFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.subprocess.Popen([sys.executable, "-m", "memex.hookd", key, *argv], stdin=subprocess.DEVNULL,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."Set these as environment variables, or place them in a .env file at "Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Bearer-token auth (memex/mcp_server/http.py's Depends(require_principal),Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.return subprocess.run(["git", "-C", str(self.root), *args], check=True, capture_output=True,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.Popen([sys.executable, "-m", "memex.hookd", key, *argv], stdin=subprocess.DEVNULL,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.run(["git", "-C", str(repo), "-c", "[email protected]", "-c", "user.name=p5",Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.output = subprocess.check_output(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.The watcher daemon swallows per-event errors so one bad file can't kill theFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.result = subprocess.run([sys.executable, "-m", *argv], input=raw, stdout=subprocess.PIPE, env=env)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."<repo>/.env (auto-loaded by `memex serve --repo <path>`), or pass "Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.print("[FAIL] uv not found. Install via 'curl -LsSf https://astral.sh/uv/install.sh | sh'")Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.files_changed = subprocess.check_output(["git", "diff-tree", "--no-commit-id", "--name-only", "-r", "HEAD"], cwd=repo_root).decode().strip().split("\n")Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for memex-mcp@1.0.3 as of 3d ago. This is the package itself, not its dependencies.
What would make this Verified
12 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Pipe-to-shell pattern≈ +9 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- Unclaimed publisher≈ +8 on the totalClaim stifler7: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Bidirectional text override characters detected≈ +4 on the totalReplace encoded or assembled strings with plain literals and remove undeclared network calls.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- MCP server using network transport (SSE/HTTP)≈ +2 on the totalNamespace tool names and keep tool descriptions literal; no instructions to the agent inside them.