Getting started · MCP

MCP

The @vibecompass/vibecompass-mcp server lets Claude Code, Codex, Cursor, and other MCP tools ask your project memory questions in the middle of a session. This page lists what it can do in each mode.

Setting it up for the first time? The config is under Modes below, and the Quickstart has a prompt that asks your AI to add it for you.

When you need it

Working alone in one repo with an AI tool that can read your files, such as Claude Code, Codex, or Cursor, you can skip MCP. The agent files VibeCompass writes tell your AI where everything is, and it reads the rest of your project memory itself.

MCP starts to matter when:

  • You want structured answers, like “what have we decided about billing?”, instead of your AI searching through decisions/*.md. What a Local answer includes is under What Local mode returns.
  • Your project memory lives in the hosted app. Your AI can’t read files that aren’t on your machine, so MCP is the bridge.
  • You want your AI to record decisions or session summaries through tool calls. That needs a hosted API key, and it writes to the hosted project, not your local files.

Local, Hosted, and Hybrid

You don’t pick a mode by name. The server works it out from the settings you give it when it starts: a path to your memory folder, a hosted API key, or both.

Local

Set: VIBECOMPASS_ROOT only

Reads
Your project memory files on this machine.
Writes
Nothing. There are no write tools, so your files only change through the package or your own edits.
Good for
Working on your own, with your files as the source of truth.

Hosted

Set: VIBECOMPASS_API_KEY only

Reads
The project on vibecompass.dev.
Writes
Decisions, feature status, conflicts, and session summaries, into the hosted project.
Good for
Projects whose home is the hosted app, or machines without the files.

Hybrid

Set: Both

Reads
Your local files, plus conflicts and pending proposals from the hosted project.
Writes
Into the hosted project only. Your local files never change from MCP.
Good for
Local files as the source of truth, with hosted conflicts, proposals, and write-back.

The settings go in the env block of your tool’s MCP config. Create an API key on your project’s Setup page in the hosted app. It isn’t the same as the sync token vibecompass login keeps for push.

# Local: read your files
"env": { "VIBECOMPASS_ROOT": "/absolute/path/to/.compass" }

# Hosted: read and write the hosted project
"env": { "VIBECOMPASS_API_KEY": "your-api-key", "VIBECOMPASS_API_URL": "https://vibecompass.dev" }

# Hybrid: read your files, write to the hosted project
"env": {
  "VIBECOMPASS_ROOT": "/absolute/path/to/.compass",
  "VIBECOMPASS_API_KEY": "your-api-key",
  "VIBECOMPASS_API_URL": "https://vibecompass.dev"
}

A complete Local config, for a project’s .mcp.json or Cursor’s settings

{
  "mcpServers": {
    "vibecompass": {
      "command": "npx",
      "args": ["-y", "@vibecompass/vibecompass-mcp"],
      "env": {
        "VIBECOMPASS_ROOT": "/absolute/path/to/.compass"
      }
    }
  }
}

The same thing from the Claude Code terminal

claude mcp add --transport stdio vibecompass \
  --env VIBECOMPASS_ROOT='/absolute/path/to/.compass' \
  -- npx -y @vibecompass/vibecompass-mcp

Codex uses TOML, not JSON: add this to ~/.codex/config.toml

[mcp_servers.vibecompass]
command = "npx"
args = ["-y", "@vibecompass/vibecompass-mcp"]
env = { VIBECOMPASS_ROOT = "/absolute/path/to/.compass" }

Tools by mode

Your AI tool sees only the tools its mode offers. You don’t call them yourself: your AI picks one when it needs to know something.

Read tools

get_project_context
A short overview: features and their status, the latest session note, and a few recent decisions.Where: Every mode.
get_feature_context
Everything about one feature (or one of its components): its docs, files, and decisions.Where: Every mode. In Local mode its decisions come from the feature's domain decision file, and its conflicts list is empty, with a note.
get_decision_log
Decisions, newest first. Ask for up to 100, or only a feature's decisions.Where: Every mode. In Local mode a feature's decisions are its domain decision file.
get_file_context
Which feature and component a file belongs to.Where: Every mode.
get_conflicts
Open conflicts flagged for you to resolve.Where: Hosted and Hybrid. Local returns an empty list with a note, because conflicts live in the hosted app.
list_pending_proposals
Suggested doc changes waiting for review in the hosted app. Read-only: you apply them through the package.Where: Hosted and Hybrid. Local returns an empty list with a note.

Write tools (need an API key)

log_decision
Records a decision in the hosted project, with the next number.Where: Hosted and Hybrid. Title up to 200 characters, description up to 5,000.
update_feature_status
Marks progress on a feature, with an optional note.Where: Hosted and Hybrid. Note up to 2,000 characters.
flag_conflict
Flags a problem for you to look at in the dashboard.Where: Hosted and Hybrid.
add_session_summary
Leaves an end-of-session handoff note in the dashboard's session history.Where: Hosted and Hybrid. Summary up to 10,000 characters, naming 1 to 100 features it touched.

Opt-in

get_brief
A session brief for a task: a short pick of the docs, decisions, and notes to start from.Where: Local and Hybrid, only when your memory folder turns the brief on. See below.

What Local mode returns

Local mode reads the same files you do and answers in the same shape as the hosted app, with the same size limits. A few answers differ, and each one says so in a note.

Answers are kept short

The overview and feature answers drop their least important detail first to fit about 2,000 tokens. Any answer still over about 2,500 tokens comes back as a preview with a note that points to a narrower tool, such as get_feature_context for one component. When component details are dropped, the note says which doc to open for each one. The session brief, below, keeps its own size.

Decisions come from the domain's file

Your decision entries don't record which feature they belong to. So when your AI asks for a feature's decisions, Local mode returns the decisions in that feature's domain file (for example decisions/billing.md) and says so in a note. Decisions in other files, such as cross-cutting ones, aren't included.

Conflicts say where they live

Conflicts are tracked in the hosted app. Local answers return none and say so instead of implying there are none. In Hybrid mode, get_conflicts reads them from the hosted project.

The server tells your AI how to use it

When your AI tool connects, the server says what each tool is for and where the source of truth is: in Local and Hybrid mode, your project memory files. When an answer is shortened, your AI should open those files for the full text.

Writing back

  • Write tools appear only when the server has an API key, in Hosted or Hybrid mode. Local mode never writes.
  • Every write goes to the hosted project. In Hybrid mode a decision your AI logs over MCP doesn’t show up in your local decisions/ files. It reaches them only if you bring it back as a proposal.
  • Decisions can’t be edited or deleted over MCP. A change of mind is a new decision.
  • To add a decision to your local files, ask your AI to write it there, or use append-decision, which numbers it for you.

Session brief over MCP (opt-in)

When your memory folder’s project.yaml turns the session brief on, Local and Hybrid mode add one more tool, get_brief. It returns the same brief that vibecompass brief prints for a task, then a short summary of it as data.

# .compass/project.yaml
brief:
  enabled: true

A starting point, not the first call

A brief shows cut excerpts and can miss the doc your task depends on. Use it as one place to start, then open the full docs behind anything you rely on. The server never tells your AI to call it, and nothing about it asks to be called first.

  • Your AI describes the task, and can add the files, features, and lane it’s about. It never guesses a lane: without one, the brief has no lane details.
  • A brief is longer than other answers: about 6,000 tokens at most by default. Your AI can ask for a smaller one, down to about 800.
  • It never hands back an old brief. If building one fails or takes more than 5 seconds, the call returns an error, and the other tools keep answering.
  • It isn’t offered in Hosted mode, or when the setting is missing or set to anything but true.

What a brief is, and why it’s off by default, is on the Concepts page; what its status means, on the Protocol page; the other brief settings, on the CLI page.

Restart after a change

The server reads its settings once, when it starts. After any of these changes, restart it: in most tools, restart the AI tool or reconnect its MCP servers.

  • You made the hosted app your source of truth (promote-hosted): add VIBECOMPASS_API_KEY and remove VIBECOMPASS_ROOT.
  • You moved it back to local files (demote-hosted): set VIBECOMPASS_ROOT again. Keep the API key if you still want Hybrid write-back.
  • You turned the brief on or off: the tool list changes at the next start. Until then, a brief turned off returns a note and builds nothing.
  • You upgraded the server, or changed the version your config pins, such as @vibecompass/vibecompass-mcp@0.1.8.

When something is slow or offline

A VibeCompass tool never crashes your session. Requests to the hosted app use a 5-second timeout. A read that fails answers from what it last read in this session, or with an empty answer, and the server keeps going. Reads from your own files have no hard limit: on a very large project one can take longer than 5 seconds, and other calls wait for it. Two kinds of call return an error instead of an old or empty answer: the session brief, which stops building at 5 seconds, and a write that wasn’t confirmed. A write error doesn’t always mean nothing was saved, so check the dashboard before trying again, or the same decision can be recorded twice.

Keep going

For what’s still missing, including in Local mode, see the Roadmap.