@unified-product-graph/mcp-server 0.8.14 → 0.8.15
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/TOOLS.md +89 -5
- package/dist/index.js +111 -7
- package/dist/index.js.map +1 -1
- package/dist/tools-manifest.json +144 -21
- package/package.json +3 -3
package/dist/tools-manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "2",
|
|
3
3
|
"package": "@unified-product-graph/mcp-server",
|
|
4
|
-
"package_version": "0.8.
|
|
5
|
-
"tool_count":
|
|
4
|
+
"package_version": "0.8.15",
|
|
5
|
+
"tool_count": 99,
|
|
6
6
|
"domains": [
|
|
7
7
|
"context",
|
|
8
8
|
"nodes",
|
|
@@ -1523,6 +1523,42 @@
|
|
|
1523
1523
|
],
|
|
1524
1524
|
"atomicity": "atomic-with-rollback. Classification runs against the live\ndocument before any mutation; with `dry_run: false`, the drop set is\ncomputed up-front and applied in a single index rebuild."
|
|
1525
1525
|
},
|
|
1526
|
+
{
|
|
1527
|
+
"name": "assign_product_to_area",
|
|
1528
|
+
"description": "Place an existing product under a product area (adds it to the area's `products[]` in `.upg/portfolio.upg`). Resolves the area against the portfolio document and auto-registers the product on the portfolio registry. Use after `create_product`, or pass `area_id` to `create_product` directly.",
|
|
1529
|
+
"domain": "areas",
|
|
1530
|
+
"inputSchema": {
|
|
1531
|
+
"type": "object",
|
|
1532
|
+
"properties": {
|
|
1533
|
+
"product_id": {
|
|
1534
|
+
"type": "string",
|
|
1535
|
+
"description": "Product id (from create_product / list_local_products)"
|
|
1536
|
+
},
|
|
1537
|
+
"area_id": {
|
|
1538
|
+
"type": "string",
|
|
1539
|
+
"description": "Product area id (from list_product_areas)"
|
|
1540
|
+
}
|
|
1541
|
+
},
|
|
1542
|
+
"required": [
|
|
1543
|
+
"product_id",
|
|
1544
|
+
"area_id"
|
|
1545
|
+
]
|
|
1546
|
+
},
|
|
1547
|
+
"throws": [
|
|
1548
|
+
"textError on a missing workspace, an unknown product, or an unknown\narea id (the message points at list_product_areas / list_local_products)."
|
|
1549
|
+
],
|
|
1550
|
+
"examples": [],
|
|
1551
|
+
"warnings": [],
|
|
1552
|
+
"see": [
|
|
1553
|
+
"attach_product_to_portfolio",
|
|
1554
|
+
"create_product"
|
|
1555
|
+
],
|
|
1556
|
+
"source": "src/tools/areas.ts:67",
|
|
1557
|
+
"symbol": "assignProductToAreaTool",
|
|
1558
|
+
"returns": "JSON: `{ product_id, container_id, container_kind: \"product_area\",\ncontainer_title?, already_member, registered }`.",
|
|
1559
|
+
"return_shape": "{ product_id, container_id, container_kind: \"product_area\", container_title?, already_member, registered }",
|
|
1560
|
+
"atomicity": "atomic (single portfolio.upg flush)."
|
|
1561
|
+
},
|
|
1526
1562
|
{
|
|
1527
1563
|
"name": "create_area",
|
|
1528
1564
|
"description": "Create a product area entity in the portfolio document (`.upg/portfolio.upg`). Product areas represent the organisational axis (who owns what). Supports nesting via `parent_area_id`. The portfolio document is created on demand.",
|
|
@@ -1545,12 +1581,13 @@
|
|
|
1545
1581
|
"strategic_priority": {
|
|
1546
1582
|
"type": "string",
|
|
1547
1583
|
"enum": [
|
|
1548
|
-
"
|
|
1584
|
+
"urgent",
|
|
1549
1585
|
"high",
|
|
1550
1586
|
"medium",
|
|
1551
|
-
"low"
|
|
1587
|
+
"low",
|
|
1588
|
+
"none"
|
|
1552
1589
|
],
|
|
1553
|
-
"description": "Strategic priority of this area"
|
|
1590
|
+
"description": "Strategic priority of this area (canonical Priority scale)"
|
|
1554
1591
|
},
|
|
1555
1592
|
"owner": {
|
|
1556
1593
|
"type": "string",
|
|
@@ -1575,7 +1612,7 @@
|
|
|
1575
1612
|
"see": [
|
|
1576
1613
|
"list_product_areas"
|
|
1577
1614
|
],
|
|
1578
|
-
"source": "src/tools/areas.ts:
|
|
1615
|
+
"source": "src/tools/areas.ts:290",
|
|
1579
1616
|
"symbol": "createArea",
|
|
1580
1617
|
"returns": "JSON: `{ node, portfolio_file, written_to }`. `node` is the typed\n`UPGProductArea` record persisted to `portfolio_areas[]`.",
|
|
1581
1618
|
"return_shape": "{ node, portfolio_file, written_to }",
|
|
@@ -1602,7 +1639,7 @@
|
|
|
1602
1639
|
],
|
|
1603
1640
|
"warnings": [],
|
|
1604
1641
|
"see": [],
|
|
1605
|
-
"source": "src/tools/areas.ts:
|
|
1642
|
+
"source": "src/tools/areas.ts:240",
|
|
1606
1643
|
"symbol": "getAreaContext",
|
|
1607
1644
|
"returns": "JSON: `{ has_area_context: false }` or\n`{ has_area_context: true, area_id, area_name, found_at }`.",
|
|
1608
1645
|
"return_shape": "{ has_area_context: false }",
|
|
@@ -1642,7 +1679,7 @@
|
|
|
1642
1679
|
"see": [
|
|
1643
1680
|
"list_product_areas"
|
|
1644
1681
|
],
|
|
1645
|
-
"source": "src/tools/areas.ts:
|
|
1682
|
+
"source": "src/tools/areas.ts:98",
|
|
1646
1683
|
"symbol": "getAreaGraph",
|
|
1647
1684
|
"returns": "JSON: `{ area, nodes, edges, node_count, edge_count }`. May\ninclude a `degraded` block when the response was auto-trimmed.",
|
|
1648
1685
|
"return_shape": "{ area, nodes, edges, node_count, edge_count }",
|
|
@@ -1674,7 +1711,7 @@
|
|
|
1674
1711
|
],
|
|
1675
1712
|
"warnings": [],
|
|
1676
1713
|
"see": [],
|
|
1677
|
-
"source": "src/tools/areas.ts:
|
|
1714
|
+
"source": "src/tools/areas.ts:329",
|
|
1678
1715
|
"symbol": "getChanges",
|
|
1679
1716
|
"returns": "JSON: `{ changes, summary: { create, update, delete }, total }`.\n`since` filters to ISO 8601 timestamps after the cutoff.",
|
|
1680
1717
|
"return_shape": "{ changes, summary: { create, update, delete }, total }",
|
|
@@ -1704,12 +1741,48 @@
|
|
|
1704
1741
|
"create_area",
|
|
1705
1742
|
"get_area_graph"
|
|
1706
1743
|
],
|
|
1707
|
-
"source": "src/tools/areas.ts:
|
|
1744
|
+
"source": "src/tools/areas.ts:34",
|
|
1708
1745
|
"symbol": "listProductAreas",
|
|
1709
1746
|
"returns": "JSON: `{ areas: Array<{ id, title, strategic_priority?,\nparent_area_id?, products? }>, total }`.",
|
|
1710
1747
|
"return_shape": "{ areas: Array<{ id, title, strategic_priority?, parent_area_id?, products? }>, total }",
|
|
1711
1748
|
"atomicity": "atomic (read-only)"
|
|
1712
1749
|
},
|
|
1750
|
+
{
|
|
1751
|
+
"name": "attach_product_to_portfolio",
|
|
1752
|
+
"description": "Place an existing product under a portfolio (adds it to the portfolio's `products[]` in `.upg/portfolio.upg`). Resolves the portfolio against the portfolio document and auto-registers the product on the portfolio registry. Use after `create_product`, or pass `portfolio_id` to `create_product` directly.",
|
|
1753
|
+
"domain": "workspace",
|
|
1754
|
+
"inputSchema": {
|
|
1755
|
+
"type": "object",
|
|
1756
|
+
"properties": {
|
|
1757
|
+
"product_id": {
|
|
1758
|
+
"type": "string",
|
|
1759
|
+
"description": "Product id (from create_product / list_local_products)"
|
|
1760
|
+
},
|
|
1761
|
+
"portfolio_id": {
|
|
1762
|
+
"type": "string",
|
|
1763
|
+
"description": "Portfolio id (from list_portfolios)"
|
|
1764
|
+
}
|
|
1765
|
+
},
|
|
1766
|
+
"required": [
|
|
1767
|
+
"product_id",
|
|
1768
|
+
"portfolio_id"
|
|
1769
|
+
]
|
|
1770
|
+
},
|
|
1771
|
+
"throws": [
|
|
1772
|
+
"textError on a missing workspace, an unknown product, or an unknown\nportfolio id (the message points at list_portfolios / list_local_products)."
|
|
1773
|
+
],
|
|
1774
|
+
"examples": [],
|
|
1775
|
+
"warnings": [],
|
|
1776
|
+
"see": [
|
|
1777
|
+
"assign_product_to_area",
|
|
1778
|
+
"create_product"
|
|
1779
|
+
],
|
|
1780
|
+
"source": "src/tools/workspace.ts:737",
|
|
1781
|
+
"symbol": "attachProductToPortfolioTool",
|
|
1782
|
+
"returns": "JSON: `{ product_id, container_id, container_kind: \"portfolio\",\ncontainer_title?, already_member, registered }`.",
|
|
1783
|
+
"return_shape": "{ product_id, container_id, container_kind: \"portfolio\", container_title?, already_member, registered }",
|
|
1784
|
+
"atomicity": "atomic (single portfolio.upg flush)."
|
|
1785
|
+
},
|
|
1713
1786
|
{
|
|
1714
1787
|
"name": "create_cross_product_edge",
|
|
1715
1788
|
"description": "Create a cross-product relationship between two entities in different products within a portfolio graph. Types: `shares_persona`, `shares_competitor`, `shares_metric`, `depends_on_product`, `cannibalises`, `succeeds`.",
|
|
@@ -1762,7 +1835,7 @@
|
|
|
1762
1835
|
"list_portfolio_cross_edges",
|
|
1763
1836
|
"migrate_cross_edges"
|
|
1764
1837
|
],
|
|
1765
|
-
"source": "src/tools/workspace.ts:
|
|
1838
|
+
"source": "src/tools/workspace.ts:454",
|
|
1766
1839
|
"symbol": "createCrossProductEdge",
|
|
1767
1840
|
"returns": "JSON: `{ edge, portfolio_file }`.",
|
|
1768
1841
|
"return_shape": "{ edge, portfolio_file }",
|
|
@@ -1793,7 +1866,11 @@
|
|
|
1793
1866
|
},
|
|
1794
1867
|
"portfolio_id": {
|
|
1795
1868
|
"type": "string",
|
|
1796
|
-
"description": "Optional portfolio
|
|
1869
|
+
"description": "Optional portfolio id (resolved against portfolio.upg) to place the new product under. A portfolio id that resolves only in the active graph still attaches via an in-graph edge (DEPRECATED; prefer attach_product_to_portfolio)."
|
|
1870
|
+
},
|
|
1871
|
+
"area_id": {
|
|
1872
|
+
"type": "string",
|
|
1873
|
+
"description": "Optional product_area id (resolved against portfolio.upg) to place the new product under."
|
|
1797
1874
|
}
|
|
1798
1875
|
},
|
|
1799
1876
|
"required": [
|
|
@@ -1814,7 +1891,7 @@
|
|
|
1814
1891
|
"see": [
|
|
1815
1892
|
"init_workspace"
|
|
1816
1893
|
],
|
|
1817
|
-
"source": "src/tools/workspace.ts:
|
|
1894
|
+
"source": "src/tools/workspace.ts:295",
|
|
1818
1895
|
"symbol": "createProductTool",
|
|
1819
1896
|
"returns": "JSON: `{ message, ...result }`. `result` carries `id`, `title`,\n`slug`, `file_path`, and the optional portfolio edge.",
|
|
1820
1897
|
"return_shape": "{ message,...result }",
|
|
@@ -1843,7 +1920,7 @@
|
|
|
1843
1920
|
"see": [
|
|
1844
1921
|
"list_portfolios"
|
|
1845
1922
|
],
|
|
1846
|
-
"source": "src/tools/workspace.ts:
|
|
1923
|
+
"source": "src/tools/workspace.ts:403",
|
|
1847
1924
|
"symbol": "getOrganization",
|
|
1848
1925
|
"returns": "JSON: `{ organization: UPGOrganization | null, portfolio_file? }`.\nReturns `{ organization: null }` when no portfolio document exists yet.",
|
|
1849
1926
|
"return_shape": "{ organization: UPGOrganization | null, portfolio_file? }",
|
|
@@ -1872,7 +1949,7 @@
|
|
|
1872
1949
|
"see": [
|
|
1873
1950
|
"init_workspace"
|
|
1874
1951
|
],
|
|
1875
|
-
"source": "src/tools/workspace.ts:
|
|
1952
|
+
"source": "src/tools/workspace.ts:183",
|
|
1876
1953
|
"symbol": "getWorkspaceInfo",
|
|
1877
1954
|
"returns": "JSON: `{ mode, workspace_path?, current_product?, current_file?,\nproducts }`. The shape depends on whether `.upg/workspace.json` exists.",
|
|
1878
1955
|
"return_shape": "{ mode, workspace_path?, current_product?, current_file?, products }",
|
|
@@ -1912,7 +1989,7 @@
|
|
|
1912
1989
|
"switch_product",
|
|
1913
1990
|
"get_workspace_info"
|
|
1914
1991
|
],
|
|
1915
|
-
"source": "src/tools/workspace.ts:
|
|
1992
|
+
"source": "src/tools/workspace.ts:259",
|
|
1916
1993
|
"symbol": "initWorkspaceTool",
|
|
1917
1994
|
"returns": "JSON: `{ message, ...result }`. `result` carries the workspace\npath and the moved file's new location.",
|
|
1918
1995
|
"return_shape": "{ message,...result }",
|
|
@@ -1942,7 +2019,7 @@
|
|
|
1942
2019
|
"switch_product",
|
|
1943
2020
|
"get_workspace_info"
|
|
1944
2021
|
],
|
|
1945
|
-
"source": "src/tools/workspace.ts:
|
|
2022
|
+
"source": "src/tools/workspace.ts:46",
|
|
1946
2023
|
"symbol": "listLocalProducts",
|
|
1947
2024
|
"returns": "JSON: `{ products: Array<{ file, title, stage, nodes, edges }> }`.\n`stage` is the CANONICAL UPGProductStage (legacy values like `idea` are\ncoerced to `concept`), or `null` when unset — matching what\n`get_product_context` reports for the same product (UPG-611 / DT-MCP-3).",
|
|
1948
2025
|
"return_shape": "{ products: Array<{ file, title, stage, nodes, edges }> }",
|
|
@@ -1965,7 +2042,7 @@
|
|
|
1965
2042
|
"see": [
|
|
1966
2043
|
"create_cross_product_edge"
|
|
1967
2044
|
],
|
|
1968
|
-
"source": "src/tools/workspace.ts:
|
|
2045
|
+
"source": "src/tools/workspace.ts:593",
|
|
1969
2046
|
"symbol": "listPortfolioCrossEdges",
|
|
1970
2047
|
"returns": "JSON: `{ cross_edges: UPGCrossEdge[], total, portfolio_file? }`.",
|
|
1971
2048
|
"return_shape": "{ cross_edges: UPGCrossEdge[], total, portfolio_file? }",
|
|
@@ -1992,7 +2069,7 @@
|
|
|
1992
2069
|
"create_cross_product_edge",
|
|
1993
2070
|
"get_organization"
|
|
1994
2071
|
],
|
|
1995
|
-
"source": "src/tools/workspace.ts:
|
|
2072
|
+
"source": "src/tools/workspace.ts:376",
|
|
1996
2073
|
"symbol": "listPortfolios",
|
|
1997
2074
|
"returns": "JSON: `{ portfolios: Array<{ id, title, description?,\nparent_portfolio_id?, hierarchy_model?, products? }>, total }`.",
|
|
1998
2075
|
"return_shape": "{ portfolios: Array<{ id, title, description?, parent_portfolio_id?, hierarchy_model?, products? }>, total }",
|
|
@@ -2035,7 +2112,7 @@
|
|
|
2035
2112
|
"list_cross_edge_types",
|
|
2036
2113
|
"init_workspace"
|
|
2037
2114
|
],
|
|
2038
|
-
"source": "src/tools/workspace.ts:
|
|
2115
|
+
"source": "src/tools/workspace.ts:662",
|
|
2039
2116
|
"symbol": "migrateCrossEdges",
|
|
2040
2117
|
"returns": "JSON: `{ migrated, skipped, dry_run, portfolio_file? }`.",
|
|
2041
2118
|
"return_shape": "{ migrated, skipped, dry_run, portfolio_file? }",
|
|
@@ -2073,12 +2150,58 @@
|
|
|
2073
2150
|
"list_local_products",
|
|
2074
2151
|
"init_workspace"
|
|
2075
2152
|
],
|
|
2076
|
-
"source": "src/tools/workspace.ts:
|
|
2153
|
+
"source": "src/tools/workspace.ts:120",
|
|
2077
2154
|
"symbol": "switchProduct",
|
|
2078
2155
|
"returns": "JSON: `{ message, file, product: { title, stage }, entities }`.",
|
|
2079
2156
|
"return_shape": "{ message, file, product: { title, stage }, entities }",
|
|
2080
2157
|
"atomicity": "non-atomic. Flushes the current store, stops watching, and\nloads the new file as separate filesystem operations."
|
|
2081
2158
|
},
|
|
2159
|
+
{
|
|
2160
|
+
"name": "update_product",
|
|
2161
|
+
"description": "Update the product header (`$upg.product`): stage, title, description, health_status, url. The supported way to advance a product's lifecycle stage; it writes the value get_graph_digest reads, without hand-editing the .upg file.",
|
|
2162
|
+
"domain": "workspace",
|
|
2163
|
+
"inputSchema": {
|
|
2164
|
+
"type": "object",
|
|
2165
|
+
"properties": {
|
|
2166
|
+
"stage": {
|
|
2167
|
+
"type": "string",
|
|
2168
|
+
"description": "Product lifecycle stage (canonical UPGProductStage)."
|
|
2169
|
+
},
|
|
2170
|
+
"title": {
|
|
2171
|
+
"type": "string",
|
|
2172
|
+
"description": "Product display title."
|
|
2173
|
+
},
|
|
2174
|
+
"description": {
|
|
2175
|
+
"type": "string",
|
|
2176
|
+
"description": "Product description."
|
|
2177
|
+
},
|
|
2178
|
+
"health_status": {
|
|
2179
|
+
"type": "string",
|
|
2180
|
+
"description": "Product health (free-form, e.g. on_track / at_risk)."
|
|
2181
|
+
},
|
|
2182
|
+
"url": {
|
|
2183
|
+
"type": "string",
|
|
2184
|
+
"description": "Product URL."
|
|
2185
|
+
}
|
|
2186
|
+
}
|
|
2187
|
+
},
|
|
2188
|
+
"throws": [
|
|
2189
|
+
"textError when no field is supplied, when there is no product header,\nor when `stage` is non-canonical (same strict validation as create_product)."
|
|
2190
|
+
],
|
|
2191
|
+
"examples": [],
|
|
2192
|
+
"warnings": [],
|
|
2193
|
+
"see": [
|
|
2194
|
+
"create_product"
|
|
2195
|
+
],
|
|
2196
|
+
"source": "src/tools/workspace.ts:336",
|
|
2197
|
+
"symbol": "updateProductTool",
|
|
2198
|
+
"returns": "JSON: `{ product, updated: string[] }` (the fields changed).",
|
|
2199
|
+
"return_shape": "{ product, updated: string[] }",
|
|
2200
|
+
"return_notes": [
|
|
2201
|
+
"(the fields changed)."
|
|
2202
|
+
],
|
|
2203
|
+
"atomicity": "atomic (single flush)."
|
|
2204
|
+
},
|
|
2082
2205
|
{
|
|
2083
2206
|
"name": "get_entity_schema",
|
|
2084
2207
|
"description": "Return expected properties, valid statuses, valid edge types, and domain for an entity type. Lets agents construct valid entities without skill prompts.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unified-product-graph/mcp-server",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.15",
|
|
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>",
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@modelcontextprotocol/sdk": "^1.27.0",
|
|
55
|
-
"@unified-product-graph/core": "0.8.
|
|
56
|
-
"@unified-product-graph/sdk": "0.8.
|
|
55
|
+
"@unified-product-graph/core": "0.8.15",
|
|
56
|
+
"@unified-product-graph/sdk": "0.8.15",
|
|
57
57
|
"chokidar": "^4.0.0",
|
|
58
58
|
"nanoid": "^5.1.0"
|
|
59
59
|
},
|