Cpm Planner vs RoadRaven

A side-by-side look at the Cpm Planner and RoadRaven MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.

Cpm Planner logoCpm PlannerProduct Management · Local subprocess (stdio)Critical Path Method scheduling and lock-aware parallel cohorts for MCP agents.63GoodAuth: no auth requiredRoadRaven logoRoadRavenProduct Management · Local subprocess (stdio)Create and update roadmap tree nodes and statuses in the RoadRaven desktop app (must be running).65GreatAuth: no auth required

Verdict: choose Cpm Planner for product management work as a local process; choose RoadRaven for product management as a local process. You can also run both side by side in one mcpServers block.

Which MCP server should you choose?

Cpm Planner logoChoose Cpm Planner when

  • You need dedicated capabilities in the Product Management domain.
  • You prefer a local stdio subprocess transport.
  • Its auth model fits you: No auth required.
  • You have the keys it needs: CPM_PLANNER_DB.
  • You want tools like plan.release.compile, plan.release.diff, plan.submit.
Explore Cpm Planner

RoadRaven logoChoose RoadRaven when

  • You need dedicated capabilities in the Product Management domain.
  • You prefer a local stdio subprocess transport.
  • Its auth model fits you: No auth required.
  • You want tools like updateNodeStatus, getEventApiStatus, getRoadmap.
Explore RoadRaven

Feature & specification comparison

Rows where the two servers differ are marked.

SpecCpm Planner logoCpm PlannerRoadRaven logoRoadRaven
CategoryProduct ManagementProduct Management
Quality signal63/100 · Good65/100 · Great
Install commandConfirmedConfirmed
TransportLocal subprocess (stdio)Local subprocess (stdio)
AuthNo auth requiredNo auth required
PricingFreeFree
Required env varsCPM_PLANNER_DBNone listed
Verified ownerCommunity listingCommunity listing
GitHub stars010
Directory activity 0 views 0 installs 0 upvotes 1 views 0 installs 0 upvotes
Tools2522

Tools & capabilities

Cpm Planner tools 25

  • plan.release.compileCompile version-1 bounded release metadata into an ordinary lint-clean PlanGraph. Expands protected PR/check/approval/merge hops, producer retries, retained receipts and central acceptance. Every collection declares cardinality or a bounded retained source. Pure offline operation: never executes, accepts, submits or baselines work.
  • plan.release.diffCompare a retained compiled graph with current version-1 workflow/promotion policy. Reports policy_changed, added/removed/changed ids and stale; includes retained-history estimate drift. Read-only: apply accepted changes through normal plan.sync or plan.revise.
  • plan.submitSubmit a plan graph and receive a plan_id. Idempotent: identical graphs return the same plan_id. With `name` (and optional `project`/`variant`, variant defaults to "main"), registers a named variant instead: project defaults to the discovered project root.
  • plan.acquire_cohortAcquire up to max_count ready deliverables with no conflicting file claims atomically. Returns the cohort plus per-deliverable locks. A deliverable explicitly marked failed 3 times is circuit-broken to failed instead of re-leased; leases lost environmentally (TTL lapse, no terminal mark) never trip that breaker but are bounded separately (LAPSE_LIMIT at 10). Optional ttl_seconds sets the lease TTL (clamped to the server maximum). Optional ids targets specific deliverables and filter.metadata narrows by metadata equality; deliverables with metadata.kind = "manual" are never leased. ids that do not match filter.metadata are ignored (not reported in blocked). The response carries blocked [{id, code, reason}], blocked_count, and needs_operator (true when any blocked code is LAPSE_LIMIT: clear with plan.force_release {reset_counters: true}). Select the plan by plan_id, plan line name, or active: true.
  • plan.heartbeatRefresh the TTL on a held lock; LOCK_NOT_HELD or LOCK_EXPIRED on failure. Optional ttl_seconds sets the new TTL (clamped to the server maximum); without it the lease is never shortened. Select the plan by plan_id, plan line name, or active: true.
  • plan.mark_statusSet a deliverable's status. Complete/Failed releases the lock; caller_id mismatch yields LOCK_NOT_HELD. Without a lock, Complete, Ready or InProgress requires all prerequisites complete (PREREQUISITES_INCOMPLETE) and is audited; other lockless marks are audited too, and an already-complete deliverable cannot be changed (LOCK_NOT_HELD). A lockless in_progress persists across restarts and is not leasable; hand it back with a lockless ready (or other status) mark. plan.force_release does not affect it. Optional earned-value progress: earned_pct (0..100, only with in_progress; ignored with complete), actual_effort_hours (total so far, 0..1000000; replaces leased hours as actual cost) and evidence (<= 2048 chars, appended to a list of at most 100); violations are INVALID_ACTUALS. Every lease that ends adds its hours to the deliverable's leased hours. Select the plan by plan_id, plan line name, or active: true.
  • plan.statusRead-only snapshot: per-deliverable [id, status, attempt_count, failure_count, lapse_count] rows, critical_path (one real chain, always from __start__ to __finish__), critical_ids, per-deliverable schedule (es/ef/ls/lf/float, hours; synthetic __start__/__finish__ rows have synthetic=true), the ready set in float-ascending order (smallest float first, then smallest latest start, then id), plan_complete, milestones (per milestone: id, critical_path from __start__, hours, complete), and held locks. Select the plan by plan_id, plan line name, or active: true.
  • plan.getReturn the stored PlanGraph (deliverables, estimates, files, metadata) for a plan selected by plan_id, plan line name, or active: true.
  • plan.force_releaseOperator escape hatch — release a lock regardless of caller. Emits an audit event carrying `reason`. Select the plan by plan_id, plan line name, or active: true.
  • plan.acceptManager/owner acceptance: mark a deliverable Complete without holding its lease. Requires all prerequisites Complete and evidence; audited. A live lease held by someone else is refused (LOCK_HELD) unless override_lock is true. Select the plan by plan_id, plan line name, or active: true.
  • plan.lintLint a graph, stored plan, or plan file without creating one: cycles (with the loop), redundant edges, edges without rationale, interface edges not targeting a contract, deliverables feeding no milestone, and unordered file overlaps. Linting by plan_id also adds NO_BASELINE (warning) when the plan is executable and has recorded progress but no earned-value baseline. Provide exactly one of graph, plan_id, or path.
  • plan.scheduleLevel a graph or stored plan against resource capacities (`metadata.owner` by default; metadata.resources can claim several pools concurrently): makespan, per-deliverable start/finish, per-resource load, the driving chain (dependency vs named resource waits), and project/feeding buffers. A deliverable with duration_hours plus metadata.wall_clock_only:true advances elapsed time but consumes no capacity. Provide exactly one of graph or plan_id. capacities is required: every resource that carries work needs at least 1 unit (otherwise INVALID_CAPACITIES: lists the missing resources). plan.schedule rejects what plan.submit rejects (INVALID_GRAPH:).
  • +13 more on the listing page

RoadRaven tools 22

  • updateNodeStatusPush a status update to a node. Requires the desktop app to be running and a roadmap loaded. Routes through the agent dispatcher so the change appears in the event-log drawer (Ctrl+Shift+L).
  • getEventApiStatusReturns the current Event API URL, PID, and startedAt — or an error if the app is not running.
  • getRoadmapReturn the full schema tree from the desktop app, with live-event statuses merged in, plus the current `revision` (pass it as expectedRevision on writes to detect stale reads). Pass omitNotes: true for polling (large roadmaps exceed the tool-result limit): it leaves out notes and the createdAt/updatedAt timestamps; fetch notes with getNode/findNodes. Requires the app to be running and a file to be loaded.
  • getNodeReturn a node by UUID, with its immediate parent ID, full ancestor chain (root-to-parent), and the current roadmap `revision`. Status reflects the live overlay if a recent event landed.
  • findNodesSearch nodes by AND-combined filter: titleContains (case-insensitive substring), status, type, metaKey + metaValue, parentId. All fields optional. Returns matching nodes (without their children; use parentId or getNode for those) with their parent IDs.
  • getStatusConfigReturn the loaded roadmap's statusConfig array (display labels/colors for statuses). Agent mutations accept only core node statuses.
  • getTypeConfigReturn the loaded roadmap's typeConfig array (the valid node-type IDs and their visual configuration).
  • getOpenFileReturn filePath (or null if untitled), isUntitled flag, document title, and total nodeCount. Works even when no file is loaded — returns null filePath and isUntitled=false.
  • createNodeAdd a child node under parentId with the given title. Optional: id (UUID or slug — supply it when recovering/recreating a node so its identity stays stable and history/metadata continuity survives file churn; duplicate_id if it already exists), type, core status (defaults to not-started), notes (markdown), metadata. Returns the new node's id. Requires a loaded roadmap.
  • createRoadmapInitialize an in-memory untitled schema (mirrors File > New). Optional: title, statusConfig, typeConfig. The agent must call saveFileAs to persist the new roadmap to disk.
  • renameNodeChange a node's title.
  • updateNodeTypeChange a node's type string. Use getTypeConfig to discover valid types.
  • +10 more on the listing page

Ready-to-paste client configs

Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.

Cpm Planner

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "cpm-planner": {
      "command": "npx",
      "args": [
        "-y",
        "@matthew-cochran/cpm"
      ],
      "env": {
        "CPM_PLANNER_DB": "YOUR_CPM_PLANNER_DB_HERE"
      }
    }
  }
}

RoadRaven

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "roadraven": {
      "command": "npx",
      "args": [
        "-y",
        "@roadraven/mcp@0.9.2"
      ]
    }
  }
}

Frequently asked questions

Cpm Planner is categorized under Product Management and uses a local stdio subprocess. RoadRaven belongs to Product Management and uses a local stdio subprocess. Pick Cpm Planner for product management work and RoadRaven for product management.

Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.

Cpm Planner is listed as free. Auth: no auth required. RoadRaven is listed as free. Auth: no auth required. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.

Yes. MCP clients support multiple servers: add cpm-planner and roadraven as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, Cpm Planner has a quality signal of 63/100 (Good) with 0 views, 0 installs and 0 GitHub stars. RoadRaven has 65/100 (Great) with 1 views, 0 installs and 10 GitHub stars.