@softeria/ms-365-mcp-server 0.19.1 → 0.19.2

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.
@@ -131,6 +131,36 @@
131
131
  "toolName": "delete-calendar-event",
132
132
  "scopes": ["Calendars.ReadWrite"]
133
133
  },
134
+ {
135
+ "pathPattern": "/me/calendars/{calendar-id}/events",
136
+ "method": "get",
137
+ "toolName": "list-specific-calendar-events",
138
+ "scopes": ["Calendars.Read"]
139
+ },
140
+ {
141
+ "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}",
142
+ "method": "get",
143
+ "toolName": "get-specific-calendar-event",
144
+ "scopes": ["Calendars.Read"]
145
+ },
146
+ {
147
+ "pathPattern": "/me/calendars/{calendar-id}/events",
148
+ "method": "post",
149
+ "toolName": "create-specific-calendar-event",
150
+ "scopes": ["Calendars.ReadWrite"]
151
+ },
152
+ {
153
+ "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}",
154
+ "method": "patch",
155
+ "toolName": "update-specific-calendar-event",
156
+ "scopes": ["Calendars.ReadWrite"]
157
+ },
158
+ {
159
+ "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}",
160
+ "method": "delete",
161
+ "toolName": "delete-specific-calendar-event",
162
+ "scopes": ["Calendars.ReadWrite"]
163
+ },
134
164
  {
135
165
  "pathPattern": "/me/calendarView",
136
166
  "method": "get",
@@ -3557,7 +3557,7 @@ const endpoints = makeApi([
3557
3557
  method: "post",
3558
3558
  path: "/chats/:chatId/messages",
3559
3559
  alias: "send-chat-message",
3560
- description: `Send a new chatMessage in the specified chat. This API can't create a new chat; you must use the list chats method to retrieve the ID of an existing chat before you can create a chat message.`,
3560
+ description: `Send a new chatMessage in the specified channel or a chat.`,
3561
3561
  requestFormat: "json",
3562
3562
  parameters: [
3563
3563
  {
@@ -4373,6 +4373,453 @@ const endpoints = makeApi([
4373
4373
  }
4374
4374
  ]
4375
4375
  },
4376
+ {
4377
+ method: "get",
4378
+ path: "/me/calendars/:calendarId/events",
4379
+ alias: "list-specific-calendar-events",
4380
+ description: `The events in the calendar. Navigation property. Read-only.`,
4381
+ requestFormat: "json",
4382
+ parameters: [
4383
+ {
4384
+ name: "$top",
4385
+ type: "Query",
4386
+ schema: z.number().int().gte(0).describe("Show only the first n items").optional()
4387
+ },
4388
+ {
4389
+ name: "$skip",
4390
+ type: "Query",
4391
+ schema: z.number().int().gte(0).describe("Skip the first n items").optional()
4392
+ },
4393
+ {
4394
+ name: "$search",
4395
+ type: "Query",
4396
+ schema: z.string().describe("Search items by search phrases").optional()
4397
+ },
4398
+ {
4399
+ name: "$filter",
4400
+ type: "Query",
4401
+ schema: z.string().describe("Filter items by property values").optional()
4402
+ },
4403
+ {
4404
+ name: "$count",
4405
+ type: "Query",
4406
+ schema: z.boolean().describe("Include count of items").optional()
4407
+ },
4408
+ {
4409
+ name: "$orderby",
4410
+ type: "Query",
4411
+ schema: z.array(z.string()).describe("Order items by property values").optional()
4412
+ },
4413
+ {
4414
+ name: "$select",
4415
+ type: "Query",
4416
+ schema: z.array(z.string()).describe("Select properties to be returned").optional()
4417
+ },
4418
+ {
4419
+ name: "$expand",
4420
+ type: "Query",
4421
+ schema: z.array(z.string()).describe("Expand related entities").optional()
4422
+ }
4423
+ ],
4424
+ response: z.void(),
4425
+ errors: [
4426
+ {
4427
+ status: NaN,
4428
+ description: `Retrieved collection`,
4429
+ schema: microsoft_graph_eventCollectionResponse
4430
+ },
4431
+ {
4432
+ status: NaN,
4433
+ description: `error`,
4434
+ schema: microsoft_graph_ODataErrors_ODataError
4435
+ },
4436
+ {
4437
+ status: NaN,
4438
+ description: `error`,
4439
+ schema: microsoft_graph_ODataErrors_ODataError
4440
+ }
4441
+ ]
4442
+ },
4443
+ {
4444
+ method: "post",
4445
+ path: "/me/calendars/:calendarId/events",
4446
+ alias: "create-specific-calendar-event",
4447
+ description: `Use this API to create a new event in a calendar. The calendar can be one for a user, or the default calendar of a Microsoft 365 group.`,
4448
+ requestFormat: "json",
4449
+ parameters: [
4450
+ {
4451
+ name: "body",
4452
+ description: `New navigation property`,
4453
+ type: "Body",
4454
+ schema: z.object({
4455
+ type: microsoft_graph_eventType.optional(),
4456
+ body: microsoft_graph_itemBody.optional(),
4457
+ subject: z.string().describe("The text of the event's subject line.").nullish(),
4458
+ attachments: z.array(microsoft_graph_attachment).describe(
4459
+ "The collection of FileAttachment, ItemAttachment, and referenceAttachment attachments for the event. Navigation property. Read-only. Nullable."
4460
+ ).optional(),
4461
+ allowNewTimeProposals: z.boolean().describe(
4462
+ "true if the meeting organizer allows invitees to propose a new time when responding; otherwise, false. Optional. The default is true."
4463
+ ).nullish(),
4464
+ attendees: z.array(microsoft_graph_attendee).describe("The collection of attendees for the event.").optional(),
4465
+ bodyPreview: z.string().describe(
4466
+ "The preview of the message associated with the event. It's in text format."
4467
+ ).nullish(),
4468
+ cancelledOccurrences: z.array(z.string()).describe(
4469
+ "Contains occurrenceId property values of canceled instances in a recurring series, if the event is the series master. Instances in a recurring series that are canceled are called canceled occurences.Returned only on $select in a Get operation which specifies the ID (seriesMasterId property value) of a series master event."
4470
+ ).optional(),
4471
+ end: microsoft_graph_dateTimeTimeZone.optional(),
4472
+ hasAttachments: z.boolean().describe("Set to true if the event has attachments.").nullish(),
4473
+ hideAttendees: z.boolean().describe(
4474
+ "When set to true, each attendee only sees themselves in the meeting request and meeting Tracking list. The default is false."
4475
+ ).nullish(),
4476
+ iCalUId: z.string().describe(
4477
+ "A unique identifier for an event across calendars. This ID is different for each occurrence in a recurring series. Read-only."
4478
+ ).nullish(),
4479
+ importance: microsoft_graph_importance.optional(),
4480
+ isAllDay: z.boolean().describe(
4481
+ "Set to true if the event lasts all day. If true, regardless of whether it's a single-day or multi-day event, start, and endtime must be set to midnight and be in the same time zone."
4482
+ ).nullish(),
4483
+ isCancelled: z.boolean().describe("Set to true if the event has been canceled.").nullish(),
4484
+ isDraft: z.boolean().describe(
4485
+ "Set to true if the user has updated the meeting in Outlook but hasn't sent the updates to attendees. Set to false if all changes are sent, or if the event is an appointment without any attendees."
4486
+ ).nullish(),
4487
+ isOnlineMeeting: z.boolean().describe(
4488
+ "True if this event has online meeting information (that is, onlineMeeting points to an onlineMeetingInfo resource), false otherwise. Default is false (onlineMeeting is null). Optional. After you set isOnlineMeeting to true, Microsoft Graph initializes onlineMeeting. Subsequently, Outlook ignores any further changes to isOnlineMeeting, and the meeting remains available online."
4489
+ ).nullish(),
4490
+ isOrganizer: z.boolean().describe(
4491
+ "Set to true if the calendar owner (specified by the owner property of the calendar) is the organizer of the event (specified by the organizer property of the event). It also applies if a delegate organized the event on behalf of the owner."
4492
+ ).nullish(),
4493
+ isReminderOn: z.boolean().describe("Set to true if an alert is set to remind the user of the event.").nullish(),
4494
+ location: microsoft_graph_location.optional(),
4495
+ locations: z.array(microsoft_graph_location).describe(
4496
+ "The locations where the event is held or attended from. The location and locations properties always correspond with each other. If you update the location property, any prior locations in the locations collection are removed and replaced by the new location value."
4497
+ ).optional(),
4498
+ onlineMeeting: microsoft_graph_onlineMeetingInfo.optional(),
4499
+ onlineMeetingProvider: microsoft_graph_onlineMeetingProviderType.optional(),
4500
+ onlineMeetingUrl: z.string().describe(
4501
+ "A URL for an online meeting. The property is set only when an organizer specifies in Outlook that an event is an online meeting such as Skype. Read-only.To access the URL to join an online meeting, use joinUrl which is exposed via the onlineMeeting property of the event. The onlineMeetingUrl property will be deprecated in the future."
4502
+ ).nullish(),
4503
+ organizer: microsoft_graph_recipient.optional()
4504
+ }).strict().passthrough()
4505
+ }
4506
+ ],
4507
+ response: z.void(),
4508
+ errors: [
4509
+ {
4510
+ status: NaN,
4511
+ description: `Created navigation property.`,
4512
+ schema: z.object({
4513
+ type: microsoft_graph_eventType.optional(),
4514
+ body: microsoft_graph_itemBody.optional(),
4515
+ subject: z.string().describe("The text of the event's subject line.").nullish(),
4516
+ attachments: z.array(microsoft_graph_attachment).describe(
4517
+ "The collection of FileAttachment, ItemAttachment, and referenceAttachment attachments for the event. Navigation property. Read-only. Nullable."
4518
+ ).optional(),
4519
+ allowNewTimeProposals: z.boolean().describe(
4520
+ "true if the meeting organizer allows invitees to propose a new time when responding; otherwise, false. Optional. The default is true."
4521
+ ).nullish(),
4522
+ attendees: z.array(microsoft_graph_attendee).describe("The collection of attendees for the event.").optional(),
4523
+ bodyPreview: z.string().describe(
4524
+ "The preview of the message associated with the event. It's in text format."
4525
+ ).nullish(),
4526
+ cancelledOccurrences: z.array(z.string()).describe(
4527
+ "Contains occurrenceId property values of canceled instances in a recurring series, if the event is the series master. Instances in a recurring series that are canceled are called canceled occurences.Returned only on $select in a Get operation which specifies the ID (seriesMasterId property value) of a series master event."
4528
+ ).optional(),
4529
+ end: microsoft_graph_dateTimeTimeZone.optional(),
4530
+ hasAttachments: z.boolean().describe("Set to true if the event has attachments.").nullish(),
4531
+ hideAttendees: z.boolean().describe(
4532
+ "When set to true, each attendee only sees themselves in the meeting request and meeting Tracking list. The default is false."
4533
+ ).nullish(),
4534
+ iCalUId: z.string().describe(
4535
+ "A unique identifier for an event across calendars. This ID is different for each occurrence in a recurring series. Read-only."
4536
+ ).nullish(),
4537
+ importance: microsoft_graph_importance.optional(),
4538
+ isAllDay: z.boolean().describe(
4539
+ "Set to true if the event lasts all day. If true, regardless of whether it's a single-day or multi-day event, start, and endtime must be set to midnight and be in the same time zone."
4540
+ ).nullish(),
4541
+ isCancelled: z.boolean().describe("Set to true if the event has been canceled.").nullish(),
4542
+ isDraft: z.boolean().describe(
4543
+ "Set to true if the user has updated the meeting in Outlook but hasn't sent the updates to attendees. Set to false if all changes are sent, or if the event is an appointment without any attendees."
4544
+ ).nullish(),
4545
+ isOnlineMeeting: z.boolean().describe(
4546
+ "True if this event has online meeting information (that is, onlineMeeting points to an onlineMeetingInfo resource), false otherwise. Default is false (onlineMeeting is null). Optional. After you set isOnlineMeeting to true, Microsoft Graph initializes onlineMeeting. Subsequently, Outlook ignores any further changes to isOnlineMeeting, and the meeting remains available online."
4547
+ ).nullish(),
4548
+ isOrganizer: z.boolean().describe(
4549
+ "Set to true if the calendar owner (specified by the owner property of the calendar) is the organizer of the event (specified by the organizer property of the event). It also applies if a delegate organized the event on behalf of the owner."
4550
+ ).nullish(),
4551
+ isReminderOn: z.boolean().describe("Set to true if an alert is set to remind the user of the event.").nullish(),
4552
+ location: microsoft_graph_location.optional(),
4553
+ locations: z.array(microsoft_graph_location).describe(
4554
+ "The locations where the event is held or attended from. The location and locations properties always correspond with each other. If you update the location property, any prior locations in the locations collection are removed and replaced by the new location value."
4555
+ ).optional(),
4556
+ onlineMeeting: microsoft_graph_onlineMeetingInfo.optional(),
4557
+ onlineMeetingProvider: microsoft_graph_onlineMeetingProviderType.optional(),
4558
+ onlineMeetingUrl: z.string().describe(
4559
+ "A URL for an online meeting. The property is set only when an organizer specifies in Outlook that an event is an online meeting such as Skype. Read-only.To access the URL to join an online meeting, use joinUrl which is exposed via the onlineMeeting property of the event. The onlineMeetingUrl property will be deprecated in the future."
4560
+ ).nullish(),
4561
+ organizer: microsoft_graph_recipient.optional()
4562
+ }).strict().passthrough()
4563
+ },
4564
+ {
4565
+ status: NaN,
4566
+ description: `error`,
4567
+ schema: microsoft_graph_ODataErrors_ODataError
4568
+ },
4569
+ {
4570
+ status: NaN,
4571
+ description: `error`,
4572
+ schema: microsoft_graph_ODataErrors_ODataError
4573
+ }
4574
+ ]
4575
+ },
4576
+ {
4577
+ method: "get",
4578
+ path: "/me/calendars/:calendarId/events/:eventId",
4579
+ alias: "get-specific-calendar-event",
4580
+ description: `The events in the calendar. Navigation property. Read-only.`,
4581
+ requestFormat: "json",
4582
+ parameters: [
4583
+ {
4584
+ name: "$select",
4585
+ type: "Query",
4586
+ schema: z.array(z.string()).describe("Select properties to be returned").optional()
4587
+ },
4588
+ {
4589
+ name: "$expand",
4590
+ type: "Query",
4591
+ schema: z.array(z.string()).describe("Expand related entities").optional()
4592
+ }
4593
+ ],
4594
+ response: z.void(),
4595
+ errors: [
4596
+ {
4597
+ status: NaN,
4598
+ description: `Retrieved navigation property`,
4599
+ schema: z.object({
4600
+ type: microsoft_graph_eventType.optional(),
4601
+ body: microsoft_graph_itemBody.optional(),
4602
+ subject: z.string().describe("The text of the event's subject line.").nullish(),
4603
+ attachments: z.array(microsoft_graph_attachment).describe(
4604
+ "The collection of FileAttachment, ItemAttachment, and referenceAttachment attachments for the event. Navigation property. Read-only. Nullable."
4605
+ ).optional(),
4606
+ allowNewTimeProposals: z.boolean().describe(
4607
+ "true if the meeting organizer allows invitees to propose a new time when responding; otherwise, false. Optional. The default is true."
4608
+ ).nullish(),
4609
+ attendees: z.array(microsoft_graph_attendee).describe("The collection of attendees for the event.").optional(),
4610
+ bodyPreview: z.string().describe(
4611
+ "The preview of the message associated with the event. It's in text format."
4612
+ ).nullish(),
4613
+ cancelledOccurrences: z.array(z.string()).describe(
4614
+ "Contains occurrenceId property values of canceled instances in a recurring series, if the event is the series master. Instances in a recurring series that are canceled are called canceled occurences.Returned only on $select in a Get operation which specifies the ID (seriesMasterId property value) of a series master event."
4615
+ ).optional(),
4616
+ end: microsoft_graph_dateTimeTimeZone.optional(),
4617
+ hasAttachments: z.boolean().describe("Set to true if the event has attachments.").nullish(),
4618
+ hideAttendees: z.boolean().describe(
4619
+ "When set to true, each attendee only sees themselves in the meeting request and meeting Tracking list. The default is false."
4620
+ ).nullish(),
4621
+ iCalUId: z.string().describe(
4622
+ "A unique identifier for an event across calendars. This ID is different for each occurrence in a recurring series. Read-only."
4623
+ ).nullish(),
4624
+ importance: microsoft_graph_importance.optional(),
4625
+ isAllDay: z.boolean().describe(
4626
+ "Set to true if the event lasts all day. If true, regardless of whether it's a single-day or multi-day event, start, and endtime must be set to midnight and be in the same time zone."
4627
+ ).nullish(),
4628
+ isCancelled: z.boolean().describe("Set to true if the event has been canceled.").nullish(),
4629
+ isDraft: z.boolean().describe(
4630
+ "Set to true if the user has updated the meeting in Outlook but hasn't sent the updates to attendees. Set to false if all changes are sent, or if the event is an appointment without any attendees."
4631
+ ).nullish(),
4632
+ isOnlineMeeting: z.boolean().describe(
4633
+ "True if this event has online meeting information (that is, onlineMeeting points to an onlineMeetingInfo resource), false otherwise. Default is false (onlineMeeting is null). Optional. After you set isOnlineMeeting to true, Microsoft Graph initializes onlineMeeting. Subsequently, Outlook ignores any further changes to isOnlineMeeting, and the meeting remains available online."
4634
+ ).nullish(),
4635
+ isOrganizer: z.boolean().describe(
4636
+ "Set to true if the calendar owner (specified by the owner property of the calendar) is the organizer of the event (specified by the organizer property of the event). It also applies if a delegate organized the event on behalf of the owner."
4637
+ ).nullish(),
4638
+ isReminderOn: z.boolean().describe("Set to true if an alert is set to remind the user of the event.").nullish(),
4639
+ location: microsoft_graph_location.optional(),
4640
+ locations: z.array(microsoft_graph_location).describe(
4641
+ "The locations where the event is held or attended from. The location and locations properties always correspond with each other. If you update the location property, any prior locations in the locations collection are removed and replaced by the new location value."
4642
+ ).optional(),
4643
+ onlineMeeting: microsoft_graph_onlineMeetingInfo.optional(),
4644
+ onlineMeetingProvider: microsoft_graph_onlineMeetingProviderType.optional(),
4645
+ onlineMeetingUrl: z.string().describe(
4646
+ "A URL for an online meeting. The property is set only when an organizer specifies in Outlook that an event is an online meeting such as Skype. Read-only.To access the URL to join an online meeting, use joinUrl which is exposed via the onlineMeeting property of the event. The onlineMeetingUrl property will be deprecated in the future."
4647
+ ).nullish(),
4648
+ organizer: microsoft_graph_recipient.optional()
4649
+ }).strict().passthrough()
4650
+ },
4651
+ {
4652
+ status: NaN,
4653
+ description: `error`,
4654
+ schema: microsoft_graph_ODataErrors_ODataError
4655
+ },
4656
+ {
4657
+ status: NaN,
4658
+ description: `error`,
4659
+ schema: microsoft_graph_ODataErrors_ODataError
4660
+ }
4661
+ ]
4662
+ },
4663
+ {
4664
+ method: "patch",
4665
+ path: "/me/calendars/:calendarId/events/:eventId",
4666
+ alias: "update-specific-calendar-event",
4667
+ description: `Update the navigation property events in me`,
4668
+ requestFormat: "json",
4669
+ parameters: [
4670
+ {
4671
+ name: "body",
4672
+ description: `New navigation property values`,
4673
+ type: "Body",
4674
+ schema: z.object({
4675
+ type: microsoft_graph_eventType.optional(),
4676
+ body: microsoft_graph_itemBody.optional(),
4677
+ subject: z.string().describe("The text of the event's subject line.").nullish(),
4678
+ attachments: z.array(microsoft_graph_attachment).describe(
4679
+ "The collection of FileAttachment, ItemAttachment, and referenceAttachment attachments for the event. Navigation property. Read-only. Nullable."
4680
+ ).optional(),
4681
+ allowNewTimeProposals: z.boolean().describe(
4682
+ "true if the meeting organizer allows invitees to propose a new time when responding; otherwise, false. Optional. The default is true."
4683
+ ).nullish(),
4684
+ attendees: z.array(microsoft_graph_attendee).describe("The collection of attendees for the event.").optional(),
4685
+ bodyPreview: z.string().describe(
4686
+ "The preview of the message associated with the event. It's in text format."
4687
+ ).nullish(),
4688
+ cancelledOccurrences: z.array(z.string()).describe(
4689
+ "Contains occurrenceId property values of canceled instances in a recurring series, if the event is the series master. Instances in a recurring series that are canceled are called canceled occurences.Returned only on $select in a Get operation which specifies the ID (seriesMasterId property value) of a series master event."
4690
+ ).optional(),
4691
+ end: microsoft_graph_dateTimeTimeZone.optional(),
4692
+ hasAttachments: z.boolean().describe("Set to true if the event has attachments.").nullish(),
4693
+ hideAttendees: z.boolean().describe(
4694
+ "When set to true, each attendee only sees themselves in the meeting request and meeting Tracking list. The default is false."
4695
+ ).nullish(),
4696
+ iCalUId: z.string().describe(
4697
+ "A unique identifier for an event across calendars. This ID is different for each occurrence in a recurring series. Read-only."
4698
+ ).nullish(),
4699
+ importance: microsoft_graph_importance.optional(),
4700
+ isAllDay: z.boolean().describe(
4701
+ "Set to true if the event lasts all day. If true, regardless of whether it's a single-day or multi-day event, start, and endtime must be set to midnight and be in the same time zone."
4702
+ ).nullish(),
4703
+ isCancelled: z.boolean().describe("Set to true if the event has been canceled.").nullish(),
4704
+ isDraft: z.boolean().describe(
4705
+ "Set to true if the user has updated the meeting in Outlook but hasn't sent the updates to attendees. Set to false if all changes are sent, or if the event is an appointment without any attendees."
4706
+ ).nullish(),
4707
+ isOnlineMeeting: z.boolean().describe(
4708
+ "True if this event has online meeting information (that is, onlineMeeting points to an onlineMeetingInfo resource), false otherwise. Default is false (onlineMeeting is null). Optional. After you set isOnlineMeeting to true, Microsoft Graph initializes onlineMeeting. Subsequently, Outlook ignores any further changes to isOnlineMeeting, and the meeting remains available online."
4709
+ ).nullish(),
4710
+ isOrganizer: z.boolean().describe(
4711
+ "Set to true if the calendar owner (specified by the owner property of the calendar) is the organizer of the event (specified by the organizer property of the event). It also applies if a delegate organized the event on behalf of the owner."
4712
+ ).nullish(),
4713
+ isReminderOn: z.boolean().describe("Set to true if an alert is set to remind the user of the event.").nullish(),
4714
+ location: microsoft_graph_location.optional(),
4715
+ locations: z.array(microsoft_graph_location).describe(
4716
+ "The locations where the event is held or attended from. The location and locations properties always correspond with each other. If you update the location property, any prior locations in the locations collection are removed and replaced by the new location value."
4717
+ ).optional(),
4718
+ onlineMeeting: microsoft_graph_onlineMeetingInfo.optional(),
4719
+ onlineMeetingProvider: microsoft_graph_onlineMeetingProviderType.optional(),
4720
+ onlineMeetingUrl: z.string().describe(
4721
+ "A URL for an online meeting. The property is set only when an organizer specifies in Outlook that an event is an online meeting such as Skype. Read-only.To access the URL to join an online meeting, use joinUrl which is exposed via the onlineMeeting property of the event. The onlineMeetingUrl property will be deprecated in the future."
4722
+ ).nullish(),
4723
+ organizer: microsoft_graph_recipient.optional()
4724
+ }).strict().passthrough()
4725
+ }
4726
+ ],
4727
+ response: z.void(),
4728
+ errors: [
4729
+ {
4730
+ status: NaN,
4731
+ description: `Success`,
4732
+ schema: z.object({
4733
+ type: microsoft_graph_eventType.optional(),
4734
+ body: microsoft_graph_itemBody.optional(),
4735
+ subject: z.string().describe("The text of the event's subject line.").nullish(),
4736
+ attachments: z.array(microsoft_graph_attachment).describe(
4737
+ "The collection of FileAttachment, ItemAttachment, and referenceAttachment attachments for the event. Navigation property. Read-only. Nullable."
4738
+ ).optional(),
4739
+ allowNewTimeProposals: z.boolean().describe(
4740
+ "true if the meeting organizer allows invitees to propose a new time when responding; otherwise, false. Optional. The default is true."
4741
+ ).nullish(),
4742
+ attendees: z.array(microsoft_graph_attendee).describe("The collection of attendees for the event.").optional(),
4743
+ bodyPreview: z.string().describe(
4744
+ "The preview of the message associated with the event. It's in text format."
4745
+ ).nullish(),
4746
+ cancelledOccurrences: z.array(z.string()).describe(
4747
+ "Contains occurrenceId property values of canceled instances in a recurring series, if the event is the series master. Instances in a recurring series that are canceled are called canceled occurences.Returned only on $select in a Get operation which specifies the ID (seriesMasterId property value) of a series master event."
4748
+ ).optional(),
4749
+ end: microsoft_graph_dateTimeTimeZone.optional(),
4750
+ hasAttachments: z.boolean().describe("Set to true if the event has attachments.").nullish(),
4751
+ hideAttendees: z.boolean().describe(
4752
+ "When set to true, each attendee only sees themselves in the meeting request and meeting Tracking list. The default is false."
4753
+ ).nullish(),
4754
+ iCalUId: z.string().describe(
4755
+ "A unique identifier for an event across calendars. This ID is different for each occurrence in a recurring series. Read-only."
4756
+ ).nullish(),
4757
+ importance: microsoft_graph_importance.optional(),
4758
+ isAllDay: z.boolean().describe(
4759
+ "Set to true if the event lasts all day. If true, regardless of whether it's a single-day or multi-day event, start, and endtime must be set to midnight and be in the same time zone."
4760
+ ).nullish(),
4761
+ isCancelled: z.boolean().describe("Set to true if the event has been canceled.").nullish(),
4762
+ isDraft: z.boolean().describe(
4763
+ "Set to true if the user has updated the meeting in Outlook but hasn't sent the updates to attendees. Set to false if all changes are sent, or if the event is an appointment without any attendees."
4764
+ ).nullish(),
4765
+ isOnlineMeeting: z.boolean().describe(
4766
+ "True if this event has online meeting information (that is, onlineMeeting points to an onlineMeetingInfo resource), false otherwise. Default is false (onlineMeeting is null). Optional. After you set isOnlineMeeting to true, Microsoft Graph initializes onlineMeeting. Subsequently, Outlook ignores any further changes to isOnlineMeeting, and the meeting remains available online."
4767
+ ).nullish(),
4768
+ isOrganizer: z.boolean().describe(
4769
+ "Set to true if the calendar owner (specified by the owner property of the calendar) is the organizer of the event (specified by the organizer property of the event). It also applies if a delegate organized the event on behalf of the owner."
4770
+ ).nullish(),
4771
+ isReminderOn: z.boolean().describe("Set to true if an alert is set to remind the user of the event.").nullish(),
4772
+ location: microsoft_graph_location.optional(),
4773
+ locations: z.array(microsoft_graph_location).describe(
4774
+ "The locations where the event is held or attended from. The location and locations properties always correspond with each other. If you update the location property, any prior locations in the locations collection are removed and replaced by the new location value."
4775
+ ).optional(),
4776
+ onlineMeeting: microsoft_graph_onlineMeetingInfo.optional(),
4777
+ onlineMeetingProvider: microsoft_graph_onlineMeetingProviderType.optional(),
4778
+ onlineMeetingUrl: z.string().describe(
4779
+ "A URL for an online meeting. The property is set only when an organizer specifies in Outlook that an event is an online meeting such as Skype. Read-only.To access the URL to join an online meeting, use joinUrl which is exposed via the onlineMeeting property of the event. The onlineMeetingUrl property will be deprecated in the future."
4780
+ ).nullish(),
4781
+ organizer: microsoft_graph_recipient.optional()
4782
+ }).strict().passthrough()
4783
+ },
4784
+ {
4785
+ status: NaN,
4786
+ description: `error`,
4787
+ schema: microsoft_graph_ODataErrors_ODataError
4788
+ },
4789
+ {
4790
+ status: NaN,
4791
+ description: `error`,
4792
+ schema: microsoft_graph_ODataErrors_ODataError
4793
+ }
4794
+ ]
4795
+ },
4796
+ {
4797
+ method: "delete",
4798
+ path: "/me/calendars/:calendarId/events/:eventId",
4799
+ alias: "delete-specific-calendar-event",
4800
+ description: `Delete navigation property events for me`,
4801
+ requestFormat: "json",
4802
+ parameters: [
4803
+ {
4804
+ name: "If-Match",
4805
+ type: "Header",
4806
+ schema: z.string().describe("ETag").optional()
4807
+ }
4808
+ ],
4809
+ response: z.void(),
4810
+ errors: [
4811
+ {
4812
+ status: NaN,
4813
+ description: `error`,
4814
+ schema: microsoft_graph_ODataErrors_ODataError
4815
+ },
4816
+ {
4817
+ status: NaN,
4818
+ description: `error`,
4819
+ schema: microsoft_graph_ODataErrors_ODataError
4820
+ }
4821
+ ]
4822
+ },
4376
4823
  {
4377
4824
  method: "get",
4378
4825
  path: "/me/calendarView",
@@ -5611,7 +6058,7 @@ or their delegates can book a private meeting room. If you're organizing an
5611
6058
  method: "get",
5612
6059
  path: "/me/messages",
5613
6060
  alias: "list-mail-messages",
5614
- description: `Get an open extension (openTypeExtension object) identified by name or fully qualified name. The table in the Permissions section lists the resources that support open extensions. The following table lists the three scenarios where you can get an open extension from a supported resource instance.`,
6061
+ description: `Get the messages in the signed-in user's mailbox (including the Deleted Items and Clutter folders). Depending on the page size and mailbox data, getting messages from a mailbox can incur multiple requests. The default page size is 10 messages. Use $top to customize the page size, within the range of 1 and 1000. To improve the operation response time, use $select to specify the exact properties you need; see example 1 below. Fine-tune the values for $select and $top, especially when you must use a larger page size, as returning a page with hundreds of messages each with a full response payload may trigger the gateway timeout (HTTP 504). To get the next page of messages, simply apply the entire URL returned in @odata.nextLink to the next get-messages request. This URL includes any query parameters you may have specified in the initial request. Do not try to extract the $skip value from the @odata.nextLink URL to manipulate responses. This API uses the $skip value to keep count of all the items it has gone through in the user's mailbox to return a page of message-type items. It's therefore possible that even in the initial response, the $skip value is larger than the page size. For more information, see Paging Microsoft Graph data in your app. Currently, this operation returns message bodies in only HTML format. There are two scenarios where an app can get messages in another user's mail folder:`,
5615
6062
  requestFormat: "json",
5616
6063
  parameters: [
5617
6064
  {
@@ -5683,11 +6130,7 @@ or their delegates can book a private meeting room. If you're organizing an
5683
6130
  method: "post",
5684
6131
  path: "/me/messages",
5685
6132
  alias: "create-draft-email",
5686
- description: `Create a draft of a new message in either JSON or MIME format. When using JSON format, you can:
5687
- - Include an attachment to the message.
5688
- - Update the draft later to add content to the body or change other message properties. When using MIME format:
5689
- - Provide the applicable Internet message headers and the MIME content, all encoded in base64 format in the request body.
5690
- - /* Add any attachments and S/MIME properties to the MIME content. By default, this operation saves the draft in the Drafts folder. Send the draft message in a subsequent operation. Alternatively, send a new message in a single operation, or create a draft to forward, reply and reply-all to an existing message.`,
6133
+ description: `Create an open extension (openTypeExtension object) and add custom properties in a new or existing instance of a resource. You can create an open extension in a resource instance and store custom data to it all in the same operation, except for specific resources. The table in the Permissions section lists the resources that support open extensions.`,
5691
6134
  requestFormat: "json",
5692
6135
  parameters: [
5693
6136
  {
@@ -5800,7 +6243,13 @@ or their delegates can book a private meeting room. If you're organizing an
5800
6243
  method: "get",
5801
6244
  path: "/me/messages/:messageId",
5802
6245
  alias: "get-mail-message",
5803
- description: `Get the properties and relationships of the eventMessage object. Apply the $expand parameter on the event navigation property to get the associated event in an attendee's calendar. Currently, this operation returns event message bodies in only HTML format.`,
6246
+ description: `You can get a single resource instance expanded with a specific extended property, or a collection of resource instances
6247
+ that include extended properties matching a filter. Using the query parameter $expand allows you to get the specified resource instance expanded with a specific extended
6248
+ property. Use a $filter and eq operator on the id property to specify the extended property. This is currently the only way to get the singleValueLegacyExtendedProperty object that represents an extended property. To get resource instances that have certain extended properties, use the $filter query parameter and apply an eq operator
6249
+ on the id property. In addition, for numeric extended properties, apply one of the following operators on the value property:
6250
+ eq, ne,ge, gt, le, or lt. For string-typed extended properties, apply a contains, startswith, eq, or ne operator on value. The filter is applied to all instances of the resource in the signed-in user's mailbox. Filtering the string name (Name) in the id of an extended property is case-sensitive. Filtering the value property of an extended
6251
+ property is case-insensitive. The following user resources are supported: As well as the following group resources: See Extended properties overview for more information about when to use
6252
+ open extensions or extended properties, and how to specify extended properties.`,
5804
6253
  requestFormat: "json",
5805
6254
  parameters: [
5806
6255
  {
@@ -5877,7 +6326,7 @@ or their delegates can book a private meeting room. If you're organizing an
5877
6326
  method: "delete",
5878
6327
  path: "/me/messages/:messageId",
5879
6328
  alias: "delete-mail-message",
5880
- description: `Delete eventMessage.`,
6329
+ description: `Delete a message in the specified user's mailbox, or delete a relationship of the message.`,
5881
6330
  requestFormat: "json",
5882
6331
  parameters: [
5883
6332
  {
@@ -5904,7 +6353,7 @@ or their delegates can book a private meeting room. If you're organizing an
5904
6353
  method: "get",
5905
6354
  path: "/me/messages/:messageId/attachments",
5906
6355
  alias: "list-mail-attachments",
5907
- description: `Retrieve a list of attachment objects attached to a message.`,
6356
+ description: `Retrieve a list of attachment objects.`,
5908
6357
  requestFormat: "json",
5909
6358
  parameters: [
5910
6359
  {
@@ -7336,8 +7785,7 @@ add an attachment to a message that is being created and sent on the fly. This o
7336
7785
  method: "get",
7337
7786
  path: "/sites",
7338
7787
  alias: "search-sharepoint-sites",
7339
- description: `List all available sites in an organization. Specific filter criteria and query options are also supported and described below: In addition, you can use a $search query against the /sites collection to find sites matching given keywords.
7340
- If you want to list all sites across all geographies, refer to getAllSites. For more guidance about building applications that use site discovery for scanning purposes, see Best practices for discovering files and detecting changes at scale.`,
7788
+ description: `Search across a SharePoint tenant for sites that match keywords provided. The only property that works for sorting is createdDateTime. The search filter is a free text search that uses multiple properties when retrieving the search results.`,
7341
7789
  requestFormat: "json",
7342
7790
  parameters: [
7343
7791
  {
@@ -7815,7 +8263,7 @@ To list them, include system in your $select statement.`,
7815
8263
  method: "get",
7816
8264
  path: "/sites/:siteId/lists/:listId",
7817
8265
  alias: "get-sharepoint-site-list",
7818
- description: `Get a list of rich long-running operations associated with a list.`,
8266
+ description: `Returns the metadata for a list.`,
7819
8267
  requestFormat: "json",
7820
8268
  parameters: [
7821
8269
  {
@@ -8276,7 +8724,7 @@ To monitor future changes, call the delta API by using the @odata.deltaLink in t
8276
8724
  method: "post",
8277
8725
  path: "/teams/:teamId/channels/:channelId/messages",
8278
8726
  alias: "send-channel-message",
8279
- description: `Send a new chatMessage in the specified channel.`,
8727
+ description: `Send a new chatMessage in the specified channel or a chat.`,
8280
8728
  requestFormat: "json",
8281
8729
  parameters: [
8282
8730
  {
@@ -8413,7 +8861,7 @@ To monitor future changes, call the delta API by using the @odata.deltaLink in t
8413
8861
  method: "get",
8414
8862
  path: "/users",
8415
8863
  alias: "list-users",
8416
- description: `List properties and relationships of the user objects.`,
8864
+ description: `Retrieve a list of user objects.`,
8417
8865
  requestFormat: "json",
8418
8866
  parameters: [
8419
8867
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softeria/ms-365-mcp-server",
3
- "version": "0.19.1",
3
+ "version": "0.19.2",
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",
@@ -131,6 +131,36 @@
131
131
  "toolName": "delete-calendar-event",
132
132
  "scopes": ["Calendars.ReadWrite"]
133
133
  },
134
+ {
135
+ "pathPattern": "/me/calendars/{calendar-id}/events",
136
+ "method": "get",
137
+ "toolName": "list-specific-calendar-events",
138
+ "scopes": ["Calendars.Read"]
139
+ },
140
+ {
141
+ "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}",
142
+ "method": "get",
143
+ "toolName": "get-specific-calendar-event",
144
+ "scopes": ["Calendars.Read"]
145
+ },
146
+ {
147
+ "pathPattern": "/me/calendars/{calendar-id}/events",
148
+ "method": "post",
149
+ "toolName": "create-specific-calendar-event",
150
+ "scopes": ["Calendars.ReadWrite"]
151
+ },
152
+ {
153
+ "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}",
154
+ "method": "patch",
155
+ "toolName": "update-specific-calendar-event",
156
+ "scopes": ["Calendars.ReadWrite"]
157
+ },
158
+ {
159
+ "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}",
160
+ "method": "delete",
161
+ "toolName": "delete-specific-calendar-event",
162
+ "scopes": ["Calendars.ReadWrite"]
163
+ },
134
164
  {
135
165
  "pathPattern": "/me/calendarView",
136
166
  "method": "get",
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Test script to verify the calendarId parameter fix
4
+ // This simulates what the MCP client would do
5
+
6
+ import { spawn } from 'child_process';
7
+ import { fileURLToPath } from 'url';
8
+ import { dirname, join } from 'path';
9
+
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+
13
+ // Start the MCP server
14
+ const server = spawn('node', [join(__dirname, 'dist', 'index.js'), '-v'], {
15
+ stdio: ['pipe', 'pipe', 'inherit'],
16
+ });
17
+
18
+ // Wait a bit for server to start
19
+ setTimeout(() => {
20
+ // Test the create-calendar-event with calendarId
21
+ const testRequest = {
22
+ jsonrpc: '2.0',
23
+ method: 'tools/call',
24
+ params: {
25
+ name: 'create-calendar-event',
26
+ arguments: {
27
+ calendarId: 'EXAMPLE_CALENDAR_ID_HERE',
28
+ body: {
29
+ subject: 'Test Event on Specific Calendar',
30
+ body: {
31
+ contentType: 'text',
32
+ content: 'Testing calendarId parameter fix',
33
+ },
34
+ start: {
35
+ dateTime: '2025-12-01T10:00:00.0000000',
36
+ timeZone: 'America/New_York',
37
+ },
38
+ end: {
39
+ dateTime: '2025-12-01T11:00:00.0000000',
40
+ timeZone: 'America/New_York',
41
+ },
42
+ },
43
+ },
44
+ },
45
+ id: 1,
46
+ };
47
+
48
+ console.log('Sending test request:', JSON.stringify(testRequest, null, 2));
49
+
50
+ server.stdin.write(JSON.stringify(testRequest) + '\n');
51
+
52
+ // Read response
53
+ server.stdout.on('data', (data) => {
54
+ console.log('Response:', data.toString());
55
+ });
56
+
57
+ // Close after a few seconds
58
+ setTimeout(() => {
59
+ server.kill();
60
+ process.exit(0);
61
+ }, 5000);
62
+ }, 2000);
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Direct test of the calendar fix using our local build
4
+ import GraphClient from './dist/graph-client.js';
5
+ import { registerGraphTools } from './dist/graph-tools.js';
6
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
+
8
+ async function testCalendarFix() {
9
+ console.log('Testing calendar fix with Specific Calendar...\n');
10
+
11
+ // Initialize the graph client
12
+ const graphClient = new GraphClient();
13
+
14
+ // Check if we're logged in
15
+ try {
16
+ await graphClient.ensureAuthenticated();
17
+ console.log('✓ Authenticated successfully\n');
18
+ } catch (error) {
19
+ console.error('Authentication failed. Please run: npm run dev -- --login');
20
+ process.exit(1);
21
+ }
22
+
23
+ // Test parameters
24
+ const exampleCalendarId = 'EXAMPLE_CALENDAR_ID_HERE';
25
+
26
+ const testEvent = {
27
+ subject: 'TEST - Calendar Fix Verification',
28
+ body: {
29
+ contentType: 'text',
30
+ content: 'This test verifies that events can be created on the Specific Calendar',
31
+ },
32
+ start: {
33
+ dateTime: '2025-12-20T10:00:00',
34
+ timeZone: 'America/New_York',
35
+ },
36
+ end: {
37
+ dateTime: '2025-12-20T11:00:00',
38
+ timeZone: 'America/New_York',
39
+ },
40
+ };
41
+
42
+ // Build the path with our fix
43
+ const path = `/me/calendars/${encodeURIComponent(exampleCalendarId)}/events`;
44
+ console.log('Using path:', path);
45
+ console.log('');
46
+
47
+ try {
48
+ // Make the request
49
+ const response = await graphClient.graphRequest(path, {
50
+ method: 'POST',
51
+ body: JSON.stringify(testEvent),
52
+ });
53
+
54
+ const result = JSON.parse(response.content[0].text);
55
+ console.log('✓ Event created successfully!');
56
+ console.log(' Event ID:', result.id);
57
+ console.log(' Subject:', result.subject);
58
+ console.log('');
59
+
60
+ // Verify it's on the correct calendar by checking the event
61
+ console.log('Verifying calendar placement...');
62
+ const getPath = `/me/events/${result.id}`;
63
+ const verifyResponse = await graphClient.graphRequest(getPath, {
64
+ method: 'GET',
65
+ });
66
+
67
+ const event = JSON.parse(verifyResponse.content[0].text);
68
+
69
+ // The calendar link should contain the Specific Calendar ID
70
+ if (
71
+ event['calendar@odata.navigationLink'] &&
72
+ event['calendar@odata.navigationLink'].includes(exampleCalendarId)
73
+ ) {
74
+ console.log('✅ SUCCESS! Event was created on the Specific Calendar!');
75
+ } else {
76
+ console.log('❌ Event was created but on the wrong calendar');
77
+ console.log('Calendar link:', event['calendar@odata.navigationLink']);
78
+ }
79
+
80
+ // Clean up - delete the test event
81
+ console.log('\nCleaning up test event...');
82
+ await graphClient.graphRequest(`/me/events/${result.id}`, {
83
+ method: 'DELETE',
84
+ });
85
+ console.log('✓ Test event deleted');
86
+ } catch (error) {
87
+ console.error('Error creating event:', error.message);
88
+ if (error.response) {
89
+ console.error('Response:', error.response);
90
+ }
91
+ }
92
+
93
+ process.exit(0);
94
+ }
95
+
96
+ testCalendarFix().catch(console.error);