@sam2kb/m365-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.
package/dist/index.js ADDED
@@ -0,0 +1,152 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * m365-mcp — Production-grade Microsoft 365 MCP server
4
+ *
5
+ * Delegated OAuth device-code flow | Multi-account | Pagination | Rate-limit handling
6
+ *
7
+ * Covers: Email, Calendar, Contacts, OneDrive, Teams, Tasks, Users
8
+ */
9
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
10
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
11
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
12
+ import { GraphClient } from "./graph.js";
13
+ import { registerMailTools, mailToolSchemas } from "./tools/mail.js";
14
+ import { registerCalendarTools, calendarToolSchemas } from "./tools/calendar.js";
15
+ import { registerContactsTools, contactsToolSchemas } from "./tools/contacts.js";
16
+ import { registerFilesTools, filesToolSchemas } from "./tools/files.js";
17
+ import { registerTeamsTools, teamsToolSchemas } from "./tools/teams.js";
18
+ import { registerTasksTools, tasksToolSchemas } from "./tools/tasks.js";
19
+ import { registerUsersTools, usersToolSchemas } from "./tools/users.js";
20
+ // ─── Config ──────────────────────────────────────────────────────────
21
+ const ACCOUNT_NAME = process.env.M365_ACCOUNT || undefined;
22
+ const TIMEZONE = process.env.M365_TIMEZONE || "UTC";
23
+ // ─── Init ────────────────────────────────────────────────────────────
24
+ const client = new GraphClient(TIMEZONE, ACCOUNT_NAME);
25
+ const mailTools = registerMailTools(client);
26
+ const calendarTools = registerCalendarTools(client);
27
+ const contactsTools = registerContactsTools(client);
28
+ const filesTools = registerFilesTools(client);
29
+ const teamsTools = registerTeamsTools(client);
30
+ const tasksTools = registerTasksTools(client);
31
+ const usersTools = registerUsersTools(client);
32
+ // ─── Tool catalog ────────────────────────────────────────────────────
33
+ const allTools = [
34
+ ...mailToolSchemas,
35
+ ...calendarToolSchemas,
36
+ ...contactsToolSchemas,
37
+ ...filesToolSchemas,
38
+ ...teamsToolSchemas,
39
+ ...tasksToolSchemas,
40
+ ...usersToolSchemas,
41
+ ];
42
+ // ─── Tool router ─────────────────────────────────────────────────────
43
+ async function handleToolCall(name, args) {
44
+ // Mail
45
+ if (name === "m365_mail_list")
46
+ return mailTools.mail_list(args);
47
+ if (name === "m365_mail_read")
48
+ return mailTools.mail_read(args);
49
+ if (name === "m365_mail_send")
50
+ return mailTools.mail_send(args);
51
+ if (name === "m365_mail_reply")
52
+ return mailTools.mail_reply(args);
53
+ if (name === "m365_mail_search")
54
+ return mailTools.mail_search(args);
55
+ if (name === "m365_mail_move")
56
+ return mailTools.mail_move(args);
57
+ if (name === "m365_mail_delete")
58
+ return mailTools.mail_delete(args);
59
+ if (name === "m365_mail_mark_read")
60
+ return mailTools.mail_mark_read(args);
61
+ if (name === "m365_mail_folders")
62
+ return mailTools.mail_folders();
63
+ // Calendar
64
+ if (name === "m365_calendar_list")
65
+ return calendarTools.calendar_list(args);
66
+ if (name === "m365_calendar_today")
67
+ return calendarTools.calendar_today();
68
+ if (name === "m365_calendar_week")
69
+ return calendarTools.calendar_week();
70
+ if (name === "m365_calendar_create")
71
+ return calendarTools.calendar_create(args);
72
+ if (name === "m365_calendar_update")
73
+ return calendarTools.calendar_update(args);
74
+ if (name === "m365_calendar_delete")
75
+ return calendarTools.calendar_delete(args);
76
+ if (name === "m365_calendar_availability")
77
+ return calendarTools.calendar_availability(args);
78
+ // Contacts
79
+ if (name === "m365_contacts_list")
80
+ return contactsTools.contacts_list(args);
81
+ if (name === "m365_contacts_search")
82
+ return contactsTools.contacts_search(args);
83
+ if (name === "m365_contacts_read")
84
+ return contactsTools.contacts_read(args);
85
+ if (name === "m365_contacts_create")
86
+ return contactsTools.contacts_create(args);
87
+ if (name === "m365_contacts_update")
88
+ return contactsTools.contacts_update(args);
89
+ if (name === "m365_contacts_delete")
90
+ return contactsTools.contacts_delete(args);
91
+ // Files
92
+ if (name === "m365_files_list")
93
+ return filesTools.files_list(args);
94
+ if (name === "m365_files_search")
95
+ return filesTools.files_search(args);
96
+ if (name === "m365_files_read")
97
+ return filesTools.files_read(args);
98
+ if (name === "m365_files_info")
99
+ return filesTools.files_info(args);
100
+ if (name === "m365_files_create_folder")
101
+ return filesTools.files_create_folder(args);
102
+ // Teams
103
+ if (name === "m365_teams_chats")
104
+ return teamsTools.teams_chats(args);
105
+ if (name === "m365_teams_messages")
106
+ return teamsTools.teams_messages(args);
107
+ if (name === "m365_teams_send")
108
+ return teamsTools.teams_send(args);
109
+ // Tasks
110
+ if (name === "m365_tasks_lists")
111
+ return tasksTools.tasks_lists();
112
+ if (name === "m365_tasks_list")
113
+ return tasksTools.tasks_list(args);
114
+ if (name === "m365_tasks_create")
115
+ return tasksTools.tasks_create(args);
116
+ if (name === "m365_tasks_update")
117
+ return tasksTools.tasks_update(args);
118
+ if (name === "m365_tasks_delete")
119
+ return tasksTools.tasks_delete(args);
120
+ // Users
121
+ if (name === "m365_users_list")
122
+ return usersTools.users_list(args);
123
+ if (name === "m365_users_profile")
124
+ return usersTools.users_profile(args);
125
+ if (name === "m365_users_manager")
126
+ return usersTools.users_manager(args);
127
+ throw new Error(`Unknown tool: ${name}`);
128
+ }
129
+ // ─── MCP Server ──────────────────────────────────────────────────────
130
+ const server = new Server({ name: "m365-mcp", version: "1.0.0" }, { capabilities: { tools: {} } });
131
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
132
+ tools: allTools,
133
+ }));
134
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
135
+ try {
136
+ const result = await handleToolCall(request.params.name, (request.params.arguments ?? {}));
137
+ return { content: [{ type: "text", text: result }] };
138
+ }
139
+ catch (error) {
140
+ return {
141
+ content: [{ type: "text", text: `Error: ${error.message}` }],
142
+ isError: true,
143
+ };
144
+ }
145
+ });
146
+ async function main() {
147
+ const transport = new StdioServerTransport();
148
+ await server.connect(transport);
149
+ console.error(`m365-mcp v1.0.0 running (account: ${ACCOUNT_NAME ?? "default"}, tz: ${TIMEZONE})`);
150
+ }
151
+ main().catch(console.error);
152
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Calendar tools — list, today, week, create, update, delete, availability
3
+ */
4
+ import type { GraphClient } from "../graph.js";
5
+ export declare function registerCalendarTools(client: GraphClient): {
6
+ calendar_list(args: {
7
+ startDateTime?: string;
8
+ endDateTime?: string;
9
+ top?: number;
10
+ }): Promise<string>;
11
+ calendar_today(): Promise<string>;
12
+ calendar_week(): Promise<string>;
13
+ calendar_create(args: {
14
+ subject: string;
15
+ start: string;
16
+ end: string;
17
+ body?: string;
18
+ location?: string;
19
+ attendees?: string;
20
+ isOnline?: boolean;
21
+ }): Promise<string>;
22
+ calendar_update(args: {
23
+ eventId: string;
24
+ subject?: string;
25
+ start?: string;
26
+ end?: string;
27
+ body?: string;
28
+ location?: string;
29
+ }): Promise<string>;
30
+ calendar_delete(args: {
31
+ eventId: string;
32
+ comment?: string;
33
+ }): Promise<string>;
34
+ calendar_availability(args: {
35
+ users: string;
36
+ startDateTime: string;
37
+ endDateTime: string;
38
+ }): Promise<string>;
39
+ };
40
+ export declare const calendarToolSchemas: ({
41
+ name: string;
42
+ description: string;
43
+ inputSchema: {
44
+ type: string;
45
+ properties: {
46
+ startDateTime: {
47
+ type: string;
48
+ description: string;
49
+ };
50
+ endDateTime: {
51
+ type: string;
52
+ description: string;
53
+ };
54
+ top: {
55
+ type: string;
56
+ description: string;
57
+ default: number;
58
+ };
59
+ subject?: undefined;
60
+ start?: undefined;
61
+ end?: undefined;
62
+ body?: undefined;
63
+ location?: undefined;
64
+ attendees?: undefined;
65
+ isOnline?: undefined;
66
+ eventId?: undefined;
67
+ comment?: undefined;
68
+ users?: undefined;
69
+ };
70
+ required?: undefined;
71
+ };
72
+ } | {
73
+ name: string;
74
+ description: string;
75
+ inputSchema: {
76
+ type: string;
77
+ properties: {
78
+ startDateTime?: undefined;
79
+ endDateTime?: undefined;
80
+ top?: undefined;
81
+ subject?: undefined;
82
+ start?: undefined;
83
+ end?: undefined;
84
+ body?: undefined;
85
+ location?: undefined;
86
+ attendees?: undefined;
87
+ isOnline?: undefined;
88
+ eventId?: undefined;
89
+ comment?: undefined;
90
+ users?: undefined;
91
+ };
92
+ required?: undefined;
93
+ };
94
+ } | {
95
+ name: string;
96
+ description: string;
97
+ inputSchema: {
98
+ type: string;
99
+ properties: {
100
+ subject: {
101
+ type: string;
102
+ description: string;
103
+ };
104
+ start: {
105
+ type: string;
106
+ description: string;
107
+ };
108
+ end: {
109
+ type: string;
110
+ description: string;
111
+ };
112
+ body: {
113
+ type: string;
114
+ description: string;
115
+ };
116
+ location: {
117
+ type: string;
118
+ description: string;
119
+ };
120
+ attendees: {
121
+ type: string;
122
+ description: string;
123
+ };
124
+ isOnline: {
125
+ type: string;
126
+ description: string;
127
+ };
128
+ startDateTime?: undefined;
129
+ endDateTime?: undefined;
130
+ top?: undefined;
131
+ eventId?: undefined;
132
+ comment?: undefined;
133
+ users?: undefined;
134
+ };
135
+ required: string[];
136
+ };
137
+ } | {
138
+ name: string;
139
+ description: string;
140
+ inputSchema: {
141
+ type: string;
142
+ properties: {
143
+ eventId: {
144
+ type: string;
145
+ description: string;
146
+ };
147
+ subject: {
148
+ type: string;
149
+ description: string;
150
+ };
151
+ start: {
152
+ type: string;
153
+ description: string;
154
+ };
155
+ end: {
156
+ type: string;
157
+ description: string;
158
+ };
159
+ body: {
160
+ type: string;
161
+ description: string;
162
+ };
163
+ location: {
164
+ type: string;
165
+ description: string;
166
+ };
167
+ startDateTime?: undefined;
168
+ endDateTime?: undefined;
169
+ top?: undefined;
170
+ attendees?: undefined;
171
+ isOnline?: undefined;
172
+ comment?: undefined;
173
+ users?: undefined;
174
+ };
175
+ required: string[];
176
+ };
177
+ } | {
178
+ name: string;
179
+ description: string;
180
+ inputSchema: {
181
+ type: string;
182
+ properties: {
183
+ eventId: {
184
+ type: string;
185
+ description: string;
186
+ };
187
+ comment: {
188
+ type: string;
189
+ description: string;
190
+ };
191
+ startDateTime?: undefined;
192
+ endDateTime?: undefined;
193
+ top?: undefined;
194
+ subject?: undefined;
195
+ start?: undefined;
196
+ end?: undefined;
197
+ body?: undefined;
198
+ location?: undefined;
199
+ attendees?: undefined;
200
+ isOnline?: undefined;
201
+ users?: undefined;
202
+ };
203
+ required: string[];
204
+ };
205
+ } | {
206
+ name: string;
207
+ description: string;
208
+ inputSchema: {
209
+ type: string;
210
+ properties: {
211
+ users: {
212
+ type: string;
213
+ description: string;
214
+ };
215
+ startDateTime: {
216
+ type: string;
217
+ description: string;
218
+ };
219
+ endDateTime: {
220
+ type: string;
221
+ description: string;
222
+ };
223
+ top?: undefined;
224
+ subject?: undefined;
225
+ start?: undefined;
226
+ end?: undefined;
227
+ body?: undefined;
228
+ location?: undefined;
229
+ attendees?: undefined;
230
+ isOnline?: undefined;
231
+ eventId?: undefined;
232
+ comment?: undefined;
233
+ };
234
+ required: string[];
235
+ };
236
+ })[];
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Calendar tools — list, today, week, create, update, delete, availability
3
+ */
4
+ /** Build ISO 8601 start/end strings for a day in the given timezone. */
5
+ function tzDayBounds(timezone, offsetDays = 0) {
6
+ const d = new Date(Date.now() + offsetDays * 86400000);
7
+ const dateStr = d.toLocaleDateString("en-CA", { timeZone: timezone }); // "2026-07-18"
8
+ // Determine the UTC offset at noon (DST-safe) via formatToParts
9
+ const parts = Intl.DateTimeFormat("en-US", {
10
+ timeZone: timezone,
11
+ hour12: false,
12
+ year: "numeric",
13
+ month: "2-digit",
14
+ day: "2-digit",
15
+ hour: "2-digit",
16
+ minute: "2-digit",
17
+ timeZoneName: "longOffset",
18
+ }).formatToParts(d);
19
+ let offset = "+00:00";
20
+ const tzPart = parts.find((p) => p.type === "timeZoneName")?.value ?? "";
21
+ const m = tzPart.match(/GMT([+-]\d{1,2}):?(\d{2})?/);
22
+ if (m)
23
+ offset = `${m[1]}:${m[2] || "00"}`;
24
+ return {
25
+ startDateTime: `${dateStr}T00:00:00${offset}`,
26
+ endDateTime: `${dateStr}T23:59:59${offset}`,
27
+ };
28
+ }
29
+ export function registerCalendarTools(client) {
30
+ const user = "/me";
31
+ return {
32
+ // ── list ─────────────────────────────────────────────────────
33
+ async calendar_list(args) {
34
+ const top = args.top || 50;
35
+ let path;
36
+ if (args.startDateTime && args.endDateTime) {
37
+ path = `${user}/calendarView?startDateTime=${encodeURIComponent(args.startDateTime)}&endDateTime=${encodeURIComponent(args.endDateTime)}&$top=${top}&$orderby=start/dateTime&$select=id,subject,start,end,location,isOnlineMeeting,onlineMeetingUrl,organizer,attendees,isAllDay,webLink`;
38
+ }
39
+ else {
40
+ path = `${user}/events?$top=${top}&$orderby=start/dateTime&$select=id,subject,start,end,location,isOnlineMeeting,onlineMeetingUrl,organizer,attendees,isAllDay,webLink`;
41
+ }
42
+ const events = await client.getAll(path, 10, top);
43
+ return JSON.stringify(events.map((e) => ({
44
+ id: e.id,
45
+ subject: e.subject,
46
+ start: e.start,
47
+ end: e.end,
48
+ isAllDay: e.isAllDay,
49
+ location: e.location?.displayName,
50
+ isOnline: e.isOnlineMeeting,
51
+ meetingUrl: e.onlineMeetingUrl,
52
+ organizer: e.organizer?.emailAddress?.name ?? e.organizer?.emailAddress?.address,
53
+ attendees: e.attendees?.length ?? 0,
54
+ webLink: e.webLink,
55
+ })), null, 2);
56
+ },
57
+ // ── today ────────────────────────────────────────────────────
58
+ async calendar_today() {
59
+ const bounds = tzDayBounds(client.timezone);
60
+ const path = `${user}/calendarView?startDateTime=${encodeURIComponent(bounds.startDateTime)}&endDateTime=${encodeURIComponent(bounds.endDateTime)}&$top=50&$orderby=start/dateTime`;
61
+ const events = await client.getAll(path, 10, 50);
62
+ if (events.length === 0)
63
+ return "No events today.";
64
+ const now = new Date();
65
+ const lines = events.map((e) => {
66
+ const startTime = new Date(e.start.dateTime + (e.start.dateTime.endsWith("Z") ? "" : "Z"));
67
+ const endTime = new Date(e.end.dateTime + (e.end.dateTime.endsWith("Z") ? "" : "Z"));
68
+ const time = e.isAllDay
69
+ ? "All Day"
70
+ : `${startTime.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit" })}–${endTime.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit" })}`;
71
+ let line = `${time} ${e.subject}`;
72
+ if (e.location?.displayName)
73
+ line += ` 📍 ${e.location.displayName}`;
74
+ if (e.isOnlineMeeting)
75
+ line += ` 🎥`;
76
+ return line;
77
+ });
78
+ return `Today (${now.toLocaleDateString("en-US", { weekday: "long", month: "long", day: "numeric" })})\n${lines.join("\n")}\n\n${events.length} event${events.length !== 1 ? "s" : ""}`;
79
+ },
80
+ // ── week ─────────────────────────────────────────────────────
81
+ async calendar_week() {
82
+ const startBounds = tzDayBounds(client.timezone, 0);
83
+ const endBounds = tzDayBounds(client.timezone, 6);
84
+ const path = `${user}/calendarView?startDateTime=${encodeURIComponent(startBounds.startDateTime)}&endDateTime=${encodeURIComponent(endBounds.endDateTime)}&$top=100&$orderby=start/dateTime`;
85
+ const events = await client.getAll(path, 10, 100);
86
+ if (events.length === 0)
87
+ return "No events this week.";
88
+ const byDay = new Map();
89
+ for (const e of events) {
90
+ const d = new Date(e.start.dateTime + (e.start.dateTime.endsWith("Z") ? "" : "Z"));
91
+ const key = d.toLocaleDateString("en-US", { weekday: "short", month: "short", day: "numeric" });
92
+ const startTime = d.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit" });
93
+ let line = ` ${e.isAllDay ? "All Day" : startTime} ${e.subject}`;
94
+ if (e.location?.displayName)
95
+ line += ` 📍 ${e.location.displayName}`;
96
+ if (e.isOnlineMeeting)
97
+ line += ` 🎥`;
98
+ if (!byDay.has(key))
99
+ byDay.set(key, []);
100
+ byDay.get(key).push(line);
101
+ }
102
+ let out = "";
103
+ for (const [day, lines] of byDay) {
104
+ out += `\n${day}\n${lines.join("\n")}\n`;
105
+ }
106
+ return `This Week\n${out}\n${events.length} events`;
107
+ },
108
+ // ── create ───────────────────────────────────────────────────
109
+ async calendar_create(args) {
110
+ const event = {
111
+ subject: args.subject,
112
+ start: client.dateTimeStr(args.start),
113
+ end: client.dateTimeStr(args.end),
114
+ };
115
+ if (args.body)
116
+ event.body = { contentType: "HTML", content: args.body };
117
+ if (args.location)
118
+ event.location = { displayName: args.location };
119
+ if (args.attendees) {
120
+ event.attendees = args.attendees.split(",").map((s) => ({
121
+ emailAddress: { address: s.trim() },
122
+ type: "required",
123
+ }));
124
+ }
125
+ if (args.isOnline)
126
+ event.isOnlineMeeting = true;
127
+ const data = await client.post(`${user}/events`, event);
128
+ return JSON.stringify({
129
+ id: data.id,
130
+ subject: data.subject,
131
+ webLink: data.webLink,
132
+ onlineMeetingUrl: data.onlineMeetingUrl,
133
+ }, null, 2);
134
+ },
135
+ // ── update ───────────────────────────────────────────────────
136
+ async calendar_update(args) {
137
+ const patch = {};
138
+ if (args.subject)
139
+ patch.subject = args.subject;
140
+ if (args.start)
141
+ patch.start = client.dateTimeStr(args.start);
142
+ if (args.end)
143
+ patch.end = client.dateTimeStr(args.end);
144
+ if (args.body)
145
+ patch.body = { contentType: "HTML", content: args.body };
146
+ if (args.location)
147
+ patch.location = { displayName: args.location };
148
+ const eventId = encodeURIComponent(args.eventId);
149
+ await client.patch(`${user}/events/${eventId}`, patch);
150
+ return JSON.stringify({ success: true, eventId: args.eventId });
151
+ },
152
+ // ── delete ───────────────────────────────────────────────────
153
+ async calendar_delete(args) {
154
+ const eventId = encodeURIComponent(args.eventId);
155
+ await client.post(`${user}/events/${eventId}/cancel`, {
156
+ comment: args.comment || "",
157
+ });
158
+ return JSON.stringify({ success: true, eventId: args.eventId });
159
+ },
160
+ // ── availability ─────────────────────────────────────────────
161
+ async calendar_availability(args) {
162
+ const schedules = args.users.split(",").map((s) => s.trim());
163
+ const data = await client.post(`${user}/calendar/getSchedule`, {
164
+ schedules,
165
+ startTime: client.dateTimeStr(args.startDateTime),
166
+ endTime: client.dateTimeStr(args.endDateTime),
167
+ availabilityViewInterval: 30,
168
+ });
169
+ return JSON.stringify(data.value, null, 2);
170
+ },
171
+ };
172
+ }
173
+ export const calendarToolSchemas = [
174
+ {
175
+ name: "m365_calendar_list",
176
+ description: "List calendar events in a date range (or upcoming if no range)",
177
+ inputSchema: {
178
+ type: "object",
179
+ properties: {
180
+ startDateTime: { type: "string", description: "Start datetime (ISO 8601)" },
181
+ endDateTime: { type: "string", description: "End datetime (ISO 8601)" },
182
+ top: { type: "number", description: "Max events", default: 50 },
183
+ },
184
+ },
185
+ },
186
+ {
187
+ name: "m365_calendar_today",
188
+ description: "Show today's calendar events",
189
+ inputSchema: { type: "object", properties: {} },
190
+ },
191
+ {
192
+ name: "m365_calendar_week",
193
+ description: "Show this week's calendar events grouped by day",
194
+ inputSchema: { type: "object", properties: {} },
195
+ },
196
+ {
197
+ name: "m365_calendar_create",
198
+ description: "Create a calendar event (with optional Teams meeting)",
199
+ inputSchema: {
200
+ type: "object",
201
+ properties: {
202
+ subject: { type: "string", description: "Event title" },
203
+ start: { type: "string", description: "Start datetime (ISO 8601)" },
204
+ end: { type: "string", description: "End datetime (ISO 8601)" },
205
+ body: { type: "string", description: "Event description (HTML)" },
206
+ location: { type: "string", description: "Event location" },
207
+ attendees: { type: "string", description: "Attendee emails, comma-separated" },
208
+ isOnline: { type: "boolean", description: "Create as Teams meeting" },
209
+ },
210
+ required: ["subject", "start", "end"],
211
+ },
212
+ },
213
+ {
214
+ name: "m365_calendar_update",
215
+ description: "Update an existing calendar event",
216
+ inputSchema: {
217
+ type: "object",
218
+ properties: {
219
+ eventId: { type: "string", description: "Event ID" },
220
+ subject: { type: "string", description: "New subject" },
221
+ start: { type: "string", description: "New start time (ISO 8601)" },
222
+ end: { type: "string", description: "New end time (ISO 8601)" },
223
+ body: { type: "string", description: "New description" },
224
+ location: { type: "string", description: "New location" },
225
+ },
226
+ required: ["eventId"],
227
+ },
228
+ },
229
+ {
230
+ name: "m365_calendar_delete",
231
+ description: "Cancel/delete a calendar event",
232
+ inputSchema: {
233
+ type: "object",
234
+ properties: {
235
+ eventId: { type: "string", description: "Event ID" },
236
+ comment: { type: "string", description: "Cancellation message to attendees" },
237
+ },
238
+ required: ["eventId"],
239
+ },
240
+ },
241
+ {
242
+ name: "m365_calendar_availability",
243
+ description: "Check free/busy availability for users",
244
+ inputSchema: {
245
+ type: "object",
246
+ properties: {
247
+ users: { type: "string", description: "User emails to check, comma-separated" },
248
+ startDateTime: { type: "string", description: "Start (ISO 8601)" },
249
+ endDateTime: { type: "string", description: "End (ISO 8601)" },
250
+ },
251
+ required: ["users", "startDateTime", "endDateTime"],
252
+ },
253
+ },
254
+ ];
255
+ //# 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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"}