Skip to main content
Glama

amem

npm version npm downloads CI License: MIT Node 20+ MCP server Local only

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

amem dashboard: Home, Memory and Tasks

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 AGENTS.md that goes stale

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

~/.amem/graph.db (or .enc when locked)

No

Cursor project rule

.cursor/rules/amem.mdc in the product repo

Safe to commit — guidance only, no memory contents

Exports / backups you create

Wherever you write them

Keep private — do not commit

Guarantees:

  • ~/.amem is created with mode 0700

  • Local UI binds to 127.0.0.1 only

  • Memory 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 setup

From a clone while developing:

git clone https://github.com/sslugic/amem.git
cd amem
npm install
npm link
amem setup

See 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/amem

Memory 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 --personal

Encrypt-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 unschedule

While 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 --attest

The 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 one

One canonical text (src/instructions.ts) renders per host, so guidance cannot drift between clients:

File

Clients

.cursor/rules/amem.mdc

Cursor

CLAUDE.md

Claude Code

AGENTS.md

Codex, Grok, OpenCode, Crush, Amp, Qwen, Droid, OpenHands, Warp, Zed, Cody, Antigravity, Neovim, Claude Desktop, Devin, Jules

GEMINI.md

Gemini CLI

.github/copilot-instructions.md

GitHub Copilot

.windsurf/rules/amem.md · .continue/rules/amem.md · .clinerules/amem.md · .roo/rules/amem.md · .kilocode/rules/amem.md · .augment/rules/amem.md · .kiro/steering/amem.md · .trae/rules/amem.md · .amazonq/rules/amem.md

Windsurf, Continue, Cline, Roo, Kilo, Augment, Kiro, Trae, Amazon Q

.junie/guidelines.md · .goosehints · .aider.amem.md

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 installed

Each 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_tokens

Nothing 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 events

amem ui

That 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 app

amem 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 uninstall

Tabs after setup:

  1. Setup — scan/select repos, platforms, login auto-start, bootstrap proposal

  2. Memory — facts by file, scored drafts (approve / replace older / dismiss / reject noisy), edit/pin/delete, search, recent hits/misses

  3. 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 in amem_context. Use Memory for durable facts; Tasks for “do later.”

  4. 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-open

To 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 status

To 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 memory

  • amem-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.json

4. 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 (component.api)

Flow

How work moves (flow.checkout)

Claim

A durable fact with file anchors (may be active or superseded; optional pin)

Edge

Links (claim → flow → component); kind: "supersedes" archives the target claim

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 SKILL.md file (see below)

Usage event

Each amem context hit + token estimate

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), freshness

  • Optional 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.md

Progressive 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

skills_enabled

true

Master switch for storage, ranking, and injection

skill_write_approval

false

Stage agent writes for review instead of writing to disk

skill_capture

true

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 12000

LLM 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 automatically

Attach 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 retrieve

After 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-app

Same 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-ai

MCP tools (stdio or HTTP):

Tool

When to use

amem_context

Ranked memory packet for the current question

amem_remember

Store a durable fact after an outcome

amem_recipe

Generic read-then-write contract (any MCP host)

amem_skill_list

Cheap index of stored procedures (names + descriptions only)

amem_skill_view

Load one skill body, after the index says it applies

amem_skill_save

Store a multi-step procedure you just worked out

amem_repos

What is monitored (git repos + named workspaces)

amem_stats

Lookup time, estimated tokens/ms saved, hit rate

amem_graph

Claims / components / flows stored for a workspace or repo

amem_status

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|status

Command

Purpose

setup

One-shot personal workspace + optional host install

init

Bind a git repo, named workspace, personal prefs, or host

rename

Change a workspace display name; MCP slug and memory stay bound

context

Retrieve a Markdown packet; log usage

remember

Store one local fact

mcp

Stdio MCP tools; HTTP MCP at http://127.0.0.1:7843/mcp while UI runs

skills

Manage procedural memory (list, show, new, import, drafts, approve)

propose diff

Preview claim/component/flow changes before apply

propose apply

Upsert structured memory locally

lock / unlock

Optional AES-256-GCM encrypt-at-rest for graph.db

backup

Local snapshot (optionally encrypted); schedule for daily timer

ui

Setup wizard + Memory + Stats in the browser (localhost)

app

Same UI in an Electron window (npm run app:setup once)

service

Login item so amem ui starts after reboot

doctor --attest

Privacy/policy attestation for IT tickets

export / wipe

Personal backup or delete (still local)

wipe --all --yes

Offboard: wipe every repo and remove ~/.amem


What install puts where

Cursor

Artifact

Path

Skills

~/.cursor/skills/amem-*

Project rule

.cursor/rules/amem.mdc (in the product repo)

Hooks

~/.cursor/hooks.json

Reload Cursor if skills/rules do not appear immediately.

Claude Code

Artifact

Path

Skills

~/.claude/skills/amem-*

Hooks

~/.claude/settings.json (SessionStart / UserPromptSubmit / Stop / related → full amem hook)

Other hosts

Host

What amem writes

Windsurf

~/.codeium/windsurf/mcp_config.json MCP entry

Continue

~/.continue/config.json MCP servers

Aider

.aider.amem.md CLI hints in the repo

Zed

settings.json context_servers / HTTP hint

Claude Desktop

claude_desktop_config.json stdio MCP entry

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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 = []).

  5. 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?

  1. 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.

  2. Hybrid Retrieval & Strict Limits: Rather than dumping the graph, amem_context uses 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).

  3. Hard Character Caps: Automatic hook injections are hard-capped at 2,400 characters to prevent prompt bloat and token exhaustion attacks.

  4. 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 ~/.amem with 0700 local 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 link

Layout:

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 helper

Override the memory home for tests:

AMEM_HOME=/tmp/amem-test amem status

Enterprise 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

/etc/amem/policy.toml (system) overrides ~/.amem/policy.toml; or AMEM_POLICY_PATH

Attestation

amem doctor --attest / --json (also GET /api/attest on local UI)

Secret hygiene

Builtin deny patterns + policy deny_claim_patterns on propose

Export lock

allow_export = false

Platform / repo allowlists

allowed_platforms, allowed_remote_hosts

Auto-apply drafts

auto_apply_kinds (empty = never; still local)

Offboarding

amem wipe --all --yes or scripts/mdm-offboard.sh

Hard guarantees (not configurable away):

  • No memory telemetry or claim upload — ~/.amem stays local

  • Optional anonymous npm install ping only (opt out: AMEM_TELEMETRY_DISABLED=1)

  • UI binds to loopback only (127.0.0.1)

  • Memory stays under ~/.amem (mode 0700)

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.sh

Example 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 tools
amem_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.

NameRequiredDescriptionDefault
queryYes
platformNo
sessionIdNo
workspaceNoNamed workspace (not a git repo)

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
daysNoActivity lookback (default 30)
workspaceNo

TDQS

A4.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
kindNo
textYes
anchorsNo
workspaceNo
supersedesNoClaim ids this fact replaces

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
kindNoall (default), git, or workspace

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
queryNoOptional: rank the index against this task description

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
nameYesShort slug, e.g. deploy-staging
contentNoFull SKILL.md, or the markdown body to wrap
sessionIdNoOptional conversation id, so amem can clear the nudge that prompted this
descriptionNoOne line on when to use this skill

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
fileNoOptional supporting file, e.g. references/api.md
nameYesSkill name from amem_skill_list
sessionIdNoOptional conversation id, so amem can tell whether this procedure actually worked out

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
daysNoLookback window (default 30)
scopeNoall (every tracked repo/workspace) or current (the given workspace / cwd)
workspaceNo

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
workspaceNo

TDQS

A4.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
byNoClaim id of the newer fact (optional)
idsYes
workspaceNo

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
bodyNoWhy / notes
titleYes
statusNobacklog | next | doing | blocked | done
anchorsNo
workspaceNo

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
idYes
workspaceNo

TDQS

C2.6/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
statusNobacklog | next | doing | blocked | done
workspaceNo
include_doneNo

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

NameRequiredDescriptionDefault
idYes
bodyNo
titleNo
statusNo
anchorsNo
workspaceNo

TDQS

B3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
answeredYesTrue if the packet answered the question without broad exploration. False if you had to grep or read widely anyway.
event_idNoSpecific usage event. Omit to attest the most recent packet for this repo.
workspaceNo
anchors_openedYesFile 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

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 16 tool updatesv0.4.2
    • First observedamem_context
    • First observedamem_graph
    • First observedamem_recipe
    • First observedamem_remember
    • First observedamem_repos
    • First observedamem_skill_list
    • First observedamem_skill_save
    • First observedamem_skill_view
    • First observedamem_stats
    • First observedamem_status
    • First observedamem_supersede
    • First observedamem_task_add
    • First observedamem_task_complete
    • First observedamem_task_list
    • First observedamem_task_update
    • First observedamem_usage_report

TDQS

A3.5/5.0

Scored across 16 tools

Disambiguation4/5

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.

Naming Consistency3/5

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).

Tool Count4/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Gives 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.
    4
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    Provides 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.
    -
  • F
    license
    Not graded
    quality
    A
    maintenance
    Provides 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.
    -