The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Gather listing page.
Deterministic, attestable memory for AI coding agents.
This repo is the open integration surface for Gather, a multi-tenant org-memory service (an MCP server plus a REST API) with server-enforced tenant isolation and attestable, curated writes. The memory engine is a hosted service; this repo holds the client integrations (starting with the Claude Code plugin) so your harnesses use that memory automatically, instead of hoping the model remembers to.
| Path | What |
|---|---|
integrations/claude-code | The gather plugin: hooks + bundled MCP server + curation skills |
cli/ | The hunta CLI: gather, recall, verify, instinct (and the SDK-seed client) |
verify/ | @hunta/verify: offline Ed25519 verification of isolation-attestation receipts (verify, don't trust) |
examples/ | Drop-in config (raw mcpServers block for any MCP client) |
docs/ | Plugin reference: data flow, staging model, cost, metrics, troubleshooting |
More integrations (Codex, Agent SDK) land here over time.
Two lines, then a token:
Mint an agent key in the console (scoped to propose + recall, never to write canon), then point the plugin at your tenant:
Recall and capture are live on your next session. Full walkthrough: hunta.ai/get-started.
Not on Claude Code, or prefer raw MCP? Point any MCP client at the server directly
(see examples/mcp-config.json):
UserPromptSubmit hook queries your memory and injects the top
facts into the turn, so the agent starts with what it already knows.SessionStart(compact) hook re-runs recall so injected context
survives Claude Code's context resets.PreCompact and SessionEnd hooks post a content-free breadcrumb to
your staging inbox. The transcript is never uploaded./gather:flush reviews pending candidates; /gather:status
shows local recall hit-rate and latency.The principle is harness-enforced invocation: tool availability is not tool use. Agents do not reliably recall context or write learnings back on their own, so the hooks make it happen by construction, on every turn, without depending on the model's judgement.
Gather's differentiator is the write path: the writer never decides.
Always-on capture means you never lose a learning to a closed session; the staging wall means an unreviewed breadcrumb can never pollute the memory your agents read. Read more: the curation gate.
A slow or unreachable memory server never blocks or degrades a turn.
0 with no output:
inject nothing, continue.Worst case for a down server is a turn with no injected context, never a stalled turn.
Everything goes only to the GATHER_URL you configure. Recall sends the prompt text as a search
query; capture sends a breadcrumb (event, cwd, session id, timestamp) and never the transcript.
On the hosted service that endpoint is mcp.hunta.ai; on Estate it is your own deployment and nothing
leaves your infrastructure. Full data-flow table: docs/plugin.md.
| Gather | Typical memory API | |
|---|---|---|
| Write path | Curated: proposals reviewed before they enter canon | Direct writes |
| Isolation | Per-tenant crypto + RLS, with a signed proof you can run yourself | Claimed |
| Time | Bi-temporal (what was true, and when you learned it) | Last-write-wins |
Honest comparisons, including where we're behind: hunta.ai/compare.
Integrations and fixes welcome. See CONTRIBUTING.md and our Code of Conduct.