@unified-product-graph/mcp-server 0.8.6 → 0.8.8

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.
@@ -20,7 +20,8 @@ This is the home of the **Prioritise** approach. Where Inspect tells you *what's
20
20
  Use the `mcp__unified-product-graph__*` MCP tools:
21
21
  - **Read candidates:** `list_nodes`, `search_nodes`, `get_node`, `get_product_context`
22
22
  - **Approach + frameworks:** `get_approach({ approach_id: "prioritise" })`, `get_framework({ framework_id: "..." })`
23
- - **Capture decisions (optional):** `create_node`, `update_node`, `create_edge`
23
+ - **Run + record a framework (the result lives on the graph):** `apply_framework` (creates the exercise and pulls candidates in), `score_entity` (records each candidate's result on its edge). On the CLI: `upg apply <framework> [ids...]`, `upg score <exercise> <entity> --data '{...}'`, and `upg show <exercise>` to read the scores back.
24
+ - **Capture a decision (optional):** `create_node`, `update_node`, `create_edge`
24
25
 
25
26
  ## The Prioritisation Frameworks
26
27
 
@@ -152,18 +153,32 @@ Always add a one-sentence interpretation below the output: what does the ranking
152
153
 
153
154
  ### Step 5: Capture the Results
154
155
 
155
- Prioritisation that stays in a conversation dies. After presenting the results, ask:
156
+ Prioritisation that stays in a conversation dies. The scoring run you just
157
+ facilitated is itself a first-class object: a **framework exercise**. Running a
158
+ framework over a set of candidates creates a `framework_exercise` node, and each
159
+ candidate's result is recorded on an `includes` edge from the exercise to that
160
+ entity. The score lives on the **edge**, not the candidate node, so the same
161
+ feature can be a "must" in one exercise and a "could" in another, and the entity
162
+ stays clean and queryable.
156
163
 
157
- > **What do you want to capture from this?**
164
+ Record the run (confirm before writing):
158
165
 
159
- Common patterns and where they go:
166
+ - **MCP:** `apply_framework({ framework_id, entity_ids, title })` to create the
167
+ exercise and pull the candidates in, then `score_entity({ exercise_id,
168
+ entity_id, values })` per candidate. `values` is the result you computed, e.g.
169
+ `{ "moscow": "must" }` or `{ "reach": 4, "impact": 5, "confidence": 3, "effort": 2 }`.
170
+ - **CLI:** `upg apply <framework> <id...> --title "..."`, then
171
+ `upg score <exercise> <entity> --data '{...}'`; read it back with
172
+ `upg show <exercise>`.
173
+
174
+ You can also capture the *decision* the ranking led to, which is distinct from the
175
+ scores themselves:
160
176
 
161
177
  | What to capture | How |
162
178
  |-----------------|-----|
163
- | A prioritisation decision (chosen framework + top-ranked candidate) | `create_node` with type `decision`, link to candidates |
164
- | An updated `priority` field on existing nodes | `update_node` on each candidate |
165
- | A now-explicit "Won't do" item | `create_node` with type `decision`, note the rationale for deferral |
166
- | The full scoring run, for reference | Add as a `note` field on a `decision` node |
179
+ | The scoring run (every candidate's result) | `apply_framework` + `score_entity` (above) |
180
+ | A prioritisation decision (chosen framework + what you will do) | `create_node` type `decision`, linked to the exercise and the top candidates |
181
+ | A now-explicit "Won't do" item | `create_node` type `decision`, note the rationale for deferral |
167
182
 
168
183
  Always confirm before writing. Never silently mutate graph nodes.
169
184