project-memory-mcp@0.6.0b16
VERIFIED· not startedPublisher claims: "Local project memory for decisions, evidence and outcomes, with bounded MCP retrieval." 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: Verified 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
- no credential variables read in the code
- Where it talks to
- no vendor host named in the code
- What the honeypot saw
- no credential files read · no network
- What we could not test
- server startup · the tool list · tool behavior
Connect it under the guard. Not started: dependency install failed; the server itself was not observed. The code names no credential variable; the guard pins the network to what the honeypot saw and logs every call.
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-15 and scored it 85/100 (Verified). In what ran, nothing we could detect went wrong: no undeclared network egress, no credential reads, no persistent instruction writes. What it does with a real credential was not observed; the static findings and the publisher carry the rest of the score. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
"""Start the host with prompt.txt as input and wait. Return (state, error) when stopped early, otherwise (None, '').Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.(folder/'prompt.txt').write_text(packet if hosts.profile(run['host']).packet_in_input else dumps(evidence), encoding='utf-8')Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.process = subprocess.Popen(python_args('memory_module.vault') + ['--db', str(memory.path)],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.files = subprocess.check_output(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run([program, '--version'], capture_output=True, text=True, timeout=15, stdin=subprocess.DEVNULL)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.process = subprocess.Popen(python_args('memory_module.reviews')+['--db', str(memory.path), '--run', run['id']],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.(folder / 'prompt.txt').write_text(prompt + '\n\n' + PROBE_EVIDENCE if found.packet_in_input else PROBE_EVIDENCE,Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.result = subprocess.run(['git', '-C', str(root), *args], capture_output=True, text=True,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.self.process = subprocess.Popen(args, cwd=cwd, stdin=incoming, stdout=out, stderr=err, env=environment,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.process = subprocess.Popen(python_args('memory_module.live') + ['--db', str(path), '--state', str(state)],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.run=subprocess.run(python_args('memory_module.cli')+['serve','--db',str(path)],input=''.join(json.dumps(r)+'\n' for r in requests),text=True,encoding='utf-8',capture_output=True,timeout=20)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.process = subprocess.Popen(['codex', 'app-server', '--stdio'], cwd=project, stdin=subprocess.PIPE,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.checked = subprocess.run(check['command'], cwd=tree / snapshot.get('repository_prefix', ''),Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result=subprocess.run([sys.executable,'-m','memory_module.mcp','--db',str(self.m.path)],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.process = subprocess.run([sys.executable, '-m', 'memory_module.cli', 'hive-serve', '--hive', str(self.h.path),Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.run=subprocess.run(base[:-2]+['--db',str(self.project/'missing.sqlite')],input=payload,text=True,capture_output=True,timeout=60,env=env)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result=subprocess.run([sys.executable,'-m','memory_module.mcp','--db',str(self.m.path)],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.store.db.execute('INSERT INTO usage_records (entry,host,kind,started_at,ended_at,input_tokens,output_tokens,total_tokens,'Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.result = subprocess.run(['git', '-C', str(cwd or self.project), *args], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.body = subprocess.check_output(['git', 'cat-file', 'blob', oid.decode()], cwd=root)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.run=subprocess.run(base[:-2]+['--db',str(self.project/'missing.sqlite')],input=payload,text=True,capture_output=True,timeout=60,env=env)Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.run = subprocess.run([sys.executable, '-m', 'memory_module.codex_host', '--db', str(self.m.path), '--host', 'claude'],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(['git', '-C', str(self.root), *args], check=True, capture_output=True, env=env)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.processes=[subprocess.Popen(cmd,stdout=subprocess.PIPE,text=True) for cmd in commands]Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.self.assertNotIn('sk_live_FAKE_INLINE_TOKEN_123', review['snapshot']['diff'])Fix: Never read or enumerate credential locations; accept a documented environment variable instead.('/etc/passwd', ['src'], False),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run([str(python),'-m','pip','install','--no-deps',str(wheel)],check=True,capture_output=True,cwd=project,env=env)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.for path in ['/etc/x.json', '/etc/agent-settings.json', '/etc/passwd']:Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.run=subprocess.run(base,input=payload,text=True,capture_output=True,timeout=60,env=env)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.run=subprocess.run(command,input=dumps(initialize)+'\n'+dumps(request)+'\n',text=True,capture_output=True,check=True,cwd=Path(__file__).resolve().parent.parent)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.process=subprocess.run([sys.executable,'-m','memory_module.mcp','--db',str(self.m.path)],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.child=subprocess.run(installed['launcher']+['doctor','--project',str(project)],check=True,capture_output=True,text=True,cwd=project,env=env)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.'parameters': [{'name': 'Authorization', 'value': 'Bearer sk_live_FAKE_INLINE_TOKEN_123'}]}}}]}Fix: Never read or enumerate credential locations; accept a documented environment variable instead.subprocess.run([sys.executable,'-m','venv',str(venv)],check=True,capture_output=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.run = subprocess.run([sys.executable, '-m', 'memory_module', '--db', str(self.m.path), 'document',Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…assert report['mcp_process_verified'] and report['integrity']=='ok' runtime=subprocess.run([str(python),'-I','-c',"from pathlib import Path; import json,memory_module; fro…Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.run=subprocess.run(base,input=payload,text=True,capture_output=True,timeout=60,env=env)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.run=subprocess.run(args+['--if-unmanaged'],input=payload,text=True,capture_output=True,check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.self.log(swarm, 'codex-1', 'question', claim='Which input shows the wrong value?', addressee='user')Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.run=subprocess.run([sys.executable,'-m','memory_module.codex_host','--db',str(self.m.path)],input=json.dumps(event),text=True,capture_output=True,timeout=5)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.question = self.log(swarm, 'claude-2', 'question', claim='Which input shows the wrong value?', addressee='role:worker')Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…b'{}',method='POST')) self.assertEqual(post.exception.code,405) subprocess.run([sys.executable,'-c',"from memory_module import Memory; import sys; m=Memory(sys…Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.self.assertNotIn('sk_live_FAKE_INLINE_TOKEN_123', body)Fix: Never read or enumerate credential locations; accept a documented environment variable instead.run=subprocess.run([sys.executable,'-m','memory_module.codex_host','--db',str(self.m.path)],input=json.dumps(event),text=True,capture_output=True,timeout=5)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(args,input=payload,text=True,capture_output=True,check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(['git', '-C', str(self.project), *args], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.run=subprocess.run([sys.executable,'-m','memory_module.mcp','--db',str(self.m.path)],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result=subprocess.run([str(cli),*args],capture_output=True,text=True,cwd=project,env=env,timeout=30)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.answer = self.log(swarm, 'codex-1', 'answer', claim='The input minus one shows the wrong value.', target=question)Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.result = subprocess.run(['git', '-C', str(folder), *args], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.entries = subprocess.check_output(['git', 'ls-tree', '-rz', ref], cwd=root)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.('/etc/passwd', ['/etc'], True),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.('/etc/passwd', ['.'], False),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.codex_host.capture(self.m, self.hook('Write', {'file_path': '/etc/passwd', 'content': 'x'}, tool_use_id='out-all'), host='claude')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.run=subprocess.run(command,shell=True,input=json.dumps(payload),text=True,capture_output=True,timeout=60)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.self.process = subprocess.Popen(LAUNCHER + ['serve', '--db', str(database)], stdin=subprocess.PIPE,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result=subprocess.run(cmd+['hook'],input=dumps({'actor':'host','event':'resume'}),text=True,capture_output=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.'--output-schema', str(self.folder / 'schema.json'), '--output-last-message', str(self.folder / 'answer.json'),Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.invalid = subprocess.run(cmd + ["context", "authentication", "--max-chars", "1"], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(['git', '-C', str(self.project), *args], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(['git', '-C', str(project), *args], check=True, capture_output=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.challenge = self.log(swarm, 'd2', 'challenge', claim='The parser drops the sign of negative input.', target=conclusion,Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.result = subprocess.run(hive, input=''.join(json.dumps(item) + '\n' for item in messages), capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.self.log(swarm, 'c2', 'challenge', claim='The sign fix breaks input with spaces.', target=conclusion,Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.return subprocess.run(LAUNCHER + ['hook', '--db', str(self.database), '--host', host],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result=subprocess.run(cmd+['html',str(self.root/'cli.html')],text=True,capture_output=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(cmd + ["metrics"], capture_output=True, text=True)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 project-memory-mcp@0.6.0b16 as of 45 min ago. This is the package itself, not its dependencies.