@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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema_version": "2",
3
3
  "package": "@unified-product-graph/mcp-server",
4
- "package_version": "0.8.6",
4
+ "package_version": "0.8.8",
5
5
  "tool_count": 96,
6
6
  "domains": [
7
7
  "context",
@@ -308,7 +308,7 @@
308
308
  "create_node",
309
309
  "batch_create_edges"
310
310
  ],
311
- "source": "src/tools/nodes.ts:1013",
311
+ "source": "src/tools/nodes.ts:1019",
312
312
  "symbol": "batchCreateNodes",
313
313
  "returns": "JSON: `{ created, edges_created, count, edges_count, warnings? }`.",
314
314
  "return_shape": "{ created, edges_created, count, edges_count, warnings? }",
@@ -347,7 +347,7 @@
347
347
  "see": [
348
348
  "delete_node"
349
349
  ],
350
- "source": "src/tools/nodes.ts:1117",
350
+ "source": "src/tools/nodes.ts:1123",
351
351
  "symbol": "batchDeleteNodes",
352
352
  "returns": "JSON: `{ deleted, edges_removed, count }`.",
353
353
  "return_shape": "{ deleted, edges_removed, count }",
@@ -408,7 +408,7 @@
408
408
  "see": [
409
409
  "update_node"
410
410
  ],
411
- "source": "src/tools/nodes.ts:1041",
411
+ "source": "src/tools/nodes.ts:1047",
412
412
  "symbol": "batchUpdateNodes",
413
413
  "returns": "JSON: `{ updated, count, warnings? }`. `warnings` carries\nlifecycle-phase hints aggregated across the batch.",
414
414
  "return_shape": "{ updated, count, warnings? }",
@@ -480,7 +480,7 @@
480
480
  "batch_create_nodes",
481
481
  "update_node"
482
482
  ],
483
- "source": "src/tools/nodes.ts:727",
483
+ "source": "src/tools/nodes.ts:733",
484
484
  "symbol": "createNode",
485
485
  "returns": "JSON: `{ node, edge?, unknown_properties?, warning? }`. The `edge`\nfield is present only when `parent_id` was supplied and a canonical\nhierarchy edge could be inferred. `unknown_properties` and `warning` are\npresent when the caller passed properties not in the entity's schema.\nPass `strict: true` to reject unknown properties instead of\nwarning. For portfolio-scoped types the response shape is\n`{ node, portfolio_file, written_to, warning? }` where `node` is the\npersisted typed record.",
486
486
  "return_shape": "{ node, edge?, unknown_properties?, warning? }",
@@ -532,7 +532,7 @@
532
532
  "batch_delete_nodes",
533
533
  "validate_graph"
534
534
  ],
535
- "source": "src/tools/nodes.ts:1362",
535
+ "source": "src/tools/nodes.ts:1368",
536
536
  "symbol": "deduplicateNodes",
537
537
  "returns": "JSON: with `dry_run: true`, `{ duplicates, total_groups,\ntotal_duplicate_nodes, dry_run, message }`. With `dry_run: false`,\n`{ merged: true, groups_merged, nodes_removed, edges_redirected,\nstrategy }`.",
538
538
  "return_notes": [
@@ -571,7 +571,7 @@
571
571
  "see": [
572
572
  "batch_delete_nodes"
573
573
  ],
574
- "source": "src/tools/nodes.ts:987",
574
+ "source": "src/tools/nodes.ts:993",
575
575
  "symbol": "deleteNode",
576
576
  "returns": "JSON: `{ node, removed_edge_ids }`.",
577
577
  "return_shape": "{ node, removed_edge_ids }",
@@ -586,7 +586,11 @@
586
586
  "properties": {
587
587
  "node_id": {
588
588
  "type": "string",
589
- "description": "The node ID"
589
+ "description": "The node ID. Alias: `id`."
590
+ },
591
+ "id": {
592
+ "type": "string",
593
+ "description": "Alias for `node_id`."
590
594
  },
591
595
  "compact_edges": {
592
596
  "type": "boolean",
@@ -598,7 +602,7 @@
598
602
  ]
599
603
  },
600
604
  "throws": [
601
- "Returns a textError when `node_id` is missing or the node does not\nexist."
605
+ "Returns a textError when neither `node_id` nor `id` is provided, or\nthe node does not exist."
602
606
  ],
603
607
  "examples": [
604
608
  {
@@ -611,7 +615,7 @@
611
615
  "see": [
612
616
  "get_nodes"
613
617
  ],
614
- "source": "src/tools/nodes.ts:207",
618
+ "source": "src/tools/nodes.ts:209",
615
619
  "symbol": "getNode",
616
620
  "returns": "JSON: the node object plus an `edges` array. `compact_edges: true`\nomits `source_title` and `target_title` (saves ~30% on edge-heavy nodes).",
617
621
  "return_notes": [
@@ -660,7 +664,7 @@
660
664
  "see": [
661
665
  "get_node"
662
666
  ],
663
- "source": "src/tools/nodes.ts:251",
667
+ "source": "src/tools/nodes.ts:257",
664
668
  "symbol": "getNodes",
665
669
  "returns": "JSON array of node objects with edges. Missing IDs are silently\nskipped. May include a `degraded` block when the response was\nauto-trimmed to fit.",
666
670
  "return_notes": [
@@ -773,7 +777,7 @@
773
777
  "validate_graph",
774
778
  "list_type_migrations"
775
779
  ],
776
- "source": "src/tools/nodes.ts:1308",
780
+ "source": "src/tools/nodes.ts:1314",
777
781
  "symbol": "migrateProperties",
778
782
  "returns": "JSON: `{ top_level_renames, lifted_properties, dropped_props,\ndropped_self_referential, dry_run }`.",
779
783
  "return_shape": "{ top_level_renames, lifted_properties, dropped_props, dropped_self_referential, dry_run }",
@@ -872,7 +876,7 @@
872
876
  "export_edges",
873
877
  "update_node"
874
878
  ],
875
- "source": "src/tools/nodes.ts:1171",
879
+ "source": "src/tools/nodes.ts:1177",
876
880
  "symbol": "migrateType",
877
881
  "returns": "JSON: `{ migrated_nodes, migrated_edges, edge_renames,\ndropped_edges, unmapped_legacy_edges, defaults_applied, dry_run }`.\n`edge_renames` is `[{ id, from, to, flipped }]`; `dropped_edges` is\n`[{ id, from }]`; `unmapped_legacy_edges` is `[{ type, count }]`.\n`migrated_edges` is the total mutated count (renames + drops).",
878
882
  "return_shape": "{ migrated_nodes, migrated_edges, edge_renames, dropped_edges, unmapped_legacy_edges, defaults_applied, dry_run }",
@@ -956,7 +960,7 @@
956
960
  "list_nodes",
957
961
  "get_area_graph"
958
962
  ],
959
- "source": "src/tools/nodes.ts:406",
963
+ "source": "src/tools/nodes.ts:412",
960
964
  "symbol": "query",
961
965
  "returns": "JSON: `{ nodes, edges, total_nodes, total_edges, _result_id,\ntruncated?, truncated_at_depth?, diff? }`. The `_result_id` is a cache\nhandle for `diff_from`; cache holds the last 20 results.",
962
966
  "return_shape": "{ nodes, edges, total_nodes, total_edges, _result_id, truncated?, truncated_at_depth?, diff? }",
@@ -1011,7 +1015,7 @@
1011
1015
  "list_nodes",
1012
1016
  "query"
1013
1017
  ],
1014
- "source": "src/tools/nodes.ts:355",
1018
+ "source": "src/tools/nodes.ts:361",
1015
1019
  "symbol": "searchNodes",
1016
1020
  "returns": "JSON: `{ results: Array<{ id, type, title, status, tags,\nmatch_field, score }>, total, searched_fields }`.",
1017
1021
  "return_shape": "{ results: Array<{ id, type, title, status, tags, match_field, score }>, total, searched_fields }",
@@ -1078,7 +1082,7 @@
1078
1082
  "migrate_type",
1079
1083
  "batch_update_nodes"
1080
1084
  ],
1081
- "source": "src/tools/nodes.ts:880",
1085
+ "source": "src/tools/nodes.ts:886",
1082
1086
  "symbol": "updateNode",
1083
1087
  "returns": "JSON: `{ node, warning?, unknown_properties?, unset? }`. `warning`\naggregates migration warnings and any unknown-property notice.\n`unknown_properties` lists property keys not in the entity's schema.\n`unset` lists the keys actually removed. Pass `strict: true` to reject\nunknown properties instead of warning.",
1084
1088
  "return_shape": "{ node, warning?, unknown_properties?, unset? }",
@@ -1758,7 +1762,7 @@
1758
1762
  "list_portfolio_cross_edges",
1759
1763
  "migrate_cross_edges"
1760
1764
  ],
1761
- "source": "src/tools/workspace.ts:403",
1765
+ "source": "src/tools/workspace.ts:413",
1762
1766
  "symbol": "createCrossProductEdge",
1763
1767
  "returns": "JSON: `{ edge, portfolio_file }`.",
1764
1768
  "return_shape": "{ edge, portfolio_file }",
@@ -1810,7 +1814,7 @@
1810
1814
  "see": [
1811
1815
  "init_workspace"
1812
1816
  ],
1813
- "source": "src/tools/workspace.ts:283",
1817
+ "source": "src/tools/workspace.ts:293",
1814
1818
  "symbol": "createProductTool",
1815
1819
  "returns": "JSON: `{ message, ...result }`. `result` carries `id`, `title`,\n`slug`, `file_path`, and the optional portfolio edge.",
1816
1820
  "return_shape": "{ message,...result }",
@@ -1839,7 +1843,7 @@
1839
1843
  "see": [
1840
1844
  "list_portfolios"
1841
1845
  ],
1842
- "source": "src/tools/workspace.ts:352",
1846
+ "source": "src/tools/workspace.ts:362",
1843
1847
  "symbol": "getOrganization",
1844
1848
  "returns": "JSON: `{ organization: UPGOrganization | null, portfolio_file? }`.\nReturns `{ organization: null }` when no portfolio document exists yet.",
1845
1849
  "return_shape": "{ organization: UPGOrganization | null, portfolio_file? }",
@@ -1868,7 +1872,7 @@
1868
1872
  "see": [
1869
1873
  "init_workspace"
1870
1874
  ],
1871
- "source": "src/tools/workspace.ts:171",
1875
+ "source": "src/tools/workspace.ts:181",
1872
1876
  "symbol": "getWorkspaceInfo",
1873
1877
  "returns": "JSON: `{ mode, workspace_path?, current_product?, current_file?,\nproducts }`. The shape depends on whether `.upg/workspace.json` exists.",
1874
1878
  "return_shape": "{ mode, workspace_path?, current_product?, current_file?, products }",
@@ -1908,7 +1912,7 @@
1908
1912
  "switch_product",
1909
1913
  "get_workspace_info"
1910
1914
  ],
1911
- "source": "src/tools/workspace.ts:247",
1915
+ "source": "src/tools/workspace.ts:257",
1912
1916
  "symbol": "initWorkspaceTool",
1913
1917
  "returns": "JSON: `{ message, ...result }`. `result` carries the workspace\npath and the moved file's new location.",
1914
1918
  "return_shape": "{ message,...result }",
@@ -1961,7 +1965,7 @@
1961
1965
  "see": [
1962
1966
  "create_cross_product_edge"
1963
1967
  ],
1964
- "source": "src/tools/workspace.ts:542",
1968
+ "source": "src/tools/workspace.ts:552",
1965
1969
  "symbol": "listPortfolioCrossEdges",
1966
1970
  "returns": "JSON: `{ cross_edges: UPGCrossEdge[], total, portfolio_file? }`.",
1967
1971
  "return_shape": "{ cross_edges: UPGCrossEdge[], total, portfolio_file? }",
@@ -1988,7 +1992,7 @@
1988
1992
  "create_cross_product_edge",
1989
1993
  "get_organization"
1990
1994
  ],
1991
- "source": "src/tools/workspace.ts:325",
1995
+ "source": "src/tools/workspace.ts:335",
1992
1996
  "symbol": "listPortfolios",
1993
1997
  "returns": "JSON: `{ portfolios: Array<{ id, title, description?,\nparent_portfolio_id?, hierarchy_model?, products? }>, total }`.",
1994
1998
  "return_shape": "{ portfolios: Array<{ id, title, description?, parent_portfolio_id?, hierarchy_model?, products? }>, total }",
@@ -2031,7 +2035,7 @@
2031
2035
  "list_cross_edge_types",
2032
2036
  "init_workspace"
2033
2037
  ],
2034
- "source": "src/tools/workspace.ts:611",
2038
+ "source": "src/tools/workspace.ts:621",
2035
2039
  "symbol": "migrateCrossEdges",
2036
2040
  "returns": "JSON: `{ migrated, skipped, dry_run, portfolio_file? }`.",
2037
2041
  "return_shape": "{ migrated, skipped, dry_run, portfolio_file? }",
@@ -2046,7 +2050,11 @@
2046
2050
  "properties": {
2047
2051
  "file": {
2048
2052
  "type": "string",
2049
- "description": "Path to the .upg file (relative, absolute, or a bare product name in workspace mode)."
2053
+ "description": "Path to the .upg file (relative, absolute, or a bare product name in workspace mode). Alias: `product`."
2054
+ },
2055
+ "product": {
2056
+ "type": "string",
2057
+ "description": "Alias for `file`."
2050
2058
  }
2051
2059
  },
2052
2060
  "required": [
@@ -2054,7 +2062,7 @@
2054
2062
  ]
2055
2063
  },
2056
2064
  "throws": [
2057
- "Returns a textError when the file cannot be resolved or the load\nfails (file watcher / parse error)."
2065
+ "Returns a textError when neither `file` nor `product` is provided, or\nthe file cannot be resolved, or the load fails (file watcher / parse error)."
2058
2066
  ],
2059
2067
  "examples": [],
2060
2068
  "warnings": [
@@ -2065,7 +2073,7 @@
2065
2073
  "list_local_products",
2066
2074
  "init_workspace"
2067
2075
  ],
2068
- "source": "src/tools/workspace.ts:116",
2076
+ "source": "src/tools/workspace.ts:118",
2069
2077
  "symbol": "switchProduct",
2070
2078
  "returns": "JSON: `{ message, file, product: { title, stage }, entities }`.",
2071
2079
  "return_shape": "{ message, file, product: { title, stage }, entities }",
@@ -2145,17 +2153,20 @@
2145
2153
  ]
2146
2154
  },
2147
2155
  "throws": [
2148
- "textError on a missing/unknown framework_id."
2156
+ "textError on a missing/unknown framework_id, or when no requested\nentity resolves (no dangling exercise is left behind)."
2149
2157
  ],
2150
2158
  "examples": [],
2151
2159
  "warnings": [],
2152
2160
  "see": [
2153
2161
  "score_entity"
2154
2162
  ],
2155
- "source": "src/tools/frameworks.ts:22",
2163
+ "source": "src/tools/frameworks.ts:25",
2156
2164
  "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 }",
2165
+ "returns": "JSON: `{ exercise_id, exercise, included: [{ edge_id, entity_id, edge_type }], warnings }`\n(the shared cross-surface envelope; identical to CLI `apply --json`).",
2166
+ "return_shape": "{ exercise_id, exercise, included: [{ edge_id, entity_id, edge_type }], warnings }",
2167
+ "return_notes": [
2168
+ "(the shared cross-surface envelope; identical to CLI `apply --json`)."
2169
+ ],
2159
2170
  "atomicity": "atomic."
2160
2171
  },
2161
2172
  {
@@ -2191,7 +2202,7 @@
2191
2202
  "inspect",
2192
2203
  "validate_graph"
2193
2204
  ],
2194
- "source": "src/tools/spec.ts:1440",
2205
+ "source": "src/tools/spec.ts:1471",
2195
2206
  "symbol": "getAntiPattern",
2196
2207
  "returns": "JSON: `UPGCuratedAntiPattern`",
2197
2208
  "return_notes": [
@@ -2320,7 +2331,7 @@
2320
2331
  "list_domains",
2321
2332
  "get_domain_guide"
2322
2333
  ],
2323
- "source": "src/tools/spec.ts:1896",
2334
+ "source": "src/tools/spec.ts:1927",
2324
2335
  "symbol": "getDomainRing",
2325
2336
  "returns": "JSON: the full `UPGDomainRing` record.",
2326
2337
  "return_notes": [
@@ -2361,7 +2372,7 @@
2361
2372
  "list_edge_migrations",
2362
2373
  "rename_edge_type"
2363
2374
  ],
2364
- "source": "src/tools/spec.ts:892",
2375
+ "source": "src/tools/spec.ts:923",
2365
2376
  "symbol": "getEdgeType",
2366
2377
  "returns": "JSON: `{ type, forward_verb, reverse_verb, classification, source_type, target_type }`",
2367
2378
  "return_shape": "{ type, forward_verb, reverse_verb, classification, source_type, target_type }",
@@ -2400,7 +2411,7 @@
2400
2411
  "get_entity_schema",
2401
2412
  "list_type_migrations"
2402
2413
  ],
2403
- "source": "src/tools/spec.ts:1355",
2414
+ "source": "src/tools/spec.ts:1386",
2404
2415
  "symbol": "getEntityMeta",
2405
2416
  "returns": "JSON: `EntityTypeMeta & { domain_id: string | null }`",
2406
2417
  "return_notes": [
@@ -2417,7 +2428,11 @@
2417
2428
  "properties": {
2418
2429
  "id": {
2419
2430
  "type": "string",
2420
- "description": "Framework id (kebab-case)."
2431
+ "description": "Framework id (kebab-case). Alias: `framework_id`."
2432
+ },
2433
+ "framework_id": {
2434
+ "type": "string",
2435
+ "description": "Alias for `id` (matches the key used by apply_framework / prioritise)."
2421
2436
  }
2422
2437
  },
2423
2438
  "required": [
@@ -2425,7 +2440,7 @@
2425
2440
  ]
2426
2441
  },
2427
2442
  "throws": [
2428
- "textError when `id` is missing or unknown."
2443
+ "textError when neither `id` nor `framework_id` is provided, or the\nid is unknown."
2429
2444
  ],
2430
2445
  "examples": [
2431
2446
  {
@@ -2441,7 +2456,7 @@
2441
2456
  "get_playbook",
2442
2457
  "get_approach"
2443
2458
  ],
2444
- "source": "src/tools/spec.ts:829",
2459
+ "source": "src/tools/spec.ts:852",
2445
2460
  "symbol": "getFramework",
2446
2461
  "returns": "JSON: the full `UPGFramework` record.",
2447
2462
  "return_notes": [
@@ -2482,7 +2497,7 @@
2482
2497
  "get_framework",
2483
2498
  "list_entity_types"
2484
2499
  ],
2485
- "source": "src/tools/spec.ts:1149",
2500
+ "source": "src/tools/spec.ts:1180",
2486
2501
  "symbol": "getLensTool",
2487
2502
  "returns": "JSON: `{ ...UPGLens, visible_types: string[] }`",
2488
2503
  "return_shape": "{...UPGLens, visible_types: string[] }",
@@ -2518,7 +2533,7 @@
2518
2533
  "get_entity_meta",
2519
2534
  "get_entity_schema"
2520
2535
  ],
2521
- "source": "src/tools/spec.ts:1766",
2536
+ "source": "src/tools/spec.ts:1797",
2522
2537
  "symbol": "getLifecycle",
2523
2538
  "returns": "JSON: the full `UPGLifecycle` record, or a descriptive message.",
2524
2539
  "return_notes": [
@@ -2600,7 +2615,7 @@
2600
2615
  "get_playbook",
2601
2616
  "list_lenses"
2602
2617
  ],
2603
- "source": "src/tools/spec.ts:951",
2618
+ "source": "src/tools/spec.ts:982",
2604
2619
  "symbol": "getRegion",
2605
2620
  "returns": "JSON: the full `UPGRegion` record.",
2606
2621
  "return_notes": [
@@ -2641,7 +2656,7 @@
2641
2656
  "get_entity_meta",
2642
2657
  "list_entity_types"
2643
2658
  ],
2644
- "source": "src/tools/spec.ts:973",
2659
+ "source": "src/tools/spec.ts:1004",
2645
2660
  "symbol": "getRegionForEntity",
2646
2661
  "returns": "JSON: the full `UPGRegion` record.",
2647
2662
  "return_notes": [
@@ -2672,7 +2687,7 @@
2672
2687
  "list_scales",
2673
2688
  "get_entity_schema"
2674
2689
  ],
2675
- "source": "src/tools/spec.ts:1812",
2690
+ "source": "src/tools/spec.ts:1843",
2676
2691
  "symbol": "getScale",
2677
2692
  "returns": "JSON: the full `UPGScaleDefinition` record including all points.",
2678
2693
  "return_notes": [
@@ -2703,7 +2718,7 @@
2703
2718
  "list_edge_types",
2704
2719
  "list_regions"
2705
2720
  ],
2706
- "source": "src/tools/spec.ts:1001",
2721
+ "source": "src/tools/spec.ts:1032",
2707
2722
  "symbol": "getSpecVersion",
2708
2723
  "returns": "JSON: `{ upg_version, markdown_format_version, entity_count, edge_count, domain_count, region_count }`",
2709
2724
  "return_shape": "{ upg_version, markdown_format_version, entity_count, edge_count, domain_count, region_count }",
@@ -2749,7 +2764,7 @@
2749
2764
  "get_entity_meta",
2750
2765
  "list_frameworks"
2751
2766
  ],
2752
- "source": "src/tools/spec.ts:1217",
2767
+ "source": "src/tools/spec.ts:1248",
2753
2768
  "symbol": "getTypeLabel",
2754
2769
  "returns": "JSON: `{ ...UPGTypeLabel, resolved_label: string }`",
2755
2770
  "return_shape": "{...UPGTypeLabel, resolved_label: string }",
@@ -2788,7 +2803,7 @@
2788
2803
  "get_entity_meta",
2789
2804
  "create_node"
2790
2805
  ],
2791
- "source": "src/tools/spec.ts:1247",
2806
+ "source": "src/tools/spec.ts:1278",
2792
2807
  "symbol": "getValidChildrenTool",
2793
2808
  "returns": "JSON: `{ parent_type, valid_children: string[] }`",
2794
2809
  "return_shape": "{ parent_type, valid_children: string[] }",
@@ -2891,7 +2906,7 @@
2891
2906
  "inspect",
2892
2907
  "get_domain_guide"
2893
2908
  ],
2894
- "source": "src/tools/spec.ts:1398",
2909
+ "source": "src/tools/spec.ts:1429",
2895
2910
  "symbol": "listAntiPatterns",
2896
2911
  "returns": "JSON: `{ total, count, next_cursor?, anti_patterns: UPGCuratedAntiPattern[] }`",
2897
2912
  "return_shape": "{ total, count, next_cursor?, anti_patterns: UPGCuratedAntiPattern[] }",
@@ -2992,7 +3007,7 @@
2992
3007
  "list_domains",
2993
3008
  "list_anti_patterns"
2994
3009
  ],
2995
- "source": "src/tools/spec.ts:1487",
3010
+ "source": "src/tools/spec.ts:1518",
2996
3011
  "symbol": "listBenchmarks",
2997
3012
  "returns": "JSON: `{ kind, total, count, benchmarks: ... }`",
2998
3013
  "return_shape": "{ kind, total, count, benchmarks:... }",
@@ -3020,7 +3035,7 @@
3020
3035
  "list_portfolio_cross_edges",
3021
3036
  "migrate_cross_edges"
3022
3037
  ],
3023
- "source": "src/tools/spec.ts:1087",
3038
+ "source": "src/tools/spec.ts:1118",
3024
3039
  "symbol": "listCrossEdgeTypes",
3025
3040
  "returns": "JSON: `{ count, types: readonly UPGCrossEdgeType[] }`",
3026
3041
  "return_shape": "{ count, types: readonly UPGCrossEdgeType[] }",
@@ -3048,7 +3063,7 @@
3048
3063
  "list_domains",
3049
3064
  "get_domain_guide"
3050
3065
  ],
3051
- "source": "src/tools/spec.ts:1875",
3066
+ "source": "src/tools/spec.ts:1906",
3052
3067
  "symbol": "listDomainRings",
3053
3068
  "returns": "JSON: `{ rings: UPGDomainRing[], total: number }`",
3054
3069
  "return_shape": "{ rings: UPGDomainRing[], total: number }",
@@ -3118,7 +3133,7 @@
3118
3133
  "list_edge_types",
3119
3134
  "validate_graph"
3120
3135
  ],
3121
- "source": "src/tools/spec.ts:1659",
3136
+ "source": "src/tools/spec.ts:1690",
3122
3137
  "symbol": "listEdgeMigrations",
3123
3138
  "returns": "JSON: `{ migrations: [{ kind, from, to?, since }], total: number }`",
3124
3139
  "return_shape": "{ migrations: [{ kind, from, to?, since }], total: number }",
@@ -3157,7 +3172,7 @@
3157
3172
  "list_edge_migrations",
3158
3173
  "create_edge"
3159
3174
  ],
3160
- "source": "src/tools/spec.ts:873",
3175
+ "source": "src/tools/spec.ts:904",
3161
3176
  "symbol": "listEdgeTypes",
3162
3177
  "returns": "JSON: `{ count, edges: Array<{ type, forward_verb, reverse_verb, classification, source_type, target_type }> }`",
3163
3178
  "return_shape": "{ count, edges: Array<{ type, forward_verb, reverse_verb, classification, source_type, target_type }> }",
@@ -3215,7 +3230,7 @@
3215
3230
  "list_type_migrations",
3216
3231
  "list_domains"
3217
3232
  ],
3218
- "source": "src/tools/spec.ts:1299",
3233
+ "source": "src/tools/spec.ts:1330",
3219
3234
  "symbol": "listEntityTypes",
3220
3235
  "returns": "JSON: `{ total, count, next_cursor?, types: Array<EntityTypeMeta & { domain_id: string | null }> }`",
3221
3236
  "return_shape": "{ total, count, next_cursor?, types: Array<EntityTypeMeta & { domain_id: string | null }> }",
@@ -3242,7 +3257,7 @@
3242
3257
  "list_frameworks",
3243
3258
  "list_framework_structure_patterns"
3244
3259
  ],
3245
- "source": "src/tools/spec.ts:1831",
3260
+ "source": "src/tools/spec.ts:1862",
3246
3261
  "symbol": "listFrameworkCategories",
3247
3262
  "returns": "JSON: `{ categories: string[], total: number }`",
3248
3263
  "return_shape": "{ categories: string[], total: number }",
@@ -3270,7 +3285,7 @@
3270
3285
  "list_framework_categories",
3271
3286
  "get_framework"
3272
3287
  ],
3273
- "source": "src/tools/spec.ts:1852",
3288
+ "source": "src/tools/spec.ts:1883",
3274
3289
  "symbol": "listFrameworkStructurePatterns",
3275
3290
  "returns": "JSON: `{ patterns: string[], total: number }`",
3276
3291
  "return_shape": "{ patterns: string[], total: number }",
@@ -3278,7 +3293,7 @@
3278
3293
  },
3279
3294
  {
3280
3295
  "name": "list_frameworks",
3281
- "description": "List the canonical `UPGFramework` definitions; the 34 curated, famous product frameworks that anchor the public catalog (spanning strategy, discovery, prioritisation, design, growth, engineering, and reflection classics). Paginated (default 50, max 200). Cursor is opaque: pass `next_cursor` from a previous response. Optional `category` is exact-match against `UPGFramework.category` and applies before pagination.",
3296
+ "description": "List the canonical `UPGFramework` definitions: the curated, famous product frameworks that anchor the public catalog (spanning strategy, discovery, prioritisation, design, growth, engineering, and reflection classics). Returns a lightweight summary per framework (id, name, category, description, tags, approach_ids, structure_pattern); call `get_framework(id)` for the full record. Paginated (default 50, max 200). Cursor is opaque: pass `next_cursor` from a previous response. Optional `category` is exact-match against `UPGFramework.category` and applies before pagination.",
3282
3297
  "domain": "spec",
3283
3298
  "inputSchema": {
3284
3299
  "type": "object",
@@ -3313,10 +3328,10 @@
3313
3328
  "prioritise",
3314
3329
  "list_approaches"
3315
3330
  ],
3316
- "source": "src/tools/spec.ts:793",
3331
+ "source": "src/tools/spec.ts:798",
3317
3332
  "symbol": "listFrameworks",
3318
- "returns": "JSON: `{ total, count, next_cursor?, frameworks: UPGFramework[] }`",
3319
- "return_shape": "{ total, count, next_cursor?, frameworks: UPGFramework[] }",
3333
+ "returns": "JSON: `{ total, count, next_cursor?, frameworks: Array<{ id, name, category, description, tags, approach_ids, structure_pattern }> }`",
3334
+ "return_shape": "{ total, count, next_cursor?, frameworks: Array<{ id, name, category, description, tags, approach_ids, structure_pattern }> }",
3320
3335
  "atomicity": "atomic (read-only)"
3321
3336
  },
3322
3337
  {
@@ -3342,7 +3357,7 @@
3342
3357
  "list_playbooks",
3343
3358
  "list_frameworks"
3344
3359
  ],
3345
- "source": "src/tools/spec.ts:1116",
3360
+ "source": "src/tools/spec.ts:1147",
3346
3361
  "symbol": "listLenses",
3347
3362
  "returns": "JSON: `{ count, lenses: Array<{ id, name, description, icon, audience, perspective, framework_id?, playbook_id?, visible_domain_count, intelligence_prompt_count }> }`",
3348
3363
  "return_shape": "{ count, lenses: Array<{ id, name, description, icon, audience, perspective, framework_id?, playbook_id?, visible_domain_count, intelligence_prompt_count }> }",
@@ -3379,7 +3394,7 @@
3379
3394
  "list_entity_types",
3380
3395
  "get_entity_meta"
3381
3396
  ],
3382
- "source": "src/tools/spec.ts:1724",
3397
+ "source": "src/tools/spec.ts:1755",
3383
3398
  "symbol": "listLifecycles",
3384
3399
  "returns": "JSON: `{ lifecycles, total, free_types: string[], planned_types: string[] }`",
3385
3400
  "return_shape": "{ lifecycles, total, free_types: string[], planned_types: string[] }",
@@ -3450,7 +3465,7 @@
3450
3465
  "list_domain_rings",
3451
3466
  "create_product"
3452
3467
  ],
3453
- "source": "src/tools/spec.ts:1595",
3468
+ "source": "src/tools/spec.ts:1626",
3454
3469
  "symbol": "listProductStages",
3455
3470
  "returns": "JSON: `{ count, stages: readonly UPGProductStage[] }`",
3456
3471
  "return_shape": "{ count, stages: readonly UPGProductStage[] }",
@@ -3479,7 +3494,7 @@
3479
3494
  "list_domains",
3480
3495
  "list_playbooks"
3481
3496
  ],
3482
- "source": "src/tools/spec.ts:919",
3497
+ "source": "src/tools/spec.ts:950",
3483
3498
  "symbol": "listRegions",
3484
3499
  "returns": "JSON: `{ count, regions: Array<{ id, label, order, shape, mental_model, anchor_type, composes_atomic_domains, entity_count, intra_edge_count, boundary_edge_count }> }`",
3485
3500
  "return_shape": "{ count, regions: Array<{ id, label, order, shape, mental_model, anchor_type, composes_atomic_domains, entity_count, intra_edge_count, boundary_edge_count }> }",
@@ -3506,7 +3521,7 @@
3506
3521
  "get_scale",
3507
3522
  "get_entity_schema"
3508
3523
  ],
3509
- "source": "src/tools/spec.ts:1797",
3524
+ "source": "src/tools/spec.ts:1828",
3510
3525
  "symbol": "listScales",
3511
3526
  "returns": "JSON: `{ scales: UPGScaleDefinition[], total: number }`",
3512
3527
  "return_shape": "{ scales: UPGScaleDefinition[], total: number }",
@@ -3535,7 +3550,7 @@
3535
3550
  "migrate_type",
3536
3551
  "validate_graph"
3537
3552
  ],
3538
- "source": "src/tools/spec.ts:1696",
3553
+ "source": "src/tools/spec.ts:1727",
3539
3554
  "symbol": "listSplitMigrations",
3540
3555
  "returns": "JSON: `{ splits: [...], total: number }`",
3541
3556
  "return_shape": "{ splits: [...], total: number }",
@@ -3572,7 +3587,7 @@
3572
3587
  "list_entity_types",
3573
3588
  "get_entity_meta"
3574
3589
  ],
3575
- "source": "src/tools/spec.ts:1182",
3590
+ "source": "src/tools/spec.ts:1213",
3576
3591
  "symbol": "listTypeLabels",
3577
3592
  "returns": "JSON: `{ total, count, next_cursor?, labels: UPGTypeLabel[] }`",
3578
3593
  "return_shape": "{ total, count, next_cursor?, labels: UPGTypeLabel[] }",
@@ -3608,7 +3623,7 @@
3608
3623
  "validate_graph",
3609
3624
  "list_entity_types"
3610
3625
  ],
3611
- "source": "src/tools/spec.ts:1628",
3626
+ "source": "src/tools/spec.ts:1659",
3612
3627
  "symbol": "listTypeMigrations",
3613
3628
  "returns": "JSON: `{ migrations: [{ from, to, since }], total: number }`",
3614
3629
  "return_shape": "{ migrations: [{ from, to, since }], total: number }",
@@ -3794,7 +3809,7 @@
3794
3809
  "create_edge",
3795
3810
  "trace"
3796
3811
  ],
3797
- "source": "src/tools/spec.ts:1055",
3812
+ "source": "src/tools/spec.ts:1086",
3798
3813
  "symbol": "resolveEdgeForPair",
3799
3814
  "returns": "JSON: `{ source_type, target_type, edge_type: string | null,\nanchor_hint?, alternate_anchors?, adjacent_edges? }`",
3800
3815
  "return_shape": "{ source_type, target_type, edge_type: string | null, anchor_hint?, alternate_anchors?, adjacent_edges? }",
@@ -3838,7 +3853,7 @@
3838
3853
  "see": [
3839
3854
  "apply_framework"
3840
3855
  ],
3841
- "source": "src/tools/frameworks.ts:63",
3856
+ "source": "src/tools/frameworks.ts:55",
3842
3857
  "symbol": "scoreEntity",
3843
3858
  "returns": "JSON: `{ edge, warnings }`.",
3844
3859
  "return_shape": "{ edge, warnings }",
@@ -4085,7 +4100,7 @@
4085
4100
  "get_anti_pattern",
4086
4101
  "inspect"
4087
4102
  ],
4088
- "source": "src/tools/validation.ts:906",
4103
+ "source": "src/tools/validation.ts:938",
4089
4104
  "symbol": "getAntiPatternViolationsFor",
4090
4105
  "returns": "JSON: `{ entity_id, type, violations: [...] }`.",
4091
4106
  "return_shape": "{ entity_id, type, violations: [...] }",
@@ -4189,7 +4204,7 @@
4189
4204
  }
4190
4205
  ],
4191
4206
  "warnings": [
4192
- "Top-level `valid` is true ONLY when both drift is empty AND no\nanti-pattern violations fired. Set `skip_anti_patterns: true` for a\npure spec-shape check; `skip_drift: true` for catalog-only."
4207
+ "`valid` is true ONLY when both drift is empty AND no anti-pattern\nviolations fired — it conflates structure and product-health. For a pure\nspec-conformance check read `structurally_valid` (or set\n`skip_anti_patterns: true`, which makes `valid` track structure alone).\n`skip_drift: true` gives a catalog-only run and omits `structurally_valid`."
4193
4208
  ],
4194
4209
  "see": [
4195
4210
  "migrate_type",
@@ -4201,13 +4216,14 @@
4201
4216
  "list_edge_migrations",
4202
4217
  "inspect"
4203
4218
  ],
4204
- "source": "src/tools/validation.ts:257",
4219
+ "source": "src/tools/validation.ts:267",
4205
4220
  "symbol": "validateGraph",
4206
- "returns": "JSON: `{ valid, summary, entity_drift?, edge_drift?,\nproperty_drift?, top_level_drift?, lifecycle_drift?, self_referential?,\nanti_pattern_violations?, notes?, _hash }`. Per-class drift arrays appear\nonly when the requested `scope` includes that class. Each array is capped\nat `limit` (default 100).",
4207
- "return_shape": "{ valid, summary, entity_drift?, edge_drift?, property_drift?, top_level_drift?, lifecycle_drift?, self_referential?, anti_pattern_violations?, notes?, _hash }",
4221
+ "returns": "JSON: `{ valid, structurally_valid?, summary, entity_drift?,\nedge_drift?, property_drift?, top_level_drift?, lifecycle_drift?,\nself_referential?, anti_pattern_violations?, notes?, _hash }`. Per-class\ndrift arrays appear only when the requested `scope` includes that class.\nEach array is capped at `limit` (default 100). `structurally_valid` is\nomitted when `skip_drift: true`.",
4222
+ "return_shape": "{ valid, structurally_valid?, summary, entity_drift?, edge_drift?, property_drift?, top_level_drift?, lifecycle_drift?, self_referential?, anti_pattern_violations?, notes?, _hash }",
4208
4223
  "return_notes": [
4209
4224
  "Per-class drift arrays appear only when the requested `scope` includes that class.",
4210
- "Each array is capped at `limit` (default 100)."
4225
+ "Each array is capped at `limit` (default 100).",
4226
+ "`structurally_valid` is omitted when `skip_drift: true`."
4211
4227
  ],
4212
4228
  "atomicity": "atomic (read-only)"
4213
4229
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unified-product-graph/mcp-server",
3
- "version": "0.8.6",
3
+ "version": "0.8.8",
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>",
@@ -45,6 +45,7 @@
45
45
  "generate-tools:check": "tsx scripts/generate-tool-reference.ts --check",
46
46
  "test": "vitest run",
47
47
  "test:watch": "vitest",
48
+ "smoke": "node scripts/upg-smoke.mjs --file test-fixtures/sample.upg",
48
49
  "lint": "eslint src/",
49
50
  "type-check": "tsc --noEmit",
50
51
  "prepublishOnly": "npm run build"