@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.
Files changed (2) hide show
  1. package/dist/index.js +81 -12
  2. 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 addFeatureOutcome(featureId, content) {
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({ content })
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
- for (const outcome of outcomes) {
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.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ourroadmaps/mcp",
3
- "version": "0.7.2",
3
+ "version": "0.7.5",
4
4
  "description": "MCP server for OurRoadmaps - manage roadmaps, features, and ideas from Claude Code",
5
5
  "type": "module",
6
6
  "bin": {