* fix: stop burning Claude Pro tokens on every tool call (#143) 0.8.8 fixed the agentmemory-side Claude API burn (where the engine called Claude via the user's ANTHROPIC_API_KEY for per-observation compression). That addressed #138 for users with API keys, but it missed the second and much larger token-burn path: the PreToolUse hook writing context to stdout. Claude Code reads PreToolUse stdout and prepends it to the model's next turn. src/hooks/pre-tool-use.ts was POSTing /agentmemory/enrich on every Edit/Write/Read/Glob/Grep tool call and piping up to 4000 chars of response context into stdout. At ~20 tool calls per user message this silently injected ~20K tokens per message into Claude Code's input window — all charged against the user's Claude Pro allocation because Claude Code was the one sending them to Anthropic. 4 messages drained the cap, which matches @adrianricardo's report. session-start.ts had the same pattern (injected once per session, smaller blast radius). Fix: gate both hooks on AGENTMEMORY_INJECT_CONTEXT, default false. - pre-tool-use.ts: when disabled, exit immediately — no stdin read, no fetch, no stdout write. The hot path (~20x per message) becomes a no-op Node startup. - session-start.ts: when disabled, still POST /agentmemory/session/start so the session gets registered for observation tracking, but never write context to stdout. The session registration is cheap and doesn't touch Claude Code's input window. - src/config.ts: new isContextInjectionEnabled() helper. - src/index.ts: startup banner prints 'Context injection: OFF (default, #143)' on normal startup and a loud WARNING when opt-in is enabled. - test/context-injection.test.ts: 5 subprocess tests that spawn the compiled pre-tool-use.mjs and session-start.mjs hooks, feed real JSON payloads via stdin, and assert stdout is empty in all the off/default paths. Also asserts the disabled path exits under 1s and the opt-in path with an unreachable backend still exits cleanly. - README .env section: new AGENTMEMORY_INJECT_CONTEXT entry. - CHANGELOG [0.8.10] with prominent 'Behavior change' banner. Observations are still captured via PostToolUse regardless of the flag — the memory store and MCP search tools are completely unaffected by this change. The fix only severs the path where agentmemory silently shoves memory context into the user's Claude Code conversation. Bumps to 0.8.10 (main + @agentmemory/mcp shim). Test count: 724 passing (was 719 + 5 new). * chore: rewrite #143 CHANGELOG entry with corrected diagnosis PreToolUse stdout is NOT injected into the model context — per the Claude Code hook docs, only UserPromptSubmit and SessionStart stdout are injected. My initial #143 PR description and CHANGELOG claimed PreToolUse was the smoking gun behind 'Pro allocation burned in 4 messages', which is wrong. What's actually true: - SessionStart stdout injection IS real (~1-2K tokens per session) - PreToolUse stdout goes to debug log only — no tokens - Claude Pro's Claude Code quotas are tight by design (Anthropic has publicly acknowledged this); 4 messages to burn is plausible with or without agentmemory installed The gate on pre-tool-use.ts is still worth keeping as a resource cleanup (skips a 20x-per-message Node+HTTP hot path) and as forward-compat protection in case Claude Code ever changes PreToolUse hook contract. But the CHANGELOG entry has to stop claiming it saves tokens when it doesn't. * fix: mem::retention-evict no longer leaks semantic memories (#124) The eviction loop was unconditionally calling kv.delete(KV.memories, id) for every below-threshold candidate, but retention scores are computed for both episodic (KV.memories) and semantic (KV.semantic) memories. When a candidate came from KV.semantic, the delete silently became a no-op (key wasn't in mem:memories to begin with) and the semantic row stayed alive forever with a sub-threshold score. Semantic memories could not be evicted by this path at all. Fix: - Add a source: "episodic" | "semantic" discriminator to RetentionScore - Tag it at score creation in both loops of mem::retention-score - Branch the delete in mem::retention-evict on candidate.source, routing to KV.memories or KV.semantic accordingly - Pre-0.8.10 retention rows with no source field are treated as episodic for backwards-compat so upgraded stores continue to evict their old rows without re-scoring first - Response now includes evictedEpisodic and evictedSemantic counts so callers can see what was removed from each scope Adds 3 regression tests to test/retention.test.ts: - Scoring tags rows with the correct source - Evicting a mixed set of below-threshold episodic + semantic candidates removes both from their respective scopes - Legacy-shape score rows with no source field still evict to mem:memories (backwards-compat) Full suite: 727 passing (was 724 + 3 new). * review: probe namespaces for legacy retention rows (#124, round 2) CodeRabbit caught a real backwards-compat hole in the #124 fix: pre-0.8.10 stores already contain semantic retention rows with no source field (because the old mem::retention-score scored KV.semantic before the discriminator existed). My first fix defaulted missing source to episodic, which meant those legacy semantic rows still got delete-routed to KV.memories — the exact no-op that stranded them in the first place. Fix: when candidate.source is undefined, probe KV.memories first for the memoryId; if it's there, route to episodic, otherwise route to semantic. Count the resolved source in the response. Adds one new test case: a pre-0.8.10 semantic memory with a legacy-shape retention row (no source field) gets evicted from mem:semantic, not silently no-op'd. Existing 'defaults to episodic' test is kept and retargeted to the genuinely-episodic legacy case. Also fixes a README nit: the AGENTMEMORY_INJECT_CONTEXT comment previously implied SessionStart fires on every tool turn. It's once per session. Now broken out into two bullets explaining what each hook does differently, with the note that only SessionStart actually reaches the model (PreToolUse stdout is debug-log only per Claude Code docs). Full suite: 728 passing (was 727 + 1 new). * review: audit retention evictions + assert persisted source (#124 round 3) CodeRabbit round 3 findings, both real: 1. retention-evict performs structural deletes (memories / semantic / retention scores / access logs) but was not calling recordAudit(). Repo learnings say state-changing functions must be auditable except for read-path bookkeeping. Now emits one batched audit row per non-zero eviction sweep: operation: 'delete' functionId: 'mem::retention-evict' targetIds: every evicted memoryId details: { threshold, evicted, evictedEpisodic, evictedSemantic, reason: 'retention score below threshold' } Zero-eviction sweeps intentionally do NOT write an audit row (no state change, no need to flood the audit log during health checks). 2. The #124 scoring test only checked result.scores (transient response) but not the persisted mem:retention rows. Eviction reads back from stored rows, so a regression in kv.set/serialization would have still passed the old assertion. Now also does kv.get('mem:retention', id) and asserts { source: ... }. Two new tests: - Retention evict with a mixed set of 2 episodic + 1 semantic candidates writes exactly one audit row with all 3 ids in targetIds and the correct evictedEpisodic/Semantic breakdown in details. - Retention evict with zero candidates writes zero audit rows. Full suite: 730 passing (was 728 + 2 new). * review: audit retention-score + parallelize writes (#124 round 4) CodeRabbit round 3 outside-diff findings, both addressed: 1. mem::retention-score was persisting schema-relevant writes to KV.retentionScores (1000+ rows in a mature store) but never called recordAudit(). Per the repo audit-coverage policy, state-changing functions need an audit row. Added a single batched audit event per rescore: operation: 'retention_score' (new audit op — added to the AuditEntry union in types.ts) functionId: 'mem::retention-score' targetIds: [] (intentionally empty — a mature store can have 1000+ ids per sweep; flooding the audit log with every memoryId on every cron tick is worse than recording just the summary counts) details: { total, episodic, semantic, tiers, config } Zero-memory stores intentionally skip the audit call. 2. The per-memory kv.set inside the score loop was O(n) sequential round-trips. Refactored to collect pendingWrites: [id, entry][] while iterating, then flush with Promise.all at the end. On a mature store with 1000+ memories this is ~10x faster (depends on backend pipelining). Test updates: - Added 'mem::retention-score emits audit row per rescore' covering the new audit call, targetIds=[], and details.episodic/semantic. - Existing '#124 audit evict' and 'zero-evict skip audit' tests now filter the audit log by functionId === 'mem::retention-evict' because retention-score also writes one row per sweep now. Full suite: 731 passing (was 730 + 1 new, existing tests retargeted).
35 KiB
Your coding agent remembers everything. No more re-explaining.
Persistent memory for Claude Code, Cursor, Gemini CLI, OpenCode, and any MCP client.
The gist extends Karpathy's LLM Wiki pattern with confidence scoring, lifecycle, knowledge graphs, and hybrid search.
agentmemory is the implementation.
Quick Start • Benchmarks • vs Competitors • Agents • How It Works • MCP • Viewer • Config • API
agentmemory works with any agent that supports hooks, MCP, or REST API. All agents share the same memory server.
|
Claude Code 12 hooks + MCP + skills |
OpenClaw MCP + plugin |
Hermes MCP + plugin |
Cursor MCP server |
Gemini CLI MCP server |
OpenCode MCP server |
Codex CLI MCP server |
Cline MCP server |
|
Goose MCP server |
Kilo Code MCP server |
Aider REST API |
Claude Desktop MCP server |
Windsurf MCP server |
Roo Code MCP server |
Claude SDK AgentSDKProvider |
Any agent REST API |
Works with any agent that speaks MCP or HTTP. One server, memories shared across all of them.
You explain the same architecture every session. You re-discover the same bugs. You re-teach the same preferences. Built-in memory (CLAUDE.md, .cursorrules) caps out at 200 lines and goes stale. agentmemory fixes this. It silently captures what your agent does, compresses it into searchable memory, and injects the right context when the next session starts. One command. Works across agents.
What changes: Session 1 you set up JWT auth. Session 2 you ask for rate limiting. The agent already knows your auth uses jose middleware in src/middleware/auth.ts, your tests cover token validation, and you chose jose over jsonwebtoken for Edge compatibility. No re-explaining. No copy-pasting. The agent just knows.
npx @agentmemory/agentmemory
New in v0.8.2 — Security hardening (default localhost, viewer CSP nonces, mesh auth),
agentmemory democommand, benchmark comparison vs mem0/Letta/Khoj, OpenClaw gateway plugin, real-time token savings in CLI + viewer.
Retrieval AccuracyLongMemEval-S (ICLR 2025, 500 questions)
|
Token Savings
|
Embedding model:
all-MiniLM-L6-v2(local, free, no API key). Full reports:benchmark/LONGMEMEVAL.md,benchmark/QUALITY.md,benchmark/SCALE.md. Competitor comparison:benchmark/COMPARISON.md— agentmemory vs mem0, Letta, Khoj, claude-mem, Hippo.
| agentmemory | mem0 (53K ⭐) | Letta / MemGPT (22K ⭐) | Built-in (CLAUDE.md) | |
|---|---|---|---|---|
| Type | Memory engine + MCP server | Memory layer API | Full agent runtime | Static file |
| Retrieval R@5 | 95.2% | 68.5% (LoCoMo) | 83.2% (LoCoMo) | N/A (grep) |
| Auto-capture | 12 hooks (zero manual effort) | Manual add() calls |
Agent self-edits | Manual editing |
| Search | BM25 + Vector + Graph (RRF fusion) | Vector + Graph | Vector (archival) | Loads everything into context |
| Multi-agent | MCP + REST + leases + signals | API (no coordination) | Within Letta runtime only | Per-agent files |
| Framework lock-in | None (any MCP client) | None | High (must use Letta) | Per-agent format |
| External deps | None (SQLite + iii-engine) | Qdrant / pgvector | Postgres + vector DB | None |
| Memory lifecycle | 4-tier consolidation + decay + auto-forget | Passive extraction | Agent-managed | Manual pruning |
| Token efficiency | ~1,900 tokens/session ($10/yr) | Varies by integration | Core memory in context | 22K+ tokens at 240 obs |
| Real-time viewer | Yes (port 3113) | Cloud dashboard | Cloud dashboard | No |
| Self-hosted | Yes (default) | Optional | Optional | Yes |
Try it in 30 seconds
# Terminal 1: start the server
npx @agentmemory/agentmemory
# Terminal 2: seed sample data and see recall in action
npx @agentmemory/agentmemory demo
demo seeds 3 realistic sessions (JWT auth, N+1 query fix, rate limiting) and runs semantic searches against them. You'll see it find "N+1 query fix" when you search "database performance optimization" — keyword matching can't do that.
Open http://localhost:3113 to watch the memory build live.
Claude Code (one block, paste it)
Install agentmemory: run `npx @agentmemory/agentmemory` in a separate terminal to start the memory server. Then run `/plugin marketplace add rohitg00/agentmemory` and `/plugin install agentmemory` — the plugin registers all 12 hooks, 4 skills, AND auto-wires the `@agentmemory/mcp` stdio server via its `.mcp.json`, so you get 43 MCP tools (memory_smart_search, memory_save, memory_sessions, memory_governance_delete, etc.) without any extra config step. Verify with `curl http://localhost:3111/agentmemory/health`. The real-time viewer is at http://localhost:3113.
OpenClaw (paste this prompt)
Install agentmemory for OpenClaw. Run `npx @agentmemory/agentmemory` in a separate terminal to start the memory server on localhost:3111. Then add this to my OpenClaw MCP config so agentmemory is available with all 43 memory tools:
{
"mcpServers": {
"agentmemory": {
"command": "npx",
"args": ["-y", "@agentmemory/mcp"]
}
}
}
Restart OpenClaw. Verify with `curl http://localhost:3111/agentmemory/health`. Open http://localhost:3113 for the real-time viewer. For deeper 4-hook gateway integration, see integrations/openclaw in the agentmemory repo.
Full guide: integrations/openclaw/
Hermes Agent (paste this prompt)
Install agentmemory for Hermes. Run `npx @agentmemory/agentmemory` in a separate terminal to start the memory server on localhost:3111. Then add this to ~/.hermes/config.yaml so Hermes can use agentmemory as an MCP server with all 43 memory tools:
mcp_servers:
agentmemory:
command: npx
args: ["-y", "@agentmemory/mcp"]
Verify with `curl http://localhost:3111/agentmemory/health`. Open http://localhost:3113 for the real-time viewer. For deeper 6-hook memory provider integration (pre-LLM context injection, turn capture, MEMORY.md mirroring, system prompt block), copy integrations/hermes from the agentmemory repo to ~/.hermes/plugins/memory/agentmemory.
Full guide: integrations/hermes/
Other agents
Start the memory server: npx @agentmemory/agentmemory
Then add the MCP config for your agent:
| Agent | Setup |
|---|---|
| Cursor | Add to ~/.cursor/mcp.json: {"mcpServers": {"agentmemory": {"command": "npx", "args": ["-y", "@agentmemory/mcp"]}}} |
| OpenClaw | Add to MCP config: {"mcpServers": {"agentmemory": {"command": "npx", "args": ["-y", "@agentmemory/mcp"]}}} or use the gateway plugin |
| Gemini CLI | gemini mcp add agentmemory -- npx -y @agentmemory/mcp |
| Codex CLI | Add to .codex/config.yaml: mcp_servers: {agentmemory: {command: npx, args: ["-y", "@agentmemory/mcp"]}} |
| OpenCode | Add to opencode.json: {"mcp": {"agentmemory": {"type": "local", "command": ["npx", "-y", "@agentmemory/mcp"], "enabled": true}}} |
| Hermes Agent | Add to ~/.hermes/config.yaml or use the memory provider plugin |
| Cline / Goose / Kilo Code | Add MCP server in settings |
| Claude Desktop | Add to claude_desktop_config.json: {"mcpServers": {"agentmemory": {"command": "npx", "args": ["-y", "@agentmemory/mcp"]}}} |
| Aider | REST API: curl -X POST http://localhost:3111/agentmemory/smart-search -d '{"query": "auth"}' |
| Any agent (32+) | npx skillkit install agentmemory |
From source
git clone https://github.com/rohitg00/agentmemory.git && cd agentmemory
npm install && npm run build && npm start
This starts agentmemory with a local iii-engine if iii is already installed, or falls back to Docker Compose if Docker is available. REST, streams, and the viewer bind to 127.0.0.1 by default.
Install iii-engine manually:
- macOS / Linux:
curl -fsSL https://install.iii.dev/iii/main/install.sh | sh - Windows: download
iii-x86_64-pc-windows-msvc.zipfrom iii-hq/iii releases, extractiii.exe, add to PATH
Or use Docker (the bundled docker-compose.yml pulls iiidev/iii:latest). Full docs: iii.dev/docs.
Windows
agentmemory runs on Windows 10/11, but the Node.js package alone isn't enough — you also need the iii-engine runtime (a separate native binary) as a background process. The official upstream installer is a sh script and there is no PowerShell installer or scoop/winget package today, so Windows users have two paths:
Option A — Prebuilt Windows binary (recommended):
# 1. Open https://github.com/iii-hq/iii/releases/latest in your browser
# 2. Download iii-x86_64-pc-windows-msvc.zip
# (or iii-aarch64-pc-windows-msvc.zip if you're on an ARM machine)
# 3. Extract iii.exe somewhere on PATH, or place it at:
# %USERPROFILE%\.local\bin\iii.exe
# (agentmemory checks that location automatically)
# 4. Verify:
iii --version
# 5. Then run agentmemory as usual:
npx -y @agentmemory/agentmemory
Option B — Docker Desktop:
# 1. Install Docker Desktop for Windows
# 2. Start Docker Desktop and make sure the engine is running
# 3. Run agentmemory — it will auto-start the bundled compose file:
npx -y @agentmemory/agentmemory
Option C — standalone MCP only (no engine): if you only need the MCP tools for your agent and don't need the REST API, viewer, or cron jobs, skip the engine entirely:
npx -y @agentmemory/agentmemory mcp
# or via the shim package:
npx -y @agentmemory/mcp
Diagnostics for Windows: if npx @agentmemory/agentmemory fails, re-run with --verbose to see the actual engine stderr. Common failure modes:
| Symptom | Fix |
|---|---|
iii-engine process started then did not become ready within 15s |
Engine crashed on startup — re-run with --verbose, check stderr |
Could not start iii-engine |
Neither iii.exe nor Docker is installed. See Option A or B above |
| Port conflict | netstat -ano | findstr :3111 to see what's bound, then kill it or use --port <N> |
| Docker fallback skipped even though Docker is installed | Make sure Docker Desktop is actually running (system tray icon) |
Note: there is no
cargo install iii-engine—iiiis not published to crates.io. The only supported install methods are the prebuilt binary above, the upstreamshinstall script (macOS/Linux only), and the Docker image.
Every coding agent forgets everything when the session ends. You waste the first 5 minutes of every session re-explaining your stack. agentmemory runs in the background and eliminates that entirely.
Session 1: "Add auth to the API"
Agent writes code, runs tests, fixes bugs
agentmemory silently captures every tool use
Session ends -> observations compressed into structured memory
Session 2: "Now add rate limiting"
Agent already knows:
- Auth uses JWT middleware in src/middleware/auth.ts
- Tests in test/auth.test.ts cover token validation
- You chose jose over jsonwebtoken for Edge compatibility
Zero re-explaining. Starts working immediately.
vs built-in agent memory
Every AI coding agent ships with built-in memory — Claude Code has MEMORY.md, Cursor has notepads, Cline has memory bank. These work like sticky notes. agentmemory is the searchable database behind the sticky notes.
| Built-in (CLAUDE.md) | agentmemory | |
|---|---|---|
| Scale | 200-line cap | Unlimited |
| Search | Loads everything into context | BM25 + vector + graph (top-K only) |
| Token cost | 22K+ at 240 observations | ~1,900 tokens (92% less) |
| Cross-agent | Per-agent files | MCP + REST (any agent) |
| Coordination | None | Leases, signals, actions, routines |
| Observability | Read files manually | Real-time viewer on :3113 |
Memory Pipeline
PostToolUse hook fires
-> SHA-256 dedup (5min window)
-> Privacy filter (strip secrets, API keys)
-> Store raw observation
-> LLM compress -> structured facts + concepts + narrative
-> Vector embedding (6 providers + local)
-> Index in BM25 + vector + knowledge graph
SessionStart hook fires
-> Load project profile (top concepts, files, patterns)
-> Hybrid search (BM25 + vector + graph)
-> Token budget (default: 2000 tokens)
-> Inject into conversation
4-Tier Memory Consolidation
Inspired by how human brains process memory — not unlike sleep consolidation.
| Tier | What | Analogy |
|---|---|---|
| Working | Raw observations from tool use | Short-term memory |
| Episodic | Compressed session summaries | "What happened" |
| Semantic | Extracted facts and patterns | "What I know" |
| Procedural | Workflows and decision patterns | "How to do it" |
Memories decay over time (Ebbinghaus curve). Frequently accessed memories strengthen. Stale memories auto-evict. Contradictions are detected and resolved.
What Gets Captured
| Hook | Captures |
|---|---|
SessionStart |
Project path, session ID |
UserPromptSubmit |
User prompts (privacy-filtered) |
PreToolUse |
File access patterns + enriched context |
PostToolUse |
Tool name, input, output |
PostToolUseFailure |
Error context |
PreCompact |
Re-injects memory before compaction |
SubagentStart/Stop |
Sub-agent lifecycle |
Stop |
End-of-session summary |
SessionEnd |
Session complete marker |
Key Capabilities
| Capability | Description |
|---|---|
| Automatic capture | Every tool use recorded via hooks — zero manual effort |
| Semantic search | BM25 + vector + knowledge graph with RRF fusion |
| Memory evolution | Versioning, supersession, relationship graphs |
| Auto-forgetting | TTL expiry, contradiction detection, importance eviction |
| Privacy first | API keys, secrets, <private> tags stripped before storage |
| Self-healing | Circuit breaker, provider fallback chain, health monitoring |
| Claude bridge | Bi-directional sync with MEMORY.md |
| Knowledge graph | Entity extraction + BFS traversal |
| Team memory | Namespaced shared + private across team members |
| Citation provenance | Trace any memory back to source observations |
| Git snapshots | Version, rollback, and diff memory state |
Triple-stream retrieval combining three signals:
| Stream | What it does | When |
|---|---|---|
| BM25 | Stemmed keyword matching with synonym expansion | Always on |
| Vector | Cosine similarity over dense embeddings | Embedding provider configured |
| Graph | Knowledge graph traversal via entity matching | Entities detected in query |
Fused with Reciprocal Rank Fusion (RRF, k=60) and session-diversified (max 3 results per session).
Embedding providers
agentmemory auto-detects your provider. For best results, install local embeddings (free):
npm install @xenova/transformers
| Provider | Model | Cost | Notes |
|---|---|---|---|
| Local (recommended) | all-MiniLM-L6-v2 |
Free | Offline, +8pp recall over BM25-only |
| Gemini | text-embedding-004 |
Free tier | 1500 RPM |
| OpenAI | text-embedding-3-small |
$0.02/1M | Highest quality |
| Voyage AI | voyage-code-3 |
Paid | Optimized for code |
| Cohere | embed-english-v3.0 |
Free trial | General purpose |
| OpenRouter | Any model | Varies | Multi-model proxy |
43 tools, 6 resources, 3 prompts, and 4 skills — the most comprehensive MCP memory toolkit for any agent.
43 Tools
Core tools (always available)
| Tool | Description |
|---|---|
memory_recall |
Search past observations |
memory_save |
Save an insight, decision, or pattern |
memory_smart_search |
Hybrid semantic + keyword search |
memory_file_history |
Past observations about specific files |
memory_sessions |
List recent sessions |
memory_profile |
Project profile (concepts, files, patterns) |
memory_export |
Export all memory data |
Extended tools (43 total — set AGENTMEMORY_TOOLS=all)
| Tool | Description |
|---|---|
memory_patterns |
Detect recurring patterns |
memory_timeline |
Chronological observations |
memory_relations |
Query relationship graph |
memory_graph_query |
Knowledge graph traversal |
memory_consolidate |
Run 4-tier consolidation |
memory_claude_bridge_sync |
Sync with MEMORY.md |
memory_team_share |
Share with team members |
memory_team_feed |
Recent shared items |
memory_audit |
Audit trail of operations |
memory_governance_delete |
Delete with audit trail |
memory_snapshot_create |
Git-versioned snapshot |
memory_action_create |
Create work items with dependencies |
memory_action_update |
Update action status |
memory_frontier |
Unblocked actions ranked by priority |
memory_next |
Single most important next action |
memory_lease |
Exclusive action leases (multi-agent) |
memory_routine_run |
Instantiate workflow routines |
memory_signal_send |
Inter-agent messaging |
memory_signal_read |
Read messages with receipts |
memory_checkpoint |
External condition gates |
memory_mesh_sync |
P2P sync between instances |
memory_sentinel_create |
Event-driven watchers |
memory_sentinel_trigger |
Fire sentinels externally |
memory_sketch_create |
Ephemeral action graphs |
memory_sketch_promote |
Promote to permanent |
memory_crystallize |
Compact action chains |
memory_diagnose |
Health checks |
memory_heal |
Auto-fix stuck state |
memory_facet_tag |
Dimension:value tags |
memory_facet_query |
Query by facet tags |
memory_verify |
Trace provenance |
6 Resources · 3 Prompts · 4 Skills
| Type | Name | Description |
|---|---|---|
| Resource | agentmemory://status |
Health, session count, memory count |
| Resource | agentmemory://project/{name}/profile |
Per-project intelligence |
| Resource | agentmemory://memories/latest |
Latest 10 active memories |
| Resource | agentmemory://graph/stats |
Knowledge graph statistics |
| Prompt | recall_context |
Search + return context messages |
| Prompt | session_handoff |
Handoff data between agents |
| Prompt | detect_patterns |
Analyze recurring patterns |
| Skill | /recall |
Search memory |
| Skill | /remember |
Save to long-term memory |
| Skill | /session-history |
Recent session summaries |
| Skill | /forget |
Delete observations/sessions |
Standalone MCP
Run without the full server — for any MCP client. Either of these works:
npx -y @agentmemory/agentmemory mcp # canonical (always available)
npx -y @agentmemory/mcp # shim package alias
Or add to your agent's MCP config:
Most agents (Cursor, Claude Desktop, Cline, etc.):
{
"mcpServers": {
"agentmemory": {
"command": "npx",
"args": ["-y", "@agentmemory/mcp"]
}
}
}
OpenCode (opencode.json):
{
"mcp": {
"agentmemory": {
"type": "local",
"command": ["npx", "-y", "@agentmemory/mcp"],
"enabled": true
}
}
}
Auto-starts on port 3113. Live observation stream, session explorer, memory browser, knowledge graph visualization, and health dashboard.
open http://localhost:3113
The viewer server binds to 127.0.0.1 by default. The REST-served /agentmemory/viewer endpoint follows the normal AGENTMEMORY_SECRET bearer-token rules. CSP headers use a per-response script nonce and disable inline handler attributes (script-src-attr 'none').
LLM Providers
agentmemory auto-detects from your environment. No API key needed if you have a Claude subscription.
| Provider | Config | Notes |
|---|---|---|
| Claude subscription (default) | No config needed | Uses @anthropic-ai/claude-agent-sdk |
| Anthropic API | ANTHROPIC_API_KEY |
Per-token billing |
| MiniMax | MINIMAX_API_KEY |
Anthropic-compatible |
| Gemini | GEMINI_API_KEY |
Also enables embeddings |
| OpenRouter | OPENROUTER_API_KEY |
Any model |
Environment Variables
Create ~/.agentmemory/.env:
# LLM provider (pick one, or leave empty for Claude subscription)
# ANTHROPIC_API_KEY=sk-ant-...
# GEMINI_API_KEY=...
# OPENROUTER_API_KEY=...
# Embedding provider (auto-detected, or override)
# EMBEDDING_PROVIDER=local
# VOYAGE_API_KEY=...
# Search tuning
# BM25_WEIGHT=0.4
# VECTOR_WEIGHT=0.6
# TOKEN_BUDGET=2000
# Auth
# AGENTMEMORY_SECRET=your-secret
# Ports (defaults: 3111 API, 3113 viewer)
# III_REST_PORT=3111
# Features
# AGENTMEMORY_AUTO_COMPRESS=false # OFF by default (#138). When on,
# every PostToolUse hook calls your
# LLM provider to compress the
# observation — expect significant
# token spend on active sessions.
# AGENTMEMORY_INJECT_CONTEXT=false # OFF by default (#143). When on:
# - SessionStart may inject ~1-2K
# chars of project context into
# the first turn of each session
# (this is what actually reaches
# the model — Claude Code treats
# SessionStart stdout as context)
# - PreToolUse fires /agentmemory/enrich
# on every file-touching tool call
# (resource cleanup, not a token
# fix — PreToolUse stdout is debug
# log only per Claude Code docs)
# Observations are still captured via
# PostToolUse regardless of this flag.
# GRAPH_EXTRACTION_ENABLED=false
# CONSOLIDATION_ENABLED=true
# LESSON_DECAY_ENABLED=true
# OBSIDIAN_AUTO_EXPORT=false
# AGENTMEMORY_EXPORT_ROOT=~/.agentmemory
# CLAUDE_MEMORY_BRIDGE=false
# SNAPSHOT_ENABLED=false
# Team
# TEAM_ID=
# USER_ID=
# TEAM_MODE=private
# Tool visibility: "core" (7 tools) or "all" (43 tools)
# AGENTMEMORY_TOOLS=core
109 endpoints on port 3111. The REST API binds to 127.0.0.1 by default. Protected endpoints require Authorization: Bearer <secret> when AGENTMEMORY_SECRET is set, and mesh sync endpoints require AGENTMEMORY_SECRET on both peers.
Key endpoints
| Method | Path | Description |
|---|---|---|
GET |
/agentmemory/health |
Health check (always public) |
POST |
/agentmemory/session/start |
Start session + get context |
POST |
/agentmemory/session/end |
End session |
POST |
/agentmemory/observe |
Capture observation |
POST |
/agentmemory/smart-search |
Hybrid search |
POST |
/agentmemory/context |
Generate context |
POST |
/agentmemory/remember |
Save to long-term memory |
POST |
/agentmemory/forget |
Delete observations |
POST |
/agentmemory/enrich |
File context + memories + bugs |
GET |
/agentmemory/profile |
Project profile |
GET |
/agentmemory/export |
Export all data |
POST |
/agentmemory/import |
Import from JSON |
POST |
/agentmemory/graph/query |
Knowledge graph query |
POST |
/agentmemory/team/share |
Share with team |
GET |
/agentmemory/audit |
Audit trail |
Full endpoint list: src/triggers/api.ts
Built on iii-engine's three primitives — no Express, no Postgres, no Redis.
118 source files · ~21,800 LOC · 646 tests · 123 functions · 34 KV scopes
What iii-engine replaces
| Traditional stack | agentmemory uses |
|---|---|
| Express.js / Fastify | iii HTTP Triggers |
| SQLite / Postgres + pgvector | iii KV State + in-memory vector index |
| SSE / Socket.io | iii Streams (WebSocket) |
| pm2 / systemd | iii-engine worker management |
| Prometheus / Grafana | iii OTEL + health monitor |
npm run dev # Hot reload
npm run build # Production build
npm test # 646 tests (~1.7s)
npm run test:integration # API tests (requires running services)
Prerequisites: Node.js >= 20, iii-engine or Docker

