@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.
- package/LICENSE +21 -0
- package/README.md +265 -0
- package/dist/api/auth.d.ts +38 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +62 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/client.d.ts +84 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +228 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/endpoints/calendar.d.ts +33 -0
- package/dist/api/endpoints/calendar.d.ts.map +1 -0
- package/dist/api/endpoints/calendar.js +60 -0
- package/dist/api/endpoints/calendar.js.map +1 -0
- package/dist/api/endpoints/categories.d.ts +23 -0
- package/dist/api/endpoints/categories.d.ts.map +1 -0
- package/dist/api/endpoints/categories.js +48 -0
- package/dist/api/endpoints/categories.js.map +1 -0
- package/dist/api/endpoints/chores.d.ts +50 -0
- package/dist/api/endpoints/chores.d.ts.map +1 -0
- package/dist/api/endpoints/chores.js +106 -0
- package/dist/api/endpoints/chores.js.map +1 -0
- package/dist/api/endpoints/devices.d.ts +6 -0
- package/dist/api/endpoints/devices.d.ts.map +1 -0
- package/dist/api/endpoints/devices.js +10 -0
- package/dist/api/endpoints/devices.js.map +1 -0
- package/dist/api/endpoints/frames.d.ts +6 -0
- package/dist/api/endpoints/frames.d.ts.map +1 -0
- package/dist/api/endpoints/frames.js +10 -0
- package/dist/api/endpoints/frames.js.map +1 -0
- package/dist/api/endpoints/lists.d.ts +55 -0
- package/dist/api/endpoints/lists.d.ts.map +1 -0
- package/dist/api/endpoints/lists.js +125 -0
- package/dist/api/endpoints/lists.js.map +1 -0
- package/dist/api/endpoints/meals.d.ts +102 -0
- package/dist/api/endpoints/meals.d.ts.map +1 -0
- package/dist/api/endpoints/meals.js +100 -0
- package/dist/api/endpoints/meals.js.map +1 -0
- package/dist/api/endpoints/misc.d.ts +27 -0
- package/dist/api/endpoints/misc.d.ts.map +1 -0
- package/dist/api/endpoints/misc.js +18 -0
- package/dist/api/endpoints/misc.js.map +1 -0
- package/dist/api/endpoints/photos.d.ts +13 -0
- package/dist/api/endpoints/photos.d.ts.map +1 -0
- package/dist/api/endpoints/photos.js +10 -0
- package/dist/api/endpoints/photos.js.map +1 -0
- package/dist/api/endpoints/rewards.d.ts +49 -0
- package/dist/api/endpoints/rewards.d.ts.map +1 -0
- package/dist/api/endpoints/rewards.js +105 -0
- package/dist/api/endpoints/rewards.js.map +1 -0
- package/dist/api/endpoints/taskbox.d.ts +13 -0
- package/dist/api/endpoints/taskbox.d.ts.map +1 -0
- package/dist/api/endpoints/taskbox.js +22 -0
- package/dist/api/endpoints/taskbox.js.map +1 -0
- package/dist/api/generated-types.d.ts +18967 -0
- package/dist/api/generated-types.d.ts.map +1 -0
- package/dist/api/generated-types.js +6 -0
- package/dist/api/generated-types.js.map +1 -0
- package/dist/api/types.d.ts +283 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +5 -0
- package/dist/api/types.js.map +1 -0
- package/dist/config.d.ts +52 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +80 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +48 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/calendar.d.ts +3 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +297 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/chores.d.ts +3 -0
- package/dist/tools/chores.d.ts.map +1 -0
- package/dist/tools/chores.js +349 -0
- package/dist/tools/chores.js.map +1 -0
- package/dist/tools/family.d.ts +3 -0
- package/dist/tools/family.d.ts.map +1 -0
- package/dist/tools/family.js +182 -0
- package/dist/tools/family.js.map +1 -0
- package/dist/tools/lists.d.ts +3 -0
- package/dist/tools/lists.d.ts.map +1 -0
- package/dist/tools/lists.js +481 -0
- package/dist/tools/lists.js.map +1 -0
- package/dist/tools/meals.d.ts +3 -0
- package/dist/tools/meals.d.ts.map +1 -0
- package/dist/tools/meals.js +319 -0
- package/dist/tools/meals.js.map +1 -0
- package/dist/tools/misc.d.ts +3 -0
- package/dist/tools/misc.d.ts.map +1 -0
- package/dist/tools/misc.js +101 -0
- package/dist/tools/misc.js.map +1 -0
- package/dist/tools/photos.d.ts +3 -0
- package/dist/tools/photos.d.ts.map +1 -0
- package/dist/tools/photos.js +42 -0
- package/dist/tools/photos.js.map +1 -0
- package/dist/tools/rewards.d.ts +3 -0
- package/dist/tools/rewards.d.ts.map +1 -0
- package/dist/tools/rewards.js +338 -0
- package/dist/tools/rewards.js.map +1 -0
- package/dist/tools/tasks.d.ts +3 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +68 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/utils/dates.d.ts +26 -0
- package/dist/utils/dates.d.ts.map +1 -0
- package/dist/utils/dates.js +109 -0
- package/dist/utils/dates.js.map +1 -0
- package/dist/utils/errors.d.ts +45 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +102 -0
- package/dist/utils/errors.js.map +1 -0
- package/package.json +59 -0
package/dist/config.d.ts
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|