@littlebearapps/outlook-assistant 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/.env.example +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +422 -0
  4. package/advanced/index.js +652 -0
  5. package/auth/index.js +32 -0
  6. package/auth/oauth-server.js +233 -0
  7. package/auth/token-manager.js +105 -0
  8. package/auth/token-storage.js +359 -0
  9. package/auth/tools.js +159 -0
  10. package/calendar/accept.js +72 -0
  11. package/calendar/cancel.js +72 -0
  12. package/calendar/create.js +115 -0
  13. package/calendar/decline.js +72 -0
  14. package/calendar/delete.js +67 -0
  15. package/calendar/index.js +130 -0
  16. package/calendar/list.js +108 -0
  17. package/categories/index.js +955 -0
  18. package/config.js +95 -0
  19. package/contacts/index.js +754 -0
  20. package/email/attachments.js +365 -0
  21. package/email/conversations.js +666 -0
  22. package/email/delta.js +210 -0
  23. package/email/export.js +572 -0
  24. package/email/folder-utils.js +192 -0
  25. package/email/headers.js +344 -0
  26. package/email/index.js +537 -0
  27. package/email/list.js +136 -0
  28. package/email/mark-as-read.js +114 -0
  29. package/email/mime.js +286 -0
  30. package/email/read.js +161 -0
  31. package/email/search.js +628 -0
  32. package/email/send.js +169 -0
  33. package/folder/create.js +137 -0
  34. package/folder/delete.js +108 -0
  35. package/folder/index.js +112 -0
  36. package/folder/list.js +289 -0
  37. package/folder/move.js +186 -0
  38. package/folder/stats.js +322 -0
  39. package/index.js +162 -0
  40. package/llms.txt +76 -0
  41. package/outlook-auth-server.js +384 -0
  42. package/package.json +97 -0
  43. package/rules/create.js +273 -0
  44. package/rules/index.js +276 -0
  45. package/rules/list.js +216 -0
  46. package/settings/index.js +678 -0
  47. package/utils/field-presets.js +311 -0
  48. package/utils/graph-api.js +268 -0
  49. package/utils/mock-data.js +154 -0
  50. package/utils/odata-helpers.js +33 -0
  51. package/utils/response-formatter.js +457 -0
  52. package/utils/safety.js +123 -0
@@ -0,0 +1,108 @@
1
+ /**
2
+ * List events functionality
3
+ */
4
+ const config = require('../config');
5
+ const { callGraphAPI } = require('../utils/graph-api');
6
+ const { ensureAuthenticated } = require('../auth');
7
+
8
+ /**
9
+ * List events handler
10
+ * @param {object} args - Tool arguments
11
+ * @returns {object} - MCP response
12
+ */
13
+ async function handleListEvents(args) {
14
+ const count = Math.min(args.count || 10, config.MAX_RESULT_COUNT);
15
+
16
+ try {
17
+ // Get access token
18
+ const accessToken = await ensureAuthenticated();
19
+
20
+ // Build API endpoint
21
+ let endpoint = 'me/events';
22
+
23
+ // Add query parameters
24
+ const queryParams = {
25
+ $top: count,
26
+ $orderby: 'start/dateTime',
27
+ $filter: `start/dateTime ge '${new Date().toISOString()}'`,
28
+ $select: config.CALENDAR_SELECT_FIELDS,
29
+ };
30
+
31
+ // Make API call
32
+ const response = await callGraphAPI(
33
+ accessToken,
34
+ 'GET',
35
+ endpoint,
36
+ null,
37
+ queryParams
38
+ );
39
+
40
+ if (!response.value || response.value.length === 0) {
41
+ return {
42
+ content: [
43
+ {
44
+ type: 'text',
45
+ text: 'No calendar events found.',
46
+ },
47
+ ],
48
+ };
49
+ }
50
+
51
+ // Format results
52
+ const tz = config.DEFAULT_TIMEZONE;
53
+ const eventList = response.value
54
+ .map((event, index) => {
55
+ const startDt = event.start.dateTime.endsWith('Z')
56
+ ? event.start.dateTime
57
+ : event.start.dateTime + 'Z';
58
+ const endDt = event.end.dateTime.endsWith('Z')
59
+ ? event.end.dateTime
60
+ : event.end.dateTime + 'Z';
61
+ const startDate = new Date(startDt).toLocaleString('en-AU', {
62
+ timeZone: tz,
63
+ dateStyle: 'medium',
64
+ timeStyle: 'short',
65
+ });
66
+ const endDate = new Date(endDt).toLocaleString('en-AU', {
67
+ timeZone: tz,
68
+ dateStyle: 'medium',
69
+ timeStyle: 'short',
70
+ });
71
+ const location = event.location.displayName || 'No location';
72
+
73
+ return `${index + 1}. ${event.subject} - Location: ${location}\nStart: ${startDate}\nEnd: ${endDate}\nSummary: ${event.bodyPreview}\nID: ${event.id}\n`;
74
+ })
75
+ .join('\n');
76
+
77
+ return {
78
+ content: [
79
+ {
80
+ type: 'text',
81
+ text: `Found ${response.value.length} events:\n\n${eventList}`,
82
+ },
83
+ ],
84
+ };
85
+ } catch (error) {
86
+ if (error.message === 'Authentication required') {
87
+ return {
88
+ content: [
89
+ {
90
+ type: 'text',
91
+ text: "Authentication required. Please use the 'authenticate' tool first.",
92
+ },
93
+ ],
94
+ };
95
+ }
96
+
97
+ return {
98
+ content: [
99
+ {
100
+ type: 'text',
101
+ text: `Error listing events: ${error.message}`,
102
+ },
103
+ ],
104
+ };
105
+ }
106
+ }
107
+
108
+ module.exports = handleListEvents;