VonderVuflya/Yggdrasil

๐Ÿง  Knowledge & Memory
0 Views
0 Installs

๐Ÿ ๐Ÿ  ๐ŸŽ ๐ŸชŸ ๐Ÿง - Durable, local-first memory for AI coding agents over MCP. Zero-dependency (pure Python + SQLite/FTS5), curated and semantically de-duped โ€” you own the data as plain rows. Works with Claude Code, Codex & any MCP host. uvx --from yggdrasil-memory ygg mcp

Quick Install

One-Click IDE Configuration
claude_desktop_config.json
{
  "mcpServers": {
    "vondervuflya-yggdrasil": {
      "command": "npx",
      "args": [
        "-y",
        "vondervuflya-yggdrasil"
      ]
    }
  }
}
Or

Using an AI coding agent (Claude Code, Cursor, etc.)? Copy a ready-made prompt that tells it to fetch the setup instructions and install this server for you.

Documentation Overview

๐ŸŒณ Yggdrasil

Stop re-explaining your project to every new AI session.
One local memory for Claude Code, Codex, and every MCP agent โ€” shared across sessions, tools, and projects. Zero dependencies. Nothing leaves your machine.

Latest release PyPI Glama quality score Benchmarks AGPL-3.0 alpha

Install ยท How it works ยท Numbers ยท Compare ยท FAQ

Read this in: ะ ัƒััะบะธะน ยท ็ฎ€ไฝ“ไธญๆ–‡ ยท Espaรฑol ยท Franรงais ยท ๆ—ฅๆœฌ่ชž ยท Deutsch


Yggdrasil โ€” a brand-new session already knows your project, and recalls a fix from another project

Every new chat, your AI forgets. You re-explain the project, the decisions, the gotchas โ€” every time, in every tool. Yggdrasil is a tiny always-on memory that any agent plugs into. Open a new session, in any project, with any AI, and it already knows what you decided, what broke, and what's still open.

$ cd ~/projects/checkout-api && claude        # a brand-new session

๐ŸŒณ Yggdrasil  (injected automatically at session start)
   โ€ข [project_status] payments refactor: idempotency keys added; open: e2e tests
   โ€ข [lesson] webhook 401 โ†’ signing secret rotated; update env + redeploy

> "have I solved a flaky websocket reconnect anywhere before?"

๐ŸŒณ recall โ†’ found in project `realtime-dash`:
   refresh the token *before* opening the socket, then retry with capped backoff.

No "let me remind you what we did yesterday." It's just there.

๐Ÿš€ Install

Two commands, inside Claude Code (the plugin launches via uv):

/plugin marketplace add VonderVuflya/Yggdrasil
/plugin install yggdrasil

The engine lazy-starts on first use and generates its own local token โ€” no API key, no cloud, nothing to configure. Codex and Cursor use the same flow.

All other channels โ€” CLI daemon, Homebrew, npm, Claude Desktop, from sourceโ€ฆ
Host / toolCommand
uvx (recommended CLI)uvx --from yggdrasil-memory ygg install
npm / npxnpx yggdrasil-memory install
pipxpipx install yggdrasil-memory && ygg install
pippip install yggdrasil-memory && ygg install
Homebrew (macOS)brew install VonderVuflya/tap/yggdrasil && ygg install
Claude Desktop (app)drag the .mcpb from the latest release onto Settings โ†’ Extensions, paste your token (ygg token) โ€” the desktop app then shares the same memory as your CLI agents (guide)
from sourceuvx --from git+https://github.com/VonderVuflya/yggdrasil.git ygg install

ygg install is a one-time guided setup: it installs an always-on background service, registers the MCP tools with every agent host it finds โ€” Claude Code, Codex, OpenCode โ€” and, if your hardware allows, recommends optional local models (or pick none to stay zero-config).

OpenCode โ€” nothing to configure

Install OpenCode first, then run ygg install (or ygg redeploy if Yggdrasil is already set up) โ€” the entry is written for you and merged into any existing opencode.json. Confirm with:

opencode mcp list        # -> โœ“ yggdrasil connected

Installed OpenCode after Yggdrasil? Just re-run ygg install.

If you'd rather write it by hand, note that OpenCode's schema differs from Claude's in four places at once โ€” servers live under mcp (not mcpServers), type is required, command is one array (not command + args), and env is environment (not env), so the Claude snippet won't port:

// ~/.config/opencode/opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "yggdrasil": {
      "type": "local",
      "command": ["/path/to/python3", "~/.yggdrasil/scripts/ygg_mcp_server.py"],
      "enabled": true,
      "environment": { "YGG_ENGINE_URL": "http://127.0.0.1:42069" }
    }
  }
}

No token goes in the config โ€” the engine reads the 0600 ~/.yggdrasil/token itself. Run ygg doctor if the tools don't show up.

There is also a yggdrasil-memory skill for any Claude surface: MCP connects the tools, the skill teaches the agent when to use them. Use both for the best behavior.

Try it with nothing installed and a throwaway DB: uvx --from yggdrasil-memory ygg serve --reset --db /tmp/ygg.sqlite.

Then just work: ask your agent "recall what we decided about this project", tell it "remember this decision" โ€” next session it's already there. Verify the install any time with ygg doctor.

Already have history? Seed memory from your existing Claude Code + Codex transcripts, Obsidian vaults, and CLAUDE.md repos โ€” distilled locally:

ygg seed --dry-run    # see what it would import; drop the flag to distill for real

Leaving another memory tool? ygg import --from mcp-memory --path memory.json pulls its whole store into Yggdrasil (deduped, secret-guarded) โ€” then you can delete it.

Why

  • ๐Ÿง  Persistent โ€” decisions, lessons, and project status survive across sessions.
  • ๐Ÿ”Œ One brain, every tool โ€” Claude Code, Codex, OpenCode, and any MCP host share the same memory.
  • ๐ŸŒ Cross-project recall โ€” "this looks like what you did in project B โ€” reuse it?"
  • ๐Ÿงน Curated, not captured โ€” your agent saves the few things that matter; governance dedupes and archives, never deletes.
  • ๐ŸŒฑ Self-maintaining (opt-in) โ€” a small local model consolidates memory in the background. Zero API tokens.
  • ๐Ÿชช One identity everywhere โ€” an optional name and persona every agent picks up, so Claude Code and Codex feel like the same assistant.
  • ๐Ÿ”’ 100% local โ€” your memory lives on your machine. No cloud, no account, no telemetry.

๐Ÿง  How it works

Yggdrasil is memory + tools โ€” the intelligence is your LLM. It just makes sure the right memory is in front of the right agent at the right moment.

  • ๐Ÿ›Ž๏ธ Always-on daemon โ€” a tiny local service (~21 MB RAM) your agents reach over MCP tools (ygg_search, ygg_recall, ygg_remember โ€ฆ).
  • ๐Ÿช Hooks โ€” session start auto-injects identity, project status, and open follow-ups (~300 tokens); an optional per-prompt hook auto-recalls memory relevant to each request.
  • ๐Ÿ“Œ Ranking โ€” pinned and frequently-recalled memories surface first.
  • ๐Ÿงน Governance โ€” duplicates and conflicts are queued for review; changes are non-destructive (archive, never delete).
  • ๐Ÿ““ Obsidian โ€” every memory doubles as a plain-Markdown note you can read, edit, and grep.

๐ŸŽ›๏ธ Memory tiers โ€” zero-config by default

Out of the box, Yggdrasil runs on SQLite + FTS5 with zero dependencies โ€” instant keyword search, no models, nothing to download. Optional local models via Ollama add two independent tiers:

TierYou addYou gain
0 ยท defaultnothing โ€” SQLite + FTS5keyword search, zero deps, instant โ€” recall@1 = 0.77
1 ยท semantican embedding model (all-minilm 45 MB ยท paraphrase-multilingual ~560 MB)search by meaning, across languages โ€” recall@1 = 0.94, recall@3 1.00
2 ยท self-maintaininga small LLM (qwen2.5:1.5b ~1 GB)background dedupe/merge of memory (propose-only)

Ollama only computes vectors and runs the background model โ€” every memory and every vector stays in the same local SQLite. ygg install detects your hardware and recommends a fit (ygg recommend shows the full catalog).

Full model menu

Embeddings (semantic search):

ModelSizeGood for
all-minilm45 MBEnglish, tiny & fast
nomic-embed-text274 MBEnglish, better quality (768d)
mxbai-embed-large670 MBEnglish, high quality (1024d)
paraphrase-multilingual~560 MBmultilingual (EN/RU + 50 langs, 768d)
bge-m31.2 GBmultilingual, top quality (heavier)

Embedding backend โ€” Ollama by default. To use an OpenAI-compatible /v1/embeddings server instead (llama.cpp's llama-server --embeddings, OpenRouter, LM Studio, vLLM), set embed_backend:

# local llama.cpp โ€” no key needed
ygg config set embed_backend openai
ygg config set embed_url http://127.0.0.1:8080/v1
ygg config set embed_model bge-small-en-v1.5
ygg redeploy

# OpenRouter โ€” free embeddings, no GPU needed
ygg config set embed_backend openai
ygg config set embed_url https://openrouter.ai/api/v1
ygg config set embed_model nvidia/llama-nemotron-embed-vl-1b-v2:free
ygg config set embed_api_key sk-or-...    # or export YGG_EMBED_API_KEY
ygg redeploy

The key is stored in ~/.yggdrasil/embed_api_key (0600) rather than config.json, and reaches the daemon as a file path โ€” so it never shows up in ps, the launchd plist or the systemd unit. ygg config list masks it.

Check it took with ygg doctor โ€” dense should name your model:

โœ“ dense    active (nvidia/llama-nemotron-embed-vl-1b-v2:free)
OpenRouter: two settings that will bite you

1. Use an inference key, not a provisioning key. Keys from openrouter.ai/settings/provisioning-keys can only mint other keys โ€” embedding calls with one return a baffling 401 User not found. Create a normal key at openrouter.ai/settings/keys instead.

Note that GET /api/v1/models answers 200 OK for any key, valid or not โ€” it ignores auth entirely, so it can't tell you whether your key works. Check GET /api/v1/key instead: it returns is_provisioning_key, and fails outright on a bad key.

2. Privacy settings silently hide most models. If a model 404s with All providers have been ignored, the model is fine โ€” your account is filtering out every provider that serves it. Fix it at openrouter.ai/settings/privacy. That filter is also why openai/text-embedding-3-* can come back 403 on a provider's terms of service.

Browse what's actually available at openrouter.ai/models?output_modalities=embeddings (26 models at the time of writing). Useful ones:

ModelPrice / 1M tokens
nvidia/llama-nemotron-embed-vl-1b-v2:free$0
perplexity/pplx-embed-v1-0.6b$0.004
intfloat/multilingual-e5-large$0.01 โ€” multilingual
google/gemini-embedding-2$0.20

Staying local still wins on quality and privacy: on the 232-memory / 110-query corpus, local paraphrase-multilingual scores recall@1 0.964 vs 0.946 for the free hosted model โ€” and your memories never leave the machine. Reach for a hosted backend when the box can't run Ollama, not to chase accuracy.

Bigger vectors do not buy accuracy here โ€” on the same corpus mxbai-embed-large (1024d) scores 0.809 and nomic-embed-text (768d) 0.818, a difference their confidence intervals swallow whole. What actually moves the number is whether the model handles your languages: both are English-only and collapse to 0.40โ€“0.45 on cross-language queries, where the multilingual default holds 0.95.

Background consolidation (small LLM):

ModelSizeGood for
qwen2.5:0.5b~400 MBtiny, fast on CPU
qwen2.5:1.5b~1 GBbest CPU default
llama3.2:3b~2 GBbetter quality, slower on CPU

The engine itself is swappable โ€” any service meeting the MemoryBackend contract is a drop-in (YGG_ENGINE_URL); see docs/backend-boundary.md.

๐Ÿ“Š The numbers

Measured by eval/ygg_eval.py โ€” 232 memories, 110 labelled queries, ranking weights tuned on the dev split only, so holdout is the unbiased number (recall@1, with the paraphrase-multilingual model):

Search viewholdout recall@1recall@3zero-dep lexical
Within a project (the real path, pool ~11)0.941.000.76
Whole store (no filter, pool 232)0.720.870.69

Within a project โ€” the path you use โ€” the right memory is #1 for 0.94 of queries and in the top 3 every time (recall@3 = 1.00). Searching the whole store with no filter is harder (recall@1 0.72, recall@3 0.87 across all 232). Zero-dep lexical mode already solves keyword and code-identifier queries (1.00); the local model adds meaning and cross-language (crosslingual 0.25 โ†’ 0.95). The full breakdown in BENCHMARKS.md has 95% CIs, pool sizes, and per-class scores โ€” rerun it in a minute: python3 eval/ygg_eval.py --report.

๐Ÿ†š Yggdrasil vs the rest

Everyone else either auto-captures transcripts or sells you a cloud. Yggdrasil's bet: keep the few things that matter, curated and de-duped, in plain rows you own โ€” and share them across every tool and project.

YggdrasilBuilt-in memory (Claude Code ยท Codex)claude-memmem0 / OpenMemorybasic-memory
Curated decisions / lessons / status (not transcripts)โœ…โš ๏ธ auto-notesโŒ captures everythingโš ๏ธโš ๏ธ free-form notes
One memory across toolsโœ…โŒ vendor-siloedโœ…โœ…โœ…
Cross-project recall ("solved this in project B")โœ…โŒ repo-scopedโš ๏ธโš ๏ธโš ๏ธ
100% local by defaultโœ…โœ…โš ๏ธ cloud sync add-onโŒ hosted-firstโœ…
Zero dependencies (stdlib + SQLite)โœ…โ€”โŒ Node + Bun + worker daemonโŒ Docker + Qdrant + LLM keyโŒ
Works with no LLM & no API keyโœ…โœ…โŒ AI-compressesโŒโœ…
Semantic search, fully localโœ… opt-in OllamaโŒ grep-onlyโš ๏ธ optional Chromaโš ๏ธ needs API key or Docker stackโŒ
Plain Markdown you own (Obsidian-ready)โœ…โœ…โŒโŒโœ…

Closest neighbor โ€” claude-mem: capture-everything memory that records and AI-compresses every session (Node 20+ and Bun, a persistent worker daemon; Chroma optional). Yggdrasil is the opposite bet: a small, high-signal store instead of a growing firehose. mem0 is an SDK plus a hosted platform for building apps that remember their users โ€” even self-hosted it needs an LLM API key. Built-in memories are genuinely useful โ€” and structurally siloed: one vendor, one repo, one machine, literal grep. Yggdrasil is the layer above them (and ygg seed can bootstrap itself from those same transcripts). Different layer entirely: context-mode (live context window) and Context7 (fresh library docs) โ€” both pair fine with Yggdrasil.

๐Ÿงฐ Commands

Agents see six MCP tools: ygg_health, ygg_bootstrap, ygg_search, ygg_recall, ygg_remember, ygg_materialize โ€” auto-registered by the plugin or ygg install.

Full ygg CLI reference

Memory ops

CommandWhat it does
ygg recall --query "โ€ฆ"Cross-project search โ€” "have I done this anywhere?"
ygg search --project P --query "โ€ฆ"Project-scoped search (--type, --tag, --limit, --json)
ygg remember --project P --type lesson --content "โ€ฆ"Save a durable memory (secret-guarded, deduped)
ygg bootstrap --project PPull a project's memory before starting work
ygg pin --id ID ยท ygg unpin --id IDPin a memory so it reliably surfaces
ygg relate --from A --rel solves --to B ยท ygg relations --id IDLink memories (solves/supersedes/contradicts) ยท see why a memory exists / what replaced it
ygg supersede --id OLD --by NEWArchive an outdated memory โ€” --by records what replaced it
ygg materialize --id ID --project PExport one memory to an Obsidian note
ygg export-native --project PWrite a curated digest into AGENTS.md/MEMORY.md โ€” feed Claude Code & Codex's native memory
ygg import --from TOOL --path PMigrate another memory tool's store into Yggdrasil (mcp-memory, basic-memory; --dry-run first)
ygg review [--apply]Work the governance queue โ€” consolidate duplicates, flag stale/conflicting memories (archive-only, reversible)
ygg delete --id ID ยท ygg reset โ€ฆHard-delete one memory ยท bulk-undo a bad seed (confirms first)

Cold start

CommandWhat it does
ygg seedDistill Claude Code + Codex transcripts, Obsidian vaults, CLAUDE.md repos โ€” incremental, deduped, fully local
ygg seed --dry-run ยท --forceDiscover + estimate only ยท re-distill everything
ygg seed --schedule 03:30Nightly auto-distill (launchd) โ€” memory keeps itself fresh; off / status
ygg sync --repo <your-git-repo>Sync memory across machines through your own git repo โ€” plain JSON files, no cloud in the loop
ygg distill --source PATHDistill one dir/file into lessons
ygg reindexBackfill missing embeddings (restores dense recall)

Service & setup

CommandWhat it does
ygg install ยท ygg doctor ยท ygg updateGuided setup ยท diagnose with actionable fixes ยท upgrade
ygg configShow/set persistent settings (list ยท get ยท set ยท unset)
ygg status ยท start ยท stop ยท restart ยท logsManage the always-on daemon
ygg hooks ยท unhooks ยท registerSessionStart hook on/off ยท (re)register MCP
ygg recommend ยท token ยท uninstallModel catalog ยท print auth token ยท remove everything

Give it a personality โ€” edit ~/.yggdrasil/identity.json:

{ "name": "Jarvis", "persona": "concise, proactive, dry wit", "user_facts": ["prefers TypeScript", "ships small PRs"] }

Heavy seeding, weak laptop? Point distillation at any box on your LAN โ€” a desktop with Ollama, LM Studio, llama.cpp, even an iPhone running a local-LLM server app: ygg config set distill_url http://<box>:11434. Yggdrasil auto-detects the API dialect (Ollama or OpenAI-compatible); your data still never leaves your network โ€” details in docs/ygg-cli.md.

โ“ FAQ

Claude Code already has built-in memory โ€” why Yggdrasil?

Built-in memories are per-vendor, per-repo, per-machine, and retrieved by literal text match. Yggdrasil is the layer above: the same memory in Claude Code, Codex, and any MCP host, recall across projects, optional semantic search โ€” still 100% local. It bridges them both ways: ygg seed distills your existing native memory + transcripts into the shared brain, and ygg export-native writes a curated digest back into AGENTS.md/MEMORY.md โ€” so even a fresh clone or a tool without Yggdrasil still gets your curated memory.

Does it send my code or memory to the cloud?

No. The engine, the database, and the optional models all run locally. No account, no telemetry. The only outbound call is a version check against PyPI.

Does it automatically remember everything?

No โ€” by design. Retrieval is automatic; writing is deliberate (the agent calls ygg_remember for durable lessons). Capture-everything pollutes memory and burns tokens, so we don't. The optional background model consolidates what's already saved (propose-only).

Do I need a GPU or an API key?

No. The default is pure lexical search โ€” zero dependencies, instant. Semantic search is opt-in and uses a local model via Ollama. The installer recommends one that fits your hardware.

How heavy is it, and what does it cost in tokens?

The engine idles at ~21 MB RAM (lexical default) with ~0% CPU; disk is tens of KB per memory. Session start injects ~300 tokens; each tool call returns a small snippet. All heavy work (indexing, embeddings, consolidation) runs off-LLM on your machine.

Can I edit or delete memories by hand?

Yes. Memories materialize to Markdown notes in an Obsidian vault โ€” read, edit, or remove them like any file. The engine never hard-deletes; it archives (reversible).

๐Ÿšฆ Status & roadmap

Alpha. The happy path and the governance loop are gate-tested (scripts/run_gates.sh); not yet hardened for multi-user or production use. macOS today; Linux/Windows service installers are built and in final on-device testing.

Next: ๐Ÿ›ฐ๏ธ cross-surface sync (one memory across CLI, web, and phone) ยท ๐Ÿ”— relation graph (SOLVES / SUPERSEDES / CONTRADICTS) ยท ๐Ÿง Linux/Windows GA.

๐Ÿค Contributing

Issues and PRs welcome. Run scripts/run_gates.sh and python3 -m unittest discover -s tests before submitting โ€” all gates must stay green.

๐Ÿ“œ License

GNU AGPL v3.0 โ€” see LICENSE. Free and open source: use, modify, self-host, redistribute. If you modify it or offer it as a network service, you must release your source under the same license.

Related MCP Servers

modelcontextprotocol/server-memoryVerified

๐Ÿ“‡ ๐Ÿ  - Knowledge graph-based persistent memory system for maintaining context

๐Ÿง  Knowledge & Memory2 views
0xshellming/mcp-summarizer

๐Ÿ“• โ˜๏ธ - AI Summarization MCP Server, Support for multiple content types: Plain text, Web pages, PDF documents, EPUB books, HTML content

๐Ÿง  Knowledge & Memory0 views
20alexl/claude-engram

๐Ÿ ๐Ÿ  - Persistent memory and session intelligence for Claude Code. Auto-tracks mistakes, decisions, and context via hooks. Mines session history for patterns and cross-session search. Loop detection, pre-edit warnings, context compaction survival. Runs locally with Ollama.

๐Ÿง  Knowledge & Memory0 views
a2cr/a2cr

๐Ÿ โ˜๏ธ ๐Ÿ  ๐ŸŽ ๐ŸชŸ ๐Ÿง - MCP server for AI-agent handoffs. Saves client-encrypted WorkBaton checkpoints and WorkStash notes so Codex, Claude Code, Roo Code, and other MCP clients can resume work without passing full chat history.

๐Ÿง  Knowledge & Memory0 views

Engagement

Views
0
Installs
0
Upvotes
0

Views and upvotes are unique per visitor network (hashed IP). Installs count copy actions.

Status

Health: Not checked yet

We have not completed a health check for this listing yet.

No check timestamp yet.

Unclaimed listing (imported or pending owner verification). Claim it โ†’
โ˜… Spotlight Slot

Feature Your MCP Server

Get maximum visibility for your server across our directory, search results, and detail pages.

Spotlight Your Server

Own this project?

This directory is pre-filled from public sources. Claim via GitHub README, site badge, or DNS TXT to get the verified badge and attach your website.

Claim this listing

Promote this listing

Optional paid placement. Free listings stay free forever.

Share & Embed

Add our SVG badge (dark/light directory styles) or embeddable widget to your site.