MCP server exposing Local Brain to AI assistants (Claude Desktop, Claude Code, etc.).
Via Homebrew (macOS, recommended):
# Install Local Brain (includes both CLI and MCP server)
brew install sandermoon/tap/brain
# brain-mcp is automatically installed to $(brew --prefix)/bin/brain-mcpVia Makefile (all platforms):
# Install to ~/.local/bin (no sudo required, recommended)
make dev-install-mcp
# Or install system-wide to /usr/local/bin
sudo make install-mcp
# Or specify custom location
make install-mcp INSTALL_DIR=~/.local/bin
# Or install both CLI and MCP server
make install-allVia Go (if you have Go installed):
# Clone the repository
git clone https://github.com/SanderMoon/local-brain.git
cd local-brain
# Build and install
make build-mcp
cp brain-mcp /usr/local/bin/ # or ~/.local/bin/Claude Desktop config location depends on your OS:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Add this configuration (adjust path based on your installation method):
{
"mcpServers": {
"local-brain": {
"command": "/usr/local/bin/brain-mcp"
}
}
}Path examples:
- Homebrew (macOS):
/opt/homebrew/bin/brain-mcpor/usr/local/bin/brain-mcp - User install:
~/.local/bin/brain-mcp(expand ~ to full path) - System install:
/usr/local/bin/brain-mcp
Restart Claude Desktop to activate.
To add the Local Brain MCP server for a specific project in Claude Code:
claude mcp add --transport stdio local-brain /opt/homebrew/bin/brain-mcpRun this from your project directory. The server is registered at the project level (stored in .claude/mcp.json) and Claude Code will have access to all Local Brain tools when working in that project.
Path examples (adjust to your installation):
- Homebrew (macOS ARM):
/opt/homebrew/bin/brain-mcp - Homebrew (macOS Intel):
/usr/local/bin/brain-mcp - User install:
/Users/<you>/.local/bin/brain-mcp
get_brain_overview - Complete workspace overview: brain name, focused project, all projects with stats, inbox count
get_dump_items - All inbox items with IDs, content, and timestamps
get_project_context - Full project details: description, todos, repos, notes
project_name(string) - Project to retrieveinclude_completed(bool) - Include done tasksinclude_note_content(string, optional) - Note content depth: none|preview|full (default: preview)section(string, optional) - PARA section: 01_active (default), 02_areas, or 03_resources
search - Search across todos and notes with filtering by status, priority, tags, and dates
query(string, optional) - Search termproject(string, optional) - Project filterinclude_todos(bool, optional) - Include todos (default: true)include_notes(bool, optional) - Include notes (default: true)search_note_content(bool, optional) - Search note body text, not just titlesstatus(string, optional) - Filter todos by status (backlog, open, in-progress, blocked, done)priority(int, optional) - Filter todos by priority (1=high, 2=medium, 3=low)tags([]string, optional) - Filter todos by tags (OR logic)include_completed(bool, optional) - Include completed tasks (default: false)created_after,created_before(strings, optional) - Filter by created date (YYYY-MM-DD)completed_after,completed_before(strings, optional) - Filter by completed date (YYYY-MM-DD)due_after,due_before(strings, optional) - Filter by due date (YYYY-MM-DD)section(string, optional) - PARA section: 01_active (default), 02_areas, or 03_resources
set_context - Switch brain and/or set focused project (at least one required)
brain_name(string, optional) - Brain to switch toproject_name(string, optional) - Project to focus
get_daily_briefing - Daily briefing: overdue/due items, high-priority tasks, in-progress work, blocked items, recent completions, inbox
section(string, optional) - PARA section: 01_active (default), 02_areas, or 03_resources
add_to_dump - Capture a task or note to the inbox
type(string) - Item type: "task" or "note"content(string) - Task or note content (multi-line supported for notes)title(string, optional) - Note title (required when type="note", ignored for tasks)
refile_item - Move items from inbox to projects (batch supported)
refiles(array) - Refile operations, each with:item_id(string) - 6-character hex IDproject_name(string) - Target project
update_todo - Update todos: content, status, priority, due date, tags, or delete (batch supported)
updates(array) - Todo updates, each with:todo_id(string) - 6-character hex IDcontent(string, optional) - New task textstatus(string, optional) - backlog | open | in-progress | blocked | donepriority(int, optional) - 1 (high), 2 (medium), 3 (low), null to cleardue_date(string, optional) - YYYY-MM-DD format, or "" to clearadd_tags([]string, optional) - Tags to addremove_tags([]string, optional) - Tags to removedelete(bool, optional) - Permanently delete this todo
section(string, optional) - PARA section: 01_active (default), 02_areas, or 03_resources
create_todo_in_project - Add tasks directly to a project (batch supported)
project_name(string) - Target projecttodos(array) - Todos to create, each with:content(string) - Task descriptionpriority(int, optional) - 1 (high), 2 (medium), 3 (low)due_date(string, optional) - YYYY-MM-DD formattags([]string, optional) - Tagsstatus(string, optional) - Initial status: backlog (default), open, in-progress, blocked
section(string, optional) - PARA section: 01_active (default), 02_areas, or 03_resources
create_project_note - Create a timestamped note file in a project
project_name(string) - Target projecttitle(string) - Note titlecontent(string) - Note contentsection(string, optional) - PARA section: 01_active (default), 02_areas, or 03_resources
get_note_content - Read a note file's content
note_path(string) - Full path to note file
update_note - Replace full content of an existing note file
note_path(string) - Full path to note filecontent(string) - New full content for the note file
create_project - Create new project
name(string) - Project name (alphanumeric, hyphens, underscores)description(string, optional) - Project descriptionsection(string, optional) - PARA section: 01_active (default), 02_areas, or 03_resources
archive_project - Move a project from active to archive (timestamped)
name(string) - Name of the project to archive
create_daily_note - Create or open a daily note in {brain}/00_daily/YYYY-MM-DD.md with overdue todo briefing
date(string, optional) - Date in YYYY-MM-DD format (defaults to today)
Ask Claude: "What am I working on?"
→ Calls get_brain_overview
Ask Claude: "Give me my daily briefing"
→ Calls get_daily_briefing
Ask Claude: "Help me process my inbox"
→ Calls get_dump_items
→ Asks where each item should go
→ Calls refile_item(refiles: [{item_id: "abc123", project_name: "backend"}, ...])
Ask Claude: "Show me all high priority tasks"
→ Calls search(priority: 1)
Ask Claude: "Mark task abc123 as in-progress with high priority"
→ Calls update_todo(updates: [{todo_id: "abc123", status: "in-progress", priority: 1}])
Ask Claude: "What's overdue?"
→ Calls search(due_before: "2026-03-25")
Ask Claude: "Add a task to my backend project: Fix auth bug"
→ Calls create_todo_in_project(project_name: "backend", todos: [{content: "Fix auth bug"}])
Ask Claude: "Write up notes from today's standup in project X"
→ Calls create_project_note(project_name: "X", title: "Standup notes", content: "...")
- Efficiency - Batch operations minimize round-trips (
get_brain_overviewreplaces 5+ separate calls) - Safety - Destructive operations (
update_todowithdeleteflag) are explicit. No brain deletion exposed. - Privacy - Local stdio transport only, no network access.
- Validation - All inputs validated before execution with clear error messages.
Tools not appearing in Claude Desktop
- Verify config file location:
~/Library/Application Support/Claude/claude_desktop_config.json - Check binary path is correct:
which brain-mcp - Restart Claude Desktop completely
Permission errors
- Ensure binary is executable:
chmod +x /usr/local/bin/brain-mcp - Check brain directory permissions
Tool calls failing
- Verify you have an active brain configured:
brain config show - Check item IDs are valid 6-character hex (use get_dump_items or search to find IDs)
- Ensure project names match exactly (use get_brain_overview to see available projects)
Validation errors
- Todo IDs must be 6-character lowercase hex (e.g., "abc123" not "ABC123")
- Dates must be YYYY-MM-DD format (e.g., "2026-02-15")
- Priority must be 1, 2, or 3
- Status must be: backlog, open, in-progress, blocked, or done
Transport: stdio (local only) Cache: 30-second TTL for read operations, invalidated on mutations Session: Thread-safe with automatic config refresh Version: Uses Local Brain CLI version