@softeria/ms-365-mcp-server 0.63.2 → 0.65.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/README.md CHANGED
@@ -553,6 +553,8 @@ Parent directories are created automatically. Files are written with `0600` perm
553
553
 
554
554
  > **Security note**: File-based token storage writes sensitive credentials to disk. Ensure the chosen directory has appropriate access controls. The OS credential store (keytar) is preferred when available.
555
555
 
556
+ > **Hosted/sandboxed environments** (e.g. Anthropic Cowork): Set `MS365_MCP_TOKEN_CACHE_PATH` and `MS365_MCP_SELECTED_ACCOUNT_PATH` to a persistent mount so tokens survive between sessions.
557
+
556
558
  ## Azure Key Vault Integration
557
559
 
558
560
  For production deployments, you can store secrets in Azure Key Vault instead of environment variables. This is particularly useful for Azure Container Apps with managed identity.
@@ -133,6 +133,13 @@
133
133
  "scopes": ["Mail.ReadWrite"],
134
134
  "llmTip": "Max 3MB. Body requires @odata.type: {\"@odata.type\": \"#microsoft.graph.fileAttachment\", \"name\": \"file.pdf\", \"contentBytes\": \"<base64>\"}."
135
135
  },
136
+ {
137
+ "pathPattern": "/me/messages/{message-id}/attachments/createUploadSession",
138
+ "method": "post",
139
+ "toolName": "create-mail-attachment-upload-session",
140
+ "scopes": ["Mail.ReadWrite"],
141
+ "llmTip": "For large attachments (3-150MB). Body: { AttachmentItem: { attachmentType: 'file', name: 'report.pdf', size: 5000000 } }. Returns a pre-authenticated uploadUrl for direct PUT of file bytes."
142
+ },
136
143
  {
137
144
  "pathPattern": "/me/messages/{message-id}/attachments",
138
145
  "method": "get",
@@ -341,6 +348,12 @@
341
348
  "supportsExpandExtendedProperties": true,
342
349
  "llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for a specific calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Each instance includes seriesMasterId and type (occurrence/exception) fields for recurring event linkage. Use fetchAllPages=true to retrieve all results when there are many events. To find Teams meetings, use $filter=isOnlineMeeting eq true. Teams meetings include a joinWebUrl property needed for transcript access via list-online-meetings."
343
350
  },
351
+ {
352
+ "pathPattern": "/me/calendar/getSchedule",
353
+ "method": "post",
354
+ "toolName": "get-schedule",
355
+ "workScopes": ["Calendars.Read"]
356
+ },
344
357
  {
345
358
  "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}/instances",
346
359
  "method": "get",
@@ -428,6 +441,13 @@
428
441
  "scopes": ["Files.ReadWrite"],
429
442
  "llmTip": "Max 4MB. For new files use path format: /items/root:/path/to/file.txt:/content. Overwrites existing files without warning."
430
443
  },
444
+ {
445
+ "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/createUploadSession",
446
+ "method": "post",
447
+ "toolName": "create-upload-session",
448
+ "scopes": ["Files.ReadWrite"],
449
+ "llmTip": "For large file uploads (no size limit). Returns a pre-authenticated uploadUrl for direct PUT of file bytes. For new files use path: /items/{parentId}:/{fileName}:/createUploadSession. Body (optional): { item: { '@microsoft.graph.conflictBehavior': 'rename' } }."
450
+ },
431
451
  {
432
452
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}",
433
453
  "method": "patch",
@@ -748,6 +748,18 @@ const microsoft_graph_driveItemCollectionResponse = z.object({
748
748
  "@odata.nextLink": z.string().nullable(),
749
749
  value: z.array(microsoft_graph_driveItem)
750
750
  }).partial().passthrough();
751
+ const create_upload_session_Body = z.object({ item: z.object({}).partial().passthrough() }).partial().passthrough();
752
+ const microsoft_graph_uploadSession = z.object({
753
+ expirationDateTime: z.string().regex(
754
+ /^[0-9]{4,}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?(Z|[+-][0-9][0-9]:[0-9][0-9])$/
755
+ ).datetime({ offset: true }).describe(
756
+ "The date and time in UTC that the upload session expires. The complete file must be uploaded before this expiration time is reached. Each fragment uploaded during the session extends the expiration time."
757
+ ).nullish(),
758
+ nextExpectedRanges: z.array(z.string().nullable()).describe(
759
+ "A collection of byte ranges that the server is missing for the file. These ranges are zero indexed and of the format 'start-end' (for example '0-26' to indicate the first 27 bytes of the file). When uploading files as Outlook attachments, instead of a collection of ranges, this property always indicates a single value '{start}', the location in the file where the next upload should begin."
760
+ ).optional(),
761
+ uploadUrl: z.string().describe("The URL endpoint that accepts PUT requests for byte ranges of the file.").nullish()
762
+ }).passthrough();
751
763
  const microsoft_graph_workbookIcon = z.object({
752
764
  index: z.number().gte(-2147483648).lte(2147483647).describe("The index of the icon in the given set.").optional(),
753
765
  set: z.string().describe(
@@ -1334,6 +1346,68 @@ const microsoft_graph_conversationThreadCollectionResponse = z.object({
1334
1346
  value: z.array(microsoft_graph_conversationThread)
1335
1347
  }).partial().passthrough();
1336
1348
  const reply_to_group_thread_Body = z.object({ Post: microsoft_graph_post }).partial().passthrough();
1349
+ const get_schedule_Body = z.object({
1350
+ Schedules: z.array(z.string().nullable()),
1351
+ EndTime: z.union([microsoft_graph_dateTimeTimeZone, z.object({}).partial().passthrough()]),
1352
+ StartTime: z.union([microsoft_graph_dateTimeTimeZone, z.object({}).partial().passthrough()]),
1353
+ AvailabilityViewInterval: z.number().gte(-2147483648).lte(2147483647).nullable()
1354
+ }).partial().passthrough();
1355
+ const BaseCollectionPaginationCountResponse = z.object({ "@odata.count": z.number().int().nullable(), "@odata.nextLink": z.string().nullable() }).partial().passthrough();
1356
+ const microsoft_graph_freeBusyError = z.object({
1357
+ message: z.string().describe("Describes the error.").nullish(),
1358
+ responseCode: z.string().describe(
1359
+ "The response code from querying for the availability of the user, distribution list, or resource."
1360
+ ).nullish()
1361
+ }).passthrough();
1362
+ const microsoft_graph_freeBusyStatus = z.enum([
1363
+ "unknown",
1364
+ "free",
1365
+ "tentative",
1366
+ "busy",
1367
+ "oof",
1368
+ "workingElsewhere"
1369
+ ]);
1370
+ const microsoft_graph_scheduleItem = z.object({
1371
+ end: microsoft_graph_dateTimeTimeZone.optional(),
1372
+ isPrivate: z.boolean().describe(
1373
+ "The sensitivity of the corresponding event. True if the event is marked private, false otherwise. Optional."
1374
+ ).nullish(),
1375
+ location: z.string().describe("The location where the corresponding event is held or attended from. Optional.").nullish(),
1376
+ start: microsoft_graph_dateTimeTimeZone.optional(),
1377
+ status: microsoft_graph_freeBusyStatus.optional(),
1378
+ subject: z.string().describe("The corresponding event's subject line. Optional.").nullish()
1379
+ }).passthrough();
1380
+ const microsoft_graph_dayOfWeek = z.enum([
1381
+ "sunday",
1382
+ "monday",
1383
+ "tuesday",
1384
+ "wednesday",
1385
+ "thursday",
1386
+ "friday",
1387
+ "saturday"
1388
+ ]);
1389
+ const microsoft_graph_timeZoneBase = z.object({
1390
+ name: z.string().describe(
1391
+ "The name of a time zone. It can be a standard time zone name such as 'Hawaii-Aleutian Standard Time', or 'Customized Time Zone' for a custom time zone."
1392
+ ).nullish()
1393
+ }).passthrough();
1394
+ const microsoft_graph_workingHours = z.object({
1395
+ daysOfWeek: z.array(z.union([microsoft_graph_dayOfWeek, z.object({}).partial().passthrough()])).describe("The days of the week on which the user works.").optional(),
1396
+ endTime: z.string().regex(/^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?$/).describe("The time of the day that the user stops working.").nullish(),
1397
+ startTime: z.string().regex(/^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?$/).describe("The time of the day that the user starts working.").nullish(),
1398
+ timeZone: microsoft_graph_timeZoneBase.optional()
1399
+ }).passthrough();
1400
+ const microsoft_graph_scheduleInformation = z.object({
1401
+ availabilityView: z.string().describe(
1402
+ "Represents a merged view of availability of all the items in scheduleItems. The view consists of time slots. Availability during each time slot is indicated with: 0= free or working elswhere, 1= tentative, 2= busy, 3= out of office.Note: Working elsewhere is set to 0 instead of 4 for backward compatibility. For details, see the Q&A and Exchange 2007 and Exchange 2010 do not use the WorkingElsewhere value."
1403
+ ).nullish(),
1404
+ error: microsoft_graph_freeBusyError.optional(),
1405
+ scheduleId: z.string().describe(
1406
+ "An SMTP address of the user, distribution list, or resource, identifying an instance of scheduleInformation."
1407
+ ).nullish(),
1408
+ scheduleItems: z.array(microsoft_graph_scheduleItem).describe("Contains the items that describe the availability of the user or resource.").optional(),
1409
+ workingHours: microsoft_graph_workingHours.optional()
1410
+ }).passthrough();
1337
1411
  const microsoft_graph_onlineMeetingProviderType = z.enum([
1338
1412
  "unknown",
1339
1413
  "skypeForBusiness",
@@ -1430,14 +1504,6 @@ const microsoft_graph_location = z.object({
1430
1504
  uniqueId: z.string().describe("For internal use only.").nullish(),
1431
1505
  uniqueIdType: microsoft_graph_locationUniqueIdType.optional()
1432
1506
  }).passthrough();
1433
- const microsoft_graph_freeBusyStatus = z.enum([
1434
- "unknown",
1435
- "free",
1436
- "tentative",
1437
- "busy",
1438
- "oof",
1439
- "workingElsewhere"
1440
- ]);
1441
1507
  const microsoft_graph_sensitivity = z.enum(["normal", "personal", "private", "confidential"]);
1442
1508
  const microsoft_graph_importance = z.enum(["low", "normal", "high"]);
1443
1509
  const microsoft_graph_attendeeType = z.enum(["required", "optional", "resource"]);
@@ -1467,15 +1533,6 @@ const microsoft_graph_attendee = z.object({
1467
1533
  proposedNewTime: microsoft_graph_timeSlot.optional(),
1468
1534
  status: microsoft_graph_responseStatus.optional()
1469
1535
  }).passthrough();
1470
- const microsoft_graph_dayOfWeek = z.enum([
1471
- "sunday",
1472
- "monday",
1473
- "tuesday",
1474
- "wednesday",
1475
- "thursday",
1476
- "friday",
1477
- "saturday"
1478
- ]);
1479
1536
  const microsoft_graph_weekIndex = z.enum(["first", "second", "third", "fourth", "last"]);
1480
1537
  const microsoft_graph_recurrencePatternType = z.enum([
1481
1538
  "daily",
@@ -2494,17 +2551,6 @@ const microsoft_graph_userPurpose = z.enum([
2494
2551
  "others",
2495
2552
  "unknownFutureValue"
2496
2553
  ]);
2497
- const microsoft_graph_timeZoneBase = z.object({
2498
- name: z.string().describe(
2499
- "The name of a time zone. It can be a standard time zone name such as 'Hawaii-Aleutian Standard Time', or 'Customized Time Zone' for a custom time zone."
2500
- ).nullish()
2501
- }).passthrough();
2502
- const microsoft_graph_workingHours = z.object({
2503
- daysOfWeek: z.array(z.union([microsoft_graph_dayOfWeek, z.object({}).partial().passthrough()])).describe("The days of the week on which the user works.").optional(),
2504
- endTime: z.string().regex(/^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?$/).describe("The time of the day that the user stops working.").nullish(),
2505
- startTime: z.string().regex(/^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?$/).describe("The time of the day that the user starts working.").nullish(),
2506
- timeZone: microsoft_graph_timeZoneBase.optional()
2507
- }).passthrough();
2508
2554
  const microsoft_graph_mailboxSettings = z.object({
2509
2555
  archiveFolder: z.string().describe("Folder ID of an archive folder for the user.").nullish(),
2510
2556
  automaticRepliesSetting: microsoft_graph_automaticRepliesSetting.optional(),
@@ -3609,7 +3655,6 @@ const microsoft_graph_searchRequest = z.object({
3609
3655
  ).optional()
3610
3656
  }).passthrough();
3611
3657
  const search_query_Body = z.object({ requests: z.array(microsoft_graph_searchRequest) }).partial().passthrough();
3612
- const BaseCollectionPaginationCountResponse = z.object({ "@odata.count": z.number().int().nullable(), "@odata.nextLink": z.string().nullable() }).partial().passthrough();
3613
3658
  const microsoft_graph_searchBucket = z.object({
3614
3659
  aggregationFilterToken: z.string().describe(
3615
3660
  "A token containing the encoded filter to aggregate search matches by the specific key value. To use the filter, pass the token as part of the aggregationFilter property in a searchRequest object, in the format '{field}:/'{aggregationFilterToken}/''. See an example."
@@ -3865,6 +3910,8 @@ const schemas = {
3865
3910
  microsoft_graph_pendingOperations,
3866
3911
  microsoft_graph_driveItem,
3867
3912
  microsoft_graph_driveItemCollectionResponse,
3913
+ create_upload_session_Body,
3914
+ microsoft_graph_uploadSession,
3868
3915
  microsoft_graph_workbookIcon,
3869
3916
  microsoft_graph_workbookFilterCriteria,
3870
3917
  microsoft_graph_workbookFilter,
@@ -3923,6 +3970,15 @@ const schemas = {
3923
3970
  microsoft_graph_conversationCollectionResponse,
3924
3971
  microsoft_graph_conversationThreadCollectionResponse,
3925
3972
  reply_to_group_thread_Body,
3973
+ get_schedule_Body,
3974
+ BaseCollectionPaginationCountResponse,
3975
+ microsoft_graph_freeBusyError,
3976
+ microsoft_graph_freeBusyStatus,
3977
+ microsoft_graph_scheduleItem,
3978
+ microsoft_graph_dayOfWeek,
3979
+ microsoft_graph_timeZoneBase,
3980
+ microsoft_graph_workingHours,
3981
+ microsoft_graph_scheduleInformation,
3926
3982
  microsoft_graph_onlineMeetingProviderType,
3927
3983
  microsoft_graph_calendarColor,
3928
3984
  microsoft_graph_calendarRoleType,
@@ -3933,7 +3989,6 @@ const schemas = {
3933
3989
  microsoft_graph_locationType,
3934
3990
  microsoft_graph_locationUniqueIdType,
3935
3991
  microsoft_graph_location,
3936
- microsoft_graph_freeBusyStatus,
3937
3992
  microsoft_graph_sensitivity,
3938
3993
  microsoft_graph_importance,
3939
3994
  microsoft_graph_attendeeType,
@@ -3941,7 +3996,6 @@ const schemas = {
3941
3996
  microsoft_graph_responseType,
3942
3997
  microsoft_graph_responseStatus,
3943
3998
  microsoft_graph_attendee,
3944
- microsoft_graph_dayOfWeek,
3945
3999
  microsoft_graph_weekIndex,
3946
4000
  microsoft_graph_recurrencePatternType,
3947
4001
  microsoft_graph_recurrencePattern,
@@ -4031,8 +4085,6 @@ const schemas = {
4031
4085
  microsoft_graph_delegateMeetingMessageDeliveryOptions,
4032
4086
  microsoft_graph_localeInfo,
4033
4087
  microsoft_graph_userPurpose,
4034
- microsoft_graph_timeZoneBase,
4035
- microsoft_graph_workingHours,
4036
4088
  microsoft_graph_mailboxSettings,
4037
4089
  microsoft_graph_messageRuleActions,
4038
4090
  microsoft_graph_messageActionFlag,
@@ -4143,7 +4195,6 @@ const schemas = {
4143
4195
  microsoft_graph_sortProperty,
4144
4196
  microsoft_graph_searchRequest,
4145
4197
  search_query_Body,
4146
- BaseCollectionPaginationCountResponse,
4147
4198
  microsoft_graph_searchBucket,
4148
4199
  microsoft_graph_searchAggregation,
4149
4200
  microsoft_graph_entity,
@@ -4604,6 +4655,22 @@ const endpoints = makeApi([
4604
4655
  ],
4605
4656
  response: z.void()
4606
4657
  },
4658
+ {
4659
+ method: "post",
4660
+ path: "/drives/:driveId/items/:driveItemId/createUploadSession",
4661
+ alias: "create-upload-session",
4662
+ description: `Invoke action createUploadSession`,
4663
+ requestFormat: "json",
4664
+ parameters: [
4665
+ {
4666
+ name: "body",
4667
+ description: `Action parameters`,
4668
+ type: "Body",
4669
+ schema: create_upload_session_Body
4670
+ }
4671
+ ],
4672
+ response: z.void()
4673
+ },
4607
4674
  {
4608
4675
  method: "get",
4609
4676
  path: "/drives/:driveId/items/:driveItemId/workbook/tables",
@@ -5011,6 +5078,22 @@ const endpoints = makeApi([
5011
5078
  ],
5012
5079
  response: z.void()
5013
5080
  },
5081
+ {
5082
+ method: "post",
5083
+ path: "/me/calendar/getSchedule",
5084
+ alias: "get-schedule",
5085
+ description: `Get the free/busy availability information for a collection of users, distributions lists, or resources (rooms or equipment) for a specified time period.`,
5086
+ requestFormat: "json",
5087
+ parameters: [
5088
+ {
5089
+ name: "body",
5090
+ description: `Action parameters`,
5091
+ type: "Body",
5092
+ schema: get_schedule_Body
5093
+ }
5094
+ ],
5095
+ response: z.void()
5096
+ },
5014
5097
  {
5015
5098
  method: "get",
5016
5099
  path: "/me/calendars",
@@ -6927,6 +7010,22 @@ resource.`,
6927
7010
  ],
6928
7011
  response: z.void()
6929
7012
  },
7013
+ {
7014
+ method: "post",
7015
+ path: "/me/messages/:messageId/attachments/createUploadSession",
7016
+ alias: "create-mail-attachment-upload-session",
7017
+ description: `Create an upload session that allows an app to iteratively upload ranges of a file, so as to attach the file to the specified Outlook item. The item can be a message or event. Use this approach to attach a file if the file size is between 3 MB and 150 MB. To attach a file that's smaller than 3 MB, do a POST operation on the attachments navigation property of the Outlook item; see how to do this for a message or for an event. As part of the response, this action returns an upload URL that you can use in subsequent sequential PUT queries. Request headers for each PUT operation let you specify the exact range of bytes to be uploaded. This allows transfer to be resumed, in case the network connection is dropped during upload. The following are the steps to attach a file to an Outlook item using an upload session: See attach large files to Outlook messages or events for an example.`,
7018
+ requestFormat: "json",
7019
+ parameters: [
7020
+ {
7021
+ name: "body",
7022
+ description: `Action parameters`,
7023
+ type: "Body",
7024
+ schema: z.object({ AttachmentItem: z.object({}).partial().passthrough() }).partial().passthrough()
7025
+ }
7026
+ ],
7027
+ response: z.void()
7028
+ },
6930
7029
  {
6931
7030
  method: "post",
6932
7031
  path: "/me/messages/:messageId/createForward",
@@ -1,10 +1,10 @@
1
- 2026-04-05 08:47:40 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me
2
- 2026-04-05 08:47:40 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me
3
- 2026-04-05 08:47:40 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me
4
- 2026-04-05 08:47:40 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me/messages
5
- 2026-04-05 08:47:40 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me/calendar
6
- 2026-04-05 08:47:42 INFO: Using environment variables for secrets
7
- 2026-04-05 08:47:42 INFO: Using environment variables for secrets
8
- 2026-04-05 08:47:42 INFO: Using environment variables for secrets
9
- 2026-04-05 08:47:42 INFO: Using environment variables for secrets
10
- 2026-04-05 08:47:42 INFO: Using environment variables for secrets
1
+ 2026-04-05 10:00:41 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me
2
+ 2026-04-05 10:00:41 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me
3
+ 2026-04-05 10:00:41 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me
4
+ 2026-04-05 10:00:41 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me/messages
5
+ 2026-04-05 10:00:41 INFO: [GRAPH CLIENT] Final URL being sent to Microsoft: https://graph.microsoft.com/v1.0/me/calendar
6
+ 2026-04-05 10:00:43 INFO: Using environment variables for secrets
7
+ 2026-04-05 10:00:43 INFO: Using environment variables for secrets
8
+ 2026-04-05 10:00:43 INFO: Using environment variables for secrets
9
+ 2026-04-05 10:00:43 INFO: Using environment variables for secrets
10
+ 2026-04-05 10:00:43 INFO: Using environment variables for secrets
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softeria/ms-365-mcp-server",
3
- "version": "0.63.2",
3
+ "version": "0.65.0",
4
4
  "description": " A Model Context Protocol (MCP) server for interacting with Microsoft 365 and Office services through the Graph API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -133,6 +133,13 @@
133
133
  "scopes": ["Mail.ReadWrite"],
134
134
  "llmTip": "Max 3MB. Body requires @odata.type: {\"@odata.type\": \"#microsoft.graph.fileAttachment\", \"name\": \"file.pdf\", \"contentBytes\": \"<base64>\"}."
135
135
  },
136
+ {
137
+ "pathPattern": "/me/messages/{message-id}/attachments/createUploadSession",
138
+ "method": "post",
139
+ "toolName": "create-mail-attachment-upload-session",
140
+ "scopes": ["Mail.ReadWrite"],
141
+ "llmTip": "For large attachments (3-150MB). Body: { AttachmentItem: { attachmentType: 'file', name: 'report.pdf', size: 5000000 } }. Returns a pre-authenticated uploadUrl for direct PUT of file bytes."
142
+ },
136
143
  {
137
144
  "pathPattern": "/me/messages/{message-id}/attachments",
138
145
  "method": "get",
@@ -341,6 +348,12 @@
341
348
  "supportsExpandExtendedProperties": true,
342
349
  "llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for a specific calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Each instance includes seriesMasterId and type (occurrence/exception) fields for recurring event linkage. Use fetchAllPages=true to retrieve all results when there are many events. To find Teams meetings, use $filter=isOnlineMeeting eq true. Teams meetings include a joinWebUrl property needed for transcript access via list-online-meetings."
343
350
  },
351
+ {
352
+ "pathPattern": "/me/calendar/getSchedule",
353
+ "method": "post",
354
+ "toolName": "get-schedule",
355
+ "workScopes": ["Calendars.Read"]
356
+ },
344
357
  {
345
358
  "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}/instances",
346
359
  "method": "get",
@@ -428,6 +441,13 @@
428
441
  "scopes": ["Files.ReadWrite"],
429
442
  "llmTip": "Max 4MB. For new files use path format: /items/root:/path/to/file.txt:/content. Overwrites existing files without warning."
430
443
  },
444
+ {
445
+ "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/createUploadSession",
446
+ "method": "post",
447
+ "toolName": "create-upload-session",
448
+ "scopes": ["Files.ReadWrite"],
449
+ "llmTip": "For large file uploads (no size limit). Returns a pre-authenticated uploadUrl for direct PUT of file bytes. For new files use path: /items/{parentId}:/{fileName}:/createUploadSession. Body (optional): { item: { '@microsoft.graph.conflictBehavior': 'rename' } }."
450
+ },
431
451
  {
432
452
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}",
433
453
  "method": "patch",