@ourroadmaps/mcp 0.29.0 → 0.30.0

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 +551 -493
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -903,31 +903,476 @@ var statusUpdateSchema = z14.object({
903
903
  items: z14.array(statusUpdateItemSchema).optional()
904
904
  });
905
905
  var statusUpdateListSchema = z14.array(statusUpdateSchema);
906
- // ../../packages/shared/src/schemas/variant.ts
906
+ // ../../packages/shared/src/schemas/tool-inputs.ts
907
907
  import { z as z15 } from "zod";
908
- var variantSchema = z15.object({
909
- id: z15.string().uuid(),
910
- presentationId: z15.string().uuid(),
911
- name: z15.string(),
912
- audienceId: z15.string().uuid().nullable(),
913
- isDefault: z15.boolean(),
914
- order: z15.number().int(),
915
- createdAt: z15.string(),
916
- createdBy: z15.string(),
917
- updatedAt: z15.string().nullable()
908
+ var paginationFields = {
909
+ limit: z15.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
910
+ offset: z15.number().int().min(0).optional().describe("Number of items to skip (default 0)")
911
+ };
912
+ var idField = (entity) => z15.string().describe(`The UUID of the ${entity}`);
913
+ var uuidField = (entity) => z15.string().uuid().describe(`The UUID of the ${entity}`);
914
+ var orderItemsField = (entity) => z15.array(z15.object({
915
+ id: z15.string().describe(`The UUID of the ${entity}`),
916
+ order: z15.number().int().min(0).describe("The new order value (0-based)")
917
+ })).describe(`Array of ${entity}s with their new order values`);
918
+ var yyyyMmDdField = (description) => z15.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe(description);
919
+ var sizeSchema = z15.enum(["xs", "s", "m", "l", "xl"]);
920
+ var searchRoadmapsInput = {
921
+ query: z15.string().optional().describe("Search query to match against title or description"),
922
+ status: roadmapStatusSchema.optional().describe("Filter by status"),
923
+ horizon: horizonSchema.optional().describe("Filter by planning horizon"),
924
+ phase: z15.string().optional().describe("Filter by phase"),
925
+ phaseStep: z15.string().optional().describe("Filter by phase step"),
926
+ ...paginationFields
927
+ };
928
+ var getRoadmapInput = {
929
+ id: idField("roadmap item")
930
+ };
931
+ var createRoadmapItemInput = {
932
+ title: z15.string().describe("Title of the roadmap item"),
933
+ status: roadmapStatusSchema.optional().describe('Status (defaults to "not_started")'),
934
+ horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
935
+ phase: z15.string().optional().describe('Initial phase key (e.g., "brainstorm", "prd", "design")'),
936
+ phaseStep: z15.string().optional().describe('Initial step within phase (e.g., "not_started", "drafting")'),
937
+ initiativeId: z15.string().optional().describe("UUID of initiative to link this item to on creation"),
938
+ dateGranularity: dateGranularitySchema.optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
939
+ dateValue: z15.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
940
+ targetGranularity: dateGranularitySchema.optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
941
+ targetValue: z15.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
942
+ };
943
+ var updateRoadmapItemInput = {
944
+ id: idField("roadmap item to update"),
945
+ title: z15.string().optional().describe("New title"),
946
+ status: roadmapStatusSchema.optional().describe("New status"),
947
+ horizon: horizonSchema.optional().describe("New planning horizon"),
948
+ phase: z15.string().optional().describe('Current phase key (e.g., "prd", "design", "build")'),
949
+ phaseStep: z15.string().optional().describe('Current step within phase (e.g., "drafting", "needs_review", "approved")'),
950
+ value: z15.number().int().min(1).max(3).nullable().optional().describe("Value rating (1-3 stars, where 3 is highest value)"),
951
+ effort: effortSchema.nullable().optional().describe("Effort estimate (xs=extra small, s=small, m=medium, l=large, xl=extra large)"),
952
+ order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)"),
953
+ initiativeId: z15.string().nullable().optional().describe("UUID to link item to initiative, or null to unlink from any initiative"),
954
+ designDescription: z15.string().nullable().optional().describe("Description for the Design phase"),
955
+ planDescription: z15.string().nullable().optional().describe("Description for the Planning phase"),
956
+ buildDescription: z15.string().nullable().optional().describe("Description for the Build phase"),
957
+ releaseDescription: z15.string().nullable().optional().describe("Description for the Release phase"),
958
+ prompt: z15.string().nullable().optional().describe("Build prompt for the roadmap item"),
959
+ dateGranularity: dateGranularitySchema.nullable().optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
960
+ dateValue: z15.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
961
+ targetGranularity: dateGranularitySchema.nullable().optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
962
+ targetValue: z15.string().nullable().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
963
+ };
964
+ var deleteRoadmapItemInput = {
965
+ id: idField("roadmap item to delete")
966
+ };
967
+ var reorderRoadmapsInput = {
968
+ items: z15.array(z15.object({
969
+ id: z15.string().describe("The UUID of the roadmap item"),
970
+ order: z15.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
971
+ })).describe("Array of roadmap items with their new order values")
972
+ };
973
+ var savePrdInput = {
974
+ roadmapId: idField("roadmap item"),
975
+ what: z15.string().nullable().describe("What is being built - the feature description"),
976
+ why: z15.string().nullable().describe("Why this is being built - the business justification"),
977
+ outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes/success criteria")
978
+ };
979
+ var updateBrainstormNotesInput = {
980
+ roadmapId: idField("roadmap item"),
981
+ notes: z15.string().describe("The brainstorm notes content")
982
+ };
983
+ var searchFeaturesInput = {
984
+ query: z15.string().optional().describe("Search query to match against name"),
985
+ type: featureTypeSchema.optional().describe("Filter by type (feature or area)")
986
+ };
987
+ var getFeatureInput = {
988
+ id: idField("feature")
989
+ };
990
+ var addFeatureInput = {
991
+ name: z15.string().describe("Name of the feature"),
992
+ description: z15.string().optional().describe("Description of the feature"),
993
+ type: featureTypeSchema.optional().describe('Type - "feature" for specific functionality, "area" for grouping (defaults to "feature")'),
994
+ parentId: z15.string().optional().describe("UUID of parent feature/area to nest under"),
995
+ outcomes: z15.array(z15.string()).optional().describe("List of expected outcomes for this feature"),
996
+ linkToRoadmapId: z15.string().optional().describe("UUID of roadmap item to link this feature to")
997
+ };
998
+ var updateFeatureInput = {
999
+ id: idField("feature to update"),
1000
+ name: z15.string().optional().describe("New name for the feature"),
1001
+ type: featureTypeSchema.optional().describe('New type - "feature" or "area"'),
1002
+ parentId: z15.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
1003
+ };
1004
+ var deleteFeatureInput = {
1005
+ id: idField("feature to delete")
1006
+ };
1007
+ var searchIdeasInput = {
1008
+ query: z15.string().optional().describe("Search query to match against title or description"),
1009
+ status: ideaStatusSchema.optional().describe("Filter by status")
1010
+ };
1011
+ var getIdeaInput = {
1012
+ id: idField("idea")
1013
+ };
1014
+ var captureIdeaInput = {
1015
+ title: z15.string().describe("Title of the idea"),
1016
+ description: z15.string().optional().describe("Detailed description of the idea"),
1017
+ source: z15.string().optional().describe('Source of the idea (defaults to "claude-code")')
1018
+ };
1019
+ var updateIdeaInput = {
1020
+ id: idField("idea to update"),
1021
+ title: z15.string().optional().describe("New title"),
1022
+ description: z15.string().nullable().optional().describe("New description"),
1023
+ status: ideaStatusSchema.optional().describe("New status"),
1024
+ value: sizeSchema.nullable().optional().describe("Estimated value"),
1025
+ effort: sizeSchema.nullable().optional().describe("Estimated effort")
1026
+ };
1027
+ var deleteIdeaInput = {
1028
+ id: idField("idea to delete")
1029
+ };
1030
+ var updateStrategyInput = {
1031
+ vision: z15.string().nullable().optional().describe("The vision statement - where the product is headed"),
1032
+ mission: z15.string().nullable().optional().describe("The mission statement - why the product exists")
1033
+ };
1034
+ var createScenarioInput = {
1035
+ title: z15.string().describe('Title of the scenario (e.g., "User creates their first roadmap")'),
1036
+ description: z15.string().nullable().optional().describe("Detailed description of the scenario workflow")
1037
+ };
1038
+ var updateScenarioInput = {
1039
+ id: idField("scenario to update"),
1040
+ title: z15.string().optional().describe("New title"),
1041
+ description: z15.string().nullable().optional().describe("New description")
1042
+ };
1043
+ var deleteScenarioInput = {
1044
+ id: idField("scenario to delete")
1045
+ };
1046
+ var searchProductsInput = {
1047
+ query: z15.string().optional().describe("Search query to match against product name"),
1048
+ type: productTypeSchema.optional().describe("Filter by product type")
1049
+ };
1050
+ var getProductInput = {
1051
+ id: idField("product")
1052
+ };
1053
+ var createProductInput = {
1054
+ type: productTypeSchema.describe("Type of product"),
1055
+ name: z15.string().describe("Name of the product"),
1056
+ parentId: z15.string().nullable().optional().describe("UUID of parent product to nest under")
1057
+ };
1058
+ var updateProductInput = {
1059
+ id: idField("product to update"),
1060
+ name: z15.string().optional().describe("New name"),
1061
+ parentId: z15.string().nullable().optional().describe("New parent product UUID, or null to move to root")
1062
+ };
1063
+ var deleteProductInput = {
1064
+ id: idField("product to delete")
1065
+ };
1066
+ var getProductDocumentationInput = {
1067
+ productId: idField("product")
1068
+ };
1069
+ var updateProductDocumentationInput = {
1070
+ productId: idField("product"),
1071
+ designSystem: z15.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
1072
+ adrs: z15.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
1073
+ };
1074
+ var createAudienceInput = {
1075
+ name: z15.string().describe('Name of the audience (e.g., "Product Manager", "End User")'),
1076
+ description: z15.string().nullable().optional().describe("Description of the audience")
1077
+ };
1078
+ var updateAudienceInput = {
1079
+ id: idField("audience to update"),
1080
+ name: z15.string().optional().describe("New name"),
1081
+ description: z15.string().nullable().optional().describe("New description")
1082
+ };
1083
+ var deleteAudienceInput = {
1084
+ id: idField("audience to delete")
1085
+ };
1086
+ var getHistoryInput = {
1087
+ startDate: yyyyMmDdField("Start date in YYYY-MM-DD format"),
1088
+ endDate: yyyyMmDdField("End date in YYYY-MM-DD format"),
1089
+ entityType: z15.enum([
1090
+ "roadmap",
1091
+ "feature",
1092
+ "idea",
1093
+ "prd",
1094
+ "wireframe",
1095
+ "product",
1096
+ "audience",
1097
+ "scenario"
1098
+ ]).optional().describe("Filter to specific entity type")
1099
+ };
1100
+ var getHistorySummaryInput = {
1101
+ startDate: yyyyMmDdField("Start date in YYYY-MM-DD format"),
1102
+ endDate: yyyyMmDdField("End date in YYYY-MM-DD format")
1103
+ };
1104
+ var createStatusUpdateInput = {
1105
+ startDate: yyyyMmDdField("Report period start date in YYYY-MM-DD format"),
1106
+ endDate: yyyyMmDdField("Report period end date in YYYY-MM-DD format"),
1107
+ content: z15.string().describe("The markdown content of the status report"),
1108
+ title: z15.string().optional().describe("Optional title for the report"),
1109
+ items: z15.array(z15.object({
1110
+ roadmapItemId: z15.string().describe("UUID of the roadmap item"),
1111
+ status: z15.string().describe("Status of the item at report creation time")
1112
+ })).optional().describe("Roadmap items to include in the report snapshot")
1113
+ };
1114
+ var saveStoriesInput = {
1115
+ roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
1116
+ epics: z15.array(z15.object({
1117
+ title: z15.string().min(1).describe("Title of the epic"),
1118
+ description: z15.string().nullable().optional().describe("Description of the epic"),
1119
+ stories: z15.array(z15.object({
1120
+ title: z15.string().min(1).describe("Title of the story"),
1121
+ description: z15.string().nullable().optional().describe("Description of the story")
1122
+ })).optional().describe("Stories within this epic")
1123
+ })).optional().describe("List of epics with their nested stories"),
1124
+ stories: z15.array(z15.object({
1125
+ title: z15.string().min(1).describe("Title of the story"),
1126
+ description: z15.string().nullable().optional().describe("Description of the story")
1127
+ })).optional().describe("List of standalone stories (not part of any epic)")
1128
+ };
1129
+ var searchInitiativesInput = {
1130
+ query: z15.string().optional().describe("Search query to match against title or description"),
1131
+ horizon: horizonSchema.optional().describe("Filter by planning horizon"),
1132
+ ...paginationFields
1133
+ };
1134
+ var getInitiativeInput = {
1135
+ id: idField("initiative")
1136
+ };
1137
+ var createInitiativeInput = {
1138
+ title: z15.string().describe("Title of the initiative"),
1139
+ description: z15.string().optional().describe("Description of the initiative (markdown)"),
1140
+ horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
1141
+ dateGranularity: dateGranularitySchema.optional().describe("Target date granularity: day, month, quarter, half-year, or year"),
1142
+ dateValue: z15.string().optional().describe('Target date value matching granularity (e.g., "2024-Q1", "2024-03")'),
1143
+ targetDate: z15.string().optional().describe("Target date in YYYY-MM-DD format")
1144
+ };
1145
+ var updateInitiativeInput = {
1146
+ id: idField("initiative to update"),
1147
+ title: z15.string().optional().describe("New title"),
1148
+ description: z15.string().nullable().optional().describe("New description (null to clear)"),
1149
+ horizon: horizonSchema.optional().describe("New planning horizon"),
1150
+ dateGranularity: dateGranularitySchema.nullable().optional().describe("New target date granularity (null to clear)"),
1151
+ dateValue: z15.string().nullable().optional().describe("New target date value (null to clear)"),
1152
+ targetDate: z15.string().nullable().optional().describe("New target date in YYYY-MM-DD format (null to clear)"),
1153
+ order: z15.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
1154
+ };
1155
+ var deleteInitiativeInput = {
1156
+ id: idField("initiative to delete")
1157
+ };
1158
+ var reorderInitiativesInput = {
1159
+ items: orderItemsField("initiative")
1160
+ };
1161
+ var uploadWireframeInput = {
1162
+ roadmapId: idField("roadmap item"),
1163
+ filePath: z15.string().describe("Absolute path to the image file on disk"),
1164
+ description: z15.string().optional().describe("Optional description of the wireframe"),
1165
+ outcomeIds: z15.array(z15.string()).optional().describe("Optional array of PRD outcome IDs this wireframe addresses")
1166
+ };
1167
+ var updateWireframeInput = {
1168
+ id: idField("wireframe"),
1169
+ description: z15.string().nullable().optional().describe("New description for the wireframe"),
1170
+ outcomeIds: z15.array(z15.string()).optional().describe("Array of PRD outcome IDs this wireframe addresses (replaces existing)")
1171
+ };
1172
+ var deleteWireframeInput = {
1173
+ id: idField("wireframe to delete")
1174
+ };
1175
+ var uploadBrainstormMediaInput = {
1176
+ roadmapId: idField("roadmap item"),
1177
+ filePath: z15.string().describe("Absolute path to the image or video file on disk"),
1178
+ description: z15.string().optional().describe("Optional description of the media")
1179
+ };
1180
+ var updateBrainstormMediaInput = {
1181
+ id: idField("brainstorm media"),
1182
+ description: z15.string().nullable().describe("New description for the media")
1183
+ };
1184
+ var deleteBrainstormMediaInput = {
1185
+ id: idField("brainstorm media to delete")
1186
+ };
1187
+ var uploadProductDesignMediaInput = {
1188
+ productId: idField("product"),
1189
+ filePath: z15.string().describe("Absolute path to the image or video file on disk"),
1190
+ description: z15.string().optional().describe("Optional description of the media")
1191
+ };
1192
+ var updateProductDesignMediaInput2 = {
1193
+ productId: idField("product"),
1194
+ mediaId: idField("design media"),
1195
+ description: z15.string().nullable().describe("New description for the media")
1196
+ };
1197
+ var deleteProductDesignMediaInput = {
1198
+ productId: idField("product"),
1199
+ mediaId: idField("design media to delete")
1200
+ };
1201
+ var uploadDesignWalkthroughInput = {
1202
+ roadmapId: idField("roadmap item"),
1203
+ filePath: z15.string().describe("Absolute path to the video file on disk")
1204
+ };
1205
+ var uploadReleaseWalkthroughInput = {
1206
+ roadmapId: idField("roadmap item"),
1207
+ filePath: z15.string().describe("Absolute path to the video file on disk")
1208
+ };
1209
+ var publishPrototypeInput = {
1210
+ roadmapId: z15.string().uuid().describe("The UUID of the roadmap item to attach the prototype to"),
1211
+ folderPath: z15.string().describe("Absolute path to the local mockup folder"),
1212
+ entryPoint: z15.string().default("index.html").describe("Main HTML file to open (defaults to index.html)")
1213
+ };
1214
+ var listPrototypesInput = {
1215
+ roadmapId: z15.string().uuid().describe("The UUID of the roadmap item")
1216
+ };
1217
+ var createFeedbackSessionInput = {
1218
+ prototypeId: uuidField("prototype to create a feedback session for"),
1219
+ name: z15.string().describe('Name for this feedback session (e.g., "Round 1 Review")'),
1220
+ expiresInDays: z15.number().int().min(1).max(90).optional().describe("Number of days until the session expires (default 7)")
1221
+ };
1222
+ var listFeedbackSessionsInput = {
1223
+ prototypeId: uuidField("prototype")
1224
+ };
1225
+ var getFeedbackSummaryInput = {
1226
+ prototypeId: uuidField("prototype"),
1227
+ sessionId: uuidField("feedback session"),
1228
+ filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: unresolved)")
1229
+ };
1230
+ var getFeedbackDetailInput = {
1231
+ prototypeId: uuidField("prototype"),
1232
+ sessionId: uuidField("feedback session"),
1233
+ commentId: z15.string().uuid().optional().describe("Optional: get detail for a single comment"),
1234
+ filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: all). Ignored if commentId is provided.")
1235
+ };
1236
+ var resolveFeedbackCommentInput = {
1237
+ prototypeId: uuidField("prototype"),
1238
+ sessionId: uuidField("feedback session"),
1239
+ commentId: uuidField("comment to resolve/unresolve")
1240
+ };
1241
+ var searchExportsInput = {
1242
+ roadmapId: z15.string().uuid().optional().describe("Filter by roadmap item ID"),
1243
+ externalSystem: externalSystemSchema.optional().describe("Filter by external system"),
1244
+ localEntityType: localEntityTypeSchema.optional().describe("Filter by local entity type"),
1245
+ localEntityId: z15.string().uuid().optional().describe("Filter by local entity ID"),
1246
+ ...paginationFields
1247
+ };
1248
+ var getExportInput = {
1249
+ id: z15.string().uuid().describe("The UUID of the export record")
1250
+ };
1251
+ var createExportInput = {
1252
+ roadmapId: z15.string().uuid().describe("The UUID of the roadmap item"),
1253
+ localEntityType: localEntityTypeSchema.describe("Type of local entity being exported"),
1254
+ localEntityId: z15.string().uuid().describe("The UUID of the local entity"),
1255
+ externalSystem: externalSystemSchema.describe("External system where the entity was exported"),
1256
+ externalObjectType: z15.string().min(1).describe('Type of object in the external system (e.g., "issue", "page", "project")'),
1257
+ externalId: z15.string().min(1).describe("ID of the object in the external system"),
1258
+ externalUrl: z15.string().url().optional().describe("URL to the object in the external system"),
1259
+ metadata: z15.record(z15.unknown()).optional().describe("Additional metadata about the export")
1260
+ };
1261
+ var updateExportInput = {
1262
+ id: z15.string().uuid().describe("The UUID of the export record to update"),
1263
+ externalUrl: z15.string().url().nullable().optional().describe("New URL to the object in the external system"),
1264
+ metadata: z15.record(z15.unknown()).optional().describe("New metadata to replace existing metadata")
1265
+ };
1266
+ var deleteExportInput = {
1267
+ id: z15.string().uuid().describe("The UUID of the export record to delete")
1268
+ };
1269
+ var getPresentationInput = {
1270
+ id: idField("presentation")
1271
+ };
1272
+ var createPresentationInput = {
1273
+ title: z15.string().describe("Title of the presentation"),
1274
+ description: z15.string().nullable().optional().describe("Description of the presentation")
1275
+ };
1276
+ var updatePresentationInput = {
1277
+ id: idField("presentation to update"),
1278
+ title: z15.string().optional().describe("New title"),
1279
+ description: z15.string().nullable().optional().describe("New description")
1280
+ };
1281
+ var deletePresentationInput = {
1282
+ id: idField("presentation to delete")
1283
+ };
1284
+ var reorderPresentationsInput = {
1285
+ items: orderItemsField("presentation")
1286
+ };
1287
+ var listVariantsInput = {
1288
+ presentationId: idField("presentation")
1289
+ };
1290
+ var getVariantInput = {
1291
+ presentationId: idField("presentation"),
1292
+ variantId: idField("variant")
1293
+ };
1294
+ var createVariantInput = {
1295
+ presentationId: idField("presentation"),
1296
+ name: z15.string().describe("Name of the variant"),
1297
+ audienceId: z15.string().nullable().optional().describe("The UUID of the target audience")
1298
+ };
1299
+ var updateVariantInput = {
1300
+ presentationId: idField("presentation"),
1301
+ variantId: idField("variant to update"),
1302
+ name: z15.string().optional().describe("New name"),
1303
+ audienceId: z15.string().nullable().optional().describe("New target audience UUID")
1304
+ };
1305
+ var deleteVariantInput = {
1306
+ presentationId: idField("presentation"),
1307
+ variantId: idField("variant to delete")
1308
+ };
1309
+ var reorderVariantsInput = {
1310
+ presentationId: idField("presentation"),
1311
+ items: orderItemsField("variant")
1312
+ };
1313
+ var cloneVariantInput = {
1314
+ presentationId: idField("presentation"),
1315
+ variantId: idField("variant to clone")
1316
+ };
1317
+ var setDefaultVariantInput = {
1318
+ presentationId: idField("presentation"),
1319
+ variantId: idField("variant to set as default")
1320
+ };
1321
+ var listSlidesInput = {
1322
+ variantId: idField("variant")
1323
+ };
1324
+ var getSlideInput = {
1325
+ variantId: idField("variant"),
1326
+ slideId: idField("slide")
1327
+ };
1328
+ var createSlideInput = {
1329
+ variantId: idField("variant"),
1330
+ slideType: slideTypeSchema.default("bullets").describe("The type of slide to create"),
1331
+ content: z15.record(z15.unknown()).optional().describe('Type-specific content object. For bullets: {title, items: ["..."]}. For title: {title, subtitle}. For two_column: {title, left, right}. For quote: {quote, attribution}. For mermaid: {title, code: "graph TD; A-->B"}. For paragraph: {title, body}. Etc.'),
1332
+ speakerNotes: z15.string().nullable().optional().describe("Speaker notes for the slide")
1333
+ };
1334
+ var updateSlideInput = {
1335
+ variantId: idField("variant"),
1336
+ slideId: idField("slide to update"),
1337
+ title: z15.string().optional().describe("New title"),
1338
+ content: z15.object({ body: z15.string().optional() }).nullable().optional().describe("New slide content with markdown body"),
1339
+ speakerNotes: z15.string().nullable().optional().describe("New speaker notes")
1340
+ };
1341
+ var deleteSlideInput = {
1342
+ variantId: idField("variant"),
1343
+ slideId: idField("slide to delete")
1344
+ };
1345
+ var reorderSlidesInput = {
1346
+ variantId: idField("variant"),
1347
+ items: orderItemsField("slide")
1348
+ };
1349
+ var uploadSlideImageInput = {
1350
+ variantId: idField("variant"),
1351
+ slideId: idField("slide to add the image to"),
1352
+ filePath: z15.string().describe("Absolute path to the image file on disk")
1353
+ };
1354
+ // ../../packages/shared/src/schemas/variant.ts
1355
+ import { z as z16 } from "zod";
1356
+ var variantSchema = z16.object({
1357
+ id: z16.string().uuid(),
1358
+ presentationId: z16.string().uuid(),
1359
+ name: z16.string(),
1360
+ audienceId: z16.string().uuid().nullable(),
1361
+ isDefault: z16.boolean(),
1362
+ order: z16.number().int(),
1363
+ createdAt: z16.string(),
1364
+ createdBy: z16.string(),
1365
+ updatedAt: z16.string().nullable()
918
1366
  });
919
- var createVariantSchema = z15.object({
920
- name: z15.string().min(1),
921
- audienceId: z15.string().uuid().nullable().optional()
1367
+ var createVariantSchema = z16.object({
1368
+ name: z16.string().min(1),
1369
+ audienceId: z16.string().uuid().nullable().optional()
922
1370
  });
923
- var updateVariantSchema = z15.object({
924
- name: z15.string().min(1).optional(),
925
- audienceId: z15.string().uuid().nullable().optional()
1371
+ var updateVariantSchema = z16.object({
1372
+ name: z16.string().min(1).optional(),
1373
+ audienceId: z16.string().uuid().nullable().optional()
926
1374
  });
927
- var variantListSchema = z15.array(variantSchema);
928
- // src/tools/index.ts
929
- import { z as z16 } from "zod";
930
-
1375
+ var variantListSchema = z16.array(variantSchema);
931
1376
  // src/auth.ts
932
1377
  function getCredentials() {
933
1378
  const apiKey = process.env.ROADMAPS_API_KEY;
@@ -1751,15 +2196,7 @@ function registerGetWorkflows(server) {
1751
2196
  function registerSearchRoadmaps(server) {
1752
2197
  server.registerTool("search_roadmaps", {
1753
2198
  description: "Search for roadmap items by title, status, or horizon. Returns a list of matching roadmap items with basic info.",
1754
- inputSchema: {
1755
- query: z16.string().optional().describe("Search query to match against title or description"),
1756
- status: roadmapStatusSchema.optional().describe("Filter by status"),
1757
- horizon: horizonSchema.optional().describe("Filter by planning horizon"),
1758
- phase: z16.string().optional().describe("Filter by phase"),
1759
- phaseStep: z16.string().optional().describe("Filter by phase step"),
1760
- limit: z16.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
1761
- offset: z16.number().int().min(0).optional().describe("Number of items to skip (default 0)")
1762
- }
2199
+ inputSchema: searchRoadmapsInput
1763
2200
  }, async ({
1764
2201
  query,
1765
2202
  status,
@@ -1808,9 +2245,7 @@ function registerSearchRoadmaps(server) {
1808
2245
  function registerGetRoadmap(server) {
1809
2246
  server.registerTool("get_roadmap", {
1810
2247
  description: "Get full details of a roadmap item including PRD, wireframes, brainstorm media, linked features, epics, and stories.",
1811
- inputSchema: {
1812
- id: z16.string().describe("The UUID of the roadmap item")
1813
- }
2248
+ inputSchema: getRoadmapInput
1814
2249
  }, async ({ id }) => {
1815
2250
  const client2 = getApiClient();
1816
2251
  const roadmap2 = await client2.getRoadmap(id);
@@ -1870,10 +2305,7 @@ function registerGetRoadmap(server) {
1870
2305
  function registerSearchFeatures(server) {
1871
2306
  server.registerTool("search_features", {
1872
2307
  description: "Search for features and feature areas by name. Returns a list of matching features with basic info.",
1873
- inputSchema: {
1874
- query: z16.string().optional().describe("Search query to match against name"),
1875
- type: featureTypeSchema.optional().describe("Filter by type (feature or area)")
1876
- }
2308
+ inputSchema: searchFeaturesInput
1877
2309
  }, async ({ query, type }) => {
1878
2310
  const client2 = getApiClient();
1879
2311
  let features = await client2.listFeatures();
@@ -1902,9 +2334,7 @@ function registerSearchFeatures(server) {
1902
2334
  function registerGetFeature(server) {
1903
2335
  server.registerTool("get_feature", {
1904
2336
  description: "Get full details of a feature including outcomes, child features, and linked roadmap items.",
1905
- inputSchema: {
1906
- id: z16.string().describe("The UUID of the feature")
1907
- }
2337
+ inputSchema: getFeatureInput
1908
2338
  }, async ({ id }) => {
1909
2339
  const client2 = getApiClient();
1910
2340
  const feature2 = await client2.getFeature(id);
@@ -1941,10 +2371,7 @@ function registerGetFeature(server) {
1941
2371
  function registerSearchIdeas(server) {
1942
2372
  server.registerTool("search_ideas", {
1943
2373
  description: "Search for ideas by title or status. Returns a list of matching ideas with basic info.",
1944
- inputSchema: {
1945
- query: z16.string().optional().describe("Search query to match against title or description"),
1946
- status: ideaStatusSchema.optional().describe("Filter by status")
1947
- }
2374
+ inputSchema: searchIdeasInput
1948
2375
  }, async ({ query, status }) => {
1949
2376
  const client2 = getApiClient();
1950
2377
  let ideas = await client2.listIdeas();
@@ -2041,11 +2468,7 @@ Use this as your FIRST call when starting work on a roadmap to understand the fu
2041
2468
  function registerCaptureIdea(server) {
2042
2469
  server.registerTool("capture_idea", {
2043
2470
  description: "Quickly capture a new idea. Ideas are suggestions that can later be reviewed and potentially converted to roadmap items.",
2044
- inputSchema: {
2045
- title: z16.string().describe("Title of the idea"),
2046
- description: z16.string().optional().describe("Detailed description of the idea"),
2047
- source: z16.string().optional().describe('Source of the idea (defaults to "claude-code")')
2048
- }
2471
+ inputSchema: captureIdeaInput
2049
2472
  }, async ({
2050
2473
  title,
2051
2474
  description,
@@ -2080,18 +2503,7 @@ function registerCaptureIdea(server) {
2080
2503
  function registerCreateRoadmapItem(server) {
2081
2504
  server.registerTool("create_roadmap_item", {
2082
2505
  description: "Create a new roadmap item. Use this to add planned work to the roadmap.",
2083
- inputSchema: {
2084
- title: z16.string().describe("Title of the roadmap item"),
2085
- status: roadmapStatusSchema.optional().describe('Status (defaults to "not_started")'),
2086
- horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
2087
- phase: z16.string().optional().describe('Initial phase key (e.g., "brainstorm", "prd", "design")'),
2088
- phaseStep: z16.string().optional().describe('Initial step within phase (e.g., "not_started", "drafting")'),
2089
- initiativeId: z16.string().optional().describe("UUID of initiative to link this item to on creation"),
2090
- dateGranularity: dateGranularitySchema2.optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
2091
- dateValue: z16.string().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
2092
- targetGranularity: dateGranularitySchema2.optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
2093
- targetValue: z16.string().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
2094
- }
2506
+ inputSchema: createRoadmapItemInput
2095
2507
  }, async ({
2096
2508
  title,
2097
2509
  status,
@@ -2152,31 +2564,10 @@ function registerCreateRoadmapItem(server) {
2152
2564
  };
2153
2565
  });
2154
2566
  }
2155
- var effortSizeSchema = z16.enum(["xs", "s", "m", "l", "xl"]);
2156
2567
  function registerUpdateRoadmapItem(server) {
2157
2568
  server.registerTool("update_roadmap_item", {
2158
2569
  description: "Update an existing roadmap item. Can update title, status, horizon, value, effort, order, prompt, initiative link, target date, phase, phaseStep, or brainstorm notes.",
2159
- inputSchema: {
2160
- id: z16.string().describe("The UUID of the roadmap item to update"),
2161
- title: z16.string().optional().describe("New title"),
2162
- status: roadmapStatusSchema.optional().describe("New status"),
2163
- horizon: horizonSchema.optional().describe("New planning horizon"),
2164
- phase: z16.string().optional().describe('Current phase key (e.g., "prd", "design", "build")'),
2165
- phaseStep: z16.string().optional().describe('Current step within phase (e.g., "drafting", "needs_review", "approved")'),
2166
- value: z16.number().int().min(1).max(3).nullable().optional().describe("Value rating (1-3 stars, where 3 is highest value)"),
2167
- effort: effortSizeSchema.nullable().optional().describe("Effort estimate (xs=extra small, s=small, m=medium, l=large, xl=extra large)"),
2168
- order: z16.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)"),
2169
- initiativeId: z16.string().nullable().optional().describe("UUID to link item to initiative, or null to unlink from any initiative"),
2170
- designDescription: z16.string().nullable().optional().describe("Description for the Design phase"),
2171
- planDescription: z16.string().nullable().optional().describe("Description for the Planning phase"),
2172
- buildDescription: z16.string().nullable().optional().describe("Description for the Build phase"),
2173
- releaseDescription: z16.string().nullable().optional().describe("Description for the Release phase"),
2174
- prompt: z16.string().nullable().optional().describe("Build prompt for the roadmap item"),
2175
- dateGranularity: dateGranularitySchema2.nullable().optional().describe("Planned date granularity: day, month, quarter, half-year, or year"),
2176
- dateValue: z16.string().nullable().optional().describe('Planned date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)'),
2177
- targetGranularity: dateGranularitySchema2.nullable().optional().describe("Deadline/target date granularity: day, month, quarter, half-year, or year"),
2178
- targetValue: z16.string().nullable().optional().describe('Deadline/target date value matching granularity (e.g., "2024-03-15" for day, "2024-Q1" for quarter)')
2179
- }
2570
+ inputSchema: updateRoadmapItemInput
2180
2571
  }, async ({
2181
2572
  id,
2182
2573
  title,
@@ -2285,14 +2676,7 @@ function registerUpdateRoadmapItem(server) {
2285
2676
  function registerAddFeature(server) {
2286
2677
  server.registerTool("add_feature", {
2287
2678
  description: "Create a new feature with optional outcomes. Features represent capabilities or functionality areas.",
2288
- inputSchema: {
2289
- name: z16.string().describe("Name of the feature"),
2290
- description: z16.string().optional().describe("Description of the feature"),
2291
- type: featureTypeSchema.optional().describe('Type - "feature" for specific functionality, "area" for grouping (defaults to "feature")'),
2292
- parentId: z16.string().optional().describe("UUID of parent feature/area to nest under"),
2293
- outcomes: z16.array(z16.string()).optional().describe("List of expected outcomes for this feature"),
2294
- linkToRoadmapId: z16.string().optional().describe("UUID of roadmap item to link this feature to")
2295
- }
2679
+ inputSchema: addFeatureInput
2296
2680
  }, async ({
2297
2681
  name,
2298
2682
  description,
@@ -2337,12 +2721,7 @@ function registerAddFeature(server) {
2337
2721
  function registerSavePrd(server) {
2338
2722
  server.registerTool("save_prd", {
2339
2723
  description: "Save or update the PRD (Product Requirements Document) content for a roadmap item. Content should be markdown.",
2340
- inputSchema: {
2341
- roadmapId: z16.string().describe("The UUID of the roadmap item"),
2342
- what: z16.string().nullable().describe("What is being built - the feature description"),
2343
- why: z16.string().nullable().describe("Why this is being built - the business justification"),
2344
- outcomes: z16.array(z16.string()).optional().describe("List of expected outcomes/success criteria")
2345
- }
2724
+ inputSchema: savePrdInput
2346
2725
  }, async ({
2347
2726
  roadmapId,
2348
2727
  what,
@@ -2378,10 +2757,7 @@ function registerSavePrd(server) {
2378
2757
  function registerUpdateBrainstormNotes(server) {
2379
2758
  server.registerTool("update_brainstorm_notes", {
2380
2759
  description: "Update the brainstorm notes for a roadmap item. Use this to capture ideas, questions, and research notes.",
2381
- inputSchema: {
2382
- roadmapId: z16.string().describe("The UUID of the roadmap item"),
2383
- notes: z16.string().describe("The brainstorm notes content")
2384
- }
2760
+ inputSchema: updateBrainstormNotesInput
2385
2761
  }, async ({ roadmapId, notes }) => {
2386
2762
  const client2 = getApiClient();
2387
2763
  const roadmap2 = await client2.updateRoadmap(roadmapId, {
@@ -2408,9 +2784,7 @@ function registerUpdateBrainstormNotes(server) {
2408
2784
  function registerDeleteRoadmapItem(server) {
2409
2785
  server.registerTool("delete_roadmap_item", {
2410
2786
  description: "Delete a roadmap item. This is a soft delete - the item can potentially be recovered.",
2411
- inputSchema: {
2412
- id: z16.string().describe("The UUID of the roadmap item to delete")
2413
- }
2787
+ inputSchema: deleteRoadmapItemInput
2414
2788
  }, async ({ id }) => {
2415
2789
  const client2 = getApiClient();
2416
2790
  await client2.deleteRoadmap(id);
@@ -2430,12 +2804,7 @@ function registerDeleteRoadmapItem(server) {
2430
2804
  function registerReorderRoadmaps(server) {
2431
2805
  server.registerTool("reorder_roadmaps", {
2432
2806
  description: "Bulk reorder roadmap items by setting their order values. Use this to prioritize and organize the roadmap. Lower order values appear first.",
2433
- inputSchema: {
2434
- items: z16.array(z16.object({
2435
- id: z16.string().describe("The UUID of the roadmap item"),
2436
- order: z16.number().int().min(0).describe("The new order value (0-based, lower = higher priority)")
2437
- })).describe("Array of roadmap items with their new order values")
2438
- }
2807
+ inputSchema: reorderRoadmapsInput
2439
2808
  }, async ({ items }) => {
2440
2809
  const client2 = getApiClient();
2441
2810
  const result = await client2.reorderRoadmaps(items);
@@ -2456,12 +2825,7 @@ function registerReorderRoadmaps(server) {
2456
2825
  function registerUpdateFeature(server) {
2457
2826
  server.registerTool("update_feature", {
2458
2827
  description: "Update an existing feature. Can update name, type, or parent.",
2459
- inputSchema: {
2460
- id: z16.string().describe("The UUID of the feature to update"),
2461
- name: z16.string().optional().describe("New name for the feature"),
2462
- type: featureTypeSchema.optional().describe('New type - "feature" or "area"'),
2463
- parentId: z16.string().nullable().optional().describe("New parent feature/area UUID, or null to move to root")
2464
- }
2828
+ inputSchema: updateFeatureInput
2465
2829
  }, async ({
2466
2830
  id,
2467
2831
  name,
@@ -2498,9 +2862,7 @@ function registerUpdateFeature(server) {
2498
2862
  function registerDeleteFeature(server) {
2499
2863
  server.registerTool("delete_feature", {
2500
2864
  description: "Delete a feature. This is a soft delete that also deletes all child features.",
2501
- inputSchema: {
2502
- id: z16.string().describe("The UUID of the feature to delete")
2503
- }
2865
+ inputSchema: deleteFeatureInput
2504
2866
  }, async ({ id }) => {
2505
2867
  const client2 = getApiClient();
2506
2868
  await client2.deleteFeature(id);
@@ -2520,9 +2882,7 @@ function registerDeleteFeature(server) {
2520
2882
  function registerGetIdea(server) {
2521
2883
  server.registerTool("get_idea", {
2522
2884
  description: "Get full details of a single idea by ID.",
2523
- inputSchema: {
2524
- id: z16.string().describe("The UUID of the idea")
2525
- }
2885
+ inputSchema: getIdeaInput
2526
2886
  }, async ({ id }) => {
2527
2887
  const client2 = getApiClient();
2528
2888
  const idea2 = await client2.getIdea(id);
@@ -2549,14 +2909,7 @@ function registerGetIdea(server) {
2549
2909
  function registerUpdateIdea(server) {
2550
2910
  server.registerTool("update_idea", {
2551
2911
  description: "Update an existing idea. Can update title, description, status, value, or effort.",
2552
- inputSchema: {
2553
- id: z16.string().describe("The UUID of the idea to update"),
2554
- title: z16.string().optional().describe("New title"),
2555
- description: z16.string().nullable().optional().describe("New description"),
2556
- status: ideaStatusSchema.optional().describe("New status"),
2557
- value: z16.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated value"),
2558
- effort: z16.enum(["xs", "s", "m", "l", "xl"]).nullable().optional().describe("Estimated effort")
2559
- }
2912
+ inputSchema: updateIdeaInput
2560
2913
  }, async ({
2561
2914
  id,
2562
2915
  title,
@@ -2601,9 +2954,7 @@ function registerUpdateIdea(server) {
2601
2954
  function registerDeleteIdea(server) {
2602
2955
  server.registerTool("delete_idea", {
2603
2956
  description: "Delete an idea. This is a soft delete.",
2604
- inputSchema: {
2605
- id: z16.string().describe("The UUID of the idea to delete")
2606
- }
2957
+ inputSchema: deleteIdeaInput
2607
2958
  }, async ({ id }) => {
2608
2959
  const client2 = getApiClient();
2609
2960
  await client2.deleteIdea(id);
@@ -2643,10 +2994,7 @@ function registerGetStrategy(server) {
2643
2994
  function registerUpdateStrategy(server) {
2644
2995
  server.registerTool("update_strategy", {
2645
2996
  description: "Update the organization strategy. Can update vision, mission, or both. Use this to set or refine the high-level direction.",
2646
- inputSchema: {
2647
- vision: z16.string().nullable().optional().describe("The vision statement - where the product is headed"),
2648
- mission: z16.string().nullable().optional().describe("The mission statement - why the product exists")
2649
- }
2997
+ inputSchema: updateStrategyInput
2650
2998
  }, async ({ vision, mission }) => {
2651
2999
  const client2 = getApiClient();
2652
3000
  const updates = {};
@@ -2692,10 +3040,7 @@ function registerListScenarios(server) {
2692
3040
  function registerCreateScenario(server) {
2693
3041
  server.registerTool("create_scenario", {
2694
3042
  description: "Create a new user scenario. Scenarios describe user workflows and how they accomplish goals.",
2695
- inputSchema: {
2696
- title: z16.string().describe('Title of the scenario (e.g., "User creates their first roadmap")'),
2697
- description: z16.string().nullable().optional().describe("Detailed description of the scenario workflow")
2698
- }
3043
+ inputSchema: createScenarioInput
2699
3044
  }, async ({ title, description }) => {
2700
3045
  const client2 = getApiClient();
2701
3046
  const scenario2 = await client2.createScenario({
@@ -2722,11 +3067,7 @@ function registerCreateScenario(server) {
2722
3067
  function registerUpdateScenario(server) {
2723
3068
  server.registerTool("update_scenario", {
2724
3069
  description: "Update an existing scenario.",
2725
- inputSchema: {
2726
- id: z16.string().describe("The UUID of the scenario to update"),
2727
- title: z16.string().optional().describe("New title"),
2728
- description: z16.string().nullable().optional().describe("New description")
2729
- }
3070
+ inputSchema: updateScenarioInput
2730
3071
  }, async ({
2731
3072
  id,
2732
3073
  title,
@@ -2759,9 +3100,7 @@ function registerUpdateScenario(server) {
2759
3100
  function registerDeleteScenario(server) {
2760
3101
  server.registerTool("delete_scenario", {
2761
3102
  description: "Delete a scenario. This is a soft delete.",
2762
- inputSchema: {
2763
- id: z16.string().describe("The UUID of the scenario to delete")
2764
- }
3103
+ inputSchema: deleteScenarioInput
2765
3104
  }, async ({ id }) => {
2766
3105
  const client2 = getApiClient();
2767
3106
  await client2.deleteScenario(id);
@@ -2775,22 +3114,10 @@ function registerDeleteScenario(server) {
2775
3114
  };
2776
3115
  });
2777
3116
  }
2778
- var productTypeSchema2 = z16.enum([
2779
- "brand",
2780
- "product",
2781
- "app",
2782
- "marketing_site",
2783
- "landing_page",
2784
- "service"
2785
- ]);
2786
3117
  function registerCreateProduct(server) {
2787
3118
  server.registerTool("create_product", {
2788
3119
  description: "Create a new product, app, brand, or service. Products represent what the organization builds and offers.",
2789
- inputSchema: {
2790
- type: productTypeSchema2.describe("Type of product"),
2791
- name: z16.string().describe("Name of the product"),
2792
- parentId: z16.string().nullable().optional().describe("UUID of parent product to nest under")
2793
- }
3120
+ inputSchema: createProductInput
2794
3121
  }, async ({
2795
3122
  type,
2796
3123
  name,
@@ -2823,11 +3150,7 @@ function registerCreateProduct(server) {
2823
3150
  function registerUpdateProduct(server) {
2824
3151
  server.registerTool("update_product", {
2825
3152
  description: "Update an existing product.",
2826
- inputSchema: {
2827
- id: z16.string().describe("The UUID of the product to update"),
2828
- name: z16.string().optional().describe("New name"),
2829
- parentId: z16.string().nullable().optional().describe("New parent product UUID, or null to move to root")
2830
- }
3153
+ inputSchema: updateProductInput
2831
3154
  }, async ({ id, name, parentId }) => {
2832
3155
  const client2 = getApiClient();
2833
3156
  const updates = {};
@@ -2857,9 +3180,7 @@ function registerUpdateProduct(server) {
2857
3180
  function registerDeleteProduct(server) {
2858
3181
  server.registerTool("delete_product", {
2859
3182
  description: "Delete a product. This is a soft delete that also deletes all child products.",
2860
- inputSchema: {
2861
- id: z16.string().describe("The UUID of the product to delete")
2862
- }
3183
+ inputSchema: deleteProductInput
2863
3184
  }, async ({ id }) => {
2864
3185
  const client2 = getApiClient();
2865
3186
  const result = await client2.deleteProduct(id);
@@ -2880,9 +3201,7 @@ function registerDeleteProduct(server) {
2880
3201
  function registerGetProduct(server) {
2881
3202
  server.registerTool("get_product", {
2882
3203
  description: "Get full details of a product by ID, including its documentation (design system and ADRs).",
2883
- inputSchema: {
2884
- id: z16.string().describe("The UUID of the product")
2885
- }
3204
+ inputSchema: getProductInput
2886
3205
  }, async ({ id }) => {
2887
3206
  const client2 = getApiClient();
2888
3207
  const [product2, documentation] = await Promise.all([
@@ -2917,10 +3236,7 @@ function registerGetProduct(server) {
2917
3236
  function registerSearchProducts(server) {
2918
3237
  server.registerTool("search_products", {
2919
3238
  description: "Search for products by name. Returns a list of matching products with basic info.",
2920
- inputSchema: {
2921
- query: z16.string().optional().describe("Search query to match against product name"),
2922
- type: productTypeSchema2.optional().describe("Filter by product type")
2923
- }
3239
+ inputSchema: searchProductsInput
2924
3240
  }, async ({ query, type }) => {
2925
3241
  const client2 = getApiClient();
2926
3242
  let products = await client2.listProducts();
@@ -2952,9 +3268,7 @@ function registerSearchProducts(server) {
2952
3268
  function registerGetProductDocumentation(server) {
2953
3269
  server.registerTool("get_product_documentation", {
2954
3270
  description: "Get the documentation (design system and ADRs) for a product. Use this to read existing documentation before updating.",
2955
- inputSchema: {
2956
- productId: z16.string().describe("The UUID of the product")
2957
- }
3271
+ inputSchema: getProductDocumentationInput
2958
3272
  }, async ({ productId }) => {
2959
3273
  const client2 = getApiClient();
2960
3274
  const documentation = await client2.getProductDocumentation(productId);
@@ -2980,11 +3294,7 @@ function registerGetProductDocumentation(server) {
2980
3294
  function registerUpdateProductDocumentation(server) {
2981
3295
  server.registerTool("update_product_documentation", {
2982
3296
  description: "Update the documentation for a product. Use this to keep design system and ADRs up to date. Creates documentation if it does not exist.",
2983
- inputSchema: {
2984
- productId: z16.string().describe("The UUID of the product"),
2985
- designSystem: z16.string().nullable().optional().describe("Design system documentation - colors, typography, spacing, components. Pass null to clear."),
2986
- adrs: z16.string().nullable().optional().describe("Architecture Decision Records - document key technical decisions. Pass null to clear.")
2987
- }
3297
+ inputSchema: updateProductDocumentationInput
2988
3298
  }, async ({
2989
3299
  productId,
2990
3300
  designSystem,
@@ -3019,10 +3329,7 @@ function registerUpdateProductDocumentation(server) {
3019
3329
  function registerCreateAudience(server) {
3020
3330
  server.registerTool("create_audience", {
3021
3331
  description: "Create a new audience member. Audiences represent who the product serves.",
3022
- inputSchema: {
3023
- name: z16.string().describe('Name of the audience (e.g., "Product Manager", "End User")'),
3024
- description: z16.string().nullable().optional().describe("Description of the audience")
3025
- }
3332
+ inputSchema: createAudienceInput
3026
3333
  }, async ({ name, description }) => {
3027
3334
  const client2 = getApiClient();
3028
3335
  const audience2 = await client2.createAudience({
@@ -3049,11 +3356,7 @@ function registerCreateAudience(server) {
3049
3356
  function registerUpdateAudience(server) {
3050
3357
  server.registerTool("update_audience", {
3051
3358
  description: "Update an existing audience member.",
3052
- inputSchema: {
3053
- id: z16.string().describe("The UUID of the audience to update"),
3054
- name: z16.string().optional().describe("New name"),
3055
- description: z16.string().nullable().optional().describe("New description")
3056
- }
3359
+ inputSchema: updateAudienceInput
3057
3360
  }, async ({
3058
3361
  id,
3059
3362
  name,
@@ -3086,9 +3389,7 @@ function registerUpdateAudience(server) {
3086
3389
  function registerDeleteAudience(server) {
3087
3390
  server.registerTool("delete_audience", {
3088
3391
  description: "Delete an audience member. This is a soft delete.",
3089
- inputSchema: {
3090
- id: z16.string().describe("The UUID of the audience to delete")
3091
- }
3392
+ inputSchema: deleteAudienceInput
3092
3393
  }, async ({ id }) => {
3093
3394
  const client2 = getApiClient();
3094
3395
  await client2.deleteAudience(id);
@@ -3128,20 +3429,7 @@ function registerListStatusUpdates(server) {
3128
3429
  function registerGetHistory(server) {
3129
3430
  server.registerTool("get_history", {
3130
3431
  description: "Get raw history events for a date range. Returns full event details including payloads. " + "Use entityType or entityId filters to narrow results. For status reports, prefer " + "get_history_summary to avoid context overflow.",
3131
- inputSchema: {
3132
- startDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
3133
- endDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format"),
3134
- entityType: z16.enum([
3135
- "roadmap",
3136
- "feature",
3137
- "idea",
3138
- "prd",
3139
- "wireframe",
3140
- "product",
3141
- "audience",
3142
- "scenario"
3143
- ]).optional().describe("Filter to specific entity type")
3144
- }
3432
+ inputSchema: getHistoryInput
3145
3433
  }, async ({
3146
3434
  startDate,
3147
3435
  endDate,
@@ -3162,10 +3450,7 @@ function registerGetHistory(server) {
3162
3450
  function registerGetHistorySummary(server) {
3163
3451
  server.registerTool("get_history_summary", {
3164
3452
  description: "Get a summary of history events for a date range. Returns counts by entity type, " + "list of changed entities with titles, and total event count. Use this for status " + "report generation instead of get_history to avoid context overflow.",
3165
- inputSchema: {
3166
- startDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Start date in YYYY-MM-DD format"),
3167
- endDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("End date in YYYY-MM-DD format")
3168
- }
3453
+ inputSchema: getHistorySummaryInput
3169
3454
  }, async ({ startDate, endDate }) => {
3170
3455
  const client2 = getApiClient();
3171
3456
  const summary = await client2.getHistorySummary({ startDate, endDate });
@@ -3182,16 +3467,7 @@ function registerGetHistorySummary(server) {
3182
3467
  function registerCreateStatusUpdate(server) {
3183
3468
  server.registerTool("create_status_update", {
3184
3469
  description: "Create a new status report. Use this after generating the report content from history events.",
3185
- inputSchema: {
3186
- startDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period start date in YYYY-MM-DD format"),
3187
- endDate: z16.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("Report period end date in YYYY-MM-DD format"),
3188
- content: z16.string().describe("The markdown content of the status report"),
3189
- title: z16.string().optional().describe("Optional title for the report"),
3190
- items: z16.array(z16.object({
3191
- roadmapItemId: z16.string().describe("UUID of the roadmap item"),
3192
- status: z16.string().describe("Status of the item at report creation time")
3193
- })).optional().describe("Roadmap items to include in the report snapshot")
3194
- }
3470
+ inputSchema: createStatusUpdateInput
3195
3471
  }, async ({
3196
3472
  startDate,
3197
3473
  endDate,
@@ -3229,21 +3505,7 @@ function registerCreateStatusUpdate(server) {
3229
3505
  function registerSaveStories(server) {
3230
3506
  server.registerTool("save_stories", {
3231
3507
  description: "Save epics and stories for a roadmap item. Replaces all existing epics/stories. Use this to set the complete list of epics and stories for a roadmap.",
3232
- inputSchema: {
3233
- roadmapId: z16.string().uuid().describe("The UUID of the roadmap item"),
3234
- epics: z16.array(z16.object({
3235
- title: z16.string().min(1).describe("Title of the epic"),
3236
- description: z16.string().nullable().optional().describe("Description of the epic"),
3237
- stories: z16.array(z16.object({
3238
- title: z16.string().min(1).describe("Title of the story"),
3239
- description: z16.string().nullable().optional().describe("Description of the story")
3240
- })).optional().describe("Stories within this epic")
3241
- })).optional().describe("List of epics with their nested stories"),
3242
- stories: z16.array(z16.object({
3243
- title: z16.string().min(1).describe("Title of the story"),
3244
- description: z16.string().nullable().optional().describe("Description of the story")
3245
- })).optional().describe("List of standalone stories (not part of any epic)")
3246
- }
3508
+ inputSchema: saveStoriesInput
3247
3509
  }, async ({
3248
3510
  roadmapId,
3249
3511
  epics,
@@ -3272,12 +3534,7 @@ function registerSaveStories(server) {
3272
3534
  function registerUploadWireframe(server) {
3273
3535
  server.registerTool("upload_wireframe", {
3274
3536
  description: "Upload an image to a roadmap item's wireframes. Returns a curl command to execute for the upload, then creates the wireframe record. After running the curl command, the wireframe will be visible in the web app.",
3275
- inputSchema: {
3276
- roadmapId: z16.string().describe("The UUID of the roadmap item"),
3277
- filePath: z16.string().describe("Absolute path to the image file on disk"),
3278
- description: z16.string().optional().describe("Optional description of the wireframe"),
3279
- outcomeIds: z16.array(z16.string()).optional().describe("Optional array of PRD outcome IDs this wireframe addresses")
3280
- }
3537
+ inputSchema: uploadWireframeInput
3281
3538
  }, async ({
3282
3539
  roadmapId,
3283
3540
  filePath,
@@ -3329,11 +3586,7 @@ function registerUploadWireframe(server) {
3329
3586
  function registerUpdateWireframe(server) {
3330
3587
  server.registerTool("update_wireframe", {
3331
3588
  description: "Update a wireframe's description or outcome tags.",
3332
- inputSchema: {
3333
- id: z16.string().describe("The UUID of the wireframe"),
3334
- description: z16.string().nullable().optional().describe("New description for the wireframe"),
3335
- outcomeIds: z16.array(z16.string()).optional().describe("Array of PRD outcome IDs this wireframe addresses (replaces existing)")
3336
- }
3589
+ inputSchema: updateWireframeInput
3337
3590
  }, async ({
3338
3591
  id,
3339
3592
  description,
@@ -3367,9 +3620,7 @@ function registerUpdateWireframe(server) {
3367
3620
  function registerDeleteWireframe(server) {
3368
3621
  server.registerTool("delete_wireframe", {
3369
3622
  description: "Delete a wireframe (soft delete).",
3370
- inputSchema: {
3371
- id: z16.string().describe("The UUID of the wireframe to delete")
3372
- }
3623
+ inputSchema: deleteWireframeInput
3373
3624
  }, async ({ id }) => {
3374
3625
  const client2 = getApiClient();
3375
3626
  await client2.deleteWireframe(id);
@@ -3386,11 +3637,7 @@ function registerDeleteWireframe(server) {
3386
3637
  function registerUploadBrainstormMedia(server) {
3387
3638
  server.registerTool("upload_brainstorm_media", {
3388
3639
  description: "Upload an image or video to a roadmap item's brainstorming section. Returns a curl command to execute for the upload.",
3389
- inputSchema: {
3390
- roadmapId: z16.string().describe("The UUID of the roadmap item"),
3391
- filePath: z16.string().describe("Absolute path to the image or video file on disk"),
3392
- description: z16.string().optional().describe("Optional description of the media")
3393
- }
3640
+ inputSchema: uploadBrainstormMediaInput
3394
3641
  }, async ({
3395
3642
  roadmapId,
3396
3643
  filePath,
@@ -3440,10 +3687,7 @@ function registerUploadBrainstormMedia(server) {
3440
3687
  function registerUpdateBrainstormMedia(server) {
3441
3688
  server.registerTool("update_brainstorm_media", {
3442
3689
  description: "Update a brainstorm media item's description.",
3443
- inputSchema: {
3444
- id: z16.string().describe("The UUID of the brainstorm media"),
3445
- description: z16.string().nullable().describe("New description for the media")
3446
- }
3690
+ inputSchema: updateBrainstormMediaInput
3447
3691
  }, async ({ id, description }) => {
3448
3692
  const client2 = getApiClient();
3449
3693
  const media = await client2.updateBrainstormMedia(id, { description });
@@ -3465,9 +3709,7 @@ function registerUpdateBrainstormMedia(server) {
3465
3709
  function registerDeleteBrainstormMedia(server) {
3466
3710
  server.registerTool("delete_brainstorm_media", {
3467
3711
  description: "Delete a brainstorm media item (soft delete).",
3468
- inputSchema: {
3469
- id: z16.string().describe("The UUID of the brainstorm media to delete")
3470
- }
3712
+ inputSchema: deleteBrainstormMediaInput
3471
3713
  }, async ({ id }) => {
3472
3714
  const client2 = getApiClient();
3473
3715
  await client2.deleteBrainstormMedia(id);
@@ -3484,11 +3726,7 @@ function registerDeleteBrainstormMedia(server) {
3484
3726
  function registerUploadProductDesignMedia(server) {
3485
3727
  server.registerTool("upload_product_design_media", {
3486
3728
  description: "Upload an image or video to a product's design media section. Returns a curl command to execute for the upload.",
3487
- inputSchema: {
3488
- productId: z16.string().describe("The UUID of the product"),
3489
- filePath: z16.string().describe("Absolute path to the image or video file on disk"),
3490
- description: z16.string().optional().describe("Optional description of the media")
3491
- }
3729
+ inputSchema: uploadProductDesignMediaInput
3492
3730
  }, async ({
3493
3731
  productId,
3494
3732
  filePath,
@@ -3539,11 +3777,7 @@ function registerUploadProductDesignMedia(server) {
3539
3777
  function registerUpdateProductDesignMedia(server) {
3540
3778
  server.registerTool("update_product_design_media", {
3541
3779
  description: "Update a product design media item's description.",
3542
- inputSchema: {
3543
- productId: z16.string().describe("The UUID of the product"),
3544
- mediaId: z16.string().describe("The UUID of the design media"),
3545
- description: z16.string().nullable().describe("New description for the media")
3546
- }
3780
+ inputSchema: updateProductDesignMediaInput
3547
3781
  }, async ({
3548
3782
  productId,
3549
3783
  mediaId,
@@ -3569,10 +3803,7 @@ function registerUpdateProductDesignMedia(server) {
3569
3803
  function registerDeleteProductDesignMedia(server) {
3570
3804
  server.registerTool("delete_product_design_media", {
3571
3805
  description: "Delete a product design media item (soft delete).",
3572
- inputSchema: {
3573
- productId: z16.string().describe("The UUID of the product"),
3574
- mediaId: z16.string().describe("The UUID of the design media to delete")
3575
- }
3806
+ inputSchema: deleteProductDesignMediaInput
3576
3807
  }, async ({ productId, mediaId }) => {
3577
3808
  const client2 = getApiClient();
3578
3809
  await client2.deleteProductDesignMedia(productId, mediaId);
@@ -3592,10 +3823,7 @@ function isVideoContentType(contentType) {
3592
3823
  function registerUploadDesignWalkthrough(server) {
3593
3824
  server.registerTool("upload_design_walkthrough", {
3594
3825
  description: "Upload a walkthrough video to a roadmap item's design phase. Returns a curl command to execute for the upload.",
3595
- inputSchema: {
3596
- roadmapId: z16.string().describe("The UUID of the roadmap item"),
3597
- filePath: z16.string().describe("Absolute path to the video file on disk")
3598
- }
3826
+ inputSchema: uploadDesignWalkthroughInput
3599
3827
  }, async ({ roadmapId, filePath }) => {
3600
3828
  const client2 = getApiClient();
3601
3829
  const filename = filePath.split("/").pop() || "video.mp4";
@@ -3635,10 +3863,7 @@ function registerUploadDesignWalkthrough(server) {
3635
3863
  function registerUploadReleaseWalkthrough(server) {
3636
3864
  server.registerTool("upload_release_walkthrough", {
3637
3865
  description: "Upload a walkthrough video to a roadmap item's release phase. Returns a curl command to execute for the upload.",
3638
- inputSchema: {
3639
- roadmapId: z16.string().describe("The UUID of the roadmap item"),
3640
- filePath: z16.string().describe("Absolute path to the video file on disk")
3641
- }
3866
+ inputSchema: uploadReleaseWalkthroughInput
3642
3867
  }, async ({ roadmapId, filePath }) => {
3643
3868
  const client2 = getApiClient();
3644
3869
  const filename = filePath.split("/").pop() || "video.mp4";
@@ -3694,11 +3919,7 @@ function getPrototypeContentType(filename) {
3694
3919
  function registerPublishPrototype(server) {
3695
3920
  server.registerTool("publish_prototype", {
3696
3921
  description: "Publish a local prototype folder to a shareable URL. Uploads all files from the folder and returns a time-limited shareable link.",
3697
- inputSchema: {
3698
- roadmapId: z16.string().uuid().describe("The UUID of the roadmap item to attach the prototype to"),
3699
- folderPath: z16.string().describe("Absolute path to the local mockup folder"),
3700
- entryPoint: z16.string().default("index.html").describe("Main HTML file to open (defaults to index.html)")
3701
- }
3922
+ inputSchema: publishPrototypeInput
3702
3923
  }, async ({
3703
3924
  roadmapId,
3704
3925
  folderPath,
@@ -3857,9 +4078,7 @@ Expires: ${expiryDate}`
3857
4078
  function registerListPrototypes(server) {
3858
4079
  server.registerTool("list_prototypes", {
3859
4080
  description: "List published prototypes for a roadmap item. Returns prototype IDs needed for creating feedback sessions.",
3860
- inputSchema: {
3861
- roadmapId: z16.string().uuid().describe("The UUID of the roadmap item")
3862
- }
4081
+ inputSchema: listPrototypesInput
3863
4082
  }, async ({ roadmapId }) => {
3864
4083
  const client2 = getApiClient();
3865
4084
  const prototypes = await client2.listPrototypes(roadmapId);
@@ -3902,16 +4121,10 @@ ${lines.join(`
3902
4121
  };
3903
4122
  });
3904
4123
  }
3905
- var dateGranularitySchema2 = z16.enum(["day", "month", "quarter", "half-year", "year"]);
3906
4124
  function registerSearchInitiatives(server) {
3907
4125
  server.registerTool("search_initiatives", {
3908
4126
  description: "Search for initiatives by title or filter by horizon. Returns a list of matching initiatives with item counts.",
3909
- inputSchema: {
3910
- query: z16.string().optional().describe("Search query to match against title or description"),
3911
- horizon: horizonSchema.optional().describe("Filter by planning horizon"),
3912
- limit: z16.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
3913
- offset: z16.number().int().min(0).optional().describe("Number of items to skip (default 0)")
3914
- }
4127
+ inputSchema: searchInitiativesInput
3915
4128
  }, async ({
3916
4129
  query,
3917
4130
  horizon,
@@ -3959,9 +4172,7 @@ function registerSearchInitiatives(server) {
3959
4172
  function registerGetInitiative(server) {
3960
4173
  server.registerTool("get_initiative", {
3961
4174
  description: "Get full details of an initiative including all linked roadmap items.",
3962
- inputSchema: {
3963
- id: z16.string().describe("The UUID of the initiative")
3964
- }
4175
+ inputSchema: getInitiativeInput
3965
4176
  }, async ({ id }) => {
3966
4177
  const client2 = getApiClient();
3967
4178
  const result = await client2.getInitiative(id);
@@ -3984,14 +4195,7 @@ function registerGetInitiative(server) {
3984
4195
  function registerCreateInitiative(server) {
3985
4196
  server.registerTool("create_initiative", {
3986
4197
  description: "Create a new initiative. Initiatives group related roadmap items for cross-functional coordination.",
3987
- inputSchema: {
3988
- title: z16.string().describe("Title of the initiative"),
3989
- description: z16.string().optional().describe("Description of the initiative (markdown)"),
3990
- horizon: horizonSchema.optional().describe('Planning horizon (defaults to "inbox")'),
3991
- dateGranularity: dateGranularitySchema2.optional().describe("Target date granularity: day, month, quarter, half-year, or year"),
3992
- dateValue: z16.string().optional().describe('Target date value matching granularity (e.g., "2024-Q1", "2024-03")'),
3993
- targetDate: z16.string().optional().describe("Target date in YYYY-MM-DD format")
3994
- }
4198
+ inputSchema: createInitiativeInput
3995
4199
  }, async ({
3996
4200
  title,
3997
4201
  description,
@@ -4033,16 +4237,7 @@ function registerCreateInitiative(server) {
4033
4237
  function registerUpdateInitiative(server) {
4034
4238
  server.registerTool("update_initiative", {
4035
4239
  description: "Update an existing initiative.",
4036
- inputSchema: {
4037
- id: z16.string().describe("The UUID of the initiative to update"),
4038
- title: z16.string().optional().describe("New title"),
4039
- description: z16.string().nullable().optional().describe("New description (null to clear)"),
4040
- horizon: horizonSchema.optional().describe("New planning horizon"),
4041
- dateGranularity: dateGranularitySchema2.nullable().optional().describe("New target date granularity (null to clear)"),
4042
- dateValue: z16.string().nullable().optional().describe("New target date value (null to clear)"),
4043
- targetDate: z16.string().nullable().optional().describe("New target date in YYYY-MM-DD format (null to clear)"),
4044
- order: z16.number().int().min(0).optional().describe("Sort order for prioritization (lower numbers appear first)")
4045
- }
4240
+ inputSchema: updateInitiativeInput
4046
4241
  }, async ({
4047
4242
  id,
4048
4243
  title,
@@ -4095,9 +4290,7 @@ function registerUpdateInitiative(server) {
4095
4290
  function registerDeleteInitiative(server) {
4096
4291
  server.registerTool("delete_initiative", {
4097
4292
  description: "Delete an initiative. This is a soft delete that also unlinks all roadmap items from the initiative.",
4098
- inputSchema: {
4099
- id: z16.string().describe("The UUID of the initiative to delete")
4100
- }
4293
+ inputSchema: deleteInitiativeInput
4101
4294
  }, async ({ id }) => {
4102
4295
  const client2 = getApiClient();
4103
4296
  await client2.deleteInitiative(id);
@@ -4114,12 +4307,7 @@ function registerDeleteInitiative(server) {
4114
4307
  function registerReorderInitiatives(server) {
4115
4308
  server.registerTool("reorder_initiatives", {
4116
4309
  description: "Bulk reorder initiatives by setting their order values. Lower order values appear first.",
4117
- inputSchema: {
4118
- items: z16.array(z16.object({
4119
- id: z16.string().describe("The UUID of the initiative"),
4120
- order: z16.number().int().min(0).describe("The new order value (0-based)")
4121
- })).describe("Array of initiatives with their new order values")
4122
- }
4310
+ inputSchema: reorderInitiativesInput
4123
4311
  }, async ({ items }) => {
4124
4312
  const client2 = getApiClient();
4125
4313
  await client2.reorderInitiatives(items);
@@ -4136,14 +4324,7 @@ function registerReorderInitiatives(server) {
4136
4324
  function registerSearchExports(server) {
4137
4325
  server.registerTool("search_exports", {
4138
4326
  description: "Search for export records by roadmap, external system, or entity. Returns a list of matching exports with pagination.",
4139
- inputSchema: {
4140
- roadmapId: z16.string().uuid().optional().describe("Filter by roadmap item ID"),
4141
- externalSystem: z16.enum(["linear", "notion", "jira", "github"]).optional().describe("Filter by external system"),
4142
- localEntityType: z16.enum(["roadmap", "prd", "epic", "story", "design"]).optional().describe("Filter by local entity type"),
4143
- localEntityId: z16.string().uuid().optional().describe("Filter by local entity ID"),
4144
- limit: z16.number().int().min(1).max(100).optional().describe("Max items to return (default 10)"),
4145
- offset: z16.number().int().min(0).optional().describe("Number of items to skip (default 0)")
4146
- }
4327
+ inputSchema: searchExportsInput
4147
4328
  }, async ({
4148
4329
  roadmapId,
4149
4330
  externalSystem,
@@ -4178,9 +4359,7 @@ function registerSearchExports(server) {
4178
4359
  function registerGetExport(server) {
4179
4360
  server.registerTool("get_export", {
4180
4361
  description: "Get full details of a single export record by ID.",
4181
- inputSchema: {
4182
- id: z16.string().uuid().describe("The UUID of the export record")
4183
- }
4362
+ inputSchema: getExportInput
4184
4363
  }, async ({ id }) => {
4185
4364
  const client2 = getApiClient();
4186
4365
  const exportRecord = await client2.getExport(id);
@@ -4197,16 +4376,7 @@ function registerGetExport(server) {
4197
4376
  function registerCreateExport(server) {
4198
4377
  server.registerTool("create_export", {
4199
4378
  description: "Record a new export (with upsert). If an export with the same roadmap, entity, and external system already exists, it will be updated.",
4200
- inputSchema: {
4201
- roadmapId: z16.string().uuid().describe("The UUID of the roadmap item"),
4202
- localEntityType: z16.enum(["roadmap", "prd", "epic", "story", "design"]).describe("Type of local entity being exported"),
4203
- localEntityId: z16.string().uuid().describe("The UUID of the local entity"),
4204
- externalSystem: z16.enum(["linear", "notion", "jira", "github"]).describe("External system where the entity was exported"),
4205
- externalObjectType: z16.string().min(1).describe('Type of object in the external system (e.g., "issue", "page", "project")'),
4206
- externalId: z16.string().min(1).describe("ID of the object in the external system"),
4207
- externalUrl: z16.string().url().optional().describe("URL to the object in the external system"),
4208
- metadata: z16.record(z16.unknown()).optional().describe("Additional metadata about the export")
4209
- }
4379
+ inputSchema: createExportInput
4210
4380
  }, async ({
4211
4381
  roadmapId,
4212
4382
  localEntityType,
@@ -4241,11 +4411,7 @@ function registerCreateExport(server) {
4241
4411
  function registerUpdateExport(server) {
4242
4412
  server.registerTool("update_export", {
4243
4413
  description: "Update an export record. Can update the external URL or metadata.",
4244
- inputSchema: {
4245
- id: z16.string().uuid().describe("The UUID of the export record to update"),
4246
- externalUrl: z16.string().url().nullable().optional().describe("New URL to the object in the external system"),
4247
- metadata: z16.record(z16.unknown()).optional().describe("New metadata to replace existing metadata")
4248
- }
4414
+ inputSchema: updateExportInput
4249
4415
  }, async ({
4250
4416
  id,
4251
4417
  externalUrl,
@@ -4266,9 +4432,7 @@ function registerUpdateExport(server) {
4266
4432
  function registerDeleteExport(server) {
4267
4433
  server.registerTool("delete_export", {
4268
4434
  description: "Delete an export record. This is a soft delete.",
4269
- inputSchema: {
4270
- id: z16.string().uuid().describe("The UUID of the export record to delete")
4271
- }
4435
+ inputSchema: deleteExportInput
4272
4436
  }, async ({ id }) => {
4273
4437
  const client2 = getApiClient();
4274
4438
  await client2.deleteExport(id);
@@ -4302,9 +4466,7 @@ function registerListPresentations(server) {
4302
4466
  function registerGetPresentation(server) {
4303
4467
  server.registerTool("get_presentation", {
4304
4468
  description: "Get presentation with variants and slides.",
4305
- inputSchema: {
4306
- id: z16.string().describe("The UUID of the presentation")
4307
- }
4469
+ inputSchema: getPresentationInput
4308
4470
  }, async ({ id }) => {
4309
4471
  const client2 = getApiClient();
4310
4472
  const presentation2 = await client2.getPresentation(id);
@@ -4332,10 +4494,7 @@ function registerGetPresentation(server) {
4332
4494
  function registerCreatePresentation(server) {
4333
4495
  server.registerTool("create_presentation", {
4334
4496
  description: "Create a new presentation.",
4335
- inputSchema: {
4336
- title: z16.string().describe("Title of the presentation"),
4337
- description: z16.string().nullable().optional().describe("Description of the presentation")
4338
- }
4497
+ inputSchema: createPresentationInput
4339
4498
  }, async ({ title, description }) => {
4340
4499
  const client2 = getApiClient();
4341
4500
  const presentation2 = await client2.createPresentation({
@@ -4355,11 +4514,7 @@ function registerCreatePresentation(server) {
4355
4514
  function registerUpdatePresentation(server) {
4356
4515
  server.registerTool("update_presentation", {
4357
4516
  description: "Update an existing presentation.",
4358
- inputSchema: {
4359
- id: z16.string().describe("The UUID of the presentation to update"),
4360
- title: z16.string().optional().describe("New title"),
4361
- description: z16.string().nullable().optional().describe("New description")
4362
- }
4517
+ inputSchema: updatePresentationInput
4363
4518
  }, async ({
4364
4519
  id,
4365
4520
  title,
@@ -4385,9 +4540,7 @@ function registerUpdatePresentation(server) {
4385
4540
  function registerDeletePresentation(server) {
4386
4541
  server.registerTool("delete_presentation", {
4387
4542
  description: "Delete a presentation.",
4388
- inputSchema: {
4389
- id: z16.string().describe("The UUID of the presentation to delete")
4390
- }
4543
+ inputSchema: deletePresentationInput
4391
4544
  }, async ({ id }) => {
4392
4545
  const client2 = getApiClient();
4393
4546
  await client2.deletePresentation(id);
@@ -4404,12 +4557,7 @@ function registerDeletePresentation(server) {
4404
4557
  function registerReorderPresentations(server) {
4405
4558
  server.registerTool("reorder_presentations", {
4406
4559
  description: "Reorder presentations by setting their order values. Lower order values appear first.",
4407
- inputSchema: {
4408
- items: z16.array(z16.object({
4409
- id: z16.string().describe("The UUID of the presentation"),
4410
- order: z16.number().int().min(0).describe("The new order value (0-based)")
4411
- })).describe("Array of presentations with their new order values")
4412
- }
4560
+ inputSchema: reorderPresentationsInput
4413
4561
  }, async ({ items }) => {
4414
4562
  const client2 = getApiClient();
4415
4563
  await client2.reorderPresentations(items);
@@ -4426,9 +4574,7 @@ function registerReorderPresentations(server) {
4426
4574
  function registerListVariants(server) {
4427
4575
  server.registerTool("list_variants", {
4428
4576
  description: "List all variants for a presentation.",
4429
- inputSchema: {
4430
- presentationId: z16.string().describe("The UUID of the presentation")
4431
- }
4577
+ inputSchema: listVariantsInput
4432
4578
  }, async ({ presentationId }) => {
4433
4579
  const client2 = getApiClient();
4434
4580
  const result = await client2.listVariants(presentationId);
@@ -4445,10 +4591,7 @@ function registerListVariants(server) {
4445
4591
  function registerGetVariant(server) {
4446
4592
  server.registerTool("get_variant", {
4447
4593
  description: "Get variant with its slides.",
4448
- inputSchema: {
4449
- presentationId: z16.string().describe("The UUID of the presentation"),
4450
- variantId: z16.string().describe("The UUID of the variant")
4451
- }
4594
+ inputSchema: getVariantInput
4452
4595
  }, async ({ presentationId, variantId }) => {
4453
4596
  const client2 = getApiClient();
4454
4597
  const variant2 = await client2.getVariant(presentationId, variantId);
@@ -4469,11 +4612,7 @@ function registerGetVariant(server) {
4469
4612
  function registerCreateVariant(server) {
4470
4613
  server.registerTool("create_variant", {
4471
4614
  description: "Create a new variant for a presentation.",
4472
- inputSchema: {
4473
- presentationId: z16.string().describe("The UUID of the presentation"),
4474
- name: z16.string().describe("Name of the variant"),
4475
- audienceId: z16.string().nullable().optional().describe("The UUID of the target audience")
4476
- }
4615
+ inputSchema: createVariantInput
4477
4616
  }, async ({
4478
4617
  presentationId,
4479
4618
  name,
@@ -4497,12 +4636,7 @@ function registerCreateVariant(server) {
4497
4636
  function registerUpdateVariant(server) {
4498
4637
  server.registerTool("update_variant", {
4499
4638
  description: "Update an existing variant.",
4500
- inputSchema: {
4501
- presentationId: z16.string().describe("The UUID of the presentation"),
4502
- variantId: z16.string().describe("The UUID of the variant to update"),
4503
- name: z16.string().optional().describe("New name"),
4504
- audienceId: z16.string().nullable().optional().describe("New target audience UUID")
4505
- }
4639
+ inputSchema: updateVariantInput
4506
4640
  }, async ({
4507
4641
  presentationId,
4508
4642
  variantId,
@@ -4529,10 +4663,7 @@ function registerUpdateVariant(server) {
4529
4663
  function registerDeleteVariant(server) {
4530
4664
  server.registerTool("delete_variant", {
4531
4665
  description: "Delete a variant.",
4532
- inputSchema: {
4533
- presentationId: z16.string().describe("The UUID of the presentation"),
4534
- variantId: z16.string().describe("The UUID of the variant to delete")
4535
- }
4666
+ inputSchema: deleteVariantInput
4536
4667
  }, async ({ presentationId, variantId }) => {
4537
4668
  const client2 = getApiClient();
4538
4669
  await client2.deleteVariant(presentationId, variantId);
@@ -4549,13 +4680,7 @@ function registerDeleteVariant(server) {
4549
4680
  function registerReorderVariants(server) {
4550
4681
  server.registerTool("reorder_variants", {
4551
4682
  description: "Reorder variants by setting their order values. Lower order values appear first.",
4552
- inputSchema: {
4553
- presentationId: z16.string().describe("The UUID of the presentation"),
4554
- items: z16.array(z16.object({
4555
- id: z16.string().describe("The UUID of the variant"),
4556
- order: z16.number().int().min(0).describe("The new order value (0-based)")
4557
- })).describe("Array of variants with their new order values")
4558
- }
4683
+ inputSchema: reorderVariantsInput
4559
4684
  }, async ({
4560
4685
  presentationId,
4561
4686
  items
@@ -4575,10 +4700,7 @@ function registerReorderVariants(server) {
4575
4700
  function registerCloneVariant(server) {
4576
4701
  server.registerTool("clone_variant", {
4577
4702
  description: "Clone a variant with all its slides.",
4578
- inputSchema: {
4579
- presentationId: z16.string().describe("The UUID of the presentation"),
4580
- variantId: z16.string().describe("The UUID of the variant to clone")
4581
- }
4703
+ inputSchema: cloneVariantInput
4582
4704
  }, async ({ presentationId, variantId }) => {
4583
4705
  const client2 = getApiClient();
4584
4706
  const clonedVariant = await client2.cloneVariant(presentationId, variantId);
@@ -4595,10 +4717,7 @@ function registerCloneVariant(server) {
4595
4717
  function registerSetDefaultVariant(server) {
4596
4718
  server.registerTool("set_default_variant", {
4597
4719
  description: "Set a variant as the default for the presentation.",
4598
- inputSchema: {
4599
- presentationId: z16.string().describe("The UUID of the presentation"),
4600
- variantId: z16.string().describe("The UUID of the variant to set as default")
4601
- }
4720
+ inputSchema: setDefaultVariantInput
4602
4721
  }, async ({ presentationId, variantId }) => {
4603
4722
  const client2 = getApiClient();
4604
4723
  await client2.setDefaultVariant(presentationId, variantId);
@@ -4615,9 +4734,7 @@ function registerSetDefaultVariant(server) {
4615
4734
  function registerListSlides(server) {
4616
4735
  server.registerTool("list_slides", {
4617
4736
  description: "List all slides in a variant.",
4618
- inputSchema: {
4619
- variantId: z16.string().describe("The UUID of the variant")
4620
- }
4737
+ inputSchema: listSlidesInput
4621
4738
  }, async ({ variantId }) => {
4622
4739
  const client2 = getApiClient();
4623
4740
  const presentationId = await client2.getVariantPresentationId(variantId);
@@ -4645,10 +4762,7 @@ function registerListSlides(server) {
4645
4762
  function registerGetSlide(server) {
4646
4763
  server.registerTool("get_slide", {
4647
4764
  description: "Get a slide by ID.",
4648
- inputSchema: {
4649
- variantId: z16.string().describe("The UUID of the variant"),
4650
- slideId: z16.string().describe("The UUID of the slide")
4651
- }
4765
+ inputSchema: getSlideInput
4652
4766
  }, async ({ variantId, slideId }) => {
4653
4767
  const client2 = getApiClient();
4654
4768
  const presentationId = await client2.getVariantPresentationId(variantId);
@@ -4676,25 +4790,7 @@ function registerGetSlide(server) {
4676
4790
  function registerCreateSlide(server) {
4677
4791
  server.registerTool("create_slide", {
4678
4792
  description: "Create a new slide in a variant. Slide types: title (title + subtitle), section_header (title + subtitle), bullets (title + items array), two_column (title + left/right text), comparison (leftLabel + leftContent + rightLabel + rightContent), timeline (title + steps array of {title, description}), image (title + imageUrl + caption), quote (quote + attribution), code (title + code + language), thank_you (title + subtitle), mermaid (title + code with mermaid diagram syntax), paragraph (title + body with markdown text).",
4679
- inputSchema: {
4680
- variantId: z16.string().describe("The UUID of the variant"),
4681
- slideType: z16.enum([
4682
- "title",
4683
- "section_header",
4684
- "bullets",
4685
- "two_column",
4686
- "comparison",
4687
- "timeline",
4688
- "image",
4689
- "quote",
4690
- "code",
4691
- "thank_you",
4692
- "mermaid",
4693
- "paragraph"
4694
- ]).default("bullets").describe("The type of slide to create"),
4695
- content: z16.record(z16.unknown()).optional().describe('Type-specific content object. For bullets: {title, items: ["..."]}. For title: {title, subtitle}. For two_column: {title, left, right}. For quote: {quote, attribution}. For mermaid: {title, code: "graph TD; A-->B"}. For paragraph: {title, body}. Etc.'),
4696
- speakerNotes: z16.string().nullable().optional().describe("Speaker notes for the slide")
4697
- }
4793
+ inputSchema: createSlideInput
4698
4794
  }, async ({
4699
4795
  variantId,
4700
4796
  slideType,
@@ -4731,13 +4827,7 @@ function registerCreateSlide(server) {
4731
4827
  function registerUpdateSlide(server) {
4732
4828
  server.registerTool("update_slide", {
4733
4829
  description: "Update an existing slide.",
4734
- inputSchema: {
4735
- variantId: z16.string().describe("The UUID of the variant"),
4736
- slideId: z16.string().describe("The UUID of the slide to update"),
4737
- title: z16.string().optional().describe("New title"),
4738
- content: z16.object({ body: z16.string().optional() }).nullable().optional().describe("New slide content with markdown body"),
4739
- speakerNotes: z16.string().nullable().optional().describe("New speaker notes")
4740
- }
4830
+ inputSchema: updateSlideInput
4741
4831
  }, async ({
4742
4832
  variantId,
4743
4833
  slideId,
@@ -4778,10 +4868,7 @@ function registerUpdateSlide(server) {
4778
4868
  function registerDeleteSlide(server) {
4779
4869
  server.registerTool("delete_slide", {
4780
4870
  description: "Delete a slide (soft delete).",
4781
- inputSchema: {
4782
- variantId: z16.string().describe("The UUID of the variant"),
4783
- slideId: z16.string().describe("The UUID of the slide to delete")
4784
- }
4871
+ inputSchema: deleteSlideInput
4785
4872
  }, async ({ variantId, slideId }) => {
4786
4873
  const client2 = getApiClient();
4787
4874
  const presentationId = await client2.getVariantPresentationId(variantId);
@@ -4809,13 +4896,7 @@ function registerDeleteSlide(server) {
4809
4896
  function registerReorderSlides(server) {
4810
4897
  server.registerTool("reorder_slides", {
4811
4898
  description: "Reorder slides by setting their order values. Lower order values appear first.",
4812
- inputSchema: {
4813
- variantId: z16.string().describe("The UUID of the variant"),
4814
- items: z16.array(z16.object({
4815
- id: z16.string().describe("The UUID of the slide"),
4816
- order: z16.number().int().min(0).describe("The new order value (0-based)")
4817
- })).describe("Array of slides with their new order values")
4818
- }
4899
+ inputSchema: reorderSlidesInput
4819
4900
  }, async ({
4820
4901
  variantId,
4821
4902
  items
@@ -4846,11 +4927,7 @@ function registerReorderSlides(server) {
4846
4927
  function registerUploadSlideImage(server) {
4847
4928
  server.registerTool("upload_slide_image", {
4848
4929
  description: 'Upload an image to a slide. Gets a presigned URL and returns a curl command to execute for the upload, then updates the slide content with the image URL. The slide must be of type "image".',
4849
- inputSchema: {
4850
- variantId: z16.string().describe("The UUID of the variant"),
4851
- slideId: z16.string().describe("The UUID of the slide to add the image to"),
4852
- filePath: z16.string().describe("Absolute path to the image file on disk")
4853
- }
4930
+ inputSchema: uploadSlideImageInput
4854
4931
  }, async ({
4855
4932
  variantId,
4856
4933
  slideId,
@@ -4922,11 +4999,7 @@ function registerUploadSlideImage(server) {
4922
4999
  function registerCreateFeedbackSession(server) {
4923
5000
  server.registerTool("create_feedback_session", {
4924
5001
  description: "Create a feedback session for a prototype and get a shareable review link. Reviewers who open the link can optionally enter their name before leaving pin-based feedback.",
4925
- inputSchema: {
4926
- prototypeId: z16.string().uuid().describe("The UUID of the prototype to create a feedback session for"),
4927
- name: z16.string().describe('Name for this feedback session (e.g., "Round 1 Review")'),
4928
- expiresInDays: z16.number().int().min(1).max(90).optional().describe("Number of days until the session expires (default 7)")
4929
- }
5002
+ inputSchema: createFeedbackSessionInput
4930
5003
  }, async ({
4931
5004
  prototypeId,
4932
5005
  name,
@@ -4973,9 +5046,7 @@ function registerCreateFeedbackSession(server) {
4973
5046
  function registerListFeedbackSessions(server) {
4974
5047
  server.registerTool("list_feedback_sessions", {
4975
5048
  description: "List all feedback sessions for a prototype with comment counts and status.",
4976
- inputSchema: {
4977
- prototypeId: z16.string().uuid().describe("The UUID of the prototype")
4978
- }
5049
+ inputSchema: listFeedbackSessionsInput
4979
5050
  }, async ({ prototypeId }) => {
4980
5051
  const client2 = getApiClient();
4981
5052
  const sessions = await client2.listFeedbackSessions(prototypeId);
@@ -5024,11 +5095,7 @@ function formatCommentLine(c) {
5024
5095
  function registerGetFeedbackSummary(server) {
5025
5096
  server.registerTool("get_feedback_summary", {
5026
5097
  description: "Get a human-readable summary of feedback for a session, grouped by page. Shows pin numbers, reviewer names, comment text, and which element was pinned. Use this for a quick overview of feedback.",
5027
- inputSchema: {
5028
- prototypeId: z16.string().uuid().describe("The UUID of the prototype"),
5029
- sessionId: z16.string().uuid().describe("The UUID of the feedback session"),
5030
- filter: z16.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: unresolved)")
5031
- }
5098
+ inputSchema: getFeedbackSummaryInput
5032
5099
  }, async ({
5033
5100
  prototypeId,
5034
5101
  sessionId,
@@ -5067,12 +5134,7 @@ function registerGetFeedbackSummary(server) {
5067
5134
  function registerGetFeedbackDetail(server) {
5068
5135
  server.registerTool("get_feedback_detail", {
5069
5136
  description: "Get full raw pin data for feedback comments, including CSS selectors, bounding boxes, parent/sibling DOM context, and coordinates. Use this when you need exact element information to make targeted code changes.",
5070
- inputSchema: {
5071
- prototypeId: z16.string().uuid().describe("The UUID of the prototype"),
5072
- sessionId: z16.string().uuid().describe("The UUID of the feedback session"),
5073
- commentId: z16.string().uuid().optional().describe("Optional: get detail for a single comment"),
5074
- filter: z16.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: all). Ignored if commentId is provided.")
5075
- }
5137
+ inputSchema: getFeedbackDetailInput
5076
5138
  }, async ({
5077
5139
  prototypeId,
5078
5140
  sessionId,
@@ -5116,11 +5178,7 @@ function registerGetFeedbackDetail(server) {
5116
5178
  function registerResolveFeedbackComment(server) {
5117
5179
  server.registerTool("resolve_feedback_comment", {
5118
5180
  description: "Toggle the resolved status on a feedback comment. If currently unresolved, marks it as resolved. If already resolved, marks it as unresolved.",
5119
- inputSchema: {
5120
- prototypeId: z16.string().uuid().describe("The UUID of the prototype"),
5121
- sessionId: z16.string().uuid().describe("The UUID of the feedback session"),
5122
- commentId: z16.string().uuid().describe("The UUID of the comment to resolve/unresolve")
5123
- }
5181
+ inputSchema: resolveFeedbackCommentInput
5124
5182
  }, async ({
5125
5183
  prototypeId,
5126
5184
  sessionId,