@davidwoods/skylight-mcp 1.7.0 → 1.8.1
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 -22
- package/README.md +635 -584
- package/THIRD_PARTY_NOTICES.md +38 -38
- package/dist/api/client.d.ts +5 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +9 -2
- package/dist/api/client.js.map +1 -1
- package/dist/api/credential-store.d.ts.map +1 -1
- package/dist/api/credential-store.js +2 -1
- package/dist/api/credential-store.js.map +1 -1
- package/dist/api/endpoints/categories.d.ts +6 -6
- package/dist/api/endpoints/categories.d.ts.map +1 -1
- package/dist/api/endpoints/categories.js +6 -13
- package/dist/api/endpoints/categories.js.map +1 -1
- package/dist/api/endpoints/chores.d.ts +8 -0
- package/dist/api/endpoints/chores.d.ts.map +1 -1
- package/dist/api/endpoints/chores.js +9 -0
- package/dist/api/endpoints/chores.js.map +1 -1
- package/dist/api/endpoints/taskbox.d.ts +8 -0
- package/dist/api/endpoints/taskbox.d.ts.map +1 -1
- package/dist/api/endpoints/taskbox.js +17 -0
- package/dist/api/endpoints/taskbox.js.map +1 -1
- package/dist/api/types.d.ts +14 -0
- package/dist/api/types.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -8
- package/dist/cli.js.map +1 -1
- package/dist/config.js +23 -23
- package/dist/doctor.d.ts +10 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +23 -7
- package/dist/doctor.js.map +1 -1
- package/dist/tools/calendar.d.ts +5 -0
- package/dist/tools/calendar.d.ts.map +1 -1
- package/dist/tools/calendar.js +107 -71
- package/dist/tools/calendar.js.map +1 -1
- package/dist/tools/chores.d.ts.map +1 -1
- package/dist/tools/chores.js +53 -81
- package/dist/tools/chores.js.map +1 -1
- package/dist/tools/family.js +17 -17
- package/dist/tools/lists.js +85 -85
- package/dist/tools/meals.js +102 -102
- package/dist/tools/messages.d.ts.map +1 -1
- package/dist/tools/messages.js +37 -49
- package/dist/tools/messages.js.map +1 -1
- package/dist/tools/misc.js +14 -14
- package/dist/tools/photos.js +6 -6
- package/dist/tools/planning.d.ts.map +1 -1
- package/dist/tools/planning.js +24 -23
- package/dist/tools/planning.js.map +1 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +1 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/rewards.d.ts.map +1 -1
- package/dist/tools/rewards.js +74 -90
- package/dist/tools/rewards.js.map +1 -1
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +45 -10
- package/dist/tools/tasks.js.map +1 -1
- package/dist/utils/errors.js +16 -16
- package/package.json +78 -78
package/dist/tools/rewards.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { attributesOf } from "../api/endpoints/shape.js";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { getRewards, getRewardPoints, createReward, updateReward, deleteReward, redeemReward, unredeemReward, } from "../api/endpoints/rewards.js";
|
|
4
|
-
import {
|
|
4
|
+
import { resolveProfile } from "../api/endpoints/categories.js";
|
|
5
5
|
import { formatErrorForMcp } from "../utils/errors.js";
|
|
6
6
|
export function registerRewardTools(server) {
|
|
7
7
|
// get_rewards tool
|
|
8
|
-
server.tool("get_rewards", `Get available rewards that can be redeemed with reward points.
|
|
9
|
-
|
|
10
|
-
For family gamification - shows rewards that family members can earn.
|
|
11
|
-
|
|
12
|
-
Use this to answer:
|
|
13
|
-
- "What rewards can we redeem?"
|
|
14
|
-
- "What can the kids earn?"
|
|
8
|
+
server.tool("get_rewards", `Get available rewards that can be redeemed with reward points.
|
|
9
|
+
|
|
10
|
+
For family gamification - shows rewards that family members can earn.
|
|
11
|
+
|
|
12
|
+
Use this to answer:
|
|
13
|
+
- "What rewards can we redeem?"
|
|
14
|
+
- "What can the kids earn?"
|
|
15
15
|
- "Show available rewards"`, {
|
|
16
16
|
redeemedSince: z
|
|
17
17
|
.string()
|
|
@@ -66,13 +66,13 @@ Use this to answer:
|
|
|
66
66
|
}
|
|
67
67
|
});
|
|
68
68
|
// get_reward_points tool
|
|
69
|
-
server.tool("get_reward_points", `Get reward points balance for family members.
|
|
70
|
-
|
|
71
|
-
Shows how many reward points each family member has earned.
|
|
72
|
-
|
|
73
|
-
Use this to answer:
|
|
74
|
-
- "How many points does [name] have?"
|
|
75
|
-
- "Show reward points balance"
|
|
69
|
+
server.tool("get_reward_points", `Get reward points balance for family members.
|
|
70
|
+
|
|
71
|
+
Shows how many reward points each family member has earned.
|
|
72
|
+
|
|
73
|
+
Use this to answer:
|
|
74
|
+
- "How many points does [name] have?"
|
|
75
|
+
- "Show reward points balance"
|
|
76
76
|
- "Who has the most points?"`, {}, async () => {
|
|
77
77
|
try {
|
|
78
78
|
const points = await getRewardPoints();
|
|
@@ -120,20 +120,20 @@ Use this to answer:
|
|
|
120
120
|
}
|
|
121
121
|
});
|
|
122
122
|
// create_reward tool
|
|
123
|
-
server.tool("create_reward", `Create a new reward that can be redeemed with points (Plus subscription required).
|
|
124
|
-
|
|
125
|
-
Use this when:
|
|
126
|
-
- Adding a new reward: "Create a reward for 30 minutes of screen time"
|
|
127
|
-
- Setting up family incentives: "Add a pizza night reward worth 100 points"
|
|
128
|
-
|
|
129
|
-
Parameters:
|
|
130
|
-
- name (required): Reward name (e.g., "30 min Screen Time")
|
|
131
|
-
- pointValue (required): Points needed to redeem this reward
|
|
132
|
-
- description: Additional details about the reward
|
|
133
|
-
- emojiIcon: Emoji to display with the reward
|
|
134
|
-
- assignee: Family member name to assign this reward to
|
|
135
|
-
- respawnOnRedemption: If true, reward can be redeemed multiple times
|
|
136
|
-
|
|
123
|
+
server.tool("create_reward", `Create a new reward that can be redeemed with points (Plus subscription required).
|
|
124
|
+
|
|
125
|
+
Use this when:
|
|
126
|
+
- Adding a new reward: "Create a reward for 30 minutes of screen time"
|
|
127
|
+
- Setting up family incentives: "Add a pizza night reward worth 100 points"
|
|
128
|
+
|
|
129
|
+
Parameters:
|
|
130
|
+
- name (required): Reward name (e.g., "30 min Screen Time")
|
|
131
|
+
- pointValue (required): Points needed to redeem this reward
|
|
132
|
+
- description: Additional details about the reward
|
|
133
|
+
- emojiIcon: Emoji to display with the reward
|
|
134
|
+
- assignee: Family member name to assign this reward to
|
|
135
|
+
- respawnOnRedemption: If true, reward can be redeemed multiple times
|
|
136
|
+
|
|
137
137
|
Returns: The created reward details.`, {
|
|
138
138
|
name: z.string().describe("Reward name (e.g., '30 min Screen Time')"),
|
|
139
139
|
pointValue: z.number().describe("Points needed to redeem this reward"),
|
|
@@ -144,16 +144,8 @@ Returns: The created reward details.`, {
|
|
|
144
144
|
}, async ({ name, pointValue, description, emojiIcon, assignee, respawnOnRedemption }) => {
|
|
145
145
|
try {
|
|
146
146
|
let categoryIds;
|
|
147
|
-
if (assignee)
|
|
148
|
-
|
|
149
|
-
if (!category) {
|
|
150
|
-
return {
|
|
151
|
-
content: [{ type: "text", text: `Could not find family member "${assignee}"` }],
|
|
152
|
-
isError: true,
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
categoryIds = [category.id];
|
|
156
|
-
}
|
|
147
|
+
if (assignee)
|
|
148
|
+
categoryIds = [(await resolveProfile(assignee)).id];
|
|
157
149
|
const reward = await createReward({
|
|
158
150
|
name,
|
|
159
151
|
pointValue,
|
|
@@ -179,19 +171,19 @@ Returns: The created reward details.`, {
|
|
|
179
171
|
}
|
|
180
172
|
});
|
|
181
173
|
// update_reward tool
|
|
182
|
-
server.tool("update_reward", `Update an existing reward (Plus subscription required).
|
|
183
|
-
|
|
184
|
-
Use this when:
|
|
185
|
-
- Changing point value: "Make the screen time reward cost 50 points"
|
|
186
|
-
- Updating reward details: "Add a description to the pizza reward"
|
|
187
|
-
|
|
188
|
-
Parameters:
|
|
189
|
-
- rewardId (required): ID of the reward (from get_rewards)
|
|
190
|
-
- name: New reward name
|
|
191
|
-
- pointValue: New point cost
|
|
192
|
-
- description: Updated description
|
|
193
|
-
- emojiIcon: Updated emoji
|
|
194
|
-
|
|
174
|
+
server.tool("update_reward", `Update an existing reward (Plus subscription required).
|
|
175
|
+
|
|
176
|
+
Use this when:
|
|
177
|
+
- Changing point value: "Make the screen time reward cost 50 points"
|
|
178
|
+
- Updating reward details: "Add a description to the pizza reward"
|
|
179
|
+
|
|
180
|
+
Parameters:
|
|
181
|
+
- rewardId (required): ID of the reward (from get_rewards)
|
|
182
|
+
- name: New reward name
|
|
183
|
+
- pointValue: New point cost
|
|
184
|
+
- description: Updated description
|
|
185
|
+
- emojiIcon: Updated emoji
|
|
186
|
+
|
|
195
187
|
Returns: The updated reward details.`, {
|
|
196
188
|
rewardId: z.string().describe("ID of the reward to update"),
|
|
197
189
|
name: z.string().optional().describe("New reward name"),
|
|
@@ -230,15 +222,15 @@ Returns: The updated reward details.`, {
|
|
|
230
222
|
}
|
|
231
223
|
});
|
|
232
224
|
// delete_reward tool
|
|
233
|
-
server.tool("delete_reward", `Delete a reward (Plus subscription required).
|
|
234
|
-
|
|
235
|
-
Use this when:
|
|
236
|
-
- Removing an old reward
|
|
237
|
-
- Cleaning up unused rewards
|
|
238
|
-
|
|
239
|
-
Parameters:
|
|
240
|
-
- rewardId (required): ID of the reward to delete (from get_rewards)
|
|
241
|
-
|
|
225
|
+
server.tool("delete_reward", `Delete a reward (Plus subscription required).
|
|
226
|
+
|
|
227
|
+
Use this when:
|
|
228
|
+
- Removing an old reward
|
|
229
|
+
- Cleaning up unused rewards
|
|
230
|
+
|
|
231
|
+
Parameters:
|
|
232
|
+
- rewardId (required): ID of the reward to delete (from get_rewards)
|
|
233
|
+
|
|
242
234
|
Note: This permanently removes the reward.`, {
|
|
243
235
|
rewardId: z.string().describe("ID of the reward to delete"),
|
|
244
236
|
}, async ({ rewardId }) => {
|
|
@@ -261,32 +253,24 @@ Note: This permanently removes the reward.`, {
|
|
|
261
253
|
}
|
|
262
254
|
});
|
|
263
255
|
// redeem_reward tool
|
|
264
|
-
server.tool("redeem_reward", `Redeem a reward using points (Plus subscription required).
|
|
265
|
-
|
|
266
|
-
Use this when:
|
|
267
|
-
- A family member wants to cash in points: "Redeem the screen time reward for Johnny"
|
|
268
|
-
- Claiming an earned reward
|
|
269
|
-
|
|
270
|
-
Parameters:
|
|
271
|
-
- rewardId (required): ID of the reward to redeem (from get_rewards)
|
|
272
|
-
- assignee: Family member redeeming the reward (uses their points)
|
|
273
|
-
|
|
256
|
+
server.tool("redeem_reward", `Redeem a reward using points (Plus subscription required).
|
|
257
|
+
|
|
258
|
+
Use this when:
|
|
259
|
+
- A family member wants to cash in points: "Redeem the screen time reward for Johnny"
|
|
260
|
+
- Claiming an earned reward
|
|
261
|
+
|
|
262
|
+
Parameters:
|
|
263
|
+
- rewardId (required): ID of the reward to redeem (from get_rewards)
|
|
264
|
+
- assignee: Family member redeeming the reward (uses their points)
|
|
265
|
+
|
|
274
266
|
Returns: The redeemed reward details.`, {
|
|
275
267
|
rewardId: z.string().describe("ID of the reward to redeem"),
|
|
276
268
|
assignee: z.string().optional().describe("Family member redeeming the reward"),
|
|
277
269
|
}, async ({ rewardId, assignee }) => {
|
|
278
270
|
try {
|
|
279
271
|
let categoryId;
|
|
280
|
-
if (assignee)
|
|
281
|
-
|
|
282
|
-
if (!category) {
|
|
283
|
-
return {
|
|
284
|
-
content: [{ type: "text", text: `Could not find family member "${assignee}"` }],
|
|
285
|
-
isError: true,
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
categoryId = category.id;
|
|
289
|
-
}
|
|
272
|
+
if (assignee)
|
|
273
|
+
categoryId = (await resolveProfile(assignee)).id;
|
|
290
274
|
const reward = await redeemReward(rewardId, categoryId);
|
|
291
275
|
return {
|
|
292
276
|
content: [
|
|
@@ -305,15 +289,15 @@ Returns: The redeemed reward details.`, {
|
|
|
305
289
|
}
|
|
306
290
|
});
|
|
307
291
|
// unredeem_reward tool
|
|
308
|
-
server.tool("unredeem_reward", `Cancel a reward redemption (Plus subscription required).
|
|
309
|
-
|
|
310
|
-
Use this when:
|
|
311
|
-
- A redemption was made by mistake
|
|
312
|
-
- Undoing a reward claim
|
|
313
|
-
|
|
314
|
-
Parameters:
|
|
315
|
-
- rewardId (required): ID of the reward to unredeem
|
|
316
|
-
|
|
292
|
+
server.tool("unredeem_reward", `Cancel a reward redemption (Plus subscription required).
|
|
293
|
+
|
|
294
|
+
Use this when:
|
|
295
|
+
- A redemption was made by mistake
|
|
296
|
+
- Undoing a reward claim
|
|
297
|
+
|
|
298
|
+
Parameters:
|
|
299
|
+
- rewardId (required): ID of the reward to unredeem
|
|
300
|
+
|
|
317
301
|
Returns: The unredeemed reward details.`, {
|
|
318
302
|
rewardId: z.string().describe("ID of the reward to unredeem"),
|
|
319
303
|
}, async ({ rewardId }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rewards.js","sourceRoot":"","sources":["../../src/tools/rewards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EACL,UAAU,EACV,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"rewards.js","sourceRoot":"","sources":["../../src/tools/rewards.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6GzD"}
|
package/dist/tools/tasks.js
CHANGED
|
@@ -1,17 +1,52 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createTaskBoxItem } from "../api/endpoints/taskbox.js";
|
|
2
|
+
import { createTaskBoxItem, listTaskBoxItems } from "../api/endpoints/taskbox.js";
|
|
3
3
|
import { formatErrorForMcp } from "../utils/errors.js";
|
|
4
4
|
export function registerTaskTools(server) {
|
|
5
|
+
// get_task_box tool
|
|
6
|
+
server.tool("get_task_box", `List the Skylight task box.
|
|
7
|
+
|
|
8
|
+
The task box is a library of reusable chore and routine templates (for example "Take out trash" or "Brush teeth"), not scheduled work. Items have no assignee and no date; scheduling one creates a chore, which get_chores and get_week_overview show.
|
|
9
|
+
|
|
10
|
+
Use this when the user asks what is in the task box, or before adding a task to avoid a duplicate.`, {}, async () => {
|
|
11
|
+
try {
|
|
12
|
+
const items = await listTaskBoxItems();
|
|
13
|
+
if (items.length === 0) {
|
|
14
|
+
return { content: [{ type: "text", text: "The task box is empty." }] };
|
|
15
|
+
}
|
|
16
|
+
const line = (item) => {
|
|
17
|
+
const a = item.attributes;
|
|
18
|
+
const extras = [];
|
|
19
|
+
if (a.reward_points)
|
|
20
|
+
extras.push(`${a.reward_points} points`);
|
|
21
|
+
const emoji = a.emoji_icon ? `${a.emoji_icon} ` : "";
|
|
22
|
+
return `- ${emoji}${a.summary}${extras.length ? ` (${extras.join(", ")})` : ""}`;
|
|
23
|
+
};
|
|
24
|
+
const chores = items.filter((i) => !i.attributes.routine);
|
|
25
|
+
const routines = items.filter((i) => i.attributes.routine);
|
|
26
|
+
const parts = [`Task box: ${items.length} items`];
|
|
27
|
+
if (chores.length)
|
|
28
|
+
parts.push("", "Chores:", ...chores.map(line));
|
|
29
|
+
if (routines.length)
|
|
30
|
+
parts.push("", "Routines:", ...routines.map(line));
|
|
31
|
+
return { content: [{ type: "text", text: parts.join("\n") }] };
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return {
|
|
35
|
+
content: [{ type: "text", text: formatErrorForMcp(error) }],
|
|
36
|
+
isError: true,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
});
|
|
5
40
|
// create_task tool
|
|
6
|
-
server.tool("create_task", `Add a task to the Skylight task box.
|
|
7
|
-
|
|
8
|
-
The task box holds unscheduled tasks that can later be assigned to specific dates.
|
|
9
|
-
|
|
10
|
-
Use this when the user says:
|
|
11
|
-
- "Add XYZ to my task list"
|
|
12
|
-
- "Remind me to do ABC" (without a specific date)
|
|
13
|
-
- "Put 'clean garage' on the task box"
|
|
14
|
-
|
|
41
|
+
server.tool("create_task", `Add a task to the Skylight task box.
|
|
42
|
+
|
|
43
|
+
The task box holds unscheduled tasks that can later be assigned to specific dates.
|
|
44
|
+
|
|
45
|
+
Use this when the user says:
|
|
46
|
+
- "Add XYZ to my task list"
|
|
47
|
+
- "Remind me to do ABC" (without a specific date)
|
|
48
|
+
- "Put 'clean garage' on the task box"
|
|
49
|
+
|
|
15
50
|
The task will appear on the Skylight display in the task box.`, {
|
|
16
51
|
summary: z.string().describe("Task description"),
|
|
17
52
|
emoji: z
|
package/dist/tools/tasks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/errors.js
CHANGED
|
@@ -64,31 +64,31 @@ export class ParseError extends SkylightError {
|
|
|
64
64
|
*/
|
|
65
65
|
export function formatErrorForMcp(error) {
|
|
66
66
|
if (error instanceof AuthenticationError) {
|
|
67
|
-
return `Authentication Error: ${error.message}
|
|
68
|
-
|
|
69
|
-
Your Skylight token may have expired. To fix this:
|
|
70
|
-
1. If using email/password auth, retry with valid SKYLIGHT_EMAIL and SKYLIGHT_PASSWORD
|
|
71
|
-
2. If using a manual token, capture fresh API traffic using a proxy tool
|
|
72
|
-
3. Update your SKYLIGHT_TOKEN environment variable if you are using manual token auth
|
|
73
|
-
|
|
67
|
+
return `Authentication Error: ${error.message}
|
|
68
|
+
|
|
69
|
+
Your Skylight token may have expired. To fix this:
|
|
70
|
+
1. If using email/password auth, retry with valid SKYLIGHT_EMAIL and SKYLIGHT_PASSWORD
|
|
71
|
+
2. If using a manual token, capture fresh API traffic using a proxy tool
|
|
72
|
+
3. Update your SKYLIGHT_TOKEN environment variable if you are using manual token auth
|
|
73
|
+
|
|
74
74
|
See the auth documentation for detailed steps.`;
|
|
75
75
|
}
|
|
76
76
|
if (error instanceof NotFoundError) {
|
|
77
|
-
return `Not Found: ${error.message}
|
|
78
|
-
|
|
79
|
-
This could mean:
|
|
80
|
-
- The requested item doesn't exist
|
|
81
|
-
- Your frame ID is incorrect
|
|
77
|
+
return `Not Found: ${error.message}
|
|
78
|
+
|
|
79
|
+
This could mean:
|
|
80
|
+
- The requested item doesn't exist
|
|
81
|
+
- Your frame ID is incorrect
|
|
82
82
|
- The item was deleted from Skylight`;
|
|
83
83
|
}
|
|
84
84
|
if (error instanceof RateLimitError) {
|
|
85
|
-
return `Rate Limited: ${error.message}
|
|
86
|
-
|
|
85
|
+
return `Rate Limited: ${error.message}
|
|
86
|
+
|
|
87
87
|
The Skylight API is temporarily limiting requests. Please wait a moment and try again.`;
|
|
88
88
|
}
|
|
89
89
|
if (error instanceof ConfigurationError) {
|
|
90
|
-
return `Configuration Error: ${error.message}
|
|
91
|
-
|
|
90
|
+
return `Configuration Error: ${error.message}
|
|
91
|
+
|
|
92
92
|
Please check your environment variables are set correctly.`;
|
|
93
93
|
}
|
|
94
94
|
if (error instanceof SkylightError) {
|
package/package.json
CHANGED
|
@@ -1,78 +1,78 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@davidwoods/skylight-mcp",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Unofficial MCP server for Skylight Calendar: local (stdio) and hosted (Cloudflare Workers), with browser-paste OAuth sign-in and an encrypted credential store",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "dist/index.js",
|
|
7
|
-
"bin": {
|
|
8
|
-
"skylight-mcp": "dist/index.js"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
"dist",
|
|
12
|
-
"README.md",
|
|
13
|
-
"LICENSE",
|
|
14
|
-
"THIRD_PARTY_NOTICES.md"
|
|
15
|
-
],
|
|
16
|
-
"scripts": {
|
|
17
|
-
"build": "tsc",
|
|
18
|
-
"start": "node dist/index.js",
|
|
19
|
-
"dev": "tsx watch src/index.ts",
|
|
20
|
-
"test": "vitest",
|
|
21
|
-
"test:coverage": "vitest --coverage",
|
|
22
|
-
"lint": "eslint src/",
|
|
23
|
-
"typecheck": "tsc --noEmit",
|
|
24
|
-
"prepare": "npm run build",
|
|
25
|
-
"generate:types": "openapi-typescript ../skylight-api/docs/openapi/openapi.yaml -o src/api/generated-types.ts",
|
|
26
|
-
"typecheck:worker": "tsc -p tsconfig.worker.json",
|
|
27
|
-
"worker:dev": "wrangler dev",
|
|
28
|
-
"worker:deploy": "wrangler deploy",
|
|
29
|
-
"worker:deploy:local": "wrangler deploy -c wrangler.local.jsonc",
|
|
30
|
-
"worker:setup": "node scripts/setup-worker.mjs",
|
|
31
|
-
"prepublishOnly": "npm run typecheck && npm run lint && vitest run && npm run build",
|
|
32
|
-
"test:live": "vitest run --config vitest.live.config.ts"
|
|
33
|
-
},
|
|
34
|
-
"keywords": [
|
|
35
|
-
"mcp",
|
|
36
|
-
"skylight",
|
|
37
|
-
"calendar",
|
|
38
|
-
"model-context-protocol",
|
|
39
|
-
"claude",
|
|
40
|
-
"ai",
|
|
41
|
-
"family",
|
|
42
|
-
"chores"
|
|
43
|
-
],
|
|
44
|
-
"author": "David Woods",
|
|
45
|
-
"license": "MIT",
|
|
46
|
-
"repository": {
|
|
47
|
-
"type": "git",
|
|
48
|
-
"url": "git+https://github.com/dwooods/skylight-mcp.git"
|
|
49
|
-
},
|
|
50
|
-
"dependencies": {
|
|
51
|
-
"@cloudflare/workers-oauth-provider": "^1.2.4",
|
|
52
|
-
"@modelcontextprotocol/sdk": "^1.32.2",
|
|
53
|
-
"zod": "^4.6.7"
|
|
54
|
-
},
|
|
55
|
-
"devDependencies": {
|
|
56
|
-
"@cloudflare/workers-types": "^5.20261029.1",
|
|
57
|
-
"@types/node": "^22.20.5",
|
|
58
|
-
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
|
59
|
-
"@typescript-eslint/parser": "^7.0.0",
|
|
60
|
-
"eslint": "^8.57.0",
|
|
61
|
-
"openapi-typescript": "^7.0.0",
|
|
62
|
-
"tsx": "^4.7.0",
|
|
63
|
-
"typescript": "^5.4.5",
|
|
64
|
-
"vite": "^8.3.5",
|
|
65
|
-
"vitest": "^5.0.5",
|
|
66
|
-
"wrangler": "^4.156.0"
|
|
67
|
-
},
|
|
68
|
-
"publishConfig": {
|
|
69
|
-
"access": "public"
|
|
70
|
-
},
|
|
71
|
-
"engines": {
|
|
72
|
-
"node": ">=20.0.0"
|
|
73
|
-
},
|
|
74
|
-
"homepage": "https://github.com/dwooods/skylight-mcp#readme",
|
|
75
|
-
"bugs": {
|
|
76
|
-
"url": "https://github.com/dwooods/skylight-mcp/issues"
|
|
77
|
-
}
|
|
78
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@davidwoods/skylight-mcp",
|
|
3
|
+
"version": "1.8.1",
|
|
4
|
+
"description": "Unofficial MCP server for Skylight Calendar: local (stdio) and hosted (Cloudflare Workers), with browser-paste OAuth sign-in and an encrypted credential store",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"skylight-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE",
|
|
14
|
+
"THIRD_PARTY_NOTICES.md"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"start": "node dist/index.js",
|
|
19
|
+
"dev": "tsx watch src/index.ts",
|
|
20
|
+
"test": "vitest",
|
|
21
|
+
"test:coverage": "vitest --coverage",
|
|
22
|
+
"lint": "eslint src/",
|
|
23
|
+
"typecheck": "tsc --noEmit",
|
|
24
|
+
"prepare": "npm run build",
|
|
25
|
+
"generate:types": "openapi-typescript ../skylight-api/docs/openapi/openapi.yaml -o src/api/generated-types.ts",
|
|
26
|
+
"typecheck:worker": "tsc -p tsconfig.worker.json",
|
|
27
|
+
"worker:dev": "wrangler dev",
|
|
28
|
+
"worker:deploy": "wrangler deploy",
|
|
29
|
+
"worker:deploy:local": "wrangler deploy -c wrangler.local.jsonc",
|
|
30
|
+
"worker:setup": "node scripts/setup-worker.mjs",
|
|
31
|
+
"prepublishOnly": "npm run typecheck && npm run lint && vitest run && npm run build",
|
|
32
|
+
"test:live": "vitest run --config vitest.live.config.ts"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"mcp",
|
|
36
|
+
"skylight",
|
|
37
|
+
"calendar",
|
|
38
|
+
"model-context-protocol",
|
|
39
|
+
"claude",
|
|
40
|
+
"ai",
|
|
41
|
+
"family",
|
|
42
|
+
"chores"
|
|
43
|
+
],
|
|
44
|
+
"author": "David Woods",
|
|
45
|
+
"license": "MIT",
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "git+https://github.com/dwooods/skylight-mcp.git"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@cloudflare/workers-oauth-provider": "^1.2.4",
|
|
52
|
+
"@modelcontextprotocol/sdk": "^1.32.2",
|
|
53
|
+
"zod": "^4.6.7"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@cloudflare/workers-types": "^5.20261029.1",
|
|
57
|
+
"@types/node": "^22.20.5",
|
|
58
|
+
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
|
59
|
+
"@typescript-eslint/parser": "^7.0.0",
|
|
60
|
+
"eslint": "^8.57.0",
|
|
61
|
+
"openapi-typescript": "^7.0.0",
|
|
62
|
+
"tsx": "^4.7.0",
|
|
63
|
+
"typescript": "^5.4.5",
|
|
64
|
+
"vite": "^8.3.5",
|
|
65
|
+
"vitest": "^5.0.5",
|
|
66
|
+
"wrangler": "^4.156.0"
|
|
67
|
+
},
|
|
68
|
+
"publishConfig": {
|
|
69
|
+
"access": "public"
|
|
70
|
+
},
|
|
71
|
+
"engines": {
|
|
72
|
+
"node": ">=20.0.0"
|
|
73
|
+
},
|
|
74
|
+
"homepage": "https://github.com/dwooods/skylight-mcp#readme",
|
|
75
|
+
"bugs": {
|
|
76
|
+
"url": "https://github.com/dwooods/skylight-mcp/issues"
|
|
77
|
+
}
|
|
78
|
+
}
|