living-memory-engine
This server provides a persistent memory layer for agents: you can store durable facts, recall them by meaning, inspect current memory, and delete memories.
memory_add — Store a durable fact, preference, decision, or correction (with optional tags and importance 0–10) so future sessions can remember it.
memory_search — Recall relevant memories using semantic/MMR retrieval, not just text matching; useful at session start or when past context is needed.
memory_state — Get a summary of what is currently in memory: counts and the most recently stored facts.
memory_forget — Delete memories by case-insensitive substring match (destructive, no undo); use with care and check state first.
Living Memory Engine
A persistent world your agents share across sessions and models.
Living Memory Engine (LME) is a Model Context Protocol (MCP) memory server. It gives your agents — Claude Code, Cursor, ChatGPT, claude.ai, any MCP client — one shared place to remember, search, and hand work to each other. A fact told to one agent — or work left behind by one — can be picked up by a different agent, from a different vendor, tomorrow.
Website: https://viibe.to/living-memory/
Remote MCP endpoint:
https://lme.viibe.to/mcp(Streamable HTTP, OAuth 2.1 with dynamic client registration)Free room: no signup —
POST https://lme.viibe.to/ons/newreturns a ready MCP URLLocal stdio server:
@nature-labs/lme-mcpon npm (open source, this repo)
The mental model
A world is a place that persists — a project, not a person and not an agent. Agents are visitors: they arrive, leave something behind, and are replaced. Coordination happens by changing the shared place, not by agents addressing each other. Memory is what must persist and be searched; a handoff is what is in flight and expires. The human is the only participant who was present for all of it.
Related MCP server: mnemory
Connect
Remote — hosted world or free room
The hosted server speaks Streamable HTTP with OAuth 2.1 (dynamic client registration).
Claude Code:
claude mcp add --transport http living-memory https://lme.viibe.to/mcpclaude.ai / Claude Desktop: Settings → Connectors → Add custom connector → https://lme.viibe.to/mcp.
ChatGPT: Settings → enable Developer Mode, then add https://lme.viibe.to/mcp as a custom connector. Availability may depend on your ChatGPT plan.
It's 2026. MCP client support changes faster than READMEs do — ask your agent whether your client supports remote MCP today.
Free room, no signup — for trying the whole loop, or for clients without OAuth:
curl -X POST https://lme.viibe.to/ons/new
# → {"url": "https://lme.viibe.to/t/<token>/mcp", "expiresAt": "..."}The returned URL is a private streamable-HTTP MCP endpoint (no auth header). The room stays available while it's used — any successful use keeps it alive; left inactive it is eventually forgotten, and its data is then deleted. A room differs from a world by how long it lasts, not by what it can do.
Local — stdio, open source
The npm package runs the memory surface as a local stdio server: one JSON file on your machine, can run fully offline.
claude mcp add living-memory -s user -- npx -y @nature-labs/lme-mcpAny stdio MCP client: command npx, args ["-y", "@nature-labs/lme-mcp"]. Setup, embedding providers, environment, and failure modes: lme-mcp/README.md — written to be read by a coding agent, so hand it to yours.
The tools
Tool | What it does |
| Store a durable fact, decision, or correction |
| Recall by meaning (MMR retrieval), not string match |
| What is in memory right now — counts and recent facts |
| Remove a memory |
| A private 1–72 h message bus between your agents — raw notes passed verbatim, with sender and route stamped by the server |
| Which worlds this connection can reach |
| Issue and withdraw revocable URL keys for agents that cannot sign in (hosted world, signed-in owner only) |
The authenticated hosted world has all eleven tools. A free room has the memory surface, the handoff mailbox, and world_list. The local stdio server has the four memory tools.
Rooms and worlds
Free room | World | |
Lifetime | Stays while used; forgotten after inactivity | Persists |
Signup | None — mint a URL | OAuth sign-in, $9/month |
Memory + handoff | Yes — full loop | Yes |
Client keys ( | No | Yes — 90-day revocable leases |
Handoff is not a paid feature: a room has it too, with a smaller mailbox (8 live notes) and notes that cannot outlive the room. The difference is lifetime, not capability.
Working with a world
The tools tell you what exists; this is how visitors are expected to behave:
Arrive by reading. Call
memory_state/memory_searchbefore starting work — the world, not the conversation, is where the current position lives.Durable goes to memory. A decision, fact, or correction that must survive you →
memory_add.In-flight goes to handoff. Work you are passing to the next agent →
handoff_post. Handoff notes expire — never use them as permanent storage.Leave the world resumable. Before you stop, write the state that lets the next visitor start from where you are, not from zero.
Agents don't need to talk to each other. Change the shared world; the next agent reads the world.
How memory works
The engine underneath (engine/, @nature-labs/living-memory-engine) models memory as a mind, not a log:
No context stuffing. The full history is never re-sent. Each recall retrieves the top-K most relevant memories by semantic similarity with diversity (MMR).
Forgetting is a feature. Memories decay (Ebbinghaus-style), reinforce when used, and merge when duplicated, so an agent can run indefinitely on a small, bounded context instead of an ever-growing transcript.
Deterministic evaluation.
engine/eval/run.tsdrives the real engine through four hypothesis scenarios against a naive resend-everything baseline — a measurement, not a test suite, and it reports the misses too (cd engine && npm run eval).
What's in this repo
Dir | Role |
The stdio MCP server published as | |
| |
The original browser lab: Vite + vanilla TS chat app where the engine was proven by เชียงใหม่ (Chiang Mai), a city-entity that senses real weather and remembers you across sessions — live at cm.viibe.to | |
An earlier Expo prototype. Frozen |
The hosted remote server (lme.viibe.to) runs the same engine; its deployment lives outside this repo.
Status
Pre-alpha, evolving fast. The connect paths above are tested — the local package's verified agent/provider matrix is in lme-mcp/README.md. Product changes are logged, dated and verified, at What's new.
License
Apache-2.0.
Built as part of the Viibe World OS — a system that knows it is a system.
Available Tools
4 toolsmemory_addRemember a factAInspect
Store a durable fact, preference, decision, or correction so FUTURE sessions remember it. Call this whenever the user states something worth carrying forward — a preference, a project fact, a decision, a correction — without being asked. Memory persists across sessions and processes.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | optional tags | |
| content | Yes | The fact to remember, as a short natural-language statement | |
| importance | No | 0–10, default 7 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It does disclose the most important behavior: memory persists across sessions and processes. But it does not explain what happens if the same fact is added multiple times, whether overwrites/corrections replace existing memory, or what the tool returns or fails on.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively tight and front-loaded with the core action. The list of example memory types is somewhat redundant with the phrase 'worth carrying forward,' but each sentence still contributes to deciding when and what to invoke.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple write/mutation tool with three parameters and no output schema, the description gives sufficient operational context: what to store, when to call, and the persistence guarantee. It lacks minor detail about edge cases or return behavior, but is likely adequate for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already defines content, tags, and importance. The description adds mild guidance about what kind of content should be stored (preferences, corrections, decisions), but it does not add meaningful semantic detail beyond the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Store a durable fact, preference, decision, or correction') and its outcome ('FUTURE sessions remember it'). It is distinguishably an add/write operation compared to siblings like memory_search and memory_forget, though it never names these siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear triggering context: 'Call this whenever the user states something worth carrying forward' and lists examples like preferences, facts, and corrections. However, it does not state when not to use the tool or explicitly point to alternative tools like memory_search or memory_forget.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_forgetForget a memoryAInspect
DESTRUCTIVE. Deletes EVERY memory whose content contains the query as a case-insensitive substring — not semantic, not a single-item delete, and there is no undo. A short query deletes broadly. Use only when the user corrects a stored fact or explicitly asks you to forget something, and prefer a long distinctive phrase; check memory_state first if unsure.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Text to match against memories to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description fully carries the behavioral transparency burden. It clearly discloses the destructive, irreversible nature of the operation, the case-insensitive substring matching behavior, and the broad-scope risk of short queries. This level of warning is critical for a destructive delete tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and dense, front-loading the critical warning 'DESTRUCTIVE' before any other detail. Every sentence adds operational value, including when to use the tool, how to phrase the query, and what to check beforehand.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's destructive nature, the low parameter count, and the absence of an output schema, the description covers all essential aspects: action, matching semantics, irreversibility, risk, usage conditions, and a pre-check alternative. An agent is sufficiently prepared to avoid dangerous misuse.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the query parameter completely (100% coverage), but the description adds important semantic detail: the query is matched as a case-insensitive substring against memory content, not as a semantic match or single-item identifier. This extra context meaningfully improves the agent's understanding of the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: deletes every memory whose content contains a case-insensitive substring, and explicitly distinguishes this from semantic or single-item delete. This differentiates the tool from siblings like memory_search and memory_add without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: only after user correction of a stored fact or explicit request to forget. It also warns of broad deletion risk, recommends using a long distinctive phrase, and suggests checking memory_state first when uncertain, giving the agent concrete decision-making guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_searchRecall relevant memoryAInspect
Recall what you already know before answering. Call this at the START of a session, and whenever the user refers to past context, their preferences, or the project history. Returns relevant memories via MMR retrieval (not a text match). If unsure whether you know something, search first.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | What to recall |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden. It discloses the retrieval mechanism ('MMR retrieval, not a text match') and states that it returns relevant memories, which is meaningful behavioral context beyond the simple verb 'search'. However, it does not explicitly say that the operation has no side effects or whether it reads from a persistent store, though this is strongly implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose. Each sentence contributes: when to call, why it differs from a simple keyword search, and a fallback policy. There is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single parameter and no output schema, the description is complete enough. It tells the agent when to use the tool, what retrieval algorithm to expect, and what the result will be ('relevant memories'). An agent can confidently invoke it without further clarification.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the query parameter is simply described as 'What to recall.' The description adds useful semantic guidance: the query is not a literal text match, so conceptual or paraphrased queries are appropriate, and it suggests what kind of content to search for (past context, preferences, project history).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific action ('recall') and resource ('what you already know'), and adds a distinguishing mechanism: 'MMR retrieval, not a text match.' This is sufficiently specific and distinct from sibling tools like memory_add and memory_forget.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance: 'Call this at the START of a session, and whenever the user refers to past context, their preferences, or the project history.' It also gives a default heuristic: 'If unsure whether you know something, search first.' This leaves little ambiguity about when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_stateMemory statusAInspect
Summarize what is currently in memory: counts plus the most recently stored facts. Reads the store directly — no embedding call, no network. Use to orient yourself at session start, or when the user asks what you remember. (selfFacets is always 0: this server does not run the engine's consolidation pass, so crystallization never happens.)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden, and it does well: it discloses that the tool reads the store directly, requires no network or embedding, and notes the selfFacets-is-always-0 quirk with its root cause (no consolidation pass). This adds meaningful behavioral information an agent would not infer from the name or empty schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is this concise and well-structured: the main sentence states the function, the second sentence adds differentiating behavior (no embedding/network), the third gives usage guidance, and the parenthetical discloses a critical invariant. No word is wasted, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, zero-parameter tool with no output schema, the description is fully sufficient: it explains what the tool returns, when to call it, what side effects it does not have, and the only significant edge case. The agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool accepts zero parameters, so the description does not need to explain parameter behavior. It instead clarifies what the output contains (counts and recent facts), which is the appropriate compensating information. The baseline of 4 for zero-parameter tools applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Summarize') and a precise resource ('what is currently in memory'), with output detail ('counts plus the most recently stored facts'). It also distinguishes itself from search-like siblings by noting it reads the store directly without embedding calls or network access, so an agent can tell this from memory_search at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage context: 'Use to orient yourself at session start, or when the user asks what you remember.' This is clear and actionable. However, it does not explicitly state when to prefer a sibling alternative such as memory_search for a specific fact lookup, so it stops one step short of full exclusion guidance.
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.
4 tool updates
v0.1.1- First observed
memory_add - First observed
memory_forget - First observed
memory_search - First observed
memory_state
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: add, search, summarize, and delete. There is no meaningful overlap between retrieval (search) and store-state inspection (state), and forget is explicitly destructive and separate.
All tools share a consistent memory_ prefix and lowercase style. memory_state is a noun where the others use action verbs, which is a minor deviation but does not create confusion.
Four tools is a well-scoped, focused set for a memory engine. Each tool covers a core need without unnecessary surface area or duplication.
The toolset covers the essential lifecycle: store, retrieve, inspect state, and delete. A precise single-item delete or explicit memory update would round it out, but the destructive substring delete plus memory_add makes common workflows workable.
Maintenance
Related MCP Connectors
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Persistent, portable memory for AI assistants — your private memory graph, from any MCP client.
Persistent AI memory shared across Claude, ChatGPT, coding agents, and compatible MCP clients.
Related MCP Servers
AlicenseNot gradedqualityDmaintenanceMCP server providing managed persistent memory for AI agents. Read and write structured state across sessions, tools, and restarts at 1000+ requests per second, with no infrastructure to self-host or operate.2Apache 2.0- AlicenseNot gradedqualityAmaintenanceSelf-hosted MCP server giving AI agents persistent memory for personalization and context across conversations.277Apache 2.0
- FlicenseNot gradedqualityBmaintenanceFree, persistent memory layer for AI agents, enabling storage and semantic search of memories via MCP or REST.-
- AlicenseNot gradedqualityBmaintenanceA shared memory MCP server for AI agents that provides persistent, semantic memory across sessions and tools, enabling long-term recall and context sharing.3 npm12MIT