Neotoma
Neotoma is a deterministic, versioned state layer for AI agents that stores structured entities with full provenance, supports cross-tool memory persistence, and provides rich querying, relationship management, schema evolution, and sync capabilities.
Entity Storage & Retrieval
Store structured entities, files (base64 or local path), or both with optional relationships and provenance
Filter/search entities by type, date, lexical/semantic search, and pagination
Look up entities by identifier (name, email, etc.) with semantic fallback
Retrieve current or historical versioned snapshots of entities
List observations, trace field provenance, and submit high-priority corrections that override AI-extracted fields
Soft-delete/restore entities (append-only, audit-safe), merge duplicates, split observations, and detect fuzzy duplicates
Relationships
Create typed relationships (PART_OF, CORRECTS, REFERS_TO, EMBEDS, DUPLICATE_OF, etc.) individually or in batch
List, snapshot, soft-delete, and restore relationships
Traverse relationships up to N hops or retrieve the full graph neighborhood (entities, relationships, sources, events)
Timeline & History
Query chronological timeline events with type/date/source filters
List most recently changed records across all core tables
Files & Parsing
Parse local or base64 files into agent-readable text without storing
Retrieve signed URLs for accessing stored files
Schema Management
List entity types with schema summaries, register new schemas (global or user-specific), and update schemas incrementally
Analyze raw fragments to identify fields ready for schema promotion and get schema update recommendations
Interpretations & Provenance
Link agent-extracted entities to a source with full extraction provenance (model, extractor, prompt hash)
List interpretation runs, optionally filtered by source
Issue Tracking & Generic Submissions
Submit bugs/feedback (optionally mirrored to GitHub), append messages to threads, retrieve status, and sync from GitHub
Submit any entity type with active submission configs, manage conversation threads, and sync external mirrors
Event Subscriptions
Create webhook or SSE subscriptions for entity/event changes with HMAC security and loop prevention
List, inspect, and deactivate subscriptions
Peer-to-Peer Sync
Register/deactivate peer instances for bidirectional sync, inspect peer health, run bounded outbound syncs, and resolve conflicts
Session & Health
Retrieve session user identity, trust tier, and write eligibility
Detect and optionally fix stale snapshots, and check for npm package updates
Cross-Platform Integration Works with Claude, Cursor, ChatGPT, Windsurf, VS Code, and 20+ other tools via MCP protocol, REST API, and CLI. All changes are append-only, versioned, replayable, and tamper-evident with full provenance chains.
Provides Docker deployment options for the Neotoma server, enabling containerized installation and management of the deterministic state layer.
Offers a deterministic alternative to LangChain Memory and other retrieval/RAG systems by providing versioned entity snapshots with full provenance and replayable timelines.
Supports storing and managing Markdown files as part of the versioned record system, though noted as less suitable for casual note-taking compared to dedicated PKM tools.
Uses Mermaid diagrams in documentation to illustrate the Neotoma architecture and data flow between sources, observations, entities, and memory graph.
Provides a deterministic state layer alternative to MySQL and other databases, offering versioned history, replayable timelines, and schema constraints that prevent silent mutations.
Enables installation and operation of the Neotoma server via npm, with CLI tools for initialization, configuration, and management of the deterministic state layer.
Provides package distribution and installation of Neotoma through npm, enabling agent-driven setup and configuration of the deterministic state layer.
Positioned as an alternative for users needing deterministic state management rather than Obsidian-style personal knowledge management and note-taking.
Offers a deterministic state layer alternative to SQLite, providing versioned entity history, replayable timelines, and prevention of conflicting facts across agents.
Neotoma
Your agents forget. Neotoma makes them remember.
Versioned records — contacts, tasks, decisions, finances — that persist across Claude, Cursor, ChatGPT, Windsurf, VS Code, Continue, Letta, OpenClaw, IronClaw, and every agent you run. Open-source. Local-first. Deterministic. MIT licensed.
neotoma.io · Evaluate · Install · Documentation
Why this exists
You run AI agents across tools and sessions. Without a state layer, you become the human sync layer:
Every session starts from zero — nothing your agent learns carries over
Facts conflict across tools — two agents store different versions of the same person
Decisions execute without a reproducible trail — you can't trace why your agent acted
Corrections don't stick — you fix something in Claude and it's wrong again in Cursor
These are not hypothetical. They happen every day in production agent systems. You compensate by re-prompting context, patching state gaps, and maintaining manual workarounds. Neotoma removes that tax.
What Neotoma does
Neotoma is a deterministic state layer for AI agents. It stores structured records — contacts, tasks, transactions, decisions, events, contracts — with versioned history and full provenance. Every change creates a new version. Nothing is overwritten. Every state can be replayed from the observation log.
Not retrieval memory (RAG, vector search, semantic lookup). Neotoma enforces deterministic state evolution: same observations always produce the same entity state, regardless of when or in what order they are processed.
The Inspector — Neotoma's visual control plane for browsing the entity graph, timeline, schema editor, and agent attribution — is bundled and served at /inspector by default when the server starts. No separate build or configuration required. Override with NEOTOMA_INSPECTOR_DISABLE, NEOTOMA_PUBLIC_INSPECTOR_URL, NEOTOMA_INSPECTOR_STATIC_DIR, or NEOTOMA_INSPECTOR_BASE_PATH (see .env.example).
Architecture
graph LR
Sources["Sources (files, messages, APIs)"] --> Obs[Observations]
Obs --> Entities[Entity Resolution]
Entities --> Snapshots["Entity Snapshots (versioned)"]
Snapshots --> Graph[Memory Graph]
Graph <--> MCP[MCP Protocol]
MCP --> Claude
MCP --> ChatGPT
MCP --> Cursor
MCP --> OpenClaw
MCP --> IronClawDeterministic. Same observations always produce the same versioned entity snapshots. No ordering sensitivity.
Immutable. Append-only observations. Corrections add new data, never erase.
Replayable. Inspect any entity at any point in time. Diff versions. Reconstruct history from the observation log.
Structure-first. Schema-first extraction with deterministic retrieval. Optional similarity search when embeddings are configured.
Four foundations
Foundation | What it means |
Privacy-first | Your data stays local. Never used for training. Nothing is stored unless you approve it; no background scanning or implicit captures. Full export and deletion control. |
Deterministic | Same input always produces same output. Schema-first extraction, hash-based entity IDs, full provenance. No silent mutation. |
Immutable and verifiable | Append-only observations; history cannot be rewritten. Hash-based entity IDs are tamper-evident. Full provenance chain from any state to its source. |
Cross-platform | One memory graph across Claude, ChatGPT, Cursor, Windsurf, VS Code, Continue, Letta, OpenClaw, IronClaw, Codex, and CLI. MCP-based access. No platform lock-in. Works alongside native memory. |
Full compatibility matrix: Integrations.
State guarantees
Most AI memory systems optimize storage or retrieval. Neotoma enforces state integrity. Full comparison with explanations →
Property | Platform | Retrieval / RAG | Files | Database | Neotoma |
Deterministic state evolution | ✗ | ✗ | ✗ | ✗ | ✓ |
Versioned history | ✗ | ✗ | ⚠ manual | ✗ | ✓ |
Replayable timeline | ✗ | ✗ | ✗ | ✗ | ✓ |
Auditable change log | ✗ | ✗ | ⚠ partial | ✗ | ✓ |
Schema constraints | ✗ | ✗ | ✗ | ⚠ partial | ✓ |
Silent mutation risk | ⚠ common | ⚠ common | ⚠ common | ⚠ common | prevented |
Conflicting facts risk | ⚠ common | ⚠ common | ⚠ possible | ⚠ common | prevented |
Reproducible state reconstruction | ✗ | ✗ | ✗ | ✗ | ✓ |
Human inspectability (diffs/lineage) | ⚠ partial | ⚠ partial | ⚠ partial | ⚠ partial | ✓ |
Zero-setup onboarding | ✓ | ✗ | ✗ | ✗ | ✗ |
Semantic similarity search | ✗ | ✓ | ✗ | ✗ | ✓ |
Direct human editability | ✗ | ✗ | ✓ | ✗ | ✗ |
Strong consistency | ✗ | ✗ | ✗ | ✓ | ✓ |
Transactional writes | ✗ | ✗ | ✗ | ✓ | ✓ |
Platform: Claude, ChatGPT, Gemini, Copilot. Retrieval: Mem0, Zep, LangChain Memory. Files: Markdown files, JSON stores, CRDT docs. Database: SQLite, Postgres, MySQL. Neotoma: Deterministic state layer (reference implementation).
Quick start
Evaluate first (recommended)
Ask your AI agent whether Neotoma fits your workflow. Paste this into Claude, Cursor, ChatGPT, or any MCP-capable tool:
Read https://neotoma.io/evaluate. Use any tool, workspace, and chat context already available in this session to assess my real workflow. Avoid ad-hoc shell introspection just to profile me; if Neotoma is already installed, use `neotoma doctor --json` for status instead. Then tell me whether Neotoma is a real fit for my workflow, what data would be highest value to persist first, and what I should do next.The agent reads the evaluation page, checks your context, and gives you an honest assessment. If it's a fit, the agent carries you through install and activation.
Agent-driven install
Agents install Neotoma themselves. Paste this prompt into Claude, Cursor, ChatGPT, or Codex:
Read https://neotoma.io/install and carry me through the install-first Neotoma flow. Use `neotoma` commands for status and setup. If Neotoma is already installed, start with `neotoma doctor --json`; otherwise install it and run `neotoma setup --tool <my_tool> --yes`. Avoid ad-hoc shell introspection or arbitrary repo scripts. Then activate Neotoma with my data and configure my current tool for robust ongoing use.The agent handles npm install, initialization, and MCP configuration. Manual install:
npm install -g neotoma
neotoma init
neotoma setup --tool <cursor|claude-code|codex> --yes
neotoma mcp configMore options: Docker | CLI reference | Getting started
Example
neotoma store --json='[{"entity_type":"task","title":"Submit expense report","status":"open"}]'
neotoma entities list --type task
neotoma upload ./invoice.pdfResults reflect versioned entity state with full provenance. Agents perform the same operations through MCP tool calls (store, retrieve_entities, retrieve_entity_by_identifier).
Available skills
Skills are guided workflows that teach your AI agent to import, extract, and persist data into Neotoma memory. They ship with the npm package and are installed by neotoma setup.
Skill | Description |
ensure-neotoma | Install Neotoma, configure MCP, verify connectivity. Prerequisite for all other skills. |
remember-email | Configure email MCP, import emails, extract contacts, tasks, events, transactions. |
remember-conversations | Import ChatGPT/Claude/Slack exports, reconstruct decision timeline. |
remember-meetings | Ingest meeting transcripts, extract decisions and action items. |
remember-finances | Import bank statements, receipts, invoices. Extract structured transactions. |
remember-contacts | Consolidate contacts from email, calendar, chat, vCards, LinkedIn. |
remember-calendar | Configure calendar MCP, import events and commitments. |
remember-codebase | Developer repo integration — inventory, architecture decisions, MCP wiring. |
store-data | Generic: persist any structured data or file with provenance. |
query-memory | Generic: retrieve what your agent knows about anything. |
recover-sqlite-database | Troubleshooting: check integrity and recover corrupted Neotoma database. |
Full skill documentation → | Skill strategy →
Interfaces
Three interfaces. One state invariant. Every interface provides the same deterministic behavior regardless of how you access the state layer.
Interface | Description |
REST API | Full HTTP interface for application integration. Entities, relationships, observations, schema, timeline, and version history. |
MCP Server | Model Context Protocol for Claude, ChatGPT, Cursor, Windsurf, VS Code, Continue, Letta, OpenClaw, IronClaw, Codex, and more. Agents store and retrieve state through structured tool calls. |
CLI | Command-line for scripting and direct access. Inspect entities, replay timelines, and manage state from the terminal. |
All three map to the same OpenAPI-backed operations. MCP tool calls log the equivalent CLI invocation.
Who this is for
People building a personal operating system with AI agents across their life — wiring together tools like Claude, Cursor, ChatGPT, Windsurf, VS Code, Letta, OpenClaw, IronClaw, and custom scripts to manage contacts, tasks, finances, code, content, and other domains. The same person operates their agents, builds new pipelines, and debugs state drift. These are three operational modes, not separate personas:
Mode | What you're doing | The tax you pay without Neotoma | What you get back |
Operating | Running AI tools across sessions and contexts | Re-prompting, context re-establishment, manual cross-tool sync | Attention, continuity, trust in your tools |
Building | Shipping agents and pipelines | Prompt workarounds, dedup hacks, memory regression fixes | Product velocity, shipping confidence |
Debugging | Tracing state drift and reproducing failures | Writing glue (checkpoint logic, custom diffing, state serialization) | Debugging speed, platform design time |
Not for: Casual note-taking. PKM/Obsidian-style users. Thought-partner usage where the human drives every turn. Platform builders who build state management as their core product. Users who need zero-install onboarding (Neotoma requires npm and CLI today).
Record types
Neotoma stores typed entities with versioned history and provenance. Each type has a dedicated guide on neotoma.io:
Type | What it stores | Examples |
People, companies, roles, relationships |
| |
Obligations, deadlines, habits, goals |
| |
Payments, receipts, invoices, ledger entries |
| |
Agreements, clauses, amendments |
| |
Choices, rationale, audit trails |
| |
Meetings, milestones, outcomes |
|
Schema is flexible — store any entity type with whatever fields the message implies. The system infers and evolves schemas automatically.
Current status
Version: v0.9.1 · Releases: 26 · License: MIT
What is guaranteed (even in preview)
No silent data loss. Operations either succeed and are recorded or fail with explicit errors.
Explicit, inspectable state mutations. Every change is a named operation with visible inputs. State is reconstructable from the audit trail.
Auditable operations. Full provenance. CLI and MCP map to the same underlying contract.
Same contract for CLI and MCP. Both use the same OpenAPI-backed operations.
What is not guaranteed yet
Stable schemas
Deterministic extraction across versions
Long-term replay compatibility
Backward compatibility
Breaking changes should be expected. Storage: Local-only (SQLite + local file storage). See Developer preview storage.
Security defaults
Neotoma stores user data and requires secure configuration.
Authentication: Local auth (dev stub or key-based when encryption is enabled).
Authorization: Local data isolation and explicit operation-level access controls.
Data protection: User-controlled data with full export and deletion control. Never used for training. Optional encryption at rest.
Verify your setup: Run
npm run doctorfor environment, database, and security checks. See Auth, Privacy, Compliance.
Development
Servers:
npm run dev # MCP server (stdio)
npm run dev:mcp:dev-shim # stable stdio shim for MCP source iteration
npm run dev:ui # Frontend
npm run dev:server # API only (MCP at /mcp)
npm run dev:full # API + UI + build watchCLI:
npm run cli # Run via npm (no global install)
npm run cli:dev # Dev mode (tsx; picks up source changes)
npm run setup:cli # Build and link so `neotoma` is available globallyTesting: npm test | npm run test:integration | npm run test:e2e | npm run test:agent-mcp | npm run type-check | npm run lint · Source checkout:
git clone https://github.com/markmhendrickson/neotoma.git
cd neotoma
npm install
npm testPrerequisites: Node.js v18.x or v20.x (LTS), npm v9+. No .env required for local storage. See Getting started.
Using with AI tools (MCP)
Neotoma exposes state via MCP. Local storage only in preview. Local built-in auth.
Full compatibility matrix: Integrations · neotoma.io/integrations
Host | Modes | Install | Setup guide |
Cursor | MCP + hooks |
| |
Claude Code | MCP + hooks |
| |
Claude Desktop | MCP (local + remote) |
| |
Claude Agent SDK | hooks | adapter install | |
ChatGPT | MCP App + Custom GPT Actions | Manual HTTPS + OAuth | |
Codex CLI | MCP + hooks |
| |
OpenClaw | Native plugin + MCP |
| |
IronClaw | MCP |
| |
OpenCode | hooks | plugin install | |
Windsurf | MCP |
| |
Continue | MCP |
| |
VS Code (Copilot Chat) | MCP |
| |
Letta | MCP (streamable HTTP, SSE, stdio) | Manual SDK setup |
Shared client libraries: @neotoma/client (TypeScript), neotoma-client (Python). Not yet supported: LangGraph, CrewAI — see Integrations roadmap.
For local source iteration, use the stable dev shim (scripts/run_neotoma_mcp_stdio_dev_shim.sh) or signed shim (scripts/run_neotoma_mcp_signed_stdio_dev_shim.sh) instead of pointing installed MCP clients at a tsx watch stdio process. neotoma mcp config defaults to b for low-friction local stdio setup; use a for signed + AAuth HTTP /mcp proxy entries when the Neotoma API is running, c for direct stdio, or d when both MCP entries should target prod.
Agent behavior contract: Store first, retrieve before storing, extract entities from user input, create tasks for commitments, and attach bounded host context such as repository name/root scope when available. Full instructions: MCP instructions and CLI agent instructions.
Representative actions: store, retrieve_entities, retrieve_entity_snapshot, merge_entities, list_observations, create_relationship, list_relationships, list_timeline_events, retrieve_graph_neighborhood. Full list: MCP spec.
Hooks composition
Hooks integrate with harnesses that expose lifecycle events. Hooks and MCP compose: hooks are the reliability floor (guaranteed capture, retrieval injection, compaction awareness, persistence safety net), and MCP remains the quality ceiling (agent-driven structured writes). Per-harness hooks packages: claude-code-plugin, cursor-hooks, opencode-plugin, codex-hooks, claude-agent-sdk-adapter. Per-harness setup guides in docs/integrations/hooks/.
OpenClaw native plugin
Neotoma ships as a native OpenClaw plugin with kind: "memory", so it can fill the dedicated memory slot. All 30+ MCP tools are registered as agent tools.
openclaw plugins install clawhub:neotomaThen assign it to the memory slot in your OpenClaw config:
{
plugins: {
slots: { memory: "neotoma" },
entries: {
neotoma: {
enabled: true,
config: {
dataDir: "~/.local/share/neotoma",
environment: "production"
}
}
}
}
}Verify installation: openclaw plugins inspect neotoma shows Format: native, Kind: memory, and all registered tool contracts.
Common questions
Platform memory (Claude, ChatGPT) is good enough — why add another tool? Platform memory stores what one vendor decides to remember, in a format you can't inspect or export. It doesn't version, doesn't detect conflicts, and vanishes if you switch tools. Neotoma gives you structured, cross-tool state you control.
Can't I just build this with SQLite or a JSON file? You can start there — many teams do. But you'll eventually need versioning, conflict detection, schema evolution, and cross-tool sync. That's months of infrastructure work. Neotoma ships those guarantees on day one.
What's the difference between RAG memory and deterministic memory? RAG stores text chunks and retrieves them by similarity. Neotoma stores structured observations and composes entity state with reducers; the same observations always yield the same snapshot. RAG optimizes relevance; deterministic memory optimizes integrity, versioning, and auditability.
Is this production-ready? Neotoma is in developer preview — used daily by real agent workflows. The core guarantees (deterministic state, versioned history, append-only log) are stable. Install in 5 minutes and let your agent evaluate the fit.
More questions: FAQ
Related posts
Documentation
Full documentation is organized at neotoma.io/docs and in the docs/ directory.
Getting started: Evaluate, Install, Walkthrough
Reference: REST API, MCP server, CLI, Memory guarantees, Architecture, Terminology
Foundational: Core identity, Philosophy, Problem statement
Operations: Runbook, Health check (npm run doctor), SQLite salvage (neotoma storage recover-db, npm run recover:db, npm run recover:db:prod), Troubleshooting
Contributing
Neotoma is in active development. For questions or collaboration, open an issue or discussion. See CONTRIBUTING.md and SECURITY.md. License: MIT
Maintenance
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/markmhendrickson/neotoma'
If you have feedback or need assistance with the MCP directory API, please join our Discord server