@roadmapperai/mcp 0.7.0 → 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.
- package/AGENTS.md +47 -2
- package/README.md +22 -2
- package/package.json +1 -1
- package/server.mjs +1755 -99
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.
|
|
40
|
-
|
|
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
|
-
- `
|
|
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
|
-
|
|
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.
|
|
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",
|