Skip to main content
ClaudeWave

Local MCP server that captures the why behind your code — domain knowledge for Claude, Cursor, Copilot, and any MCP agent.

MCP ServersOfficial Registry4 stars0 forksTypeScriptApache-2.0Updated today
Install in Claude Code / Claude Desktop
Method: Manual
Claude Code CLI
git clone https://github.com/mashware/domain-memory
claude_desktop_config.json (Claude Desktop)
{
  "mcpServers": {
    "domain-memory": {
      "command": "node",
      "args": ["/path/to/domain-memory/dist/index.js"]
    }
  }
}
1. Run the command above in your terminal (Claude Code), or paste the JSON config into claude_desktop_config.json (Claude Desktop).
2. Replace any <placeholder> values with your API keys or paths.
3. Restart Claude. The MCP server and its tools appear automatically.
💡 Clone https://github.com/mashware/domain-memory and follow its README for install instructions.
Use cases

MCP Servers overview

# Domain Memory

![domain-memory](https://socialify.git.ci/mashware/domain-memory/image?description=1&font=Raleway&language=1&name=1&owner=1&stargazers=1&theme=Auto)

[![CI](https://github.com/mashware/domain-memory/actions/workflows/ci.yml/badge.svg)](https://github.com/mashware/domain-memory/actions/workflows/ci.yml)
[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
[![Node.js](https://img.shields.io/badge/node-%3E%3D20-43853d.svg)](https://nodejs.org/)
[![MCP](https://img.shields.io/badge/MCP-compatible-8A2BE2.svg)](https://modelcontextprotocol.io/)
[![GitHub stars](https://img.shields.io/github/stars/mashware/domain-memory?style=flat)](https://github.com/mashware/domain-memory/stargazers)

A local MCP server that accumulates the **business-domain knowledge** of a software project — flows, integrations, decisions, nuances — and makes it available to any MCP-compatible agent (Claude Code, Cursor, Copilot, Gemini, OpenCode).

The goal is to capture the **why** behind the code: the stuff a new developer would need six months from now to understand why a thing is built the way it is. The **what** is already in the code — domain-memory does not duplicate it.

> **Status**: Functional. Local install, single developer, local SQLite.

## What this is

Domain Memory is a **living glossary of your project's business domain** — the concepts, rules, entities, and the *why* behind decisions — that grows as you build. The frame that matters: this is **semantic memory** (what "a German invoice" or "a deactivated account" means in your project, and why it behaves the way it does), not **episodic memory** (what you changed last Tuesday and in which commit). The episodic record already lives in git history; Domain Memory holds the part no diff captures.

You don't stop to write documentation. As the agent works it records findings on its own, and they are folded into the glossary when you run `/save-knowledge` or open a pull request — so the knowledge accrues from real work instead of becoming a separate authoring chore you have to remember.

Everything is **plain markdown you own and version in git**. Each entry is a human-readable file under `.domain-memory/`; the search index is derived from those files and can be rebuilt from them at any time, so the knowledge stays portable, reviewable in a pull request, and never locked inside a database.

If what you want is a history of work sessions, cross-machine sync, or generic per-user assistant memory, this is deliberately not that. Domain Memory stays narrow on purpose: the domain knowledge of one project, and nothing else.

## How is this different from…

Domain Memory occupies a narrow niche. The closest neighbours and where it differs:

| Tool | What it stores | Scope |
|---|---|---|
| **Domain Memory** | Business-domain knowledge — the *why* behind the code, decisions, integrations, flows | Per-project, local, source-controlled markdown |
| `mem0`, `letta` | Conversation / agent memory — what the user said, preferences | Per-user, cross-conversation |
| RAG over docs (`continue.dev`, custom pipelines) | Whatever text you embed (READMEs, Confluence, code) | Reuses existing artefacts; no new authoring layer |
| `CLAUDE.md` / `AGENTS.md` | A single hand-written context file | One file, no structure, no search |

If you're asking "where does the agent remember that I prefer dark mode?", you want `mem0`. If you're asking "where does the agent remember that we deliberately bypass tax validation for German invoices because of the 2024 ruling?", you want this.

---

## How it works

Three principles run the whole system:

1. **The LLM is the criterion, the MCP is the store.** All judgment calls — "does this contradict existing knowledge?", "is this worth remembering?" — live in the agent. The server just persists, searches, and reports. Semantic reasoning never happens in SQL.
2. **Markdown on disk is the source of truth.** Every entry is a human-readable `.md` file under `.domain-memory/knowledge/`. SQLite is a derived index that can be rebuilt from disk at any time (`domain-memory reindex`).
3. **Failures are silent.** A down embedder, a slow query, a corrupted staging line — none of it is ever surfaced to the agent session. If domain-memory cannot help, it stays out of the way.

### Unit of knowledge: Feature + Aspects

The unit is the **feature** (`checkout`, `auth`, `notifications`, `search`…). Each feature is one directory with a `feature.md` and optional `aspects/` underneath:

```
.domain-memory/knowledge/
  checkout/
    feature.md           ← high-level prose + Mermaid of the whole flow
    aspects/
      taxes.md           ← specific subtopic
      stripe.md
      webhook.md
```

A feature is the **primary context**: the general Mermaid diagram in `feature.md` typically answers 70% of questions. Aspects are loaded on demand when the agent needs detail on a specific slice.

Each entry carries three layers:
- **What it does** — short prose (no code duplication).
- **How it flows** — a Mermaid diagram (mandatory for flows and integrations).
- **Where it lives** — `file_paths` + qualified symbol names.

### Per-branch staging

While you work, the agent appends **findings** to `.domain-memory/staging/<branch>.jsonl`. Findings survive session compaction, browser closes, new sessions on the same branch — indexed by git branch, not by session id. When you open a PR or run `/save-knowledge`, the staging is consolidated into real entries.

If you sometimes push without going through the agent, those findings can sit unconsolidated. The optional **pre-push reminder** closes that gap: `domain-memory install --git-hook` writes a non-blocking `.git/hooks/pre-push` that prints a one-line nudge when the branch you are pushing still has staged findings. It never blocks the push, stays silent when there is nothing to consolidate, and is a no-op if the CLI is not on `PATH`. It is opt-in — plain `install` asks before touching `.git/hooks`.

### Triple matcher

`search_knowledge` runs three matchers in parallel and fuses them:

1. **Embedding** (semantic, local Transformers.js with all-MiniLM-L6-v2, no API key).
2. **BM25** (SQLite FTS5, for exact keyword matches).
3. **Path / symbol** (exact + basename + short-symbol, resilient to renames).

The fusion is weighted: path = 0.5, embedding = 0.3, bm25 = 0.2. Path/symbol is weighted strongest because it is the most reliable signal when two pieces of knowledge are about the same code.

### Drift

Every entry stores SHA-256 hashes of the files it references. On PR open, the agent cross-references the PR's touched files against the knowledge store via `check_drift` and asks the developer to review any affected entries. Rename/move is absorbed by matching on basename and short symbol; deletes are caught on the next reindex.

### Lazy confidence decay

Every entry has a `confidence` (0–100) that decays **-5 points every 30 days** without verification. Computed lazily at read time — no scheduled job, always consistent with the wall clock. Below 50 the entry shows up red in `/stale` and the web viewer. A human review resets it with `domain-memory verify <id>`.

---

## Install

Two ways to run it. Pick the one that matches what you're trying to do.

### Just the MCP server (most common)

Add it to your MCP client's config. No global install needed — `npx` fetches and runs it on demand.

```json
{
  "mcpServers": {
    "domain-memory": {
      "command": "npx",
      "args": ["-y", "@mashware/domain-memory-server"]
    }
  }
}
```

That goes in `.mcp.json` (Claude Code), `.cursor/mcp.json` (Cursor), `.vscode/mcp.json` (Copilot), `.gemini/settings.json` (Gemini), or `opencode.json` (OpenCode).

Restart your client. From then on the agent will call `search_knowledge` at the start of each session.

### Server + CLI (web viewer, install helper, drift checks)

If you also want the `domain-memory` CLI (to bootstrap entries, run the web viewer, check drift, etc.):

```bash
npm install -g @mashware/domain-memory
```

This installs three commands globally: `domain-memory`, `domain-memory-server`, `domain-memory-web`. Then in any project:

```bash
cd /path/to/your/project
domain-memory install      # writes the MCP config + pointer blocks for the clients you use
domain-memory doctor       # sanity check
domain-memory web          # open the viewer at http://localhost:4373
```

`install` is idempotent — re-running updates files in place without clobbering your content.

### Updating

```bash
npm update -g @mashware/domain-memory
```

### Uninstalling

```bash
npm uninstall -g @mashware/domain-memory
```

To remove domain-memory from a specific project: delete `.domain-memory/`, remove the `<!-- domain-memory:start -->` block from the client instruction files, and drop the `domain-memory` entry from `.mcp.json` / `.cursor/mcp.json` / `.vscode/mcp.json` / `.gemini/settings.json` / `opencode.json`. If you installed the pre-push reminder, also remove the `# >>> domain-memory pre-push >>>` block from `.git/hooks/pre-push` (or delete the file if it contains nothing else).

### From source (contributors)

If you want to hack on the project itself, see [CONTRIBUTING.md](CONTRIBUTING.md) for the clone-and-link dev workflow.

---

## CLI commands

| Command | What it does |
|---|---|
| `domain-memory install` | Interactive setup. Detects which MCP clients the project uses and writes pointer blocks, MCP registrations, and `.gitignore` entries idempotently. Pass `--git-hook` to also install the pre-push reminder without prompting. |
| `domain-memory bootstrap [--source-root path]` | Scan a mature project and write `.domain-memory/bootstrap-plan.md` — a checklist of candidate features for the agent to process with you. Prints a ready-to-paste prompt. See "Mature projects" below. |
| `domain-memory enrich <id\|slug>` | Print a guided prompt to deepen an existing feature entry. Useful for ritualized "spend 20 minutes improving checkou
ai-agentai-agentsclaudeclaude-codecopilotcursordomain-knowledgeknowledge-basellmlocal-firstmcpmcp-servermodel-context-protocolsqlitetypescript

What people ask about domain-memory

What is mashware/domain-memory?

+

mashware/domain-memory is mcp servers for the Claude AI ecosystem. Local MCP server that captures the why behind your code — domain knowledge for Claude, Cursor, Copilot, and any MCP agent. It has 4 GitHub stars and was last updated today.

How do I install domain-memory?

+

You can install domain-memory by cloning the repository (https://github.com/mashware/domain-memory) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.

Is mashware/domain-memory safe to use?

+

mashware/domain-memory has not been audited yet by our security agent. Review the original repository on GitHub before using it in production.

Who maintains mashware/domain-memory?

+

mashware/domain-memory is maintained by mashware. The last recorded GitHub activity is from today, with 0 open issues.

Are there alternatives to domain-memory?

+

Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.

Deploy domain-memory to your cloud

Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.

Maintain this repo? Add a badge to your README

Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.

Featured on ClaudeWave: mashware/domain-memory
[![Featured on ClaudeWave](https://claudewave.com/api/badge/mashware-domain-memory)](https://claudewave.com/repo/mashware-domain-memory)
<a href="https://claudewave.com/repo/mashware-domain-memory"><img src="https://claudewave.com/api/badge/mashware-domain-memory" alt="Featured on ClaudeWave: mashware/domain-memory" width="320" height="64" /></a>

More MCP Servers

domain-memory alternatives