Skip to main content
Glama
neverprepared

mcp-obsidian-second-brain

README.md
# mcp-obsidian-second-brain

An [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that gives Claude a persistent, structured memory system backed by an Obsidian vault. Memories are stored as Markdown files with YAML frontmatter using the [PARA method](https://fortelabs.com/blog/para/) (Projects, Areas, Resources, Archives).

## Installation

### Option 1: npx from GitHub (no clone required)

Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):

```json
{
  "mcpServers": {
    "obsidian-second-brain": {
      "command": "npx",
      "args": ["-y", "@neverprepared/mcp-obsidian-second-brain"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/path/to/your/obsidian/vault"
      }
    }
  }
}
```

### Option 2: Clone and run locally

```bash
git clone https://github.com/neverprepared/mcp-obsidian-second-brain.git
cd mcp-obsidian-second-brain
npm install
npm run build
```

Then add to your Claude Desktop config:

```json
{
  "mcpServers": {
    "obsidian-second-brain": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-obsidian-second-brain/dist/index.js"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/path/to/your/obsidian/vault"
      }
    }
  }
}
```

### Option 3: Claude Code (CLI)

Add to `~/.claude/claude_desktop_config.json` or run:

```bash
claude mcp add obsidian-second-brain \
  -e OBSIDIAN_VAULT_PATH=/path/to/your/obsidian/vault \
  -- npx -y @neverprepared/mcp-obsidian-second-brain
```

## Configuration

| Environment Variable | Default | Description |
|---|---|---|
| `OBSIDIAN_VAULT_PATH` | `~/workspaces/profiles/personal/obsidian/vaults/memory` | Path to your Obsidian vault directory |
| `LOG_LEVEL` | `info` | Log verbosity: `debug`, `info`, `warn`, `error` (logs go to stderr) |
| `MIN_SHARED_TAGS` | `2` | Minimum shared tags required for auto-linking memories |

The vault directory will be created automatically on first run with the PARA folder structure.

## Tools

| Tool | Description |
|---|---|
| `memory_store` | Create a new memory in a PARA category with optional tags and source URLs |
| `memory_recall` | Fetch a specific memory by ID or title |
| `memory_search` | Full-text search with relevance scoring, tag filters (`and`/`or`), date filters, and freshness |
| `memory_list` | Paginated listing with filters by PARA, tags, status, and date range |
| `memory_update` | Update content, tags, PARA category (moves file), or title (renames file) |
| `memory_archive` | Set a memory's status to archived |
| `memory_delete` | Permanently delete a memory (cascades to clean up backlinks) |
| `memory_link` | Create bidirectional `[[wiki-links]]` between two memories, or discover existing links |
| `memory_project` | Create projects with deadlines, mark complete, or list active projects |
| `memory_stats` | Vault health summary: counts by PARA/status, stale memories, orphans, top tags |
| `memory_cleanup` | Bulk list/archive/delete stale, archived, or orphaned memories (safe `dry_run` by default) |

## Vault Structure

```
<OBSIDIAN_VAULT_PATH>/
├── Projects/     # Time-bound goals (stale after 30 days)
├── Areas/        # Ongoing responsibilities (stale after 90 days)
├── Resources/    # Reference material (stale after 180 days)
├── Archives/     # Inactive memories (stale after 365 days)
└── _daily/       # Daily notes (auto-appended on each store)
```

Each memory is a Markdown file with YAML frontmatter. Files are named by slugified title and support bidirectional `[[wiki-links]]`.

## Development

```bash
npm run dev          # Run with tsx (no build required)
npm run build        # Compile TypeScript to dist/
npm run typecheck    # Type-check without emitting
npm test             # Run all tests
npm run test:watch   # Watch mode
npm run test:coverage # Coverage report
```

Copy `.env.example` to `.env` and set `OBSIDIAN_VAULT_PATH` before running locally.