Atlas / MCP servers / flytomoon / al-buddy-memory

al-buddy-memoryBLOCK

mcp/flytomoon/al-buddy-memory

Portable, governed, model-agnostic memory for AI agents: facts invalidated never deleted, raw text as truth, one documented export format.

Verdict
BLOCK
Grade
D
Trust score
69 /100
Exposed tools
12 11r · 0w · 1d
Transport
stdio · streamable-http
License
Apache-2.0
Stars
3
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://mcpservers.org/servers/flytomoon/al-buddy-memory)

Al Buddy — that's Al, a name, said like "pal". Not A.I.

A memory that's yours.

Portable, governed, model-agnostic memory for AI agents.

A fact is invalidated, never overwritten; on a governed handle, erasure runs through policy and is audited. Raw text is the source of truth and cannot be edited. Embeddings are a disposable, model-tagged cache. Every fact and every link exports to one documented format. The memory outlives whatever model, runtime or company produced it.

Why this exists

Every agent-memory product on the market answers one question well: what does the agent recall? None of them answers the four questions that decide whether you can trust and keep that memory:

Read from source at commit ccd873dea1b6OBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add al-buddy-memory --env AL_BUDDY_MEMORY_AUDIT_KEY=${AL_BUDDY_MEMORY_AUDIT_KEY} -- npx -y [email protected] mcp
03

Exposed tools (12)

11 read · 0 write · 1 destructive. Blast radius: 1 tool can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
al-buddy-memoryreadAdds the pinned rules and the facts recalled for this turn from al-buddy-memory.
define_mental_modelreadDefine a standing question to keep answered (e.g. \
explainreadWhy a fact is believed: who asserted it, when it was true and what ended or replaced it, and for a conclusion the exact words it rests on, each checked against its source now.
exportreadExport the user
historyreadShow the recorded changes to one fact, including each change time and the full mutable state before and after it.
invalidatedestructiveA fact stopped being true: close its validity (never delete), optionally naming what replaced it.
mental_modelreadRead a standing question
pinreadPin a fact into the always-in-prompt tier. Only rules that belong in every conversation; it is a small, budgeted tier.
pinnedreadThe pinned tier, as a list and as the rendered prompt block.
recallreadFind facts. Every result says who asserted it, since when it has been true, whether it is still current, what superseded it, and which assistant wrote or retired it. The first call of a session also returns the user
rememberreadStore a fact with its provenance. Returns the fact with validFrom, provenance and confidence, plus mayConflictWith: current facts this one may be correcting — read them and invalidate any that stopped being true.
unpinreadUnpin a fact (its validity closes; it is kept).
04

Trust audit

BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (2 observation(s))
Network
declared (1 observation(s))
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (21)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
bench/longmemeval/regrade-codex.mjs:60
writeFileSync(outPath.replace(/\.jsonl$/, ".summary.json"), JSON.stringify({ model, judgedWith: "codex exec (ChatGPT seat), official LongMemEval judge prompts", n: rows.length, overall: tot / rows.len
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMHard-coded secrets · secret.aws · CWE-798, CWE-321
src/history-review.test.ts:133
const f = await src.addNode(fact("deploy key AKIAABCDEFGHIJKLMNOP"));
MEDIUMHard-coded secrets · secret.aws · CWE-798, CWE-321
src/history-review.test.ts:182
const secret = await inner.addNode(fact("AKIAABCDEFGHIJKLMNOP", { privacyClassification: "Sensitive" }));
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
src/governance/governance.test.ts:22
const key = await store.addNode(fact("deploy token: token=ghp_abcdefghijklmnopqrstuvwxyz0123"));
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
invalidate
Why it matters. 1 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
bench/longmemeval/runner.test.ts:3
import * as lib from "../../src/index.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
bench/postgres-writes/run.mjs:18
import { InMemoryStore, PostgresMemoryStore, govern, storeAudit } from "../../dist/index.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
bench/stale-facts/stale-facts.test.ts:6
import * as lib from "../../src/index.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/governance/boundary-parity.test.ts:17
import { boundaries } from "../../docs/policies/boundaries.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/mcp/governance-server-review.test.ts:100
const pkg = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8")) as { version: string };
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:524
`tailscale funnel --bg --https=8443 http://127.0.0.1:8787`) and give the apps its URL:
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/mcp/http-oidc.test.ts:74
publicUrl: "http://127.0.0.1:1",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/mcp/http-oidc.test.ts:158
expect(meta.resource).toBe("http://127.0.0.1:1/mcp");
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/mcp/http-server.test.ts:29
publicUrl: "http://127.0.0.1:1",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/mcp/http-server.test.ts:239
expect(redirectAllowed("http://127.0.0.1:5555/cb")).toBe(true);
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
better-sqlite3, pg, @electric-sql/pglite, @electric-sql/pglite-pgvector, @langchain/core, @langchain/langgraph, @mastra/core, @types/better-sqlite3
Why it matters. 22 dependency range(s) float
Fix. pin exact versions or ship a lockfile
INFOInventory / provenance · inv.oversize · CWE-1104
bench/results/2026-09-29-lme-full-all.json
bench/results/2026-09-29-lme-full-all.json
Why it matters. 2964350 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
bench/results/2026-09-29-longmemeval-full.json
bench/results/2026-09-29-longmemeval-full.json
Why it matters. 2563004 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
bench/results/2026-09-30-lme-full-fast.json
bench/results/2026-09-30-lme-full-fast.json
Why it matters. 3020860 bytes not read
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/PRIVACY.md:39
keeps facts that read like secrets (passwords, keys, tokens) classified Sensitive and out of every
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/claude-plugin.md:91
its terms, like anything else you type. Facts that read like passwords or keys are kept out of
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha ccd873dea1b6full audit observations/trust-audit/mcp-server/flytomoon__al-buddy-memory.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-11ccd873dea1b6BLOCKD69first audit
06

Questions

What is the al-buddy-memory MCP server?

Portable, governed, model-agnostic memory for AI agents: facts invalidated never deleted, raw text as truth, one documented export format.

What tools does al-buddy-memory expose?

12 in total: 11 read-only, 0 that write, and 1 that can delete or overwrite (invalidate). Every one is listed on this page with its risk.

Is al-buddy-memory safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (69/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 1 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does al-buddy-memory need?

It reads AL_BUDDY_MEMORY_AUDIT_KEY and OPENAI_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does al-buddy-memory run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as al-buddy-memory at 0.11.0.

How current is this page?

The grade is for one exact copy of the source (ccd873dea1b6), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement