@roadmapperai/mcp 0.7.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/AGENTS.md +47 -2
  2. package/README.md +22 -2
  3. package/package.json +1 -1
  4. package/server.mjs +1747 -98
package/AGENTS.md CHANGED
@@ -32,12 +32,29 @@ Roadmapper ships with `mcp/server.mjs`, a stdio MCP server. Read tools
32
32
  let you plan against real IDs; write tools let you act through the
33
33
  same surface when the operator has wired in a service-role key.
34
34
 
35
+ **Output is light by default.** All collection reads
36
+ (`get_roadmap_snapshot`, `list_tasks`, `list_capabilities`,
37
+ `list_uncategorized_tasks`) return **light rows** — identity + the few
38
+ fields you triage on — and are **capped** (50 rows for the list tools,
39
+ 50 tasks for the snapshot), wrapped in a `{ total, returned, truncated,
40
+ items }` envelope (the snapshot uses `counts` + `tasksTruncated`).
41
+ Heavy fields (`prs[]`, `acceptance[]`, `acceptanceGrades[]`,
42
+ `outcomeReadings[]`, `dependsOn[]`, long `summary`/`description`) are
43
+ omitted. This keeps a cold-start read from blowing the token budget on
44
+ a large workspace. To get full rows, pass `detail: true`; to raise the
45
+ cap, pass `limit` (max 200). **If `truncated` is true, narrow your
46
+ filter** (`capabilityId` / `status`) rather than cranking `limit` —
47
+ that's almost always what you actually want.
48
+
35
49
  **Read tools** (always available):
36
50
  - `get_roadmap_snapshot` — **start here**. One-call orient: returns
37
51
  themes, active capabilities, and in-flight tasks for the workspace
38
52
  in a single response. Saves you three round trips when you're just
39
- trying to orient. Always live, never cached. Response includes the
40
- resolved `workspaceId` you should pass back on any write call.
53
+ trying to orient. Always live, never cached. Light + capped by
54
+ default (see above); pass `detail: true` for full rows. Response
55
+ includes the resolved `workspaceId` you should pass back on any
56
+ write call, plus `mode` and `counts` (true totals regardless of the
57
+ task cap).
41
58
  - `list_themes` — get the theme catalogue.
42
59
  - `list_capabilities` — filter by `themeId` to scope your plan.
43
60
  **Excludes delivered capabilities by default** — agents should
@@ -47,8 +64,27 @@ same surface when the operator has wired in a service-role key.
47
64
  reopened, which is rare and should be a human call).
48
65
  - `list_tasks` — filter by `capabilityId` and/or `status` to see what
49
66
  already exists before proposing duplicates.
67
+ - `list_uncategorized_tasks` — the orphaned backlog: tasks with no
68
+ parent capability (`capabilityId` null), typically auto-created by
69
+ the GitHub webhook from PRs that carried no `Roadmapper-Capability:`
70
+ trailer and matched no capability. Use for triage — pair with
71
+ `suggest_capability_for({ taskId })` then `move_task` to file each
72
+ one. A long result is a signal that PRs aren't carrying trailers.
50
73
  - `get_task` — full task detail, including `acceptance`, `dependsOn`,
51
74
  and attached PRs.
75
+ - `suggest_capability_for` — rank existing capabilities by token
76
+ overlap against either a free-text `description` OR an existing
77
+ `taskId` (the server synthesizes the query from the task's title +
78
+ summary). The `taskId` form is the triage companion to
79
+ `list_uncategorized_tasks`. Pass exactly one of the two.
80
+ - `detect_capability_gaps` — the "a bet is **missing**" signal.
81
+ Clusters uncategorized tasks that fit *no* existing capability and
82
+ reports each cluster with shared keywords + a suggested capability
83
+ name. Distinct from `suggest_capability_for`, which finds an
84
+ *existing* home; this finds work with *no* home. Each gap is a
85
+ CANDIDATE for `propose_capability` (human-confirmed) followed by
86
+ `move_tasks`. Tune `minClusterSize` (default 3) / `fitThreshold`
87
+ (default 0.2) to control sensitivity.
52
88
  - `get_agents_md` — re-read this contract on demand.
53
89
 
54
90
  **Multi-workspace addressing.** A single MCP install can talk to any
@@ -92,6 +128,15 @@ to "tell the human what I'd do"):
92
128
  session id + a per-task counter) so a retry after a crash or
93
129
  transient error reuses the existing task instead of creating a
94
130
  duplicate. Response includes `idempotent: true` when that happens.
131
+ **Warn-on-skip:** if you call `propose_task` without having surveyed
132
+ capabilities this session (no `suggest_capability_for` /
133
+ `list_capabilities` / `get_roadmap_snapshot`), the response carries a
134
+ `warnings[]` entry + `_meta` nudge — and if the task text fits a
135
+ *different* capability noticeably better than the one you chose, it
136
+ names that capability so you can `move_task` it. The write still
137
+ succeeds (this is a nudge, not a gate — unlike `propose_capability`,
138
+ which hard-blocks until you've done discovery). Surface the warning
139
+ to the user.
95
140
  - `propose_capability` — create a new capability under an **existing**
96
141
  theme. Required: `name`, `pillarId`. Sensible defaults are applied
97
142
  (`reach: 100`, `impact: 1`, `confidence: 70`). Pass `outcome` and
package/README.md CHANGED
@@ -62,15 +62,33 @@ Read tools (always available):
62
62
  - `list_themes` — top-level strategic themes
63
63
  - `list_capabilities` — capabilities (optionally filtered by theme)
64
64
  - `list_tasks` — tasks (optionally filtered by capability or status)
65
+ - `list_uncategorized_tasks` — tasks with no parent capability (orphans the
66
+ webhook created from PRs with no `Roadmapper-Capability:` trailer); triage
67
+ entry point
65
68
  - `get_task` — full task detail including acceptance criteria + deps
66
69
  - `get_agents_md` — the planning rubric (the contract for proposals)
67
70
  - `get_roadmap_snapshot` — current state of the whole roadmap
68
- - `suggest_capability_for` — find existing capability that matches a description
71
+ - `get_active_workspace` — which workspace this server is pointed at and how
72
+ it resolved (arg / snapshot / env); confirm before writing
73
+ - `suggest_capability_for` — find the existing capability matching a
74
+ free-text description **or** an existing `taskId` (synthesizes the query
75
+ from the task's title + summary)
69
76
  - `suggest_theme_for` — find existing theme that matches a description
77
+ - `detect_capability_gaps` — cluster orphaned tasks that fit no existing
78
+ capability and flag where a new bet is likely missing
70
79
  - `list_stale_outcomes` — capabilities whose outcome metric hasn't been
71
80
  re-read recently
72
81
 
73
- Write tools (require workspace-scoped write auth coming in v0.2):
82
+ > **Output is light by default.** The collection reads
83
+ > (`get_roadmap_snapshot`, `list_tasks`, `list_capabilities`,
84
+ > `list_uncategorized_tasks`) return light rows and are capped (50), wrapped
85
+ > in a `{ total, returned, truncated, items }` envelope. Pass `detail: true`
86
+ > for full rows and `limit` (max 200) to raise the cap. This keeps a
87
+ > cold-start read from blowing the token budget on a large workspace.
88
+
89
+ Write tools (require workspace-scoped write auth — set `ROADMAPPER_API_KEY`
90
+ to an `rmpr_…` key from the dashboard; writes then route through the
91
+ mcp-broker so the service-role key never lives on your machine):
74
92
 
75
93
  - `propose_theme`, `propose_capability`, `propose_task` — file new work
76
94
  - `update_theme`, `update_capability`, `update_task` — patch existing rows
@@ -89,6 +107,8 @@ The intended loop:
89
107
  `list_capabilities` / `list_tasks`.
90
108
  3. Before proposing anything new, agent calls `suggest_capability_for`
91
109
  (or `suggest_theme_for`) to check if a matching parent already exists.
110
+ Skipping this is allowed for `propose_task` but the response will carry
111
+ a warn-on-skip nudge; `propose_capability` hard-requires it.
92
112
  4. Agent proposes new rows through the `propose_*` tools, including all
93
113
  the rubric-required fields (RICE, acceptance criteria, etc.).
94
114
  5. Once a PR is merged, the agent calls `link_pr` to attach it; the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roadmapperai/mcp",
3
- "version": "0.7.1",
3
+ "version": "0.9.0",
4
4
  "description": "Roadmapper AI MCP server — exposes a planning surface (themes, capabilities, tasks, sprints, PRs) to coding agents via stdio JSON-RPC. Pairs with the Roadmapper AI workspace at dashboard.roadmapperai.com.",
5
5
  "keywords": [
6
6
  "mcp",