Skip to main content
Glama

AutoMem MCP: Give Your AI Perfect Memory

One command. Infinite memory. Perfect recall across all your AI tools.

npx @verygoodplugins/mcp-automem install

Your AI assistant now remembers everything. Forever. Across every conversation.

https://github.com/user-attachments/assets/fd79112b-5158-4320-a054-8c18ab1ea314

Works with Claude Desktop, Cursor IDE, Claude Code, GitHub Copilot (coding agent), ChatGPT, ElevenLabs, OpenAI Codex, OpenClaw, Hermes, Grok Build, Google Antigravity - any MCP-compatible AI platform.

The Problem We Solve

Every AI conversation starts from zero. Claude forgets your coding style. Cursor can't learn your patterns. Your assistant doesn't remember yesterday's decisions.

Until now.

AutoMem MCP connects your AI to persistent memory powered by AutoMem - a graph-vector memory service.

Related MCP server: my-memory-mcp

What You Get

🧠 Persistent Memory Across Sessions

  • AI remembers decisions, patterns, and context forever

  • Works across all MCP platforms - Claude Desktop, Cursor, Claude Code, OpenAI Codex, OpenClaw, Hermes, Grok Build, Google Antigravity

  • Cross-device sync - same memory on Mac, Windows, Linux

šŸ† Graph-Vector Architecture

  • 11 public authorable relationship types between memories (recall results may also include read-only system/internal relations that are not valid associate_memories inputs)

  • Research-validated approach (HippoRAG 2: 7% better associative memory)

  • Sub-second retrieval even with millions of memories

šŸš€ Works Everywhere You Code

Platform

Support

Setup Time

Claude Desktop

āœ… Full

30 seconds

Cursor IDE

āœ… Full

30 seconds

Claude Code

āœ… Full

30 seconds

GitHub Copilot

āœ… Full

2 minutes

OpenAI Codex

āœ… Full

30 seconds

OpenClaw

āœ… Full

30 seconds

Hermes Agent

āœ… Full

30 seconds

Grok Build

āœ… Full

30 seconds

Google Antigravity

āœ… Full

30 seconds

Any MCP client

āœ… Full

30 seconds

See It In Action

Claude Desktop with Personal Preferences

Claude Desktop Using Memory Claude automatically recalls memories using the Personal Preferences template

Cursor IDE with Memory Rules

Cursor with Memory Cursor uses AutoMem project rules to recall context and save durable memories during work

Claude Code with Session Memory

Claude Code Memory Capture Session-start recall plus LLM-judged storage: Claude decides what's durable and stores it via the memory tools

More platform walkthroughs (Codex, Hermes, Antigravity, remote MCP) live in the Installation Guide.

Quick Start

1. Set Up AutoMem Service

You need a running AutoMem service (the memory backend). Choose one:

Option A: Local Development (fastest, free)

git clone https://github.com/verygoodplugins/automem.git
cd automem
make dev

Service runs at http://localhost:8001 - perfect for single-machine use.

Option B: Railway Cloud (recommended for production)

Deploy on Railway

One-click deploy with $5 free credits. Typical cost: ~$0.50-1/month after trial.

šŸ‘‰ AutoMem Service Installation Guide - Complete setup instructions for local, Railway, Docker, and production deployments.


2. Install MCP Client

Claude Desktop - One-Click Install

Download the extension, then open Settings → Extensions → Advanced settings → Install Extension in Claude Desktop and select the file:

ā¬‡ļø Download AutoMem for Claude Desktop (.mcpb)

After installing:

  1. Claude Desktop will prompt you for your AutoMem API URL (http://127.0.0.1:8001 for local)

  2. Optionally enter your API Key (required for Railway, skip for local)

  3. Click Enable

The bundle includes a fixed version of the MCP server. To update, download and install the latest .mcpb again; restarting Claude or updating the npm package does not upgrade an installed bundle. See updating Claude Desktop for version checks and migration from JSON configuration. The AutoMem backend runs separately.

Then add the paste-ready Personal Preferences starter from templates/CLAUDE_DESKTOP_INSTRUCTIONS.md. That's it: Claude now has persistent memory and knows when to use it.

Other Platforms

Connect your AI tools to the AutoMem service you just started.

# Guided install - pick where AutoMem runs, verify it, write .env, and
# configure your agents (Codex, Claude Code, Cursor, OpenClaw, Hermes)
npx @verygoodplugins/mcp-automem install

Every change is shown in a review plan before anything is written, and each modified file keeps a .bak backup. Add --dry-run to preview, --yes to apply non-interactively. See the Installation Guide for all flags.

setup is an alias of install. To print config snippets again later, use npx @verygoodplugins/mcp-automem config.

3. Platform-Specific Setup

For Claude Code (plugin — recommended):

# In Claude Code:
/plugin marketplace add verygoodplugins/mcp-automem
/plugin install automem@verygoodplugins-mcp-automem

Claude Code prompts for your AutoMem URL and API key at enable time, bundles the MCP server and silent recall/store-tracking hooks, and auto-updates. Prefer hooks and permissions written directly into ~/.claude/ instead? Run npx @verygoodplugins/mcp-automem claude-code.

On Windows, the hook payload assumes a POSIX shell environment such as Git Bash, MSYS2, or WSL — only bash is required (the hooks are pure bash+sed).

For Cursor IDE:

Run the guided installer from your project and select Cursor:

npx @verygoodplugins/mcp-automem install

This connects Cursor to your AutoMem service, installs project memory rules, and registers a session-start recall hook. Already have an endpoint? Use npx @verygoodplugins/mcp-automem cursor --endpoint https://your-automem.example.

The one-click button configures only the MCP server for a local AutoMem instance. Update its endpoint/key in Cursor if needed, then run the CLI above to add project rules and the hook:

Install MCP Server

Other platforms — Claude Desktop (one-click .mcpb above, plus the Personal Preferences template), OpenAI Codex, Hermes Agent, Grok Build, OpenClaw, Google Antigravity, and GitHub Copilot:

šŸ‘‰ Full Installation Guide for every platform's setup and verification steps


Remote MCP via HTTP

An optional sidecar service (deployable to Railway or any Docker host) connects AutoMem to platforms that support remote MCP over Streamable HTTP or SSE — ChatGPT (Developer Mode connectors), Claude.ai web and Claude Mobile, and ElevenLabs Agents.

šŸ‘‰ Remote MCP setup for deployment, connect URLs, and per-platform screenshots.

Architecture

ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
│         Your AI Platforms                   │
│  Claude Desktop │ Cursor │ Claude Code      │
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
               │ MCP Protocol
               ā–¼
ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
│   @verygoodplugins/mcp-automem (this repo)  │
│   • Translates MCP calls → AutoMem API      │
│   • Platform integrations & rules           │
│   • Handles authentication                   │
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
               │ HTTP API
               ā–¼
ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
│        AutoMem Service (separate repo)       │
│        github.com/verygoodplugins/automem    │
│   ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”      ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”        │
│   │  FalkorDB  │      │   Qdrant   │        │
│   │  (Graph)   │      │ (Vectors)  │        │
│   ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜      ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜        │
ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜

This repo (mcp-automem):

  • MCP client that connects AI platforms to AutoMem

  • Platform-specific integrations (Cursor rules, Claude Code hooks, etc.)

  • Setup wizards and configuration tools

AutoMem service:

  • Backend memory service with graph + vector storage

  • Deployment guides (local, Railway, Docker, production)

  • API server with FalkorDB + Qdrant

Features

Core Memory Operations

  • store_memory — Save memories with content, tags, importance, metadata. Two modes:

    • Single (default): top-level content plus optional fields, including embedding, t_valid, t_invalid, custom id.

    • Batch: memories: [...] (≤500 items) for bulk ingestion. Per-item id/embedding/t_valid/t_invalid are not supported in batch mode.

  • recall_memory — Three modes selected by which params you pass:

    • ID fetch: memory_id → fetches one memory by ID; updates last_accessed.

    • Tag enumeration: tags + exhaustive: true → paginated exact-match listing for cleanup/audit workflows where ranked recall undercounts. Pair with limit (≤200) and offset; returns has_more, plus next_offset for the next page while more remain.

    • Ranked retrieval (default): hybrid search across vector, keyword, tags, recency/state controls, score filters, and graph expansion. Supports state_mode, recency_bias, scope_fallback, expand_respect_tags, min_score, adaptive_floor, and diagnostics such as tag_scope, score_filter, query_time_ms, vector_search, and per-result outside_tag_scope/state_replaces.

  • associate_memories — Create relationships (11 public authorable types; recall results may also include read-only system relations). Supports single-pair mode and batch mode via associations: [...] (≤500) with relation-specific props like reason, context, resolution, observations, transformation, and role.

  • update_memory — Modify existing memories

  • delete_memory — Two modes:

    • Single (default): memory_id → removes one memory and its embedding.

    • Bulk-by-tag: tags: [...] → bulk-delete all memories matching ANY tag (exact, case-insensitive). No dry-run; verify with recall_memory({ tags, exhaustive: true }) first.

  • check_database_health — Monitor service health, degraded state, sync counts, vector dimensions, and enrichment diagnostics when the service provides them

Advanced Recall (v0.8.0+)

Multi-hop Reasoning - Answer complex questions like "What is Amanda's sister's career?"

mcp__memory__recall_memory({
  query: "What is Amanda's sister's career?",
  expand_entities: true, // Finds "Amanda's sister is Rachel" → memories about Rachel
});

Context-Aware Coding - Recall prioritizes language and style preferences

mcp__memory__recall_memory({
  query: "error handling patterns",
  language: "typescript",
  context_types: ["Style", "Pattern"],
});

Platform Integrations

Cursor IDE

  • āœ… Guided setup configures the global MCP server with your endpoint and API key

  • āœ… Project memory rules in .cursor/rules/automem.mdc

  • āœ… Session-start hook prompts recall, with rules as a fallback

  • āœ… Model-judged storage during work; hooks never write memories

  • āœ… Auto-detects project context (package.json, git remote)

Claude Code

  • āœ… Native plugin - MCP server, silent hooks, and skill in one /plugin install, with enable-time config prompts and auto-updates

  • āœ… LLM-judged storage - session-start guidance nudges Claude to store, verify, and associate durable memories during normal work

  • āœ… Memory rules in CLAUDE.md guide Claude's memory usage

GitHub Copilot

  • āœ… Standalone hook JSON files installed into $COPILOT_HOME/hooks/ or ~/.copilot/hooks/

  • āœ… Memory rules template for copilot-instructions.md

  • āœ… Format flag - --format cli (camelCase) or --format vscode (PascalCase)

  • āœ… Setup: npx @verygoodplugins/mcp-automem copilot --yes

Claude Desktop

  • āœ… Direct MCP integration

  • āœ… Paste-ready Personal Preferences starter template

  • āœ… Full memory API access

Why AutoMem MCP?

vs. Building Your Own

  • āœ… 2 years of R&D already done

  • āœ… Research-validated architecture (HippoRAG 2, MELODI, A-MEM)

  • āœ… Working integrations across all MCP platforms

  • āœ… Active development and community

vs. Other Memory Solutions

  • āœ… True graph relationships (not just vector similarity)

  • āœ… Universal MCP compatibility (works with any MCP client)

  • āœ… 7 memory types (Decision/Pattern/Preference/Style/Habit/Insight/Context)

  • āœ… Self-hostable ($5/month vs $150+ for alternatives)

vs. Native AI Memory

  • āœ… Persistent across sessions (not just context window)

  • āœ… Cross-platform (same memory in Claude, Cursor, Code)

  • āœ… Structured relationships (not just RAG)

  • āœ… Infinite scale (no context window limits)

Documentation

MCP Client & Integrations (this repo)

AutoMem Service (separate repo)

The Science Behind AutoMem

The AutoMem service implements cutting-edge 2025 research:

  • HippoRAG 2 (OSU, June 2025): Graph-vector approach achieves 7% better associative memory

  • A-MEM (July 2025): Dynamic memory organization with Zettelkasten principles

  • MELODI (DeepMind, 2025): 8x memory compression without quality loss

  • ReadAgent (DeepMind, 2024): 20x context extension through gist memories

This MCP package provides the bridge between your AI and that research-validated memory system. The backend has also been benchmarked on the neutral Agent Memory Benchmark, including BEAM large-context scaling tiers — reproducible end to end, so you can run it yourself.

Community & Support

Contributing

We welcome contributions! Please:

  1. Fork the repository

  2. Create a feature branch

  3. Make your changes with tests

  4. Submit a pull request with a Conventional Commit title such as fix:, feat:, docs:, or chore:

  5. Do not prefix the PR title with labels like [codex] or [wip] because the squash-merge commit is taken from the PR title

License

MIT - Because great memory should be free.


Ready to give your AI perfect memory?

npx @verygoodplugins/mcp-automem install

Built with obsession. Validated by neuroscience. Powered by graph theory. Works with every MCP-enabled AI.

Designed by Jack Arturo at Very Good Plugins 🧔

Transform your AI from a tool into a teammate. Start now.

Available Tools

6 tools
associate_memoriesAssociate MemoriesA
Idempotent

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

When to use:

  • After storing a new memory: link it to related existing memories

  • When a bug fix relates to an original feature implementation

  • When a new decision updates or invalidates a previous one

  • To connect patterns with their concrete examples

Authorable relationship types:

  • RELATES_TO: General relationship (default)

  • LEADS_TO: Causal relationship (A caused B)

  • OCCURRED_BEFORE: Temporal ordering

  • PREFERS_OVER: Chosen alternative

  • EXEMPLIFIES: Concrete example of a pattern

  • CONTRADICTS: Conflicts with another memory

  • REINFORCES: Strengthens another memory's validity

  • INVALIDATED_BY: Superseded by another memory

  • EVOLVED_INTO: Updated version of a concept

  • DERIVED_FROM: Implementation of a decision/pattern

  • PART_OF: Component of a larger effort

Read-only/internal relations:

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

Examples:

  • 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

  • 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

  • associate_memories({ associations: [{ memory1_id: "8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91", memory2_id: "3c9e7b2a-1f4d-4a8e-9b6c-5d2e8f1a7c34", type: "RELATES_TO", strength: 0.8 }] })

NameRequiredDescriptionDefault
roleNoRelation-specific role for PART_OF associations.
typeNoRelationship type between the two memories
reasonNoRelation-specific reason for PREFERS_OVER, CONTRADICTS, INVALIDATED_BY, or EVOLVED_INTO associations.
contextNoRelation-specific context for PREFERS_OVER or PART_OF associations.
strengthNoRelationship strength: 0.9+ direct causation, 0.7-0.9 strong relation, 0.5-0.7 moderate
timestampNoRelation-specific timestamp for INVALIDATED_BY associations.
confidenceNoRelation-specific confidence for EXEMPLIFIES, EVOLVED_INTO, or DERIVED_FROM.
memory1_idNoID of the source memory (from store_memory response or recall results)
memory2_idNoID of the target memory to link to
resolutionNoRelation-specific resolution for CONTRADICTS associations.
associationsNoBatch mode. Up to 500 associations. Do not combine with top-level memory1_id/memory2_id/type/strength.
observationsNoRelation-specific observations for REINFORCES associations.
pattern_typeNoRelation-specific pattern label for EXEMPLIFIES associations.
transformationNoRelation-specific transformation note for DERIVED_FROM associations.

Output Schema

NameRequiredDescription
failedNoBatch mode: failed association records with errors.
messageYesConfirmation message
successYesWhether every requested association was created. False for partial batch responses.
summaryNoBatch mode: service summary.
succeededNoBatch mode: successful association records.
failed_countNoBatch mode: number of associations that failed.
created_countNoBatch mode: number of associations created.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose non-readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds real context beyond that: the 500-item batch cap and the mutual-exclusion rule that associations[] must not be combined with top-level memory1_id/memory2_id/type/strength. It stops short of saying what happens on unknown memory IDs or directionality semantics beyond the examples.

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 one-sentence purpose, then clearly headed sections for when-to-use, type semantics, and examples. The type list and examples are long but each earns its place; the three near-identical examples with full UUIDs are somewhat repetitive and could be trimmed to one pair plus one batch call.

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?

For a 14-parameter mutation tool with an output schema and annotations present, the description covers the remaining gaps: mode selection, batch limit, mutual exclusion, valid vs invalid relation types, and strength intuition. Return values need not be explained since an output schema exists, so nothing essential is missing.

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 the baseline would be 3; the description earns an upgrade because the schema lists the type enum without per-value meaning, and the description defines all eleven authorable relationship types with examples (LEADS_TO = causal, INVALIDATED_BY = superseded, etc.). The worked examples also show strength values in context (0.9, 0.8).

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 typed relationships between memories') and immediately names the value proposition (knowledge graph improving recall). It also distinguishes the two invocation shapes, single-pair vs batch via associations[], so an agent knows the tool's full surface 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

An explicit 'When to use' block gives four concrete triggering scenarios (after store_memory, bug fix vs feature, superseding decisions, pattern/example pairing). It also gives an explicit when-NOT: system relations such as SIMILAR_TO and DISCOVERED may show up in recall but are not valid inputs here, which prevents a plausible failure mode.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_database_healthCheck Database HealthA
Read-onlyIdempotent

Check the health status of the AutoMem service and its connected databases (FalkorDB graph + Qdrant vectors).

When to use:

  • Before a session to verify the memory service is available

  • When memory operations are failing unexpectedly

  • To check storage statistics

Example:

  • check_database_health({})

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
errorNoError message if status is error
statusYesOverall health status. degraded means the service is reachable but a backend or sync check needs attention.
backendYesBackend type (automem)
statisticsNoDatabase statistics and diagnostics, including memory/vector counts, sync_status, vector_dimensions, and enrichment state when provided.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint false. Description adds value by specifying the components checked (FalkorDB graph + Qdrant vectors) and the service context (AutoMem). No contradictions.

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?

Extremely concise: one-line purpose, bulleted use cases, and example. Every sentence adds value. Front-loaded with key information.

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?

Given zero parameters and the presence of an output schema, the description is complete. It covers purpose, usage guidance, and provides an example. No gaps.

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?

No parameters (0 params, baseline 4). Schema coverage is 100%, so description does not need to compensate. The description effectively explains the tool's purpose without needing parameter details.

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?

Description clearly states verb+resource: 'check the health status of the AutoMem service and its connected databases'. Differentiates from sibling tools like store_memory and recall_memory which are CRUD operations.

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?

Provides explicit when-to-use scenarios: before a session, when memory operations fail, and to check statistics. Does not mention when not to use or alternatives, but sibling differentiation makes it clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_memoryDelete MemoryA
Destructive

Delete a memory by ID (memory_id) or bulk-delete by tag (tags). Use sparingly — consider update_memory instead.

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.

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.

When to use:

  • Memory contains incorrect information that can't be corrected (Mode 1)

  • Memory is a duplicate (Mode 1)

  • Cleanup of benchmark/test data scoped by tag (Mode 2)

  • Removing all memories under a deprecated tag namespace (Mode 2)

Examples:

  • delete_memory({ memory_id: "8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91" }) // Mode 1

  • delete_memory({ tags: ["benchmark-test"] }) // Mode 2, bulk by tag

NameRequiredDescriptionDefault
tagsNoBulk-delete mode (XOR with `memory_id`). Bulk-deletes ALL memories tagged with ANY of these tags. Exact match, case-insensitive. No dry-run.
memory_idNoSingle-delete mode (XOR with `tags`). ID of the memory to delete (from store_memory or recall results).

Output Schema

NameRequiredDescription
tagsNoBulk-delete result: tags that were used for the bulk delete.
messageYesConfirmation message
memory_idNoSingle-delete result: ID of the deleted memory.
deleted_countNoBulk-delete result: number of memories deleted.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=false, but the description goes well beyond them: Mode 2 deletes ALL memories matching ANY tag, matching is exact/case-insensitive, there is no dry-run, a single call can remove thousands, and the embedding goes with the memory. The only wrinkle is 'Mode 1 ... Idempotent' versus idempotentHint=false — it is reconciled by the explicit 'Mode 2 NOT idempotent in practice' sentence, so it is a scope nuance rather than a contradiction, though it demands careful reading.

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 two-mode summary and scoped with bold headers, so an agent can stop reading after the first line if it already knows the mode. It runs long and repeats schema text (exact/case-insensitive matching, no dry-run appear twice), which is the only thing keeping it below a 5.

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?

Both parameters, their XOR relationship, defaults, and the destructive bulk hazard are covered, and an output schema exists so return values need not be described. For a two-parameter destructive tool, nothing an agent needs to call it safely is missing.

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 the baseline is 3; the description earns above that by supplying a default ('Single (default)'), clarifying XOR selection between `memory_id` and `tags`, spelling out any-of/case-insensitive tag matching, and giving concrete call examples. It largely echoes the schema's own parameter descriptions rather than adding new syntax, which caps it at 4.

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+resource (delete a memory) and breaks it into two clearly labeled modes with the parameter that selects each. It also positions itself against the sibling `update_memory` as the preferred alternative, so an agent can distinguish it from `store_memory`/`recall_memory`/`update_memory` without opening any 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?

Explicit 'When to use' bullets map each mode to concrete situations (incorrect info, duplicates, benchmark cleanup, deprecated tag namespaces), and it names alternatives: 'consider `update_memory` instead' and 'Verify with `recall_memory({ tags, exhaustive: true })` first'. When-not guidance ('use sparingly', 'no dry-run') is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recall_memoryRecall MemoryA
Read-onlyIdempotent

Recall memories from AutoMem in one of three modes. The mode is selected by which params you pass.

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.

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.

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.

When to use ranked (mode 3):

  • At conversation start: recall context about the current project/topic

  • Before making decisions: check for past decisions on similar topics

  • When debugging: search for similar past errors and their solutions

  • For complex questions: use expand_entities for multi-hop reasoning

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.

Examples:

  • recall_memory({ query: "database architecture decisions", tags: ["my-project"], limit: 5 })

  • recall_memory({ memory_id: "8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91" }) // Mode 1

  • recall_memory({ tags: ["benchmark-test"], exhaustive: true, limit: 50 }) // Mode 2 (add offset for later pages)

  • recall_memory({ query: "auth", exclude_tags: ["deprecated"] }) // Mode 3 with exclusion

  • recall_memory({ query: "What is Sarah's sister's job?", expand_entities: true }) // Mode 3 multi-hop

NameRequiredDescriptionDefault
endNoISO timestamp upper bound
sortNoResult ordering (use time_* for chronological recaps)
tagsNoFilter by tags. Use project name as first tag for scoping.
limitNoMax 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.
queryNoSemantic search query (natural language). Describe what you're looking for.
startNoISO timestamp lower bound (alternative to time_query)
formatNoOutput 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.text
offsetNoEnumeration mode only (`exhaustive: true`): records to skip, for paging. Ranked recall has no offset and rejects one; raise `limit` instead.
contextNoContext label (e.g., "coding-style", "architecture"). Boosts matching preferences.
queriesNoMultiple queries for broader recall. Results are deduplicated server-side.
languageNoProgramming language hint (e.g., "python", "typescript"). Prioritizes language-specific memories.
tag_modeNo"any" matches memories with any tag (default), "all" requires all tags
embeddingNoOptional embedding vector for direct similarity search
memory_idNoMODE: ID fetch. When set, fetches the single memory by ID and IGNORES all other params. Routes to GET /memory/{id}; updates last_accessed.
min_scoreNoRanked-mode only. Minimum final score threshold before results are returned.
tag_matchNo"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.
exhaustiveNoMODE: tag enumeration. When true, requires non-empty `tags`. Routes to GET /memory/by-tag for paginated exact-match listing — NOT ranked retrieval. Use for cleanup/audit workflows where ranked recall undercounts. `limit` is clamped to 200. `tag_match: "prefix"` and `tag_mode: "all"` are rejected in this mode.
state_modeNoRanked-mode only. `current` returns active memories; `history` allows superseded/invalidated memories for audit timelines. Prefer this over current_only for new clients.
time_queryNoNatural language time filter: "today", "yesterday", "last week", "last 30 days"
active_pathNoCurrent file path for language auto-detection (e.g., "src/auth.ts")
state_debugNoRanked-mode only. Include state-filter suppression/replacement IDs and reasons when current_only is true.
context_tagsNoPriority tags to boost in results (e.g., ["coding-style", "preferences"])
current_onlyNoRanked-mode only. When true, server suppresses archived, not-yet-valid, expired, invalidated, or superseded memories from active context.
exclude_tagsNoRanked-mode only. Tags to exclude from results (any match excludes). Independent of `tag_match` — supports both exact and prefix matching internally on the server.
priority_idsNoSpecific memory IDs to ensure are included in results
recency_biasNoRanked-mode only. Controls service recency boosting: auto lets the service infer, on forces boosting, off disables it.
context_typesNoPriority memory types to boost (e.g., ["Style", "Preference"])
adaptive_floorNoRanked-mode only. Enable the service's adaptive score floor when filtering weak matches.
auto_decomposeNoAuto-extract entities and topics from query to generate supplementary searches.
relation_limitNoMax relations to follow per seed memory (default: 5)
scope_fallbackNoRanked-mode only. Allow fallback outside the requested tag scope when scoped recall has weak evidence; diagnostics report tag_scope and outside_tag_scope.
expand_entitiesNoEnable multi-hop reasoning via entity expansion. Finds memories about people/places mentioned in seed results. Use for "What is X's sister's job?" type questions.
expansion_limitNoMax total expanded memories (default: 25)
per_query_limitNoPer-query result limit when using queries[] (default: 5)
expand_relationsNoFollow graph relationships from seed results to find related memories.
expand_min_strengthNoMinimum relation strength to follow during graph expansion. Only traverses edges above this threshold. Recommended: 0.3 for exploratory, 0.6+ for high-confidence connections only. Does not affect entity expansion.
expand_respect_tagsNoRanked-mode only. When true, graph/entity expansion stays within the original tag scope; when false, expansion may include related context outside the tags.
expand_min_importanceNoMinimum importance score for expanded results. Filters out low-relevance memories during graph/entity expansion. Recommended: 0.3-0.5 for broad context, 0.6-0.8 for focused results. Seed results are never filtered, only expanded ones.

Output Schema

NameRequiredDescription
modeNoMode that produced the result.
sortNoSort mode applied by the service.
countYesNumber of memories returned
limitNoEnumeration 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.
queryNoQuery text executed by ranked recall.
offsetNoEnumeration mode only: offset used for this response.
queriesNoQuery variants executed by the service.
resultsYesArray of matching memories with scores
entitiesNoEntity identity diagnostics injected by the service.
has_moreNoEnumeration mode only: true if more records exist past this page. Continue at `next_offset`.
tag_scopeNoTag-scope diagnostics including whether scoped evidence was strong enough.
state_modeNoState mode applied by ranked recall.
truncationNoPresent 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).
next_offsetNoEnumeration mode only, when `has_more` is true: the `offset` for the next page (this offset plus the results returned).
exclude_tagsNoTags excluded from ranked recall.
recency_biasNoRecency bias mode applied by the service.
score_filterNoScore filtering diagnostics such as min_score, adaptive_floor, and filtered_count.
state_filterNoCurrent-state filtering diagnostics. Includes aggregate counts by default and detailed IDs/reasons only when state_debug=true.
dedup_removedNoNumber of duplicate results removed (when using multiple queries)
query_time_msNoService recall latency in milliseconds.
vector_searchNoVector-search diagnostics from the service.
scope_fallbackNoTrue when recall allowed outside-scope fallback results.
jit_enriched_countNoNumber of memories enriched inline during recall.

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is largely covered. The description still adds genuine operational detail: endpoint routing (GET /memory/{id}, GET /memory/by-tag), that mode 1 updates last_accessed, that ranked mode is server-clamped to ~50 and has no offset, that token budgets apply, and which parameter combinations are rejected. However, 'updates last_accessed' is a state mutation not reflected in readOnlyHint, and the description doesn't reconcile that tension or explain why the tool remains read-only — a small but real disclosure gap for a tool with 38 parameters.

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?

Structure is strong — modes are front-loaded and bolded, decision rules are bulleted, examples are labeled by mode — so an agent can scan to the relevant section fast. It is nonetheless long, and the five examples partly restate rules already stated in prose, which is defensible for a 38-param dispatcher but not maximally tight.

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?

Given 38 optional parameters, high enum count, a full output schema, and read-only annotations, the description supplies everything an agent needs to choose a mode and populate the right params: mode triggers, defaults, pagination behavior, rejected combinations, and worked examples. Return-value explanation is correctly delegated to the output schema rather than duplicated.

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 the baseline is 3, but the description goes well beyond per-parameter docs by explaining cross-parameter semantics: which param activates which mode, that memory_id causes all other params to be ignored, and that tag_match: 'prefix' plus tag_mode: 'all' are rejected in enumeration mode. That mode-dispatch logic is not expressible in the JSON schema and is the single most important thing to get right here. It stops short of 5 because many of the 38 secondary params (recency_bias, adaptive_floor, expansion_limit, etc.) are left entirely to the 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 opening sentence names a specific verb and resource ('Recall memories from AutoMem') and immediately introduces the three-mode structure that defines the tool's identity. The mode descriptions (ID fetch, tag enumeration, ranked retrieval) make it trivially distinguishable from siblings like store_memory, update_memory, and delete_memory, which are all single-purpose mutations.

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 explicit when-to-use guidance per mode: a bulleted list of ranked-recall scenarios (conversation start, pre-decision checks, debugging, multi-hop questions) and a contrasting rule for enumeration ('when you need to know *how many* memories carry a tag'). It also states the key exclusion — ranked recall undercounts large tag sets, so use mode 2 for cleanup/audit — which is exactly the kind of routing guidance that prevents wrong-tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

store_memoryStore MemoryA

Store memory in one of two modes — single-memory (set top-level content) or batch (set memories: [...] for up to 500).

Mode 1 — Single (default): pass top-level content plus any optional fields (tags, importance, metadata, type, confidence, embedding, t_valid, t_invalid, etc.).

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.

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.

Content size guidelines (per item):

  • Target: 150-300 characters (one meaningful paragraph)

  • Maximum: 500 characters (auto-summarized if exceeded)

  • Hard limit: 2000 characters (rejected)

  • Format: "Brief title. Context and details. Impact/outcome."

When to use:

  • After making a decision: store the reasoning and outcome

  • When discovering a pattern: store the pattern and where it applies

  • After fixing a bug: store the root cause and solution

  • When learning user preferences: store what they prefer and why

  • For bulk ingestion (imports, seeding): use batch mode

Examples:

  • store_memory({ content: "Chose PostgreSQL over MongoDB for user service. Need ACID for transactions.", tags: ["architecture", "database"], importance: 0.9 })

  • store_memory({ content: "User prefers early returns over nested conditionals.", tags: ["code-style"], importance: 0.7 })

  • store_memory({ content: "User now prefers SQLite for small local tools.", supersedes_memory_id: "8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91", supersede_reason: "Correction from user" })

NameRequiredDescriptionDefault
tagsNoSingle-memory mode. Tags to categorize the memory (e.g., ["project-name", "bug-fix", "auth"])
typeNoSingle-memory mode. Memory type for classification
contentNoSingle-memory mode (XOR with `memories`). The memory content to store. Be specific: include context, reasoning, and outcome.
t_validNoSingle-memory mode only. ISO 8601 timestamp when the memory becomes valid. Not supported in batch mode.
memoriesNoBatch mode (XOR with `content`). Up to 500 memory objects to store in one call. Each item supports content (required), tags, importance, timestamp, type, confidence, metadata. Batch mode does NOT support `embedding`, `t_valid`, or `t_invalid` per-item — use single-memory mode for those.
metadataNoSingle-memory mode. Optional structured metadata (e.g., { files_modified: ["auth.ts"], error_type: "timeout" })
embeddingNoSingle-memory mode only. Optional embedding vector for semantic search (auto-generated if omitted). Not supported in batch mode.
t_invalidNoSingle-memory mode only. ISO 8601 timestamp when the memory expires. Not supported in batch mode.
timestampNoSingle-memory mode. Optional ISO timestamp (defaults to now)
confidenceNoSingle-memory mode. Classification confidence (0-1, default 0.9 when type provided)
importanceNoSingle-memory mode. Importance: 0.9+ critical decisions, 0.7-0.9 patterns/bugs, 0.5-0.7 minor notes
updated_atNoSingle-memory mode. ISO 8601 last-updated timestamp
last_accessedNoSingle-memory mode. ISO 8601 last-accessed timestamp
supersede_reasonNoSingle-memory supersede mode. Optional reason stored on the old memory's metadata.
supersede_relationNoSingle-memory supersede mode. Relationship to create from old memory to new memory.INVALIDATED_BY
supersedes_memory_idNoSingle-memory supersede mode. Existing memory ID that this new memory replaces or corrects.

Output Schema

NameRequiredDescription
qdrantNoBatch-mode result: Qdrant indexing summary from the server.
storedNoBatch-mode result: number of memories stored.
messageYesConfirmation message
memory_idNoSingle-mode result: unique ID of the stored memory (use for associations)
enrichmentNoBatch-mode result: enrichment status from the server.
memory_idsNoBatch-mode result: IDs of the stored memories.
query_time_msNoBatch-mode result: server-reported execution time in milliseconds.
association_createdNoSupersede-mode result: whether old → new association was created.
superseded_memory_idNoSupersede-mode result: ID of the old memory marked invalid.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses key side effects: supersede marks the old memory invalid, merges metadata, and creates an INVALIDATED_BY or EVOLVED_INTO relation. It also documents batch limitations, content-size summarization/rejection thresholds, and mode-specific constraints.

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 long but justified by a 16-parameter tool with three storage modes. Headers, bullets, and examples are front-loaded around mode choice, and the length is proportionate to the tool's complexity.

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?

Given the annotations, complete schema, nested objects, and output schema, the description covers the information needed to call the tool correctly: mode selection, supersede behavior, batch constraints, and size limits. No essential call-correctness detail appears missing.

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?

Although schema coverage is 100%, the description adds substantial meaning: XOR-style mode selection, per-item batch restrictions, supersede side effects, content-size guidelines, and concrete examples. These details go materially beyond the schema field descriptions.

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 and clearly separates single, supersede, and batch storage modes. It does not explicitly name sibling tools such as recall_memory or update_memory, so sibling differentiation is left implicit.

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 provides concrete 'When to use' scenarios, including decisions, patterns, bug fixes, preferences, and bulk ingestion, and it explains when to choose batch versus single mode. It stops short of explicit when-not guidance or naming sibling alternatives for updates versus storage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_memoryUpdate MemoryA
Idempotent

Update an existing memory's content, tags, importance, or metadata. Use this to correct or enhance memories rather than storing duplicates.

When to use:

  • To correct inaccurate information in a memory

  • To add tags that were forgotten

  • To adjust importance based on new understanding

  • To add metadata after the fact

Examples:

  • update_memory({ memory_id: "8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91", importance: 0.95 }) // Increase importance

  • update_memory({ memory_id: "8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91", tags: ["project-x", "critical", "auth"] }) // Add tags

  • update_memory({ memory_id: "8f3a2c1e-5b7d-4e9a-a1c3-2d4f6b8e0a91", content: "Updated: PostgreSQL chosen for ACID + team expertise" })

NameRequiredDescriptionDefault
tagsNoNew tags (replaces existing)
typeNoMemory type classification
contentNoNew content (replaces existing)
t_validNoISO 8601 timestamp when the memory becomes valid
metadataNoNew metadata (merged with existing)
memory_idYesID of the memory to update (from store_memory or recall results)
t_invalidNoISO 8601 timestamp when the memory expires or was superseded
timestampNoOverride creation timestamp
confidenceNoConfidence score for the memory
importanceNoNew importance score
updated_atNoExplicit update timestamp
last_accessedNoLast access timestamp

Output Schema

NameRequiredDescription
messageYesConfirmation message
memory_idYesID of the updated memory

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds the useful 'correct rather than duplicate' angle but doesn't say what happens if memory_id doesn't exist, whether omitted fields are preserved, or how content replacement interacts with history. Nothing contradicts the annotations.

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 core purpose is front-loaded in the first sentence, and the 'When to use' list follows logically. The three example calls are helpful but occupy a third of the text and largely restate what the schema properties already say.

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 12 parameters, an output schema, and full annotations, the description needs to carry mostly intent and routing, which it does. The remaining gap is behavioral edge cases (missing memory_id, partial-update semantics), which the rich schema partially covers.

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 every one of the 12 parameters is already documented, and the schema even states replace-vs-merge semantics for tags, content, and metadata. The description names only four fields and its examples show invocation shape rather than adding meaning beyond the 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?

States a specific verb and resource: updating an existing memory's content, tags, importance, or metadata. It also explicitly distinguishes itself from the sibling store_memory by saying to use this 'rather than storing duplicates,' so an agent can route correctly without opening either 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?

The 'When to use' block gives four concrete situations (correction, missing tags, importance adjustment, post-hoc metadata) and rules out the duplicate-store path. It stops short of naming delete_memory or store_memory explicitly as the alternative to pick for other cases, leaving a small gap.

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. 1 tool updatev0.14.3
    • Changedrecall_memory12 fields changed
      • changedInput schema / properties / format / description
        Previous value: -"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."New value: +"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."
      • removedInput schema / properties / limit / default
        Removed value: -5
      • changedInput schema / properties / limit / description
        Previous value: -"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."New value: +"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."
      • changedInput schema / properties / offset / description
        Previous value: -"Result offset for pagination"New value: +"Enumeration mode only (`exhaustive: true`): records to skip, for paging. Ranked recall has no offset and rejects one; raise `limit` instead."
      • changedInput schema / properties / tag_match / description
        Previous value: -"\"exact\" for exact tag match (default), \"prefix\" for starts-with matching"New value: +"\"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."
      • changedOutput schema / properties / has_more / description
        Previous value: -"Enumeration mode only: true if more pages exist past `offset + limit`."New value: +"Enumeration mode only: true if more records exist past this page. Continue at `next_offset`."
      • changedOutput schema / properties / limit / description
        Previous value: -"Enumeration mode only: page size used for this response."New value: +"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."
      • addedOutput schema / properties / next_offset
        Added value: +{
        +  "description": "Enumeration mode only, when `has_more` is true: the `offset` for the next page (this offset plus the results returned).",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / results / items / properties / archived
        Added value: +{
        +  "description": "json and ID fetch only: true when the memory is archived.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / results / items / properties / t_invalid
        Added value: +{
        +  "description": "json and ID fetch only: when the memory stopped being valid (set when superseded). Absent while current.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / properties / t_valid
        Added value: +{
        +  "description": "json and ID fetch only: when the memory became valid.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / truncation / description
        Previous value: -"Present when trailing results were dropped to fit the response budget: { applied, omitted_results, reason }."New value: +"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)."
  2. 2 tool updatesv0.14.2
    • Changedrecall_memory4 fields changed
      • changedInput schema / properties / format / description
        Previous value: -"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 are summary-first: each memory shows its stored 1-2 sentence summary when available, else a content preview — fetch a full record via memory_id."New value: +"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."
      • changedOutput schema / properties / results / items / properties / content / description
        Previous value: -"Memory content (preview in budgeted formats; omitted when summary is shown)."New value: +"Memory content (preview-capped in budgeted formats)."
      • changedOutput schema / properties / results / items / properties / content_chars / description
        Previous value: -"Original content length when content was previewed or replaced by summary."New value: +"Original content length when content was previewed."
      • changedOutput schema / properties / results / items / properties / summary / description
        Previous value: -"Stored 1-2 sentence summary. In budgeted formats it replaces content when present."New value: +"Stored 1-2 sentence summary when the server provides one. Additive in budgeted formats; does not replace content."
    • Changedstore_memory2 fields changed
      • removedInput schema / properties / id
        Removed value: -{
        -  "description": "Single-memory mode only. Custom memory ID (auto-generated if omitted). Not supported in batch mode.",
        -  "type": "string"
        -}
      • changedInput schema / properties / memories / description
        Previous value: -"Batch mode (XOR with `content`). Up to 500 memory objects to store in one call. Each item supports content (required), tags, importance, timestamp, type, confidence, metadata. Batch mode does NOT support `id`, `embedding`, `t_valid`, or `t_invalid` per-item — use single-memory mode for those."New value: +"Batch mode (XOR with `content`). Up to 500 memory objects to store in one call. Each item supports content (required), tags, importance, timestamp, type, confidence, metadata. Batch mode does NOT support `embedding`, `t_valid`, or `t_invalid` per-item — use single-memory mode for those."
  3. 5 tool updatesv0.14.1
    • Changedassociate_memories17 fields changed
      • addedInput schema / properties / associations
        Added value: +{
        +  "description": "Batch mode. Up to 500 associations. Do not combine with top-level memory1_id/memory2_id/type/strength.",
        +  "items": {
        +    "properties": {
        +      "confidence": {
        +        "description": "Relation-specific confidence for EXEMPLIFIES, EVOLVED_INTO, or DERIVED_FROM.",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "context": {
        +        "description": "Relation-specific context for PREFERS_OVER or PART_OF associations.",
        +        "type": "string"
        +      },
        +      "memory1_id": {
        +        "description": "ID of the source memory",
        +        "type": "string"
        +      },
        +      "memory2_id": {
        +        "description": "ID of the target memory",
        +        "type": "string"
        +      },
        +      "observations": {
        +        "description": "Relation-specific observations for REINFORCES associations.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "pattern_type": {
        +        "description": "Relation-specific pattern label for EXEMPLIFIES associations.",
        +        "type": "string"
        +      },
        +      "reason": {
        +        "description": "Relation-specific reason for PREFERS_OVER, CONTRADICTS, INVALIDATED_BY, or EVOLVED_INTO associations.",
        +        "type": "string"
        +      },
        +      "resolution": {
        +        "description": "Relation-specific resolution for CONTRADICTS associations.",
        +        "type": "string"
        +      },
        +      "role": {
        +        "description": "Relation-specific role for PART_OF associations.",
        +        "type": "string"
        +      },
        +      "strength": {
        +        "description": "Relationship strength from 0 to 1",
        +        "maximum": 1,
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "timestamp": {
        +        "description": "Relation-specific timestamp for INVALIDATED_BY associations.",
        +        "type": "string"
        +      },
        +      "transformation": {
        +        "description": "Relation-specific transformation note for DERIVED_FROM associations.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "description": "Relationship type between the two memories",
        +        "enum": [
        +          "RELATES_TO",
        +          "LEADS_TO",
        +          "OCCURRED_BEFORE",
        +          "PREFERS_OVER",
        +          "EXEMPLIFIES",
        +          "CONTRADICTS",
        +          "REINFORCES",
        +          "INVALIDATED_BY",
        +          "EVOLVED_INTO",
        +          "DERIVED_FROM",
        +          "PART_OF"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "memory1_id",
        +      "memory2_id",
        +      "type",
        +      "strength"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 500,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedInput schema / properties / confidence
        Added value: +{
        +  "description": "Relation-specific confidence for EXEMPLIFIES, EVOLVED_INTO, or DERIVED_FROM.",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Relation-specific context for PREFERS_OVER or PART_OF associations.",
        +  "type": "string"
        +}
      • addedInput schema / properties / observations
        Added value: +{
        +  "description": "Relation-specific observations for REINFORCES associations.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / pattern_type
        Added value: +{
        +  "description": "Relation-specific pattern label for EXEMPLIFIES associations.",
        +  "type": "string"
        +}
      • addedInput schema / properties / reason
        Added value: +{
        +  "description": "Relation-specific reason for PREFERS_OVER, CONTRADICTS, INVALIDATED_BY, or EVOLVED_INTO associations.",
        +  "type": "string"
        +}
      • addedInput schema / properties / resolution
        Added value: +{
        +  "description": "Relation-specific resolution for CONTRADICTS associations.",
        +  "type": "string"
        +}
      • addedInput schema / properties / role
        Added value: +{
        +  "description": "Relation-specific role for PART_OF associations.",
        +  "type": "string"
        +}
      • addedInput schema / properties / timestamp
        Added value: +{
        +  "description": "Relation-specific timestamp for INVALIDATED_BY associations.",
        +  "type": "string"
        +}
      • addedInput schema / properties / transformation
        Added value: +{
        +  "description": "Relation-specific transformation note for DERIVED_FROM associations.",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "memory1_id",
        -  "memory2_id",
        -  "type",
        -  "strength"
        -]
      • addedOutput schema / properties / created_count
        Added value: +{
        +  "description": "Batch mode: number of associations created.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / failed
        Added value: +{
        +  "description": "Batch mode: failed association records with errors.",
        +  "items": {
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / failed_count
        Added value: +{
        +  "description": "Batch mode: number of associations that failed.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / succeeded
        Added value: +{
        +  "description": "Batch mode: successful association records.",
        +  "items": {
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / success / description
        Previous value: -"Whether the association was created"New value: +"Whether every requested association was created. False for partial batch responses."
      • addedOutput schema / properties / summary
        Added value: +{
        +  "description": "Batch mode: service summary.",
        +  "type": "string"
        +}
    • Changedcheck_database_health3 fields changed
      • changedOutput schema / properties / statistics / description
        Previous value: -"Database statistics (memory counts, etc.)"New value: +"Database statistics and diagnostics, including memory/vector counts, sync_status, vector_dimensions, and enrichment state when provided."
      • changedOutput schema / properties / status / description
        Previous value: -"Overall health status"New value: +"Overall health status. degraded means the service is reachable but a backend or sync check needs attention."
      • changedOutput schema / properties / status / enum
        Previous value: -[
        -  "healthy",
        -  "error"
        -]New value: +[
        +  "healthy",
        +  "degraded",
        +  "error"
        +]
    • Changedrecall_memory33 fields changed
      • addedInput schema / properties / adaptive_floor
        Added value: +{
        +  "description": "Ranked-mode only. Enable the service's adaptive score floor when filtering weak matches.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / current_only
        Added value: +{
        +  "default": true,
        +  "description": "Ranked-mode only. When true, server suppresses archived, not-yet-valid, expired, invalidated, or superseded memories from active context.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / expand_respect_tags
        Added value: +{
        +  "description": "Ranked-mode only. When true, graph/entity expansion stays within the original tag scope; when false, expansion may include related context outside the tags.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / format / description
        Previous value: -"Output format: text (default), items (per-memory), detailed (with metadata), json (raw)"New value: +"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 are summary-first: each memory shows its stored 1-2 sentence summary when available, else a content preview — fetch a full record via memory_id."
      • addedInput schema / properties / min_score
        Added value: +{
        +  "description": "Ranked-mode only. Minimum final score threshold before results are returned.",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / recency_bias
        Added value: +{
        +  "description": "Ranked-mode only. Controls service recency boosting: auto lets the service infer, on forces boosting, off disables it.",
        +  "enum": [
        +    "auto",
        +    "on",
        +    "off"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / scope_fallback
        Added value: +{
        +  "description": "Ranked-mode only. Allow fallback outside the requested tag scope when scoped recall has weak evidence; diagnostics report tag_scope and outside_tag_scope.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / state_debug
        Added value: +{
        +  "default": false,
        +  "description": "Ranked-mode only. Include state-filter suppression/replacement IDs and reasons when current_only is true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / state_mode
        Added value: +{
        +  "description": "Ranked-mode only. `current` returns active memories; `history` allows superseded/invalidated memories for audit timelines. Prefer this over current_only for new clients.",
        +  "enum": [
        +    "current",
        +    "history"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / entities
        Added value: +{
        +  "description": "Entity identity diagnostics injected by the service.",
        +  "items": {
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / exclude_tags
        Added value: +{
        +  "description": "Tags excluded from ranked recall.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / jit_enriched_count
        Added value: +{
        +  "description": "Number of memories enriched inline during recall.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / queries
        Added value: +{
        +  "description": "Query variants executed by the service.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / query
        Added value: +{
        +  "description": "Query text executed by ranked recall.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / query_time_ms
        Added value: +{
        +  "description": "Service recall latency in milliseconds.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / recency_bias
        Added value: +{
        +  "description": "Recency bias mode applied by the service.",
        +  "enum": [
        +    "auto",
        +    "on",
        +    "off"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / properties / content / description
        Added value: +"Memory content (preview in budgeted formats; omitted when summary is shown)."
      • addedOutput schema / properties / results / items / properties / content_chars
        Added value: +{
        +  "description": "Original content length when content was previewed or replaced by summary.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / results / items / properties / content_truncated
        Added value: +{
        +  "description": "True when content is a preview; fetch the full record via recall_memory({ memory_id }).",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / results / items / properties / deduped_from
        Added value: +{
        +  "description": "Result IDs merged into this result during multi-query deduplication.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / results / items / properties / jit_enriched
        Added value: +{
        +  "description": "True when the service enriched the memory during recall.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / results / items / properties / outside_tag_scope
        Added value: +{
        +  "description": "True when scope_fallback admitted this result outside the requested tag scope.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / results / items / properties / state_replaces
        Added value: +{
        +  "description": "ID of the suppressed memory this result replaced during current-state filtering.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / properties / summary
        Added value: +{
        +  "description": "Stored 1-2 sentence summary. In budgeted formats it replaces content when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / properties / updated_at
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / scope_fallback
        Added value: +{
        +  "description": "True when recall allowed outside-scope fallback results.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / score_filter
        Added value: +{
        +  "description": "Score filtering diagnostics such as min_score, adaptive_floor, and filtered_count.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / sort
        Added value: +{
        +  "description": "Sort mode applied by the service.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / state_filter
        Added value: +{
        +  "description": "Current-state filtering diagnostics. Includes aggregate counts by default and detailed IDs/reasons only when state_debug=true.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / state_mode
        Added value: +{
        +  "description": "State mode applied by ranked recall.",
        +  "enum": [
        +    "current",
        +    "history"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / tag_scope
        Added value: +{
        +  "description": "Tag-scope diagnostics including whether scoped evidence was strong enough.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / truncation
        Added value: +{
        +  "description": "Present when trailing results were dropped to fit the response budget: { applied, omitted_results, reason }.",
        +  "type": "object"
        +}
      • addedOutput schema / properties / vector_search
        Added value: +{
        +  "description": "Vector-search diagnostics from the service.",
        +  "type": "object"
        +}
    • Changedstore_memory5 fields changed
      • addedInput schema / properties / supersede_reason
        Added value: +{
        +  "description": "Single-memory supersede mode. Optional reason stored on the old memory's metadata.",
        +  "type": "string"
        +}
      • addedInput schema / properties / supersede_relation
        Added value: +{
        +  "default": "INVALIDATED_BY",
        +  "description": "Single-memory supersede mode. Relationship to create from old memory to new memory.",
        +  "enum": [
        +    "INVALIDATED_BY",
        +    "EVOLVED_INTO"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / supersedes_memory_id
        Added value: +{
        +  "description": "Single-memory supersede mode. Existing memory ID that this new memory replaces or corrects.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / association_created
        Added value: +{
        +  "description": "Supersede-mode result: whether old → new association was created.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / superseded_memory_id
        Added value: +{
        +  "description": "Supersede-mode result: ID of the old memory marked invalid.",
        +  "type": "string"
        +}
    • Changedupdate_memory2 fields changed
      • addedInput schema / properties / t_invalid
        Added value: +{
        +  "description": "ISO 8601 timestamp when the memory expires or was superseded",
        +  "type": "string"
        +}
      • addedInput schema / properties / t_valid
        Added value: +{
        +  "description": "ISO 8601 timestamp when the memory becomes valid",
        +  "type": "string"
        +}
  4. 6 tool updatesv0.14.0
    • First observedassociate_memories
    • First observedcheck_database_health
    • First observeddelete_memory
    • First observedrecall_memory
    • First observedstore_memory
    • First observedupdate_memory

TDQS

A4.4/5.0

Scored across 6 tools

Disambiguation4/5

Each tool has a clearly distinct primary action (health, store, recall, associate, update, delete). There is minor overlap between store_memory's supersede mode and update_memory since both can correct existing memories, but the descriptions explain when to use each, so misselection risk is low.

Naming Consistency5/5

All tools follow a consistent snake_case verb_noun pattern: check_database_health, store_memory, recall_memory, associate_memories, update_memory, delete_memory. The naming is predictable and readable throughout.

Tool Count5/5

Six tools is well-scoped for a memory service. Each tool earns its place by covering a distinct operation without excessive fragmentation.

Completeness5/5

The surface covers the full memory lifecycle: create/store, read/recall, update, delete, graph association, and health checking. Recall supports ID fetch, exhaustive tag enumeration, and ranked retrieval, leaving no obvious dead ends.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A MCP server that provides persistent memory for AI assistants, storing personal information, relationships, and observations to enable personalized and contextual conversations.
    4
    -
  • A
    license
    A
    quality
    D
    maintenance
    A persistent, self-organizing memory MCP server for AI assistants, using semantic search, knowledge graphs, and reinforcement learning to automatically manage and retrieve memories.
    13
    MIT