@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,52 @@
1
+ import { z } from "zod";
2
+ declare const ConfigSchema: z.ZodEffects<z.ZodObject<{
3
+ email: z.ZodOptional<z.ZodString>;
4
+ password: z.ZodOptional<z.ZodString>;
5
+ token: z.ZodOptional<z.ZodString>;
6
+ authType: z.ZodDefault<z.ZodEnum<["bearer", "basic"]>>;
7
+ frameId: z.ZodString;
8
+ timezone: z.ZodDefault<z.ZodString>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ authType: "bearer" | "basic";
11
+ frameId: string;
12
+ timezone: string;
13
+ email?: string | undefined;
14
+ password?: string | undefined;
15
+ token?: string | undefined;
16
+ }, {
17
+ frameId: string;
18
+ email?: string | undefined;
19
+ password?: string | undefined;
20
+ token?: string | undefined;
21
+ authType?: "bearer" | "basic" | undefined;
22
+ timezone?: string | undefined;
23
+ }>, {
24
+ authType: "bearer" | "basic";
25
+ frameId: string;
26
+ timezone: string;
27
+ email?: string | undefined;
28
+ password?: string | undefined;
29
+ token?: string | undefined;
30
+ }, {
31
+ frameId: string;
32
+ email?: string | undefined;
33
+ password?: string | undefined;
34
+ token?: string | undefined;
35
+ authType?: "bearer" | "basic" | undefined;
36
+ timezone?: string | undefined;
37
+ }>;
38
+ export type Config = z.infer<typeof ConfigSchema>;
39
+ export interface ResolvedConfig {
40
+ token: string;
41
+ frameId: string;
42
+ timezone: string;
43
+ authType: "bearer" | "basic";
44
+ }
45
+ export declare function loadConfig(): Config;
46
+ export declare function getConfig(): Config;
47
+ /**
48
+ * Check if config uses email/password auth
49
+ */
50
+ export declare function usesEmailAuth(config: Config): boolean;
51
+ export {};
52
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0Bf,CAAC;AAEJ,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC9B;AAED,wBAAgB,UAAU,IAAI,MAAM,CA0CnC;AAID,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD"}
package/dist/config.js ADDED
@@ -0,0 +1,80 @@
1
+ import { z } from "zod";
2
+ // Config schema supports two auth methods:
3
+ // 1. Email/password (preferred) - will login and get token automatically
4
+ // 2. Token-based (legacy) - for manual token capture
5
+ const ConfigSchema = z
6
+ .object({
7
+ // Email/password auth (preferred)
8
+ email: z.string().email().optional(),
9
+ password: z.string().min(1).optional(),
10
+ // Token-based auth (legacy)
11
+ token: z.string().min(1).optional(),
12
+ authType: z.enum(["bearer", "basic"]).default("bearer"),
13
+ // Required
14
+ frameId: z.string().min(1, "SKYLIGHT_FRAME_ID is required"),
15
+ // Optional
16
+ timezone: z.string().default("America/New_York"),
17
+ })
18
+ .refine((data) => {
19
+ // Must have either email+password OR token
20
+ const hasEmailAuth = data.email && data.password;
21
+ const hasTokenAuth = !!data.token;
22
+ return hasEmailAuth || hasTokenAuth;
23
+ }, {
24
+ message: "Either SKYLIGHT_EMAIL and SKYLIGHT_PASSWORD, or SKYLIGHT_TOKEN must be provided",
25
+ });
26
+ export function loadConfig() {
27
+ const result = ConfigSchema.safeParse({
28
+ email: process.env.SKYLIGHT_EMAIL,
29
+ password: process.env.SKYLIGHT_PASSWORD,
30
+ token: process.env.SKYLIGHT_TOKEN,
31
+ frameId: process.env.SKYLIGHT_FRAME_ID,
32
+ authType: process.env.SKYLIGHT_AUTH_TYPE || "bearer",
33
+ timezone: process.env.SKYLIGHT_TIMEZONE || "America/New_York",
34
+ });
35
+ if (!result.success) {
36
+ const errors = result.error.errors.map((e) => ` - ${e.message}`).join("\n");
37
+ console.error(`
38
+ Skylight MCP Server - Configuration Error
39
+
40
+ Missing or invalid configuration:
41
+ ${errors}
42
+
43
+ Authentication (choose one):
44
+ Option 1 - Email/Password (recommended):
45
+ SKYLIGHT_EMAIL - Your Skylight account email
46
+ SKYLIGHT_PASSWORD - Your Skylight account password
47
+
48
+ Option 2 - Manual Token:
49
+ SKYLIGHT_TOKEN - Your Skylight API token
50
+ SKYLIGHT_AUTH_TYPE - 'bearer' or 'basic' (default: bearer)
51
+
52
+ Required:
53
+ SKYLIGHT_FRAME_ID - Your frame/household ID
54
+
55
+ Optional:
56
+ SKYLIGHT_TIMEZONE - Timezone for dates (default: America/New_York)
57
+
58
+ To find your frame ID:
59
+ 1. Log in to the Skylight app
60
+ 2. Use a proxy tool to capture API traffic
61
+ 3. Look for the frame ID in URLs like /api/frames/{frameId}/chores
62
+ `);
63
+ process.exit(1);
64
+ }
65
+ return result.data;
66
+ }
67
+ let cachedConfig = null;
68
+ export function getConfig() {
69
+ if (!cachedConfig) {
70
+ cachedConfig = loadConfig();
71
+ }
72
+ return cachedConfig;
73
+ }
74
+ /**
75
+ * Check if config uses email/password auth
76
+ */
77
+ export function usesEmailAuth(config) {
78
+ return !!(config.email && config.password);
79
+ }
80
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,2CAA2C;AAC3C,yEAAyE;AACzE,qDAAqD;AACrD,MAAM,YAAY,GAAG,CAAC;KACnB,MAAM,CAAC;IACN,kCAAkC;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;IACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAEtC,4BAA4B;IAC5B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAEvD,WAAW;IACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,+BAA+B,CAAC;IAE3D,WAAW;IACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC;CACjD,CAAC;KACD,MAAM,CACL,CAAC,IAAI,EAAE,EAAE;IACP,2CAA2C;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC;IACjD,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IAClC,OAAO,YAAY,IAAI,YAAY,CAAC;AACtC,CAAC,EACD;IACE,OAAO,EAAE,iFAAiF;CAC3F,CACF,CAAC;AAWJ,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC;QACpC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;QACjC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;QACvC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;QACjC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;QACtC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,QAAQ;QACpD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,kBAAkB;KAC9D,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7E,OAAO,CAAC,KAAK,CAAC;;;;EAIhB,MAAM;;;;;;;;;;;;;;;;;;;;;CAqBP,CAAC,CAAC;QACC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC7C,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,11 @@
1
+ #!/usr/bin/env node
2
+ import { createServer } from "./server.js";
3
+ async function main() {
4
+ const server = await createServer();
5
+ await server.start();
6
+ }
7
+ main().catch((error) => {
8
+ console.error("Fatal error:", error);
9
+ process.exit(1);
10
+ });
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IACpC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Create and configure the MCP server
3
+ */
4
+ export declare function createServer(): Promise<{
5
+ start: () => Promise<void>;
6
+ }>;
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAC5C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC,CAmCD"}
package/dist/server.js ADDED
@@ -0,0 +1,48 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { loadConfig } from "./config.js";
4
+ import { initializeClient } from "./api/client.js";
5
+ import { registerCalendarTools } from "./tools/calendar.js";
6
+ import { registerChoreTools } from "./tools/chores.js";
7
+ import { registerListTools } from "./tools/lists.js";
8
+ import { registerTaskTools } from "./tools/tasks.js";
9
+ import { registerFamilyTools } from "./tools/family.js";
10
+ import { registerRewardTools } from "./tools/rewards.js";
11
+ import { registerMiscTools } from "./tools/misc.js";
12
+ import { registerMealTools } from "./tools/meals.js";
13
+ import { registerPhotoTools } from "./tools/photos.js";
14
+ /**
15
+ * Create and configure the MCP server
16
+ */
17
+ export async function createServer() {
18
+ // Validate configuration before starting
19
+ loadConfig();
20
+ // Initialize client and get subscription status BEFORE tool registration
21
+ const client = await initializeClient();
22
+ const hasPlus = client.hasPlus();
23
+ const server = new McpServer({
24
+ name: "skylight",
25
+ version: "1.0.0",
26
+ });
27
+ // Register base tools (always available)
28
+ registerCalendarTools(server);
29
+ registerChoreTools(server);
30
+ registerListTools(server);
31
+ registerTaskTools(server);
32
+ registerFamilyTools(server);
33
+ registerMiscTools(server);
34
+ // Register Plus-only tools (hidden for non-Plus users)
35
+ if (hasPlus) {
36
+ registerRewardTools(server);
37
+ registerMealTools(server);
38
+ registerPhotoTools(server);
39
+ }
40
+ return {
41
+ start: async () => {
42
+ const transport = new StdioServerTransport();
43
+ await server.connect(transport);
44
+ console.error(`Skylight MCP Server started (Plus: ${hasPlus})`);
45
+ },
46
+ };
47
+ }
48
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAGhC,yCAAyC;IACzC,UAAU,EAAE,CAAC;IAEb,yEAAyE;IACzE,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAEjC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,yCAAyC;IACzC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,uDAAuD;IACvD,IAAI,OAAO,EAAE,CAAC;QACZ,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC5B,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;YAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,sCAAsC,OAAO,GAAG,CAAC,CAAC;QAClE,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerCalendarTools(server: McpServer): void;
3
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/tools/calendar.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwU7D"}
@@ -0,0 +1,297 @@
1
+ import { z } from "zod";
2
+ import { getCalendarEvents, getSourceCalendars, createCalendarEvent, updateCalendarEvent, deleteCalendarEvent, } from "../api/endpoints/calendar.js";
3
+ import { getTodayDate, parseDate, formatDateForDisplay } from "../utils/dates.js";
4
+ import { formatErrorForMcp } from "../utils/errors.js";
5
+ import { getConfig } from "../config.js";
6
+ export function registerCalendarTools(server) {
7
+ // get_calendar_events tool
8
+ server.tool("get_calendar_events", `Get calendar events from Skylight.
9
+
10
+ Use this to answer questions like:
11
+ - "What's on my calendar today?"
12
+ - "What do we have scheduled this weekend?"
13
+ - "Are there any events on Friday?"
14
+
15
+ Returns a list of events with their titles, times, and details.`, {
16
+ date: z
17
+ .string()
18
+ .optional()
19
+ .describe("Start date (YYYY-MM-DD or 'today', 'tomorrow', day name). Defaults to today."),
20
+ dateEnd: z
21
+ .string()
22
+ .optional()
23
+ .describe("End date (YYYY-MM-DD). Defaults to same as start date."),
24
+ }, async ({ date, dateEnd }) => {
25
+ try {
26
+ const config = getConfig();
27
+ const startDate = date ? parseDate(date, config.timezone) : getTodayDate(config.timezone);
28
+ const endDate = dateEnd ? parseDate(dateEnd, config.timezone) : startDate;
29
+ const { events, categories } = await getCalendarEvents({
30
+ dateMin: startDate,
31
+ dateMax: endDate,
32
+ timezone: config.timezone,
33
+ });
34
+ if (events.length === 0) {
35
+ const dateRange = startDate === endDate
36
+ ? formatDateForDisplay(startDate)
37
+ : `${formatDateForDisplay(startDate)} to ${formatDateForDisplay(endDate)}`;
38
+ return {
39
+ content: [
40
+ {
41
+ type: "text",
42
+ text: `No calendar events found for ${dateRange}.`,
43
+ },
44
+ ],
45
+ };
46
+ }
47
+ // Build category lookup for assignee names
48
+ const categoryMap = new Map(categories.map((c) => [c.id, c.attributes.label ?? "Unknown"]));
49
+ // Format events for display
50
+ const eventList = events
51
+ .map((event) => {
52
+ const attrs = event.attributes;
53
+ const parts = [];
54
+ // Add all available attributes
55
+ for (const [key, value] of Object.entries(attrs)) {
56
+ if (value !== null && value !== undefined) {
57
+ parts.push(` ${key}: ${value}`);
58
+ }
59
+ }
60
+ // Resolve category assignments from relationships
61
+ const categoryIds = event.relationships?.categories?.data ?? [];
62
+ if (categoryIds.length > 0) {
63
+ const names = categoryIds
64
+ .map((ref) => categoryMap.get(ref.id) ?? ref.id)
65
+ .join(", ");
66
+ parts.push(` assigned_to: ${names}`);
67
+ }
68
+ return `- Event (ID: ${event.id})\n${parts.join("\n")}`;
69
+ })
70
+ .join("\n\n");
71
+ const dateRange = startDate === endDate
72
+ ? formatDateForDisplay(startDate)
73
+ : `${formatDateForDisplay(startDate)} to ${formatDateForDisplay(endDate)}`;
74
+ return {
75
+ content: [
76
+ {
77
+ type: "text",
78
+ text: `Calendar events for ${dateRange}:\n\n${eventList}`,
79
+ },
80
+ ],
81
+ };
82
+ }
83
+ catch (error) {
84
+ return {
85
+ content: [
86
+ {
87
+ type: "text",
88
+ text: formatErrorForMcp(error),
89
+ },
90
+ ],
91
+ isError: true,
92
+ };
93
+ }
94
+ });
95
+ // get_source_calendars tool
96
+ server.tool("get_source_calendars", `Get connected calendar sources synced to Skylight.
97
+
98
+ Use this to answer:
99
+ - "Which calendars are synced to Skylight?"
100
+ - "What calendar accounts are connected?"
101
+
102
+ Returns a list of connected calendar sources (Google, iCloud, etc.).`, {}, async () => {
103
+ try {
104
+ const calendars = await getSourceCalendars();
105
+ if (calendars.length === 0) {
106
+ return {
107
+ content: [
108
+ {
109
+ type: "text",
110
+ text: "No calendar sources are connected to Skylight.",
111
+ },
112
+ ],
113
+ };
114
+ }
115
+ const calendarList = calendars
116
+ .map((cal) => {
117
+ const attrs = cal.attributes;
118
+ const parts = [`- Calendar (ID: ${cal.id})`];
119
+ for (const [key, value] of Object.entries(attrs)) {
120
+ if (value !== null && value !== undefined) {
121
+ parts.push(` ${key}: ${value}`);
122
+ }
123
+ }
124
+ return parts.join("\n");
125
+ })
126
+ .join("\n\n");
127
+ return {
128
+ content: [
129
+ {
130
+ type: "text",
131
+ text: `Connected calendar sources:\n\n${calendarList}`,
132
+ },
133
+ ],
134
+ };
135
+ }
136
+ catch (error) {
137
+ return {
138
+ content: [
139
+ {
140
+ type: "text",
141
+ text: formatErrorForMcp(error),
142
+ },
143
+ ],
144
+ isError: true,
145
+ };
146
+ }
147
+ });
148
+ // create_calendar_event tool
149
+ server.tool("create_calendar_event", `Create a new calendar event in Skylight.
150
+
151
+ Use this when:
152
+ - Scheduling a new event: "Add a dentist appointment on Friday at 2pm"
153
+ - Creating family activities: "Schedule soccer practice every Saturday at 10am"
154
+ - Adding reminders: "Put Mom's birthday on the calendar"
155
+
156
+ Parameters:
157
+ - summary (required): Event title (e.g., "Dentist Appointment")
158
+ - startsAt (required): Start time in ISO format or natural language
159
+ - endsAt (required): End time in ISO format or natural language
160
+ - allDay: Set to true for all-day events
161
+ - description: Additional notes for the event
162
+ - location: Where the event takes place
163
+ - categoryIds: Family member IDs to associate with the event
164
+
165
+ Returns: The created event details.
166
+
167
+ Related: Use get_family_members to get category IDs for assignments.`, {
168
+ summary: z.string().describe("Event title (e.g., 'Dentist Appointment')"),
169
+ startsAt: z.string().describe("Start time (ISO format like '2025-01-15T14:00:00')"),
170
+ endsAt: z.string().describe("End time (ISO format like '2025-01-15T15:00:00')"),
171
+ allDay: z.boolean().optional().default(false).describe("True for all-day events"),
172
+ description: z.string().optional().describe("Additional notes for the event"),
173
+ location: z.string().optional().describe("Event location"),
174
+ categoryIds: z.array(z.string()).optional().describe("Family member IDs to assign"),
175
+ }, async ({ summary, startsAt, endsAt, allDay, description, location, categoryIds }) => {
176
+ try {
177
+ const config = getConfig();
178
+ const event = await createCalendarEvent({
179
+ summary,
180
+ starts_at: startsAt,
181
+ ends_at: endsAt,
182
+ all_day: allDay,
183
+ description,
184
+ location,
185
+ category_ids: categoryIds,
186
+ timezone: config.timezone,
187
+ kind: "standard",
188
+ });
189
+ return {
190
+ content: [
191
+ {
192
+ type: "text",
193
+ text: `Created calendar event "${summary}" (ID: ${event.id})`,
194
+ },
195
+ ],
196
+ };
197
+ }
198
+ catch (error) {
199
+ return {
200
+ content: [{ type: "text", text: formatErrorForMcp(error) }],
201
+ isError: true,
202
+ };
203
+ }
204
+ });
205
+ // update_calendar_event tool
206
+ server.tool("update_calendar_event", `Update an existing calendar event.
207
+
208
+ Use this when:
209
+ - Changing event time: "Move the dentist appointment to 3pm"
210
+ - Updating event details: "Add location to the meeting"
211
+ - Renaming an event: "Change 'Doctor' to 'Dr. Smith checkup'"
212
+
213
+ Parameters:
214
+ - eventId (required): ID of the event to update (from get_calendar_events)
215
+ - summary: New title for the event
216
+ - startsAt: New start time (ISO format)
217
+ - endsAt: New end time (ISO format)
218
+ - description: Updated notes
219
+ - location: Updated location
220
+ - categoryIds: Updated family member assignments
221
+
222
+ Returns: The updated event details.`, {
223
+ eventId: z.string().describe("ID of the event to update"),
224
+ summary: z.string().optional().describe("New event title"),
225
+ startsAt: z.string().optional().describe("New start time (ISO format)"),
226
+ endsAt: z.string().optional().describe("New end time (ISO format)"),
227
+ allDay: z.boolean().optional().describe("Change to all-day event"),
228
+ description: z.string().optional().describe("Updated notes"),
229
+ location: z.string().optional().describe("Updated location"),
230
+ categoryIds: z.array(z.string()).optional().describe("Updated family member assignments"),
231
+ }, async ({ eventId, summary, startsAt, endsAt, allDay, description, location, categoryIds }) => {
232
+ try {
233
+ const updates = {};
234
+ if (summary !== undefined)
235
+ updates.summary = summary;
236
+ if (startsAt !== undefined)
237
+ updates.starts_at = startsAt;
238
+ if (endsAt !== undefined)
239
+ updates.ends_at = endsAt;
240
+ if (allDay !== undefined)
241
+ updates.all_day = allDay;
242
+ if (description !== undefined)
243
+ updates.description = description;
244
+ if (location !== undefined)
245
+ updates.location = location;
246
+ if (categoryIds !== undefined)
247
+ updates.category_ids = categoryIds;
248
+ const event = await updateCalendarEvent(eventId, updates);
249
+ return {
250
+ content: [
251
+ {
252
+ type: "text",
253
+ text: `Updated calendar event (ID: ${event.id})`,
254
+ },
255
+ ],
256
+ };
257
+ }
258
+ catch (error) {
259
+ return {
260
+ content: [{ type: "text", text: formatErrorForMcp(error) }],
261
+ isError: true,
262
+ };
263
+ }
264
+ });
265
+ // delete_calendar_event tool
266
+ server.tool("delete_calendar_event", `Delete a calendar event from Skylight.
267
+
268
+ Use this when:
269
+ - Canceling an event: "Remove the dentist appointment"
270
+ - Deleting old events: "Delete the meeting from yesterday"
271
+
272
+ Parameters:
273
+ - eventId (required): ID of the event to delete (from get_calendar_events)
274
+
275
+ Note: This permanently removes the event. For recurring events, this may only delete one instance.`, {
276
+ eventId: z.string().describe("ID of the event to delete"),
277
+ }, async ({ eventId }) => {
278
+ try {
279
+ await deleteCalendarEvent(eventId);
280
+ return {
281
+ content: [
282
+ {
283
+ type: "text",
284
+ text: `Deleted calendar event (ID: ${eventId})`,
285
+ },
286
+ ],
287
+ };
288
+ }
289
+ catch (error) {
290
+ return {
291
+ content: [{ type: "text", text: formatErrorForMcp(error) }],
292
+ isError: true,
293
+ };
294
+ }
295
+ });
296
+ }
297
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/tools/calendar.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 registerChoreTools(server: McpServer): void;
3
+ //# sourceMappingURL=chores.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chores.d.ts","sourceRoot":"","sources":["../../src/tools/chores.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoX1D"}