@ourroadmaps/mcp 0.7.2 → 0.7.5
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/dist/index.js +81 -12
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -102,6 +102,7 @@ var featureSchema = z4.object({
|
|
|
102
102
|
organizationId: z4.string(),
|
|
103
103
|
type: featureTypeSchema,
|
|
104
104
|
name: z4.string(),
|
|
105
|
+
description: z4.string().nullable(),
|
|
105
106
|
parentId: z4.string().uuid().nullable(),
|
|
106
107
|
order: z4.number().int(),
|
|
107
108
|
isExpanded: z4.boolean(),
|
|
@@ -487,6 +488,13 @@ class ApiClient {
|
|
|
487
488
|
method: "DELETE"
|
|
488
489
|
});
|
|
489
490
|
}
|
|
491
|
+
async reorderRoadmaps(items) {
|
|
492
|
+
const response = await this.request("/v1/roadmaps/reorder", {
|
|
493
|
+
method: "POST",
|
|
494
|
+
body: JSON.stringify({ items })
|
|
495
|
+
});
|
|
496
|
+
return response;
|
|
497
|
+
}
|
|
490
498
|
async savePrd(roadmapId, data) {
|
|
491
499
|
const response = await this.request(`/v1/roadmaps/${roadmapId}/prd`, {
|
|
492
500
|
method: "POST",
|
|
@@ -521,11 +529,17 @@ class ApiClient {
|
|
|
521
529
|
method: "DELETE"
|
|
522
530
|
});
|
|
523
531
|
}
|
|
524
|
-
async
|
|
525
|
-
await this.request(`/v1/features/${featureId}/outcomes`, {
|
|
532
|
+
async saveFeatureOutcomes(featureId, outcomes) {
|
|
533
|
+
const response = await this.request(`/v1/features/${featureId}/outcomes`, {
|
|
526
534
|
method: "POST",
|
|
527
|
-
body: JSON.stringify({
|
|
535
|
+
body: JSON.stringify({
|
|
536
|
+
outcomes: outcomes.map((description, index) => ({
|
|
537
|
+
description,
|
|
538
|
+
order: index
|
|
539
|
+
}))
|
|
540
|
+
})
|
|
528
541
|
});
|
|
542
|
+
return response.data;
|
|
529
543
|
}
|
|
530
544
|
async linkFeatureToRoadmap(featureId, roadmapId) {
|
|
531
545
|
await this.request(`/v1/features/${featureId}/roadmap-items`, {
|
|
@@ -708,6 +722,7 @@ function registerAllTools(server) {
|
|
|
708
722
|
registerCreateRoadmapItem(server);
|
|
709
723
|
registerUpdateRoadmapItem(server);
|
|
710
724
|
registerDeleteRoadmapItem(server);
|
|
725
|
+
registerReorderRoadmaps(server);
|
|
711
726
|
registerAddFeature(server);
|
|
712
727
|
registerUpdateFeature(server);
|
|
713
728
|
registerDeleteFeature(server);
|
|
@@ -768,7 +783,10 @@ function registerSearchRoadmaps(server) {
|
|
|
768
783
|
id: r.id,
|
|
769
784
|
title: r.title,
|
|
770
785
|
status: r.status,
|
|
771
|
-
horizon: r.horizon
|
|
786
|
+
horizon: r.horizon,
|
|
787
|
+
value: r.value,
|
|
788
|
+
effort: r.effort,
|
|
789
|
+
order: r.order
|
|
772
790
|
})), null, 2)
|
|
773
791
|
}
|
|
774
792
|
]
|
|
@@ -793,6 +811,9 @@ function registerGetRoadmap(server) {
|
|
|
793
811
|
title: roadmap2.title,
|
|
794
812
|
status: roadmap2.status,
|
|
795
813
|
horizon: roadmap2.horizon,
|
|
814
|
+
value: roadmap2.value,
|
|
815
|
+
effort: roadmap2.effort,
|
|
816
|
+
order: roadmap2.order,
|
|
796
817
|
prd: roadmap2.prd,
|
|
797
818
|
brainstormNotes: roadmap2.brainstormNotes,
|
|
798
819
|
wireframes: roadmap2.wireframes?.map((w) => ({
|
|
@@ -932,17 +953,19 @@ function registerGetContext(server) {
|
|
|
932
953
|
- Products: What the organization builds (brands, products, apps, services) with hierarchy
|
|
933
954
|
- Audiences: Who the product serves (stakeholders and user personas) with their preferences
|
|
934
955
|
- Scenarios: User workflows and how they accomplish goals
|
|
956
|
+
- Features: Capabilities and functionality areas organized hierarchically
|
|
935
957
|
- Roadmap Summary: Count of items by status and horizon for planning overview
|
|
936
958
|
|
|
937
959
|
Use this as your FIRST call when starting work on a roadmap to understand the full context.`,
|
|
938
960
|
inputSchema: {}
|
|
939
961
|
}, async () => {
|
|
940
962
|
const client2 = getApiClient();
|
|
941
|
-
const [strategy, products, audiences, scenarios, roadmaps] = await Promise.all([
|
|
963
|
+
const [strategy, products, audiences, scenarios, features, roadmaps] = await Promise.all([
|
|
942
964
|
client2.getStrategy(),
|
|
943
965
|
client2.listProducts(),
|
|
944
966
|
client2.listAudiences(),
|
|
945
967
|
client2.listScenarios(),
|
|
968
|
+
client2.listFeatures(),
|
|
946
969
|
client2.listRoadmaps()
|
|
947
970
|
]);
|
|
948
971
|
const statusCounts = {};
|
|
@@ -983,6 +1006,12 @@ Use this as your FIRST call when starting work on a roadmap to understand the fu
|
|
|
983
1006
|
when: s.when,
|
|
984
1007
|
then: s.then
|
|
985
1008
|
})),
|
|
1009
|
+
features: features.map((f) => ({
|
|
1010
|
+
id: f.id,
|
|
1011
|
+
name: f.name,
|
|
1012
|
+
type: f.type,
|
|
1013
|
+
parentId: f.parentId
|
|
1014
|
+
})),
|
|
986
1015
|
roadmapSummary: {
|
|
987
1016
|
total: roadmaps.length,
|
|
988
1017
|
byStatus: statusCounts,
|
|
@@ -1070,20 +1099,27 @@ function registerCreateRoadmapItem(server) {
|
|
|
1070
1099
|
};
|
|
1071
1100
|
});
|
|
1072
1101
|
}
|
|
1102
|
+
var effortSizeSchema = z10.enum(["xs", "s", "m", "l", "xl"]);
|
|
1073
1103
|
function registerUpdateRoadmapItem(server) {
|
|
1074
1104
|
server.registerTool("update_roadmap_item", {
|
|
1075
|
-
description: "Update an existing roadmap item. Can update title, status, horizon, prompt, or brainstorm notes.",
|
|
1105
|
+
description: "Update an existing roadmap item. Can update title, status, horizon, value, effort, order, prompt, or brainstorm notes.",
|
|
1076
1106
|
inputSchema: {
|
|
1077
1107
|
id: z10.string().describe("The UUID of the roadmap item to update"),
|
|
1078
1108
|
title: z10.string().optional().describe("New title"),
|
|
1079
1109
|
status: roadmapStatusSchema.optional().describe("New status"),
|
|
1080
|
-
horizon: horizonSchema.optional().describe("New planning horizon")
|
|
1110
|
+
horizon: horizonSchema.optional().describe("New planning horizon"),
|
|
1111
|
+
value: z10.number().int().min(1).max(3).nullable().optional().describe("Value rating (1-3 stars, where 3 is highest value)"),
|
|
1112
|
+
effort: effortSizeSchema.nullable().optional().describe("Effort estimate (xs=extra small, s=small, m=medium, l=large, xl=extra large)"),
|
|
1113
|
+
order: z10.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
|
|
1081
1114
|
}
|
|
1082
1115
|
}, async ({
|
|
1083
1116
|
id,
|
|
1084
1117
|
title,
|
|
1085
1118
|
status,
|
|
1086
|
-
horizon
|
|
1119
|
+
horizon,
|
|
1120
|
+
value,
|
|
1121
|
+
effort,
|
|
1122
|
+
order
|
|
1087
1123
|
}) => {
|
|
1088
1124
|
const client2 = getApiClient();
|
|
1089
1125
|
const updates = {};
|
|
@@ -1093,6 +1129,12 @@ function registerUpdateRoadmapItem(server) {
|
|
|
1093
1129
|
updates.status = status;
|
|
1094
1130
|
if (horizon !== undefined)
|
|
1095
1131
|
updates.horizon = horizon;
|
|
1132
|
+
if (value !== undefined)
|
|
1133
|
+
updates.value = value;
|
|
1134
|
+
if (effort !== undefined)
|
|
1135
|
+
updates.effort = effort;
|
|
1136
|
+
if (order !== undefined)
|
|
1137
|
+
updates.order = order;
|
|
1096
1138
|
const roadmap2 = await client2.updateRoadmap(id, updates);
|
|
1097
1139
|
return {
|
|
1098
1140
|
content: [
|
|
@@ -1104,7 +1146,10 @@ function registerUpdateRoadmapItem(server) {
|
|
|
1104
1146
|
id: roadmap2.id,
|
|
1105
1147
|
title: roadmap2.title,
|
|
1106
1148
|
status: roadmap2.status,
|
|
1107
|
-
horizon: roadmap2.horizon
|
|
1149
|
+
horizon: roadmap2.horizon,
|
|
1150
|
+
value: roadmap2.value,
|
|
1151
|
+
effort: roadmap2.effort,
|
|
1152
|
+
order: roadmap2.order
|
|
1108
1153
|
}
|
|
1109
1154
|
}, null, 2)
|
|
1110
1155
|
}
|
|
@@ -1139,9 +1184,7 @@ function registerAddFeature(server) {
|
|
|
1139
1184
|
parentId: parentId ?? null
|
|
1140
1185
|
});
|
|
1141
1186
|
if (outcomes && outcomes.length > 0) {
|
|
1142
|
-
|
|
1143
|
-
await client2.addFeatureOutcome(feature2.id, outcome);
|
|
1144
|
-
}
|
|
1187
|
+
await client2.saveFeatureOutcomes(feature2.id, outcomes);
|
|
1145
1188
|
}
|
|
1146
1189
|
if (linkToRoadmapId) {
|
|
1147
1190
|
await client2.linkFeatureToRoadmap(feature2.id, linkToRoadmapId);
|
|
@@ -1259,6 +1302,32 @@ function registerDeleteRoadmapItem(server) {
|
|
|
1259
1302
|
};
|
|
1260
1303
|
});
|
|
1261
1304
|
}
|
|
1305
|
+
function registerReorderRoadmaps(server) {
|
|
1306
|
+
server.registerTool("reorder_roadmaps", {
|
|
1307
|
+
description: "Bulk reorder roadmap items by setting their order values. Use this to prioritize and organize the roadmap. Lower order values appear first.",
|
|
1308
|
+
inputSchema: {
|
|
1309
|
+
items: z10.array(z10.object({
|
|
1310
|
+
id: z10.string().describe("The UUID of the roadmap item"),
|
|
1311
|
+
order: z10.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
|
|
1312
|
+
})).describe("Array of roadmap items with their new order values")
|
|
1313
|
+
}
|
|
1314
|
+
}, async ({ items }) => {
|
|
1315
|
+
const client2 = getApiClient();
|
|
1316
|
+
const result = await client2.reorderRoadmaps(items);
|
|
1317
|
+
return {
|
|
1318
|
+
content: [
|
|
1319
|
+
{
|
|
1320
|
+
type: "text",
|
|
1321
|
+
text: JSON.stringify({
|
|
1322
|
+
success: result.success,
|
|
1323
|
+
message: `Successfully reordered ${items.length} roadmap items`,
|
|
1324
|
+
itemsReordered: items.length
|
|
1325
|
+
}, null, 2)
|
|
1326
|
+
}
|
|
1327
|
+
]
|
|
1328
|
+
};
|
|
1329
|
+
});
|
|
1330
|
+
}
|
|
1262
1331
|
function registerUpdateFeature(server) {
|
|
1263
1332
|
server.registerTool("update_feature", {
|
|
1264
1333
|
description: "Update an existing feature. Can update name, type, or parent.",
|