snipara-memory
snipara-memory is an open source memory schema and local engine for
AI-assisted projects.
Memory belongs to the project, not the model.
Use it to model, store, recall, compact, archive, and review durable project memory without depending on Snipara Cloud.
Quickstart
# 1. Install
pip install snipara-memory
# 2. Use the local API
snipara-memory serve --port 8000
# 3. In another terminal, store and recall
curl -X POST http://127.0.0.1:8000/v1/namespaces/demo/memories \
-H "content-type: application/json" \
-d '{"title": "Auth convention", "content": "JWT auth uses RS256 token pairs."}'
curl -X POST http://127.0.0.1:8000/v1/namespaces/demo/memories/recall \
-H "content-type: application/json" \
-d '{"query": "How do we handle auth?"}'
Or use the Python API:
import asyncio
from snipara_memory import InMemoryMemoryStore, MemoryService, RecallQuery, StoreMemoryRequest
async def main():
store = InMemoryMemoryStore()
service = MemoryService(store=store)
await service.store_memory(StoreMemoryRequest(
namespace_id="demo",
content="JWT auth uses RS256 token pairs and refresh tokens.",
title="Auth convention",
))
matches = await service.semantic_recall(
RecallQuery(namespace_id="demo", query="How do we handle JWT auth?")
)
for match in matches:
print(f"{match.score:.2f}: {match.memory.title}")
asyncio.run(main())
Full docs below. Local continuity works out-of-the-box; import commands and MCP are optional.
What It Is
snipara-memory provides project-scoped memory primitives:
- memory object types
- lifecycle states
- source provenance
- authority metadata
- semantic recall requests
- contradiction records
- session warm-up bundles
- local API and MCP wrappers
It is not a generic vector database. It is the shared memory language for agents that need to remember what should keep mattering.
The Problem
Most agent memory systems are either transcript stores or embedding caches. They can retrieve old text, but they rarely answer the deeper workflow question:
What should a future agent trust, reuse, or revisit?
Durable project memory needs structure:
- decisions need authority and source context
- preferences need scope
- learnings need confidence
- stale memories need retirement
- conflicting memories need review
- session startup needs compact bundles
The Solution
snipara-memory gives those concepts a small, inspectable implementation.
Agent Session
|
v
Memory Extraction
|
v
Project-Scoped Memory Objects
|
+--> Recall
+--> Session Bundle
+--> Compaction
+--> Contradiction Review
+--> Archive / Graveyard
The package can run locally in tests, CLIs, prototypes, and MCP-compatible developer tools. Hosted Snipara builds on the same domain concepts with managed retrieval, review workflows, ranking, team controls, and production operations.
Architecture
Claude Code Cursor Codex OpenAI Agents
| | | |
+---------------+--------------+------------------+
|
Project Memory Interface
|
snipara-memory
|
Local Store / API / MCP Wrapper
|
Durable Project Context
Why This Is Different
Many tools stop at "store text, run semantic search".
snipara-memory focuses on the memory lifecycle:
- tiered retrieval:
CRITICAL,DAILY,ARCHIVE - lifecycle states:
ACTIVE,ARCHIVED,GRAVEYARD - scoped memory ownership
- contradiction detection and resolution
- graveyard restore instead of destructive deletes
- session bundles for agent warm-up
- importers for transcripts and project docs
- explicit memory identity for safe updates and supersession
- optional provenance-diverse recall with duplicate-evidence filtering
Transcript Store vs Durable Memory
| Need | Transcript-first memory | snipara-memory |
|---|---|---|
| Keep the original conversation | Strong | Not the main goal |
| Preserve durable decisions | Usually ad hoc | First-class |
| Scope memory to projects | Often weak | Built-in |
| Handle contradictions | Rare | Built-in |
| Archive without hard delete | Rare | Built-in graveyard |
| Warm up a new session | Manual | Session bundles |
| Model memory as typed objects | Limited | Built-in |
If your main problem is "search my old chats", a transcript store may be enough. If your main problem is "my agent should keep stable project memory", this package is the right layer.
Evolving memories and evidence diversity
An update should name the durable thing it replaces, not rely on a storage ID or append a second value forever:
await service.store_memory(StoreMemoryRequest(
namespace_id="demo",
content="The deployment target is production.",
memory_key="deployment.target",
supersedes_memory_key="deployment.target",
provenance_key="handoff-2026-08-21",
))
The previous observation is moved to the graveyard and remains restorable. When a context budget must cover several sources, ask recall for a broader candidate pool and opt into provenance diversity:
RecallQuery(
namespace_id="demo",
query="deployment target",
limit=8,
diversify_by_provenance=True,
max_per_provenance=2,
deduplicate_evidence=True,
)
When a fact is spread across several turns in the same source, opt into provenance context to bring sibling evidence along with the direct hit:
RecallQuery(
namespace_id="demo",
query="Where was the coupon redeemed?",
limit=8,
include_provenance_context=True,
provenance_context_limit=8,
)
Provenance context is bounded and opt-in: it preserves the compact-memory model while allowing a later turn to be resolved against an earlier turn from the same document, handoff, or conversation. Confidence remains an eligibility filter; it does not inflate relevance and cannot make unrelated memories outrank direct evidence.
These are generic memory primitives. A benchmark adapter may add query expansion, official prompts, or category-specific readers, but the lifecycle and evidence selection remain reusable by project-memory clients.
Install
pip install snipara-memory
For local development:
pip install -e ".[dev]"
Main CLI:
snipara-memory version
Local store path by default:
~/.snipara-memory/store.json
Python Quickstart
import asyncio
from snipara_memory import InMemoryMemoryStore, MemoryService, RecallQuery, StoreMemoryRequest
async def main() -> None:
store = InMemoryMemoryStore()
service = MemoryService(store=store)
await service.store_memory(
StoreMemoryRequest(
namespace_id="demo",
content="JWT auth uses RS256 token pairs and refresh tokens.",
title="Auth convention",
)
)
matches = await service.semantic_recall(
RecallQuery(namespace_id="demo", query="How do we handle JWT auth?")
)
for match in matches:
print(match.score, match.memory.title, match.memory.content)
asyncio.run(main())
Runnable example:
python examples/quickstart.py
Import a transcript:
snipara-memory import-transcript examples/transcript.txt --namespace demo
Import project documents:
snipara-memory import-project docs --namespace demo
Local API
Start the FastAPI server backed by the local JSON store:
snipara-memory serve --host 127.0.0.1 --port 8000
Health check:
curl http://127.0.0.1:8000/health
Store a memory:
curl -X POST http://127.0.0.1:8000/v1/namespaces/demo/memories \
-H "content-type: application/json" \
-d '{
"title": "Auth convention",
"content": "JWT auth uses RS256 token pairs and refresh tokens."
}'
Recall memory:
curl -X POST http://127.0.0.1:8000/v1/namespaces/demo/memories/recall \
-H "content-type: application/json" \
-d '{
"query": "How do we handle JWT auth?"
}'
Local MCP Server
Run the stdio MCP wrapper:
snipara-memory mcp
With an explicit store file:
snipara-memory mcp --store-path ./.snipara-memory.json
Current MCP tools:
memory_storememory_recallmemory_session_bundlememory_listmemory_detect_contradictionsmemory_resolve_contradictionmemory_import_transcriptmemory_import_project
See docs/mcp.md.
What Is Included
Version 0.1.x includes:
- standalone domain models
- memory service
- in-memory adapter
- JSON file store
- FastAPI app
- MCP stdio wrapper
- transcript and project-doc importers
- benchmark harness
- Prisma schema draft
- runnable examples
What Is Not Included
This repository does not try to clone Snipara Cloud.
Not included:
- hosted MCP transport
- SaaS auth and billing
- team dashboard
- review queues
- managed retrieval ranking
- enterprise analytics
- hosted automation policies
Those remain part of Snipara's commercial hosted product.
Open Core Boundary
Open source:
- memory schemas
- lifecycle primitives
- local storage interfaces
- import formats
- local API and MCP wrappers
- tests and examples
Commercial Snipara:
- hosted orchestration
- managed context ranking
- review and governance workflows
- team and tenant controls
- production analytics
- operational reliability
The language is open. The managed cognition layer is Snipara.
Relationship To Other Repos
| Repo | Role |
|---|---|
Snipara/snipara-server |
Hosted and self-hosted server surface |
alopez3006/snipara-mcp |
Lightweight stdio MCP connector |
Snipara/snipara-memory |
This open memory schema and local engine |
Development
pip install -e ".[dev]"
pytest
ruff check .
Useful docs:
License
Apache-2.0. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file snipara_memory-0.1.1.tar.gz.
File metadata
- Download URL: snipara_memory-0.1.1.tar.gz
- Upload date:
- Size: 94.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec235cf6d4c85fc80186359bb506f164daf14dc886be952feb2382943009d17d
|
|
| MD5 |
bdd6e5362694b43d4f7e7fda72486100
|
|
| BLAKE2b-256 |
4bb3dd2ae460eb3c3210959b409a44018d7d379b0d6cf97976db5e2d9d2aea6b
|
Provenance
The following attestation bundles were made for snipara_memory-0.1.1.tar.gz:
Publisher:
publish.yml on Snipara/snipara-memory
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
snipara_memory-0.1.1.tar.gz -
Subject digest:
ec235cf6d4c85fc80186359bb506f164daf14dc886be952feb2382943009d17d - Sigstore transparency entry: 2666346913
- Sigstore integration time:
-
Permalink:
Snipara/snipara-memory@1d14ea34bc0b9c3879411f3bb174f30f5ba0f257 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Snipara
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1d14ea34bc0b9c3879411f3bb174f30f5ba0f257 -
Trigger Event:
push
-
Statement type:
File details
Details for the file snipara_memory-0.1.1-py3-none-any.whl.
File metadata
- Download URL: snipara_memory-0.1.1-py3-none-any.whl
- Upload date:
- Size: 83.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2025741bc880a97d453a42a5cade9519db843c6668e589bc03e0975f4736e2ae
|
|
| MD5 |
6e8108235710c4c98bea5282ab57602e
|
|
| BLAKE2b-256 |
d1a5e9dd083b96b0497e32e00e6653749066b1a3b7bcd0895398fae5e912c9bc
|
Provenance
The following attestation bundles were made for snipara_memory-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on Snipara/snipara-memory
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
snipara_memory-0.1.1-py3-none-any.whl -
Subject digest:
2025741bc880a97d453a42a5cade9519db843c6668e589bc03e0975f4736e2ae - Sigstore transparency entry: 2666346949
- Sigstore integration time:
-
Permalink:
Snipara/snipara-memory@1d14ea34bc0b9c3879411f3bb174f30f5ba0f257 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Snipara
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1d14ea34bc0b9c3879411f3bb174f30f5ba0f257 -
Trigger Event:
push
-
Statement type: