doobidoo/mcp-memory-service

GitHub ↗ · How this check works

Per-setup public labels: Linux / Haiku: Works · Linux / Luna: Not tested

Static status badge · SVG · read-only JSON. Embed with ![Coldpass status](https://coldpass.dev/badge/doobidoo--mcp-memory-service.svg).

mcp-server

Works

README claims checked out on 1 recorded setup. Combinations not listed here were not tested.

Answers apply to each recorded setup, revision and operation. Earlier observations remain in Run details.

Tested on Linux
PlatformHaikuLuna
Linuxyesnot tested

Linux / Haiku 5.5: yes · Oct 23, 2026 · 441e0ee1a17b · claude-code / 2.1.300 (Claude Code)
Recorded operation: <guest-path> server · local stdio MCP start + initialize + tools/list

Linux / Luna: not tested · Oct 24, 2026 · 441e0ee1a17b · codex / codex-cli 0.163.0
Recorded operation: <guest-path> server --http --http-port 18234 · local HTTP start + response check

Does what it says
1 of 1 claims checked out
  • Persistent memory: memories stored in one session can be retrieved later through the MCP server: Real input produced the expected result: the blue heron guards the north gate

    Source: Keep decisions, notes, and project context across sessions and agents.

    Input: {"tool": "memory_search", "arguments": {"query": "blue heron north gate"}}

    Expected: stored memory returned

    Command: <guest-path> server tools/call {"tool": "memory_search", "arguments": {"query": "blue heron north gate"}}

    Observed: the blue heron guards the north gate\n Hash: 68f94fe7bd77ff403d348a5f68be2b932516ea19a3788eec889889a38e4d8fe4\n Created: 2026-10-24T02:01:32.081062Z [untagged]"}], "isError": false}

MCP
Yes, observed
Local or hosted
both local and hosted
Both a local install and a hosted service
Needs keys or browser
None seen
Maintained
Maintained
actively maintained: last commit 0 days ago; 677 commits and 357 merged PRs in 90 days; 25 open issues, 1 open PRs; 1 of 1 recent threads got a maintainer reply, median first reply 4.6h; latest release 2026-10-23

Last commit Oct 23, 2026

Setup time
16 min 17 s
16 min 17 s to a working result
Issue
none found in recorded check
Examples
not tested (blocked)
  • Quickstart: run the MCP server with the documented command and exercise a real tool: Covered by the probe and claim (memory server over stdio, memory_store then memory_search). The repository pytest suite was not run; no other runnable README example was executed.

    Source: README.md

    Expected: documented command completes successfully

    Observed: Covered by the probe and claim (memory server over stdio, memory_store then memory_search). The repository pytest suite was not run; no other runnable README example was executed.

Evidence
README behavior checked
Agent interfaces
MCP, API (documented only)
MCP, API (documented only)

Observed interfaces were exercised by the checker. Documentation alone does not confirm compatibility.

MCP context
28 tools · about 10,526 tokens
28 tools · about 10,526 tokens

Largest returned tools/list page in these observations. Compact UTF-8 definition bytes ÷ 4, rounded up; approximate, excluding client framing and tool results. This is context size, not proof that every tool works.

Measured on linux with Haiku 5.5 · Oct 23, 2026 on 441e0ee1a17b

Tested with
Claude Code / Haiku 5.5
  • Linux: Claude Code / Haiku 5.5 · agent 2.1.300 (Claude Code) · Checked operation passed · Oct 23, 2026 on 441e0ee1a17b

Each entry describes its recorded operation and source revision. Other agent clients were not tested.

Safety
Writes outside the project folder: yes by memory; made outbound connections: yes (hosts not recorded)

Review signals across current setups: connection review, outside write. 86 listed items (named-host connections, static matches, dependency advisories) are below and do not change this verdict. 6 static matches retained as context.

Repository processes attempted these non-loopback connections; proxies can hide the final hostname. 109 distinct locations. 2 findings. 41 attributed processes.

Source contains download and execute; review its purpose. 2 distinct locations. 2 findings.

Source contains encoded blob; review its purpose. site/demo/assets/sqlite3.wasm

Gitleaks found a possible hardcoded secret; value withheld. 15 distinct locations. 29 findings.

OSV reports a known vulnerability in this dependency version. 4 distinct locations. 10 findings.

Repository processes attempted these writes outside documented output/cache paths. 2 distinct locations. 1 attributed processes.

PID 3776: <guest-path> · memory

Reviewed as expected for a test run: attempted writes that failed, so nothing was written.

Full event, path and process lists for each observed setup:

Run details

Haiku 5.5

Native agent · Checked operation passed

Checked operation <guest-path> server · local stdio MCP start + initialize + tools/list

Agent-reported scope: Store and retrieve a memory through the MCP stdio server (memory server) using memory_store and memory_search

MCP server returned: memory · version 12.3.1.

MCP tools returned: memory_store, memory_store_session, memory_search, memory_list, memory_delete, memory_cleanup, memory_health, memory_stats, memory_update, memory_consolidate, memory_ingest, memory_harvest, memory_quality, memory_graph, memory_conflicts, memory_resolve, mistake_note_add, mistake_note_search, mistake_note_update, mistake_note_delete, get_quarantined_memories, unquarantine_memory, commit_session_legacy, get_bootstrap_profile, get_onboarding_guide, memory_distill, memory_explore, memory_detail. Tool listing does not establish authenticated tool-call success.

Run details
run
doobidoo--mcp-memory-service-claude-haiku-5-5-1792806759878846194
date
Oct 23, 2026
time to working
976.8s
product hosting / execution
Local stdio MCP server in the guest
recorded operation scope
product operation
model
claude-haiku-5-5
agent / version
claude-code / 2.1.300 (Claude Code)
platform
linux
reported cost
$0.030384
Recorded source
https://github.com/doobidoo/mcp-memory-service
Backend
hyperv
Tool transport
mcp-assigned-vm
Requested source pin (not an observed revision)
{"commit": "441e0ee1a17be3d51cf12a2d7d2a936cee69aded", "url": "https://github.com/doobidoo/mcp-memory-service"}
Test version
readme-bdc1b9b3c0d2673aef87e076d14084a8123ddcf09d520c1ee2e364a37c3f4bb9
revision
441e0ee1a17be3d51cf12a2d7d2a936cee69aded
Whose fault: repo · diagnosed

Safety: Review signals: 1 connection review, 2 download and execute, 1 encoded blob, 29 hardcoded secret, 11 known vulnerability, 1 outside write. 3 static matches retained as context.

Review signals: 1 connection review, 2 download and execute, 1 encoded blob, 29 hardcoded secret, 11 known vulnerability, 1 outside write. 3 static matches retained as context.

Repository processes attempted these non-loopback connections; proxies can hide the final hostname. 18 distinct locations. 5 attributed processes.

Source contains download and execute; review its purpose. 2 distinct locations. 2 findings.

Source contains encoded blob; review its purpose. site/demo/assets/sqlite3.wasm

Gitleaks found a possible hardcoded secret; value withheld. 15 distinct locations. 29 findings.

OSV reports a known vulnerability in this dependency version. 4 distinct locations. 10 findings.

Repository processes attempted these writes outside documented output/cache paths. 2 distinct locations. 1 attributed processes.

PID 3776: <guest-path> · memory

3 hardcoded secret matches retained as context; full list in the evidence.

OSV scanned supported lockfiles; unpinned dependencies and unsupported formats are outside this check.

A short run cannot establish that code is safe.

Connections show IP addresses; proxies can hide the final hostname.

Tracing covers dispatched commands and their children, not the whole OS; guest root can interfere with tracing.

Full safety evidence →

Answers recorded for this run
  • Persistent memory: memories stored in one session can be retrieved later through the MCP server: Real input produced the expected result: the blue heron guards the north gate

    Source: Keep decisions, notes, and project context across sessions and agents.

    Input: {"tool": "memory_search", "arguments": {"query": "blue heron north gate"}}

    Expected: stored memory returned

    Command: <guest-path> server tools/call {"tool": "memory_search", "arguments": {"query": "blue heron north gate"}}

    Observed: the blue heron guards the north gate\n Hash: 68f94fe7bd77ff403d348a5f68be2b932516ea19a3788eec889889a38e4d8fe4\n Created: 2026-10-24T02:01:32.081062Z [untagged]"}], "isError": false}

Examples

  • Quickstart: run the MCP server with the documented command and exercise a real tool: Covered by the probe and claim (memory server over stdio, memory_store then memory_search). The repository pytest suite was not run; no other runnable README example was executed.

    Source: README.md

    Expected: documented command completes successfully

    Observed: Covered by the probe and claim (memory server over stdio, memory_store then memory_search). The repository pytest suite was not run; no other runnable README example was executed.

Local or hosted: both

What the agent did

Store and retrieve a memory through the MCP stdio server (memory server) using memory_store and memory_search

cd <guest-path> && pwd && ls -la && id -u && python3 --version && cat README.md | head -200
cd <guest-path> && git status 2>&1 | head -3; ls /inputs 2>&1; ls <guest-path> 2>&1
cd <guest-path> && git init -q && git remote add origin https://github.com/doobidoo/mcp-memory-service && git fetch --depth 1 origin 441e0ee1a17be3d51cf12a2d7d2a936cee69aded 2>&1 | tail -3; git reset --mixed FETCH_HEAD 2>&1; git log --oneline -1; grep -n "requires-python\|^name\|^version" pyproject.toml | head; sed -n 200,400p README.md | grep -n "memory \|pip install\|^#" | head -80
cd /tmp && (python3 -m venv <guest-path> 2>&1 || (sudo apt-get update -qq && sudo apt-get install -y -qq python3-venv >/dev/null && python3 -m venv <guest-path>)) && <guest-path> install -q --upgrade pip 2>&1 | tail -2; <guest-path> install mcp-memory-service 2>&1 | tail -5; ls <guest-path> | grep -i memory
cd <guest-path> && sed -n 60,80p README.md; grep -n "memory_store\|retrieve_memory\|memory server\|memory store\|memory retrieve\|search_memory" README.md | head -30; <guest-path> --help 2>&1 | head -40
cd <guest-path> && grep -rn "name=\"store_memory\"\|\"store_memory\"\|name=\"retrieve_memory\"\|\"retrieve_memory\"\|\"search_by_tag\"" src | head; <guest-path> server --help 2>&1 | head -30; <guest-path> status 2>&1 | tail -15
mkdir -p <guest-path> && cat > <guest-path> <<'EOF'
import asyncio, json
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
    p = StdioServerParameters(command="<guest-path>", args=["server"], cwd="/tmp")
    async with stdio_client(p) as (r, w):
        async with ClientSession(r, w) as s:
            await s.initialize()
            for t in (await s.list_tools()).tools:
                if t.name in ("store_memory","retrieve_memory","search_by_tag"):
                    print(t.name, json.dumps(t.inputSchema)[:400])
asyncio.run(main())
EOF
cd /tmp && timeout 120 <guest-path> -I <guest-path> 2>&1 | tail -20
cd /tmp && sed -i 's/if t.name in ("store_memory","retrieve_memory","search_by_tag"):/if True:/' <guest-path> && timeout 120 <guest-path> -I <guest-path> 2>/dev/null | cut -c1-300; echo rc=$?
cat > <guest-path> <<'EOF'
import asyncio, json, sys
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
    p = StdioServerParameters(command="<guest-path>", args=["server"], cwd="/tmp")
    async with stdio_client(p) as (r, w):
        async with ClientSession(r, w) as s:
            await s.initialize()
            res = await s.call_tool("memory_store", {"content": "coldpass pin test: the blue heron guards the north gate"})
            print("STORE:", res.content[0].text[:600])
            res = await s.call_tool("memory_search", {"query": "blue heron north gate", "mode": "exact"})
            print("SEARCH:", res.content[0].text[:800])
asyncio.run(main())
EOF
cd /tmp && timeout 180 <guest-path> -I <guest-path> 2>/dev/null; echo rc=$?
cat > <guest-path> <<'EOF'
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
    p = StdioServerParameters(command="<guest-path>", args=["server"], cwd="/tmp")
    async with stdio_client(p) as (r, w):
        async with ClientSession(r, w) as s:
            await s.initialize()
            print("STORE:", (await s.call_tool("memory_store", {"content": "coldpass pin test: the blue heron guards the north gate"})).content[0].text[:200])
            print("SEARCH-default:", (await s.call_tool("memory_search", {"query": "blue heron north gate"})).content[0].text[:500])
            print("LIST:", (await s.call_tool("memory_list", {})).content[0].text[:500])
asyncio.run(main())
EOF
cd /tmp && timeout 180 <guest-path> -I <guest-path> 2>/dev/null; echo rc=$?; <guest-path> info 2>/dev/null | head -5
cd /tmp && <guest-path> install -q 'mcp-memory-service[sqlite-ml]' 2>&1 | tail -5; echo rc=$?; <guest-path> info 2>/dev/null | grep -i "path\|database\|model\|Status" | head; env | grep -i "MCP_MEMORY\|MCP_" | head
cd /tmp && <guest-path> show onnxruntime sentence-transformers 2>/dev/null | grep -E "^(Name|Version)"; <guest-path> status 2>&1 | tail -12; ls -la ~/.local/share/mcp-memory* 2>/dev/null
rm -rf ~/.local/share/mcp-memory && cd /tmp && timeout 240 <guest-path> -I <guest-path> 2>/dev/null; echo rc=$?
cd <guest-path> && grep -n "Persistent memory\|Semantic and keyword\|ingest-document\|consolidat\|cron\|schedul\|--once\|--now" README.md | cut -c1-250; grep -rn "def _run_scheduler\|CronTrigger\|IntervalTrigger" src | head -5
cat > <guest-path> <<'EOF'
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
    p = StdioServerParameters(command="<guest-path>", args=["server"], cwd="/tmp")
    async with stdio_client(p) as (r, w):
        async with ClientSession(r, w) as s:
            await s.initialize()
            print("RUN:", (await s.call_tool("memory_consolidate", {"action": "run", "time_horizon": "daily"})).content[0].text[:700])
            print("SEARCH:", (await s.call_tool("memory_search", {"query": "blue heron north gate"})).content[0].text[:300])
asyncio.run(main())
EOF
cd /tmp && timeout 240 <guest-path> -I <guest-path> 2>/dev/null; echo rc=$?
cd <guest-path> && grep -rn "Consolidation is disabled" src | head -3; grep -rn "CONSOLIDATION_ENABLED\|consolidation.*enabled" src/mcp_memory_service/config.py 2>/dev/null | head -5; grep -rln "CONSOLIDATION_ENABLED" src | head -3; grep -n "CONSOLIDATION" .env.example | head -10
cd /tmp && MCP_CONSOLIDATION_ENABLED=true timeout 300 <guest-path> -I <guest-path> 2>/dev/null; echo rc=$?
cd <guest-path> && sed -n 465,480p src/mcp_memory_service/server/handlers/consolidation.py; grep -rn "CONSOLIDATION_ENABLED" src | head -5
cd <guest-path> && grep -rn "^CONSOLIDATION_ENABLED\|CONSOLIDATION_ENABLED =" src | head; grep -rn "MCP_CONSOLIDATION_ENABLED" src/mcp_memory_service/config* 2>/dev/null | head -3; grep -rn "def _env_bool\|CONSOLIDATION_ENABLED" src/mcp_memory_service/consolidation/*.py | head -5
cd /tmp && sed -i 's/args=\["server"\], cwd="\/tmp")/args=["server"], cwd="\/tmp", env={"HOME": "<host-path>", "PATH": "\/usr\/bin:\/bin", "MCP_CONSOLIDATION_ENABLED": "true"})/' <guest-path> && grep -n StdioServerParameters <guest-path> | tail -1 && timeout 300 <guest-path> -I <guest-path> 2>/dev/null; echo rc=$?
echo HOME=$HOME; cd <guest-path> && grep -rn "Consolidation system not available" src | head -2; cd /tmp && <guest-path> -c "
import mcp_memory_service.consolidation as c; print('ok', c.__file__)" 2>&1 | tail -3; <guest-path> -c "import sklearn" 2>&1 | tail -1; ls -la ~/.local/share/mcp-memory 2>&1 | head -3
cd <guest-path> && sed -n 25,50p src/mcp_memory_service/server/handlers/consolidation.py
cd <guest-path> && sed -n '/optional-dependencies/,/^\[tool/p' pyproject.toml | head -60; grep -rn "consolidator = \|self.consolidator =" src | head -5
cd <guest-path> && grep -n "@router\.\(post\|get\)<email>(\"/api/memories\"\<email>(\"/memories\"\|router.post(\"/\"" src/mcp_memory_service/web/api/memories.py | head -3
cd <guest-path> && sed -n 70,122p src/mcp_memory_service/web/api/consolidation.py; grep -n "consolidation" src/mcp_memory_service/web/app.py | grep -i "include_router\|prefix" | head
cd /tmp && (HOME=<guest-path> MCP_ALLOW_ANONYMOUS_ACCESS=true MCP_CONSOLIDATION_ENABLED=true nohup <guest-path> server --http --http-port 8765 > <guest-path> 2>&1 &) ; sleep 25; curl -s -m 10 http://127.0.0.1:8765/api/health; echo; curl -s -m 10 http://127.0.0.1:8765/api/consolidation/status; echo; tail -3 <guest-path> | cut -c1-300
sleep 30; curl -s -m 10 -i http://127.0.0.1:8765/api/health | head -12; echo; curl -s -m 10 http://127.0.0.1:8765/api/consolidation/status | head -c 400; echo; tail -5 <guest-path> | cut -c1-300; pgrep -af "memory server" | head
curl -s -m 120 -X POST http://127.0.0.1:8765/api/consolidation/trigger -H 'Content-Type: application/json' -d '{"time_horizon":"daily"}'; echo; echo rc=$?; grep -i "consolidat\|scheduler" <guest-path> | tail -5 | cut -c1-250
pkill -f "memory server --http --http-port 8765"; sleep 3; (curl -s -m 5 http://127.0.0.1:8765/api/health || echo "port 8765 closed"); cd <guest-path> && mkdir -p .coldpass/.. && cat > .coldpass/probe.json <<'EOF'
{"kind":"mcp","argv":["<guest-path>","server"],"cwd":"<guest-path>","env":{"HOME":"<guest-path>"},"tool":"memory_search","arguments":{"query":"blue heron north gate"},"expected_text":"the blue heron guards the north gate"}
EOF
cat > .coldpass/claims.json <<'EOF'
[{"kind":"claim","claim":"Persistent memory: memories stored in one session can be retrieved later through the MCP server","source":"README.md","quote_source":"Keep decisions, notes, and project context across sessions and agents.","input":"blue heron north gate","expected":"stored memory returned","probe_kind":"mcp","argv":["<guest-path>","server"],"env":{"HOME":"<guest-path>"},"tool":"memory_search","arguments":{"query":"blue heron north gate"},"expected_text":"the blue heron guards the north gate","cwd":"<guest-path>"}]
EOF
cat > .coldpass/cycles.json <<'EOF'
{"detected":false,"reason":"Entry points inspected: src/mcp_memory_service/consolidation/scheduler.py uses APScheduler CronTrigger/IntervalTrigger, but in this guest the scheduler reported 'Scheduler not available' under `memory server --http` with MCP_CONSOLIDATION_ENABLED=true, and the stdio MCP server has no consolidator ('Consolidation system not available'). A manual cycle was triggered by hand via POST /api/consolidation/trigger ({\"time_horizon\":\"daily\"}) and returned status completed, processed 1. That manual HTTP trigger is not a product schedule and cannot be replayed as a cli check here.","checks":[]}
EOF
cat > .coldpass/examples.json <<'EOF'
[{"kind":"example","claim":"Quickstart example: run the MCP server with the documented command and exercise a real tool","source":"README.md","reason":"Covered by the probe and claim above (memory server over stdio, memory_store then memory_search). The repository's pytest suite was not run within this task; no other runnable README example was executed."}]
EOF
python3 -I -c "import json;[json.load(open('.coldpass/'+f)) for f in ['probe.json','claims.json','cycles.json','examples.json']];print('json ok')"
ps -eo pid,args | grep "[m]emory server --http" | grep -v "bash -c" | cut -c1-120; curl -s -m 5 http://127.0.0.1:8765/api/health || echo "port 8765 closed"
cd <guest-path> && mkdir -p .coldpass && cat > .coldpass/probe.json <<'EOF'
{"kind":"mcp","argv":["<guest-path>","server"],"cwd":"<guest-path>","env":{"HOME":"<guest-path>"},"tool":"memory_search","arguments":{"query":"blue heron north gate"},"expected_text":"the blue heron guards the north gate"}
EOF
cat > .coldpass/claims.json <<'EOF'
[{"kind":"claim","claim":"Persistent memory: memories stored in one session can be retrieved later through the MCP server","source":"Keep decisions, notes, and project context across sessions and agents.","input":"blue heron north gate","expected":"stored memory returned","probe_kind":"mcp","argv":["<guest-path>","server"],"env":{"HOME":"<guest-path>"},"tool":"memory_search","arguments":{"query":"blue heron north gate"},"expected_text":"the blue heron guards the north gate","cwd":"<guest-path>"}]
EOF
cat > .coldpass/cycles.json <<'EOF'
{"detected":false,"reason":"Entry points inspected: src/mcp_memory_service/consolidation/scheduler.py uses APScheduler CronTrigger/IntervalTrigger, but in this guest the scheduler reported 'Scheduler not available' under memory server --http with MCP_CONSOLIDATION_ENABLED=true, and the stdio MCP server has no consolidator ('Consolidation system not available'). A manual cycle was triggered by hand via POST /api/consolidation/trigger with time_horizon daily, which returned status completed, processed 1. That manual HTTP trigger is not a product schedule and cannot be replayed as a cli check here.","checks":[]}
EOF
cat > .coldpass/examples.json <<'EOF'
[{"kind":"example","claim":"Quickstart: run the MCP server with the documented command and exercise a real tool","source":"README.md","reason":"Covered by the probe and claim (memory server over stdio, memory_store then memory_search). The repository pytest suite was not run; no other runnable README example was executed."}]
EOF
python3 -I -c "import json;[json.load(open('.coldpass/'+f)) for f in ['probe.json','claims.json','cycles.json','examples.json']];print('json ok')"; grep -c "Keep decisions, notes, and project context across sessions and agents." README.md
cd <guest-path> && cat > .coldpass/report.json <<'EOF'
{"outcome":"working","fault_owner":"repo","operation":"Store and retrieve a memory through the MCP stdio server (memory server) using memory_store and memory_search","operation_scope":"Linux Ubuntu guest, Python 3.12.3, pinned commit 441e0ee, mcp-memory-service 12.3.1 in <guest-path>, SQLite-vec storage with ONNX all-MiniLM-L6-v2 embeddings, stdio transport, local only","steps":["git init; git remote add origin https://github.com/doobidoo/mcp-memory-service; git fetch --depth 1 origin 441e0ee1a17be3d51cf12a2d7d2a936cee69aded; git reset --mixed FETCH_HEAD","python3 -m venv <guest-path> (failed: ensurepip missing; installed python3-venv via sudo apt-get, then recreated venv)","<guest-path> install mcp-memory-service","<guest-path> install 'mcp-memory-service[sqlite-ml]'","<guest-path> server (MCP stdio) -> memory_store, memory_search","<guest-path> server --http --http-port 8765 with MCP_ALLOW_ANONYMOUS_ACCESS=true MCP_CONSOLIDATION_ENABLED=true; GET /api/health; POST /api/consolidation/trigger"],"deviations":["Base pip install mcp-memory-service alone stored a memory with hash pseudo-embeddings, then refused all later reads and writes with 'refusing to write hash pseudo-vectors'; fixed by installing the documented extra mcp-memory-service[sqlite-ml] (onnxruntime and tokenizers). I deleted the test database I had created (~/.local/share/mcp-memory under HOME=<guest-path>) to get a clean state.","python3 -m venv failed on missing ensurepip; installed python3-venv with sudo apt-get and recreated the venv.","Consolidation through the stdio MCP server returns 'Consolidation system not available' (no consolidator). The HTTP server's scheduler reported 'Scheduler not available', so the cycle was triggered manually via POST /api/consolidation/trigger rather than by a scheduler.","Did not run the repository pytest suite or the interactive install.py; did not install the ML extra or torch."],"stuck_step":null,"main_blocker":null,"plain_failure":"On a plain install from the README (pip install mcp-memory-service), the first save succeeds but the service then refuses every later read and write, because it has no real embedding model. Installing the documented sqlite-ml extra fixes it. Also, the background consolidation scheduler did not start in this guest, so the cycle was triggered by hand.","suggested_fix":"Make the README quickstart install the sqlite-ml extra (pip install 'mcp-memory-service[sqlite-ml]'), or fail at install time instead of allowing a first write that poisons the database. Also check why the consolidation scheduler reports 'Scheduler not available' when MCP_CONSOLIDATION_ENABLED=true."}
EOF
python3 -I -c "import json;json.load(open('.coldpass/report.json'));print('report ok')"; <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | tail -40
Earlier attempts (1)

Luna

Native agent · Not tested

Operation / attempted scope <guest-path> server --http --http-port 18234 · local HTTP start + response check

Agent-reported scope: Install the editable package and exercise the documented REST API by storing a memory and retrieving it by tag.

Run details
run
doobidoo--mcp-memory-service-gpt-6-luna-1792871321447156136
date
Oct 24, 2026
time to working
not recorded
product hosting / execution
Local HTTP server in the guest
recorded operation scope
Python 3.12, SQLite storage and anonymous local HTTP access in the disposable guest.
model
gpt-6-luna
agent / version
codex / codex-cli 0.163.0
platform
linux
reported cost
not reported (not assumed free)
Recorded source
https://github.com/doobidoo/mcp-memory-service
Backend
hyperv
Tool transport
mcp-assigned-vm
Requested source pin (not an observed revision)
{"commit": "441e0ee1a17be3d51cf12a2d7d2a936cee69aded", "url": "https://github.com/doobidoo/mcp-memory-service"}
Test version
readme-e04b29987938128ea0f422b6abc44309a59f137bfcb7d47aaf5c4afd05158c5f
revision
441e0ee1a17be3d51cf12a2d7d2a936cee69aded
Whose fault: test · diagnosed

Checker requires /docs, while the product documents and serves its OpenAPI UI at /api/docs; replay also treats the long-running service as a timeout in examples.

Double-checks failed run: doobidoo--mcp-memory-service-gpt-6-luna-1792846265816107316.

Fix: fix-a9dface77fee62146b63.

Recorded blocker / warning

Step: Checker replay of the HTTP probe

Checker requires /docs, while the product documents and serves its OpenAPI UI at /api/docs; replay also treats the long-running service as a timeout in examples.

Safety: Review signals: 1 connection review, 2 download and execute, 1 encoded blob, 29 hardcoded secret, 11 known vulnerability. 3 static matches retained as context.

Review signals: 1 connection review, 2 download and execute, 1 encoded blob, 29 hardcoded secret, 11 known vulnerability. 3 static matches retained as context.

Reviewed as expected for a test run: attempted writes that failed, so nothing was written.

Repository processes attempted these non-loopback connections; proxies can hide the final hostname. 92 distinct locations. 36 attributed processes.

Source contains download and execute; review its purpose. 2 distinct locations. 2 findings.

Source contains encoded blob; review its purpose. site/demo/assets/sqlite3.wasm

Gitleaks found a possible hardcoded secret; value withheld. 15 distinct locations. 29 findings.

OSV reports a known vulnerability in this dependency version. 4 distinct locations. 10 findings.

3 hardcoded secret matches retained as context; full list in the evidence.

OSV scanned supported lockfiles; unpinned dependencies and unsupported formats are outside this check.

A short run cannot establish that code is safe.

Connections show IP addresses; proxies can hide the final hostname.

Tracing covers dispatched commands and their children, not the whole OS; guest root can interfere with tracing.

Full safety evidence →

Answers recorded for this run
  • Store a memory and search by tag: Probe could not complete: HTTP 404 from http://127.0.0.1:18234/docs (attempts: 404* 404* 404* 404* 404* 404* 404* 404* 404* 404* 404* 404*; * = announced url used)

    Source: Store a memory with `POST /api/memories`, search with `POST /api/search`, retrieve by tag

    Input: content=Coldpass memory operation sample: project deadline is Friday.; tags=coldpass,deadline; X-Agent-ID=coldpass

    Expected: The stored memory appears in tag search and has the agent:coldpass tag.

    Command: <guest-path> server --http --http-port 18234

    Observed: Probe could not complete: HTTP 404 from http://127.0.0.1:18234/docs (attempts: 404* 404* 404* 404* 404* 404* 404* 404* 404* 404* 404* 404*; * = announced url used)

Examples

  • README REST server quick start: command was still running when the product check time ended

    Source: README.md — Agent pipelines (REST API)

    Input: POST a memory and retrieve by tag

    Expected: Stored content is returned

    Command: <guest-path> server --http --http-port 18234

    Observed: ired permissions.\nFor more details, see https://huggingface.co/docs/huggingface_hub/authentication\nInvalid username or password. ONNX model creation failed, falling back to SentenceTransformer No embedding backend available; using hash embeddings (reduced quality). Install ML dependencies for semantic search: pip install mcp-memory-service[ml]. The hash fallback is refused on databases that already contain memories; set MCP_MEMORY_ALLOW_HASH_EMBEDDINGS=1 to override for testing. INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:18234 (Press CTRL+C to quit)

Local or hosted: both

Suggested next step (agent-reported): Allow the HTTP checker to probe the product-specific /api/docs path and distinguish a live server from a finite example command.

What the agent did

Install the editable package and exercise the documented REST API by storing a memory and retrieving it by tag.

pwd; vault-search 'mcp-memory-service README install operation'; ls -la; rg --files -g 'README*' -g 'AGENTS.md' -g 'pyproject.toml' -g 'requirements*.txt' -g 'package.json' -g 'Dockerfile' -g '*.yml' -g '*.yaml' | head -80; python3 --version; id -u
cat README.md
cat AGENTS.md; cat pyproject.toml; sed -n '1,240p' docs/agents/http-generic.md 2>/dev/null; find . -maxdepth 3 -iname '*readme*' -o -iname '*api*reference*' | head -60; grep -nE 'python|pip|memory server|/api/memories|pytest' README.md
python3 -m venv <guest-path> && <guest-path> -m pip install -e '.[sqlite]'
sudo -n apt-get update && sudo -n apt-get install -y python3.12-venv
rm -rf <guest-path>; python3 -m venv <guest-path>; <guest-path> -m pip install -e '.[sqlite]'
curl -sS -i http://<internal-ip>:9226/json/version
cd <guest-path> && MCP_ALLOW_ANONYMOUS_ACCESS=true MCP_STORAGE_BACKEND=sqlite MCP_EMBEDDING_MODEL=hash <guest-path> server --http ><guest-path> 2>&1 & echo $! > <guest-path>; for i in $(seq 1 60); do curl -fsS http://127.0.0.1:8000/api/health && break; sleep 2; done; cat <guest-path>
curl -sS -X POST http://127.0.0.1:8000/api/memories -H 'Content-Type: application/json' -H 'X-Agent-ID: coldpass' -d '{"content":"Coldpass memory operation sample: project deadline is Friday.","tags":["coldpass","deadline"]}'
curl -sS -X POST http://127.0.0.1:8000/api/search/by-tag -H 'Content-Type: application/json' -d '{"tags":["coldpass"],"match_all":true,"limit":5}'
kill $(cat <guest-path>) 2>/dev/null || true; pkill -f 'uvicorn.*8000' 2>/dev/null || true
ps -ef | grep -E 'memory server|uvicorn' | grep -v grep; mkdir -p .coldpass; cat .coldpass
kill 2882; sleep 1; ps -p 2882 -o pid=,stat=,cmd=
cat > .coldpass/probe.json <<'EOF'
{"kind":"http","argv":["<guest-path>","server","--http"],"cwd":"<guest-path>","url":"http://127.0.0.1:8000/api/memories","env":{"MCP_ALLOW_ANONYMOUS_ACCESS":"true","MCP_STORAGE_BACKEND":"sqlite","MCP_EMBEDDING_MODEL":"hash"},"stdin":"","expected_text":"Coldpass memory operation sample: project deadline is Friday."}
EOF
cat > .coldpass/claims.json <<'EOF'
[{"kind":"claim","claim":"Store a memory and search by tag","source":"Store a memory with `POST /api/memories`, search with `POST /api/search`, retrieve by tag\nwith `POST /api/search/by-tag`. Send `X-Agent-ID: <id>` on a store request and the\nrequest tags the memory `agent:<id>`, which a tag search then scopes retrieval by.","input":"content=Coldpass memory operation sample: project deadline is Friday.; tags=coldpass,deadline; X-Agent-ID=coldpass","expected":"The stored memory appears in tag search and has the agent:coldpass tag.","probe_kind":"http","argv":["<guest-path>","server","--http"],"env":{"MCP_ALLOW_ANONYMOUS_ACCESS":"true","MCP_STORAGE_BACKEND":"sqlite","MCP_EMBEDDING_MODEL":"hash"},"url":"http://127.0.0.1:8000/api/memories","expected_text":"Coldpass memory operation sample: project deadline is Friday.","cwd":"<guest-path>"}]
EOF
cat > .coldpass/examples.json <<'EOF'
[{"kind":"example","claim":"README REST server quick start","source":"README.md — Agent pipelines (REST API)","input":"POST a memory and retrieve by tag","expected":"Stored content is returned","argv":["<guest-path>","server","--http"],"cwd":"<guest-path>","env":{"MCP_ALLOW_ANONYMOUS_ACCESS":"true","MCP_STORAGE_BACKEND":"sqlite","MCP_EMBEDDING_MODEL":"hash"},"expected_text":"Coldpass memory operation sample: project deadline is Friday."}]
EOF
cat > .coldpass/cycles.json <<'EOF'
{"detected":false,"reason":"Inspected README and project entry points; the product exposes memory storage/retrieval APIs and scheduled consolidation, but no required recurring cycle is documented for the quick-start operation.","checks":[]}
EOF
cat > .coldpass/report.json <<'EOF'
{"outcome":"working","fault_owner":null,"operation":"Install the editable package and exercise the documented REST API by storing a memory and retrieving it by tag.","operation_scope":"Python 3.12, SQLite storage and anonymous local HTTP access in the disposable guest.","steps":["sudo -n apt-get update && sudo -n apt-get install -y python3.12-venv","python3 -m venv <guest-path>","<guest-path> -m pip install -e '.[sqlite]'","MCP_ALLOW_ANONYMOUS_ACCESS=true memory server --http","POST /api/memories, then POST /api/search/by-tag"],"deviations":["The first venv creation failed because python3.12-venv/ensurepip was missing; installed the README-compatible Ubuntu package and retried successfully.","ONNX attempted to retrieve onnx-community/hash-ONNX and received HTTP 401; service fell back to hash embeddings and memory store/tag retrieval succeeded. Set MCP_EMBEDDING_MODEL=hash for the replay.","vault-search was unavailable in the guest."],"stuck_step":null,"main_blocker":null,"plain_failure":null,"suggested_fix":null}
EOF
<env-var>=<guest-path> python3 -I <guest-path> --validate --replay
python3 - <<'PY'
import json
p='.coldpass/claims.json'
x=json.load(open(p)); x[0]['source']='Store a memory with `POST /api/memories`, search with `POST /api/search`, retrieve by tag'; json.dump(x,open(p,'w'))
PY
<env-var>=<guest-path> python3 -I <guest-path> --validate --replay
find <guest-path> -maxdepth 3 -type f \( -name '*.db' -o -name '*.sqlite*' \) -printf '%p %s\n'; grep -R 'MCP_MEMORY_ALLOW_HASH_EMBEDDINGS\|DATABASE_PATH' -n src/mcp_memory_service | head -30
sed -n '1,70p' src/mcp_memory_service/config/storage.py; sed -n '340,370p' src/mcp_memory_service/config/storage.py; grep -n 'MCP_MEMORY_BASE' src/mcp_memory_service/config/storage.py
sed -n '1,90p' src/mcp_memory_service/config/base.py; find /tmp -maxdepth 3 -type f -name 'memory_http.db' -o -name '*.db' | head -30
grep -n 'BASE_DIR\|SQLITE_VEC_PATH' src/mcp_memory_service/config/base.py src/mcp_memory_service/config/storage.py | head -20;
sed -n '290,320p' src/mcp_memory_service/config/base.py; sed -n '125,165p' src/mcp_memory_service/config/storage.py
python3 - <<'PY'
import json
for f in ['.coldpass/probe.json','.coldpass/claims.json','.coldpass/examples.json']:
 x=json.load(open(f))
 if isinstance(x,list): x[0].setdefault('env',{})['MCP_MEMORY_BASE_DIR']='<guest-path>'; x[0]['env']['MCP_MEMORY_ALLOW_HASH_EMBEDDINGS']='1'
 else: x.setdefault('env',{})['MCP_MEMORY_BASE_DIR']='<guest-path>'; x['env']['MCP_MEMORY_ALLOW_HASH_EMBEDDINGS']='1'
 json.dump(x,open(f,'w'))
PY
rm -rf <guest-path> <guest-path>
<env-var>=<guest-path> python3 -I <guest-path> --validate --replay
grep -R 'openapi_url\|docs_url\|/docs' -n src/mcp_memory_service/web | head -30; <guest-path> server --help
python3 - <<'PY'
import json
for f in ['.coldpass/probe.json','.coldpass/claims.json','.coldpass/examples.json']:
 x=json.load(open(f)); a=x[0] if isinstance(x,list) else x
 a['url']='http://127.0.0.1:8000/api/memories'
 if isinstance(x,list):
  a['env']['MCP_HTTP_PORT']='18234'; a['env']['MCP_MEMORY_BASE_DIR']='<guest-path>'
 else:
  a['env']['MCP_HTTP_PORT']='18234'; a['env']['MCP_MEMORY_BASE_DIR']='<guest-path>'
 if isinstance(x,list): a['argv']=['<guest-path>','server','--http','--http-port','18234']
 else:a['argv']=['<guest-path>','server','--http','--http-port','18234']
 json.dump(x,open(f,'w'))
PY
rm -rf <guest-path> <guest-path>
<env-var>=<guest-path> python3 -I <guest-path> --validate --replay
ps -ef | grep -E 'memory server|checker.py' | grep -v grep; cat .coldpass/probe.json; cat .coldpass/report.json
killall -q memory || true; ss -ltnp | head
python3 - <<'PY'
import json
for f in ['.coldpass/probe.json','.coldpass/claims.json','.coldpass/examples.json']:
 x=json.load(open(f)); a=x[0] if isinstance(x,list) else x; a['url']='http://127.0.0.1:18234/api/memories'; json.dump(x,open(f,'w'))
PY
<env-var>=<guest-path> python3 -I <guest-path> --validate --replay
killall -q memory || true; python3 - <<'PY'
import json
p='.coldpass/probe.json'; x=json.load(open(p)); x['url']='http://127.0.0.1:18234/api/docs'; json.dump(x,open(p,'w'))
p='.coldpass/report.json'; r=json.load(open(p)); r.update(outcome='blocked',fault_owner='test',stuck_step='Checker replay of the HTTP probe',main_blocker='Checker requires /docs, while the product documents and serves its OpenAPI UI at /api/docs; replay also treats the long-running service as a timeout in examples.',plain_failure='The service installed and successfully stored and retrieved a memory during the manual run, but the independent checker could not replay the HTTP probe because it requests /docs and the application serves API documentation at /api/docs.',suggested_fix='Allow the HTTP checker to probe the product-specific /api/docs path and distinguish a live server from a finite example command.'); json.dump(r,open(p,'w'))
PY
<env-var>=<guest-path> python3 -I <guest-path> --validate --replay