@softeria/ms-365-mcp-server 0.147.0 → 0.148.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -165,6 +165,38 @@
165
165
  "workScopes": ["Mail.Send.Shared"],
166
166
  "llmTip": "Forward a message from a shared mailbox preserving full HTML formatting and attachments. The 'user-id' is the shared mailbox email address. 'toRecipients' is required. The 'comment' field adds text above the forwarded content. Requires Send As permission on the shared mailbox in Exchange."
167
167
  },
168
+ {
169
+ "pathPattern": "/users/{user-id}/messages/{message-id}/createReply",
170
+ "method": "post",
171
+ "toolName": "create-shared-mailbox-reply-draft",
172
+ "presets": ["work"],
173
+ "workScopes": ["Mail.ReadWrite.Shared"],
174
+ "llmTip": "Create a reply draft in a shared mailbox preserving thread metadata (conversationId, In-Reply-To, References). The 'user-id' is the shared mailbox email address (e.g. support@contoso.com). Does not send — use send-shared-mailbox-draft to send afterwards. For HTML replies pass Message.body.contentType: 'html' with Message.body.content as HTML. Specifying both 'comment' and Message.body returns 400. Requires delegated access to the shared mailbox."
175
+ },
176
+ {
177
+ "pathPattern": "/users/{user-id}/messages/{message-id}/createReplyAll",
178
+ "method": "post",
179
+ "toolName": "create-shared-mailbox-reply-all-draft",
180
+ "presets": ["work"],
181
+ "workScopes": ["Mail.ReadWrite.Shared"],
182
+ "llmTip": "Create a reply-all draft in a shared mailbox preserving thread metadata (conversationId, In-Reply-To, References). The 'user-id' is the shared mailbox email address. Does not send — use send-shared-mailbox-draft to send afterwards. For HTML replies pass Message.body.contentType: 'html' with Message.body.content as HTML. Specifying both 'comment' and Message.body returns 400. Requires delegated access to the shared mailbox."
183
+ },
184
+ {
185
+ "pathPattern": "/users/{user-id}/messages/{message-id}/createForward",
186
+ "method": "post",
187
+ "toolName": "create-shared-mailbox-forward-draft",
188
+ "presets": ["work"],
189
+ "workScopes": ["Mail.ReadWrite.Shared"],
190
+ "llmTip": "Create a forward draft in a shared mailbox without sending. The 'user-id' is the shared mailbox email address. Does not send — use send-shared-mailbox-draft to send afterwards. Useful when the user wants to review before the forward goes out. Requires delegated access to the shared mailbox."
191
+ },
192
+ {
193
+ "pathPattern": "/users/{user-id}/messages/{message-id}/send",
194
+ "method": "post",
195
+ "toolName": "send-shared-mailbox-draft",
196
+ "presets": ["work"],
197
+ "workScopes": ["Mail.Send.Shared"],
198
+ "llmTip": "Send an existing draft from a shared mailbox. No request body needed — just call with the message ID and the shared mailbox user-id. Draft must exist in the shared mailbox's Drafts folder. Requires Send As permission on the shared mailbox in Exchange."
199
+ },
168
200
  {
169
201
  "pathPattern": "/users",
170
202
  "method": "get",
@@ -478,7 +510,7 @@
478
510
  "scopes": ["Calendars.Read"],
479
511
  "supportsTimezone": true,
480
512
  "supportsExpandExtendedProperties": true,
481
- "llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for the default calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Use get-specific-calendar-view if you need a non-default calendar. To find Teams meetings, use $filter=isOnlineMeeting eq true. To search by subject, use $filter=contains(subject,'keyword'). Teams meetings include a joinWebUrl property needed for transcript access via list-online-meetings."
513
+ "llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for the default calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Use get-specific-calendar-view if you need a non-default calendar. To find Teams meetings, use $filter=isOnlineMeeting eq true. To search by subject, use $filter=contains(subject,'keyword'). Teams meetings expose their join link as onlineMeeting/joinUrl (select it with $select=onlineMeeting); the event resource has no joinWebUrl property. Pass that joinUrl to list-online-meetings as $filter=JoinWebUrl eq '{url}' to reach transcripts."
482
514
  },
483
515
  {
484
516
  "pathPattern": "/me/calendars/{calendar-id}/calendarView",
@@ -489,7 +521,7 @@
489
521
  "scopes": ["Calendars.Read"],
490
522
  "supportsTimezone": true,
491
523
  "supportsExpandExtendedProperties": true,
492
- "llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for a specific calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Each instance includes seriesMasterId and type (occurrence/exception) fields for recurring event linkage. Use fetchAllPages=true to retrieve all results when there are many events. To find Teams meetings, use $filter=isOnlineMeeting eq true. Teams meetings include a joinWebUrl property needed for transcript access via list-online-meetings."
524
+ "llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for a specific calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Each instance includes seriesMasterId and type (occurrence/exception) fields for recurring event linkage. Use fetchAllPages=true to retrieve all results when there are many events. To find Teams meetings, use $filter=isOnlineMeeting eq true. Teams meetings expose their join link as onlineMeeting/joinUrl (select it with $select=onlineMeeting); the event resource has no joinWebUrl property. Pass that joinUrl to list-online-meetings as $filter=JoinWebUrl eq '{url}' to reach transcripts."
493
525
  },
494
526
  {
495
527
  "pathPattern": "/me/calendar/getSchedule",
@@ -1560,7 +1592,8 @@
1560
1592
  "method": "get",
1561
1593
  "toolName": "list-chats",
1562
1594
  "presets": ["teams", "teams-write", "work"],
1563
- "workScopes": ["Chat.ReadBasic"]
1595
+ "workScopes": ["Chat.ReadBasic"],
1596
+ "llmTip": "Lists the signed-in user's chats. Only $filter, $top (max 50), $expand (members, lastMessagePreview) and $orderby are supported; $orderby accepts just lastMessagePreview/createdDateTime in descending order. Other options are rejected: $search returns 400 'Query option Search is not allowed', and ordering by lastUpdatedDateTime returns 400 BadRequest. Meeting chats have chatType=meeting and carry the meeting subject in topic."
1564
1597
  },
1565
1598
  {
1566
1599
  "pathPattern": "/chats/{chat-id}",
@@ -1582,7 +1615,8 @@
1582
1615
  "method": "get",
1583
1616
  "toolName": "list-chat-messages",
1584
1617
  "presets": ["teams", "work"],
1585
- "workScopes": ["ChatMessage.Read"]
1618
+ "workScopes": ["ChatMessage.Read"],
1619
+ "llmTip": "Lists messages in a chat. $top is capped at 50 (higher values return 400) and $orderby accepts only descending order on createdDateTime or lastModifiedDateTime - ascending is rejected. Meeting chats mostly hold system events; transcripts are not available here, use list-meeting-transcripts instead."
1586
1620
  },
1587
1621
  {
1588
1622
  "pathPattern": "/chats/{chat-id}/messages/{chatMessage-id}",
@@ -2047,7 +2081,7 @@
2047
2081
  "toolName": "list-online-meetings",
2048
2082
  "presets": ["teams", "work"],
2049
2083
  "workScopes": ["OnlineMeetings.Read"],
2050
- "llmTip": "List online meetings. Use $filter=joinWebUrl eq '{url}' to find a specific meeting by its Teams join link. Returns meeting IDs needed for transcript access."
2084
+ "llmTip": "Look up a meeting with $filter=JoinWebUrl eq '{url}', using the joinUrl from an event's onlineMeeting property. This filter is required: the collection cannot be listed or paged, and $search/$orderby are not supported. Without it Graph returns 400 InvalidArgument ('One of the required parameters to lookup meeting by QueryOptions is null or empty'). Returns the meeting ID needed for transcript access."
2051
2085
  },
2052
2086
  {
2053
2087
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}",
@@ -15252,6 +15252,64 @@ Only the policyViolation property of a chatMessage can be updated in application
15252
15252
  ],
15253
15253
  response: z.void()
15254
15254
  },
15255
+ {
15256
+ method: "post",
15257
+ path: "/users/:userId/messages/:messageId/createForward",
15258
+ alias: "create-shared-mailbox-forward-draft",
15259
+ description: `Create a shared mailbox forward draft.`,
15260
+ requestFormat: "json",
15261
+ parameters: [
15262
+ {
15263
+ name: "body",
15264
+ description: `Action parameters`,
15265
+ type: "Body",
15266
+ schema: create_forward_draft_Body
15267
+ }
15268
+ ],
15269
+ response: z.void()
15270
+ },
15271
+ {
15272
+ method: "post",
15273
+ path: "/users/:userId/messages/:messageId/createReply",
15274
+ alias: "create-shared-mailbox-reply-draft",
15275
+ description: `Create a draft to reply to the sender of a message in either JSON or MIME format. When using JSON format:
15276
+ - Specify either a comment or the body property of the message parameter. Specifying both will return an HTTP 400 Bad Request error.
15277
+ - If replyTo is specified in the original message, per Internet Message Format (RFC 2822), you should send the reply to the recipients in replyTo, and not the recipients in from.
15278
+ - You can update the draft later to add reply content to the body or change other message properties. When using MIME format:
15279
+ - Provide the applicable Internet message headers and the MIME content, all encoded in base64 format in the request body.
15280
+ - Add any attachments and S/MIME properties to the MIME content. Send the draft message in a subsequent operation. Alternatively, reply to a message in a single operation.`,
15281
+ requestFormat: "json",
15282
+ parameters: [
15283
+ {
15284
+ name: "body",
15285
+ description: `Action parameters`,
15286
+ type: "Body",
15287
+ schema: create_reply_draft_Body
15288
+ }
15289
+ ],
15290
+ response: z.void()
15291
+ },
15292
+ {
15293
+ method: "post",
15294
+ path: "/users/:userId/messages/:messageId/createReplyAll",
15295
+ alias: "create-shared-mailbox-reply-all-draft",
15296
+ description: `Create a draft to reply to the sender and all recipients of a message in either JSON or MIME format. When using JSON format:
15297
+ - Specify either a comment or the body property of the message parameter. Specifying both will return an HTTP 400 Bad Request error.
15298
+ - If the original message specifies a recipient in the replyTo property, per Internet Message Format (RFC 2822), you should send the reply to the recipients in the replyTo and toRecipients properties, and not the recipients in the from and toRecipients properties.
15299
+ - You can update the draft later to add reply content to the body or change other message properties. When using MIME format:
15300
+ - Provide the applicable Internet message headers and the MIME content, all encoded in base64 format in the request body.
15301
+ - Add any attachments and S/MIME properties to the MIME content. Send the draft message in a subsequent operation. Alternatively, reply-all to a message in a single action.`,
15302
+ requestFormat: "json",
15303
+ parameters: [
15304
+ {
15305
+ name: "body",
15306
+ description: `Action parameters`,
15307
+ type: "Body",
15308
+ schema: create_reply_draft_Body
15309
+ }
15310
+ ],
15311
+ response: z.void()
15312
+ },
15255
15313
  {
15256
15314
  method: "post",
15257
15315
  path: "/users/:userId/messages/:messageId/forward",
@@ -15328,6 +15386,14 @@ Only the policyViolation property of a chatMessage can be updated in application
15328
15386
  ],
15329
15387
  response: z.void()
15330
15388
  },
15389
+ {
15390
+ method: "post",
15391
+ path: "/users/:userId/messages/:messageId/send",
15392
+ alias: "send-shared-mailbox-draft",
15393
+ description: `Send an existing draft message. The draft message can be a new message draft, reply draft, reply-all draft, or a forward draft. This method saves the message in the Sent Items folder. Alternatively, send a new message in a single operation.`,
15394
+ requestFormat: "json",
15395
+ response: z.void()
15396
+ },
15331
15397
  {
15332
15398
  method: "get",
15333
15399
  path: "/users/:userId/presence",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@softeria/ms-365-mcp-server",
3
3
  "mcpName": "io.github.Softeria/ms-365-mcp-server",
4
- "version": "0.147.0",
4
+ "version": "0.148.1",
5
5
  "description": " A Model Context Protocol (MCP) server for interacting with Microsoft 365 and Office services through the Graph API",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
@@ -165,6 +165,38 @@
165
165
  "workScopes": ["Mail.Send.Shared"],
166
166
  "llmTip": "Forward a message from a shared mailbox preserving full HTML formatting and attachments. The 'user-id' is the shared mailbox email address. 'toRecipients' is required. The 'comment' field adds text above the forwarded content. Requires Send As permission on the shared mailbox in Exchange."
167
167
  },
168
+ {
169
+ "pathPattern": "/users/{user-id}/messages/{message-id}/createReply",
170
+ "method": "post",
171
+ "toolName": "create-shared-mailbox-reply-draft",
172
+ "presets": ["work"],
173
+ "workScopes": ["Mail.ReadWrite.Shared"],
174
+ "llmTip": "Create a reply draft in a shared mailbox preserving thread metadata (conversationId, In-Reply-To, References). The 'user-id' is the shared mailbox email address (e.g. support@contoso.com). Does not send — use send-shared-mailbox-draft to send afterwards. For HTML replies pass Message.body.contentType: 'html' with Message.body.content as HTML. Specifying both 'comment' and Message.body returns 400. Requires delegated access to the shared mailbox."
175
+ },
176
+ {
177
+ "pathPattern": "/users/{user-id}/messages/{message-id}/createReplyAll",
178
+ "method": "post",
179
+ "toolName": "create-shared-mailbox-reply-all-draft",
180
+ "presets": ["work"],
181
+ "workScopes": ["Mail.ReadWrite.Shared"],
182
+ "llmTip": "Create a reply-all draft in a shared mailbox preserving thread metadata (conversationId, In-Reply-To, References). The 'user-id' is the shared mailbox email address. Does not send — use send-shared-mailbox-draft to send afterwards. For HTML replies pass Message.body.contentType: 'html' with Message.body.content as HTML. Specifying both 'comment' and Message.body returns 400. Requires delegated access to the shared mailbox."
183
+ },
184
+ {
185
+ "pathPattern": "/users/{user-id}/messages/{message-id}/createForward",
186
+ "method": "post",
187
+ "toolName": "create-shared-mailbox-forward-draft",
188
+ "presets": ["work"],
189
+ "workScopes": ["Mail.ReadWrite.Shared"],
190
+ "llmTip": "Create a forward draft in a shared mailbox without sending. The 'user-id' is the shared mailbox email address. Does not send — use send-shared-mailbox-draft to send afterwards. Useful when the user wants to review before the forward goes out. Requires delegated access to the shared mailbox."
191
+ },
192
+ {
193
+ "pathPattern": "/users/{user-id}/messages/{message-id}/send",
194
+ "method": "post",
195
+ "toolName": "send-shared-mailbox-draft",
196
+ "presets": ["work"],
197
+ "workScopes": ["Mail.Send.Shared"],
198
+ "llmTip": "Send an existing draft from a shared mailbox. No request body needed — just call with the message ID and the shared mailbox user-id. Draft must exist in the shared mailbox's Drafts folder. Requires Send As permission on the shared mailbox in Exchange."
199
+ },
168
200
  {
169
201
  "pathPattern": "/users",
170
202
  "method": "get",
@@ -478,7 +510,7 @@
478
510
  "scopes": ["Calendars.Read"],
479
511
  "supportsTimezone": true,
480
512
  "supportsExpandExtendedProperties": true,
481
- "llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for the default calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Use get-specific-calendar-view if you need a non-default calendar. To find Teams meetings, use $filter=isOnlineMeeting eq true. To search by subject, use $filter=contains(subject,'keyword'). Teams meetings include a joinWebUrl property needed for transcript access via list-online-meetings."
513
+ "llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for the default calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Use get-specific-calendar-view if you need a non-default calendar. To find Teams meetings, use $filter=isOnlineMeeting eq true. To search by subject, use $filter=contains(subject,'keyword'). Teams meetings expose their join link as onlineMeeting/joinUrl (select it with $select=onlineMeeting); the event resource has no joinWebUrl property. Pass that joinUrl to list-online-meetings as $filter=JoinWebUrl eq '{url}' to reach transcripts."
482
514
  },
483
515
  {
484
516
  "pathPattern": "/me/calendars/{calendar-id}/calendarView",
@@ -489,7 +521,7 @@
489
521
  "scopes": ["Calendars.Read"],
490
522
  "supportsTimezone": true,
491
523
  "supportsExpandExtendedProperties": true,
492
- "llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for a specific calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Each instance includes seriesMasterId and type (occurrence/exception) fields for recurring event linkage. Use fetchAllPages=true to retrieve all results when there are many events. To find Teams meetings, use $filter=isOnlineMeeting eq true. Teams meetings include a joinWebUrl property needed for transcript access via list-online-meetings."
524
+ "llmTip": "Returns expanded recurring event instances (not just seriesMaster) within a date range for a specific calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Each instance includes seriesMasterId and type (occurrence/exception) fields for recurring event linkage. Use fetchAllPages=true to retrieve all results when there are many events. To find Teams meetings, use $filter=isOnlineMeeting eq true. Teams meetings expose their join link as onlineMeeting/joinUrl (select it with $select=onlineMeeting); the event resource has no joinWebUrl property. Pass that joinUrl to list-online-meetings as $filter=JoinWebUrl eq '{url}' to reach transcripts."
493
525
  },
494
526
  {
495
527
  "pathPattern": "/me/calendar/getSchedule",
@@ -1560,7 +1592,8 @@
1560
1592
  "method": "get",
1561
1593
  "toolName": "list-chats",
1562
1594
  "presets": ["teams", "teams-write", "work"],
1563
- "workScopes": ["Chat.ReadBasic"]
1595
+ "workScopes": ["Chat.ReadBasic"],
1596
+ "llmTip": "Lists the signed-in user's chats. Only $filter, $top (max 50), $expand (members, lastMessagePreview) and $orderby are supported; $orderby accepts just lastMessagePreview/createdDateTime in descending order. Other options are rejected: $search returns 400 'Query option Search is not allowed', and ordering by lastUpdatedDateTime returns 400 BadRequest. Meeting chats have chatType=meeting and carry the meeting subject in topic."
1564
1597
  },
1565
1598
  {
1566
1599
  "pathPattern": "/chats/{chat-id}",
@@ -1582,7 +1615,8 @@
1582
1615
  "method": "get",
1583
1616
  "toolName": "list-chat-messages",
1584
1617
  "presets": ["teams", "work"],
1585
- "workScopes": ["ChatMessage.Read"]
1618
+ "workScopes": ["ChatMessage.Read"],
1619
+ "llmTip": "Lists messages in a chat. $top is capped at 50 (higher values return 400) and $orderby accepts only descending order on createdDateTime or lastModifiedDateTime - ascending is rejected. Meeting chats mostly hold system events; transcripts are not available here, use list-meeting-transcripts instead."
1586
1620
  },
1587
1621
  {
1588
1622
  "pathPattern": "/chats/{chat-id}/messages/{chatMessage-id}",
@@ -2047,7 +2081,7 @@
2047
2081
  "toolName": "list-online-meetings",
2048
2082
  "presets": ["teams", "work"],
2049
2083
  "workScopes": ["OnlineMeetings.Read"],
2050
- "llmTip": "List online meetings. Use $filter=joinWebUrl eq '{url}' to find a specific meeting by its Teams join link. Returns meeting IDs needed for transcript access."
2084
+ "llmTip": "Look up a meeting with $filter=JoinWebUrl eq '{url}', using the joinUrl from an event's onlineMeeting property. This filter is required: the collection cannot be listed or paged, and $search/$orderby are not supported. Without it Graph returns 400 InvalidArgument ('One of the required parameters to lookup meeting by QueryOptions is null or empty'). Returns the meeting ID needed for transcript access."
2051
2085
  },
2052
2086
  {
2053
2087
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}",