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
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