Skip to main content
Glama
README.md
# mempalace-mcp-dev

An MCP (Model Context Protocol) server that gives AI coding assistants grounded, branch-scoped context about your codebase. It provides semantic code search via [my MemPalace fork](https://github.com/2loch-ness6/mempalace), git change tracking, a persistent change ledger, TypeScript/Jest dev lifecycle tools, and a built-in **Project Tracks** (Conductor) methodology for structured feature work.

## Features

| Feature | Description |
|---|---|
| **Semantic code search** | Natural-language queries over your indexed codebase via MemPalace embeddings |
| **Branch context** | Current branch, SHA, recent commits — always oriented |
| **Change ledger** | Append-only JSONL log of every AI-assisted change with full provenance |
| **Dev lifecycle** | Run `tsc` typecheck and Jest tests from within the MCP client |
| **Git diff** | Full or file-scoped diff output |
| **Project Tracks** | Create and manage markdown-based feature tracks (plan/spec/index/metadata) |

---

## Prerequisites

- **Node.js** ≥ 18
- **Python** ≥ 3.9
- A git repository to point at

### Important: MemPalace Fork Required

> ⚠️ **This MCP server requires a custom fork of MemPalace** with multi-branch
exclude-patterns support. The official `pip install mempalace` package will
**not** work — you must use [my fork](https://github.com/2loch-ness6/mempalace)
(branch `feat/exclude-patterns-config`).

The easiest way to get this set up is the **setup script** (see Quick Start).

---

## Quick Start

### 1. Run the setup script (recommended)

The fastest way to get up and running is the bootstrap script at
`scripts/setup-mempalace.sh`. It handles the entire MemPalace setup:

- Clones my fork with the required exclude-patterns support
- Creates a Python virtual environment
- Installs the fork in editable mode
- Symlinks the `mempalace` CLI to `~/.local/bin`
- Prepares the palace data directory
- Optionally runs the initial codebase index

```bash
# From the repo root:
./scripts/setup-mempalace.sh

# To also index your codebase right away:
./scripts/setup-mempalace.sh --mine
```

The script is fully configurable via environment variables:

| Env var | Default | Description |
|---|---|---|
| `MEMPALACE_FORK_URL` | `https://github.com/2loch-ness6/mempalace` | My fork with required exclude-patterns support |
| `MEMPALACE_FORK_BRANCH` | `feat/exclude-patterns-config` | Branch containing the feature |
| `MEMPALACE_FORK_DIR` | `$HOME/.mempalace-fork` | Where to clone the fork |
| `MEMPALACE_VENV_DIR` | `$HOME/.mempalace` | Python venv location |
| `MCP_PALACE_DIR` | `<repo-root>/.palace/active` | Palace data directory |
| `MCP_PALACE_WING` | `code` | Palace wing (namespace) |
| `MCP_REPO_DIR` | `<repo-root>` | Source code to mine |

After the script finishes, check that everything works:

```bash
mempalace --version
mempalace --palace ~/.mempalace/active status
```

### 2. Clone and build the MCP server

This is not published to npm. Clone and build locally:

```bash
git clone https://github.com/2loch-ness6/mempalace-mcp-dev
cd mempalace-mcp-dev
npm install
npm run build
```

After building, you can use `npm link` to make `mempalace-mcp-dev` available globally:

```bash
npm link
# Now this works from anywhere:
mempalace-mcp-dev
```

### 3. Configure environment variables

```bash
export MCP_REPO_DIR=/path/to/your/repo        # defaults to process.cwd()
export MCP_PALACE_DIR=~/.mempalace/active      # MemPalace data directory
export MCP_PALACE_WING=code                    # wing name (namespace) for your repo
export MEMPALACE_PYTHON=/path/to/venv/bin/python3  # python with fork installed
```

> If you used the setup script, set `MEMPALACE_PYTHON` to `$HOME/.mempalace/bin/python3`
(or wherever `MEMPALACE_VENV_DIR` points).

### 4. Add to your MCP client config

For Claude Desktop and other MCP clients:

```json
{
  "mcpServers": {
    "mempalace-mcp-dev": {
      "command": "node",
      "args": ["/path/to/mempalace-mcp-dev/dist/index.js"],
      "env": {
        "MCP_REPO_DIR": "/path/to/your/repo",
        "MCP_PALACE_DIR": "/home/you/.mempalace/active",
        "MCP_PALACE_WING": "code",
        "MEMPALACE_PYTHON": "/home/you/.mempalace/bin/python3"
      }
    }
  }
}
```

If you ran `npm link`, you can also use the shorter form:

```json
{
  "mcpServers": {
    "mempalace-mcp-dev": {
      "command": "mempalace-mcp-dev",
      "env": {
        "MCP_REPO_DIR": "/path/to/your/repo",
        "MCP_PALACE_DIR": "/home/you/.mempalace/active",
        "MCP_PALACE_WING": "code",
        "MEMPALACE_PYTHON": "python3"
      }
    }
  }
}
```

---

## Environment Variables

| Variable | Default | Description |
|---|---|---|
| `MCP_REPO_DIR` | `process.cwd()` | Absolute path to your git repository root |
| `MCP_PALACE_DIR` | `~/.mempalace/active` | MemPalace data directory |
| `MCP_PALACE_WING` | `code` | Wing (namespace) name within the palace |
| `MCP_LEDGER_PATH` | `<repo>/.mcp-dev/ledger.jsonl` | Path to the change ledger file |
| `MCP_TRACKS_DIR` | `<repo>/conductor/tracks` | Directory containing project track folders |
| `MEMPALACE_PYTHON` | `python3` | Python binary (must have the MemPalace fork installed) |

---

## MCP Tools Reference

### Code Search

| Tool | Description |
|---|---|
| `search_code` | Semantic search over indexed codebase. Accepts `query` (string) and optional `scope` (room name) and `limit` (int, default 10) |
| `mine_changed_files` | Re-index files changed since the last git commit. Call after editing to keep search current |

### Branch & Git

| Tool | Description |
|---|---|
| `get_branch_context` | Returns current branch, SHA, short SHA, and last 5 commit messages |
| `get_changed_files` | Files changed vs `HEAD~1` (or a specified base ref) with add/modify/delete status |
| `get_git_diff` | Full diff output. Optional `base` ref and `filePath` for scoping |

### Change Ledger

| Tool | Description |
|---|---|
| `record_change` | Append an entry to the ledger (files affected, description, reason, tags, optional track link) |
| `read_ledger` | Read recent ledger entries. Optional `limit` (default 20) and `branch` filter |

### Dev Lifecycle

| Tool | Description |
|---|---|
| `run_typecheck` | Run `tsc --noEmit` in a service directory. Returns structured errors with file/line/col/code |
| `run_tests` | Run Jest in a service directory. Returns pass/fail counts and structured failure details |

### Project Tracks (Conductor)

| Tool | Description |
|---|---|
| `list_tracks` | List all live tracks (directories containing `plan.md`) |
| `get_track_plan` | Read `plan.md` for a track |
| `update_track_plan` | Overwrite `plan.md` for a track |
| `get_track_spec` | Read `spec.md` for a track |
| `update_track_spec` | Overwrite `spec.md` for a track |
| `get_track_index` | Read `index.md` for a track |
| `update_track_index` | Overwrite `index.md` for a track |
| `create_track` | Scaffold a new track directory with all four files |

---

## Project Tracks Methodology (Conductor)

Project Tracks is a lightweight, file-based feature management system. Each **track** is a directory containing up to four files:

```
conductor/tracks/
└── my-feature-20260501/
    ├── plan.md       ← living task list; the status source of truth
    ├── spec.md       ← technical spec, design decisions, acceptance criteria
    ├── index.md      ← short summary and linked resources
    └── metadata.json ← machine-readable metadata (id, owner, status, dates)
```

**Rules:**
- A directory is a live track only if it contains `plan.md`.
- `plan.md` is always read/written live from disk (never via MemPalace — no staleness).
- Track slugs must match `[a-zA-Z0-9][a-zA-Z0-9_-]*` (max 100 chars).

**Bootstrapping tracks in a new project:**

```bash
# Create the tracks directory
mkdir -p conductor/tracks

# Use the MCP tool to scaffold a track
# (or copy from templates/track/ in this package)
```

Template files are included in `templates/track/` for manual scaffolding.

---

## MemPalace Configuration (`mempalace.yaml`)

Place a `mempalace.yaml` at the root of `MCP_REPO_DIR` to control how files are indexed. A generic example is provided in `mempalace.yaml.example`.

Key sections:
- `wing` — must match `MCP_PALACE_WING`
- `exclude_patterns` — gitignore-syntax patterns to skip during mining
- `rooms` — semantic routing rules (keyword → room name) for search scoping

---

## Development

```bash
git clone https://github.com/2loch-ness6/mempalace-mcp-dev
cd mempalace-mcp-dev
npm install
npm run build
npm test
```

See [CONTRIBUTING.md](./CONTRIBUTING.md) for contribution guidelines.

---

## License

MIT — see [LICENSE](./LICENSE).

TDQS

A3.7/5.0

Scored across 19 tools

Disambiguation5/5

Each tool targets a specific resource or action with clear boundaries. For example, get_all_changes vs get_session_changes are distinguished by persistence scope, and get_git_diff vs get_changed_files provide different levels of detail.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern using snake_case (e.g., create_track, get_branch_context, run_tests). The naming is predictable and easy to understand.

Tool Count4/5

With 19 tools, the server is slightly above the ideal range of 3-15, but the count is justified by covering two distinct domains (track management and code change tracking) plus code quality checks. The set is well-scoped without being overwhelming.

Completeness4/5

Core workflows for track management and change logging are covered (create, read, update, log). Minor gaps exist: no delete_track tool and limited git operations (no commit/push), but these are acceptable for the intended assistant role.

Maintenance

ActivityInactive
ResponsivenessNo issues