@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.
@@ -317,7 +317,8 @@ function registerProgramTools(server, ctx, track) {
317
317
  {
318
318
  title: "Get Training Program",
319
319
  description: "Fetch a single Mybodyshield training program by ID, including its nested workouts and exercises.",
320
- inputSchema: { id: z.string().describe("Program ID") }
320
+ inputSchema: { id: z.string().describe("Program ID") },
321
+ annotations: { readOnlyHint: true }
321
322
  },
322
323
  async ({ id }) => {
323
324
  try {
@@ -343,7 +344,8 @@ function registerProgramTools(server, ctx, track) {
343
344
  limit: z.number().int().optional().describe("Page size (default 50)"),
344
345
  offset: z.number().int().optional().describe("Pagination offset (default 0)"),
345
346
  cursor: z.string().optional().describe("Opaque pagination cursor")
346
- }
347
+ },
348
+ annotations: { readOnlyHint: true }
347
349
  },
348
350
  async ({ memberId, status, limit, offset, cursor }) => {
349
351
  try {
@@ -537,7 +539,8 @@ function registerWorkoutTools(server, ctx, track) {
537
539
  {
538
540
  title: "List Program Workouts",
539
541
  description: "List the workouts for a program (ordered), each with its nested exercises.",
540
- inputSchema: { programId: z.string().describe("Program ID") }
542
+ inputSchema: { programId: z.string().describe("Program ID") },
543
+ annotations: { readOnlyHint: true }
541
544
  },
542
545
  async ({ programId }) => {
543
546
  try {
@@ -652,7 +655,8 @@ function registerSessionTools(server, ctx, track) {
652
655
  {
653
656
  title: "Get Workout Session",
654
657
  description: "Fetch a single workout session by ID, including its logged sets.",
655
- inputSchema: { id: z.string().describe("Workout session ID") }
658
+ inputSchema: { id: z.string().describe("Workout session ID") },
659
+ annotations: { readOnlyHint: true }
656
660
  },
657
661
  async ({ id }) => {
658
662
  try {
@@ -678,7 +682,8 @@ function registerSessionTools(server, ctx, track) {
678
682
  limit: z.number().int().optional().describe("Page size (default 50)"),
679
683
  offset: z.number().int().optional().describe("Pagination offset (default 0)"),
680
684
  cursor: z.string().optional().describe("Opaque pagination cursor")
681
- }
685
+ },
686
+ annotations: { readOnlyHint: true }
682
687
  },
683
688
  async ({ programId, status, limit, offset, cursor }) => {
684
689
  try {
@@ -804,7 +809,8 @@ function registerNutritionTools(server, ctx, track) {
804
809
  {
805
810
  title: "Get Nutrition Plan",
806
811
  description: "Fetch a single nutrition plan by ID, including its logged meals.",
807
- inputSchema: { id: z.string().describe("Nutrition plan ID") }
812
+ inputSchema: { id: z.string().describe("Nutrition plan ID") },
813
+ annotations: { readOnlyHint: true }
808
814
  },
809
815
  async ({ id }) => {
810
816
  try {
@@ -826,7 +832,8 @@ function registerNutritionTools(server, ctx, track) {
826
832
  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.",
827
833
  inputSchema: {
828
834
  memberId: z.string().optional().describe("Member (user) ID (default: calling actor)")
829
- }
835
+ },
836
+ annotations: { readOnlyHint: true }
830
837
  },
831
838
  async ({ memberId }) => {
832
839
  try {
@@ -955,7 +962,11 @@ function registerNutritionTools(server, ctx, track) {
955
962
  {
956
963
  title: "Activate Nutrition Plan",
957
964
  description: "Make a nutrition plan the active plan for its member (deactivating any other active plan).",
958
- inputSchema: { id: z.string().describe("Nutrition plan ID") }
965
+ inputSchema: { id: z.string().describe("Nutrition plan ID") },
966
+ // BOFF-3859: activation implicitly deactivates the prior active plan, so
967
+ // this is a destructive side-effect mutation despite the absence of a
968
+ // `delete` segment in the tool name.
969
+ annotations: { destructiveHint: true }
959
970
  },
960
971
  async ({ id }) => {
961
972
  try {
@@ -977,7 +988,8 @@ function registerNutritionTools(server, ctx, track) {
977
988
  inputSchema: {
978
989
  memberId: z.string().optional().describe("Member (user) ID (default: calling actor)"),
979
990
  date: z.string().optional().describe("Day to roll up (ISO-8601 DateTime; default: today)")
980
- }
991
+ },
992
+ annotations: { readOnlyHint: true }
981
993
  },
982
994
  async ({ memberId, date }) => {
983
995
  try {
@@ -1004,7 +1016,8 @@ function registerMealTools(server, ctx, track) {
1004
1016
  limit: z.number().int().optional().describe("Page size (default 50)"),
1005
1017
  offset: z.number().int().optional().describe("Pagination offset (default 0)"),
1006
1018
  cursor: z.string().optional().describe("Opaque pagination cursor")
1007
- }
1019
+ },
1020
+ annotations: { readOnlyHint: true }
1008
1021
  },
1009
1022
  async ({ planId, mealType, limit, offset, cursor }) => {
1010
1023
  try {
@@ -1078,7 +1091,11 @@ function registerMealTools(server, ctx, track) {
1078
1091
  {
1079
1092
  title: "Delete Meal Log",
1080
1093
  description: "Delete a logged meal by ID. Returns true on success.",
1081
- inputSchema: { id: z.string().describe("Meal log ID") }
1094
+ inputSchema: { id: z.string().describe("Meal log ID") },
1095
+ // BOFF-3859: hard delete of a logged meal. The name heuristic already
1096
+ // treats `*_delete` as destructive, but we declare it explicitly for the
1097
+ // audit trail.
1098
+ annotations: { destructiveHint: true }
1082
1099
  },
1083
1100
  async ({ id }) => {
1084
1101
  try {
@@ -1101,7 +1118,8 @@ function registerGoalTools(server, ctx, track) {
1101
1118
  {
1102
1119
  title: "Get Goal",
1103
1120
  description: "Fetch a single goal by ID.",
1104
- inputSchema: { id: z.string().describe("Goal ID") }
1121
+ inputSchema: { id: z.string().describe("Goal ID") },
1122
+ annotations: { readOnlyHint: true }
1105
1123
  },
1106
1124
  async ({ id }) => {
1107
1125
  try {
@@ -1127,7 +1145,8 @@ function registerGoalTools(server, ctx, track) {
1127
1145
  limit: z.number().int().optional().describe("Page size (default 50)"),
1128
1146
  offset: z.number().int().optional().describe("Pagination offset (default 0)"),
1129
1147
  cursor: z.string().optional().describe("Opaque pagination cursor")
1130
- }
1148
+ },
1149
+ annotations: { readOnlyHint: true }
1131
1150
  },
1132
1151
  async ({ memberId, status, limit, offset, cursor }) => {
1133
1152
  try {
@@ -1275,7 +1294,8 @@ function registerMetricTools(server, ctx, track) {
1275
1294
  limit: z.number().int().optional().describe("Page size (default 50)"),
1276
1295
  offset: z.number().int().optional().describe("Pagination offset (default 0)"),
1277
1296
  cursor: z.string().optional().describe("Opaque pagination cursor")
1278
- }
1297
+ },
1298
+ annotations: { readOnlyHint: true }
1279
1299
  },
1280
1300
  async ({ memberId, type, limit, offset, cursor }) => {
1281
1301
  try {
@@ -1336,7 +1356,8 @@ function registerRecoveryTools(server, ctx, track) {
1336
1356
  inputSchema: {
1337
1357
  memberId: z.string().optional().describe("Filter by member (user) ID"),
1338
1358
  metric: RecoveryMetricEnum.optional().describe("Filter by recovery metric")
1339
- }
1359
+ },
1360
+ annotations: { readOnlyHint: true }
1340
1361
  },
1341
1362
  async ({ memberId, metric }) => {
1342
1363
  try {
@@ -1393,7 +1414,8 @@ function registerCoachingTools(server, ctx, track) {
1393
1414
  inputSchema: {
1394
1415
  memberId: z.string().optional().describe("Filter by member (user) ID"),
1395
1416
  status: CoachingStatusEnum.optional().describe("Filter by coaching status")
1396
- }
1417
+ },
1418
+ annotations: { readOnlyHint: true }
1397
1419
  },
1398
1420
  async ({ memberId, status }) => {
1399
1421
  try {
@@ -1479,7 +1501,8 @@ function registerHealthTools(server, ctx, track) {
1479
1501
  {
1480
1502
  title: "Mybodyshield Health Check",
1481
1503
  description: "Public liveness/identity probe for the Mybodyshield subgraph (mybHealth). Requires no authentication.",
1482
- inputSchema: {}
1504
+ inputSchema: {},
1505
+ annotations: { readOnlyHint: true }
1483
1506
  },
1484
1507
  async () => {
1485
1508
  try {