live · scanning repos
Scanrepo
github.com
github.com / doobidoo

doobidoo/mcp-memory-service

Python·1604 files·commit 52568d9·scanned 15h ago·cached ✓
25/100
LOW RISK
Minor findings consistent with the project type. Nothing reachable from install hooks.

score capped at 25 — 2,052 stars — findings likely legitimate code patterns

verdict accurate?
Research / educational context
Partial architecture graph
threat-state: lowlive

FINDINGS ░▒▓

warningPython subprocess / os.system usageos.system() or subprocess with shell=True / suspicious commands can execute arbitrary shell commands. Plain pip/package installs are usually benign.scripts/maintenance/cleanup_organize.py
    print(f"Running: {command}")
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    if result.returncode != 0:
        print(f"ERROR: {result.stderr}")
+4
criticaleval() usage detectedeval() executes arbitrary code and is commonly used in malware to run obfuscated payloads fetched from remote servers.scripts/maintenance/update_graph_relationship_types.py
                    try:
                        tags = eval(row["tags"])
                    except:
                        tags = []
+8
criticalPython dynamic code executioneval(), exec() or compile() on untrusted input can execute arbitrary code. Common in Python malware for running obfuscated payloads.scripts/maintenance/update_graph_relationship_types.py
                    try:
                        tags = eval(row["tags"])
                    except:
                        tags = []
+7
criticalRemote script piped into a shellA shell script downloads remote content and executes it directly (e.g. `curl … | bash`). The payload is never stored or reviewable and can change server-side — a classic malware/backdoor install pattern.scripts/run/memory_wrapper_cleanup.sh
    else
        log "ERROR: uv not found. Install with: curl -LsSf https://astral.sh/uv/install.sh | sh"
        exit 1
    fi
+10
criticalPython dynamic code executioneval(), exec() or compile() on untrusted input can execute arbitrary code. Common in Python malware for running obfuscated payloads.scripts/run_memory_server.py
    with open(new_script, 'r', encoding='utf-8') as f:
        exec(compile(f.read(), new_script, 'exec'), global_vars)
else:
    print(f"[ERROR] Could not find {new_script}", file=sys.stderr)
+7
warningPython subprocess / os.system usageos.system() or subprocess with shell=True / suspicious commands can execute arbitrary shell commands. Plain pip/package installs are usually benign.scripts/server/check_server_health.py
    # Start the server
    server_process = subprocess.Popen(
        ['/bin/bash', '/Users/hkr/Documents/GitHub/mcp-memory-service/run_mcp_memory.sh'],
        cwd='/Users/hkr/Documents/GitHub/mcp-me...
+4
warningPython subprocess / os.system usageos.system() or subprocess with shell=True / suspicious commands can execute arbitrary shell commands. Plain pip/package installs are usually benign.scripts/testing/test_docker_functionality.py
    try:
        result = subprocess.run(
            cmd, 
            shell=True, 
+4
criticaleval() usage detectedeval() executes arbitrary code and is commonly used in malware to run obfuscated payloads fetched from remote servers.claude-hooks/core/topic-change.js
                // Use eval carefully on controlled content
                const resultsArray = eval(resultsMatch[1]);
                return resultsArray || [];
            }
+8
criticaleval() usage detectedeval() executes arbitrary code and is commonly used in malware to run obfuscated payloads fetched from remote servers.claude-hooks/utilities/dynamic-context-updater.js
                if (resultsMatch) {
                    return eval(resultsMatch[1]) || [];
                }
            }
+8
infoSuspicious files are not reachable from entry pointsFlagged files exist but are not imported by any entry point. They may be dead code, tests, or attack payloads triggered by another mechanism.+2
warningFlattened or dead control flowDetected switch(true), dead if branches, or deeply nested ternaries — patterns used by obfuscators to hide execution order.claude-hooks/utilities/context-formatter.js+3
warningFlattened or dead control flowDetected switch(true), dead if branches, or deeply nested ternaries — patterns used by obfuscators to hide execution order.site/demo/assets/ort/ort-wasm-simd-threaded.mjs+3
infoSuspicious file in repoExecutable file (auto-capture-hook.ps1) in repositoryclaude-hooks/core/auto-capture-hook.ps1+2
infoSuspicious file in repoExecutable file (install_claude_hooks_windows.ps1) in repositoryclaude-hooks/install_claude_hooks_windows.ps1+2
infoSuspicious file in repoExecutable file (memory_wrapper_cleanup.ps1) in repositoryscripts/run/memory_wrapper_cleanup.ps1+2
infoAuthor has no other public repositoriesGitHub user "dependabot[bot]" has no other public repositories, common for burner accounts used in scams.+2

Scores are heuristics. A “safe” verdict means no known-malicious patterns were found — clever malware can look boring. Wrong verdict? Flag it above; confirmed false positives become regression tests.

1127 files scanned @ 52568d9 | 10/29/2026 | heuristic scan — always review manually

risk by category
code execution25
network & exfiltration0
file system access0
obfuscation6
supply chain15
owasp / injection0
telemetry
files 1127/1604rules hit 16engine v7commit 52568d9

github

doobidoo/mcp-memory-service

Open-source persistent memory for AI agent pipelines (LangGraph, CrewAI, AutoGen) and Claude. REST API + knowledge graph + autonomous consolidation.

Python
2052
366
672d
1604 files
1127 scanned(70%)
52568d9

architecture░▒▓

entry (0) flagged (13) pkg (218)
618 nodes · 2183 edgesscroll to zoom · click node to jump to finding