@burdenoff/mcp-libs 2026.819.1 → 2026.820.1

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.
@@ -378,7 +378,8 @@ function registerProgramTools(server, ctx, track) {
378
378
  {
379
379
  title: "Get Training Program",
380
380
  description: "Fetch a single Mybodyshield training program by ID, including its nested workouts and exercises.",
381
- inputSchema: { id: zod.z.string().describe("Program ID") }
381
+ inputSchema: { id: zod.z.string().describe("Program ID") },
382
+ annotations: { readOnlyHint: true }
382
383
  },
383
384
  async ({ id }) => {
384
385
  try {
@@ -404,7 +405,8 @@ function registerProgramTools(server, ctx, track) {
404
405
  limit: zod.z.number().int().optional().describe("Page size (default 50)"),
405
406
  offset: zod.z.number().int().optional().describe("Pagination offset (default 0)"),
406
407
  cursor: zod.z.string().optional().describe("Opaque pagination cursor")
407
- }
408
+ },
409
+ annotations: { readOnlyHint: true }
408
410
  },
409
411
  async ({ memberId, status, limit, offset, cursor }) => {
410
412
  try {
@@ -598,7 +600,8 @@ function registerWorkoutTools(server, ctx, track) {
598
600
  {
599
601
  title: "List Program Workouts",
600
602
  description: "List the workouts for a program (ordered), each with its nested exercises.",
601
- inputSchema: { programId: zod.z.string().describe("Program ID") }
603
+ inputSchema: { programId: zod.z.string().describe("Program ID") },
604
+ annotations: { readOnlyHint: true }
602
605
  },
603
606
  async ({ programId }) => {
604
607
  try {
@@ -713,7 +716,8 @@ function registerSessionTools(server, ctx, track) {
713
716
  {
714
717
  title: "Get Workout Session",
715
718
  description: "Fetch a single workout session by ID, including its logged sets.",
716
- inputSchema: { id: zod.z.string().describe("Workout session ID") }
719
+ inputSchema: { id: zod.z.string().describe("Workout session ID") },
720
+ annotations: { readOnlyHint: true }
717
721
  },
718
722
  async ({ id }) => {
719
723
  try {
@@ -739,7 +743,8 @@ function registerSessionTools(server, ctx, track) {
739
743
  limit: zod.z.number().int().optional().describe("Page size (default 50)"),
740
744
  offset: zod.z.number().int().optional().describe("Pagination offset (default 0)"),
741
745
  cursor: zod.z.string().optional().describe("Opaque pagination cursor")
742
- }
746
+ },
747
+ annotations: { readOnlyHint: true }
743
748
  },
744
749
  async ({ programId, status, limit, offset, cursor }) => {
745
750
  try {
@@ -865,7 +870,8 @@ function registerNutritionTools(server, ctx, track) {
865
870
  {
866
871
  title: "Get Nutrition Plan",
867
872
  description: "Fetch a single nutrition plan by ID, including its logged meals.",
868
- inputSchema: { id: zod.z.string().describe("Nutrition plan ID") }
873
+ inputSchema: { id: zod.z.string().describe("Nutrition plan ID") },
874
+ annotations: { readOnlyHint: true }
869
875
  },
870
876
  async ({ id }) => {
871
877
  try {
@@ -887,7 +893,8 @@ function registerNutritionTools(server, ctx, track) {
887
893
  description: "Fetch the active nutrition plan for a member (defaults to the calling actor when memberId is omitted). Returns null when there's no active plan.",
888
894
  inputSchema: {
889
895
  memberId: zod.z.string().optional().describe("Member (user) ID (default: calling actor)")
890
- }
896
+ },
897
+ annotations: { readOnlyHint: true }
891
898
  },
892
899
  async ({ memberId }) => {
893
900
  try {
@@ -1016,7 +1023,11 @@ function registerNutritionTools(server, ctx, track) {
1016
1023
  {
1017
1024
  title: "Activate Nutrition Plan",
1018
1025
  description: "Make a nutrition plan the active plan for its member (deactivating any other active plan).",
1019
- inputSchema: { id: zod.z.string().describe("Nutrition plan ID") }
1026
+ inputSchema: { id: zod.z.string().describe("Nutrition plan ID") },
1027
+ // BOFF-3859: activation implicitly deactivates the prior active plan, so
1028
+ // this is a destructive side-effect mutation despite the absence of a
1029
+ // `delete` segment in the tool name.
1030
+ annotations: { destructiveHint: true }
1020
1031
  },
1021
1032
  async ({ id }) => {
1022
1033
  try {
@@ -1038,7 +1049,8 @@ function registerNutritionTools(server, ctx, track) {
1038
1049
  inputSchema: {
1039
1050
  memberId: zod.z.string().optional().describe("Member (user) ID (default: calling actor)"),
1040
1051
  date: zod.z.string().optional().describe("Day to roll up (ISO-8601 DateTime; default: today)")
1041
- }
1052
+ },
1053
+ annotations: { readOnlyHint: true }
1042
1054
  },
1043
1055
  async ({ memberId, date }) => {
1044
1056
  try {
@@ -1065,7 +1077,8 @@ function registerMealTools(server, ctx, track) {
1065
1077
  limit: zod.z.number().int().optional().describe("Page size (default 50)"),
1066
1078
  offset: zod.z.number().int().optional().describe("Pagination offset (default 0)"),
1067
1079
  cursor: zod.z.string().optional().describe("Opaque pagination cursor")
1068
- }
1080
+ },
1081
+ annotations: { readOnlyHint: true }
1069
1082
  },
1070
1083
  async ({ planId, mealType, limit, offset, cursor }) => {
1071
1084
  try {
@@ -1139,7 +1152,11 @@ function registerMealTools(server, ctx, track) {
1139
1152
  {
1140
1153
  title: "Delete Meal Log",
1141
1154
  description: "Delete a logged meal by ID. Returns true on success.",
1142
- inputSchema: { id: zod.z.string().describe("Meal log ID") }
1155
+ inputSchema: { id: zod.z.string().describe("Meal log ID") },
1156
+ // BOFF-3859: hard delete of a logged meal. The name heuristic already
1157
+ // treats `*_delete` as destructive, but we declare it explicitly for the
1158
+ // audit trail.
1159
+ annotations: { destructiveHint: true }
1143
1160
  },
1144
1161
  async ({ id }) => {
1145
1162
  try {
@@ -1162,7 +1179,8 @@ function registerGoalTools(server, ctx, track) {
1162
1179
  {
1163
1180
  title: "Get Goal",
1164
1181
  description: "Fetch a single goal by ID.",
1165
- inputSchema: { id: zod.z.string().describe("Goal ID") }
1182
+ inputSchema: { id: zod.z.string().describe("Goal ID") },
1183
+ annotations: { readOnlyHint: true }
1166
1184
  },
1167
1185
  async ({ id }) => {
1168
1186
  try {
@@ -1188,7 +1206,8 @@ function registerGoalTools(server, ctx, track) {
1188
1206
  limit: zod.z.number().int().optional().describe("Page size (default 50)"),
1189
1207
  offset: zod.z.number().int().optional().describe("Pagination offset (default 0)"),
1190
1208
  cursor: zod.z.string().optional().describe("Opaque pagination cursor")
1191
- }
1209
+ },
1210
+ annotations: { readOnlyHint: true }
1192
1211
  },
1193
1212
  async ({ memberId, status, limit, offset, cursor }) => {
1194
1213
  try {
@@ -1336,7 +1355,8 @@ function registerMetricTools(server, ctx, track) {
1336
1355
  limit: zod.z.number().int().optional().describe("Page size (default 50)"),
1337
1356
  offset: zod.z.number().int().optional().describe("Pagination offset (default 0)"),
1338
1357
  cursor: zod.z.string().optional().describe("Opaque pagination cursor")
1339
- }
1358
+ },
1359
+ annotations: { readOnlyHint: true }
1340
1360
  },
1341
1361
  async ({ memberId, type, limit, offset, cursor }) => {
1342
1362
  try {
@@ -1397,7 +1417,8 @@ function registerRecoveryTools(server, ctx, track) {
1397
1417
  inputSchema: {
1398
1418
  memberId: zod.z.string().optional().describe("Filter by member (user) ID"),
1399
1419
  metric: RecoveryMetricEnum.optional().describe("Filter by recovery metric")
1400
- }
1420
+ },
1421
+ annotations: { readOnlyHint: true }
1401
1422
  },
1402
1423
  async ({ memberId, metric }) => {
1403
1424
  try {
@@ -1454,7 +1475,8 @@ function registerCoachingTools(server, ctx, track) {
1454
1475
  inputSchema: {
1455
1476
  memberId: zod.z.string().optional().describe("Filter by member (user) ID"),
1456
1477
  status: CoachingStatusEnum.optional().describe("Filter by coaching status")
1457
- }
1478
+ },
1479
+ annotations: { readOnlyHint: true }
1458
1480
  },
1459
1481
  async ({ memberId, status }) => {
1460
1482
  try {
@@ -1540,7 +1562,8 @@ function registerHealthTools(server, ctx, track) {
1540
1562
  {
1541
1563
  title: "Mybodyshield Health Check",
1542
1564
  description: "Public liveness/identity probe for the Mybodyshield subgraph (mybHealth). Requires no authentication.",
1543
- inputSchema: {}
1565
+ inputSchema: {},
1566
+ annotations: { readOnlyHint: true }
1544
1567
  },
1545
1568
  async () => {
1546
1569
  try {