Local-first agent memory over SQLite: remember, recall, link, forget. Degrades, never fails.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
A shared memory layer for personal agents, across devices. tether is an
MCP server backed by a local SQLite file. Any
MCP-compatible agent can remember, recall, link, and forget durable notes
β facts about you, your projects, your preferences β so context follows you
instead of dying with each session.
It runs local-only with zero configuration. Point it at a hosted libSQL/Turso primary and the same file becomes an embedded replica that syncs your memory across every device in near-real-time.
The near future is personal agents living across many devices β laptop, desktop, phone. For that to feel like one assistant rather than several amnesiac ones, memory has to be a substrate that follows you: readable and writable from every device and from any agent, not siloed inside a single tool.
tether is that substrate. It is deliberately a convenience layer β it makes an
agent more useful when present, and never breaks the agent's work when degraded.
v0.6.1. The core (four memory verbs + boot index + FTS5) shipped in v0.1; since then recall has grown a semantic arm, consolidation, an associative usage graph, a self-organizing store, and opt-in crystallization β each additive and each degrading cleanly to plain keyword recall. Every feature below is implemented.
Design and rationale start at
docs/superpowers/specs/2026-07-03-tether-design.md;
the associative core, seed-dominant recall, self-organizing store (Tier B1), and
crystallization (Tier B2) each have their own design doc under
docs/superpowers/specs/, with matching plans in
docs/superpowers/plans/.
remember Β· recall Β· link Β· forget. (Enabling
crystallization adds one reflection-control tool, dismiss_cluster β not a
memory operation.)updated_at, plus a via
receipt saying why each hit surfaced) so an agent can judge staleness and
cite what it updates. body is a query-centered excerpt, not the whole
memory β see Excerpts.remember/recall calls at once gets atomic, correctly-reported results;
see Performance and durability.Requires Python β₯3.10 on Linux, macOS, or Windows.
Register it with Claude Code β with uv:
β¦or install it first:
(The package is named tether-memory on PyPI β tether was already reserved
as a common brand name. tether in claude mcp add tether -- ... is just the
label Claude Code uses to refer to this server; it doesn't need to match the
installed command.)
Or add it as a Claude Code plugin (this repo doubles as a one-plugin
marketplace; the plugin runs uvx --from 'tether-memory[semantic]', so
semantic recall comes along):
It is also listed in the MCP Registry
as mcp-name: io.github.sidyellur/tether.
By default memory lives in a local SQLite file at
~/.local/share/tether/memory.db β on Windows,
%LOCALAPPDATA%\tether\memory.db (override either with TETHER_DB, or set
XDG_DATA_HOME, which is honored on every platform). No accounts, no
network β this is the whole tool for a single machine.
tether knows which project it is serving: Claude Code sets
CLAUDE_PROJECT_DIR in every MCP server's environment, and tether takes the
directory's name as the project (override or disable with TETHER_PROJECT).
That drives three things, none of which need configuration:
# This project (<name>) section, then # Everything else, so the
agent starts a session already looking at the decisions and gotchas for the
repo it is in rather than whatever you touched last, anywhere.project, feedback and
reference memories get a proj:<name> tag unless the agent passes a
proj: tag itself. user memories are about you, not the work, and stay
global. The tag is an ordinary tag: recall(tags="proj:<name>") lists a
project's memories deterministically.| Var | Default | Effect |
|---|---|---|
TETHER_PROJECT | basename of CLAUDE_PROJECT_DIR | name the project explicitly; off disables project awareness |
Nothing falls back to the working directory: outside Claude Code (or with
TETHER_PROJECT=off) tether behaves exactly as before.
Point tether at a Turso / libSQL database and the local file becomes an embedded replica β local-speed reads, writes that propagate to your other devices. Install the extra and set two env vars:
If the backend is unreachable, tether logs sync offline and keeps working
against the local file. Sync is a single-primary design: every write goes to
the hosted primary and replicas only pull, so a device that was merely
offline catches up (including tombstones from forget) on its next pull and
can never resurrect a memory another device forgot. The one gap: writes made
while degraded land only in that device's local file and are not merged
back later (#99 tracks reconciliation).
Writes push immediately. Reads also pull, debounced to at most once every
TETHER_SYNC_READ_INTERVAL seconds (default 30) β so a device that only
asks things still sees what your other devices wrote, instead of staying
frozen at its own startup state until it happens to write something. The
read-path pull is bounded much more tightly than the write-path one: if the
backend is slow, the recall returns local data and the pull lands for the
next read rather than making you wait.
| Var | Default | Effect |
|---|---|---|
TETHER_SYNC_READ_INTERVAL | 30 | seconds between read-path pulls; 0 = only sync on writes |
TETHER_DEVICE_ID | hostname | the device id recorded on each memory (and the default TETHER_AUTHOR) |
One thing to know about replicas: libSQL forwards every write to the
hosted primary, and with the associative graph on (the default) recall
writes too β it records what was recalled together so memories can wire up
over time. On a replica that makes each recall a few network round-trips on
top of the local search. If that matters more to you than learned
associations, TETHER_ASSOC=0 makes recall read-only again.
The keyword arm is SQLite FTS5 over title, body and tags, ranked by bm25. Ask
in plain language: a memory that contains some of the query's words is a
hit, and one that contains more of them ranks higher, so "how do we run the
integration tests?" finds the note that says "pytest runs the tests" (common
function words are ignored). The index stems English words, so tests
matches test and deciding matches decided. Stemming is English-only;
turn it off for a store in another language and tether rebuilds the index
on the next start.
| Var | Default | Effect |
|---|---|---|
TETHER_FTS_STEMMING | on | set 0/false/off to index words exactly as written |
Measured on the LoCoMo long-conversation benchmark (one memory per dialogue turn, 1,536 questions, "did recall return the turns that answer it" in the top 10), the keyword arm alone finds the evidence for 61% of questions, against 54% for a textbook BM25 over the same text. That harness ships in the repo β see Benchmarks.
By default recall is hybrid: keyword (FTS5) results are fused with
semantic (vector) results, so a query finds relevant memories even when the
exact words differ ("automobile" recalls a note about your "car"). Semantic
recall runs a small static embedding model locally β no network, no API
key, nothing to hang on. Install the extra:
Without the extra (or with TETHER_SEMANTIC=0), tether runs keyword-only
FTS5 β semantic is a pure add-on and never a requirement. The first run embeds
existing memories once (a one-time backfill); after that it is incremental.
Environment:
| Var | Default | Effect |
|---|---|---|
TETHER_SEMANTIC | on | set 0/false/off to force keyword-only recall |
TETHER_EMBEDDING_MODEL | minishlab/potion-base-8M | override the local static model |
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/tether)<a href="https://allmcps.com/mcp/tether"><img src="https://allmcps.com/api/badge/tether?style=directory" alt="Tether on AllMCPs" /></a>