amem
Registers the local amem MCP endpoint for GitHub Copilot and generates a marked block in .github/copilot-instructions.md, instructing the agent to query the personal memory graph instead of re-discovering decisions and file ownership each session.
Binds the repo to amem's local MCP server for JetBrains IDEs (amem init --platform jetbrains), exposing memory search and task-board tools so IDE agents start oriented with durable facts about the codebase.
Provides guidance for Neovim-based agents through the shared AGENTS.md instruction file, telling the agent to consult amem's local memory and task board before broad codebase exploration.
Adds amem's generated instruction block to AGENTS.md for Warp agents, so they query the local memory graph (claims, anchors, savings tracking) rather than re-grepping the tree each session.
amem
Personal agent memory that stays on your machine. Works with Claude Code, Cursor, Claude Desktop, Copilot, Codex, Gemini CLI, Windsurf, Continue, Aider and Zed.
npx @iamem/amem setup
Website · Features · Why amem · How it works
Coding agents forget between sessions. They re-grep the same tree, re-learn the same constraints, and burn tokens rediscovering decisions you already paid for once.
amem gives Cursor, Claude Code, and other local hosts a private, searchable memory of durable facts about your repos — what owns what, which files matter, what broke last time — so the next session starts oriented instead of cold.
amem context "sync auth startup"# Agent Memory Context
## Best Claims
### claim.sync_auth_mode_startup
Kind: `constraint`
Why: `keyword+8`, `fts+18.0`, `embed+6.3`, `kind:constraint`, `fresh`
The sync service checks auth mode during startup before enabling Drive sync.
Anchors: `src/background/sync-service.ts`Nothing is uploaded. Nothing is written into your product git history. Memory lives under ~/.amem/ on your laptop only.
Why amem exists
Without amem | With amem |
Agent explores broadly every session | Agent queries memory first, then verifies the right files |
Decisions live in chat scrollback | Decisions become structured claims with file anchors |
Team sharing pressure on “AI context” docs | Explicitly personal — your prompts and learnings stay local |
Flat | Small graph: components → flows → claims, updated via proposals |
amem is not shared company wikiware and not a cloud RAG product. It is a local tool for individual developers who want agents that remember their work.
Related MCP server: io.github.oleksiijko/pmb-ai
Privacy (non-negotiable)
Piece | Location | Shared? |
The amem tool (this repo) | GitHub / npm | Yes — installable |
Your memory database |
| No |
Cursor project rule |
| Safe to commit — guidance only, no memory contents |
Exports / backups you create | Wherever you write them | Keep private — do not commit |
Guarantees:
~/.amemis created with mode0700Local UI binds to
127.0.0.1onlyMemory never leaves the machine — no managed sync, no “share with org” mode
Optional anonymous install ping only (see Telemetry); opt out anytime
Agents are instructed to store repo facts, not proprietary prompting strategy
Optional AES-256-GCM lock and encrypted local backups — still no cloud
Requirements
Node.js 20+ (native
better-sqlite3)git (repo identity uses remote URL / root path)
Install the tool
npx @iamem/amem setup # Node 20+ — installs the `amem` CLI
# or
npm i -g @iamem/amem && amem setupFrom a clone while developing:
git clone https://github.com/sslugic/amem.git
cd amem
npm install
npm link
amem setupSee docs/npm-release.md. CI runs npm test and npm run pack:check. better-sqlite3 uses its own prebuilds — no extra native step on common macOS/Linux + Node 20/22.
If npm install fails compiling native code, install Xcode CLT (macOS) or build-essential (Linux) and retry, or use a Node 20/22 official binary that matches the prebuild matrix.
Telemetry
On npm install / npx (outside CI and tests), amem may send a single anonymous POST to https://getamem.com/api/beacon/npm-install with:
package name and version
Node.js version
OS platform and CPU architecture
No code, paths, usernames, emails, IPs, or memory contents are included. Opt out:
AMEM_TELEMETRY_DISABLED=1 npm i -g @iamem/amemMemory under ~/.amem still never leaves your machine.
Quick paths
# Cursor or Claude Code in a git repo
amem init --platform cursor # or: claude
# Other hosts (thin installers, same local DB)
amem init --platform windsurf|continue|aider|zed|claude-desktop
# Any other MCP client — binds the repo and prints the endpoint to paste
amem init --platform codex|copilot|gemini|cline|roo|jetbrains|opencode|goose|…
amem platforms # every id amem accepts (aliases included)
# Cross-repo “how I work” prefs (blended into project context)
amem init --personal
# or: amem setup --personalEncrypt-at-rest + local backups
amem lock --passphrase '…' # or AMEM_PASSPHRASE
amem unlock --passphrase '…'
amem backup --passphrase '…' # ~/.amem/backups by default
amem backup schedule # daily local timer (no cloud)
amem backup unscheduleWhile locked, set AMEM_PASSPHRASE (or unlock) before any command that opens the DB.
Embeddings and the rest of the toolkit
Everything is free. There are no tiers and nothing is held back — local embeddings, memory hygiene and its schedule, rules sync and the attestation packet are all included.
amem embed use ngram # local n-gram model, or `external` for your own command
amem embed reindex
amem restore --file ~/.amem/backups/amem-….db.enc
amem hygiene
amem rules sync
amem it-pack --out ~/.amem/it-pack
amem doctor --attestThe embedder ships as a hashing model by default (no download); ngram and external (stdin text → JSON vector) are local too. Still no cloud embed API, and nothing is uploaded.
Checkout + email delivery is a separate seller process (npm run shop) that is not published with the CLI. It can whitelist Mailtrap and Stripe names from another project’s .env — see shop/README.md.
Teaching every client how to use amem
Wiring a host to the MCP endpoint tells it amem exists; it does not tell it to
check the task board or query memory before exploring. amem init and
amem setup now write instructions into whatever file the host actually reads,
and one command covers everything else:
amem instructions # the client(s) bound to this repo
amem instructions --all # every supported client
amem instructions --check # CI-friendly: exits 1 if missing or stale
amem instructions --platform roo # just oneOne canonical text (src/instructions.ts) renders per host, so guidance cannot drift between clients:
File | Clients |
| Cursor |
| Claude Code |
| Codex, Grok, OpenCode, Crush, Amp, Qwen, Droid, OpenHands, Warp, Zed, Cody, Antigravity, Neovim, Claude Desktop, Devin, Jules |
| Gemini CLI |
| GitHub Copilot |
| Windsurf, Continue, Cline, Roo, Kilo, Augment, Kiro, Trae, Amazon Q |
| Junie, Goose, Aider |
Hosts sharing a file are written once, so --all produces 17 files, not 30.
Shared files (CLAUDE.md, AGENTS.md, .github/copilot-instructions.md) get a
marked block that is replaced in place — anything you wrote around it survives:
# My Project
Use pnpm, not npm.
<!-- BEGIN amem (generated) -->
…
<!-- END amem -->Aider has no MCP, so it receives CLI commands instead of tool names. Every file
is guidance only — no memory contents — and safe to commit. amem doctor says
so when a bound client's instructions are missing or out of date.
Memory that curates itself
Memory rots if nothing retires it. amem cleans up on a schedule rather than waiting to be asked:
amem hygiene schedule # daily; amem doctor warns when it is not installedEach run takes a safety backup, then, per repo:
Signal | What it means | Action |
Non-fact | Chat filler stored as a claim | Deleted (held back if it exceeds 25% of the repo — a heuristic matching most of a corpus is a broken heuristic) |
Anchor rot | Every file the claim points at is gone | Decayed. Tag-style anchors and source-less workspaces are exempt |
Unhelpful | Attested 3+ times and never once answered the question | Decayed |
Unused | Not returned and not touched inside the window | Decayed |
Near-duplicate | Same content, overlapping anchors | Merged |
A claim is only ever retired on positive evidence. Missing attestation never counts against it — otherwise shipping this would decay everything at once. Pinned claims never decay.
Savings you can check
amem context records what it handed over; the agent (or the stop hook, from the host transcript) records what it still had to open. The saving is then computed from the real size of the files that were avoided:
saved = Σ(measured tokens of anchors returned but not opened) − packet_tokensNothing asks a model to estimate its own value, and a packet that avoided nothing reports a loss. The dashboard says modelled until 30 events have been attested, then switches to measured and corrects the total by the observed ratio.
amem usage attest --opened "src/db.ts" # or let the stop hook do it
amem usage recompute --scope all --apply # re-measure historical eventsFirst-time setup (recommended)
amem uiThat opens http://127.0.0.1:7843 on the Setup tab. It scans your home folder for git repos (skips Library, node_modules, Downloads, and similar noise). Check the ones you want, pick clients (Cursor, Claude Code, Windsurf, Continue, Aider, Zed, …), then Start tracking selected. Each pick is bound in ~/.amem and gets the matching installer when available.
Prefer a desktop window instead of a browser tab (same localhost server, same privacy):
# once per machine/checkout (downloads Electron — not included in npm i -g)
npm run app:setup
amem appamem ui keeps opening the browser; amem app opens Electron. Both talk to 127.0.0.1 only. If the UI server is already running, amem app attaches to it. Global installs: run npm run app:setup from the package directory (or clone), then amem app.
The header has a Personal switcher (cross-repo prefs) and Lock / backup chrome — lock status, last backup, and a daily local schedule. Memory shows the same lock/backup chips. The Setup tab includes a copyable remember contract for any MCP host (amem recipe).
Optional: check Start amem ui when this computer logs in so the localhost server comes back after a reboot:
amem service install # macOS LaunchAgent, Linux systemd --user, or Windows Startup
amem service status
amem service uninstallTabs after setup:
Setup — scan/select repos, platforms, login auto-start, bootstrap proposal
Memory — facts by file, scored drafts (approve / replace older / dismiss / reject noisy), edit/pin/delete, search, recent hits/misses
Tasks — per-project Kanban for deferred agent work (Backlog → Next → Doing → Blocked → Done). MCP:
amem_task_add/amem_task_update/amem_task_complete. Open tasks appear inamem_context. Use Memory for durable facts; Tasks for “do later.”Stats — estimated tokens saved per LLM, plus JSON / markdown / PDF export (proxies, not a bill)
Server-only (no browser open):
amem ui --port 7843 --no-openTo scan extra folders (or only a subset), set AMEM_SCAN_ROOTS to a colon-separated list of directories.
CLI alternative (no UI)
cd ~/path/to/your-real-project
amem init --platform cursor # or: --platform claude
amem doctor
amem statusTo wire both agents to the same local memory, run init once per platform (or select both in the UI).
Day-to-day loop
1. Query before exploring
amem context "billing webhook retry"Or let the agent do it — Cursor gets an always-on project rule; Claude gets hook guidance. Both install the skills:
amem-bootstrap— seed baseline memoryamem-update-working-memory— save durable learnings after a session
Hooks also inject context on session start / prompt submit, store conversation notes, queue session-end drafts, and can queue miss→learn drafts after empty context lookups when the agent later cites real files. Approve drafts in Memory (or allow low-risk kinds via policy auto_apply_kinds).
Session start also injects your recent personal memories (last 7 days), so a new chat picks up where the last one left off. Memories that mention the current repository come first. Personal memories saved with kind private (or anchor private) never appear in a work repository's context. Auto-generated skills whose description is just "Procedure for " are no longer suggested unless they have been used, and injected text is shortened at sentence boundaries. Claude Code receives hook context through hookSpecificOutput.additionalContext; Cursor through additional_context.
Stop checkpoint (opt-in). Set AMEM_STOP_CHECKPOINT=1 on the Claude Stop hook command (AMEM_STOP_CHECKPOINT=1 amem hook) to have Claude save durable context before it stops — only when the turn changed something (edits, commands, write-type MCP tools) and nothing was saved to amem after that work. Read-only turns and turns that already saved are left alone.
Secret filter. Remember, capture and skill writes block secret values (written-out keys, tokens, passwords, PEM keys, known token formats), not mentions of secret names such as SUMSUB_MOCK_WEBHOOK_SECRET or references like "$(gcloud secrets …)". IT policy deny_claim_patterns can add stricter rules.
2. Work as usual
Treat memory as a map, not source of truth. Read the anchored files before you change them. Prefer claims marked fresh; verify stale ones (anchored files changed after the claim).
3. Save what should survive
Ask the agent to run amem-update-working-memory, approve Memory drafts, or apply a proposal yourself:
amem propose validate /tmp/memory.json
amem propose diff /tmp/memory.json
amem propose apply /tmp/memory.json4. Optional agent one-shot install
From inside the product repo, paste docs/agent-install-prompt.md into Cursor or Claude Code and let it run setup for you.
What gets stored
Memory is a small local graph in SQLite:
Object | Meaning |
Component | A subsystem / module ( |
Flow | How work moves ( |
Claim | A durable fact with file anchors (may be |
Edge | Links (claim → flow → component); |
Draft | Pending session / miss→learn proposals waiting for Memory approve |
Task | Deferred work on the project Kanban (Backlog / Next / Doing / Blocked / Done) — not a durable fact |
Skill | A reusable multi-step procedure, stored as a |
Usage event | Each |
Claims are the retrieval unit. Ranking combines:
SQLite FTS5 (Porter stemming) + keyword score
On-device hashing embeddings (no model download)
Pin boost, kind weights (
constraint/gotcha>session), freshnessOptional personal prefs claims blended into project context
Each injected claim includes a Why: line. Stale claims (anchors changed after updated_at) are down-ranked.
Example claim:
{
"id": "claim.webhook_idempotency",
"kind": "constraint",
"text": "Stripe webhooks must be idempotent on event.id before mutating invoices.",
"code_anchors": ["src/webhooks/stripe.ts"],
"supersedes": ["claim.webhook_old_rule"]
}supersedes (or an edge with kind: "supersedes") marks older claim ids as archived so they leave retrieval.
Skills (procedural memory)
Claims answer what is true. Skills answer how we do this here — a deploy sequence, a migration dance, a debugging path someone already walked. They are too long to sit in every prompt, so they load on demand.
Skills live as SKILL.md files under ~/.amem/skills/, indexed in SQLite for ranking:
~/.amem/skills/deploy-staging/SKILL.md
~/.amem/skills/deploy-staging/references/runbook.mdProgressive disclosure. A context packet carries only names and descriptions. The agent
calls amem_skill_view to pull a body once it decides the procedure applies, so an unused
library of skills costs almost no tokens.
The learning loop. amem ships no model, so it never writes a skill itself. At session end it looks for the shape of a hard-won procedure — enumerated steps or real commands, plus an error it recovered from or a correction you gave. When several signals line up it queues one suggestion, which reaches your agent as a nudge in the next context packet. The agent writes the skill; you approve it. If a skill was loaded during a session that still went sideways, amem queues a revision instead of a duplicate.
The bar is deliberately high, and a session can queue at most one suggestion.
amem skills list # index of what is stored
amem skills show deploy-staging # full body
amem skills new deploy-staging --desc "Deploy staging and verify health"
amem skills import ./some-skill # bring in an agentskills.io skill
amem skills drafts # pending suggestions and staged writes
amem skills approve <draft-id>Skills are also a Skills tab in amem ui.
Safety. Skills are instructions an agent will follow, so content is scanned for credentials and prompt-injection patterns before any write. Three policy keys control them:
Key | Default | Effect |
|
| Master switch for storage, ranking, and injection |
|
| Stage agent writes for review instead of writing to disk |
|
| Allow session-end skill suggestions |
An unreadable policy.toml forces skill_write_approval on. amem doctor --attest reports
every installed skill with a content hash, so you can diff what agents are being told to do.
Backups currently copy the database only —
~/.amem/skills/is not included yet. Keep skills you care about in version control until that lands.
Token savings (estimates)
Every amem context logs a usage event. The UI Stats tab breaks this down by platform (cursor, claude, …).
Automatic estimate:
estimated_avoided = max(0, anchors×4000 + claims×200 − packet_tokens)This is a proxy for exploration avoided — not your Cursor/Anthropic bill. Money uses the same token proxy at $3 per 1M input tokens (Sonnet-class input). Cursor included usage and output tokens are not billed this way, so treat $ as an order-of-magnitude estimate.
Time saved is a separate proxy: each returned file anchor is treated as ~1.2s of tool round-trip the agent did not have to make. Local lookup duration is measured (SQLite on localhost). Hit rate is keyword matches on amem context — not Cursor/model API calls (those still happen). A miss means no stored fact matched the query; newest facts may still be injected as a weak fallback, and the agent still talks to the model.
Stats also shows a monthly projection: last 7 days of calls (or fewer if you just started), scaled to 30 days. Still a proxy, not a bill.
If you later know a better number:
amem usage report --platform cursor --saved 12000
# or attach to a specific event:
amem usage report --event-id usage_… --saved 12000LLM clients (beyond git repos)
amem can bind a named workspace that is not a git checkout — for Luna Client or any tool that talks to Cursor/Claude/other models.
amem init --workspace my-app
# seeds starter facts and runs a context check automaticallyAttach any LLM client yourself (HTTP or MCP). Keep amem ui running for HTTP. From the client, before each model call:
const res = await fetch("http://127.0.0.1:7843/api/context", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
workspace: "my-app",
query: userMessage,
platform: "app",
sessionId,
}),
});
const { markdown } = await res.json();
// prepend markdown to the prompt / tool result so the model skips a large retrieveAfter a durable outcome:
await fetch("http://127.0.0.1:7843/api/remember", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
workspace: "my-app",
text: takeaway,
kind: "session",
anchors: ["my-app"],
}),
});MCP config (any MCP host):
Keep amem ui running (or amem service install so it starts at login). GUI apps often cannot find amem on PATH, which shows up as “live tool discovery failed” / MCP error — not a sign-in prompt. Prefer HTTP:
{
"mcpServers": {
"amem": {
"url": "http://127.0.0.1:7843/mcp?workspace=my-app"
}
}
}Stdio also works if the host can spawn the binary. Print a config with absolute paths:
amem mcp --print-config --workspace my-appSame localhost DB as git-repo memory. The UI switcher groups Git repos and Workspaces. Rename a workspace's display name anytime — the MCP slug (workspace=luna-ai) and stored claims stay on the same id.
amem rename "Luna Client" --workspace luna-aiMCP tools (stdio or HTTP):
Tool | When to use |
| Ranked memory packet for the current question |
| Store a durable fact after an outcome |
| Generic read-then-write contract (any MCP host) |
| Cheap index of stored procedures (names + descriptions only) |
| Load one skill body, after the index says it applies |
| Store a multi-step procedure you just worked out |
| What is monitored (git repos + named workspaces) |
| Lookup time, estimated tokens/ms saved, hit rate |
| Claims / components / flows stored for a workspace or repo |
| Binding + counts; omit workspace for a machine-wide overview |
Command reference
amem setup [--personal] [--platform <host>]
amem init --platform <client> # amem platforms lists every id
amem platforms [--json]
amem init --workspace <name> [--path <dir>] [--platform …]
amem init --personal
amem rename "<display name>" --workspace <slug>
amem status [--workspace <name>]
amem doctor [--attest] [--json]
amem context "<query>" [--workspace <name>] [--platform …]
amem remember "<text>" [--workspace <name>] [--kind …] [--anchor <path>]
amem recipe [--json]
amem skills list|show <name>|new <name> [--desc <text>]|rm <name>|sync|import <path>
amem skills drafts|approve <draft-id>|dismiss <draft-id>
amem mcp [--print-config] [--workspace <name>]
amem propose validate|diff|apply <file.json>
amem export [--out <file.json>]
amem wipe --yes
amem wipe --all --yes
amem lock|unlock --passphrase <secret>
amem backup [--out <dir>] [--passphrase <secret>] [--label <name>]
amem backup schedule [--out <dir>] [--hour <0-23>]
amem backup unschedule
amem session touch --platform cursor|claude [--session-id <id>]
amem hook
amem usage report --saved <n> [--platform …] [--event-id …]
amem usage export [--format json|md|pdf] [--days 30] [--scope current|all] [--out <file>]
amem license status|apply|activate|clear|issue|keys
amem embed status|use hash|use ngram|reindex
amem ui [--port 7843] [--no-open]
amem app [--port 7843]
amem service install|uninstall|statusCommand | Purpose |
| One-shot personal workspace + optional host install |
| Bind a git repo, named workspace, personal prefs, or host |
| Change a workspace display name; MCP slug and memory stay bound |
| Retrieve a Markdown packet; log usage |
| Store one local fact |
| Stdio MCP tools; HTTP MCP at |
| Manage procedural memory ( |
| Preview claim/component/flow changes before apply |
| Upsert structured memory locally |
| Optional AES-256-GCM encrypt-at-rest for |
| Local snapshot (optionally encrypted); |
| Setup wizard + Memory + Stats in the browser (localhost) |
| Same UI in an Electron window ( |
| Login item so |
| Privacy/policy attestation for IT tickets |
| Personal backup or delete (still local) |
| Offboard: wipe every repo and remove |
What install puts where
Cursor
Artifact | Path |
Skills |
|
Project rule |
|
Hooks |
|
Reload Cursor if skills/rules do not appear immediately.
Claude Code
Artifact | Path |
Skills |
|
Hooks |
|
Other hosts
Host | What amem writes |
Windsurf |
|
Continue |
|
Aider |
|
Zed |
|
Claude Desktop |
|
Every other client in amem platforms — Codex, Copilot, Gemini CLI, Grok, Cline,
Roo, Kilo, Cody, Augment, JetBrains, Kiro, Trae, Antigravity, Neovim, OpenCode,
Goose, Crush, Amp, Qwen Code, Factory Droid, OpenHands, Amazon Q, Warp, Devin,
Jules — has no local installer: amem init --platform <id> binds the repo and
prints the MCP endpoint to paste (amem recipe for the full config).
Client ids are alias-folded, so claude-code, vscode, pycharm and
chatgpt resolve to claude, copilot, jetbrains and codex rather than
tripping policy.allowed_platforms.
Security & Architecture FAQ
How does amem prevent tool-poisoning and prompt injection?
Unconstrained memory tools that blindly record chat transcripts are vulnerable to storing conversational residue, adversarial instructions, or poisoned context. amem enforces multiple defensive gates:
Fact vs. Noise Syntax Filtering (
isFactLike): Transcript sentences, questions, chat pleasantries, and user prompt fragments are automatically rejected before becoming claims, even if they mention real file paths.Built-in & Custom Secret Deny Lists (
BUILTIN_DENY_CLAIM_PATTERNS): Built-in regexes drop passwords, API keys, tokens, and private keys. Administrators can enforce additional regex deny patterns via system policy.Quality & Specificity Scoring (
scoreProposal): Proposals are scored based on anchor presence, durable vocabulary (constraint,gotcha,must), and specificity. Thin or low-scoring entries below the rejection threshold are dropped.Staged Ingestion Queue by Default (
ProposalDraft): Background captures and session-end deductions are staged as proposals in SQLite for human review in the UI. Auto-apply is disabled by default (auto_apply_kinds = []).Conflict & Supersede Tracking: When new claims share anchors with existing facts, amem computes similarity and raises conflict warnings, requiring explicit superseding rather than allowing silent overwrites.
How does amem prevent context bloat and cross-project memory leakage?
Per-Repository Partitioning: Every memory claim, task, component, and note is keyed by
repo_id(derived from git remote URL / workspace path). Queries in one project cannot retrieve or leak memory from another repository.Hybrid Retrieval & Strict Limits: Rather than dumping the graph,
amem_contextuses hybrid BM25 full-text search, on-device embeddings, keyword match, and freshness multipliers to rank and select only the top relevant facts (default limit: 12).Hard Character Caps: Automatic hook injections are hard-capped at 2,400 characters to prevent prompt bloat and token exhaustion attacks.
Progressive Disclosure for Skills: Context packets inject only a Level-0 index (skill names and one-line descriptions). Full procedural bodies are never injected unless the model explicitly requests them via
amem_skill_view.
How does amem handle code changes without serving stale memory?
Every claim is grounded with file anchors (code_anchors). During context generation, amem verifies file existence and compares file modification timestamps against claim creation times:
If anchored files have changed, the claim is marked stale and penalized in ranking.
Context packets explicitly inject a warning into the agent's prompt:
"_X claim(s) marked stale — anchored files changed after the claim was written. Verify before trusting._"
Does amem expose an unauthenticated network server or upload code?
Strict Loopback Binding: The local HTTP UI / MCP daemon binds exclusively to
127.0.0.1. Non-loopback bindings are blocked by hardcoded policy rules.Zero External Egress: Telemetry is hardcoded off (
telemetry: false). All SQLite databases (graph.db), vectors, and logs stay under~/.amemwith0700local filesystem permissions.Optional At-Rest Encryption: The local database can be encrypted using AES-256-GCM (
amem lock --passphrase '...').
Develop amem itself
cd amem
npm install
npm run build
npm run test # unit + integration + CLI e2e (node:test)
npm run smoke # end-to-end CLI/API smoke
npm run test:all # both
npm linkLayout:
src/ CLI, SQLite, policy, attest, installers, localhost API
ui-static/ Setup / Memory / Stats UI
skills/ Agent skill markdown
templates/ Cursor rule + example enterprise policy
docs/ Agent install prompt + IT endpoint runbook + backlog
test/ Comprehensive node:test suite
scripts/ Smoke tests + MDM offboard helperOverride the memory home for tests:
AMEM_HOME=/tmp/amem-test amem statusEnterprise endpoint (IT-managed)
amem is still personal memory on the laptop — not a shared wiki or cloud RAG.
IT / DevEx can govern the fleet: approved install, policy, attestation, offboarding.
Control | Mechanism |
Policy |
|
Attestation |
|
Secret hygiene | Builtin deny patterns + policy |
Export lock |
|
Platform / repo allowlists |
|
Auto-apply drafts |
|
Offboarding |
|
Hard guarantees (not configurable away):
No memory telemetry or claim upload —
~/.amemstays localOptional anonymous npm install ping only (opt out:
AMEM_TELEMETRY_DISABLED=1)UI binds to loopback only (
127.0.0.1)Memory stays under
~/.amem(mode0700)
IT quick start
# 1) Pin / install amem on the endpoint (internal npm, pkg, or npm link)
# 2) Deploy policy (root-owned on managed machines)
sudo mkdir -p /etc/amem
sudo cp templates/policy.example.toml /etc/amem/policy.toml
# 3) Verify for security review
amem doctor --attest --json
# 4) On offboard / laptop return
amem wipe --all --yes
# or: scripts/mdm-offboard.shExample policy: templates/policy.example.toml
Full IT runbook: docs/enterprise-endpoint.md
Suggested rollout: small DevEx pilot → MDM package + policy → signed builds/SBOM if procurement asks. Shared org memory is intentionally out of scope.
Non-goals
Company-shared or synced memory
Cloud hosted “team brain”
Exact provider billing integration
Cloud/remote embedding APIs (local FTS5 + on-device hashing embeddings only)
Writing memory contents into product git history
Upcoming ideas (not scheduled): see docs/backlog.md.
License
MIT — see LICENSE.
Available Tools
16 toolsamem_contextA
Retrieve compact local amem memory for a query. Use before exploring files or calling a remote LLM with a large prompt. Pass workspace for named app memory, not only git repos.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| platform | No | ||
| sessionId | No | ||
| workspace | No | Named workspace (not a git repo) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden. 'Retrieve' and 'local' imply a read-only, offline operation, but it never states there are no side effects, whether results can be empty, or how much is returned. Nothing is contradicted, but a mutation-free guarantee and result-shape hint are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core action first, the usage trigger second, and the parameter caveat last. No filler, nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and 75% of parameters undocumented, the definition leaves real gaps: what 'compact memory' looks like on return, whether memory must first be written via amem_remember, and what platform/sessionId do. Adequate to attempt a call with just a query, but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25% across four parameters. The description touches only workspace, and its wording ('named app memory, not only git repos') largely restates the schema's own 'Named workspace (not a git repo)'. The query, platform, and sessionId parameters are unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Retrieve compact local amem memory for a query.' Clear what it does and the local/compact nature. It does not differentiate from the obvious write counterpart amem_remember or from amem_graph, which also retrieves memory, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use before exploring files or calling a remote LLM with a large prompt' gives a concrete invocation context and implicitly a cost-saving rationale. It stops short of naming an alternative tool or stating when not to use it (e.g., when memory is stale or empty).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_graphA
Dump stored facts for a workspace or git repo: claims, components, flows, and recent activity. Use when asked what amem remembers about a project. Prefer amem_context for a ranked packet for the current question.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Activity lookback (default 30) | |
| workspace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. 'Dump stored facts' strongly implies a read-only operation and the scoping to a workspace or git repo is useful, but it says nothing about result size, truncation, ordering, or what happens when workspace is omitted (it is optional).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler: capability first, usage trigger second, sibling routing third. Front-loaded and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With two optional params and no output schema, the description adequately covers what the tool does and what categories of data come back. It falls short only on behavioral detail an agent might want (default workspace behavior, response volume), which is minor for a read-only dump.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: 'days' is documented in the schema but 'workspace' is bare. The description compensates by stating that the workspace may be a git repo, clarifying the accepted value domain of the undocumented parameter, though it never mentions the lookback/window at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Dump') plus the resource ('stored facts for a workspace or git repo') and enumerates what is returned: claims, components, flows, recent activity. It also names the sibling it is not (amem_context), so an agent can distinguish it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use when asked what amem remembers about a project') and an explicit alternative with the condition that selects it ('Prefer amem_context for a ranked packet for the current question'). Both the when and the when-not are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_recipeA
Return the generic amem remember contract: when to call amem_context vs amem_remember. Use if you are unsure whether to read or write memory. Same recipe for every MCP host.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It implies a read-only informational response by saying it returns a recipe/contract, and notes consistency across MCP hosts, but it does not explicitly state that no memory is modified or describe the response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with no waste. It front-loads what is returned, then when to use it, then a useful consistency note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter guidance tool with no output schema, the description is nearly complete: it says what the tool provides and when to use it. A minor gap remains around what the returned contract looks like, but the core need is covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so parameter semantics are not applicable and the baseline is 4. The description correctly does not invent parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states that the tool returns a generic amem remember contract and explicitly frames it as guidance for choosing between amem_context and amem_remember. That distinguishes it from the sibling tools, though the word 'contract' is slightly abstract and the tool's output form is only loosely implied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a direct condition for use ('Use if you are unsure whether to read or write memory') and names the two alternative tools at the decision point. This is explicit when-to-use guidance with alternatives identified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_rememberA
Store a durable local fact in amem (stays on this machine). Use kind private (or anchor private) for personal, non-work facts so they never appear in work repositories' context. When the fact replaces an older one (a newer status, a fixed bug, a changed decision), pass the old claim ids in supersedes so the outdated memory stops being served. The response lists possiblySupersedes: older look-alikes to retire with amem_supersede if they are now wrong.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| text | Yes | ||
| anchors | No | ||
| workspace | No | ||
| supersedes | No | Claim ids this fact replaces |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses persistence/local-only scope, the privacy isolation guarantee of `private`, the effect of supersession ('stops being served'), and the shape of the response field `possiblySupersedes`. It omits permission/auth requirements, duplicate handling, and whether a failed supersede id is rejected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences, front-loaded with the core action, then the privacy rule, then the supersession workflow. No filler and every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter write tool with no annotations and no output schema, the description covers the action, the privacy dimension, the supersession path, and the one response field that requires follow-up action. The unexplained `anchors` and `workspace` parameters are the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20% (just `supersedes` is documented), and the description meaningfully compensates for `kind` and `supersedes` with the private-anchor rule and the replace-an-older-fact semantics. However, `anchors`, `workspace`, and `text` receive no explanation anywhere, leaving roughly half the parameters semantically opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Store a durable local fact in amem') and immediately scopes it as local-only. It also names the sibling tool (amem_supersede) reserved for retiring memories, so an agent can distinguish the two without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three concrete selection rules: use kind/anchor `private` for personal non-work facts, pass old claim ids in `supersedes` when the fact replaces an older one, and route look-alikes surfaced in `possiblySupersedes` to amem_supersede. The alternative tool and the condition that selects it are stated explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_reposA
List what amem is monitoring. Each item has kind git or workspace. Workspaces also have a stable slug (MCP id); the display name can differ. Use when asked which projects, workspaces, or repos amem knows about.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | all (default), git, or workspace |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavior, and it does disclose useful details beyond the signature: items carry a kind, and workspaces have a stable slug (MCP id) that can differ from the display name — a genuine gotcha that prevents lookup errors. It stops short of stating read-only semantics, result size, or pagination, so a 4 rather than a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences: purpose first, then item structure, then the usage trigger. Every sentence supplies information an agent needs (taxonomy, the slug/display-name caveat, routing cue) with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description has to sketch the return shape, and it does name kind and the workspace slug/display-name distinction. It does not enumerate the full item fields or say whether results are paginated or ordered, which leaves a small gap for a no-annotation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'kind' parameter already documents all/git/workspace, so the baseline is 3. The description references the git/workspace taxonomy but adds no filtering semantics — e.g. whether 'all' is the default or how slug matching works — beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('List what amem is monitoring') and then defines the item taxonomy (kind git or workspace), which no sibling tool offers. The final clause scopes it to projects/workspaces/repos, so an agent can separate it from amem_status or amem_stats without inspecting another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when asked which projects, workspaces, or repos amem knows about' gives a clear triggering condition. It does not name a when-not case or an explicit alternative (e.g. amem_status for health vs this for inventory), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_skill_listA
List stored skills (procedures the agent learned) as an index of names and descriptions only. Cheap — call this first, then amem_skill_view to load the one you need. Skills are longer procedures; use amem_context for small durable facts.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional: rank the index against this task description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does disclose the key traits: it is 'cheap', returns only an index of names and descriptions, and is meant to precede a view call. It does not mention pagination, ordering, or auth, but for a simple read-only list tool the disclosed cost and return shape are the critical behavioral facts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero waste. The purpose and return shape are front-loaded, followed by the recommended follow-up and the sibling distinction, all in an efficient order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must explain return values, and it does ('index of names and descriptions only'). It also covers cost and next steps. Minor gaps remain: no mention of ordering, result count, or behavior for an empty index, but these are small for a lightweight list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single optional 'query' parameter is fully described in the input schema. The description itself never mentions the query parameter or how it ranks results, so it adds no meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('stored skills'), defines them as 'procedures the agent learned', and specifies the return as 'an index of names and descriptions only'. It explicitly distinguishes itself from amem_skill_view (load one) and amem_context (small durable facts), so an agent can pick it without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing: 'call this first, then amem_skill_view to load the one you need'. It also names an alternative for a different need ('use amem_context for small durable facts'), leaving no ambiguity about when to use this tool versus its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_skill_saveA
Save a non-trivial multi-step procedure you just worked out as a reusable skill. Use after solving something worth repeating — a workflow, a dead end you found the way past, or a correction the user gave you. Provide a full SKILL.md in content, or a description plus body.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Short slug, e.g. deploy-staging | |
| content | No | Full SKILL.md, or the markdown body to wrap | |
| sessionId | No | Optional conversation id, so amem can clear the nudge that prompted this | |
| description | No | One line on when to use this skill |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description bears the full burden. It usefully discloses accepted input shapes (full SKILL.md vs. description-plus-body) and the 'non-trivial' admission bar. It omits the behaviors that matter most for a write tool: what happens if `name` already exists (overwrite, error, or needs amem_supersede), whether the skill is immediately visible to amem_skill_view/list, and any size or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and scope, then the trigger, then the input convention. Nothing is redundant and every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter write tool with no annotations and no output schema, the description covers purpose and input shape but leaves the collision/update semantics and post-save visibility unaddressed — both of which an agent needs in order to call this correctly, especially with amem_supersede sitting among the siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description genuinely adds meaning the schema does not: it explains that `content` may be either a complete SKILL.md or a markdown body to be wrapped, and that `description` plus body is an accepted alternative to a full document. That clarifies the relationship between the two nullable fields rather than restating them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Save') plus a well-qualified resource ('a non-trivial multi-step procedure ... as a reusable skill'), which cleanly separates it from amem_skill_view and amem_skill_list. It does not, however, distinguish itself from amem_remember, the sibling an agent is most likely to confuse it with when deciding whether a piece of knowledge is a 'skill' or a 'memory'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit, concrete trigger conditions: 'after solving something worth repeating — a workflow, a dead end you found the way past, or a correction the user gave you.' These are actionable and better than most. It stops short of exclusions — nothing says when NOT to save (e.g. one-off facts, trivial steps) or to prefer amem_remember instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_skill_viewA
Load the full body of one skill by name, or a supporting file inside it. Call this only after amem_skill_list (or the 'Relevant skills' section of an amem context packet) shows a skill worth following.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Optional supporting file, e.g. references/api.md | |
| name | Yes | Skill name from amem_skill_list | |
| sessionId | No | Optional conversation id, so amem can tell whether this procedure actually worked out |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. 'Load' implies a read, and the prerequisite sentence discloses ordering, but nothing is said about behavior for an unknown skill name, payload size of a 'full body', or any side effects. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both load-bearing: the first defines what is fetched, the second constrains when. Front-loaded with the action and zero padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema read tool with fully documented params, the definition covers what is returned (full skill body or inner file) and the ordering constraint. It leaves out failure behavior and whether repeated loads are cheap, which are the only notable gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented. The description adds only the relational nuance that 'file' is a supporting file inside the named skill; it adds no new guidance on 'sessionId' beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Load the full body of one skill by name, or a supporting file inside it,' which distinguishes it from amem_skill_list and amem_skill_save. It does not name those siblings explicitly beyond the prerequisite mention, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit gating condition: 'Call this only after amem_skill_list (or the "Relevant skills" section of an amem context packet) shows a skill worth following.' That tells the agent both the prerequisite and the qualifying signal. No explicit when-not case (e.g., don't call for skills already loaded in context) is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_statsA
Usage and savings stats (local lookup time, estimated tokens/ms saved, hit rate) for one workspace/repo or everything. Use when asked how much amem helped, how often it hit, or usage over time.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Lookback window (default 30) | |
| scope | No | all (every tracked repo/workspace) or current (the given workspace / cwd) | |
| workspace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden; it does convey that this is a local metrics lookup (read-only by implication) and what metrics are reported. It does not state that it is non-mutating explicitly, what the response shape looks like (no output schema exists), how "estimated" savings are computed, or whether results are cached/paginated. Adequate but thin for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: what it returns and its scoping are front-loaded, then the trigger condition. No filler, no repetition of the tool name, no wasted clauses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter, all-optional stats tool with no annotations and no output schema, the description covers purpose and scope adequately but leaves the return structure unexplained — a meaningful omission for a metrics tool where the agent must know what fields come back. It also sidesteps the near-duplicate sibling entirely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: `days` and `scope` are documented in the schema, while `workspace` has no description anywhere. The prose reinforces scope semantics ("one workspace/repo or everything") and implies a time window with "usage over time", but adds no format or default detail beyond the schema. Matches the baseline-3 expectation at this coverage level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (usage and savings stats) and enumerates the metrics returned — local lookup time, estimated tokens/ms saved, hit rate — plus the scope dimension (one workspace/repo vs everything). An agent can tell this is an analytics read tool. The gap: the sibling `amem_usage_report` is nearly synonymous and the description does nothing to separate the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives a concrete trigger ("asked how much amem helped, how often it hit, or usage over time"), which is real when-to-use guidance. However, no exclusions or prerequisites are stated, and given a sibling named `amem_usage_report`, an agent has no basis for choosing between them — that overlap is left entirely unresolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_statusA
Binding, policy, and counts for one workspace/repo, plus the full monitored inventory. Omit workspace for a machine-wide overview.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations were provided, the description must carry the full burden. It clearly implies a read-only behavior ('Binding, policy, and counts'). However, it does not disclose non-functional behaviors like rate limits, latency, or the expected structure of the 'full monitored inventory,' keeping it at a satisfactory but not stellar score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is extremely concise. It uses only two sentences, and every phrase serves a high-value purpose: defining content and defining scope/behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description provides all the necessary context regarding what the tool retrieves (bindings, policies, inventory) and how its behavior changes based on the input parameters. It is highly complete for its functional purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description is vital. It explains the semantic significance of the 'workspace' parameter—that it controls the scope (single repo vs. machine-wide)—which is crucial context for tool invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly defines the resource and the data it returns ('Binding, policy, and counts,' 'full monitored inventory'). It clearly distinguishes the tool's function from a generic data retrieval operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear conditional usage guideline: omitting the 'workspace' parameter switches the scope from a specific repository to a machine-wide overview, effectively guiding the agent on how to use it for different levels of detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_supersedeA
Retire outdated claims so they stop appearing in context: marks them superseded (kept for history, not served). Pass by with the claim id that replaces them, if any.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | Claim id of the newer fact (optional) | |
| ids | Yes | ||
| workspace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden and does disclose the most important behavioral trait: supersession is non-destructive ('kept for history, not served'). It leaves out permission requirements, idempotency, and what happens to unknown ids, but the core semantics are front and center.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence with the outcome ('stop appearing in context') front-loaded, followed by the mechanism and the optional parameter hint. Nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation tool with no annotations and no output schema, the description covers the what and the effect but is silent on workspace scoping, error behavior for unknown ids, and whether the operation is reversible beyond 'kept for history'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 33%, so the description must compensate. It clarifies 'by' (which the schema already documents) and implicitly explains that 'ids' are the claims being retired, but says nothing about the 'workspace' parameter or the array/list format of ids.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb and resource ('retire outdated claims', 'marks them superseded'), and immediately distinguishes the operation from deletion by noting the records are 'kept for history, not served'. An agent can tell this apart from amem_remember and from a hypothetical hard-delete sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the triggering condition clearly: claims are 'outdated' and should 'stop appearing in context'. It does not name an alternative tool or state when not to use it (e.g., what to do instead if a claim was simply wrong rather than replaced).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_task_addA
Create a deferred agent task on the project Kanban (default backlog). Use for work that should not get lost in chat. Durable facts still go through amem_remember.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Why / notes | |
| title | Yes | ||
| status | No | backlog | next | doing | blocked | done | |
| anchors | No | ||
| workspace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral load. It discloses the default status (backlog) and that tasks are persisted on a project Kanban, but says nothing about return value, deduplication, permissions, or what anchors/workspace do.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and placement, then the usage condition, then the alternative. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create tool this covers purpose and routing well, but with no annotations, no output schema, and 40% parameter coverage, it leaves an agent guessing about anchors, workspace, and what a successful call returns. Minimum viable, not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 40%: body and status are described in the schema, while title, anchors, and workspace are undocumented everywhere. The description adds one useful default (status defaults to backlog) but does not compensate for the undocumented anchors and workspace parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a deferred agent task on the project Kanban') plus the default placement ('backlog'). It explicitly distinguishes itself from the sibling amem_remember by naming where durable facts belong.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a use condition ('work that should not get lost in chat') and names the alternative routing ('Durable facts still go through amem_remember'). An agent can decide between the two without opening either schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_task_completeC
Mark a deferred agent task as done on the Kanban board.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden for a mutation tool. It does not state whether the operation is idempotent, what happens if the task is already done, what permissions are required, or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It is concise, though it is under-specified rather than dense with useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, no output schema, and zero parameter description coverage, the description is too sparse. It communicates the core action but omits side effects, return behavior, parameter formats, and any safety or permission context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so both parameters are undocumented in the schema. The description does not explain the expected format of `id` or clarify the role of the optional `workspace` parameter, leaving the agent to infer both.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: marking a deferred agent task as done on the Kanban board. It is clear enough to distinguish this from sibling tools like task_add or task_list, though it does not explicitly name how it differs from task_update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'deferred agent task' hints at when the tool applies, but there is no explicit guidance about when to use this versus amem_task_update, amem_task_list, or amem_task_add. No exclusions or preconditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_task_listA
List deferred agent tasks (Kanban) for a workspace/repo. Use for work to do later — not durable facts (use amem_remember for those). Default excludes done tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | backlog | next | doing | blocked | done | |
| workspace | No | ||
| include_done | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does disclose one real default: done tasks are excluded unless requested. However, it says nothing about result ordering, pagination/limits, or what a task record contains, and read-only status is only implied by the verb 'List'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, and the core purpose plus the default-behavior caveat are front-loaded before any elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, no annotations, and only partial parameter coverage, so the description still leaves gaps around returned fields, ordering, and result size. It is adequate to select the tool but thin for calling it correctly on a workspace with many tasks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, so the description should compensate more than it does. It adds meaning for include_done by stating the default excludes done tasks, and implies workspace scoping, but the status parameter's semantics and the workspace format are left entirely to the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List deferred agent tasks (Kanban) for a workspace/repo'. It also explicitly separates this tool's data domain from amem_remember, so an agent can tell it apart from the fact-storage sibling without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage condition ('Use for work to do later') and names the alternative for the other case ('not durable facts (use amem_remember for those)'). It does not explicitly say when to prefer this over task_add/task_update/task_complete, but the list-vs-mutate distinction is largely self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_task_updateB
Update a task title, notes, anchors, or move its Kanban status (backlog/next/doing/blocked/done).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| title | No | ||
| status | No | ||
| anchors | No | ||
| workspace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden for a mutation tool. It discloses the mutable fields and allowed status values, but says nothing about permissions, whether updates are partial, reversibility, side effects of status changes, or what is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single front-loaded sentence with no filler. It efficiently lists the main update targets and the allowed Kanban status values.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a six-parameter mutation tool with no annotations, no output schema, and no parameter descriptions in the schema, the description is too thin. It should clarify the required id, workspace scoping, and partial-update behavior to be complete enough for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only names some of the six parameters. It mentions title, notes (likely body), anchors, and status, but omits the required id and the workspace parameter; the "notes" wording also does not directly match the schema's "body" field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ("Update a task") and enumerates the mutable fields: title, notes, anchors, and Kanban status. It is clear what the tool does, though it does not explicitly differentiate itself from the sibling amem_task_complete despite overlapping with moving a task to "done".
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by listing the fields that can be updated and the allowed status values, but it gives no explicit when-to-use guidance or exclusions. In particular, it does not say when to use this tool versus amem_task_complete for completing a task, leaving the agent to infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
amem_usage_reportA
Report what you actually did with the last amem context packet, so its savings estimate becomes a measurement instead of a guess. Call this once after you have finished acting on a packet. Do NOT estimate tokens — just list which of the anchors amem gave you you ended up opening anyway (anchors_opened), and whether the packet answered the question without further exploration (answered). amem computes the saving from the real size of the files you did not have to open. Reporting that you opened everything is a useful and expected answer.
| Name | Required | Description | Default |
|---|---|---|---|
| answered | Yes | True if the packet answered the question without broad exploration. False if you had to grep or read widely anyway. | |
| event_id | No | Specific usage event. Omit to attest the most recent packet for this repo. | |
| workspace | No | ||
| anchors_opened | Yes | File paths from the packet's Anchors lines that you actually read. Empty array if the claims alone were enough. Paths not in the packet are ignored. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses that amem computes the saving server-side from real file sizes, so the agent should not estimate, and that paths not in the packet are ignored. It does not state whether this is a write/attestation that persists, what happens on a repeat call, or what the tool returns, which is a meaningful residual gap for an unattested mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the timing constraint in the first two sentences, with the anti-estimation warning early. It is somewhat padded — the closing reassurance and the restated parameter names duplicate schema fields — but nothing is confusing or out of order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with no output schema and no annotations, the description covers the critical decision points: when to call, what to report, what not to compute, and the omission default. The main missing piece is the return value — with no output schema, an agent cannot know whether it gets back a saving figure or an acknowledgement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the schema already documents most fields; the description adds real semantic value by clarifying that anchors_opened means anchors you ended up opening anyway rather than a token estimate, and by explaining the intent of answered. event_id and workspace are left entirely to the schema, so it is not a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — report what you did with the last amem context packet — and frames the outcome (its savings estimate becomes a measurement). That framing alone distinguishes it from retrieval siblings like amem_context or amem_stats, which produce the packet or aggregate numbers rather than attest usage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Timing is explicit: "Call this once after you have finished acting on a packet," and there is a clear prohibition ("Do NOT estimate tokens"). It also pre-empts a likely withholding behavior by saying reporting that you opened everything is expected. It does not name a sibling alternative or say when not to call it at all (e.g., if no packet was ever issued), which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
16 tool updates
v0.4.2- First observed
amem_context - First observed
amem_graph - First observed
amem_recipe - First observed
amem_remember - First observed
amem_repos - First observed
amem_skill_list - First observed
amem_skill_save - First observed
amem_skill_view - First observed
amem_stats - First observed
amem_status - First observed
amem_supersede - First observed
amem_task_add - First observed
amem_task_complete - First observed
amem_task_list - First observed
amem_task_update - First observed
amem_usage_report
TDQS
Scored across 16 tools
Most tools target distinct actions or resources: memory retrieval, remembering, superseding, skills, tasks, and usage reporting are clearly separated. A few boundaries are softer, especially amem_context vs amem_graph vs amem_status and amem_stats vs amem_usage_report, but the descriptions largely clarify intended use.
All tools share the amem_ prefix and snake_case, which helps. However, naming conventions are mixed: some use resource_action (amem_skill_view, amem_task_add), some are bare verbs (amem_remember, amem_supersede), and others are nouns or noun phrases (amem_context, amem_repos, amem_usage_report).
At 16 tools, the set is slightly heavy but still within a reasonable range for a memory server with skills, tasks, inventory, and usage reporting. Each tool appears to have a real role, though some consolidation could make the surface lighter.
Core lifecycle operations are present: memory read/write/retire, skill list/view/save, task list/add/update/complete, and usage/stats reporting. Minor gaps exist around explicit deletion or unmonitoring, and skills/tasks lack full delete/update coverage, but most workflows are supported.
Maintenance
Related MCP Connectors
Shared memory for coding agents. Stop re-explaining your codebase every session.
Private memory for AI agents: save and recall facts across Claude Code, Codex, Cursor and ChatGPT.
Private, portable memory and reusable skills for AI agents.
Persistent memory for AI agents, for code, research and everyday life. Stale facts retire.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceGives AI coding agents persistent memory by storing observations, decisions, and learnings in a local SQLite database with vector search, full-text search, and a rules engine.4MIT
- AlicenseAqualityAmaintenanceLocal-first memory for AI coding agents using SQLite, enabling persistent recall of decisions, lessons, and project context without cloud or API keys.10157 PyPI286Apache 2.0
- FlicenseNot gradedqualityAmaintenanceProvides a local-first persistent memory layer that lets AI coding agents store, recall, and semantically search project-specific and cross-project knowledge across sessions, so context, decisions, and guidelines survive between conversations. Runs entirely on the user's machine with SQLite and no API keys, and optionally supports autonomous task-queue execution built on the same memory.-
- FlicenseNot gradedqualityAmaintenanceProvides a local-first, cross-session memory layer that lets AI coding agents store and semantically search per-project decisions, preferences, error patterns, and research alongside global guidelines. Also supports an optional task queue for autonomous execution, all backed by on-disk SQLite with no API keys or external calls.-