@softeria/ms-365-mcp-server 0.19.0 → 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.
- package/README.md +8 -0
- package/dist/endpoints.json +30 -0
- package/dist/generated/client.js +463 -15
- package/package.json +1 -2
- package/src/endpoints.json +30 -0
- package/test-calendar-fix.js +62 -0
- package/test-real-calendar.js +96 -0
package/README.md
CHANGED
|
@@ -313,6 +313,14 @@ Run the verification script to check all code quality requirements:
|
|
|
313
313
|
npm run verify
|
|
314
314
|
```
|
|
315
315
|
|
|
316
|
+
### For Developers
|
|
317
|
+
|
|
318
|
+
After cloning the repository, you may need to generate the client code from the Microsoft Graph OpenAPI specification:
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
npm run generate
|
|
322
|
+
```
|
|
323
|
+
|
|
316
324
|
## Support
|
|
317
325
|
|
|
318
326
|
If you're having problems or need help:
|
package/dist/endpoints.json
CHANGED
|
@@ -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",
|
package/dist/generated/client.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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: `
|
|
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
|
|
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
|
|
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: `
|
|
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: `
|
|
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: `
|
|
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.
|
|
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",
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
11
|
"generate": "node bin/generate-graph-client.mjs",
|
|
12
|
-
"postinstall": "npm run generate",
|
|
13
12
|
"build": "tsup",
|
|
14
13
|
"test": "vitest run",
|
|
15
14
|
"test:watch": "vitest",
|
package/src/endpoints.json
CHANGED
|
@@ -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);
|