Ember
Uses the repository's Git history and metadata to mine decision-like commits, ADR-style decisions, and recent changes, and to guide Git-aware file scanning for indexing.
Supports OpenAI-compatible embeddings and chat-completion endpoints, enabling semantic embeddings for search and model-synthesized, cited answers when configured.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Emberwhere does scanning decide which files to skip? cite file:line"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Ember — a warm start for coding agents
Persistent, queryable memory for your codebase, over MCP.
Point Ember at a repo once; every coding agent you use (Alan, Claude Code,
Cursor, …) starts warm instead of cold — with semantic-ish search, a repo map,
a mined decision log, and answers that cite file:line.
Built at OpenFire 2026 (Alan AI's 24h open-source hackathon). MIT licensed, local-first, zero native dependencies.
The problem
Coding agents start every session cold. Architecture, conventions, and the reasons behind past decisions get reconstructed tool call by tool call — slowly, expensively, and often wrong. Humans carry that context implicitly.
Related MCP server: neurakeep
What Ember does
index_repo— scans a repo, splits code into symbol-aware chunks, embeds them, and builds a pure-TypeScript HNSW approximate nearest-neighbour index. Everything persists in<repo>/.ember/— no database, no daemon. Re-indexing is incremental: per-file hashes mean unchanged files keep their embeddings, only new/changed files are re-embedded, and deleted files drop out (--fullforces a from-scratch rebuild).search_code— rankedfile:linehits for natural-language queries.ask— answers questions with citations. With an OpenAI-compatible chat endpoint configured (e.g. open models via OpenRouter) answers are synthesized by the model; without one they are extractive (top chunks + citations). It never invents an answer source.repo_map— entry points, hub files (most referenced), key symbols, languages. The orientation pass an agent otherwise burns minutes on.decisions/recent_changes— the "why": decision-like commits and ADR-style docs, plus recent history.index_status— freshness and embedder info.save_note/recall_notes— cross-session agent memory: an agent leaves a short factual note (decision, gotcha, task state) and any later session — including a different agent — recalls it. Notes persist in.ember/notes.jsonl; recall is deterministic keyword matching.
Quickstart
npm install
npm run build
# index any repo
node dist/cli.js index --path /path/to/repo
# search it
node dist/cli.js search "how are neighbors selected in the vector index" --path /path/to/repo
# ask with citations
node dist/cli.js ask "where does scanning decide which files to skip" --path /path/to/repo
# repo orientation
node dist/cli.js map --path /path/to/repo
node dist/cli.js decisions --path /path/to/repo
# leave a note for the next session, and recall notes later
node dist/cli.js note "chose jwt over sessions; see auth.ts" --tags auth --path /path/to/repo
node dist/cli.js notes -q auth --path /path/to/repo
# re-index after edits: only changed files are re-embedded
node dist/cli.js index --path /path/to/repoUse it from your coding agent (MCP)
Ember speaks MCP over stdio. Add it to your agent's MCP config:
{
"mcpServers": {
"ember": {
"command": "node",
"args": ["/absolute/path/to/ember/dist/cli.js", "serve", "--path", "/path/to/your/repo"]
}
}
}Then ask your agent to call index_repo once, and repo_map / search_code
/ ask whenever it would otherwise grope around the tree.
Honest capability notes
Default embedder is lexical, not semantic. Out of the box Ember uses a deterministic hashing embedder (stemmed token overlap). It matches shared vocabulary well — code identifiers are meaningful — but it does not paraphrase. For true semantic embeddings, point Ember at any OpenAI-compatible
/embeddingsendpoint:export EMBER_API_BASE=https://openrouter.ai/api/v1 export EMBER_API_KEY=... export EMBER_EMBED_MODEL=<an open embedding model> export EMBER_EMBED_DIM=<its dimension> node dist/cli.js index --path /path/to/repo # rebuild with the new embedderStatus: this endpoint path is implemented but not yet live-tested; the offline default above is the verified configuration. A configured endpoint receives the text it embeds (code chunks and queries).
Answer synthesis needs a chat model. Set
EMBER_CHAT_BASE,EMBER_API_KEY(shared with embeddings), andEMBER_CHAT_MODEL(e.g. an open model likeqwen/qwen3-coderormeta-llama/llama-4-maverickvia OpenRouter) to get synthesized answers; otherwiseaskis extractive. Same status as embeddings: implemented, not yet live-tested.HNSW is exact HNSW, not a placeholder. M=16, efConstruction=200, diversity-preserving neighbor selection (paper alg. 4), serialized graph in
.ember/. Tests measure recall@10 vs brute force (>0.9 on clustered data).Incremental indexing is hash-based.
.ember/files.jsonstores a sha1 per file. Unchanged files keep their chunks and vectors; modified files are re-chunked and re-embedded; deleted files are removed. Switching embedders (kind or dimension) triggers an automatic full rebuild.Note recall is keyword matching.
recall_notesscores by unique query-term overlap - predictable and offline, not semantic.Local-first. The index never leaves your machine; network calls happen only when you configure an external endpoint.
How it fits together
src/core/scanner.ts git-aware file walk (skips deps, build output, binaries)
src/core/chunker.ts symbol-aware code chunking (falls back to windows)
src/core/embedder.ts pluggable embedders (offline lexical / HTTP endpoint)
src/core/hnsw.ts pure-TS HNSW index (cosine, diversity selection)
src/core/store.ts .ember/ persistence (chunks + vectors + graph + file hashes)
src/core/notes.ts cross-session agent notes (notes.jsonl)
src/core/engine.ts load + search
src/core/repomap.ts structure / entry points / hub files
src/core/decisions.ts decision log + recent changes from git
src/core/ask.ts cited answers (model or extractive)
src/mcp/server.ts MCP server (stdio)
src/cli.ts CLITests
npm test # 17 tests: hnsw recall, chunking, end-to-end index+search,
# notes persistence, incremental re-index, error paths,
# and a real MCP stdio session (mutations + restart recall)License
MIT © 2026 Daksh Patel
Built by Daksh Patel with AI assistance (Instinct agent): code, tests and docs were developed iteratively with an AI pair-programmer; all claims in this README reflect behavior verified by the test suite.
This server cannot be deployed
Maintenance
Related MCP Connectors
Shared memory for coding agents. Stop re-explaining your codebase every session.
Hosted MCP memory for coding agents: persistent across sessions, editable markdown, team sharing.
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
Long-term memory for AI coding agents: durable project facts, recalled by every MCP client.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides a persistent, local-first memory for coding agents over MCP, enabling automatic recall and recording of past work, failures, and decisions to reduce repetition and token usage.MIT
- AlicenseNot gradedqualityAmaintenanceProvides a local-first, source-cited memory layer for AI agents, with MCP tools to search, read, explain sources, and propose/apply memory updates.26 npm13Apache 2.0
- AlicenseNot gradedqualityBmaintenanceOffline-first, persistent repository memory for coding agents. Provides MCP tools for repository scanning, searching, context, and impact analysis, helping agents navigate and edit code efficiently.Apache 2.0
- AlicenseAqualityBmaintenanceEnables coding agents to store, search, and retrieve long-term memory as plain Markdown files with a disposable SQLite index, including note management, decision/bug tracking, and codebase symbol lookup via MCP.8MIT