A downstream integrator filed issue #186 last week with a clean diagnosis: prime_context accepted plain text and embedded it server-side via the bundled fastembed model, but prime_embed and prime_recall insisted on a precomputed vector. An MCP agent — with no access to an embedding model — was therefore locked out of the two tools that actually populate and query the vector index. The shape of the problem was an API asymmetry, not a missing capability.
Fixing that opened up the next obvious gap: even with a working memory, you couldn't see it from anywhere except inside the conversation. We wanted users on www.all-source.xyz to watch Claude write to memory in real time.
Both ship in 0.21.4.
1. prime_embed and prime_recall accept text
Pass text alone and the server embeds it in-process via fastembed — same AllMiniLML6V2 model, 384 dims, no external embedding API. Pass vector if you already have one from a different model and Prime won't re-embed.
// MCP — Claude calling its own memory
{ "name": "prime_embed",
"arguments": {
"id": "node:concept:abc",
"text": "agents need persistent memory"
}
}
{ "name": "prime_recall",
"arguments": {
"text": "what do I know about memory?",
"depth": 1,
"top_k": 5
}
}The embedder is lazy-init via OnceLock: graph-only callers pay nothing, and the first text-embedding call in a process downloads AllMiniLML6V2 (~25 MB) into the fastembed cache. Subsequent embeddings take ~1–3 ms.
The same text field is now valid on the HTTP endpoints /api/v1/prime/vectors and /api/v1/prime/vectors/search, so non-MCP clients get the same affordance.
2. Sync local Prime to your tenant Core
prime-mcp learned two flags:
allsource-prime \
--data-dir ~/.prime/memory \
--sync-to https://api.all-source.xyz \
--api-key <your tenant API key>When both are set, a background loop drains prime.* events newer than a persisted cursor (<data_dir>/.prime_sync_cursor.json) and POSTs each to <remote>/api/v1/events with Bearer auth. The tenant is derived from the API key — same shape chronis uses.
Design tradeoffs worth naming:
- Push-only. Prime runs on your laptop; the remote can't reach it. One-direction sync is the only thing that actually works without NAT traversal, and it's the right shape for "show me what my agent is learning."
- Restart-resumable. The cursor file means restarts pick up where they left off instead of replaying the whole history.
- Outage-tolerant. Remote down? The loop logs and retries on the next tick. Your local Prime keeps working.
- No-op when off. Flag absent ⇒ zero background work. We didn't add a "you should be syncing" nag.
Mismatched flags (one of the pair without the other) hard-error at startup. Silent half-configurations are worse than loud failures.
3. Memory tab
www.all-source.xyz/dashboard/memory is the new tenant-panel view: live counts of nodes, edges, vectors; a nodes_by_type breakdown; and a recent-activity feed. All of it is derived from the prime.* events your sync loop is shipping. Same audit trail your Core already has — no separate database to babysit.
If you haven't enabled sync yet, the tab walks you through the install with copy-paste commands and links to /prime and the API keys page.
Install in 30 seconds
cargo install allsource-prime
# allsource-prime 0.21.4Claude Desktop (~/.claude/claude_desktop_config.json):
{
"mcpServers": {
"prime": {
"command": "allsource-prime",
"args": [
"--data-dir", "~/.prime/memory",
"--auto-inject",
"--sync-to", "https://api.all-source.xyz",
"--api-key", "<your tenant API key>"
]
}
}
}Claude Code:
claude mcp add prime allsource-prime \
--data-dir ~/.prime/memory \
--auto-inject \
--sync-to https://api.all-source.xyz \
--api-key <your tenant API key>Restart your client, ask Claude about something that doesn't exist yet, watch the Memory tab populate.
Links
- Landing page: www.all-source.xyz/prime
- MCP setup docs: www.all-source.xyz/docs/prime/mcp
- crates.io: allsource-prime
- Source:
apps/prime-mcp - Filed by: #186 — well-shaped report, the suggested API (
texton the existing tools) was the right shape.

