@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.
- package/LICENSE +22 -0
- package/README.md +633 -3
- package/THIRD_PARTY_NOTICES.md +38 -0
- package/dist/api/auth.d.ts +34 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +328 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/client.d.ts +103 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +324 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/constants.d.ts +4 -0
- package/dist/api/constants.d.ts.map +1 -0
- package/dist/api/constants.js +4 -0
- package/dist/api/constants.js.map +1 -0
- package/dist/api/credential-store.d.ts +38 -0
- package/dist/api/credential-store.d.ts.map +1 -0
- package/dist/api/credential-store.js +274 -0
- package/dist/api/credential-store.js.map +1 -0
- package/dist/api/credential-types.d.ts +15 -0
- package/dist/api/credential-types.d.ts.map +1 -0
- package/dist/api/credential-types.js +11 -0
- package/dist/api/credential-types.js.map +1 -0
- package/dist/api/endpoints/calendar.d.ts +36 -0
- package/dist/api/endpoints/calendar.d.ts.map +1 -0
- package/dist/api/endpoints/calendar.js +74 -0
- package/dist/api/endpoints/calendar.js.map +1 -0
- package/dist/api/endpoints/categories.d.ts +32 -0
- package/dist/api/endpoints/categories.d.ts.map +1 -0
- package/dist/api/endpoints/categories.js +70 -0
- package/dist/api/endpoints/categories.js.map +1 -0
- package/dist/api/endpoints/chores.d.ts +58 -0
- package/dist/api/endpoints/chores.d.ts.map +1 -0
- package/dist/api/endpoints/chores.js +115 -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 +154 -0
- package/dist/api/endpoints/meals.d.ts.map +1 -0
- package/dist/api/endpoints/meals.js +194 -0
- package/dist/api/endpoints/meals.js.map +1 -0
- package/dist/api/endpoints/messages.d.ts +98 -0
- package/dist/api/endpoints/messages.d.ts.map +1 -0
- package/dist/api/endpoints/messages.js +116 -0
- package/dist/api/endpoints/messages.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 +19 -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 +106 -0
- package/dist/api/endpoints/rewards.js.map +1 -0
- package/dist/api/endpoints/shape.d.ts +11 -0
- package/dist/api/endpoints/shape.d.ts.map +1 -0
- package/dist/api/endpoints/shape.js +34 -0
- package/dist/api/endpoints/shape.js.map +1 -0
- package/dist/api/endpoints/taskbox.d.ts +21 -0
- package/dist/api/endpoints/taskbox.d.ts.map +1 -0
- package/dist/api/endpoints/taskbox.js +39 -0
- package/dist/api/endpoints/taskbox.js.map +1 -0
- package/dist/api/oauth.d.ts +62 -0
- package/dist/api/oauth.d.ts.map +1 -0
- package/dist/api/oauth.js +206 -0
- package/dist/api/oauth.js.map +1 -0
- package/dist/api/types.d.ts +291 -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/cli.d.ts +23 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +106 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +78 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +17 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +17 -0
- package/dist/context.js.map +1 -0
- package/dist/doctor.d.ts +29 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +125 -0
- package/dist/doctor.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -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 +29 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/calendar.d.ts +8 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +334 -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 +321 -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 +491 -0
- package/dist/tools/meals.js.map +1 -0
- package/dist/tools/messages.d.ts +3 -0
- package/dist/tools/messages.d.ts.map +1 -0
- package/dist/tools/messages.js +183 -0
- package/dist/tools/messages.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 +102 -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/planning.d.ts +15 -0
- package/dist/tools/planning.d.ts.map +1 -0
- package/dist/tools/planning.js +304 -0
- package/dist/tools/planning.js.map +1 -0
- package/dist/tools/registry.d.ts +39 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +143 -0
- package/dist/tools/registry.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 +323 -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 +103 -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/dist/utils/schedule.d.ts +86 -0
- package/dist/utils/schedule.d.ts.map +1 -0
- package/dist/utils/schedule.js +189 -0
- package/dist/utils/schedule.js.map +1 -0
- package/package.json +78 -6
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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"}
|
package/dist/context.js
ADDED
|
@@ -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"}
|
package/dist/doctor.d.ts
ADDED
|
@@ -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":"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"}
|
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,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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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"}
|