The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Project Tessera listing page.
Every AI conversation produces knowledge. When the session ends, it's gone. Tessera keeps it.
One knowledge base for Claude Desktop, with an HTTP API for scripts and automation. Runs locally. No API keys, no Docker, no data leaving your machine.
| Tessera | Mem0 | Basic Memory | mcp-memory-service | |
|---|---|---|---|---|
| Works without API keys | Yes | No (needs OpenAI) | Yes | Partial |
| Works without Docker | Yes | No | Yes | No |
| Document search (40+ types) | Yes | No | Markdown only | No |
| ChatGPT integration (via tunnel) | Yes | No | No | No |
| Contradiction detection | Yes | No | No | No |
| Memory confidence scoring | Yes | No | No | No |
| Encrypted vault (AES-256) | Yes | No | No | No |
| HTTP API for non-MCP tools | 58 endpoints | Yes | No | Yes |
| Auto-learning from conversations | Yes | Yes | No | No |
| MCP tools | 58 | ~10 | ~15 | 24 |
Most memory tools store text and search it. Tessera does that, plus:
pip install and go. LanceDB and fastembed are embedded -- no Docker, no database server, no API keys.TESSERA_VAULT_KEY and all memories are AES-256-CBC encrypted at rest.Or with uv:
Creates workspace config, downloads embedding model (~220MB, first time only), configures Claude Desktop.
Ask Claude about your documents. It searches automatically.
Full setup guide at http://127.0.0.1:8394/chatgpt-actions/setup. Swagger docs at http://127.0.0.1:8394/docs.
Every search goes through four stages:
confident match (>= 45%), possible match (25-45%), or low relevance (< 25%)When multiple versions of the same document exist, Tessera prefers the latest.
Each memory gets a category (decision, preference, or fact), is checked for duplicates against existing memories (cosine similarity, 0.92 threshold), and receives a confidence score -- weighted by repetition (35%), recency (25%), source diversity (20%), and category (20%). Set TESSERA_VAULT_KEY to encrypt all memories with AES-256-CBC.
Tessera picks up decisions, preferences, and facts from your conversations without being asked. toggle_auto_learn turns it on or off; review_learned shows what it caught.
Memories contradict each other over time. Tessera finds them:
Works with both English and Korean negation patterns.
ChatGPT can talk to Tessera through Custom GPT Actions, but since ChatGPT's servers need to reach your machine, you need a tunnel (ngrok, Cloudflare Tunnel, etc.) to expose your local API.
Requirements: Your computer must be on, the API server running, and the tunnel active. When any of these stop, ChatGPT loses access.
Create a Custom GPT, paste the instructions, import the OpenAPI spec as an Action.
You can also import past ChatGPT conversations to extract knowledge from them:
Export as Obsidian vault (wikilinks), Markdown, CSV, or JSON:
Each memory is healthy, stale (90+ days without reinforcement), or orphaned (no metadata, no category). The health report tells you what to clean up and tracks growth over time.
Run your own scripts when things happen:
7 event types: on_memory_created, on_memory_deleted, on_search, on_session_start, on_session_end, on_ingest_complete, on_contradiction_found.
| Category | Extensions | Install |
|---|---|---|
| Documents | .md .txt .rst .csv | included |
| Office | .xlsx .docx .pdf | pip install project-tessera[xlsx,docx,pdf] |
| Code | .py .js .ts .tsx .jsx .java .go .rs .rb .php .c .cpp .h .swift .kt .sh .sql .cs .dart .r .lua .scala | included |
| Config | .json .yaml .yml .toml .xml .ini .cfg .env | included |
| Web | .html .htm .css .scss .less .svg | included |
| Images | .png .jpg .jpeg .webp .gif .bmp .tiff | pip install project-tessera[ocr] |
| Tool | What it does |
|---|---|
search_documents | Semantic + keyword hybrid search across all docs |
unified_search | Search documents AND memories in one call |
view_file_full | Full file view (CSV as table, XLSX per sheet) |
read_file | Read any file's full content |
list_sources | See what's indexed |
| Tool | What it does |
|---|---|
remember | Save knowledge that persists across sessions |
recall | Search past memories with date/category filters |
learn | Save and immediately index new knowledge |
list_memories | Browse saved memories |
forget_memory | Delete a specific memory |
export_memories | Batch export all memories as JSON |
import_memories | Batch import memories from JSON |
memory_tags | List all unique tags with counts |
search_by_tag | Filter memories by specific tag |
memory_categories | List auto-detected categories (decision/preference/fact) |
search_by_category | Filter memories by category |
find_similar | Find documents similar to a given file |
knowledge_graph | Build a Mermaid diagram of document relationships |
| Tool | What it does |
|---|---|
digest_conversation | Extract and save knowledge from the current session |
toggle_auto_learn | Turn auto-learning on/off or check status |
review_learned | Review recently auto-learned memories |
session_interactions | View tool calls from current/past sessions |
recent_sessions | Session history with interaction counts |
| Tool | What it does |
|---|---|
decision_timeline | How your decisions changed over time, by topic |
context_window | Pack the best context into a token budget |
smart_suggest | Query suggestions based on your past searches |
topic_map | Cluster memories by topic with Mermaid mindmap |
knowledge_stats | Aggregate statistics (categories, tags, growth) |
user_profile | Auto-built profile (language, preferences, expertise) |
explore_connections | Show connections around a specific topic |
| Tool | What it does |
|---|---|
deep_search | Breaks a query into 2-4 angles, searches each, merges best results |
deep_recall | Multi-angle memory recall with verdict labels |
detect_contradictions | Find conflicting memories with severity rating |
memory_confidence | How reliable is each memory (repetition, recency, source diversity) |
memory_health | Which memories are healthy, stale, or orphaned |
list_plugin_hooks | See what hooks are registered |
| Tool | What it does |
|---|---|
export_for_ai | Export memories in portable format |
import_from_ai | Import memories from external sources |
import_conversations | Extract knowledge from ChatGPT/Claude conversation exports |
export_knowledge | Export as Obsidian (wikilinks), Markdown, CSV, or JSON |
ChatGPT can connect via Custom GPT Actions (requires tunnel). See /chatgpt-actions/setup.
| Tool | What it does |
|---|---|
vault_status | Check AES-256 encryption status |
migrate_data | Upgrade data from older schema versions |
| Tool | What it does |
|---|---|
ingest_documents | Index documents (first-time or full rebuild) |
sync_documents | Incremental sync (only changed files) |
project_status | Recent changes per project |
extract_decisions | Find past decisions from logs |
audit_prd | Check PRD quality (13-section structure) |
organize_files | Move, rename, archive files |
suggest_cleanup | Detect backup files, empty dirs, misplaced files |
tessera_status | Server health: tracked files, sync history, cache |
health_check | Full workspace diagnostics |
search_analytics | Search usage patterns, top queries, response times |
check_document_freshness | Detect stale documents older than N days |
Swagger UI at http://127.0.0.1:8394/docs. Optional auth via TESSERA_API_KEY env var.
| Method | Path | What it does |
|---|---|---|
| GET | /health | Health check |
| GET | /version | Version info |
| POST | /search | Semantic + keyword search |
| POST | /unified-search | Search docs + memories |
| POST | /remember | Save a memory |
| POST | /recall | Search memories with filters |
| POST | /learn | Save and index knowledge |
| GET | /memories | List memories |
| DELETE | /memories/{id} | Delete a memory |
| GET | /memories/categories | List categories |
| GET | /memories/search-by-category | Filter by category |
| GET | /memories/tags | List tags |
| GET | /memories/search-by-tag | Filter by tag |
| POST | /context-window | Build token-budgeted context |
| GET | /decision-timeline | Decision evolution |
| GET | /smart-suggest | Query suggestions |
| GET | /topic-map | Topic clusters |
| GET | /knowledge-stats | Stats dashboard |
| POST | /batch | Multiple operations in one call |
| GET | /export | Export as Obsidian/MD/CSV/JSON |
| GET | /export-for-ai | Export memories in portable format |
| POST | /import-from-ai | Import memories from external sources |
| POST | /import-conversations | Import past conversations |
| POST | /migrate | Run data migration |
| GET | /vault-status | Encryption status |
| GET | /user-profile | User profile |
| GET | /status | Server status |
| GET | /health-check | Workspace diagnostics |
| POST | /deep-search | Multi-angle document search |
| POST | /deep-recall | Multi-angle memory recall |
| GET | /contradictions | Detect conflicting memories |
| GET | /memory-confidence | Memory reliability scores |
| GET | /memory-health | Memory health analytics |
| GET | /hooks | List plugin hooks |
| GET | /entity-search | Search entity knowledge graph |
| POST | /entity-graph | Mermaid diagram from entities |
| GET | /consolidation-candidates | Find similar memory clusters |
| POST | /consolidate | Merge similar memories |
| GET | /dashboard | Web dashboard (dark theme, entity graph, stats) |
| POST | /sleep-consolidate | Auto-merge near-duplicate memories |
| POST | /retention-policy | Flag old or low-quality memories |
| GET | /retention-summary | Age distribution and at-risk counts |
| GET | /adapters/{framework} | Setup code for LangChain, CrewAI, AutoGen |
| POST | /auto-curate | Classify, tag, deduplicate, and clean up memories |
| GET | /auto-insights | Trending topics, decision patterns, hidden connections |
| GET | /chatgpt-actions/openapi.json | OpenAPI spec for Custom GPT Actions |
| GET | /chatgpt-actions/instructions | GPT instruction template |
| GET | /chatgpt-actions/setup | ChatGPT integration setup guide |
With uvx (recommended):
With pip:
Config location:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.jsontessera setup creates workspace.yaml:
Or set TESSERA_WORKSPACE=/path/to/docs to skip config file entirely.
Environment variables:
TESSERA_API_KEY -- enable API authenticationTESSERA_VAULT_KEY -- enable AES-256 encryption for memories| Component | Technology | Why |
|---|---|---|
| Vector store | LanceDB | Embedded columnar store. No server process, handles vector + metadata queries natively |
| Embeddings | fastembed/ONNX | Local inference, no API keys. paraphrase-multilingual-MiniLM-L12-v2 (384-dim, 101 languages) |
| Metadata | SQLite | File tracking, search analytics, interaction logging. Thread-safe with reentrant locks |
| Memory storage | Filesystem (.md) | Human-readable, git-friendly, encryptable. YAML frontmatter for metadata |
| Encryption | Pure Python AES-256-CBC | No OpenSSL dependency. PKCS7 padding, random IV per memory |
| HTTP API | FastAPI | Swagger docs, Pydantic validation, async-capable |
| MCP | FastMCP (stdio) | Standard MCP protocol for Claude Desktop |
| Metric | Count |
|---|---|
| MCP tools | 58 |
| HTTP endpoints | 58 |
| CLI commands | 11 |
| Core modules | 69 |
| Lines of code | 31,000+ |
| Tests | 1102 |
| File types | 40+ |
AGPL-3.0 -- see LICENSE.
Commercial licensing: bessl.framework@gmail.com