@jnss95/ical-mcp 1.0.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.
@@ -0,0 +1,455 @@
1
+ /**
2
+ * Calendar class for parsing and manipulating iCal data
3
+ */
4
+ import ICAL from 'ical.js';
5
+ import { v4 as uuidv4 } from 'uuid';
6
+ /**
7
+ * Manages calendar operations including parsing, querying, and modifying events
8
+ */
9
+ export class Calendar {
10
+ vcalendar;
11
+ source;
12
+ constructor(source) {
13
+ this.source = source;
14
+ this.vcalendar = new ICAL.Component(['vcalendar', [], []]);
15
+ this.vcalendar.updatePropertyWithValue('prodid', '-//iCal MCP Server//EN');
16
+ this.vcalendar.updatePropertyWithValue('version', '2.0');
17
+ this.vcalendar.updatePropertyWithValue('calscale', 'GREGORIAN');
18
+ }
19
+ /**
20
+ * Load and parse iCal data from a string
21
+ */
22
+ loadFromString(icalString) {
23
+ const jcalData = ICAL.parse(icalString);
24
+ this.vcalendar = new ICAL.Component(jcalData);
25
+ }
26
+ /**
27
+ * Get the raw iCal string representation
28
+ */
29
+ toString() {
30
+ return this.vcalendar.toString();
31
+ }
32
+ /**
33
+ * Get calendar metadata
34
+ */
35
+ getMetadata() {
36
+ const events = this.vcalendar.getAllSubcomponents('vevent');
37
+ return {
38
+ name: this.vcalendar.getFirstPropertyValue('x-wr-calname') ?? undefined,
39
+ description: this.vcalendar.getFirstPropertyValue('x-wr-caldesc') ?? undefined,
40
+ timezone: this.vcalendar.getFirstPropertyValue('x-wr-timezone') ?? undefined,
41
+ prodId: this.vcalendar.getFirstPropertyValue('prodid') ?? undefined,
42
+ version: this.vcalendar.getFirstPropertyValue('version') ?? undefined,
43
+ method: this.vcalendar.getFirstPropertyValue('method') ?? undefined,
44
+ eventCount: events.length,
45
+ };
46
+ }
47
+ /**
48
+ * Get all events in the calendar
49
+ */
50
+ getAllEvents() {
51
+ const vevents = this.vcalendar.getAllSubcomponents('vevent');
52
+ return vevents.map((vevent) => this.parseVEvent(vevent));
53
+ }
54
+ /**
55
+ * Get a single event by UID
56
+ */
57
+ getEvent(uid) {
58
+ const vevents = this.vcalendar.getAllSubcomponents('vevent');
59
+ const vevent = vevents.find((v) => {
60
+ const event = new ICAL.Event(v);
61
+ return event.uid === uid;
62
+ });
63
+ if (!vevent) {
64
+ return null;
65
+ }
66
+ return this.parseVEvent(vevent);
67
+ }
68
+ /**
69
+ * Query events with various filters
70
+ */
71
+ queryEvents(options = {}) {
72
+ const { startDate, endDate, searchText, location, organizer, categories, expandRecurring = true, limit, offset = 0, } = options;
73
+ let events = this.getAllEvents();
74
+ // If we need to expand recurring events within a date range
75
+ if (expandRecurring && (startDate || endDate)) {
76
+ events = this.expandRecurringEvents(events, startDate ? new Date(startDate) : undefined, endDate ? new Date(endDate) : undefined);
77
+ }
78
+ // Apply filters
79
+ if (startDate) {
80
+ const start = new Date(startDate);
81
+ events = events.filter((e) => new Date(e.start) >= start);
82
+ }
83
+ if (endDate) {
84
+ const end = new Date(endDate);
85
+ events = events.filter((e) => new Date(e.start) <= end);
86
+ }
87
+ if (searchText) {
88
+ const search = searchText.toLowerCase();
89
+ events = events.filter((e) => e.summary?.toLowerCase().includes(search) ||
90
+ e.description?.toLowerCase().includes(search) ||
91
+ e.location?.toLowerCase().includes(search));
92
+ }
93
+ if (location) {
94
+ const loc = location.toLowerCase();
95
+ events = events.filter((e) => e.location?.toLowerCase().includes(loc));
96
+ }
97
+ if (organizer) {
98
+ const org = organizer.toLowerCase();
99
+ events = events.filter((e) => e.organizer?.toLowerCase().includes(org));
100
+ }
101
+ if (categories && categories.length > 0) {
102
+ events = events.filter((e) => e.categories?.some((cat) => categories.some((c) => c.toLowerCase() === cat.toLowerCase())));
103
+ }
104
+ // Sort by start date
105
+ events.sort((a, b) => new Date(a.start).getTime() - new Date(b.start).getTime());
106
+ const totalCount = events.length;
107
+ // Apply pagination
108
+ if (offset > 0) {
109
+ events = events.slice(offset);
110
+ }
111
+ if (limit !== undefined && limit > 0) {
112
+ events = events.slice(0, limit);
113
+ }
114
+ return {
115
+ events,
116
+ totalCount,
117
+ hasMore: offset + events.length < totalCount,
118
+ };
119
+ }
120
+ /**
121
+ * Create a new event
122
+ */
123
+ createEvent(options) {
124
+ if (!this.source.writable) {
125
+ throw new Error('Calendar source is read-only');
126
+ }
127
+ const uid = uuidv4();
128
+ const vevent = new ICAL.Component('vevent');
129
+ const now = ICAL.Time.now();
130
+ // Required properties
131
+ vevent.updatePropertyWithValue('uid', uid);
132
+ vevent.updatePropertyWithValue('dtstamp', now);
133
+ vevent.updatePropertyWithValue('created', now);
134
+ vevent.updatePropertyWithValue('last-modified', now);
135
+ vevent.updatePropertyWithValue('summary', options.summary);
136
+ vevent.updatePropertyWithValue('sequence', 0);
137
+ // Start time
138
+ const startTime = this.parseDateTime(options.start, options.allDay);
139
+ vevent.updatePropertyWithValue('dtstart', startTime);
140
+ // End time
141
+ if (options.end) {
142
+ const endTime = this.parseDateTime(options.end, options.allDay);
143
+ vevent.updatePropertyWithValue('dtend', endTime);
144
+ }
145
+ else if (options.allDay) {
146
+ // For all-day events without end, set end to next day
147
+ const endTime = startTime.clone();
148
+ endTime.adjust(1, 0, 0, 0);
149
+ vevent.updatePropertyWithValue('dtend', endTime);
150
+ }
151
+ else {
152
+ // Default to 1 hour duration
153
+ const endTime = startTime.clone();
154
+ endTime.adjust(0, 1, 0, 0);
155
+ vevent.updatePropertyWithValue('dtend', endTime);
156
+ }
157
+ // Optional properties
158
+ if (options.description) {
159
+ vevent.updatePropertyWithValue('description', options.description);
160
+ }
161
+ if (options.location) {
162
+ vevent.updatePropertyWithValue('location', options.location);
163
+ }
164
+ if (options.rrule) {
165
+ const recur = ICAL.Recur.fromString(options.rrule);
166
+ vevent.updatePropertyWithValue('rrule', recur);
167
+ }
168
+ if (options.organizer) {
169
+ const prop = new ICAL.Property('organizer');
170
+ prop.setValue(`mailto:${options.organizer}`);
171
+ vevent.addProperty(prop);
172
+ }
173
+ if (options.attendees && options.attendees.length > 0) {
174
+ for (const attendee of options.attendees) {
175
+ const prop = new ICAL.Property('attendee');
176
+ prop.setValue(`mailto:${attendee}`);
177
+ vevent.addProperty(prop);
178
+ }
179
+ }
180
+ if (options.url) {
181
+ vevent.updatePropertyWithValue('url', options.url);
182
+ }
183
+ if (options.categories && options.categories.length > 0) {
184
+ vevent.updatePropertyWithValue('categories', options.categories.join(','));
185
+ }
186
+ if (options.status) {
187
+ vevent.updatePropertyWithValue('status', options.status);
188
+ }
189
+ if (options.transparency) {
190
+ vevent.updatePropertyWithValue('transp', options.transparency);
191
+ }
192
+ this.vcalendar.addSubcomponent(vevent);
193
+ return this.parseVEvent(vevent);
194
+ }
195
+ /**
196
+ * Update an existing event
197
+ */
198
+ updateEvent(uid, options) {
199
+ if (!this.source.writable) {
200
+ throw new Error('Calendar source is read-only');
201
+ }
202
+ const vevents = this.vcalendar.getAllSubcomponents('vevent');
203
+ const veventIndex = vevents.findIndex((v) => {
204
+ const event = new ICAL.Event(v);
205
+ return event.uid === uid;
206
+ });
207
+ if (veventIndex === -1) {
208
+ throw new Error(`Event with UID ${uid} not found`);
209
+ }
210
+ const vevent = vevents[veventIndex];
211
+ const now = ICAL.Time.now();
212
+ // Update last-modified timestamp
213
+ vevent.updatePropertyWithValue('last-modified', now);
214
+ // Increment sequence number
215
+ const event = new ICAL.Event(vevent);
216
+ vevent.updatePropertyWithValue('sequence', event.sequence + 1);
217
+ // Update provided properties
218
+ if (options.summary !== undefined) {
219
+ vevent.updatePropertyWithValue('summary', options.summary);
220
+ }
221
+ if (options.start !== undefined) {
222
+ const startTime = this.parseDateTime(options.start, options.allDay);
223
+ vevent.updatePropertyWithValue('dtstart', startTime);
224
+ }
225
+ if (options.end !== undefined) {
226
+ const endTime = this.parseDateTime(options.end, options.allDay);
227
+ vevent.updatePropertyWithValue('dtend', endTime);
228
+ }
229
+ if (options.description !== undefined) {
230
+ if (options.description) {
231
+ vevent.updatePropertyWithValue('description', options.description);
232
+ }
233
+ else {
234
+ vevent.removeProperty('description');
235
+ }
236
+ }
237
+ if (options.location !== undefined) {
238
+ if (options.location) {
239
+ vevent.updatePropertyWithValue('location', options.location);
240
+ }
241
+ else {
242
+ vevent.removeProperty('location');
243
+ }
244
+ }
245
+ if (options.rrule !== undefined) {
246
+ if (options.rrule) {
247
+ const recur = ICAL.Recur.fromString(options.rrule);
248
+ vevent.updatePropertyWithValue('rrule', recur);
249
+ }
250
+ else {
251
+ vevent.removeProperty('rrule');
252
+ }
253
+ }
254
+ if (options.organizer !== undefined) {
255
+ vevent.removeProperty('organizer');
256
+ if (options.organizer) {
257
+ const prop = new ICAL.Property('organizer');
258
+ prop.setValue(`mailto:${options.organizer}`);
259
+ vevent.addProperty(prop);
260
+ }
261
+ }
262
+ if (options.attendees !== undefined) {
263
+ // Remove all existing attendees
264
+ const existingAttendees = vevent.getAllProperties('attendee');
265
+ for (const prop of existingAttendees) {
266
+ vevent.removeProperty(prop.name);
267
+ }
268
+ // Add new attendees
269
+ if (options.attendees && options.attendees.length > 0) {
270
+ for (const attendee of options.attendees) {
271
+ const prop = new ICAL.Property('attendee');
272
+ prop.setValue(`mailto:${attendee}`);
273
+ vevent.addProperty(prop);
274
+ }
275
+ }
276
+ }
277
+ if (options.url !== undefined) {
278
+ if (options.url) {
279
+ vevent.updatePropertyWithValue('url', options.url);
280
+ }
281
+ else {
282
+ vevent.removeProperty('url');
283
+ }
284
+ }
285
+ if (options.categories !== undefined) {
286
+ if (options.categories && options.categories.length > 0) {
287
+ vevent.updatePropertyWithValue('categories', options.categories.join(','));
288
+ }
289
+ else {
290
+ vevent.removeProperty('categories');
291
+ }
292
+ }
293
+ if (options.status !== undefined) {
294
+ if (options.status) {
295
+ vevent.updatePropertyWithValue('status', options.status);
296
+ }
297
+ else {
298
+ vevent.removeProperty('status');
299
+ }
300
+ }
301
+ if (options.transparency !== undefined) {
302
+ if (options.transparency) {
303
+ vevent.updatePropertyWithValue('transp', options.transparency);
304
+ }
305
+ else {
306
+ vevent.removeProperty('transp');
307
+ }
308
+ }
309
+ return this.parseVEvent(vevent);
310
+ }
311
+ /**
312
+ * Delete an event by UID
313
+ */
314
+ deleteEvent(uid) {
315
+ if (!this.source.writable) {
316
+ throw new Error('Calendar source is read-only');
317
+ }
318
+ const vevents = this.vcalendar.getAllSubcomponents('vevent');
319
+ const vevent = vevents.find((v) => {
320
+ const event = new ICAL.Event(v);
321
+ return event.uid === uid;
322
+ });
323
+ if (!vevent) {
324
+ return false;
325
+ }
326
+ return this.vcalendar.removeSubcomponent(vevent);
327
+ }
328
+ /**
329
+ * Get the calendar source configuration
330
+ */
331
+ getSource() {
332
+ return { ...this.source };
333
+ }
334
+ /**
335
+ * Check if the calendar is writable
336
+ */
337
+ isWritable() {
338
+ return this.source.writable;
339
+ }
340
+ /**
341
+ * Parse a VEVENT component into a CalendarEvent
342
+ */
343
+ parseVEvent(vevent) {
344
+ const event = new ICAL.Event(vevent);
345
+ const startDate = event.startDate;
346
+ const endDate = event.endDate;
347
+ const isAllDay = startDate?.isDate ?? false;
348
+ // Get attendees
349
+ const attendeeProps = vevent.getAllProperties('attendee');
350
+ const attendees = attendeeProps.map((prop) => {
351
+ const value = prop.getFirstValue();
352
+ return value?.replace(/^mailto:/i, '') ?? '';
353
+ }).filter(Boolean);
354
+ // Get categories
355
+ const categoriesValue = vevent.getFirstPropertyValue('categories');
356
+ const categories = categoriesValue ? categoriesValue.split(',').map((c) => c.trim()) : undefined;
357
+ // Get RRULE
358
+ const rruleProp = vevent.getFirstProperty('rrule');
359
+ const rrule = rruleProp ? rruleProp.getFirstValue()?.toString() : undefined;
360
+ // Get organizer
361
+ const organizerProp = vevent.getFirstProperty('organizer');
362
+ const organizerValue = organizerProp?.getFirstValue();
363
+ const organizer = organizerValue?.replace(/^mailto:/i, '');
364
+ // Get timestamps
365
+ const created = vevent.getFirstPropertyValue('created');
366
+ const lastModified = vevent.getFirstPropertyValue('last-modified');
367
+ return {
368
+ uid: event.uid,
369
+ summary: event.summary ?? '',
370
+ description: event.description ?? '',
371
+ location: event.location ?? '',
372
+ start: startDate?.toJSDate().toISOString() ?? '',
373
+ end: endDate?.toJSDate().toISOString() ?? '',
374
+ allDay: isAllDay,
375
+ organizer,
376
+ attendees: attendees.length > 0 ? attendees : undefined,
377
+ rrule,
378
+ status: vevent.getFirstPropertyValue('status') ?? undefined,
379
+ transparency: vevent.getFirstPropertyValue('transp') ?? undefined,
380
+ categories,
381
+ url: vevent.getFirstPropertyValue('url') ?? undefined,
382
+ created: created?.toJSDate().toISOString(),
383
+ lastModified: lastModified?.toJSDate().toISOString(),
384
+ sequence: event.sequence,
385
+ };
386
+ }
387
+ /**
388
+ * Parse a date/time string into an ICAL.Time
389
+ */
390
+ parseDateTime(dateStr, allDay) {
391
+ const date = new Date(dateStr);
392
+ const time = ICAL.Time.fromJSDate(date, true);
393
+ if (allDay) {
394
+ time.isDate = true;
395
+ time.hour = 0;
396
+ time.minute = 0;
397
+ time.second = 0;
398
+ }
399
+ return time;
400
+ }
401
+ /**
402
+ * Expand recurring events within a date range
403
+ */
404
+ expandRecurringEvents(events, startDate, endDate) {
405
+ const result = [];
406
+ const rangeStart = startDate ?? new Date(Date.now() - 365 * 24 * 60 * 60 * 1000);
407
+ const rangeEnd = endDate ?? new Date(Date.now() + 365 * 24 * 60 * 60 * 1000);
408
+ for (const event of events) {
409
+ if (!event.rrule) {
410
+ // Non-recurring event
411
+ result.push(event);
412
+ }
413
+ else {
414
+ // Get the original VEVENT component
415
+ const vevents = this.vcalendar.getAllSubcomponents('vevent');
416
+ const vevent = vevents.find((v) => {
417
+ const e = new ICAL.Event(v);
418
+ return e.uid === event.uid;
419
+ });
420
+ if (!vevent) {
421
+ result.push(event);
422
+ continue;
423
+ }
424
+ const icalEvent = new ICAL.Event(vevent);
425
+ try {
426
+ const iterator = icalEvent.iterator(icalEvent.startDate);
427
+ let occurrence;
428
+ let count = 0;
429
+ const maxOccurrences = 500; // Limit to prevent infinite loops
430
+ while ((occurrence = iterator.next()) && count < maxOccurrences) {
431
+ const occurrenceDate = occurrence.toJSDate();
432
+ if (occurrenceDate > rangeEnd) {
433
+ break;
434
+ }
435
+ if (occurrenceDate >= rangeStart) {
436
+ const details = icalEvent.getOccurrenceDetails(occurrence);
437
+ result.push({
438
+ ...event,
439
+ start: details.startDate.toJSDate().toISOString(),
440
+ end: details.endDate.toJSDate().toISOString(),
441
+ });
442
+ }
443
+ count++;
444
+ }
445
+ }
446
+ catch {
447
+ // If expansion fails, just include the original event
448
+ result.push(event);
449
+ }
450
+ }
451
+ }
452
+ return result;
453
+ }
454
+ }
455
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/calendar/calendar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { Calendar } from './calendar.js';
2
+ export { loadFromFile, loadFromUrl, loadFromString, loadCalendar, saveCalendar, createCalendarFile, } from './loader.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/calendar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,YAAY,EACZ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,kBAAkB,GACnB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { Calendar } from './calendar.js';
2
+ export { loadFromFile, loadFromUrl, loadFromString, loadCalendar, saveCalendar, createCalendarFile, } from './loader.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/calendar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,YAAY,EACZ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,kBAAkB,GACnB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Calendar loader - handles loading iCal data from various sources
3
+ */
4
+ import { Calendar } from './calendar.js';
5
+ /**
6
+ * Load a calendar from a file path
7
+ */
8
+ export declare function loadFromFile(filePath: string): Promise<Calendar>;
9
+ /**
10
+ * Load a calendar from an HTTP/HTTPS URL
11
+ */
12
+ export declare function loadFromUrl(url: string): Promise<Calendar>;
13
+ /**
14
+ * Load a calendar from a raw iCal string
15
+ */
16
+ export declare function loadFromString(icalString: string, writable?: boolean): Calendar;
17
+ /**
18
+ * Load a calendar from either a file path or URL
19
+ */
20
+ export declare function loadCalendar(pathOrUrl: string): Promise<Calendar>;
21
+ /**
22
+ * Save a calendar back to its source
23
+ */
24
+ export declare function saveCalendar(calendar: Calendar): Promise<void>;
25
+ /**
26
+ * Create a new empty calendar file
27
+ */
28
+ export declare function createCalendarFile(filePath: string, options?: {
29
+ name?: string;
30
+ timezone?: string;
31
+ }): Promise<Calendar>;
32
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/calendar/loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqBtE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyChE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAc,GAAG,QAAQ,CAerF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAcvE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,QAAQ,CAAC,CA8BnB"}