Local MCP that reads what you're doing and suggests which model fits — copy tweak vs UI vs nasty bug, that kind of thing.
Each real task should pass through start_session (compact) once: cheap model by default, heavier only when the task needs it. Agents follow workspace rules to call it at work start (including Multitask / subagents — do not skip). Cursor does not auto-switch the chat dropdown or intercept every message — copy copy_task_model onto Task model=. Same task + stick_action=keep → no repeat recommend (except when work type switches to planning/architecture). If the user says a prompt-only test phrase, still call start_session or recommend_model; do not implement.
git clone https://github.com/JakeLim17/compass-mcp.git
cd compass-mcp
npm run connect -- cursor
npm run connect -- claude
npm run connect -- codexPick one host line. It installs, builds, and writes your MCP config (existing config gets backed up first).
Then restart the app. On Cursor: sidebar Customize → MCPs → toggle off and on.
Not on npm — clone from GitHub. Updates: npm run sync.
curl -fsSL https://raw.githubusercontent.com/JakeLim17/compass-mcp/main/scripts/remote-install.sh \
| bash -s -- cursor # or: claude / codexClones (or fast-forward pulls if already cloned) into ~/.compass-mcp, then runs npm run connect -- <host> — same install/update path as above, one line. Override with COMPASS_MCP_LOCAL_DIR= / COMPASS_MCP_REPO_URL= env vars. Re-running the same command later is the update path (equivalent to npm run sync + re-toggling the MCP).
Catalog maintenance: Cursor adds models often. Recheck Task slugs in src/recommend.ts / src/hosts.ts against Models & Pricing about monthly (or when the Cursor Models picker changes). Then npm run sync and toggle MCP in Customize → MCPs.
Share these commands when someone already has compass-mcp or needs a fresh install.
curl -fsSL https://raw.githubusercontent.com/JakeLim17/compass-mcp/main/scripts/remote-install.sh \
| bash -s -- cursor # or: claude / codexClones (or fast-forward pulls) into ~/.compass-mcp, runs npm install + npm run build, writes MCP config. Then Customize → MCPs → compass-mcp OFF/ON (or restart Cursor).
cd ~/.compass-mcp # or your clone path, e.g. ~/ChronoCode/compass-mcp
npm run syncnpm run sync does, in order:
git pull --ff-only origin main(skip if not a git repo)npm installnpm run buildnpm test(smoke)
After sync finishes, refresh MCP so Cursor loads the new build:
- Cursor: Customize → MCPs → find
compass-mcp/user-compass-mcp→ toggle OFF then ON - Still stale: quit Cursor fully and reopen
- Agent can also call MCP tool
how_to_refresh_mcp(host:cursor)
After merging to main locally:
cd compass-mcp
git pull --ff-only origin main
npm run sync # verify green before push
git push origin main # teammates / remote-install.sh pick this upTeammates on remote-install.sh re-run the same curl one-liner to update; cloned repos use npm run sync only.
Compass MCP (this repo) pairs with cursor-engineering-governance (security/engineering rules injected into every Agent chat). To bring a new machine or teammate fully up to date, run both:
# 1) engineering-governance rules (alwaysApply rules + account-map)
curl -fsSL https://raw.githubusercontent.com/JakeLim17/cursor-engineering-governance/main/install.sh \
| bash -s -- --from-remote
# 2) compass-mcp (model routing MCP)
curl -fsSL https://raw.githubusercontent.com/JakeLim17/compass-mcp/main/scripts/remote-install.sh \
| bash -s -- cursor
# 3) reconnect the MCP in Cursor
# Customize → MCPs → toggle compass-mcp OFF then ON (or restart Cursor)Already have both cloned locally? Same idea, shorter:
cd cursor-engineering-governance && git pull --ff-only && ./install.sh --skip-accounts
cd ../compass-mcp && npm run sync
# then: Customize → MCPs → toggle compass-mcp OFF/ONSee cursor-engineering-governance/README.md §Share for the full governance-side procedure and flags.
Just say what you're doing in chat. The agent calls Compass and gets a model suggestion.
Examples:
- "What model should I use for this?"
- "Fix the login copy with Fable"
- "Debug this flaky type-error regression"
Say a model name if you want (페이블로, use codex) — that wins over the score.
| You're doing… | Typical pick |
|---|---|
| Copy, i18n, hyphen/dash punctuation, one-line fix | Composer Standard (composer-2.5 UI; Task composer-2.5-fast) |
| Small code patch | Same light tier — Standard over Fast |
| General UI (일상) | Composer (composer-2.5-fast) — Cursor pool |
| General UI (mid, Composer 부족) | Sonnet (claude-sonnet-5-thinking-high) |
| Urgent multi-file UI / layout refactor | Fable (claude-fable-5-thinking-high) — 예외만 (토큰 큼) |
| Broad UI redesign | Sonnet (Fable 아님) |
| Design, planning, tradeoffs | Grok 4.7 (cursor-grok-4.7-high-fast) — Cursor pool, don’t under-use |
| Hard bug, CI, type errors | Sol → Terra/Codex (gpt-5.6-sol-medium → gpt-5.6-terra-medium) |
| Long codebase / code context | Kimi K2.7 (kimi-k2.7-code) |
| Extreme / huge scope (rare) | Opus 5 (claude-opus-5-thinking-high) |
Speed tier (speed_tier) and effort (effort) are parsed straight from the slug string — not a hand-maintained side table — via hosts.parseSlugSpeedEffort(slug). -fast suffix → speed_tier: "fast"; otherwise "standard" (chat UI "Fast" toggle off, or a family with no fast variant). -thinking-high/-high → effort: "high", -medium → "medium", "n/a" when the family has no effort suffix (Composer, Kimi).
| Slug | Role | Cost tier | Speed tier | Effort |
|---|---|---|---|---|
composer-2.5 |
Chat UI Standard (light work) | low | standard | n/a |
composer-2.5-fast |
Task fallback for Composer | low | fast | n/a |
claude-sonnet-5-thinking-high |
General UI / mid Claude | medium | standard | high |
claude-opus-4-8-thinking-high |
Opus 4.8 (legacy) | medium-high | standard | high |
claude-opus-5-thinking-high |
Extreme difficulty (rare) | medium-high | standard | high |
claude-fable-5-thinking-high |
Urgent multi-file UI only (exception) | medium-high | standard | high |
cursor-grok-4.7-high-fast |
Design / planning (default Grok) | medium-high | fast | high |
cursor-grok-4.5-high-fast |
Grok 4.5 legacy | medium-high | fast | high |
gpt-5.6-sol-medium |
Lighter bug/CI probe | medium-high | standard | medium |
gpt-5.6-terra-medium |
Hard bug / Terra | high | standard | medium |
kimi-k2.7-code |
Long code context | medium | standard | n/a |
Notes:
- Only Composer has a real Standard-vs-Fast pair today (
composer-2.5UI Standard vscomposer-2.5-fastTask). Every other family's catalog slug is Fast-only (Grok) or has no Fast variant at all (Sonnet/Opus/Fable/Sol/Terra/Kimi) — for those, "standard" in the table above means "not a-fastslug", not "a verified non-Fast Task option exists". Grok 4.7/4.6/4.5 Standard (non-Fast) is chat-UI-only today (turn Fast off in the picker); there is no non-Fast Task slug yet — recheck against Models & Pricing. effortreflects the reasoning-effort suffix in the slug name (Anthropic "thinking-high", GPT "medium"), not a separate universal 3-level scale Cursor exposes for every model — some families (Composer, Kimi) simply don't have one (n/a).recommend_model/start_sessionresults now include top-levelspeed_tier+effort(for the primary pick) and per-candidatespeed_tier/efforton everycandidates[]entry — see Use it output shape below.- "Lightest" depends on the host — Cursor's cheap slot is Composer, not Haiku. If the top pick isn't available, it falls back to the next in the list.
- Expensive gate: scored Fable / any Opus / Terra is not executable until the current turn names that model (
페이블로,user_requested_model) or passesapprove_expensive_model. Until thenmust_do.task_model/copy_task_modelare Composer (or Grok for architecture). Approval is one-shot and is not persisted. - Daily 70% warning: optional
usage_alert_thresholds.daily_run_budgetvs local JSONL run count. This is not Cursor/provider quota (Compass cannot see that). Omit the field = no 70% warning. Existinghigh_tier_today/heavy_todayalerts stay.
- Does not change the chat dropdown for you — you or the agent still pick the model.
- Failure mode: saying “추천 모델로 다시” without putting
must_do.task_model(copy_task_model) on Taskmodel=leaves Composer. Cursor MCP cannot auto-bind Task.task_model_required+ rules enforce the copy;verify_run_compliancecannot see the parent chat runtime. - Cursor is the main target; Claude Code and Codex CLI work too.
- Remote web connectors are optional (see below).
For Claude.ai / ChatGPT connectors, not day-to-day Cursor:
export COMPASS_MCP_API_KEY="$(openssl rand -hex 32)"
npm run start:http
# → http://127.0.0.1:3920/mcpTunnel that port over HTTPS and point the connector at /mcp with Authorization: Bearer <key>. Local stdio (npm run connect) is enough for most people.
MIT
한국어: 작업 문장 보고 모델 추천하는 로컬 MCP (v0.9.11+). 우선순위: Composer → Grok → Sonnet · Fable/Opus/Terra는 이번 턴 승인 전 실행 slug로 내리지 않음. npm run connect -- cursor|claude|codex 한 줄 설치, 또는 클론 없이 curl -fsSL .../scripts/remote-install.sh | bash -s -- cursor. 업데이트: 클론 경로에서 npm run sync → Customize → MCPs OFF/ON. 간단 문자·카피·하이픈/구두점·i18n은 Composer 2.5 Standard(Fast 아님) — Task slug는 composer-2.5-fast fallback. copy_task_model을 Task model=에 복사해야 함(말만 switch=위반). v0.9.11: Fable/Opus/Terra 승인 게이트 + 내부 일일 실행 예산 70% 경고(Cursor 쿼터 아님). 팀 전파: docs/SHARE.md(governance) 또는 이 README §Share.
Use host=codex for native Codex model selectors and host=openai for the existing OpenAI API compatibility profile. Codex connection setup now writes COMPASS_MCP_HOST=codex. Explicit tool host takes precedence, then connected-host environment, then the project's soft preferred_host; existing project preferences need not change.
Codex IDs and default/supported reasoning efforts come from the dated local account/client model/list snapshot in src/codexCatalog.ts. verification.level=listed means the host exposed the ID at that time; it does not prove fresh upstream access, current account entitlement or successful inference. API/other mappings remain configured. No entry is marked execution_verified. See catalogue evidence.
Role assignments remain routing policy: Luna for light tasks, Sol for regular/design roles, Astra for existing gated expensive roles; GPT-5 Sol/Terra logical roles keep their separately listed native family IDs. Existing costly-model approval rules remain. Codex uses a native model ID plus a separate reasoning effort, with no automatic speed-tier selection. Its hints describe --model and model_reasoning_effort; legacy copy_task_model fields are compatibility data, not Cursor Task commands. Unknown/API/suffixed/display-name whitelist values fail closed for Codex.
Existing Cursor IDs, including the existing local Grok 4.7 mapping, remain configured data; this update does not verify their account availability or inference. See the generated model catalogue for IDs and verification levels. Run npm run catalog:check to check that documentation matches the source catalogue.
COMPASS_MCP_HOST selects the model profile. Set COMPASS_MCP_HTTP_HOST=127.0.0.1 for the HTTP bind address. Legacy IP-address values in COMPASS_MCP_HOST are accepted for compatibility. HTTP tool inputs are limited to 10,000 elements; the current JSON parser limits request bodies to 100 KiB and the SDK limits batches to 100 messages. These limits do not imply model inference or a remote deployment was tested.