@sam2kb/m365-mcp 1.1.1 → 1.2.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/README.md CHANGED
@@ -33,7 +33,7 @@ as reviewed on July 18, 2026.
33
33
  | Tasks | ✅ | ❌ | ✅ |
34
34
  | Users | ✅ | ❌ | ✅ |
35
35
  | Implementation | TypeScript | JavaScript CLI | TypeScript |
36
- | Interface coverage | 19 MCP tools | CLI scripts | **46 MCP tools** |
36
+ | Interface coverage | 19 MCP tools | CLI scripts | **47 MCP tools** |
37
37
 
38
38
  `m365-mcp` does not store a client secret or password. Tenant and client IDs are
39
39
  non-secret identifiers; sensitive OAuth access and refresh tokens are stored
@@ -209,7 +209,7 @@ Changing an account's tenant or client ID clears that account's cached tokens.
209
209
  Sign in again after changing permissions or the read-only/directory settings.
210
210
  Login checks cached permissions before reusing a token.
211
211
 
212
- ## Available Tools (46)
212
+ ## Available Tools (47)
213
213
 
214
214
  ### 📧 Mail (9 tools)
215
215
  | Tool | Description |
@@ -224,10 +224,11 @@ Login checks cached permissions before reusing a token.
224
224
  | `m365_mail_mark_read` | Mark as read/unread |
225
225
  | `m365_mail_folders` | List all mail folders with counts |
226
226
 
227
- ### 📅 Calendar (9 tools)
227
+ ### 📅 Calendar (10 tools)
228
228
  | Tool | Description |
229
229
  |---|---|
230
230
  | `m365_calendar_list` | Events in a date range (paginated) |
231
+ | `m365_calendar_get` | Read an event and its notes, with bounded output and truncation status |
231
232
  | `m365_calendar_today` | Today's events, nicely formatted |
232
233
  | `m365_calendar_week` | Week view grouped by day |
233
234
  | `m365_calendar_create` | Create event (optional Teams meeting) |
@@ -237,6 +238,29 @@ Login checks cached permissions before reusing a token.
237
238
  | `m365_calendar_decline` | Decline an invitation as an attendee |
238
239
  | `m365_calendar_availability` | Free/busy lookup |
239
240
 
241
+ #### Event notes and specific calendars
242
+
243
+ `m365_calendar_list`, `m365_calendar_get`, `m365_calendar_create`, and
244
+ `m365_calendar_update` accept an optional `calendarId` for a calendar under the
245
+ signed-in user's `/me/calendars` collection. Omitting it preserves the existing
246
+ `/me/events` or `/me/calendarView` behavior. IDs are opaque values, not URLs.
247
+
248
+ Use `m365_calendar_get` with `eventId` to read notes. It returns
249
+ `body: { contentType, content }`, `bodyLength`, and `bodyTruncated`. The default
250
+ limit is 10,000 UTF-16 code units; `maxBodyChars` accepts integers from 0 to 50,000.
251
+ Zero returns only body metadata. The tool preserves the format returned by
252
+ Graph, which defaults to HTML; truncated HTML may be incomplete. List results remain
253
+ compact and do not include full notes. Do not mistake truncated notes for the
254
+ complete event body or write the truncated result back as a replacement.
255
+
256
+ Create and update accept `bodyContentType: "text" | "html"` when supplying
257
+ `body`; the default remains `"html"`. On update, omitting `body` leaves notes
258
+ unchanged, while `body: ""` explicitly clears them. A body update replaces the
259
+ existing notes; for online meetings, preserve the meeting details in that body.
260
+ These operations use the existing delegated `Calendars.Read` /
261
+ `Calendars.ReadWrite` permissions, with no additional OAuth scopes. The new get
262
+ tool is available in read-only mode; create and update remain blocked there.
263
+
240
264
  Calendar listings include `isOrganizer` and `responseStatus` so clients can
241
265
  choose the correct action. Cancellation is organizer-only and notifies attendees;
242
266
  decline is attendee-only. There is no ambiguous silent-remove tool.
package/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: m365-mcp
3
- description: Production-grade Microsoft 365 MCP server with delegated OAuth, multi-account support, pagination, rate limiting, and 46 tools covering email, calendar, contacts, OneDrive, Teams, tasks, and users.
3
+ description: Production-grade Microsoft 365 MCP server with delegated OAuth, multi-account support, pagination, rate limiting, and 47 tools covering email, calendar, contacts, OneDrive, Teams, tasks, and users.
4
4
  metadata:
5
5
  openclaw:
6
6
  homepage: https://github.com/sam2kb/m365-mcp#readme
@@ -48,9 +48,14 @@ Production-grade Microsoft 365 MCP server combining the best of office365-connec
48
48
 
49
49
  - List, read, send, reply, search, move, delete, mark read/unread, list folders
50
50
 
51
- ### Calendar (9 tools)
51
+ ### Calendar (10 tools)
52
52
 
53
- - List events with organizer/response status, today view, week view, create (with Teams meeting), update, explicit organizer cancellation, attendee decline, free/busy
53
+ - List events with organizer/response status, read event notes, today view, week view, create (with Teams meeting), update, explicit organizer cancellation, attendee decline, free/busy
54
+
55
+ List, get, create, and update accept an optional calendar ID. Note reads include
56
+ body format, full length, and truncation status. Do not write truncated notes
57
+ back as a complete body. When replacing online-meeting notes, preserve the
58
+ meeting details in the body.
54
59
 
55
60
  ### Contacts (12 tools)
56
61
 
package/dist/index.js CHANGED
@@ -70,6 +70,8 @@ async function handleToolCall(name, args) {
70
70
  // Calendar
71
71
  if (name === "m365_calendar_list")
72
72
  return calendarTools.calendar_list(args);
73
+ if (name === "m365_calendar_get")
74
+ return calendarTools.calendar_get(args);
73
75
  if (name === "m365_calendar_today")
74
76
  return calendarTools.calendar_today();
75
77
  if (name === "m365_calendar_week")
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/security.js CHANGED
@@ -7,6 +7,7 @@ const READ_ONLY_TOOLS = new Set([
7
7
  "m365_mail_search",
8
8
  "m365_mail_folders",
9
9
  "m365_calendar_list",
10
+ "m365_calendar_get",
10
11
  "m365_calendar_today",
11
12
  "m365_calendar_week",
12
13
  "m365_calendar_availability",
@@ -1 +1 @@
1
- {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Calendar tools — list, today, week, create, update, cancel, decline, availability
2
+ * Calendar tools — list, get, today, week, create, update, cancel, decline, availability
3
3
  */
4
4
  import type { GraphClient } from "../graph.js";
5
5
  /** Build ISO 8601 start/end strings for a day in the given timezone. */
@@ -9,27 +9,37 @@ export declare function tzDayBounds(timezone: string, offsetDays?: number): {
9
9
  };
10
10
  export declare function registerCalendarTools(client: GraphClient): {
11
11
  calendar_list(args: {
12
+ calendarId?: string;
12
13
  startDateTime?: string;
13
14
  endDateTime?: string;
14
15
  top?: number;
15
16
  }): Promise<string>;
17
+ calendar_get(args: {
18
+ eventId: string;
19
+ calendarId?: string;
20
+ maxBodyChars?: number;
21
+ }): Promise<string>;
16
22
  calendar_today(): Promise<string>;
17
23
  calendar_week(): Promise<string>;
18
24
  calendar_create(args: {
25
+ calendarId?: string;
19
26
  subject: string;
20
27
  start: string;
21
28
  end: string;
22
29
  body?: string;
30
+ bodyContentType?: "text" | "html";
23
31
  location?: string;
24
32
  attendees?: string;
25
33
  isOnline?: boolean;
26
34
  }): Promise<string>;
27
35
  calendar_update(args: {
28
36
  eventId: string;
37
+ calendarId?: string;
29
38
  subject?: string;
30
39
  start?: string;
31
40
  end?: string;
32
41
  body?: string;
42
+ bodyContentType?: "text" | "html";
33
43
  location?: string;
34
44
  }): Promise<string>;
35
45
  calendar_delete(args: {
@@ -57,6 +67,11 @@ export declare const calendarToolSchemas: ({
57
67
  inputSchema: {
58
68
  type: string;
59
69
  properties: {
70
+ calendarId: {
71
+ type: string;
72
+ minLength: number;
73
+ description: string;
74
+ };
60
75
  startDateTime: {
61
76
  type: string;
62
77
  description: string;
@@ -72,14 +87,16 @@ export declare const calendarToolSchemas: ({
72
87
  description: string;
73
88
  default: number;
74
89
  };
90
+ eventId?: undefined;
91
+ maxBodyChars?: undefined;
75
92
  subject?: undefined;
76
93
  start?: undefined;
77
94
  end?: undefined;
78
95
  body?: undefined;
96
+ bodyContentType?: undefined;
79
97
  location?: undefined;
80
98
  attendees?: undefined;
81
99
  isOnline?: undefined;
82
- eventId?: undefined;
83
100
  comment?: undefined;
84
101
  sendResponse?: undefined;
85
102
  users?: undefined;
@@ -92,6 +109,23 @@ export declare const calendarToolSchemas: ({
92
109
  inputSchema: {
93
110
  type: string;
94
111
  properties: {
112
+ eventId: {
113
+ type: string;
114
+ minLength: number;
115
+ description: string;
116
+ };
117
+ calendarId: {
118
+ type: string;
119
+ minLength: number;
120
+ description: string;
121
+ };
122
+ maxBodyChars: {
123
+ type: string;
124
+ minimum: number;
125
+ maximum: number;
126
+ default: number;
127
+ description: string;
128
+ };
95
129
  startDateTime?: undefined;
96
130
  endDateTime?: undefined;
97
131
  top?: undefined;
@@ -99,10 +133,36 @@ export declare const calendarToolSchemas: ({
99
133
  start?: undefined;
100
134
  end?: undefined;
101
135
  body?: undefined;
136
+ bodyContentType?: undefined;
102
137
  location?: undefined;
103
138
  attendees?: undefined;
104
139
  isOnline?: undefined;
140
+ comment?: undefined;
141
+ sendResponse?: undefined;
142
+ users?: undefined;
143
+ };
144
+ required: string[];
145
+ };
146
+ } | {
147
+ name: string;
148
+ description: string;
149
+ inputSchema: {
150
+ type: string;
151
+ properties: {
152
+ calendarId?: undefined;
153
+ startDateTime?: undefined;
154
+ endDateTime?: undefined;
155
+ top?: undefined;
105
156
  eventId?: undefined;
157
+ maxBodyChars?: undefined;
158
+ subject?: undefined;
159
+ start?: undefined;
160
+ end?: undefined;
161
+ body?: undefined;
162
+ bodyContentType?: undefined;
163
+ location?: undefined;
164
+ attendees?: undefined;
165
+ isOnline?: undefined;
106
166
  comment?: undefined;
107
167
  sendResponse?: undefined;
108
168
  users?: undefined;
@@ -115,6 +175,11 @@ export declare const calendarToolSchemas: ({
115
175
  inputSchema: {
116
176
  type: string;
117
177
  properties: {
178
+ calendarId: {
179
+ type: string;
180
+ minLength: number;
181
+ description: string;
182
+ };
118
183
  subject: {
119
184
  type: string;
120
185
  description: string;
@@ -131,6 +196,12 @@ export declare const calendarToolSchemas: ({
131
196
  type: string;
132
197
  description: string;
133
198
  };
199
+ bodyContentType: {
200
+ type: string;
201
+ enum: string[];
202
+ default: string;
203
+ description: string;
204
+ };
134
205
  location: {
135
206
  type: string;
136
207
  description: string;
@@ -147,6 +218,7 @@ export declare const calendarToolSchemas: ({
147
218
  endDateTime?: undefined;
148
219
  top?: undefined;
149
220
  eventId?: undefined;
221
+ maxBodyChars?: undefined;
150
222
  comment?: undefined;
151
223
  sendResponse?: undefined;
152
224
  users?: undefined;
@@ -162,6 +234,12 @@ export declare const calendarToolSchemas: ({
162
234
  eventId: {
163
235
  type: string;
164
236
  description: string;
237
+ minLength?: undefined;
238
+ };
239
+ calendarId: {
240
+ type: string;
241
+ minLength: number;
242
+ description: string;
165
243
  };
166
244
  subject: {
167
245
  type: string;
@@ -179,6 +257,12 @@ export declare const calendarToolSchemas: ({
179
257
  type: string;
180
258
  description: string;
181
259
  };
260
+ bodyContentType: {
261
+ type: string;
262
+ enum: string[];
263
+ default: string;
264
+ description: string;
265
+ };
182
266
  location: {
183
267
  type: string;
184
268
  description: string;
@@ -186,6 +270,7 @@ export declare const calendarToolSchemas: ({
186
270
  startDateTime?: undefined;
187
271
  endDateTime?: undefined;
188
272
  top?: undefined;
273
+ maxBodyChars?: undefined;
189
274
  attendees?: undefined;
190
275
  isOnline?: undefined;
191
276
  comment?: undefined;
@@ -203,18 +288,22 @@ export declare const calendarToolSchemas: ({
203
288
  eventId: {
204
289
  type: string;
205
290
  description: string;
291
+ minLength?: undefined;
206
292
  };
207
293
  comment: {
208
294
  type: string;
209
295
  description: string;
210
296
  };
297
+ calendarId?: undefined;
211
298
  startDateTime?: undefined;
212
299
  endDateTime?: undefined;
213
300
  top?: undefined;
301
+ maxBodyChars?: undefined;
214
302
  subject?: undefined;
215
303
  start?: undefined;
216
304
  end?: undefined;
217
305
  body?: undefined;
306
+ bodyContentType?: undefined;
218
307
  location?: undefined;
219
308
  attendees?: undefined;
220
309
  isOnline?: undefined;
@@ -232,6 +321,7 @@ export declare const calendarToolSchemas: ({
232
321
  eventId: {
233
322
  type: string;
234
323
  description: string;
324
+ minLength?: undefined;
235
325
  };
236
326
  comment: {
237
327
  type: string;
@@ -241,13 +331,16 @@ export declare const calendarToolSchemas: ({
241
331
  type: string;
242
332
  description: string;
243
333
  };
334
+ calendarId?: undefined;
244
335
  startDateTime?: undefined;
245
336
  endDateTime?: undefined;
246
337
  top?: undefined;
338
+ maxBodyChars?: undefined;
247
339
  subject?: undefined;
248
340
  start?: undefined;
249
341
  end?: undefined;
250
342
  body?: undefined;
343
+ bodyContentType?: undefined;
251
344
  location?: undefined;
252
345
  attendees?: undefined;
253
346
  isOnline?: undefined;
@@ -273,15 +366,18 @@ export declare const calendarToolSchemas: ({
273
366
  type: string;
274
367
  description: string;
275
368
  };
369
+ calendarId?: undefined;
276
370
  top?: undefined;
371
+ eventId?: undefined;
372
+ maxBodyChars?: undefined;
277
373
  subject?: undefined;
278
374
  start?: undefined;
279
375
  end?: undefined;
280
376
  body?: undefined;
377
+ bodyContentType?: undefined;
281
378
  location?: undefined;
282
379
  attendees?: undefined;
283
380
  isOnline?: undefined;
284
- eventId?: undefined;
285
381
  comment?: undefined;
286
382
  sendResponse?: undefined;
287
383
  };
@@ -1,7 +1,21 @@
1
1
  /**
2
- * Calendar tools — list, today, week, create, update, cancel, decline, availability
2
+ * Calendar tools — list, get, today, week, create, update, cancel, decline, availability
3
3
  */
4
4
  import { normalizeTop } from "../validation.js";
5
+ function calendarScope(calendarId) {
6
+ if (calendarId === undefined)
7
+ return "/me";
8
+ if (typeof calendarId !== "string" || !calendarId.trim() || calendarId === "." || calendarId === "..") {
9
+ throw new Error("calendarId must be a non-empty calendar ID");
10
+ }
11
+ return `/me/calendars/${encodeURIComponent(calendarId)}`;
12
+ }
13
+ function noteBody(content, contentType = "html") {
14
+ if (typeof content !== "string" || (contentType !== "text" && contentType !== "html")) {
15
+ throw new Error("body must be a string and bodyContentType must be text or html");
16
+ }
17
+ return { contentType: contentType === "text" ? "Text" : "HTML", content };
18
+ }
5
19
  /** Build ISO 8601 start/end strings for a day in the given timezone. */
6
20
  export function tzDayBounds(timezone, offsetDays = 0) {
7
21
  const parts = new Intl.DateTimeFormat("en-US", {
@@ -48,14 +62,15 @@ export function registerCalendarTools(client) {
48
62
  // ── list ─────────────────────────────────────────────────────
49
63
  async calendar_list(args) {
50
64
  const top = normalizeTop(args.top, 50);
65
+ const scope = calendarScope(args.calendarId);
51
66
  if (!!args.startDateTime !== !!args.endDateTime)
52
67
  throw new Error("Provide both startDateTime and endDateTime");
53
68
  let path;
54
69
  if (args.startDateTime && args.endDateTime) {
55
- path = `${user}/calendarView?startDateTime=${encodeURIComponent(args.startDateTime)}&endDateTime=${encodeURIComponent(args.endDateTime)}&$top=${top}&$orderby=start/dateTime&$select=id,subject,start,end,location,isOnlineMeeting,onlineMeeting,onlineMeetingUrl,organizer,attendees,isAllDay,isOrganizer,responseStatus,webLink`;
70
+ path = `${scope}/calendarView?startDateTime=${encodeURIComponent(args.startDateTime)}&endDateTime=${encodeURIComponent(args.endDateTime)}&$top=${top}&$orderby=start/dateTime&$select=id,subject,start,end,location,isOnlineMeeting,onlineMeeting,onlineMeetingUrl,organizer,attendees,isAllDay,isOrganizer,responseStatus,webLink`;
56
71
  }
57
72
  else {
58
- path = `${user}/events?$top=${top}&$orderby=start/dateTime&$select=id,subject,start,end,location,isOnlineMeeting,onlineMeeting,onlineMeetingUrl,organizer,attendees,isAllDay,isOrganizer,responseStatus,webLink`;
73
+ path = `${scope}/events?$top=${top}&$orderby=start/dateTime&$select=id,subject,start,end,location,isOnlineMeeting,onlineMeeting,onlineMeetingUrl,organizer,attendees,isAllDay,isOrganizer,responseStatus,webLink`;
59
74
  }
60
75
  const events = await client.getAll(path, 10, top);
61
76
  return JSON.stringify(events.map((e) => ({
@@ -74,6 +89,28 @@ export function registerCalendarTools(client) {
74
89
  webLink: e.webLink,
75
90
  })), null, 2);
76
91
  },
92
+ // ── get ──────────────────────────────────────────────────────
93
+ async calendar_get(args) {
94
+ const limit = args.maxBodyChars ?? 10_000;
95
+ if (!Number.isInteger(limit) || limit < 0 || limit > 50_000) {
96
+ throw new Error("maxBodyChars must be an integer between 0 and 50000");
97
+ }
98
+ if (typeof args.eventId !== "string" || !args.eventId.trim() || args.eventId === "." || args.eventId === "..") {
99
+ throw new Error("eventId must be a non-empty event ID");
100
+ }
101
+ const event = await client.get(`${calendarScope(args.calendarId)}/events/${encodeURIComponent(args.eventId)}?$select=id,subject,start,end,body,webLink`);
102
+ const content = event.body?.content ?? "";
103
+ return JSON.stringify({
104
+ id: event.id,
105
+ subject: event.subject,
106
+ start: event.start,
107
+ end: event.end,
108
+ body: { contentType: event.body?.contentType ?? "text", content: content.slice(0, limit) },
109
+ bodyTruncated: content.length > limit,
110
+ bodyLength: content.length,
111
+ webLink: event.webLink,
112
+ }, null, 2);
113
+ },
77
114
  // ── today ────────────────────────────────────────────────────
78
115
  async calendar_today() {
79
116
  const bounds = tzDayBounds(client.timezone);
@@ -132,8 +169,8 @@ export function registerCalendarTools(client) {
132
169
  start: client.dateTimeStr(args.start),
133
170
  end: client.dateTimeStr(args.end),
134
171
  };
135
- if (args.body)
136
- event.body = { contentType: "HTML", content: args.body };
172
+ if (args.body !== undefined)
173
+ event.body = noteBody(args.body, args.bodyContentType);
137
174
  if (args.location)
138
175
  event.location = { displayName: args.location };
139
176
  if (args.attendees) {
@@ -146,7 +183,7 @@ export function registerCalendarTools(client) {
146
183
  event.isOnlineMeeting = true;
147
184
  event.onlineMeetingProvider = "teamsForBusiness";
148
185
  }
149
- const data = await client.post(`${user}/events`, event);
186
+ const data = await client.post(`${calendarScope(args.calendarId)}/events`, event);
150
187
  return JSON.stringify({
151
188
  id: data.id,
152
189
  subject: data.subject,
@@ -164,13 +201,13 @@ export function registerCalendarTools(client) {
164
201
  if (args.end)
165
202
  patch.end = client.dateTimeStr(args.end);
166
203
  if (args.body !== undefined)
167
- patch.body = { contentType: "HTML", content: args.body };
204
+ patch.body = noteBody(args.body, args.bodyContentType);
168
205
  if (args.location !== undefined)
169
206
  patch.location = { displayName: args.location };
170
207
  if (Object.keys(patch).length === 0)
171
208
  throw new Error("Provide at least one event field to update");
172
209
  const eventId = encodeURIComponent(args.eventId);
173
- await client.patch(`${user}/events/${eventId}`, patch);
210
+ await client.patch(`${calendarScope(args.calendarId)}/events/${eventId}`, patch);
174
211
  return JSON.stringify({ success: true, eventId: args.eventId });
175
212
  },
176
213
  // ── delete (legacy organizer-cancel alias) ──────────────────
@@ -210,12 +247,26 @@ export const calendarToolSchemas = [
210
247
  inputSchema: {
211
248
  type: "object",
212
249
  properties: {
250
+ calendarId: { type: "string", minLength: 1, description: "Optional calendar ID; omit to preserve the default /me event scope" },
213
251
  startDateTime: { type: "string", description: "Start datetime (ISO 8601)" },
214
252
  endDateTime: { type: "string", description: "End datetime (ISO 8601)" },
215
253
  top: { type: "integer", minimum: 1, maximum: 500, description: "Max events", default: 50 },
216
254
  },
217
255
  },
218
256
  },
257
+ {
258
+ name: "m365_calendar_get",
259
+ description: "Read one event including its notes, with body format, length and explicit truncation status",
260
+ inputSchema: {
261
+ type: "object",
262
+ properties: {
263
+ eventId: { type: "string", minLength: 1, description: "Event ID" },
264
+ calendarId: { type: "string", minLength: 1, description: "Optional calendar ID for a specific calendar" },
265
+ maxBodyChars: { type: "integer", minimum: 0, maximum: 50_000, default: 10_000, description: "Maximum returned note characters (UTF-16 code units); 0 returns metadata only" },
266
+ },
267
+ required: ["eventId"],
268
+ },
269
+ },
219
270
  {
220
271
  name: "m365_calendar_today",
221
272
  description: "Show today's calendar events",
@@ -228,40 +279,44 @@ export const calendarToolSchemas = [
228
279
  },
229
280
  {
230
281
  name: "m365_calendar_create",
231
- description: "Create a calendar event (with optional Teams meeting)",
282
+ description: "Create a new event in your default or selected mailbox calendar, optionally as a Teams meeting. Supplying attendees sends invitation emails; omit them for a personal appointment. Use m365_calendar_update to edit an event or m365_calendar_availability to check free/busy first. Returns the event ID and available links. Repeated calls can create duplicate events; check m365_calendar_list before resubmitting after an uncertain outcome.",
232
283
  inputSchema: {
233
284
  type: "object",
234
285
  properties: {
286
+ calendarId: { type: "string", minLength: 1, description: "Optional ID of a calendar in your mailbox; omit for the default calendar. Does not grant shared-calendar access" },
235
287
  subject: { type: "string", description: "Event title" },
236
- start: { type: "string", description: "Start datetime (ISO 8601)" },
237
- end: { type: "string", description: "End datetime (ISO 8601)" },
238
- body: { type: "string", description: "Event description (HTML)" },
288
+ start: { type: "string", description: "Start date-time (ISO 8601); omit the offset to use the configured timezone, or include Z/an offset for an exact instant" },
289
+ end: { type: "string", description: "End date-time (ISO 8601), using the same timezone conventions as start" },
290
+ body: { type: "string", description: "Event notes; HTML by default" },
291
+ bodyContentType: { type: "string", enum: ["text", "html"], default: "html", description: "Format of the supplied body" },
239
292
  location: { type: "string", description: "Event location" },
240
- attendees: { type: "string", description: "Attendee emails, comma-separated" },
241
- isOnline: { type: "boolean", description: "Create as Teams meeting" },
293
+ attendees: { type: "string", description: "Comma-separated email addresses; supplying attendees sends meeting invitations" },
294
+ isOnline: { type: "boolean", description: "Create a Teams meeting when true; requires Teams support in the selected calendar" },
242
295
  },
243
296
  required: ["subject", "start", "end"],
244
297
  },
245
298
  },
246
299
  {
247
300
  name: "m365_calendar_update",
248
- description: "Update an existing calendar event",
301
+ description: "Change supplied fields on an existing event; omitted fields stay unchanged. Meeting changes may notify attendees. Body updates replace the notes: first read m365_calendar_get and preserve online-meeting details. Use m365_calendar_create for a new event or m365_calendar_cancel to cancel. Returns success and eventId. Check the event before repeating an update after an uncertain outcome.",
249
302
  inputSchema: {
250
303
  type: "object",
251
304
  properties: {
252
- eventId: { type: "string", description: "Event ID" },
253
- subject: { type: "string", description: "New subject" },
254
- start: { type: "string", description: "New start time (ISO 8601)" },
255
- end: { type: "string", description: "New end time (ISO 8601)" },
256
- body: { type: "string", description: "New description" },
257
- location: { type: "string", description: "New location" },
305
+ eventId: { type: "string", description: "Existing event ID from m365_calendar_list; must belong to the selected calendar" },
306
+ calendarId: { type: "string", minLength: 1, description: "Optional mailbox calendar ID matching the event; omit to use the default /me event scope" },
307
+ subject: { type: "string", description: "Replacement subject; omit to preserve it" },
308
+ start: { type: "string", description: "New ISO 8601 start date-time; no offset uses the configured timezone; Z/an offset specifies an instant" },
309
+ end: { type: "string", description: "New ISO 8601 end date-time, using the same timezone conventions as start" },
310
+ body: { type: "string", description: "Replacement notes; omit to preserve, or pass an empty string to clear. For online meetings preserve the meeting details in the body." },
311
+ bodyContentType: { type: "string", enum: ["text", "html"], default: "html", description: "Format of the supplied body" },
312
+ location: { type: "string", description: "Replacement location; omit to preserve it or use an empty string to clear it" },
258
313
  },
259
314
  required: ["eventId"],
260
315
  },
261
316
  },
262
317
  {
263
318
  name: "m365_calendar_delete",
264
- description: "Legacy alias: cancel a calendar event you organize and notify attendees",
319
+ description: "Compatibility alias for m365_calendar_cancel: cancel an event you organize and send cancellation notices to attendees. Prefer m365_calendar_cancel for new calls; this is not a silent delete or an attendee decline. Use m365_calendar_decline for received invitations. Returns success and eventId; check the calendar before retrying an uncertain cancellation.",
265
320
  inputSchema: {
266
321
  type: "object",
267
322
  properties: {
@@ -285,12 +340,12 @@ export const calendarToolSchemas = [
285
340
  },
286
341
  {
287
342
  name: "m365_calendar_decline",
288
- description: "Decline a calendar invitation as an attendee",
343
+ description: "Decline a received invitation as an attendee, not an event you organize. By default a response email goes to the organizer; set sendResponse=false to suppress it. Use m365_calendar_cancel if you are the organizer. Returns success and eventId; check response status in m365_calendar_list before retrying an uncertain decline.",
289
344
  inputSchema: {
290
345
  type: "object",
291
346
  properties: {
292
- eventId: { type: "string", description: "Event ID" },
293
- comment: { type: "string", description: "Optional response to the organizer" },
347
+ eventId: { type: "string", description: "ID of a received invitation from m365_calendar_list" },
348
+ comment: { type: "string", description: "Optional text to include in the response email when sendResponse=true" },
294
349
  sendResponse: { type: "boolean", description: "Send the response to the organizer (default: true)" },
295
350
  },
296
351
  required: ["eventId"],
@@ -298,13 +353,13 @@ export const calendarToolSchemas = [
298
353
  },
299
354
  {
300
355
  name: "m365_calendar_availability",
301
- description: "Check free/busy availability for users",
356
+ description: "Read free/busy schedules for the supplied users and time range, including a 30-minute availability view. This does not book a meeting or send invitations. Use m365_calendar_create after selecting a time, or m365_calendar_list for your event details. Returns per-user schedules and any Graph-reported errors.",
302
357
  inputSchema: {
303
358
  type: "object",
304
359
  properties: {
305
- users: { type: "string", description: "User emails to check, comma-separated" },
306
- startDateTime: { type: "string", description: "Start (ISO 8601)" },
307
- endDateTime: { type: "string", description: "End (ISO 8601)" },
360
+ users: { type: "string", description: "Comma-separated mailbox email addresses to check" },
361
+ startDateTime: { type: "string", description: "Range start (ISO 8601); no offset uses the configured timezone; Z/an offset specifies an instant" },
362
+ endDateTime: { type: "string", description: "Range end (ISO 8601), using the same timezone conventions as startDateTime" },
308
363
  },
309
364
  required: ["users", "startDateTime", "endDateTime"],
310
365
  },