MCP memory server · v0.1 · MIT

Memory that lives
in plain files.

A minimal MCP memory server for LLM agents — and for people. No hidden LLM calls, no server to run. Just human-readable Markdown on disk, fully searchable.

stdio LanceDB / Tantivy Obsidian compatible Rust
~/.memory/entities/rust/anyhow-vs-thiserror.md
anyhow vs thiserror
entity: rust updated 3m ago
when to use each
Use [[thiserror]] for library crates — preserves typed errors for callers.
Use #anyhow in binaries where the goal is "bubble up and display".
related
01 — Principles

Three quiet decisions.

No lock-in, no background magic, no second source of truth. Your memory is a folder of Markdown files. Everything else is indexing on top.

01

No hidden LLM calls.

The calling model decides what to save and how to classify it. scrapwell stores and indexes — zero extra API cost per save.

02

Markdown as source of truth.

Every memory is a plain .md file. Browse, edit, or grep in any editor. No proprietary database, no migration risk.

03

Obsidian compatible.

Open the directory as a vault. Wikilinks resolve. Graph view shows how documents connect.

04

Ten tools over stdio.

Full CRUD for entities and documents, full-text search with highlighted snippets, tree browsing, and index rebuild.

05

Pluggable search backend.

Swap LanceDB and Tantivy via a single config field. Both live behind the same trait.

06

Entity → Topic → Document.

A three-level hierarchy keeps things organized without rigid schemas. Topics are optional and created on demand.

02 — Architecture

Three levels. No schema.

Entities are who or what. Topics group related threads. Documents are the Markdown files themselves. Markdown is the source of truth — SQLite and the search index are derived data, safe to delete and rebuild.

Level 1 — Entity

elasticsearch/

A subject of knowledge — a technology, project, library, or concept. Each entity is a top-level directory.

  • rust/
  • elasticsearch/
  • project-atlas/
Level 2 — Topic

mapping/

Optional. Groups related documents under an entity. Created on demand when an entity grows beyond ~7 documents.

  • mapping/
  • performance/
  • query-tuning/
Level 3 — Document

nested-dense-vector.md

Plain Markdown with YAML front-matter. Full-text indexed. Wikilinks resolved. SQLite and the search index are derived — delete them and run rebuild_index to regenerate.

nested-dense-vector.md
dynamic-templates.md
shard-sizing.md
reindex-strategy.md
03 — MCP tools

Ten tools over stdio.

Ten tools for storing, searching, and managing memories. No REST server, no auth dance — just MCP over stdio.

01list_memoriesTree-browse entities, topics, and documents.read
02get_memoryFetch a document by ID, with front-matter.read
03search_memoryFull-text search with highlighted snippets.read
04create_entityCreate a new entity with similar-name check.write
05update_entityUpdate entity scope, description, or tags.write
06delete_entityRemove an entity and all its documents (cascade).write
07save_memorySave a new document under an entity.write
08update_memoryPartial update of a document's title, content, or tags.write
09delete_memoryRemove a document and its search index entry.write
10rebuild_indexRebuild SQLite and search index from Markdown.admin
04 — Install

One binary. One folder.

Install with Homebrew or the shell installer, then wire it into Claude Code. That's it.

01 — install
# macOS (Homebrew)
$ brew install argonism/tap/scrapwell

# macOS / Linux (shell installer)
$ curl --proto '=https' --tlsv1.2 -LsSf \
  https://github.com/argonism/scrapwell/releases/\
latest/download/scrapwell-installer.sh | sh
02 — wire into Claude Code
$ claude mcp add scrapwell \
    --scope user \
    scrapwell serve

# optional: project-local memory root
# .scrapwell.toml at repo root:
root = "./memory"