preflight

https://github.com/AdelElo13/neuromcp

neuromcp

Risky

Score 52 / 100 · 80 files read · 0 critical, 0 high, 24 medium, 19 low findings

Report 6cb68eff64eb6cdf · first scanned 2026-10-28 · scanned 3× · keyed to the exact package contents, so this link always shows this version

Listed in the Agent Census directory data

Subscores

credentials62
exfiltration92
execution4
injection100
obfuscation100
files12

100 is clean. Deductions come only from the cited findings below.

Findings

mediumCode contacts static.modelcontextprotocol.io, which the documentation never mentions
(package) · line 1 · rule M3
static.modelcontextprotocol.io
mediumCan run shell commands from code
bin/daemon-port.mjs · line 15 · rule M1
leSync } from 'node:child_process'; import { existsSync } from 'node:fs'; import { resolve } from 'node:path'; import { homedir, p
mediumCan run shell commands from code
bin/doctor.mjs · line 21 · rule M1
spawn } from 'node:child_process'; import { readFileSync, writeFileSync, existsSync, readdirSync } from 'node:fs'; import { creat
mediumWrites files under the user home directory
bin/doctor.mjs · line 22 · rule M5
ort { readFileSync, writeFileSync, existsSync, readdirSync } from 'node:fs'; import { createHash } from 'node:crypto'; import { cr
mediumCan run shell commands from code
bin/enable-consolidation.mjs · line 25 · rule M1
leSync } from 'node:child_process'; import { fileURLToPath } from 'node:url'; const __dirname = dirname(fileURLToPath(import.meta
mediumWrites files under the user home directory
bin/enable-consolidation.mjs · line 22 · rule M5
Sync, readFileSync, writeFileSync, unlinkSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { homedir, platf
mediumCan run shell commands from code
bin/enable-daemon.mjs · line 38 · rule M1
leSync } from 'node:child_process'; import { fileURLToPath } from 'node:url'; import { resolveStableNodeBin } from './resolve-node
mediumWrites files under the user home directory
bin/enable-daemon.mjs · line 35 · rule M5
Sync, readFileSync, writeFileSync, unlinkSync, chmodSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { hom
mediumCan run shell commands from code
bin/enable-zombie-cleanup.mjs · line 36 · rule M1
leSync } from 'node:child_process'; import { fileURLToPath } from 'node:url'; const __dirname = dirname(fileURLToPath(import.meta
mediumWrites files under the user home directory
bin/enable-zombie-cleanup.mjs · line 33 · rule M5
Sync, readFileSync, writeFileSync, unlinkSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { homedir, platf
mediumCan run shell commands from code
bin/init-wiki.mjs · line 22 · rule M1
leSync } from 'node:child_process'; import { createHash } from 'node:crypto'; import { fileURLToPath } from 'node:url'; import { s
mediumWrites files under the user home directory
bin/init-wiki.mjs · line 19 · rule M5
Sync, readFileSync, writeFileSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { homedir, platform } from '
mediumCan run shell commands from code
bin/init.mjs · line 41 · rule M1
leSync } from 'node:child_process'; import { fileURLToPath } from 'node:url'; import { isMainModule } from './is-main.mjs'; import
mediumWrites files under the user home directory
bin/init.mjs · line 30 · rule M5
s fsReadFileSync, writeFileSync as fsWriteFileSync, copyFileSync as fsCopyFileSync, mkdirSync as fsMkdirSync, renameSync a
mediumCan run shell commands from code
bin/neuromcp-connect.mjs · line 31 · rule M1
*/ import { spawn, execFile } from 'node:child_process'; import { platform } from 'node:os'; import { isMainModule } from './is-m
mediumCan run shell commands from code
bin/reembed.mjs · line 30 · rule M1
leSync } from 'node:child_process'; import { existsSync, renameSync, unlinkSync } from 'node:fs'; import { resolve, dirname } from
mediumRuns a command automatically at install time (postinstall)
package.json · line 1 · rule M4
postinstall: node scripts/download-model.mjs || true
mediumWrites files under the user home directory
scripts/ab-sweep.mjs · line 24 · rule M5
stsSync, mkdirSync, writeFileSync } from 'node:fs'; import { join } from 'node:path'; import { homedir } from 'node:os'; import Da
mediumCan run shell commands from code
scripts/consolidate-sessions.py · line 253 · rule M1
days=2) r = subprocess.run( ["git", "-C", str(repo), "log", "--all", f"--since={first:%Y-%m-%d}", f"--until={l
mediumWrites files under the user home directory
scripts/consolidate-sessions.py · line 1008 · rule M5
with log_path.open("a") as f: f.write(f"\n## [{datetime.now().strftime('%Y-%m-%d')}] consolidation | auto\n"
mediumWrites files under the user home directory
scripts/download-model.mjs · line 21 · rule M5
irSync, existsSync, createWriteStream, renameSync, unlinkSync, accessSync, constants } from 'node:fs'; import { resolve, dirname }
mediumCan run shell commands from code
scripts/gen-hook-hashes.mjs · line 19 · rule M1
leSync } from 'node:child_process'; import { createHash } from 'node:crypto'; import { existsSync, readFileSync, writeFileSync } f
mediumWrites files under the user home directory
scripts/usefulness-dashboard.mjs · line 24 · rule M5
stsSync, mkdirSync, writeFileSync } from 'node:fs'; import { join } from 'node:path'; import { homedir } from 'node:os'; import Da
mediumWrites files under the user home directory
scripts/wiki-obsidian-bridge.mjs · line 27 · rule M5
Sync, readFileSync, writeFileSync, statSync, existsSync } from 'node:fs'; import { join } from 'node:path'; import { homedir } fro
lowReads named environment variables (normal for API keys; listed in the permission summary)
bin/dedup-entity-names.mjs · line 28 · rule L1
y'); const dbPath = process.env.NEUROMCP_DB_PATH ?? resolve(homedir(), '.neuromcp', 'memory.db'); const db = openDatabase(dbPath)
lowReads named environment variables (normal for API keys; listed in the permission summary)
bin/doctor.mjs · line 81 · rule L1
ultFetch, env = process.env, osPlatform = platform(), plistPort = readLaunchdDaemonPort, } = deps; const name = 'd
lowReads named environment variables (normal for API keys; listed in the permission summary)
bin/embed.mjs · line 29 · rule L1
(); const DB_PATH = process.env.NEUROMCP_DB || join(HOME, '.neuromcp', 'memory.db'); function emit(obj) { // Exit code matches
lowReads named environment variables (normal for API keys; listed in the permission summary)
bin/enable-consolidation.mjs · line 35 · rule L1
catch { return process.env.USER || process.env.LOGNAME || ''; } } const USER = currentUser(); const NEUROMCP_DIR = join(HOM
lowReads named environment variables (normal for API keys; listed in the permission summary)
bin/enable-daemon.mjs · line 122 · rule L1
HOSTS.has(lower) && process.env.NEUROMCP_DAEMON_INSECURE_NON_LOOPBACK !== '1') { console.error(` x --host "${raw}" is not a l
lowReads named environment variables (normal for API keys; listed in the permission summary)
bin/enable-zombie-cleanup.mjs · line 138 · rule L1
'); const pathEnv = process.env.PATH || '/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin'; const rendered = template .replaceAll(
lowReads named environment variables (normal for API keys; listed in the permission summary)
bin/init.mjs · line 531 · rule L1
t: platform(), env: process.env }; console.log(`\n🧠 neuromcp init${dryRun ? ' (dry-run — nothing will be written)' : ''}\n`);
lowReads named environment variables (normal for API keys; listed in the permission summary)
bin/neuromcp-connect.mjs · line 178 · rule L1
cess.argv.slice(2), process.env)); } catch (err) { console.error(`neuromcp-connect: ${err instanceof Error ? err.message : S
lowReads named environment variables (normal for API keys; listed in the permission summary)
bin/query.mjs · line 30 · rule L1
(); const DB_PATH = process.env.NEUROMCP_DB || join(HOME, '.neuromcp', 'memory.db'); const args = process.argv.slice(2); function
lowReads named environment variables (normal for API keys; listed in the permission summary)
bin/reembed.mjs · line 438 · rule L1
ath = resolveDbPath(process.env, args.db); if (!existsSync(dbPath)) { process.stderr.write(`neuromcp-reembed: no database at
lowReads named environment variables (normal for API keys; listed in the permission summary)
scripts/ab-sweep.mjs · line 30 · rule L1
(); const DB_PATH = process.env.NEUROMCP_DB || join(HOME, '.neuromcp', 'memory.db'); const EXP_DIR = join(HOME, '.neuromcp', 'expe
lowReads named environment variables (normal for API keys; listed in the permission summary)
scripts/backfill-embeddings.mjs · line 28 · rule L1
(); const DB_PATH = process.env.NEUROMCP_DB || join(HOME, '.neuromcp', 'memory.db'); const args = process.argv.slice(2); const DR
lowReads named environment variables (normal for API keys; listed in the permission summary)
scripts/backfill-verbatim.mjs · line 24 · rule L1
(); const DB_PATH = process.env.NEUROMCP_DB || join(HOME, '.neuromcp', 'memory.db'); const SESSIONS_DIR = join(HOME, '.neuromcp',
lowReads named environment variables (normal for API keys; listed in the permission summary)
scripts/consolidate-sessions.py · line 60 · rule L1
E_ISOLATED_ENV = {**os.environ, "CLAUDE_CODE_DISABLE_CLAUDE_MDS": "1"} CONTRADICTION_CHECK = os.environ.get("NEUROMCP_CONTRADICTIO
lowReads named environment variables (normal for API keys; listed in the permission summary)
scripts/download-model.mjs · line 53 · rule L1
ooseTargetDir(env = process.env) { const override = env.NEUROMCP_MODEL_DIR; if (override !== undefined && override !== '') ret
lowReads named environment variables (normal for API keys; listed in the permission summary)
scripts/index-wiki.mjs · line 32 · rule L1
(); const DB_PATH = process.env.NEUROMCP_DB || join(HOME, '.neuromcp', 'memory.db'); const WIKI_DIR = process.env.NEUROMCP_WIKI ||
lowReads named environment variables (normal for API keys; listed in the permission summary)
scripts/reprocess-review-queue.py · line 33 · rule L1
t Path HOME = Path(os.environ.get("HOME", str(Path.home()))) NEUROMCP_DIR = Path(os.environ.get("NEUROMCP_DIR", str(HOME / ".neur
lowReads named environment variables (normal for API keys; listed in the permission summary)
scripts/usefulness-dashboard.mjs · line 30 · rule L1
(); const DB_PATH = process.env.NEUROMCP_DB || join(HOME, '.neuromcp', 'memory.db'); const EXP_DIR = join(HOME, '.neuromcp', 'expe
lowReads named environment variables (normal for API keys; listed in the permission summary)
scripts/wiki-obsidian-bridge.mjs · line 241 · rule L1
; const wikiDir = process.env.NEUROMCP_WIKI || join(homedir(), '.neuromcp', 'wiki'); if (!existsSync(wikiDir)) { process.s

Permission surface

Network endpoints
arxiv.orgclaude.comdocs.mem0.aievil.example.comgist.github.comgithub.comhuggingface.coimg.shields.iokeepachangelog.commastra.ainodejs.orgobsidian.mdollama.comstatic.modelcontextprotocol.iowww.apache.orgwww.getzep.comwww.npmjs.comwww.sidnfonds.nl
Environment read
HOMELOGNAMENEUROMCP_ALLOW_TRANSIENT_INSTALLNEUROMCP_AUDIT_FAIL_OPENNEUROMCP_CONTRADICTION_CHECKNEUROMCP_DAEMON_INSECURE_NON_LOOPBACKNEUROMCP_DBNEUROMCP_DB_PATHNEUROMCP_DIRNEUROMCP_NO_EMBEDNEUROMCP_WIKIPATHUSERUSERPROFILE
Shell execution
yes — code or scripts can run shell commands
Install hooks
postinstall: node scripts/download-model.mjs || true
Credential material
Reads named environment variables (normal for API keys; listed in the permission summary)

Provenance

Source
GitHub
Repository
AdelElo13/neuromcp
Owner
AdelElo13
Stars
4
Forks
0
Repo created
2026-04-04
Last push
2026-10-15
License
NOASSERTION

Watch this package

Interest list only. We store the address and this report link, nothing else. No mail is sent in v1.

Share this report: https://preflight.orbitaldeskllc.com/r/6cb68eff64eb6cdf