babylitics-mcp 0.1.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 (58) hide show
  1. package/README.md +124 -0
  2. package/dist/auth/device-flow.d.ts +4 -0
  3. package/dist/auth/device-flow.d.ts.map +1 -0
  4. package/dist/auth/device-flow.js +133 -0
  5. package/dist/auth/device-flow.js.map +1 -0
  6. package/dist/auth/token-store.d.ts +11 -0
  7. package/dist/auth/token-store.d.ts.map +1 -0
  8. package/dist/auth/token-store.js +39 -0
  9. package/dist/auth/token-store.js.map +1 -0
  10. package/dist/config.d.ts +12 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +20 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/graphql/client.d.ts +9 -0
  15. package/dist/graphql/client.d.ts.map +1 -0
  16. package/dist/graphql/client.js +30 -0
  17. package/dist/graphql/client.js.map +1 -0
  18. package/dist/graphql/queries.d.ts +17 -0
  19. package/dist/graphql/queries.d.ts.map +1 -0
  20. package/dist/graphql/queries.js +309 -0
  21. package/dist/graphql/queries.js.map +1 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +47 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/tools/babies.d.ts +3 -0
  27. package/dist/tools/babies.d.ts.map +1 -0
  28. package/dist/tools/babies.js +17 -0
  29. package/dist/tools/babies.js.map +1 -0
  30. package/dist/tools/dashboard.d.ts +3 -0
  31. package/dist/tools/dashboard.d.ts.map +1 -0
  32. package/dist/tools/dashboard.js +24 -0
  33. package/dist/tools/dashboard.js.map +1 -0
  34. package/dist/tools/feedings.d.ts +4 -0
  35. package/dist/tools/feedings.d.ts.map +1 -0
  36. package/dist/tools/feedings.js +90 -0
  37. package/dist/tools/feedings.js.map +1 -0
  38. package/dist/tools/helpers.d.ts +19 -0
  39. package/dist/tools/helpers.d.ts.map +1 -0
  40. package/dist/tools/helpers.js +40 -0
  41. package/dist/tools/helpers.js.map +1 -0
  42. package/dist/tools/lengths.d.ts +4 -0
  43. package/dist/tools/lengths.d.ts.map +1 -0
  44. package/dist/tools/lengths.js +54 -0
  45. package/dist/tools/lengths.js.map +1 -0
  46. package/dist/tools/sleep.d.ts +4 -0
  47. package/dist/tools/sleep.d.ts.map +1 -0
  48. package/dist/tools/sleep.js +71 -0
  49. package/dist/tools/sleep.js.map +1 -0
  50. package/dist/tools/temperatures.d.ts +4 -0
  51. package/dist/tools/temperatures.d.ts.map +1 -0
  52. package/dist/tools/temperatures.js +54 -0
  53. package/dist/tools/temperatures.js.map +1 -0
  54. package/dist/tools/weights.d.ts +4 -0
  55. package/dist/tools/weights.d.ts.map +1 -0
  56. package/dist/tools/weights.js +70 -0
  57. package/dist/tools/weights.js.map +1 -0
  58. package/package.json +51 -0
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET_USER_SETTINGS = exports.CREATE_TEMPERATURE = exports.CREATE_LENGTH = exports.CREATE_WEIGHT = exports.CREATE_SLEEP = exports.CREATE_FEEDING = exports.GET_TEMPERATURES = exports.GET_LENGTHS = exports.WEIGHT_VS_GUIDELINE = exports.GET_WEIGHTS = exports.SLEEP_STATISTICS = exports.GET_SLEEPS = exports.FEEDING_STATISTICS = exports.GET_FEEDINGS = exports.DASHBOARD_STATS = exports.LIST_BABIES = void 0;
4
+ // Baby queries
5
+ exports.LIST_BABIES = `
6
+ query ListBabies {
7
+ babies {
8
+ edges {
9
+ node {
10
+ id
11
+ name
12
+ date_of_birth
13
+ gender
14
+ birth_weight
15
+ birth_weight_unit
16
+ birth_height
17
+ birth_height_unit
18
+ age_in_days
19
+ age_in_weeks
20
+ age_display
21
+ }
22
+ }
23
+ }
24
+ }
25
+ `;
26
+ exports.DASHBOARD_STATS = `
27
+ query DashboardStats($baby_id: ID!) {
28
+ dashboard_stats(baby_id: $baby_id) {
29
+ today {
30
+ total_feedings
31
+ total_amount
32
+ }
33
+ last_feeding {
34
+ feeding_type
35
+ fed_at
36
+ amount
37
+ food_name
38
+ }
39
+ last_sleep {
40
+ sleep_type
41
+ started_at
42
+ ended_at
43
+ duration_minutes
44
+ }
45
+ in_progress_sleep {
46
+ sleep_type
47
+ started_at
48
+ }
49
+ weekly_average {
50
+ average_daily_feedings
51
+ average_daily_amount
52
+ }
53
+ today_breakdown {
54
+ formula
55
+ breast
56
+ solid
57
+ }
58
+ }
59
+ }
60
+ `;
61
+ // Feeding queries
62
+ exports.GET_FEEDINGS = `
63
+ query GetFeedings($baby_id: ID!, $start_date: ISO8601Date, $end_date: ISO8601Date) {
64
+ feedings(baby_id: $baby_id, start_date: $start_date, end_date: $end_date) {
65
+ id
66
+ feeding_type
67
+ amount
68
+ duration_minutes
69
+ side
70
+ food_name
71
+ reaction
72
+ notes
73
+ fed_at
74
+ }
75
+ }
76
+ `;
77
+ exports.FEEDING_STATISTICS = `
78
+ query FeedingStatistics($baby_id: ID!, $start_date: ISO8601Date, $end_date: ISO8601Date) {
79
+ feeding_statistics(baby_id: $baby_id, start_date: $start_date, end_date: $end_date) {
80
+ total_feedings
81
+ average_daily_feedings
82
+ total_by_type {
83
+ feeding_type
84
+ count
85
+ total_amount
86
+ average_amount
87
+ }
88
+ }
89
+ }
90
+ `;
91
+ // Sleep queries
92
+ exports.GET_SLEEPS = `
93
+ query GetSleeps($baby_id: ID!, $start_date: ISO8601Date, $end_date: ISO8601Date) {
94
+ sleeps(baby_id: $baby_id, start_date: $start_date, end_date: $end_date) {
95
+ id
96
+ sleep_type
97
+ started_at
98
+ ended_at
99
+ duration_minutes
100
+ notes
101
+ }
102
+ }
103
+ `;
104
+ exports.SLEEP_STATISTICS = `
105
+ query SleepStatistics($baby_id: ID!) {
106
+ sleep_statistics(baby_id: $baby_id) {
107
+ total_sleep_minutes
108
+ average_daily_sleep_minutes
109
+ total_naps
110
+ total_night_sleeps
111
+ average_nap_duration
112
+ average_night_duration
113
+ }
114
+ }
115
+ `;
116
+ // Weight queries
117
+ exports.GET_WEIGHTS = `
118
+ query GetWeights($baby_id: ID!, $start_date: ISO8601Date, $end_date: ISO8601Date) {
119
+ weights(baby_id: $baby_id, start_date: $start_date, end_date: $end_date) {
120
+ id
121
+ weight_kg
122
+ measured_at
123
+ notes
124
+ }
125
+ }
126
+ `;
127
+ exports.WEIGHT_VS_GUIDELINE = `
128
+ query WeightVsGuideline($baby_id: ID!) {
129
+ weight_vs_guideline(baby_id: $baby_id) {
130
+ latest_weight
131
+ guideline_median
132
+ guideline_sd1_neg
133
+ guideline_sd1_pos
134
+ guideline_sd2_neg
135
+ guideline_sd2_pos
136
+ percentile
137
+ }
138
+ }
139
+ `;
140
+ // Length queries
141
+ exports.GET_LENGTHS = `
142
+ query GetLengths($baby_id: ID!, $start_date: ISO8601Date, $end_date: ISO8601Date) {
143
+ lengths(baby_id: $baby_id, start_date: $start_date, end_date: $end_date) {
144
+ id
145
+ length_cm
146
+ measured_at
147
+ notes
148
+ }
149
+ }
150
+ `;
151
+ // Temperature queries
152
+ exports.GET_TEMPERATURES = `
153
+ query GetTemperatures($baby_id: ID!, $start_date: ISO8601Date, $end_date: ISO8601Date) {
154
+ temperatures(baby_id: $baby_id, start_date: $start_date, end_date: $end_date) {
155
+ id
156
+ temperature_c
157
+ measured_at
158
+ notes
159
+ }
160
+ }
161
+ `;
162
+ // Mutations (individual arguments, no input wrapper)
163
+ exports.CREATE_FEEDING = `
164
+ mutation CreateFeeding(
165
+ $baby_id: ID!,
166
+ $feeding_type: FeedingTypeEnum!,
167
+ $amount: Float,
168
+ $unit: UnitEnum,
169
+ $duration_minutes: Int,
170
+ $side: SideEnum,
171
+ $food_name: String,
172
+ $reaction: ReactionEnum,
173
+ $notes: String,
174
+ $fed_at: ISO8601DateTime
175
+ ) {
176
+ create_feeding(
177
+ baby_id: $baby_id,
178
+ feeding_type: $feeding_type,
179
+ amount: $amount,
180
+ unit: $unit,
181
+ duration_minutes: $duration_minutes,
182
+ side: $side,
183
+ food_name: $food_name,
184
+ reaction: $reaction,
185
+ notes: $notes,
186
+ fed_at: $fed_at
187
+ ) {
188
+ feeding {
189
+ id
190
+ feeding_type
191
+ amount
192
+ fed_at
193
+ }
194
+ errors
195
+ }
196
+ }
197
+ `;
198
+ exports.CREATE_SLEEP = `
199
+ mutation CreateSleep(
200
+ $baby_id: ID!,
201
+ $sleep_type: SleepTypeEnum!,
202
+ $started_at: ISO8601DateTime!,
203
+ $ended_at: ISO8601DateTime,
204
+ $notes: String
205
+ ) {
206
+ create_sleep(
207
+ baby_id: $baby_id,
208
+ sleep_type: $sleep_type,
209
+ started_at: $started_at,
210
+ ended_at: $ended_at,
211
+ notes: $notes
212
+ ) {
213
+ sleep {
214
+ id
215
+ sleep_type
216
+ started_at
217
+ ended_at
218
+ }
219
+ errors
220
+ }
221
+ }
222
+ `;
223
+ exports.CREATE_WEIGHT = `
224
+ mutation CreateWeight(
225
+ $baby_id: ID!,
226
+ $weight: Float!,
227
+ $unit: WeightUnitEnum!,
228
+ $measured_at: ISO8601Date!,
229
+ $notes: String
230
+ ) {
231
+ create_weight(
232
+ baby_id: $baby_id,
233
+ weight: $weight,
234
+ unit: $unit,
235
+ measured_at: $measured_at,
236
+ notes: $notes
237
+ ) {
238
+ weight {
239
+ id
240
+ weight_kg
241
+ measured_at
242
+ }
243
+ errors
244
+ }
245
+ }
246
+ `;
247
+ exports.CREATE_LENGTH = `
248
+ mutation CreateLength(
249
+ $baby_id: ID!,
250
+ $length: Float!,
251
+ $unit: LengthUnitEnum!,
252
+ $measured_at: ISO8601Date!,
253
+ $notes: String
254
+ ) {
255
+ create_length(
256
+ baby_id: $baby_id,
257
+ length: $length,
258
+ unit: $unit,
259
+ measured_at: $measured_at,
260
+ notes: $notes
261
+ ) {
262
+ length {
263
+ id
264
+ length_cm
265
+ measured_at
266
+ }
267
+ errors
268
+ }
269
+ }
270
+ `;
271
+ exports.CREATE_TEMPERATURE = `
272
+ mutation CreateTemperature(
273
+ $baby_id: ID!,
274
+ $temperature: Float!,
275
+ $unit: TemperatureUnitEnum!,
276
+ $measured_at: ISO8601DateTime!,
277
+ $notes: String
278
+ ) {
279
+ create_temperature(
280
+ baby_id: $baby_id,
281
+ temperature: $temperature,
282
+ unit: $unit,
283
+ measured_at: $measured_at,
284
+ notes: $notes
285
+ ) {
286
+ temperature {
287
+ id
288
+ temperature_c
289
+ measured_at
290
+ }
291
+ errors
292
+ }
293
+ }
294
+ `;
295
+ // User settings
296
+ exports.GET_USER_SETTINGS = `
297
+ query GetUserSettings {
298
+ me {
299
+ user_setting {
300
+ preferred_unit
301
+ preferred_weight_unit
302
+ preferred_length_unit
303
+ preferred_temperature_unit
304
+ preferred_language
305
+ }
306
+ }
307
+ }
308
+ `;
309
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/graphql/queries.ts"],"names":[],"mappings":";;;AAAA,eAAe;AACF,QAAA,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;CAoB1B,CAAC;AAEW,QAAA,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkC9B,CAAC;AAEF,kBAAkB;AACL,QAAA,YAAY,GAAG;;;;;;;;;;;;;;CAc3B,CAAC;AAEW,QAAA,kBAAkB,GAAG;;;;;;;;;;;;;CAajC,CAAC;AAEF,gBAAgB;AACH,QAAA,UAAU,GAAG;;;;;;;;;;;CAWzB,CAAC;AAEW,QAAA,gBAAgB,GAAG;;;;;;;;;;;CAW/B,CAAC;AAEF,iBAAiB;AACJ,QAAA,WAAW,GAAG;;;;;;;;;CAS1B,CAAC;AAEW,QAAA,mBAAmB,GAAG;;;;;;;;;;;;CAYlC,CAAC;AAEF,iBAAiB;AACJ,QAAA,WAAW,GAAG;;;;;;;;;CAS1B,CAAC;AAEF,sBAAsB;AACT,QAAA,gBAAgB,GAAG;;;;;;;;;CAS/B,CAAC;AAEF,qDAAqD;AACxC,QAAA,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkC7B,CAAC;AAEW,QAAA,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwB3B,CAAC;AAEW,QAAA,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuB5B,CAAC;AAEW,QAAA,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuB5B,CAAC;AAEW,QAAA,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBjC,CAAC;AAEF,gBAAgB;AACH,QAAA,iBAAiB,GAAG;;;;;;;;;;;;CAYhC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
6
+ const device_flow_js_1 = require("./auth/device-flow.js");
7
+ const babies_js_1 = require("./tools/babies.js");
8
+ const dashboard_js_1 = require("./tools/dashboard.js");
9
+ const feedings_js_1 = require("./tools/feedings.js");
10
+ const sleep_js_1 = require("./tools/sleep.js");
11
+ const weights_js_1 = require("./tools/weights.js");
12
+ const lengths_js_1 = require("./tools/lengths.js");
13
+ const temperatures_js_1 = require("./tools/temperatures.js");
14
+ async function main() {
15
+ // Authenticate before starting the server
16
+ await (0, device_flow_js_1.authenticate)();
17
+ const server = new mcp_js_1.McpServer({
18
+ name: "babylitics",
19
+ version: "0.1.0",
20
+ });
21
+ // Register read tools (always available)
22
+ (0, babies_js_1.registerBabyTools)(server);
23
+ (0, dashboard_js_1.registerDashboardTools)(server);
24
+ (0, feedings_js_1.registerFeedingReadTools)(server);
25
+ (0, sleep_js_1.registerSleepReadTools)(server);
26
+ (0, weights_js_1.registerWeightReadTools)(server);
27
+ (0, lengths_js_1.registerLengthReadTools)(server);
28
+ (0, temperatures_js_1.registerTemperatureReadTools)(server);
29
+ // Register write tools only if scope allows
30
+ const scope = (0, device_flow_js_1.getScope)();
31
+ if (scope.includes("write")) {
32
+ (0, feedings_js_1.registerFeedingWriteTools)(server);
33
+ (0, sleep_js_1.registerSleepWriteTools)(server);
34
+ (0, weights_js_1.registerWeightWriteTools)(server);
35
+ (0, lengths_js_1.registerLengthWriteTools)(server);
36
+ (0, temperatures_js_1.registerTemperatureWriteTools)(server);
37
+ }
38
+ // Connect via stdio transport
39
+ const transport = new stdio_js_1.StdioServerTransport();
40
+ await server.connect(transport);
41
+ process.stderr.write("[babylitics-mcp] Server started.\n");
42
+ }
43
+ main().catch((error) => {
44
+ process.stderr.write(`[babylitics-mcp] Fatal error: ${error.message}\n`);
45
+ process.exit(1);
46
+ });
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,oEAAoE;AACpE,wEAAiF;AACjF,0DAA+D;AAC/D,iDAAsD;AACtD,uDAA8D;AAC9D,qDAG6B;AAC7B,+CAG0B;AAC1B,mDAG4B;AAC5B,mDAG4B;AAC5B,6DAGiC;AAEjC,KAAK,UAAU,IAAI;IACjB,0CAA0C;IAC1C,MAAM,IAAA,6BAAY,GAAE,CAAC;IAErB,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,yCAAyC;IACzC,IAAA,6BAAiB,EAAC,MAAM,CAAC,CAAC;IAC1B,IAAA,qCAAsB,EAAC,MAAM,CAAC,CAAC;IAC/B,IAAA,sCAAwB,EAAC,MAAM,CAAC,CAAC;IACjC,IAAA,iCAAsB,EAAC,MAAM,CAAC,CAAC;IAC/B,IAAA,oCAAuB,EAAC,MAAM,CAAC,CAAC;IAChC,IAAA,oCAAuB,EAAC,MAAM,CAAC,CAAC;IAChC,IAAA,8CAA4B,EAAC,MAAM,CAAC,CAAC;IAErC,4CAA4C;IAC5C,MAAM,KAAK,GAAG,IAAA,yBAAQ,GAAE,CAAC;IACzB,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,IAAA,uCAAyB,EAAC,MAAM,CAAC,CAAC;QAClC,IAAA,kCAAuB,EAAC,MAAM,CAAC,CAAC;QAChC,IAAA,qCAAwB,EAAC,MAAM,CAAC,CAAC;QACjC,IAAA,qCAAwB,EAAC,MAAM,CAAC,CAAC;QACjC,IAAA,+CAA6B,EAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,8BAA8B;IAC9B,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;AAC7D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerBabyTools(server: McpServer): void;
3
+ //# sourceMappingURL=babies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"babies.d.ts","sourceRoot":"","sources":["../../src/tools/babies.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAYzD"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerBabyTools = registerBabyTools;
4
+ const helpers_js_1 = require("./helpers.js");
5
+ function registerBabyTools(server) {
6
+ server.registerTool("list_babies", {
7
+ title: "List Babies",
8
+ description: "List all babies being tracked in the user's Babylitics account. Returns name, date of birth, age, and birth measurements.",
9
+ annotations: { readOnlyHint: true },
10
+ }, async () => {
11
+ const babies = await (0, helpers_js_1.fetchBabies)();
12
+ return {
13
+ content: [{ type: "text", text: (0, helpers_js_1.formatToolResult)(babies) }],
14
+ };
15
+ });
16
+ }
17
+ //# sourceMappingURL=babies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"babies.js","sourceRoot":"","sources":["../../src/tools/babies.ts"],"names":[],"mappings":";;AAIA,8CAYC;AAdD,6CAA6D;AAE7D,SAAgB,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE;QACjC,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,2HAA2H;QAC7H,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EAAE,KAAK,IAAI,EAAE;QACZ,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAW,GAAE,CAAC;QACnC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAA,6BAAgB,EAAC,MAAM,CAAC,EAAE,CAAC;SAC5D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerDashboardTools(server: McpServer): void;
3
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/tools/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgB9D"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerDashboardTools = registerDashboardTools;
4
+ const zod_1 = require("zod");
5
+ const client_js_1 = require("../graphql/client.js");
6
+ const queries_js_1 = require("../graphql/queries.js");
7
+ const helpers_js_1 = require("./helpers.js");
8
+ function registerDashboardTools(server) {
9
+ server.registerTool("get_dashboard", {
10
+ title: "Get Dashboard",
11
+ description: "Get today's dashboard summary for a baby, including the last feeding, last sleep, current sleep status, and weekly averages.",
12
+ inputSchema: {
13
+ baby_name: zod_1.z.string().describe("The baby's name"),
14
+ },
15
+ annotations: { readOnlyHint: true },
16
+ }, async ({ baby_name }) => {
17
+ const babyId = await (0, helpers_js_1.resolveBabyId)(baby_name);
18
+ const data = await (0, client_js_1.graphqlRequest)(queries_js_1.DASHBOARD_STATS, { baby_id: babyId });
19
+ return {
20
+ content: [{ type: "text", text: (0, helpers_js_1.formatToolResult)(data) }],
21
+ };
22
+ });
23
+ }
24
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/tools/dashboard.ts"],"names":[],"mappings":";;AAMA,wDAgBC;AAtBD,6BAAwB;AAExB,oDAAsD;AACtD,sDAAwD;AACxD,6CAA+D;AAE/D,SAAgB,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE;QACnC,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,8HAA8H;QAChI,WAAW,EAAE;YACX,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;SAClD;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACzB,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAa,EAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,IAAA,0BAAc,EAAC,4BAAe,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACxE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAA,6BAAgB,EAAC,IAAI,CAAC,EAAE,CAAC;SAC1D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerFeedingReadTools(server: McpServer): void;
3
+ export declare function registerFeedingWriteTools(server: McpServer): void;
4
+ //# sourceMappingURL=feedings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedings.d.ts","sourceRoot":"","sources":["../../src/tools/feedings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4ChE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuCjE"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerFeedingReadTools = registerFeedingReadTools;
4
+ exports.registerFeedingWriteTools = registerFeedingWriteTools;
5
+ const zod_1 = require("zod");
6
+ const client_js_1 = require("../graphql/client.js");
7
+ const queries_js_1 = require("../graphql/queries.js");
8
+ const helpers_js_1 = require("./helpers.js");
9
+ function registerFeedingReadTools(server) {
10
+ server.registerTool("get_feedings", {
11
+ title: "Get Feedings",
12
+ description: "Get feeding records for a baby. Optionally filter by date range.",
13
+ inputSchema: {
14
+ baby_name: zod_1.z.string().describe("The baby's name"),
15
+ start_date: zod_1.z.string().optional().describe("Start date (ISO 8601, e.g. 2026-03-01)"),
16
+ end_date: zod_1.z.string().optional().describe("End date (ISO 8601, e.g. 2026-03-27)"),
17
+ },
18
+ annotations: { readOnlyHint: true },
19
+ }, async ({ baby_name, start_date, end_date }) => {
20
+ const babyId = await (0, helpers_js_1.resolveBabyId)(baby_name);
21
+ const data = await (0, client_js_1.graphqlRequest)(queries_js_1.GET_FEEDINGS, {
22
+ baby_id: babyId,
23
+ start_date,
24
+ end_date,
25
+ });
26
+ return {
27
+ content: [{ type: "text", text: (0, helpers_js_1.formatToolResult)(data) }],
28
+ };
29
+ });
30
+ server.registerTool("get_feeding_stats", {
31
+ title: "Get Feeding Statistics",
32
+ description: "Get feeding statistics for a baby, including totals and averages by feeding type. Optionally filter by date range.",
33
+ inputSchema: {
34
+ baby_name: zod_1.z.string().describe("The baby's name"),
35
+ start_date: zod_1.z.string().optional().describe("Start date (ISO 8601)"),
36
+ end_date: zod_1.z.string().optional().describe("End date (ISO 8601)"),
37
+ },
38
+ annotations: { readOnlyHint: true },
39
+ }, async ({ baby_name, start_date, end_date }) => {
40
+ const babyId = await (0, helpers_js_1.resolveBabyId)(baby_name);
41
+ const data = await (0, client_js_1.graphqlRequest)(queries_js_1.FEEDING_STATISTICS, {
42
+ baby_id: babyId,
43
+ start_date,
44
+ end_date,
45
+ });
46
+ return {
47
+ content: [{ type: "text", text: (0, helpers_js_1.formatToolResult)(data) }],
48
+ };
49
+ });
50
+ }
51
+ function registerFeedingWriteTools(server) {
52
+ server.registerTool("log_feeding", {
53
+ title: "Log Feeding",
54
+ description: "Log a feeding for a baby in Babylitics. For formula, provide amount. For solids, provide food_name. For breastfeeding, optionally provide duration and side.",
55
+ inputSchema: {
56
+ baby_name: zod_1.z.string().describe("The baby's name"),
57
+ feeding_type: zod_1.z
58
+ .enum(["formula", "breast", "solid"])
59
+ .describe("Type of feeding"),
60
+ amount: zod_1.z.number().optional().describe("Amount in oz or ml"),
61
+ unit: zod_1.z.enum(["oz", "ml"]).optional().describe("Unit for amount"),
62
+ duration_minutes: zod_1.z.number().optional().describe("Duration in minutes"),
63
+ side: zod_1.z
64
+ .enum(["left", "right"])
65
+ .optional()
66
+ .describe("Breast side (for breastfeeding)"),
67
+ food_name: zod_1.z.string().optional().describe("Food name (for solids)"),
68
+ reaction: zod_1.z
69
+ .enum(["liked", "disliked", "neutral"])
70
+ .optional()
71
+ .describe("Baby's reaction (for solids)"),
72
+ notes: zod_1.z.string().optional().describe("Optional notes"),
73
+ fed_at: zod_1.z
74
+ .string()
75
+ .optional()
76
+ .describe("When the feeding occurred (ISO 8601 datetime). Defaults to now."),
77
+ },
78
+ annotations: { readOnlyHint: false },
79
+ }, async ({ baby_name, ...args }) => {
80
+ const babyId = await (0, helpers_js_1.resolveBabyId)(baby_name);
81
+ const data = await (0, client_js_1.graphqlRequest)(queries_js_1.CREATE_FEEDING, {
82
+ baby_id: babyId,
83
+ ...args,
84
+ });
85
+ return {
86
+ content: [{ type: "text", text: (0, helpers_js_1.formatToolResult)(data) }],
87
+ };
88
+ });
89
+ }
90
+ //# sourceMappingURL=feedings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedings.js","sourceRoot":"","sources":["../../src/tools/feedings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ interface BabyNode {
2
+ id: string;
3
+ name: string;
4
+ date_of_birth: string;
5
+ gender: string | null;
6
+ birth_weight: number | null;
7
+ birth_weight_unit: string | null;
8
+ birth_height: number | null;
9
+ birth_height_unit: string | null;
10
+ age_in_days: number;
11
+ age_in_weeks: number;
12
+ age_display: string;
13
+ }
14
+ export declare function fetchBabies(): Promise<BabyNode[]>;
15
+ export declare function clearBabyCache(): void;
16
+ export declare function resolveBabyId(babyName: string): Promise<string>;
17
+ export declare function formatToolResult(data: unknown): string;
18
+ export {};
19
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":"AAGA,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAUD,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAMvD;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BrE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchBabies = fetchBabies;
4
+ exports.clearBabyCache = clearBabyCache;
5
+ exports.resolveBabyId = resolveBabyId;
6
+ exports.formatToolResult = formatToolResult;
7
+ const client_js_1 = require("../graphql/client.js");
8
+ const queries_js_1 = require("../graphql/queries.js");
9
+ let cachedBabies = null;
10
+ async function fetchBabies() {
11
+ if (cachedBabies)
12
+ return cachedBabies;
13
+ const data = await (0, client_js_1.graphqlRequest)(queries_js_1.LIST_BABIES);
14
+ cachedBabies = data.babies.edges.map((edge) => edge.node);
15
+ return cachedBabies;
16
+ }
17
+ function clearBabyCache() {
18
+ cachedBabies = null;
19
+ }
20
+ async function resolveBabyId(babyName) {
21
+ const babies = await fetchBabies();
22
+ // Exact match (case-insensitive)
23
+ const exact = babies.find((b) => b.name.toLowerCase() === babyName.toLowerCase());
24
+ if (exact)
25
+ return exact.id;
26
+ // Partial match
27
+ const partial = babies.filter((b) => b.name.toLowerCase().includes(babyName.toLowerCase()));
28
+ if (partial.length === 1)
29
+ return partial[0].id;
30
+ if (partial.length > 1) {
31
+ const names = partial.map((b) => b.name).join(", ");
32
+ throw new Error(`Ambiguous baby name "${babyName}". Did you mean one of: ${names}?`);
33
+ }
34
+ const allNames = babies.map((b) => b.name).join(", ");
35
+ throw new Error(`No baby found with name "${babyName}". Available: ${allNames}`);
36
+ }
37
+ function formatToolResult(data) {
38
+ return JSON.stringify(data, null, 2);
39
+ }
40
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":";;AAyBA,kCAMC;AAED,wCAEC;AAED,sCA2BC;AAED,4CAEC;AApED,oDAAsD;AACtD,sDAAoD;AAsBpD,IAAI,YAAY,GAAsB,IAAI,CAAC;AAEpC,KAAK,UAAU,WAAW;IAC/B,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,MAAM,IAAI,GAAG,MAAM,IAAA,0BAAc,EAAiB,wBAAW,CAAC,CAAC;IAC/D,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAgB,cAAc;IAC5B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;IAEnC,iCAAiC;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CACvB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CACvD,CAAC;IACF,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,EAAE,CAAC;IAE3B,gBAAgB;IAChB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAClC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CACtD,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,IAAI,KAAK,CACb,wBAAwB,QAAQ,2BAA2B,KAAK,GAAG,CACpE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,IAAI,KAAK,CACb,4BAA4B,QAAQ,iBAAiB,QAAQ,EAAE,CAChE,CAAC;AACJ,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAa;IAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerLengthReadTools(server: McpServer): void;
3
+ export declare function registerLengthWriteTools(server: McpServer): void;
4
+ //# sourceMappingURL=lengths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lengths.d.ts","sourceRoot":"","sources":["../../src/tools/lengths.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsB/D;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsBhE"}