@unified-product-graph/mcp-server 0.8.2 → 0.8.4

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schema_version": "2",
3
3
  "package": "@unified-product-graph/mcp-server",
4
- "package_version": "0.8.2",
5
- "tool_count": 94,
4
+ "package_version": "0.8.4",
5
+ "tool_count": 96,
6
6
  "domains": [
7
7
  "context",
8
8
  "nodes",
@@ -1135,7 +1135,7 @@
1135
1135
  "see": [
1136
1136
  "create_edge"
1137
1137
  ],
1138
- "source": "src/tools/edges.ts:209",
1138
+ "source": "src/tools/edges.ts:210",
1139
1139
  "symbol": "batchCreateEdges",
1140
1140
  "returns": "JSON: `{ created, count }`.",
1141
1141
  "return_shape": "{ created, count }",
@@ -1174,7 +1174,7 @@
1174
1174
  "see": [
1175
1175
  "delete_edge"
1176
1176
  ],
1177
- "source": "src/tools/edges.ts:297",
1177
+ "source": "src/tools/edges.ts:298",
1178
1178
  "symbol": "batchDeleteEdges",
1179
1179
  "returns": "JSON: `{ deleted, count }`.",
1180
1180
  "return_shape": "{ deleted, count }",
@@ -1225,7 +1225,7 @@
1225
1225
  "see": [
1226
1226
  "move_node"
1227
1227
  ],
1228
- "source": "src/tools/edges.ts:177",
1228
+ "source": "src/tools/edges.ts:178",
1229
1229
  "symbol": "batchMoveNodes",
1230
1230
  "returns": "JSON: `{ moves, warnings? }` mirroring the per-move result of\n`move_node`.",
1231
1231
  "return_shape": "{ moves, warnings? }",
@@ -1260,6 +1260,10 @@
1260
1260
  "type": {
1261
1261
  "type": "string",
1262
1262
  "description": "Edge type. Auto-inferred if omitted."
1263
+ },
1264
+ "properties": {
1265
+ "type": "object",
1266
+ "description": "Edge-scoped properties. Only permitted on edge types that opt in (currently framework_exercise_includes_node); rejected on plain semantic edges."
1263
1267
  }
1264
1268
  },
1265
1269
  "required": [
@@ -1313,7 +1317,7 @@
1313
1317
  "export_edges",
1314
1318
  "repair_dangling_edges"
1315
1319
  ],
1316
- "source": "src/tools/edges.ts:122",
1320
+ "source": "src/tools/edges.ts:123",
1317
1321
  "symbol": "deleteEdge",
1318
1322
  "returns": "JSON: the removed edge object.",
1319
1323
  "return_notes": [
@@ -1364,7 +1368,7 @@
1364
1368
  "query",
1365
1369
  "list_nodes"
1366
1370
  ],
1367
- "source": "src/tools/edges.ts:407",
1371
+ "source": "src/tools/edges.ts:408",
1368
1372
  "symbol": "exportEdges",
1369
1373
  "returns": "JSON: `{ edges, total, offset, limit, types?, _hash }`. Each edge\ncarries `{ id, source, target, type, mapping_confidence? }`.",
1370
1374
  "return_shape": "{ edges, total, offset, limit, types?, _hash }",
@@ -1410,7 +1414,7 @@
1410
1414
  "see": [
1411
1415
  "batch_move_nodes"
1412
1416
  ],
1413
- "source": "src/tools/edges.ts:149",
1417
+ "source": "src/tools/edges.ts:150",
1414
1418
  "symbol": "moveNode",
1415
1419
  "returns": "JSON: `{ moved: true, node_id, new_parent_id, new_edge,\nold_edge_id?, warning? }`. The internal `removed_edge` field is stripped\nfrom the wire payload.",
1416
1420
  "return_shape": "{ moved: true, node_id, new_parent_id, new_edge, old_edge_id?, warning? }",
@@ -1457,7 +1461,7 @@
1457
1461
  "migrate_type",
1458
1462
  "export_edges"
1459
1463
  ],
1460
- "source": "src/tools/edges.ts:494",
1464
+ "source": "src/tools/edges.ts:495",
1461
1465
  "symbol": "renameEdgeType",
1462
1466
  "returns": "JSON: with `dry_run: true`, `{ dry_run, from, to, flip, would_rename, sample }`.\nWith `dry_run: false`, `{ dry_run, from, to, flip, renamed, ids }`.",
1463
1467
  "return_notes": [
@@ -1505,7 +1509,7 @@
1505
1509
  "Dropping `corrupt` edges is irreversible. The integrity stamp is\nre-computed on next save; a subsequent reload won't bring them back."
1506
1510
  ],
1507
1511
  "see": [],
1508
- "source": "src/tools/edges.ts:341",
1512
+ "source": "src/tools/edges.ts:342",
1509
1513
  "symbol": "repairDanglingEdges",
1510
1514
  "returns": "JSON: `{ dry_run, report, dropped?, remaining? }`. `report` is\nthe pre-action classification. With `dry_run: false`, `dropped` is the\ncount of edges removed and `remaining` is the post-action report.",
1511
1515
  "return_shape": "{ dry_run, report, dropped?, remaining? }",
@@ -2109,6 +2113,51 @@
2109
2113
  "return_shape": "{ type, alias_of?, domain, expected_properties, edges_out, edges_in, phases?, initial_phase?, terminal_phases?, domain_guide? }",
2110
2114
  "atomicity": "atomic (read-only)"
2111
2115
  },
2116
+ {
2117
+ "name": "apply_framework",
2118
+ "description": "Apply a framework (MoSCoW, RICE, Kano, ...) to a set of entities: creates a framework_exercise node and an `includes` edge to each entity. The per-entity result is recorded on the edge via score_entity, never on the entity node, so the same entity can sit in many exercises and any entity type can be scored. Returns { exercise_id, exercise, included, warnings }.",
2119
+ "domain": "spec",
2120
+ "inputSchema": {
2121
+ "type": "object",
2122
+ "properties": {
2123
+ "framework_id": {
2124
+ "type": "string",
2125
+ "description": "Required. UPGFramework.id (e.g. \"moscow\", \"rice-scoring\")."
2126
+ },
2127
+ "title": {
2128
+ "type": "string",
2129
+ "description": "Human label for the exercise (default \"<Framework> exercise\")."
2130
+ },
2131
+ "entity_ids": {
2132
+ "type": "array",
2133
+ "items": {
2134
+ "type": "string"
2135
+ },
2136
+ "description": "Entities to pull into the exercise (any type)."
2137
+ },
2138
+ "status": {
2139
+ "type": "string",
2140
+ "description": "Lifecycle phase: draft | active | archived (default draft)."
2141
+ }
2142
+ },
2143
+ "required": [
2144
+ "framework_id"
2145
+ ]
2146
+ },
2147
+ "throws": [
2148
+ "textError on a missing/unknown framework_id."
2149
+ ],
2150
+ "examples": [],
2151
+ "warnings": [],
2152
+ "see": [
2153
+ "score_entity"
2154
+ ],
2155
+ "source": "src/tools/frameworks.ts:22",
2156
+ "symbol": "applyFramework",
2157
+ "returns": "JSON: `{ exercise_id, exercise, included: [{ edge_id, entity_id }], warnings }`.",
2158
+ "return_shape": "{ exercise_id, exercise, included: [{ edge_id, entity_id }], warnings }",
2159
+ "atomicity": "atomic."
2160
+ },
2112
2161
  {
2113
2162
  "name": "get_anti_pattern",
2114
2163
  "description": "Return one curated anti-pattern by id (kebab-case slug, e.g. \"features-without-hypotheses\", \"personas-without-jobs\"). Includes structured condition, why-it-matters, remediation, applicable stages, severity, optional source citation. IDs are stable URL fragments.",
@@ -2142,7 +2191,7 @@
2142
2191
  "inspect",
2143
2192
  "validate_graph"
2144
2193
  ],
2145
- "source": "src/tools/spec.ts:1434",
2194
+ "source": "src/tools/spec.ts:1440",
2146
2195
  "symbol": "getAntiPattern",
2147
2196
  "returns": "JSON: `UPGCuratedAntiPattern`",
2148
2197
  "return_notes": [
@@ -2233,7 +2282,7 @@
2233
2282
  "list_anti_patterns",
2234
2283
  "get_playbook"
2235
2284
  ],
2236
- "source": "src/tools/spec.ts:755",
2285
+ "source": "src/tools/spec.ts:761",
2237
2286
  "symbol": "getDomainGuide",
2238
2287
  "returns": "JSON: the full `UPGDomainUsageGuide` record.",
2239
2288
  "return_notes": [
@@ -2271,7 +2320,7 @@
2271
2320
  "list_domains",
2272
2321
  "get_domain_guide"
2273
2322
  ],
2274
- "source": "src/tools/spec.ts:1890",
2323
+ "source": "src/tools/spec.ts:1896",
2275
2324
  "symbol": "getDomainRing",
2276
2325
  "returns": "JSON: the full `UPGDomainRing` record.",
2277
2326
  "return_notes": [
@@ -2312,7 +2361,7 @@
2312
2361
  "list_edge_migrations",
2313
2362
  "rename_edge_type"
2314
2363
  ],
2315
- "source": "src/tools/spec.ts:886",
2364
+ "source": "src/tools/spec.ts:892",
2316
2365
  "symbol": "getEdgeType",
2317
2366
  "returns": "JSON: `{ type, forward_verb, reverse_verb, classification, source_type, target_type }`",
2318
2367
  "return_shape": "{ type, forward_verb, reverse_verb, classification, source_type, target_type }",
@@ -2351,7 +2400,7 @@
2351
2400
  "get_entity_schema",
2352
2401
  "list_type_migrations"
2353
2402
  ],
2354
- "source": "src/tools/spec.ts:1349",
2403
+ "source": "src/tools/spec.ts:1355",
2355
2404
  "symbol": "getEntityMeta",
2356
2405
  "returns": "JSON: `EntityTypeMeta & { domain_id: string | null }`",
2357
2406
  "return_notes": [
@@ -2392,7 +2441,7 @@
2392
2441
  "get_playbook",
2393
2442
  "get_approach"
2394
2443
  ],
2395
- "source": "src/tools/spec.ts:823",
2444
+ "source": "src/tools/spec.ts:829",
2396
2445
  "symbol": "getFramework",
2397
2446
  "returns": "JSON: the full `UPGFramework` record.",
2398
2447
  "return_notes": [
@@ -2433,7 +2482,7 @@
2433
2482
  "get_framework",
2434
2483
  "list_entity_types"
2435
2484
  ],
2436
- "source": "src/tools/spec.ts:1143",
2485
+ "source": "src/tools/spec.ts:1149",
2437
2486
  "symbol": "getLensTool",
2438
2487
  "returns": "JSON: `{ ...UPGLens, visible_types: string[] }`",
2439
2488
  "return_shape": "{...UPGLens, visible_types: string[] }",
@@ -2469,7 +2518,7 @@
2469
2518
  "get_entity_meta",
2470
2519
  "get_entity_schema"
2471
2520
  ],
2472
- "source": "src/tools/spec.ts:1760",
2521
+ "source": "src/tools/spec.ts:1766",
2473
2522
  "symbol": "getLifecycle",
2474
2523
  "returns": "JSON: the full `UPGLifecycle` record, or a descriptive message.",
2475
2524
  "return_notes": [
@@ -2551,7 +2600,7 @@
2551
2600
  "get_playbook",
2552
2601
  "list_lenses"
2553
2602
  ],
2554
- "source": "src/tools/spec.ts:945",
2603
+ "source": "src/tools/spec.ts:951",
2555
2604
  "symbol": "getRegion",
2556
2605
  "returns": "JSON: the full `UPGRegion` record.",
2557
2606
  "return_notes": [
@@ -2592,7 +2641,7 @@
2592
2641
  "get_entity_meta",
2593
2642
  "list_entity_types"
2594
2643
  ],
2595
- "source": "src/tools/spec.ts:967",
2644
+ "source": "src/tools/spec.ts:973",
2596
2645
  "symbol": "getRegionForEntity",
2597
2646
  "returns": "JSON: the full `UPGRegion` record.",
2598
2647
  "return_notes": [
@@ -2623,7 +2672,7 @@
2623
2672
  "list_scales",
2624
2673
  "get_entity_schema"
2625
2674
  ],
2626
- "source": "src/tools/spec.ts:1806",
2675
+ "source": "src/tools/spec.ts:1812",
2627
2676
  "symbol": "getScale",
2628
2677
  "returns": "JSON: the full `UPGScaleDefinition` record including all points.",
2629
2678
  "return_notes": [
@@ -2654,7 +2703,7 @@
2654
2703
  "list_edge_types",
2655
2704
  "list_regions"
2656
2705
  ],
2657
- "source": "src/tools/spec.ts:995",
2706
+ "source": "src/tools/spec.ts:1001",
2658
2707
  "symbol": "getSpecVersion",
2659
2708
  "returns": "JSON: `{ upg_version, markdown_format_version, entity_count, edge_count, domain_count, region_count }`",
2660
2709
  "return_shape": "{ upg_version, markdown_format_version, entity_count, edge_count, domain_count, region_count }",
@@ -2700,7 +2749,7 @@
2700
2749
  "get_entity_meta",
2701
2750
  "list_frameworks"
2702
2751
  ],
2703
- "source": "src/tools/spec.ts:1211",
2752
+ "source": "src/tools/spec.ts:1217",
2704
2753
  "symbol": "getTypeLabel",
2705
2754
  "returns": "JSON: `{ ...UPGTypeLabel, resolved_label: string }`",
2706
2755
  "return_shape": "{...UPGTypeLabel, resolved_label: string }",
@@ -2739,7 +2788,7 @@
2739
2788
  "get_entity_meta",
2740
2789
  "create_node"
2741
2790
  ],
2742
- "source": "src/tools/spec.ts:1241",
2791
+ "source": "src/tools/spec.ts:1247",
2743
2792
  "symbol": "getValidChildrenTool",
2744
2793
  "returns": "JSON: `{ parent_type, valid_children: string[] }`",
2745
2794
  "return_shape": "{ parent_type, valid_children: string[] }",
@@ -2842,7 +2891,7 @@
2842
2891
  "inspect",
2843
2892
  "get_domain_guide"
2844
2893
  ],
2845
- "source": "src/tools/spec.ts:1392",
2894
+ "source": "src/tools/spec.ts:1398",
2846
2895
  "symbol": "listAntiPatterns",
2847
2896
  "returns": "JSON: `{ total, count, next_cursor?, anti_patterns: UPGCuratedAntiPattern[] }`",
2848
2897
  "return_shape": "{ total, count, next_cursor?, anti_patterns: UPGCuratedAntiPattern[] }",
@@ -2943,7 +2992,7 @@
2943
2992
  "list_domains",
2944
2993
  "list_anti_patterns"
2945
2994
  ],
2946
- "source": "src/tools/spec.ts:1481",
2995
+ "source": "src/tools/spec.ts:1487",
2947
2996
  "symbol": "listBenchmarks",
2948
2997
  "returns": "JSON: `{ kind, total, count, benchmarks: ... }`",
2949
2998
  "return_shape": "{ kind, total, count, benchmarks:... }",
@@ -2971,7 +3020,7 @@
2971
3020
  "list_portfolio_cross_edges",
2972
3021
  "migrate_cross_edges"
2973
3022
  ],
2974
- "source": "src/tools/spec.ts:1081",
3023
+ "source": "src/tools/spec.ts:1087",
2975
3024
  "symbol": "listCrossEdgeTypes",
2976
3025
  "returns": "JSON: `{ count, types: readonly UPGCrossEdgeType[] }`",
2977
3026
  "return_shape": "{ count, types: readonly UPGCrossEdgeType[] }",
@@ -2999,7 +3048,7 @@
2999
3048
  "list_domains",
3000
3049
  "get_domain_guide"
3001
3050
  ],
3002
- "source": "src/tools/spec.ts:1869",
3051
+ "source": "src/tools/spec.ts:1875",
3003
3052
  "symbol": "listDomainRings",
3004
3053
  "returns": "JSON: `{ rings: UPGDomainRing[], total: number }`",
3005
3054
  "return_shape": "{ rings: UPGDomainRing[], total: number }",
@@ -3034,7 +3083,7 @@
3034
3083
  "list_regions",
3035
3084
  "list_entity_types"
3036
3085
  ],
3037
- "source": "src/tools/spec.ts:720",
3086
+ "source": "src/tools/spec.ts:726",
3038
3087
  "symbol": "listDomains",
3039
3088
  "returns": "JSON: `{ count, domains: Array<{ domain_id, anchor_entity, creation_sequence } | { domain_id, label, description, types, has_guide }> }`",
3040
3089
  "return_shape": "{ count, domains: Array<{ domain_id, anchor_entity, creation_sequence } | { domain_id, label, description, types, has_guide }> }",
@@ -3069,7 +3118,7 @@
3069
3118
  "list_edge_types",
3070
3119
  "validate_graph"
3071
3120
  ],
3072
- "source": "src/tools/spec.ts:1653",
3121
+ "source": "src/tools/spec.ts:1659",
3073
3122
  "symbol": "listEdgeMigrations",
3074
3123
  "returns": "JSON: `{ migrations: [{ kind, from, to?, since }], total: number }`",
3075
3124
  "return_shape": "{ migrations: [{ kind, from, to?, since }], total: number }",
@@ -3108,7 +3157,7 @@
3108
3157
  "list_edge_migrations",
3109
3158
  "create_edge"
3110
3159
  ],
3111
- "source": "src/tools/spec.ts:867",
3160
+ "source": "src/tools/spec.ts:873",
3112
3161
  "symbol": "listEdgeTypes",
3113
3162
  "returns": "JSON: `{ count, edges: Array<{ type, forward_verb, reverse_verb, classification, source_type, target_type }> }`",
3114
3163
  "return_shape": "{ count, edges: Array<{ type, forward_verb, reverse_verb, classification, source_type, target_type }> }",
@@ -3166,7 +3215,7 @@
3166
3215
  "list_type_migrations",
3167
3216
  "list_domains"
3168
3217
  ],
3169
- "source": "src/tools/spec.ts:1293",
3218
+ "source": "src/tools/spec.ts:1299",
3170
3219
  "symbol": "listEntityTypes",
3171
3220
  "returns": "JSON: `{ total, count, next_cursor?, types: Array<EntityTypeMeta & { domain_id: string | null }> }`",
3172
3221
  "return_shape": "{ total, count, next_cursor?, types: Array<EntityTypeMeta & { domain_id: string | null }> }",
@@ -3193,7 +3242,7 @@
3193
3242
  "list_frameworks",
3194
3243
  "list_framework_structure_patterns"
3195
3244
  ],
3196
- "source": "src/tools/spec.ts:1825",
3245
+ "source": "src/tools/spec.ts:1831",
3197
3246
  "symbol": "listFrameworkCategories",
3198
3247
  "returns": "JSON: `{ categories: string[], total: number }`",
3199
3248
  "return_shape": "{ categories: string[], total: number }",
@@ -3221,7 +3270,7 @@
3221
3270
  "list_framework_categories",
3222
3271
  "get_framework"
3223
3272
  ],
3224
- "source": "src/tools/spec.ts:1846",
3273
+ "source": "src/tools/spec.ts:1852",
3225
3274
  "symbol": "listFrameworkStructurePatterns",
3226
3275
  "returns": "JSON: `{ patterns: string[], total: number }`",
3227
3276
  "return_shape": "{ patterns: string[], total: number }",
@@ -3264,7 +3313,7 @@
3264
3313
  "prioritise",
3265
3314
  "list_approaches"
3266
3315
  ],
3267
- "source": "src/tools/spec.ts:787",
3316
+ "source": "src/tools/spec.ts:793",
3268
3317
  "symbol": "listFrameworks",
3269
3318
  "returns": "JSON: `{ total, count, next_cursor?, frameworks: UPGFramework[] }`",
3270
3319
  "return_shape": "{ total, count, next_cursor?, frameworks: UPGFramework[] }",
@@ -3293,7 +3342,7 @@
3293
3342
  "list_playbooks",
3294
3343
  "list_frameworks"
3295
3344
  ],
3296
- "source": "src/tools/spec.ts:1110",
3345
+ "source": "src/tools/spec.ts:1116",
3297
3346
  "symbol": "listLenses",
3298
3347
  "returns": "JSON: `{ count, lenses: Array<{ id, name, description, icon, audience, perspective, framework_id?, playbook_id?, visible_domain_count, intelligence_prompt_count }> }`",
3299
3348
  "return_shape": "{ count, lenses: Array<{ id, name, description, icon, audience, perspective, framework_id?, playbook_id?, visible_domain_count, intelligence_prompt_count }> }",
@@ -3330,7 +3379,7 @@
3330
3379
  "list_entity_types",
3331
3380
  "get_entity_meta"
3332
3381
  ],
3333
- "source": "src/tools/spec.ts:1718",
3382
+ "source": "src/tools/spec.ts:1724",
3334
3383
  "symbol": "listLifecycles",
3335
3384
  "returns": "JSON: `{ lifecycles, total, free_types: string[], planned_types: string[] }`",
3336
3385
  "return_shape": "{ lifecycles, total, free_types: string[], planned_types: string[] }",
@@ -3401,7 +3450,7 @@
3401
3450
  "list_domain_rings",
3402
3451
  "create_product"
3403
3452
  ],
3404
- "source": "src/tools/spec.ts:1589",
3453
+ "source": "src/tools/spec.ts:1595",
3405
3454
  "symbol": "listProductStages",
3406
3455
  "returns": "JSON: `{ count, stages: readonly UPGProductStage[] }`",
3407
3456
  "return_shape": "{ count, stages: readonly UPGProductStage[] }",
@@ -3430,7 +3479,7 @@
3430
3479
  "list_domains",
3431
3480
  "list_playbooks"
3432
3481
  ],
3433
- "source": "src/tools/spec.ts:913",
3482
+ "source": "src/tools/spec.ts:919",
3434
3483
  "symbol": "listRegions",
3435
3484
  "returns": "JSON: `{ count, regions: Array<{ id, label, order, shape, mental_model, anchor_type, composes_atomic_domains, entity_count, intra_edge_count, boundary_edge_count }> }`",
3436
3485
  "return_shape": "{ count, regions: Array<{ id, label, order, shape, mental_model, anchor_type, composes_atomic_domains, entity_count, intra_edge_count, boundary_edge_count }> }",
@@ -3457,7 +3506,7 @@
3457
3506
  "get_scale",
3458
3507
  "get_entity_schema"
3459
3508
  ],
3460
- "source": "src/tools/spec.ts:1791",
3509
+ "source": "src/tools/spec.ts:1797",
3461
3510
  "symbol": "listScales",
3462
3511
  "returns": "JSON: `{ scales: UPGScaleDefinition[], total: number }`",
3463
3512
  "return_shape": "{ scales: UPGScaleDefinition[], total: number }",
@@ -3486,7 +3535,7 @@
3486
3535
  "migrate_type",
3487
3536
  "validate_graph"
3488
3537
  ],
3489
- "source": "src/tools/spec.ts:1690",
3538
+ "source": "src/tools/spec.ts:1696",
3490
3539
  "symbol": "listSplitMigrations",
3491
3540
  "returns": "JSON: `{ splits: [...], total: number }`",
3492
3541
  "return_shape": "{ splits: [...], total: number }",
@@ -3523,7 +3572,7 @@
3523
3572
  "list_entity_types",
3524
3573
  "get_entity_meta"
3525
3574
  ],
3526
- "source": "src/tools/spec.ts:1176",
3575
+ "source": "src/tools/spec.ts:1182",
3527
3576
  "symbol": "listTypeLabels",
3528
3577
  "returns": "JSON: `{ total, count, next_cursor?, labels: UPGTypeLabel[] }`",
3529
3578
  "return_shape": "{ total, count, next_cursor?, labels: UPGTypeLabel[] }",
@@ -3559,7 +3608,7 @@
3559
3608
  "validate_graph",
3560
3609
  "list_entity_types"
3561
3610
  ],
3562
- "source": "src/tools/spec.ts:1622",
3611
+ "source": "src/tools/spec.ts:1628",
3563
3612
  "symbol": "listTypeMigrations",
3564
3613
  "returns": "JSON: `{ migrations: [{ from, to, since }], total: number }`",
3565
3614
  "return_shape": "{ migrations: [{ from, to, since }], total: number }",
@@ -3618,15 +3667,18 @@
3618
3667
  "items": {
3619
3668
  "type": "string"
3620
3669
  },
3621
- "description": "Required. entity_id[] to rank."
3670
+ "description": "entity_id[] to rank. Optional when exercise_id is given (the exercise supplies them)."
3622
3671
  },
3623
3672
  "framework_id": {
3624
3673
  "type": "string",
3625
3674
  "description": "Required. UPGFramework.id of the scoring lens (e.g. \"rice-scoring\", \"ice-scoring\", \"kano-model\", \"cost-of-delay\", \"wsjf\")."
3675
+ },
3676
+ "exercise_id": {
3677
+ "type": "string",
3678
+ "description": "Optional (0.8.4). A framework_exercise id: reads each candidate's scoring inputs from its includes-edge properties instead of node.properties, and bypasses the target-type guard so any entity type can be scored."
3626
3679
  }
3627
3680
  },
3628
3681
  "required": [
3629
- "candidates",
3630
3682
  "framework_id"
3631
3683
  ]
3632
3684
  },
@@ -3694,7 +3746,7 @@
3694
3746
  "plan",
3695
3747
  "get_anti_pattern"
3696
3748
  ],
3697
- "source": "src/tools/spec.ts:670",
3749
+ "source": "src/tools/spec.ts:676",
3698
3750
  "symbol": "reflect",
3699
3751
  "returns": "JSON envelope: `{ approach_id, scope, generated_at, approach,\nparams, prompts, execution_mode: \"execution_v0_4_0\" }`",
3700
3752
  "return_notes": [
@@ -3742,12 +3794,56 @@
3742
3794
  "create_edge",
3743
3795
  "trace"
3744
3796
  ],
3745
- "source": "src/tools/spec.ts:1049",
3797
+ "source": "src/tools/spec.ts:1055",
3746
3798
  "symbol": "resolveEdgeForPair",
3747
3799
  "returns": "JSON: `{ source_type, target_type, edge_type: string | null,\nanchor_hint?, alternate_anchors?, adjacent_edges? }`",
3748
3800
  "return_shape": "{ source_type, target_type, edge_type: string | null, anchor_hint?, alternate_anchors?, adjacent_edges? }",
3749
3801
  "atomicity": "atomic (read-only)"
3750
3802
  },
3803
+ {
3804
+ "name": "score_entity",
3805
+ "description": "Record a framework's result for one entity on the exercise's includes edge (a MoSCoW bucket, a RICE score, a canvas slot). Auto-includes the entity if not already in scope. Merges into existing edge properties unless replace is set. Returns { edge, warnings }.",
3806
+ "domain": "spec",
3807
+ "inputSchema": {
3808
+ "type": "object",
3809
+ "properties": {
3810
+ "exercise_id": {
3811
+ "type": "string",
3812
+ "description": "Required. The framework_exercise id."
3813
+ },
3814
+ "entity_id": {
3815
+ "type": "string",
3816
+ "description": "Required. The entity being scored."
3817
+ },
3818
+ "values": {
3819
+ "type": "object",
3820
+ "description": "Required. The result as { input: value }, e.g. { \"moscow\": \"must\" } or { \"reach\": 800, \"impact\": 3 }."
3821
+ },
3822
+ "replace": {
3823
+ "type": "boolean",
3824
+ "description": "Replace the edge properties instead of merging (default false)."
3825
+ }
3826
+ },
3827
+ "required": [
3828
+ "exercise_id",
3829
+ "entity_id",
3830
+ "values"
3831
+ ]
3832
+ },
3833
+ "throws": [
3834
+ "textError when the exercise/entity is missing or the node is not a\nframework_exercise."
3835
+ ],
3836
+ "examples": [],
3837
+ "warnings": [],
3838
+ "see": [
3839
+ "apply_framework"
3840
+ ],
3841
+ "source": "src/tools/frameworks.ts:63",
3842
+ "symbol": "scoreEntity",
3843
+ "returns": "JSON: `{ edge, warnings }`.",
3844
+ "return_shape": "{ edge, warnings }",
3845
+ "atomicity": "atomic."
3846
+ },
3751
3847
  {
3752
3848
  "name": "trace",
3753
3849
  "description": "[LLM-mediated] This tool returns a routing envelope, not computed results. For user-facing tracing, invoke the /upg-trace skill instead of calling this tool directly. Trace approach: path of arrival to \"walk a meaningful path through existing graph\". Returns the Trace record + invocation params in the family-resemblance envelope. The LLM uses `anchor` + `path` to compose `query()` calls and emits `{ trail: [{ depth, entity_id, edge_type_in }], reached: entity_id[] }`. `path` is type-shorthand: `[\"persona\",\"job\",\"feature\"]` walks persona→job→feature using the canonical edge per pair (via `resolve_edge_for_pair`). Optional `edges_override` selects non-canonical edges per hop; `null` per element means \"use canonical\".",
@@ -3801,7 +3897,7 @@
3801
3897
  "plan",
3802
3898
  "prioritise"
3803
3899
  ],
3804
- "source": "src/tools/spec.ts:607",
3900
+ "source": "src/tools/spec.ts:613",
3805
3901
  "symbol": "trace",
3806
3902
  "returns": "JSON envelope: `{ approach_id, scope, generated_at, approach,\nparams, trail, reached, error?, halted_at_depth?,\nexecution_mode: \"execution_v0_4_0\" }`",
3807
3903
  "return_notes": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unified-product-graph/mcp-server",
3
- "version": "0.8.2",
3
+ "version": "0.8.4",
4
4
  "description": "Local MCP server for .upg files. Read and write product knowledge graphs offline.",
5
5
  "license": "MIT",
6
6
  "author": "The Product Creator <hello@theproductcreator.com>",