@verygoodplugins/mcp-automem
MCP server for AutoMem: AI memory storage and recall
npm · fingerprint 3231382823e2835a3f90e7dd · repository · RSS
6tools
2recorded versions
57dtracked
changed since 4 Sep
What changed
Changed between 4 September 2026 and 27 October 2026 (first seen 2026-10-27 12:28 UTC)
5 descriptions rewritten.
--- pinned/associate_memories +++ observed/associate_memories { "_meta": { "anthropic/alwaysLoad": true - "description": "Create typed relationships between memories. This builds a knowledge graph that improves recall by surfacing related context. Supports single-pair mode or batch mode with associations[] (max 500).\n\n**When to use:**\n- After storing a new memory: link it to related existing memories\n- When a bug fix relates to an original feature implementation\n- When a new decision updates or invalidates a previous one\n- To connect patterns with their concrete examples\n\n**Authorable relationship types:**\n- RELATES_TO: General relationship (default)\n- LEADS_TO: Causal relationship (A caused B)\n- OCCURRED_BEFORE: Temporal ordering\n- PREFERS_OVER: Chosen alternative\n- EXEMPLIFIES: Concrete example of a pattern\n- CONTRADICTS: Conflicts with another memory\n- REINFORCES: Strengthens another memory's validity\n- INVALIDATED_BY: Superseded by another memory\n- EVOLVED_INTO: Updated version of a concept\n- DERIVED_FROM: Implementation of a decision/pattern\n- PART_OF: Component of a larger effort\n\n**Read-only/internal relations:**\n- System/internal relations such as SIMILAR_TO, PRECEDED_BY, EXPLAINS, SHARES_THEME, PARALLEL_CONTEXT, and DISCOVERED may appear in recall results, but they are not valid inputs for associate_memories.\n\n**Examples:**\n- associate_memories({ memory1_id: \"bug-fix-123\", memory2_id: \"feature-456\", type: \"RELATES_TO\", strength: 0.9 })\n- associate_memories({ memory1_id: \"new-decision\", memory2_id: \"old-decision\", type: \"EVOLVED_INTO\", strength: 0.8 })\n- associate_memories({ associations: [{ memory1_id: \"a\", memory2_id: \"b\", type: \"RELATES_TO\", strength: 0.8 }] })", + "description": "Create typed relationships between memories. This builds a knowledge graph that improves recall by surfacing related context. Supports single-pair mode or batch mode with associations[] (max 500).\n\n**When to use:**\n- After storing a new memory: link it to related existing memories\n- When a bug fix relates to an original feature implementation\n- When a new decision updates or invalidates a previous one\n- To connect patterns with their concrete examples\n\n**Authorable relationship types:**\n- RELATES_TO: General relationship (default)\n- LEADS_TO: Causal relationship (A caused B)\n- OCCURRED_BEFORE: Temporal ordering\n- PREFERS_OVER: Chosen alternative\n- EXEMPLIFIES: Concrete example of a pattern\n- CONTRADICTS: Conflicts with another memory\n- REINFORCES: Strengthens another memory's validity\n- INVALIDATED_BY: Superseded by another memory\n- EVOLVED_INTO: Updated version of a concept\n- DERIVED_FROM: Implementation of a decision/pattern\n- PART_OF: Component of a larger effort\n\n**Read-only/internal relations:**\n- System/internal relations such as SIMILAR_TO, PRECEDED_BY, EXPLAINS, SHARES_THEME, PARALLEL_CONTEXT, and DISCOVERED may appear in recall results, but they are not valid inputs for associate_memories.\n\n**Examples:**\n- associate_memories({ memory1_id: \"8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91\", memory2_id: \"3c9e7b2a-1f4d-4a8e-9b6c-5d2e8f1a7c34\", type: \"RELATES_TO\", strength: 0.9 }) // bug fix → feature\n- associate_memories({ memory1_id: \"3c9e7b2a-1f4d-4a8e-9b6c-5d2e8f1a7c34\", memory2_id: \"8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91\", type: \"EVOLVED_INTO\", strength: 0.8 }) // old decision → new\n- associate_memories({ associations: [{ memory1_id: \"8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91\", memory2_id: \"3c9e7b2a-1f4d-4a8e-9b6c-5d2e8f1a7c34\", type: \"RELATES_TO\", strength: 0.8 }] })", "inputSchema": { "properties": { "associations": {
--- pinned/delete_memory +++ observed/delete_memory { "annotations": { "destructiveHint": true, - "description": "Delete a memory by ID (`memory_id`) or bulk-delete by tag (`tags`). Use sparingly — consider `update_memory` instead.\n\n**Mode 1 — Single (default):** pass `memory_id` to delete one memory and its embedding. Idempotent: re-running on the same ID is a no-op.\n\n**Mode 2 — Bulk-by-tag:** pass `tags: [...]` to delete ALL memories tagged with ANY of these tags. Tag matching is exact (case-insensitive), any-of mode. There is NO dry-run. This can delete thousands of memories in one call. NOT idempotent in practice — re-running may catch new memories that were tagged the same way after the first call. Verify with `recall_memory({ tags, exhaustive: true })` first if uncertain.\n\n**When to use:**\n- Memory contains incorrect information that can't be corrected (Mode 1)\n- Memory is a duplicate (Mode 1)\n- Cleanup of benchmark/test data scoped by tag (Mode 2)\n- Removing all memories under a deprecated tag namespace (Mode 2)\n\n**Examples:**\n- delete_memory({ memory_id: \"abc123\" }) // Mode 1\n- delete_memory({ tags: [\"benchmark-test\"] }) // Mode 2, bulk by tag", + "description": "Delete a memory by ID (`memory_id`) or bulk-delete by tag (`tags`). Use sparingly — consider `update_memory` instead.\n\n**Mode 1 — Single (default):** pass `memory_id` to delete one memory and its embedding. Idempotent: re-running on the same ID is a no-op.\n\n**Mode 2 — Bulk-by-tag:** pass `tags: [...]` to delete ALL memories tagged with ANY of these tags. Tag matching is exact (case-insensitive), any-of mode. There is NO dry-run. This can delete thousands of memories in one call. NOT idempotent in practice — re-running may catch new memories that were tagged the same way after the first call. Verify with `recall_memory({ tags, exhaustive: true })` first if uncertain.\n\n**When to use:**\n- Memory contains incorrect information that can't be corrected (Mode 1)\n- Memory is a duplicate (Mode 1)\n- Cleanup of benchmark/test data scoped by tag (Mode 2)\n- Removing all memories under a deprecated tag namespace (Mode 2)\n\n**Examples:**\n- delete_memory({ memory_id: \"8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91\" }) // Mode 1\n- delete_memory({ tags: [\"benchmark-test\"] }) // Mode 2, bulk by tag", "inputSchema": { "properties": { "memory_id": {
--- pinned/recall_memory +++ observed/recall_memory { "_meta": { "anthropic/alwaysLoad": true - "description": "Recall memories from AutoMem in one of three modes. The mode is selected by which params you pass.\n\n**Mode 1 — ID fetch:** pass `memory_id` to retrieve a single memory by ID. All other params are ignored. Routes to GET /memory/{id} and updates last_accessed.\n\n**Mode 2 — Tag enumeration:** pass `tags` + `exhaustive: true` for paginated exact-match listing (NOT ranked retrieval). Use this for cleanup/audit workflows where ranked retrieval silently undercounts large tag sets. Pair with `limit` (≤200) and `offset`. Returns `has_more`/`limit`/`offset` page metadata. Tag matching is exact, case-insensitive, any-of mode — `tag_match: \"prefix\"` and `tag_mode: \"all\"` are rejected in this mode.\n\n**Mode 3 — Ranked retrieval (default):** hybrid search across vector, keyword, tags, recency, and optional graph expansion. The primary tool for finding relevant context. By default, ranked recall requests current active memories only; set `current_only: false` for audits.\n\n**When to use ranked (mode 3):**\n- At conversation start: recall context about the current project/topic\n- Before making decisions: check for past decisions on similar topics\n- When debugging: search for similar past errors and their solutions\n- For complex questions: use `expand_entities` for multi-hop reasoning\n\n**When to use enumeration (mode 2):** when you need to know *how many* memories carry a tag, or to walk all of them for cleanup/migration. Ranked recall ignores low-importance hits — enumeration does not.\n\n**Examples:**\n- recall_memory({ query: \"database architecture decisions\", tags: [\"my-project\"], limit: 5 })\n- recall_memory({ memory_id: \"abc123\" }) // Mode 1\n- recall_memory({ tags: [\"benchmark-test\"], exhaustive: true, limit: 50 }) // Mode 2 (add offset for later pages)\n- recall_memory({ query: \"auth\", exclude_tags: [\"deprecated\"] }) // Mode 3 with exclusion\n- recall_memory({ query: \"What is Sarah's sister's job?\", expand_entities: true }) // Mode 3 multi-hop", + "description": "Recall memories from AutoMem in one of three modes. The mode is selected by which params you pass.\n\n**Mode 1 — ID fetch:** pass `memory_id` to retrieve a single memory by ID. All other params are ignored. Routes to GET /memory/{id} and updates last_accessed.\n\n**Mode 2 — Tag enumeration:** pass `tags` + `exhaustive: true` for paginated exact-match listing (NOT ranked retrieval). Use this for cleanup/audit workflows where ranked retrieval silently undercounts large tag sets. Pair with `limit` (≤200) and `offset`. Returns `has_more`/`limit`/`offset` page metadata; next page at `next_offset`. Tag matching is exact, case-insensitive, any-of mode — `tag_match: \"prefix\"` and `tag_mode: \"all\"` are rejected in this mode.\n\n**Mode 3 — Ranked retrieval (default):** hybrid search across vector, keyword, tags, recency, and optional graph expansion. The primary tool for finding relevant context. By default, ranked recall requests current active memories only; set `current_only: false` for audits.\n\n**When to use ranked (mode 3):**\n- At conversation start: recall context about the current project/topic\n- Before making decisions: check for past decisions on similar topics\n- When debugging: search for similar past errors and their solutions\n- For complex questions: use `expand_entities` for multi-hop reasoning\n\n**When to use enumeration (mode 2):** when you need to know *how many* memories carry a tag, or to walk all of them for cleanup/migration. Ranked recall ignores low-importance hits — enumeration does not.\n\n**Examples:**\n- recall_memory({ query: \"database architecture decisions\", tags: [\"my-project\"], limit: 5 })\n- recall_memory({ memory_id: \"8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91\" }) // Mode 1\n- recall_memory({ tags: [\"benchmark-test\"], exhaustive: true, limit: 50 }) // Mode 2 (add offset for later pages)\n- recall_memory({ query: \"auth\", exclude_tags: [\"deprecated\"] }) // Mode 3 with exclusion\n- recall_memory({ query: \"What is Sarah's sister's job?\", expand_entities: true }) // Mode 3 multi-hop", "inputSchema": { "properties": { "active_path": { - "description": "Output format: text (default), items (one block per memory), detailed (adds type/confidence/metadata keys/relation stubs), json (raw per-memory fields incl. full content/metadata/relations; whole-response token budget still applies). text/items/detailed show a content preview (default 400 chars) and keep any stored summary as an additive field — fetch a full record via memory_id.", + "description": "Output format: text (default), items (one block per memory, in `results` order, then one bracketed trailing block when there are notes or budget cuts), detailed (adds type/confidence/metadata keys/relation stubs), json (raw per-memory fields incl. full content/metadata/relations; whole-response token budget still applies). text/items/detailed show a content preview (default 400 chars) and keep any stored summary as an additive field — fetch a full record via memory_id.", "enum": [ "text", "items", - "default": 5, - "description": "Max memories to return. Schema allows 1–200; in enumeration mode (`exhaustive: true`) the server honors up to 200, while ranked mode is typically clamped server-side to ~50. Default 5.", + "description": "Max memories to return. Schema allows 1–200; in enumeration mode (`exhaustive: true`) the server honors up to 200, while ranked mode is typically clamped server-side to ~50. When omitted, the server defaults to 5 in ranked mode and 20 in enumeration mode.", "maximum": 200, "minimum": 1, "type": "integer" - "description": "Result offset for pagination", + "description": "Enumeration mode only (`exhaustive: true`): records to skip, for paging. Ranked recall has no offset and rejects one; raise `limit` instead.", "minimum": 0, "type": "integer" }, - "description": "\"exact\" for exact tag match (default), \"prefix\" for starts-with matching", + "description": "\"prefix\" (ranked default) matches tags that start with the value, so `tags: [\"automem\"]` also matches `automem-evals`; \"exact\" matches whole tags only. Enumeration mode is always exact.", "enum": [ "exact", "prefix" - "description": "Enumeration mode only: true if more pages exist past `offset + limit`.", + "description": "Enumeration mode only: true if more records exist past this page. Continue at `next_offset`.", "type": "boolean" }, "jit_enriched_count": { - "description": "Enumeration mode only: page size used for this response.", + "description": "Enumeration mode only: page size of this response. When the response budget trims a page, `count` and `limit` shrink to the results returned, so `offset + limit` still starts the next page.", "type": "integer" }, "mode": { + "next_offset": { + "description": "Enumeration mode only, when `has_more` is true: the `offset` for the next page (this offset plus the results returned).", + "type": "integer" + }, "offset": { "description": "Enumeration mode only: offset used for this response.", "type": "integer" + "archived": { + "description": "json and ID fetch only: true when the memory is archived.", + "type": "boolean" + }, "content": { "description": "Memory content (preview-capped in budgeted formats).", "type": "string" + "t_invalid": { + "description": "json and ID fetch only: when the memory stopped being valid (set when superseded). Absent while current.", + "type": "string" + }, + "t_valid": { + "description": "json and ID fetch only: when the memory became valid.", + "type": "string" + }, "tags": { "items": { "type": "string" - "description": "Present when trailing results were dropped to fit the response budget: { applied, omitted_results, reason }.", + "description": "Present when the response budget cut anything: { applied, omitted_results, reason }, plus `omitted_fields` (diagnostics dropped because they did not fit even without results) and `compacted_results` (a json result shown in compact form because it did not fit whole).", "type": "object" }, "vector_search": {
--- pinned/store_memory +++ observed/store_memory { "_meta": { "anthropic/alwaysLoad": true - "description": "Store memory in one of two modes — single-memory (set top-level `content`) or batch (set `memories: [...]` for up to 500).\n\n**Mode 1 — Single (default):** pass top-level `content` plus any optional fields (tags, importance, metadata, type, confidence, embedding, t_valid, t_invalid, etc.).\n\n**Mode 1b — Supersede/correct:** pass top-level `content` plus `supersedes_memory_id`. The server stores the replacement, marks the old memory invalid with `t_invalid=now`, merges supersede metadata, and associates old → new with `INVALIDATED_BY` (default) or `EVOLVED_INTO`.\n\n**Mode 2 — Batch:** pass `memories: [{ content, tags?, importance?, metadata?, timestamp?, type?, confidence? }, ...]` to store up to 500 memories in one request. Faster for bulk ingestion (imports, benchmark seeding). Batch mode does NOT accept `embedding`, `t_valid`, or `t_invalid` per-item — use single mode for those.\n\n**Content size guidelines (per item):**\n- Target: 150-300 characters (one meaningful paragraph)\n- Maximum: 500 characters (auto-summarized if exceeded)\n- Hard limit: 2000 characters (rejected)\n- Format: \"Brief title. Context and details. Impact/outcome.\"\n\n**When to use:**\n- After making a decision: store the reasoning and outcome\n- When discovering a pattern: store the pattern and where it applies\n- After fixing a bug: store the root cause and solution\n- When learning user preferences: store what they prefer and why\n- For bulk ingestion (imports, seeding): use batch mode\n\n**Examples:**\n- store_memory({ content: \"Chose PostgreSQL over MongoDB for user service. Need ACID for transactions.\", tags: [\"architecture\", \"database\"], importance: 0.9 })\n- store_memory({ content: \"User prefers early returns over nested conditionals.\", tags: [\"code-style\"], importance: 0.7 })\n- store_memory({ content: \"User now prefers SQLite for small local tools.\", supersedes_memory_id: \"old-id\", supersede_reason: \"Correction from user\" })", + "description": "Store memory in one of two modes — single-memory (set top-level `content`) or batch (set `memories: [...]` for up to 500).\n\n**Mode 1 — Single (default):** pass top-level `content` plus any optional fields (tags, importance, metadata, type, confidence, embedding, t_valid, t_invalid, etc.).\n\n**Mode 1b — Supersede/correct:** pass top-level `content` plus `supersedes_memory_id`. The server stores the replacement, marks the old memory invalid with `t_invalid=now`, merges supersede metadata, and associates old → new with `INVALIDATED_BY` (default) or `EVOLVED_INTO`.\n\n**Mode 2 — Batch:** pass `memories: [{ content, tags?, importance?, metadata?, timestamp?, type?, confidence? }, ...]` to store up to 500 memories in one request. Faster for bulk ingestion (imports, benchmark seeding). Batch mode does NOT accept `embedding`, `t_valid`, or `t_invalid` per-item — use single mode for those.\n\n**Content size guidelines (per item):**\n- Target: 150-300 characters (one meaningful paragraph)\n- Maximum: 500 characters (auto-summarized if exceeded)\n- Hard limit: 2000 characters (rejected)\n- Format: \"Brief title. Context and details. Impact/outcome.\"\n\n**When to use:**\n- After making a decision: store the reasoning and outcome\n- When discovering a pattern: store the pattern and where it applies\n- After fixing a bug: store the root cause and solution\n- When learning user preferences: store what they prefer and why\n- For bulk ingestion (imports, seeding): use batch mode\n\n**Examples:**\n- store_memory({ content: \"Chose PostgreSQL over MongoDB for user service. Need ACID for transactions.\", tags: [\"architecture\", \"database\"], importance: 0.9 })\n- store_memory({ content: \"User prefers early returns over nested conditionals.\", tags: [\"code-style\"], importance: 0.7 })\n- store_memory({ content: \"User now prefers SQLite for small local tools.\", supersedes_memory_id: \"8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91\", supersede_reason: \"Correction from user\" })", "inputSchema": { "properties": { "confidence": {
--- pinned/update_memory +++ observed/update_memory { "annotations": { "destructiveHint": false, - "description": "Update an existing memory's content, tags, importance, or metadata. Use this to correct or enhance memories rather than storing duplicates.\n\n**When to use:**\n- To correct inaccurate information in a memory\n- To add tags that were forgotten\n- To adjust importance based on new understanding\n- To add metadata after the fact\n\n**Examples:**\n- update_memory({ memory_id: \"abc123\", importance: 0.95 }) // Increase importance\n- update_memory({ memory_id: \"abc123\", tags: [\"project-x\", \"critical\", \"auth\"] }) // Add tags\n- update_memory({ memory_id: \"abc123\", content: \"Updated: PostgreSQL chosen for ACID + team expertise\" })", + "description": "Update an existing memory's content, tags, importance, or metadata. Use this to correct or enhance memories rather than storing duplicates.\n\n**When to use:**\n- To correct inaccurate information in a memory\n- To add tags that were forgotten\n- To adjust importance based on new understanding\n- To add metadata after the fact\n\n**Examples:**\n- update_memory({ memory_id: \"8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91\", importance: 0.95 }) // Increase importance\n- update_memory({ memory_id: \"8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91\", tags: [\"project-x\", \"critical\", \"auth\"] }) // Add tags\n- update_memory({ memory_id: \"8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91\", content: \"Updated: PostgreSQL chosen for ACID + team expertise\" })", "inputSchema": { "properties": { "confidence": {
Current tools
Show all 6 tool fingerprints
associate_memories
check_database_health
delete_memory
recall_memory
store_memory
update_memory
Watch this server yourself
If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.
npx -y mcp-pin@0.2.3 -- <your @verygoodplugins/mcp-automem command>
Or subscribe to this page's RSS feed to be told when it changes.
Badge
The badge states one fact about time and nothing else. It never claims a server is safe.
[](https://mcp-pin.gautamkhosla.com/servers/fdd65dfbde6cf6e6.html)