@bmhall2/skylight-mcp 1.1.7

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 (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +265 -0
  3. package/dist/api/auth.d.ts +38 -0
  4. package/dist/api/auth.d.ts.map +1 -0
  5. package/dist/api/auth.js +62 -0
  6. package/dist/api/auth.js.map +1 -0
  7. package/dist/api/client.d.ts +84 -0
  8. package/dist/api/client.d.ts.map +1 -0
  9. package/dist/api/client.js +228 -0
  10. package/dist/api/client.js.map +1 -0
  11. package/dist/api/endpoints/calendar.d.ts +33 -0
  12. package/dist/api/endpoints/calendar.d.ts.map +1 -0
  13. package/dist/api/endpoints/calendar.js +60 -0
  14. package/dist/api/endpoints/calendar.js.map +1 -0
  15. package/dist/api/endpoints/categories.d.ts +23 -0
  16. package/dist/api/endpoints/categories.d.ts.map +1 -0
  17. package/dist/api/endpoints/categories.js +48 -0
  18. package/dist/api/endpoints/categories.js.map +1 -0
  19. package/dist/api/endpoints/chores.d.ts +50 -0
  20. package/dist/api/endpoints/chores.d.ts.map +1 -0
  21. package/dist/api/endpoints/chores.js +106 -0
  22. package/dist/api/endpoints/chores.js.map +1 -0
  23. package/dist/api/endpoints/devices.d.ts +6 -0
  24. package/dist/api/endpoints/devices.d.ts.map +1 -0
  25. package/dist/api/endpoints/devices.js +10 -0
  26. package/dist/api/endpoints/devices.js.map +1 -0
  27. package/dist/api/endpoints/frames.d.ts +6 -0
  28. package/dist/api/endpoints/frames.d.ts.map +1 -0
  29. package/dist/api/endpoints/frames.js +10 -0
  30. package/dist/api/endpoints/frames.js.map +1 -0
  31. package/dist/api/endpoints/lists.d.ts +55 -0
  32. package/dist/api/endpoints/lists.d.ts.map +1 -0
  33. package/dist/api/endpoints/lists.js +125 -0
  34. package/dist/api/endpoints/lists.js.map +1 -0
  35. package/dist/api/endpoints/meals.d.ts +102 -0
  36. package/dist/api/endpoints/meals.d.ts.map +1 -0
  37. package/dist/api/endpoints/meals.js +100 -0
  38. package/dist/api/endpoints/meals.js.map +1 -0
  39. package/dist/api/endpoints/misc.d.ts +27 -0
  40. package/dist/api/endpoints/misc.d.ts.map +1 -0
  41. package/dist/api/endpoints/misc.js +18 -0
  42. package/dist/api/endpoints/misc.js.map +1 -0
  43. package/dist/api/endpoints/photos.d.ts +13 -0
  44. package/dist/api/endpoints/photos.d.ts.map +1 -0
  45. package/dist/api/endpoints/photos.js +10 -0
  46. package/dist/api/endpoints/photos.js.map +1 -0
  47. package/dist/api/endpoints/rewards.d.ts +49 -0
  48. package/dist/api/endpoints/rewards.d.ts.map +1 -0
  49. package/dist/api/endpoints/rewards.js +105 -0
  50. package/dist/api/endpoints/rewards.js.map +1 -0
  51. package/dist/api/endpoints/taskbox.d.ts +13 -0
  52. package/dist/api/endpoints/taskbox.d.ts.map +1 -0
  53. package/dist/api/endpoints/taskbox.js +22 -0
  54. package/dist/api/endpoints/taskbox.js.map +1 -0
  55. package/dist/api/generated-types.d.ts +18967 -0
  56. package/dist/api/generated-types.d.ts.map +1 -0
  57. package/dist/api/generated-types.js +6 -0
  58. package/dist/api/generated-types.js.map +1 -0
  59. package/dist/api/types.d.ts +283 -0
  60. package/dist/api/types.d.ts.map +1 -0
  61. package/dist/api/types.js +5 -0
  62. package/dist/api/types.js.map +1 -0
  63. package/dist/config.d.ts +52 -0
  64. package/dist/config.d.ts.map +1 -0
  65. package/dist/config.js +80 -0
  66. package/dist/config.js.map +1 -0
  67. package/dist/index.d.ts +3 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +11 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/server.d.ts +7 -0
  72. package/dist/server.d.ts.map +1 -0
  73. package/dist/server.js +48 -0
  74. package/dist/server.js.map +1 -0
  75. package/dist/tools/calendar.d.ts +3 -0
  76. package/dist/tools/calendar.d.ts.map +1 -0
  77. package/dist/tools/calendar.js +297 -0
  78. package/dist/tools/calendar.js.map +1 -0
  79. package/dist/tools/chores.d.ts +3 -0
  80. package/dist/tools/chores.d.ts.map +1 -0
  81. package/dist/tools/chores.js +349 -0
  82. package/dist/tools/chores.js.map +1 -0
  83. package/dist/tools/family.d.ts +3 -0
  84. package/dist/tools/family.d.ts.map +1 -0
  85. package/dist/tools/family.js +182 -0
  86. package/dist/tools/family.js.map +1 -0
  87. package/dist/tools/lists.d.ts +3 -0
  88. package/dist/tools/lists.d.ts.map +1 -0
  89. package/dist/tools/lists.js +481 -0
  90. package/dist/tools/lists.js.map +1 -0
  91. package/dist/tools/meals.d.ts +3 -0
  92. package/dist/tools/meals.d.ts.map +1 -0
  93. package/dist/tools/meals.js +319 -0
  94. package/dist/tools/meals.js.map +1 -0
  95. package/dist/tools/misc.d.ts +3 -0
  96. package/dist/tools/misc.d.ts.map +1 -0
  97. package/dist/tools/misc.js +101 -0
  98. package/dist/tools/misc.js.map +1 -0
  99. package/dist/tools/photos.d.ts +3 -0
  100. package/dist/tools/photos.d.ts.map +1 -0
  101. package/dist/tools/photos.js +42 -0
  102. package/dist/tools/photos.js.map +1 -0
  103. package/dist/tools/rewards.d.ts +3 -0
  104. package/dist/tools/rewards.d.ts.map +1 -0
  105. package/dist/tools/rewards.js +338 -0
  106. package/dist/tools/rewards.js.map +1 -0
  107. package/dist/tools/tasks.d.ts +3 -0
  108. package/dist/tools/tasks.d.ts.map +1 -0
  109. package/dist/tools/tasks.js +68 -0
  110. package/dist/tools/tasks.js.map +1 -0
  111. package/dist/utils/dates.d.ts +26 -0
  112. package/dist/utils/dates.d.ts.map +1 -0
  113. package/dist/utils/dates.js +109 -0
  114. package/dist/utils/dates.js.map +1 -0
  115. package/dist/utils/errors.d.ts +45 -0
  116. package/dist/utils/errors.d.ts.map +1 -0
  117. package/dist/utils/errors.js +102 -0
  118. package/dist/utils/errors.js.map +1 -0
  119. package/package.json +59 -0
@@ -0,0 +1,349 @@
1
+ import { z } from "zod";
2
+ import { getChores, createChore, updateChore, deleteChore } from "../api/endpoints/chores.js";
3
+ import { findCategoryByName } from "../api/endpoints/categories.js";
4
+ import { getTodayDate, getDateOffset, parseDate, parseTime, formatDateForDisplay } from "../utils/dates.js";
5
+ import { formatErrorForMcp } from "../utils/errors.js";
6
+ import { getConfig } from "../config.js";
7
+ export function registerChoreTools(server) {
8
+ // get_chores tool
9
+ server.tool("get_chores", `Get chores from Skylight.
10
+
11
+ Use this to answer:
12
+ - "What chores do I need to do today?"
13
+ - "Show me this week's chores"
14
+ - "What's on the chore chart?"
15
+ - "What chores does [name] have?"
16
+
17
+ Returns chores with their assignees, due dates, and completion status.`, {
18
+ date: z
19
+ .string()
20
+ .optional()
21
+ .describe("Start date (YYYY-MM-DD or 'today'). Defaults to today."),
22
+ dateEnd: z
23
+ .string()
24
+ .optional()
25
+ .describe("End date (YYYY-MM-DD). Defaults to 7 days from start."),
26
+ includeLate: z
27
+ .boolean()
28
+ .optional()
29
+ .default(true)
30
+ .describe("Include overdue chores from past dates"),
31
+ assignee: z
32
+ .string()
33
+ .optional()
34
+ .describe("Filter by family member name (e.g., 'Dad', 'Mom')"),
35
+ status: z
36
+ .enum(["pending", "completed", "all"])
37
+ .optional()
38
+ .default("pending")
39
+ .describe("Filter by completion status"),
40
+ }, async ({ date, dateEnd, includeLate, assignee, status }) => {
41
+ try {
42
+ const config = getConfig();
43
+ const startDate = date ? parseDate(date, config.timezone) : getTodayDate(config.timezone);
44
+ const endDate = dateEnd ? parseDate(dateEnd, config.timezone) : getDateOffset(7, config.timezone);
45
+ const result = await getChores({
46
+ after: startDate,
47
+ before: endDate,
48
+ includeLate: includeLate ?? true,
49
+ });
50
+ let chores = result.chores;
51
+ // Filter by status
52
+ if (status !== "all") {
53
+ chores = chores.filter((chore) => chore.attributes.status === status);
54
+ }
55
+ // Build category lookup for assignee names
56
+ const categoryMap = new Map(result.categories.map((c) => [c.id, c.attributes.label ?? "Unknown"]));
57
+ // Filter by assignee if specified
58
+ if (assignee) {
59
+ const lowerAssignee = assignee.toLowerCase();
60
+ chores = chores.filter((chore) => {
61
+ const categoryId = chore.relationships?.category?.data?.id;
62
+ if (!categoryId)
63
+ return false;
64
+ const categoryName = categoryMap.get(categoryId)?.toLowerCase();
65
+ return categoryName && categoryName.includes(lowerAssignee);
66
+ });
67
+ }
68
+ if (chores.length === 0) {
69
+ return {
70
+ content: [
71
+ {
72
+ type: "text",
73
+ text: `No ${status === "all" ? "" : status + " "}chores found${assignee ? ` for ${assignee}` : ""}.`,
74
+ },
75
+ ],
76
+ };
77
+ }
78
+ // Format chores for display
79
+ const choreList = chores
80
+ .map((chore) => {
81
+ const attrs = chore.attributes;
82
+ const categoryId = chore.relationships?.category?.data?.id;
83
+ const assigneeName = categoryId ? categoryMap.get(categoryId) : null;
84
+ const parts = [
85
+ `- ${attrs.summary}`,
86
+ ` Date: ${formatDateForDisplay(attrs.start)}${attrs.start_time ? ` at ${attrs.start_time}` : ""}`,
87
+ ` Status: ${attrs.status}`,
88
+ ];
89
+ if (assigneeName) {
90
+ parts.push(` Assigned to: ${assigneeName}`);
91
+ }
92
+ if (attrs.recurring) {
93
+ parts.push(` Recurring: Yes${attrs.recurrence_set ? ` (${attrs.recurrence_set})` : ""}`);
94
+ }
95
+ if (attrs.reward_points) {
96
+ parts.push(` Reward points: ${attrs.reward_points}`);
97
+ }
98
+ return parts.join("\n");
99
+ })
100
+ .join("\n\n");
101
+ return {
102
+ content: [
103
+ {
104
+ type: "text",
105
+ text: `Chores:\n\n${choreList}`,
106
+ },
107
+ ],
108
+ };
109
+ }
110
+ catch (error) {
111
+ return {
112
+ content: [
113
+ {
114
+ type: "text",
115
+ text: formatErrorForMcp(error),
116
+ },
117
+ ],
118
+ isError: true,
119
+ };
120
+ }
121
+ });
122
+ // create_chore tool
123
+ server.tool("create_chore", `Add a new chore to Skylight.
124
+
125
+ Use this when the user wants to:
126
+ - Add a new task like "empty the dishwasher"
127
+ - Assign chores to family members
128
+ - Create recurring chores
129
+
130
+ The chore will appear on the Skylight display.`, {
131
+ summary: z.string().describe("Chore description (e.g., 'Empty the dishwasher')"),
132
+ date: z
133
+ .string()
134
+ .optional()
135
+ .describe("Due date (YYYY-MM-DD or 'today', 'tomorrow', day name). Defaults to today."),
136
+ time: z
137
+ .string()
138
+ .optional()
139
+ .describe("Due time (e.g., '10:00 AM', '14:30'). Optional."),
140
+ assignee: z
141
+ .string()
142
+ .optional()
143
+ .describe("Family member to assign (e.g., 'Dad', 'Mom', 'Kids')"),
144
+ recurring: z
145
+ .boolean()
146
+ .optional()
147
+ .default(false)
148
+ .describe("Is this a recurring chore?"),
149
+ recurrencePattern: z
150
+ .string()
151
+ .optional()
152
+ .describe("For recurring: 'daily', 'weekly', 'weekdays', or RRULE string"),
153
+ rewardPoints: z
154
+ .number()
155
+ .optional()
156
+ .describe("Reward points for completing this chore"),
157
+ }, async ({ summary, date, time, assignee, recurring, recurrencePattern, rewardPoints }) => {
158
+ try {
159
+ const config = getConfig();
160
+ const choreDate = date ? parseDate(date, config.timezone) : getTodayDate(config.timezone);
161
+ // Resolve assignee to category ID
162
+ let categoryId;
163
+ if (assignee) {
164
+ const category = await findCategoryByName(assignee);
165
+ if (category) {
166
+ categoryId = category.id;
167
+ }
168
+ else {
169
+ return {
170
+ content: [
171
+ {
172
+ type: "text",
173
+ text: `Could not find a family member named "${assignee}". Use get_family_members to see available family members.`,
174
+ },
175
+ ],
176
+ isError: true,
177
+ };
178
+ }
179
+ }
180
+ // Convert simple recurrence patterns to RRULE
181
+ let recurrenceSet;
182
+ if (recurring && recurrencePattern) {
183
+ const pattern = recurrencePattern.toLowerCase();
184
+ if (pattern === "daily") {
185
+ recurrenceSet = "RRULE:FREQ=DAILY";
186
+ }
187
+ else if (pattern === "weekly") {
188
+ recurrenceSet = "RRULE:FREQ=WEEKLY";
189
+ }
190
+ else if (pattern === "weekdays") {
191
+ recurrenceSet = "RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR";
192
+ }
193
+ else if (pattern.startsWith("RRULE:")) {
194
+ recurrenceSet = pattern;
195
+ }
196
+ else {
197
+ recurrenceSet = recurrencePattern;
198
+ }
199
+ }
200
+ const chore = await createChore({
201
+ summary,
202
+ start: choreDate,
203
+ startTime: time ? parseTime(time) : undefined,
204
+ categoryId,
205
+ recurring: recurring ?? false,
206
+ recurrenceSet,
207
+ rewardPoints,
208
+ });
209
+ const parts = [
210
+ `Created chore: "${chore.attributes.summary}"`,
211
+ `Date: ${formatDateForDisplay(chore.attributes.start)}${chore.attributes.start_time ? ` at ${chore.attributes.start_time}` : ""}`,
212
+ ];
213
+ if (assignee) {
214
+ parts.push(`Assigned to: ${assignee}`);
215
+ }
216
+ if (chore.attributes.recurring) {
217
+ parts.push(`Recurring: Yes`);
218
+ }
219
+ return {
220
+ content: [
221
+ {
222
+ type: "text",
223
+ text: parts.join("\n"),
224
+ },
225
+ ],
226
+ };
227
+ }
228
+ catch (error) {
229
+ return {
230
+ content: [
231
+ {
232
+ type: "text",
233
+ text: formatErrorForMcp(error),
234
+ },
235
+ ],
236
+ isError: true,
237
+ };
238
+ }
239
+ });
240
+ // update_chore tool
241
+ server.tool("update_chore", `Update an existing chore in Skylight.
242
+
243
+ Use this when:
244
+ - Marking a chore as complete: "Mark 'dishes' as done"
245
+ - Changing chore assignment: "Reassign the trash to Dad"
246
+ - Updating chore details: "Change the time for the homework chore"
247
+
248
+ Parameters:
249
+ - choreId (required): ID of the chore (from get_chores)
250
+ - summary: New description for the chore
251
+ - status: "completed" to mark done, "pending" to mark incomplete
252
+ - date: New due date
253
+ - time: New due time
254
+ - assignee: New family member assignment
255
+
256
+ Returns: The updated chore details.`, {
257
+ choreId: z.string().describe("ID of the chore to update"),
258
+ summary: z.string().optional().describe("New chore description"),
259
+ status: z.enum(["pending", "completed"]).optional().describe("'completed' to mark done, 'pending' to mark incomplete"),
260
+ date: z.string().optional().describe("New due date (YYYY-MM-DD or 'today', 'tomorrow')"),
261
+ time: z.string().nullable().optional().describe("New due time (e.g., '10:00 AM', or null to clear)"),
262
+ assignee: z.string().nullable().optional().describe("New family member assignment (or null to unassign)"),
263
+ rewardPoints: z.number().nullable().optional().describe("New reward points (or null to clear)"),
264
+ }, async ({ choreId, summary, status, date, time, assignee, rewardPoints }) => {
265
+ try {
266
+ const config = getConfig();
267
+ const updates = {};
268
+ if (summary !== undefined)
269
+ updates.summary = summary;
270
+ if (status !== undefined)
271
+ updates.status = status;
272
+ if (date !== undefined)
273
+ updates.start = parseDate(date, config.timezone);
274
+ if (time !== undefined)
275
+ updates.startTime = time ? parseTime(time) : null;
276
+ if (rewardPoints !== undefined)
277
+ updates.rewardPoints = rewardPoints;
278
+ // Handle assignee
279
+ if (assignee !== undefined) {
280
+ if (assignee === null) {
281
+ updates.categoryId = null;
282
+ }
283
+ else {
284
+ const category = await findCategoryByName(assignee);
285
+ if (!category) {
286
+ return {
287
+ content: [
288
+ {
289
+ type: "text",
290
+ text: `Could not find family member "${assignee}". Use get_family_members to see available members.`,
291
+ },
292
+ ],
293
+ isError: true,
294
+ };
295
+ }
296
+ updates.categoryId = category.id;
297
+ }
298
+ }
299
+ const chore = await updateChore(choreId, updates);
300
+ const statusText = status === "completed" ? " (marked complete)" : status === "pending" ? " (marked pending)" : "";
301
+ return {
302
+ content: [
303
+ {
304
+ type: "text",
305
+ text: `Updated chore: "${chore.attributes.summary}"${statusText}`,
306
+ },
307
+ ],
308
+ };
309
+ }
310
+ catch (error) {
311
+ return {
312
+ content: [{ type: "text", text: formatErrorForMcp(error) }],
313
+ isError: true,
314
+ };
315
+ }
316
+ });
317
+ // delete_chore tool
318
+ server.tool("delete_chore", `Delete a chore from Skylight.
319
+
320
+ Use this when:
321
+ - Removing an old or irrelevant chore
322
+ - Deleting a chore that was added by mistake
323
+
324
+ Parameters:
325
+ - choreId (required): ID of the chore to delete (from get_chores)
326
+
327
+ Note: This permanently removes the chore. For recurring chores, this may only delete one instance.`, {
328
+ choreId: z.string().describe("ID of the chore to delete"),
329
+ }, async ({ choreId }) => {
330
+ try {
331
+ await deleteChore(choreId);
332
+ return {
333
+ content: [
334
+ {
335
+ type: "text",
336
+ text: `Deleted chore (ID: ${choreId})`,
337
+ },
338
+ ],
339
+ };
340
+ }
341
+ catch (error) {
342
+ return {
343
+ content: [{ type: "text", text: formatErrorForMcp(error) }],
344
+ isError: true,
345
+ };
346
+ }
347
+ });
348
+ }
349
+ //# sourceMappingURL=chores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chores.js","sourceRoot":"","sources":["../../src/tools/chores.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerFamilyTools(server: McpServer): void;
3
+ //# sourceMappingURL=family.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family.d.ts","sourceRoot":"","sources":["../../src/tools/family.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6M3D"}
@@ -0,0 +1,182 @@
1
+ import { getFamilyMembers, getCategories } from "../api/endpoints/categories.js";
2
+ import { getFrame } from "../api/endpoints/frames.js";
3
+ import { getDevices } from "../api/endpoints/devices.js";
4
+ import { formatErrorForMcp } from "../utils/errors.js";
5
+ export function registerFamilyTools(server) {
6
+ // get_family_members tool
7
+ server.tool("get_family_members", `Get family members/profiles from Skylight.
8
+
9
+ Shows who can be assigned chores and their profile details.
10
+
11
+ Use this to answer:
12
+ - "Who's in our family on Skylight?"
13
+ - "What family members are set up?"
14
+ - "Who can I assign chores to?"`, {}, async () => {
15
+ try {
16
+ const members = await getFamilyMembers();
17
+ if (members.length === 0) {
18
+ // Fall back to all categories
19
+ const categories = await getCategories();
20
+ if (categories.length === 0) {
21
+ return {
22
+ content: [
23
+ {
24
+ type: "text",
25
+ text: "No family members or categories found in Skylight.",
26
+ },
27
+ ],
28
+ };
29
+ }
30
+ const categoryList = categories
31
+ .map((cat) => {
32
+ const parts = [`- ${cat.attributes.label ?? "Unnamed"}`];
33
+ if (cat.attributes.color) {
34
+ parts.push(` Color: ${cat.attributes.color}`);
35
+ }
36
+ if (cat.attributes.selected_for_chore_chart) {
37
+ parts.push(` On chore chart: Yes`);
38
+ }
39
+ return parts.join("\n");
40
+ })
41
+ .join("\n\n");
42
+ return {
43
+ content: [
44
+ {
45
+ type: "text",
46
+ text: `Categories (no linked profiles found):\n\n${categoryList}`,
47
+ },
48
+ ],
49
+ };
50
+ }
51
+ const memberList = members
52
+ .map((member) => {
53
+ const attrs = member.attributes;
54
+ const parts = [`- ${attrs.label ?? "Unnamed"}`];
55
+ if (attrs.color) {
56
+ parts.push(` Color: ${attrs.color}`);
57
+ }
58
+ if (attrs.profile_pic_url) {
59
+ parts.push(` Has profile picture: Yes`);
60
+ }
61
+ if (attrs.selected_for_chore_chart) {
62
+ parts.push(` On chore chart: Yes`);
63
+ }
64
+ return parts.join("\n");
65
+ })
66
+ .join("\n\n");
67
+ return {
68
+ content: [
69
+ {
70
+ type: "text",
71
+ text: `Family members:\n\n${memberList}`,
72
+ },
73
+ ],
74
+ };
75
+ }
76
+ catch (error) {
77
+ return {
78
+ content: [
79
+ {
80
+ type: "text",
81
+ text: formatErrorForMcp(error),
82
+ },
83
+ ],
84
+ isError: true,
85
+ };
86
+ }
87
+ });
88
+ // get_frame_info tool
89
+ server.tool("get_frame_info", `Get Skylight household/frame information.
90
+
91
+ Useful for setup verification and debugging.
92
+
93
+ Use this to answer:
94
+ - "Show Skylight household info"
95
+ - "What's my frame ID?"`, {}, async () => {
96
+ try {
97
+ const frame = await getFrame();
98
+ const parts = [`Frame ID: ${frame.id}`, `Type: ${frame.type}`];
99
+ // Add any attributes
100
+ const attrs = frame.attributes;
101
+ if (Object.keys(attrs).length > 0) {
102
+ parts.push(`\nAttributes:`);
103
+ for (const [key, value] of Object.entries(attrs)) {
104
+ if (value !== null && value !== undefined) {
105
+ parts.push(` ${key}: ${JSON.stringify(value)}`);
106
+ }
107
+ }
108
+ }
109
+ return {
110
+ content: [
111
+ {
112
+ type: "text",
113
+ text: parts.join("\n"),
114
+ },
115
+ ],
116
+ };
117
+ }
118
+ catch (error) {
119
+ return {
120
+ content: [
121
+ {
122
+ type: "text",
123
+ text: formatErrorForMcp(error),
124
+ },
125
+ ],
126
+ isError: true,
127
+ };
128
+ }
129
+ });
130
+ // get_devices tool
131
+ server.tool("get_devices", `List Skylight devices in the household.
132
+
133
+ Use this to answer:
134
+ - "What Skylight devices do we have?"
135
+ - "How many Skylight frames are connected?"`, {}, async () => {
136
+ try {
137
+ const devices = await getDevices();
138
+ if (devices.length === 0) {
139
+ return {
140
+ content: [
141
+ {
142
+ type: "text",
143
+ text: "No Skylight devices found.",
144
+ },
145
+ ],
146
+ };
147
+ }
148
+ const deviceList = devices
149
+ .map((device) => {
150
+ const parts = [`- Device (ID: ${device.id})`];
151
+ const attrs = device.attributes;
152
+ for (const [key, value] of Object.entries(attrs)) {
153
+ if (value !== null && value !== undefined) {
154
+ parts.push(` ${key}: ${value}`);
155
+ }
156
+ }
157
+ return parts.join("\n");
158
+ })
159
+ .join("\n\n");
160
+ return {
161
+ content: [
162
+ {
163
+ type: "text",
164
+ text: `Skylight devices:\n\n${deviceList}`,
165
+ },
166
+ ],
167
+ };
168
+ }
169
+ catch (error) {
170
+ return {
171
+ content: [
172
+ {
173
+ type: "text",
174
+ text: formatErrorForMcp(error),
175
+ },
176
+ ],
177
+ isError: true,
178
+ };
179
+ }
180
+ });
181
+ }
182
+ //# sourceMappingURL=family.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family.js","sourceRoot":"","sources":["../../src/tools/family.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerListTools(server: McpServer): void;
3
+ //# sourceMappingURL=lists.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lists.d.ts","sourceRoot":"","sources":["../../src/tools/lists.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuDzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqfzD"}