@davidwoods/skylight-mcp 0.0.0-stage → 1.8.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 (168) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +633 -3
  3. package/THIRD_PARTY_NOTICES.md +38 -0
  4. package/dist/api/auth.d.ts +34 -0
  5. package/dist/api/auth.d.ts.map +1 -0
  6. package/dist/api/auth.js +328 -0
  7. package/dist/api/auth.js.map +1 -0
  8. package/dist/api/client.d.ts +103 -0
  9. package/dist/api/client.d.ts.map +1 -0
  10. package/dist/api/client.js +324 -0
  11. package/dist/api/client.js.map +1 -0
  12. package/dist/api/constants.d.ts +4 -0
  13. package/dist/api/constants.d.ts.map +1 -0
  14. package/dist/api/constants.js +4 -0
  15. package/dist/api/constants.js.map +1 -0
  16. package/dist/api/credential-store.d.ts +38 -0
  17. package/dist/api/credential-store.d.ts.map +1 -0
  18. package/dist/api/credential-store.js +274 -0
  19. package/dist/api/credential-store.js.map +1 -0
  20. package/dist/api/credential-types.d.ts +15 -0
  21. package/dist/api/credential-types.d.ts.map +1 -0
  22. package/dist/api/credential-types.js +11 -0
  23. package/dist/api/credential-types.js.map +1 -0
  24. package/dist/api/endpoints/calendar.d.ts +36 -0
  25. package/dist/api/endpoints/calendar.d.ts.map +1 -0
  26. package/dist/api/endpoints/calendar.js +74 -0
  27. package/dist/api/endpoints/calendar.js.map +1 -0
  28. package/dist/api/endpoints/categories.d.ts +32 -0
  29. package/dist/api/endpoints/categories.d.ts.map +1 -0
  30. package/dist/api/endpoints/categories.js +70 -0
  31. package/dist/api/endpoints/categories.js.map +1 -0
  32. package/dist/api/endpoints/chores.d.ts +58 -0
  33. package/dist/api/endpoints/chores.d.ts.map +1 -0
  34. package/dist/api/endpoints/chores.js +115 -0
  35. package/dist/api/endpoints/chores.js.map +1 -0
  36. package/dist/api/endpoints/devices.d.ts +6 -0
  37. package/dist/api/endpoints/devices.d.ts.map +1 -0
  38. package/dist/api/endpoints/devices.js +10 -0
  39. package/dist/api/endpoints/devices.js.map +1 -0
  40. package/dist/api/endpoints/frames.d.ts +6 -0
  41. package/dist/api/endpoints/frames.d.ts.map +1 -0
  42. package/dist/api/endpoints/frames.js +10 -0
  43. package/dist/api/endpoints/frames.js.map +1 -0
  44. package/dist/api/endpoints/lists.d.ts +55 -0
  45. package/dist/api/endpoints/lists.d.ts.map +1 -0
  46. package/dist/api/endpoints/lists.js +125 -0
  47. package/dist/api/endpoints/lists.js.map +1 -0
  48. package/dist/api/endpoints/meals.d.ts +154 -0
  49. package/dist/api/endpoints/meals.d.ts.map +1 -0
  50. package/dist/api/endpoints/meals.js +194 -0
  51. package/dist/api/endpoints/meals.js.map +1 -0
  52. package/dist/api/endpoints/messages.d.ts +98 -0
  53. package/dist/api/endpoints/messages.d.ts.map +1 -0
  54. package/dist/api/endpoints/messages.js +116 -0
  55. package/dist/api/endpoints/messages.js.map +1 -0
  56. package/dist/api/endpoints/misc.d.ts +27 -0
  57. package/dist/api/endpoints/misc.d.ts.map +1 -0
  58. package/dist/api/endpoints/misc.js +19 -0
  59. package/dist/api/endpoints/misc.js.map +1 -0
  60. package/dist/api/endpoints/photos.d.ts +13 -0
  61. package/dist/api/endpoints/photos.d.ts.map +1 -0
  62. package/dist/api/endpoints/photos.js +10 -0
  63. package/dist/api/endpoints/photos.js.map +1 -0
  64. package/dist/api/endpoints/rewards.d.ts +49 -0
  65. package/dist/api/endpoints/rewards.d.ts.map +1 -0
  66. package/dist/api/endpoints/rewards.js +106 -0
  67. package/dist/api/endpoints/rewards.js.map +1 -0
  68. package/dist/api/endpoints/shape.d.ts +11 -0
  69. package/dist/api/endpoints/shape.d.ts.map +1 -0
  70. package/dist/api/endpoints/shape.js +34 -0
  71. package/dist/api/endpoints/shape.js.map +1 -0
  72. package/dist/api/endpoints/taskbox.d.ts +21 -0
  73. package/dist/api/endpoints/taskbox.d.ts.map +1 -0
  74. package/dist/api/endpoints/taskbox.js +39 -0
  75. package/dist/api/endpoints/taskbox.js.map +1 -0
  76. package/dist/api/oauth.d.ts +62 -0
  77. package/dist/api/oauth.d.ts.map +1 -0
  78. package/dist/api/oauth.js +206 -0
  79. package/dist/api/oauth.js.map +1 -0
  80. package/dist/api/types.d.ts +291 -0
  81. package/dist/api/types.d.ts.map +1 -0
  82. package/dist/api/types.js +5 -0
  83. package/dist/api/types.js.map +1 -0
  84. package/dist/cli.d.ts +23 -0
  85. package/dist/cli.d.ts.map +1 -0
  86. package/dist/cli.js +106 -0
  87. package/dist/cli.js.map +1 -0
  88. package/dist/config.d.ts +27 -0
  89. package/dist/config.d.ts.map +1 -0
  90. package/dist/config.js +78 -0
  91. package/dist/config.js.map +1 -0
  92. package/dist/context.d.ts +17 -0
  93. package/dist/context.d.ts.map +1 -0
  94. package/dist/context.js +17 -0
  95. package/dist/context.js.map +1 -0
  96. package/dist/doctor.d.ts +29 -0
  97. package/dist/doctor.d.ts.map +1 -0
  98. package/dist/doctor.js +125 -0
  99. package/dist/doctor.js.map +1 -0
  100. package/dist/index.d.ts +3 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +24 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/server.d.ts +7 -0
  105. package/dist/server.d.ts.map +1 -0
  106. package/dist/server.js +29 -0
  107. package/dist/server.js.map +1 -0
  108. package/dist/tools/calendar.d.ts +8 -0
  109. package/dist/tools/calendar.d.ts.map +1 -0
  110. package/dist/tools/calendar.js +334 -0
  111. package/dist/tools/calendar.js.map +1 -0
  112. package/dist/tools/chores.d.ts +3 -0
  113. package/dist/tools/chores.d.ts.map +1 -0
  114. package/dist/tools/chores.js +321 -0
  115. package/dist/tools/chores.js.map +1 -0
  116. package/dist/tools/family.d.ts +3 -0
  117. package/dist/tools/family.d.ts.map +1 -0
  118. package/dist/tools/family.js +182 -0
  119. package/dist/tools/family.js.map +1 -0
  120. package/dist/tools/lists.d.ts +3 -0
  121. package/dist/tools/lists.d.ts.map +1 -0
  122. package/dist/tools/lists.js +481 -0
  123. package/dist/tools/lists.js.map +1 -0
  124. package/dist/tools/meals.d.ts +3 -0
  125. package/dist/tools/meals.d.ts.map +1 -0
  126. package/dist/tools/meals.js +491 -0
  127. package/dist/tools/meals.js.map +1 -0
  128. package/dist/tools/messages.d.ts +3 -0
  129. package/dist/tools/messages.d.ts.map +1 -0
  130. package/dist/tools/messages.js +183 -0
  131. package/dist/tools/messages.js.map +1 -0
  132. package/dist/tools/misc.d.ts +3 -0
  133. package/dist/tools/misc.d.ts.map +1 -0
  134. package/dist/tools/misc.js +102 -0
  135. package/dist/tools/misc.js.map +1 -0
  136. package/dist/tools/photos.d.ts +3 -0
  137. package/dist/tools/photos.d.ts.map +1 -0
  138. package/dist/tools/photos.js +42 -0
  139. package/dist/tools/photos.js.map +1 -0
  140. package/dist/tools/planning.d.ts +15 -0
  141. package/dist/tools/planning.d.ts.map +1 -0
  142. package/dist/tools/planning.js +304 -0
  143. package/dist/tools/planning.js.map +1 -0
  144. package/dist/tools/registry.d.ts +39 -0
  145. package/dist/tools/registry.d.ts.map +1 -0
  146. package/dist/tools/registry.js +143 -0
  147. package/dist/tools/registry.js.map +1 -0
  148. package/dist/tools/rewards.d.ts +3 -0
  149. package/dist/tools/rewards.d.ts.map +1 -0
  150. package/dist/tools/rewards.js +323 -0
  151. package/dist/tools/rewards.js.map +1 -0
  152. package/dist/tools/tasks.d.ts +3 -0
  153. package/dist/tools/tasks.d.ts.map +1 -0
  154. package/dist/tools/tasks.js +103 -0
  155. package/dist/tools/tasks.js.map +1 -0
  156. package/dist/utils/dates.d.ts +26 -0
  157. package/dist/utils/dates.d.ts.map +1 -0
  158. package/dist/utils/dates.js +109 -0
  159. package/dist/utils/dates.js.map +1 -0
  160. package/dist/utils/errors.d.ts +45 -0
  161. package/dist/utils/errors.d.ts.map +1 -0
  162. package/dist/utils/errors.js +102 -0
  163. package/dist/utils/errors.js.map +1 -0
  164. package/dist/utils/schedule.d.ts +86 -0
  165. package/dist/utils/schedule.d.ts.map +1 -0
  166. package/dist/utils/schedule.js +189 -0
  167. package/dist/utils/schedule.js.map +1 -0
  168. package/package.json +78 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ declare const ConfigSchema: 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<{
7
+ bearer: "bearer";
8
+ basic: "basic";
9
+ }>>;
10
+ frameId: z.ZodString;
11
+ timezone: z.ZodDefault<z.ZodString>;
12
+ }, z.core.$strip>;
13
+ export type Config = z.infer<typeof ConfigSchema>;
14
+ export interface ResolvedConfig {
15
+ token: string;
16
+ frameId: string;
17
+ timezone: string;
18
+ authType: "bearer" | "basic";
19
+ }
20
+ export declare function loadConfig(): Config;
21
+ export declare function getConfig(): Config;
22
+ /**
23
+ * Check if config uses managed OAuth login via email/password
24
+ */
25
+ export declare function usesEmailAuth(config: Config): boolean;
26
+ export {};
27
+ //# 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;AASxB,QAAA,MAAM,YAAY;;;;;;;;;;iBAchB,CAAC;AAEH,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,CAOlC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD"}
package/dist/config.js ADDED
@@ -0,0 +1,78 @@
1
+ import { z } from "zod";
2
+ import { currentContext } from "./context.js";
3
+ // Auth sources, in the order the client tries them (see SkylightClient):
4
+ // 1. SKYLIGHT_TOKEN - explicit token from the environment
5
+ // 2. Stored OAuth credential from `skylight-mcp auth login` (recommended)
6
+ // 3. SKYLIGHT_EMAIL + SKYLIGHT_PASSWORD - deprecated; puts the password in env
7
+ // Whether any source exists is checked by the client, because the stored
8
+ // credential is not visible to the config layer.
9
+ const ConfigSchema = z.object({
10
+ // Deprecated email/password auth
11
+ email: z.string().email().optional(),
12
+ password: z.string().min(1).optional(),
13
+ // Explicit token
14
+ token: z.string().min(1).optional(),
15
+ authType: z.enum(["bearer", "basic"]).default("bearer"),
16
+ // Required
17
+ frameId: z.string().min(1, "SKYLIGHT_FRAME_ID is required"),
18
+ // Optional
19
+ timezone: z.string().default("America/New_York"),
20
+ });
21
+ export function loadConfig() {
22
+ const result = ConfigSchema.safeParse({
23
+ email: process.env.SKYLIGHT_EMAIL,
24
+ password: process.env.SKYLIGHT_PASSWORD,
25
+ token: process.env.SKYLIGHT_TOKEN,
26
+ frameId: process.env.SKYLIGHT_FRAME_ID,
27
+ authType: process.env.SKYLIGHT_AUTH_TYPE || "bearer",
28
+ timezone: process.env.SKYLIGHT_TIMEZONE || "America/New_York",
29
+ });
30
+ if (!result.success) {
31
+ const errors = result.error.issues.map((e) => ` - ${e.message}`).join("\n");
32
+ console.error(`
33
+ Skylight MCP Server - Configuration Error
34
+
35
+ Missing or invalid configuration:
36
+ ${errors}
37
+
38
+ Authentication (recommended): run "skylight-mcp auth login" once. You sign in
39
+ in your own browser; your password is never given to this program.
40
+
41
+ Deprecated alternatives:
42
+ SKYLIGHT_EMAIL / SKYLIGHT_PASSWORD - stores your password in the MCP config
43
+ SKYLIGHT_TOKEN / SKYLIGHT_AUTH_TYPE - a manually captured token
44
+
45
+ Required:
46
+ SKYLIGHT_FRAME_ID - Your frame/household ID
47
+
48
+ Optional:
49
+ SKYLIGHT_TIMEZONE - Timezone for dates (default: America/New_York)
50
+
51
+ To find your frame ID:
52
+ 1. Log in to the Skylight app
53
+ 2. Use a proxy tool to capture API traffic
54
+ 3. Look for the frame ID in URLs like /api/frames/{frameId}/chores
55
+ `);
56
+ process.exit(1);
57
+ // process.exit never returns in Node; this satisfies runtimes whose types disagree.
58
+ throw new Error("Invalid configuration");
59
+ }
60
+ return result.data;
61
+ }
62
+ let cachedConfig = null;
63
+ export function getConfig() {
64
+ const context = currentContext();
65
+ if (context)
66
+ return context.config;
67
+ if (!cachedConfig) {
68
+ cachedConfig = loadConfig();
69
+ }
70
+ return cachedConfig;
71
+ }
72
+ /**
73
+ * Check if config uses managed OAuth login via email/password
74
+ */
75
+ export function usesEmailAuth(config) {
76
+ return !!(config.email && config.password);
77
+ }
78
+ //# 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;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,yEAAyE;AACzE,0DAA0D;AAC1D,0EAA0E;AAC1E,+EAA+E;AAC/E,yEAAyE;AACzE,iDAAiD;AACjD,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,iCAAiC;IACjC,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,iBAAiB;IACjB,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,CAAC;AAWH,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;;;;;;;;;;;;;;;;;;;CAmBP,CAAC,CAAC;QACC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,oFAAoF;QACpF,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IACnC,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,17 @@
1
+ /**
2
+ * Per-request context for runtimes that serve many users from one process.
3
+ *
4
+ * The local stdio server has one user, so `getClient()` / `getConfig()` fall
5
+ * back to process-wide singletons. A hosted server wraps each request in
6
+ * `runWithContext()` so the same endpoint and tool code resolves the
7
+ * credential and settings for *that* request.
8
+ */
9
+ import type { SkylightClient } from "./api/client.js";
10
+ import type { Config } from "./config.js";
11
+ export interface RequestContext {
12
+ client: SkylightClient;
13
+ config: Config;
14
+ }
15
+ export declare function runWithContext<T>(context: RequestContext, fn: () => T): T;
16
+ export declare function currentContext(): RequestContext | undefined;
17
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEzE;AAED,wBAAgB,cAAc,IAAI,cAAc,GAAG,SAAS,CAE3D"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Per-request context for runtimes that serve many users from one process.
3
+ *
4
+ * The local stdio server has one user, so `getClient()` / `getConfig()` fall
5
+ * back to process-wide singletons. A hosted server wraps each request in
6
+ * `runWithContext()` so the same endpoint and tool code resolves the
7
+ * credential and settings for *that* request.
8
+ */
9
+ import { AsyncLocalStorage } from "node:async_hooks";
10
+ const storage = new AsyncLocalStorage();
11
+ export function runWithContext(context, fn) {
12
+ return storage.run(context, fn);
13
+ }
14
+ export function currentContext() {
15
+ return storage.getStore();
16
+ }
17
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AASrD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAExD,MAAM,UAAU,cAAc,CAAI,OAAuB,EAAE,EAAW;IACpE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `skylight-mcp doctor`: checks the things that go wrong on first setup and
3
+ * says what to fix. CLI only. It never prints a token, the frame ID or any
4
+ * account data; it reports "set" / "not set" and pass/fail.
5
+ */
6
+ import { type CredentialStore } from "./api/credential-store.js";
7
+ import { type Config } from "./config.js";
8
+ export type Level = "ok" | "warn" | "fail";
9
+ export interface DoctorDeps {
10
+ env: NodeJS.ProcessEnv;
11
+ nodeVersion: string;
12
+ store: CredentialStore;
13
+ /** Calls Skylight once. Returns the frame's own timezone when it reports one. */
14
+ checkApi: () => Promise<{
15
+ timezone?: string;
16
+ }>;
17
+ out: (line: string) => void;
18
+ }
19
+ /**
20
+ * The real Skylight check. It builds its own client from the doctor's store and
21
+ * runs the call inside a request context: the process-wide client is only set up
22
+ * by the server's startup, which doctor never runs. (A version that called
23
+ * getFrame() bare failed with "client has not been initialized" on every machine.)
24
+ */
25
+ export declare function makeApiCheck(store: CredentialStore, config: Config): () => Promise<{
26
+ timezone?: string;
27
+ }>;
28
+ export declare function runDoctor(args: readonly string[], overrides?: Partial<DoctorDeps>): Promise<number>;
29
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEzF,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAGtD,MAAM,MAAM,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,eAAe,CAAC;IACvB,iFAAiF;IACjF,QAAQ,EAAE,MAAM,OAAO,CAAC;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CASzG;AAuBD,wBAAsB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsE7G"}
package/dist/doctor.js ADDED
@@ -0,0 +1,125 @@
1
+ /**
2
+ * `skylight-mcp doctor`: checks the things that go wrong on first setup and
3
+ * says what to fix. CLI only. It never prints a token, the frame ID or any
4
+ * account data; it reports "set" / "not set" and pass/fail.
5
+ */
6
+ import { SkylightClient } from "./api/client.js";
7
+ import { defaultCredentialStore } from "./api/credential-store.js";
8
+ import { getFrame } from "./api/endpoints/frames.js";
9
+ import { loadConfig } from "./config.js";
10
+ import { runWithContext } from "./context.js";
11
+ /**
12
+ * The real Skylight check. It builds its own client from the doctor's store and
13
+ * runs the call inside a request context: the process-wide client is only set up
14
+ * by the server's startup, which doctor never runs. (A version that called
15
+ * getFrame() bare failed with "client has not been initialized" on every machine.)
16
+ */
17
+ export function makeApiCheck(store, config) {
18
+ return async () => {
19
+ const client = new SkylightClient(config, store);
20
+ await client.initialize();
21
+ const frame = await runWithContext({ client, config }, () => getFrame());
22
+ const attrs = frame.attributes;
23
+ const tz = attrs.time_zone ?? attrs.timezone;
24
+ return { timezone: typeof tz === "string" ? tz : undefined };
25
+ };
26
+ }
27
+ function defaultDeps() {
28
+ const store = defaultCredentialStore();
29
+ return {
30
+ env: process.env,
31
+ nodeVersion: process.versions.node,
32
+ store,
33
+ // loadConfig() only runs when the API check does, after the frame ID has been validated.
34
+ checkApi: () => makeApiCheck(store, loadConfig())(),
35
+ out: (line) => console.log(line),
36
+ };
37
+ }
38
+ function validTimeZone(tz) {
39
+ try {
40
+ new Intl.DateTimeFormat("en-US", { timeZone: tz });
41
+ return true;
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ }
47
+ export async function runDoctor(args, overrides = {}) {
48
+ const deps = { ...defaultDeps(), ...overrides };
49
+ const offline = args.includes("--offline");
50
+ const results = [];
51
+ const add = (level, text) => {
52
+ results.push({ level, text });
53
+ };
54
+ const major = Number(deps.nodeVersion.split(".")[0]);
55
+ if (major >= 20)
56
+ add("ok", `Node ${deps.nodeVersion}`);
57
+ else
58
+ add("fail", `Node ${deps.nodeVersion} is too old. Install Node 20 or newer.`);
59
+ const frame = deps.env.SKYLIGHT_FRAME_ID?.trim();
60
+ if (!frame) {
61
+ add("fail", "SKYLIGHT_FRAME_ID is not set. It is the number in https://ourskylight.com/my-skylight/<number> after you sign in.");
62
+ }
63
+ else if (!/^\d+$/.test(frame)) {
64
+ add("warn", "SKYLIGHT_FRAME_ID is set but is not all digits. Check you copied the number from the my-skylight URL.");
65
+ }
66
+ else {
67
+ add("ok", "SKYLIGHT_FRAME_ID is set");
68
+ }
69
+ const tz = deps.env.SKYLIGHT_TIMEZONE?.trim();
70
+ if (!tz) {
71
+ add("warn", "SKYLIGHT_TIMEZONE is not set, so it defaults to America/New_York. Event times and date windows are wrong if your household is elsewhere. Set it, e.g. America/Los_Angeles.");
72
+ }
73
+ else if (!validTimeZone(tz)) {
74
+ add("fail", `SKYLIGHT_TIMEZONE "${tz}" is not a valid IANA timezone (example: America/Chicago).`);
75
+ }
76
+ else {
77
+ add("ok", `SKYLIGHT_TIMEZONE is ${tz}`);
78
+ }
79
+ let haveAuth = false;
80
+ if (deps.env.SKYLIGHT_TOKEN) {
81
+ haveAuth = true;
82
+ add("warn", "Using SKYLIGHT_TOKEN from the environment. A stored sign-in (skylight-mcp auth login) is safer and refreshes itself.");
83
+ }
84
+ else {
85
+ try {
86
+ const credential = await deps.store.read();
87
+ if (credential) {
88
+ haveAuth = true;
89
+ add("ok", `Signed in (${deps.store.name})`);
90
+ }
91
+ else {
92
+ add("fail", "Not signed in. Run: skylight-mcp auth login");
93
+ }
94
+ }
95
+ catch (error) {
96
+ add("fail", `Credential store unusable: ${error instanceof Error ? error.message : "unknown error"}. It fails closed; nothing falls back to plaintext.`);
97
+ }
98
+ }
99
+ if (offline) {
100
+ add("warn", "Skipped the Skylight API check (--offline).");
101
+ }
102
+ else if (!frame || !haveAuth) {
103
+ add("warn", "Skipped the Skylight API check until the items above are fixed.");
104
+ }
105
+ else {
106
+ try {
107
+ const info = await deps.checkApi();
108
+ add("ok", "Skylight API answered for your frame");
109
+ if (info.timezone && tz && info.timezone !== tz) {
110
+ add("warn", `Your frame reports timezone ${info.timezone} but SKYLIGHT_TIMEZONE is ${tz}.`);
111
+ }
112
+ }
113
+ catch (error) {
114
+ const msg = error instanceof Error ? error.message : "unknown error";
115
+ add("fail", `Skylight API check failed: ${msg}. This API is unofficial and can change; if you are signed in and the frame ID is right, check the project issues.`);
116
+ }
117
+ }
118
+ const mark = { ok: "[ok] ", warn: "[warn]", fail: "[FAIL]" };
119
+ for (const r of results)
120
+ deps.out(`${mark[r.level]} ${r.text}`);
121
+ const failed = results.filter((r) => r.level === "fail").length;
122
+ deps.out(failed === 0 ? "\nNo blocking problems found." : `\n${failed} problem${failed === 1 ? "" : "s"} to fix.`);
123
+ return failed === 0 ? 0 : 1;
124
+ }
125
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAwB,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAa9C;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAsB,EAAE,MAAc;IACjE,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,KAAK,CAAC,UAAqC,CAAC;QAC1D,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC;QAC7C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IAC/D,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAC;IACvC,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;QAClC,KAAK;QACL,yFAAyF;QACzF,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE;QACnD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EAAU;IAC/B,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAuB,EAAE,YAAiC,EAAE;IAC1F,MAAM,IAAI,GAAG,EAAE,GAAG,WAAW,EAAE,EAAE,GAAG,SAAS,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,OAAO,GAA0C,EAAE,CAAC;IAC1D,MAAM,GAAG,GAAG,CAAC,KAAY,EAAE,IAAY,EAAQ,EAAE;QAC/C,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,KAAK,IAAI,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;;QAClD,GAAG,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,WAAW,wCAAwC,CAAC,CAAC;IAEnF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,EAAE,mHAAmH,CAAC,CAAC;IACnI,CAAC;SAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,MAAM,EAAE,uGAAuG,CAAC,CAAC;IACvH,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,GAAG,CAAC,MAAM,EAAE,4KAA4K,CAAC,CAAC;IAC5L,CAAC;SAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,MAAM,EAAE,sBAAsB,EAAE,4DAA4D,CAAC,CAAC;IACpG,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,EAAE,wBAAwB,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC5B,QAAQ,GAAG,IAAI,CAAC;QAChB,GAAG,CAAC,MAAM,EAAE,sHAAsH,CAAC,CAAC;IACtI,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,UAAU,EAAE,CAAC;gBACf,QAAQ,GAAG,IAAI,CAAC;gBAChB,GAAG,CAAC,IAAI,EAAE,cAAc,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,MAAM,EAAE,6CAA6C,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,EAAE,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,qDAAqD,CAAC,CAAC;QAC3J,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,GAAG,CAAC,MAAM,EAAE,6CAA6C,CAAC,CAAC;IAC7D,CAAC;SAAM,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,GAAG,CAAC,MAAM,EAAE,iEAAiE,CAAC,CAAC;IACjF,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,EAAE,sCAAsC,CAAC,CAAC;YAClD,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;gBAChD,GAAG,CAAC,MAAM,EAAE,+BAA+B,IAAI,CAAC,QAAQ,6BAA6B,EAAE,GAAG,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,GAAG,CAAC,MAAM,EAAE,8BAA8B,GAAG,oHAAoH,CAAC,CAAC;QACrK,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC;IACvE,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAChE,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,KAAK,MAAM,WAAW,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;IACnH,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,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,24 @@
1
+ #!/usr/bin/env node
2
+ async function main() {
3
+ // `skylight-mcp auth ...` is a CLI, not the MCP server. Credential commands
4
+ // are never registered as MCP tools.
5
+ if (process.argv[2] === "auth") {
6
+ const { runAuthCommand } = await import("./cli.js");
7
+ process.exitCode = await runAuthCommand(process.argv.slice(3));
8
+ return;
9
+ }
10
+ if (process.argv[2] === "doctor") {
11
+ const { runDoctor } = await import("./doctor.js");
12
+ process.exitCode = await runDoctor(process.argv.slice(3));
13
+ return;
14
+ }
15
+ const { createServer } = await import("./server.js");
16
+ const server = await createServer();
17
+ await server.start();
18
+ }
19
+ main().catch((error) => {
20
+ console.error("Fatal error:", error);
21
+ process.exit(1);
22
+ });
23
+ export {};
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,KAAK,UAAU,IAAI;IACjB,4EAA4E;IAC5E,qCAAqC;IACrC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACpD,OAAO,CAAC,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,OAAO,CAAC,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACrD,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":"AAQA;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAC5C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC,CAsBD"}
package/dist/server.js ADDED
@@ -0,0 +1,29 @@
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 { registerTools } from "./tools/registry.js";
6
+ import { defaultCredentialStore } from "./api/credential-store.js";
7
+ /**
8
+ * Create and configure the MCP server
9
+ */
10
+ export async function createServer() {
11
+ // Validate configuration before starting
12
+ const config = loadConfig();
13
+ // Initialize client and get subscription status BEFORE tool registration
14
+ const client = await initializeClient(config, defaultCredentialStore());
15
+ const hasPlus = client.hasPlus();
16
+ const server = new McpServer({
17
+ name: "skylight",
18
+ version: "1.0.0",
19
+ });
20
+ registerTools(server, { hasPlus });
21
+ return {
22
+ start: async () => {
23
+ const transport = new StdioServerTransport();
24
+ await server.connect(transport);
25
+ console.error(`Skylight MCP Server started (Plus: ${hasPlus})`);
26
+ },
27
+ };
28
+ }
29
+ //# 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,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAGhC,yCAAyC;IACzC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,yEAAyE;IACzE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACxE,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,aAAa,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAEnC,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,8 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { CalendarEventResource } from "../api/types.js";
3
+ /** Profile names an event is assigned to, or [] when none or not determinable. */
4
+ export declare function eventProfileNames(event: CalendarEventResource, labelById: Map<string, string>): string[];
5
+ /** One event as text: no emails, calendar ids or UIDs, and the assigned profiles when known. */
6
+ export declare function formatEventForTool(event: CalendarEventResource, labelById: Map<string, string>): string;
7
+ export declare function registerCalendarTools(server: McpServer): void;
8
+ //# 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;AAczE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAa7D,kFAAkF;AAClF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,qBAAqB,EAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,EAAE,CAQV;AAED,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CASvG;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyT7D"}