@softeria/ms-365-mcp-server 0.114.2 → 0.114.4

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.
@@ -10,6 +10,7 @@
10
10
  "pathPattern": "/me/messages",
11
11
  "method": "get",
12
12
  "toolName": "list-mail-messages",
13
+ "presets": ["mail", "outlook", "personal"],
13
14
  "scopes": ["Mail.Read"],
14
15
  "llmTip": "CRITICAL: When searching emails, the $search parameter value MUST be wrapped in double quotes. Format: $search=\"your search query here\". Use KQL (Keyword Query Language) syntax to search specific properties: 'from:', 'subject:', 'body:', 'to:', 'cc:', 'bcc:', 'attachment:', 'hasAttachments:', 'importance:', 'received:', 'sent:'. Examples: $search=\"from:john@example.com\" | $search=\"subject:meeting AND hasAttachments:true\" | $search=\"body:urgent AND received>=2024-01-01\" | $search=\"from:john AND importance:high\". Remember: ALWAYS wrap the entire search expression in double quotes! Reference: https://learn.microsoft.com/en-us/graph/search-query-parameter IMPORTANT: Always use $select to limit returned fields and reduce response size. Recommended default: $select=id,subject,from,toRecipients,receivedDateTime,bodyPreview,isRead,hasAttachments. Use bodyPreview instead of body for listings. To read the full email body, use get-mail-message with the specific message id."
15
16
  },
@@ -17,18 +18,21 @@
17
18
  "pathPattern": "/me/mailFolders",
18
19
  "method": "get",
19
20
  "toolName": "list-mail-folders",
21
+ "presets": ["mail", "outlook", "personal"],
20
22
  "scopes": ["Mail.Read"]
21
23
  },
22
24
  {
23
25
  "pathPattern": "/me/mailFolders/{mailFolder-id}/childFolders",
24
26
  "method": "get",
25
27
  "toolName": "list-mail-child-folders",
28
+ "presets": ["mail", "outlook", "personal"],
26
29
  "scopes": ["Mail.Read"]
27
30
  },
28
31
  {
29
32
  "pathPattern": "/me/mailFolders",
30
33
  "method": "post",
31
34
  "toolName": "create-mail-folder",
35
+ "presets": ["mail", "outlook", "personal"],
32
36
  "scopes": ["Mail.ReadWrite"],
33
37
  "llmTip": "Creates a top-level mail folder. Use create-mail-child-folder to create a subfolder inside an existing folder. Use list-mail-folders to find existing folder IDs."
34
38
  },
@@ -36,6 +40,7 @@
36
40
  "pathPattern": "/me/mailFolders/{mailFolder-id}/childFolders",
37
41
  "method": "post",
38
42
  "toolName": "create-mail-child-folder",
43
+ "presets": ["mail", "outlook", "personal"],
39
44
  "scopes": ["Mail.ReadWrite"],
40
45
  "llmTip": "Creates a subfolder inside an existing mail folder. Use list-mail-folders or list-mail-child-folders to find the parent folder ID."
41
46
  },
@@ -43,6 +48,7 @@
43
48
  "pathPattern": "/me/mailFolders/{mailFolder-id}",
44
49
  "method": "patch",
45
50
  "toolName": "update-mail-folder",
51
+ "presets": ["mail", "outlook", "personal"],
46
52
  "scopes": ["Mail.ReadWrite"],
47
53
  "llmTip": "Renames a mail folder by updating its displayName. Use list-mail-folders to find the folder ID."
48
54
  },
@@ -50,6 +56,7 @@
50
56
  "pathPattern": "/me/mailFolders/{mailFolder-id}",
51
57
  "method": "delete",
52
58
  "toolName": "delete-mail-folder",
59
+ "presets": ["mail", "outlook", "personal"],
53
60
  "scopes": ["Mail.ReadWrite"],
54
61
  "llmTip": "Deletes a mail folder and all its contents. This action is irreversible. Use list-mail-folders to find the folder ID."
55
62
  },
@@ -57,6 +64,7 @@
57
64
  "pathPattern": "/me/mailFolders/{mailFolder-id}/messages",
58
65
  "method": "get",
59
66
  "toolName": "list-mail-folder-messages",
67
+ "presets": ["mail", "outlook", "personal"],
60
68
  "scopes": ["Mail.Read"],
61
69
  "llmTip": "CRITICAL: When searching emails, the $search parameter value MUST be wrapped in double quotes. Format: $search=\"your search query here\". Use KQL (Keyword Query Language) syntax to search specific properties: 'from:', 'subject:', 'body:', 'to:', 'cc:', 'bcc:', 'attachment:', 'hasAttachments:', 'importance:', 'received:', 'sent:'. Examples: $search=\"from:john@example.com\" | $search=\"subject:meeting AND hasAttachments:true\" | $search=\"body:urgent AND received>=2024-01-01\" | $search=\"from:alice AND importance:high\". Remember: ALWAYS wrap the entire search expression in double quotes! Reference: https://learn.microsoft.com/en-us/graph/search-query-parameter IMPORTANT: Always use $select to limit returned fields and reduce response size. Recommended default: $select=id,subject,from,toRecipients,receivedDateTime,bodyPreview,isRead,hasAttachments. Use bodyPreview instead of body for listings. To read the full email body, use get-mail-message with the specific message id."
62
70
  },
@@ -64,12 +72,14 @@
64
72
  "pathPattern": "/me/messages/{message-id}",
65
73
  "method": "get",
66
74
  "toolName": "get-mail-message",
75
+ "presets": ["mail", "outlook", "personal"],
67
76
  "scopes": ["Mail.Read"]
68
77
  },
69
78
  {
70
79
  "pathPattern": "/me/sendMail",
71
80
  "method": "post",
72
81
  "toolName": "send-mail",
82
+ "presets": ["mail", "outlook", "personal"],
73
83
  "scopes": ["Mail.Send"],
74
84
  "llmTip": "CRITICAL: Do not try to guess the email address of the recipients. Use the list-users tool to find the email address of the recipients."
75
85
  },
@@ -77,6 +87,7 @@
77
87
  "pathPattern": "/users/{user-id}/messages",
78
88
  "method": "get",
79
89
  "toolName": "list-shared-mailbox-messages",
90
+ "presets": ["work"],
80
91
  "workScopes": ["Mail.Read.Shared"],
81
92
  "llmTip": "CRITICAL: When searching emails, the $search parameter value MUST be wrapped in double quotes. Format: $search=\"your search query here\". Use KQL (Keyword Query Language) syntax to search specific properties: 'from:', 'subject:', 'body:', 'to:', 'cc:', 'bcc:', 'attachment:', 'hasAttachments:', 'importance:', 'received:', 'sent:'. Examples: $search=\"from:john@example.com\" | $search=\"subject:meeting AND hasAttachments:true\" | $search=\"body:urgent AND received>=2024-01-01\" | $search=\"from:alice AND importance:high\". Remember: ALWAYS wrap the entire search expression in double quotes! Reference: https://learn.microsoft.com/en-us/graph/search-query-parameter IMPORTANT: Always use $select to limit returned fields and reduce response size. Recommended default: $select=id,subject,from,toRecipients,receivedDateTime,bodyPreview,isRead,hasAttachments. Use bodyPreview instead of body for listings. To read the full email body, use get-shared-mailbox-message with the specific message id."
82
93
  },
@@ -84,6 +95,7 @@
84
95
  "pathPattern": "/users/{user-id}/mailFolders/{mailFolder-id}/messages",
85
96
  "method": "get",
86
97
  "toolName": "list-shared-mailbox-folder-messages",
98
+ "presets": ["work"],
87
99
  "workScopes": ["Mail.Read.Shared"],
88
100
  "llmTip": "CRITICAL: When searching emails, the $search parameter value MUST be wrapped in double quotes. Format: $search=\"your search query here\". Use KQL (Keyword Query Language) syntax to search specific properties: 'from:', 'subject:', 'body:', 'to:', 'cc:', 'bcc:', 'attachment:', 'hasAttachments:', 'importance:', 'received:', 'sent:'. Examples: $search=\"from:john@example.com\" | $search=\"subject:meeting AND hasAttachments:true\" | $search=\"body:urgent AND received>=2024-01-01\" | $search=\"from:alice AND importance:high\". Remember: ALWAYS wrap the entire search expression in double quotes! Reference: https://learn.microsoft.com/en-us/graph/search-query-parameter IMPORTANT: Always use $select to limit returned fields and reduce response size. Recommended default: $select=id,subject,from,toRecipients,receivedDateTime,bodyPreview,isRead,hasAttachments. Use bodyPreview instead of body for listings. To read the full email body, use get-shared-mailbox-message with the specific message id."
89
101
  },
@@ -91,12 +103,14 @@
91
103
  "pathPattern": "/users/{user-id}/messages/{message-id}",
92
104
  "method": "get",
93
105
  "toolName": "get-shared-mailbox-message",
106
+ "presets": ["work"],
94
107
  "workScopes": ["Mail.Read.Shared"]
95
108
  },
96
109
  {
97
110
  "pathPattern": "/users/{user-id}/sendMail",
98
111
  "method": "post",
99
112
  "toolName": "send-shared-mailbox-mail",
113
+ "presets": ["work"],
100
114
  "workScopes": ["Mail.Send.Shared"],
101
115
  "llmTip": "CRITICAL: Do not try to guess the email address of the recipients. Use the list-users tool to find the email address of the recipients."
102
116
  },
@@ -104,12 +118,14 @@
104
118
  "pathPattern": "/users/{user-id}/messages",
105
119
  "method": "post",
106
120
  "toolName": "create-shared-mailbox-draft",
121
+ "presets": ["work"],
107
122
  "workScopes": ["Mail.ReadWrite.Shared"]
108
123
  },
109
124
  {
110
125
  "pathPattern": "/users/{user-id}/messages/{message-id}/reply",
111
126
  "method": "post",
112
127
  "toolName": "reply-shared-mailbox-mail",
128
+ "presets": ["work"],
113
129
  "workScopes": ["Mail.Send.Shared"],
114
130
  "llmTip": "Reply to a message from a shared mailbox preserving full HTML formatting and conversation thread. The 'user-id' is the shared mailbox email address (e.g. support@contoso.com). The 'comment' field is your reply text. Do NOT reconstruct the email manually. Requires Send As permission on the shared mailbox in Exchange."
115
131
  },
@@ -117,6 +133,7 @@
117
133
  "pathPattern": "/users/{user-id}/messages/{message-id}/replyAll",
118
134
  "method": "post",
119
135
  "toolName": "reply-all-shared-mailbox-mail",
136
+ "presets": ["work"],
120
137
  "workScopes": ["Mail.Send.Shared"],
121
138
  "llmTip": "Reply-all to a message from a shared mailbox preserving full HTML formatting and conversation thread. The 'user-id' is the shared mailbox email address. The 'comment' field is your reply text. Requires Send As permission on the shared mailbox in Exchange."
122
139
  },
@@ -124,6 +141,7 @@
124
141
  "pathPattern": "/users/{user-id}/messages/{message-id}/forward",
125
142
  "method": "post",
126
143
  "toolName": "forward-shared-mailbox-mail",
144
+ "presets": ["work"],
127
145
  "workScopes": ["Mail.Send.Shared"],
128
146
  "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."
129
147
  },
@@ -131,6 +149,7 @@
131
149
  "pathPattern": "/users",
132
150
  "method": "get",
133
151
  "toolName": "list-users",
152
+ "presets": ["users", "work"],
134
153
  "workScopes": ["User.Read.All"],
135
154
  "llmTip": "CRITICAL: This request requires the ConsistencyLevel header set to eventual. When searching users, the $search parameter value MUST be wrapped in double quotes. Format: $search=\"your search query here\". Use KQL (Keyword Query Language) syntax to search specific properties: 'displayName:'. Examples: $search=\"displayName:john\" | $search=\"displayName:john\" OR \"displayName:jane\". Remember: ALWAYS wrap the entire search expression in double quotes and set the ConsistencyLevel header to eventual! Reference: https://learn.microsoft.com/en-us/graph/search-query-parameter"
136
155
  },
@@ -138,12 +157,14 @@
138
157
  "pathPattern": "/me/messages",
139
158
  "method": "post",
140
159
  "toolName": "create-draft-email",
160
+ "presets": ["mail", "outlook", "personal"],
141
161
  "scopes": ["Mail.ReadWrite"]
142
162
  },
143
163
  {
144
164
  "pathPattern": "/me/messages/{message-id}",
145
165
  "method": "delete",
146
166
  "toolName": "delete-mail-message",
167
+ "presets": ["mail", "outlook", "personal"],
147
168
  "scopes": ["Mail.ReadWrite"],
148
169
  "llmTip": "Soft delete — moves to Deleted Items. To permanently delete, delete again from Deleted Items."
149
170
  },
@@ -151,6 +172,7 @@
151
172
  "pathPattern": "/me/messages/{message-id}/move",
152
173
  "method": "post",
153
174
  "toolName": "move-mail-message",
175
+ "presets": ["mail", "outlook", "personal"],
154
176
  "scopes": ["Mail.ReadWrite"],
155
177
  "llmTip": "destinationId accepts folder ID or well-known name (inbox, drafts, sentitems, deleteditems, junkemail, archive)."
156
178
  },
@@ -158,12 +180,14 @@
158
180
  "pathPattern": "/me/messages/{message-id}",
159
181
  "method": "patch",
160
182
  "toolName": "update-mail-message",
183
+ "presets": ["mail", "outlook", "personal"],
161
184
  "scopes": ["Mail.ReadWrite"]
162
185
  },
163
186
  {
164
187
  "pathPattern": "/me/messages/{message-id}/attachments",
165
188
  "method": "post",
166
189
  "toolName": "add-mail-attachment",
190
+ "presets": ["mail", "outlook", "personal"],
167
191
  "scopes": ["Mail.ReadWrite"],
168
192
  "llmTip": "Max 3MB. Body requires @odata.type: {\"@odata.type\": \"#microsoft.graph.fileAttachment\", \"name\": \"file.pdf\", \"contentBytes\": \"<base64>\"}."
169
193
  },
@@ -171,6 +195,7 @@
171
195
  "pathPattern": "/me/messages/{message-id}/attachments/createUploadSession",
172
196
  "method": "post",
173
197
  "toolName": "create-mail-attachment-upload-session",
198
+ "presets": ["mail", "outlook", "personal"],
174
199
  "scopes": ["Mail.ReadWrite"],
175
200
  "llmTip": "For large attachments (3-150MB). Body: { AttachmentItem: { attachmentType: 'file', name: 'report.pdf', size: 5000000 } }. Returns a pre-authenticated uploadUrl for direct PUT of file bytes."
176
201
  },
@@ -178,6 +203,7 @@
178
203
  "pathPattern": "/me/messages/{message-id}/attachments",
179
204
  "method": "get",
180
205
  "toolName": "list-mail-attachments",
206
+ "presets": ["mail", "outlook", "personal"],
181
207
  "scopes": ["Mail.Read"],
182
208
  "llmTip": "Lists attachments on a message: id, name, contentType, size, isInline. To download the bytes, call download-bytes with target=/me/messages/{message-id}/attachments/{attachment-id}/$value (the /$value suffix returns raw bytes; the bare attachment URL embeds contentBytes in JSON which can truncate large files)."
183
209
  },
@@ -185,12 +211,14 @@
185
211
  "pathPattern": "/me/messages/{message-id}/attachments/{attachment-id}",
186
212
  "method": "delete",
187
213
  "toolName": "delete-mail-attachment",
214
+ "presets": ["mail", "outlook", "personal"],
188
215
  "scopes": ["Mail.ReadWrite"]
189
216
  },
190
217
  {
191
218
  "pathPattern": "/me/messages/{message-id}/forward",
192
219
  "method": "post",
193
220
  "toolName": "forward-mail-message",
221
+ "presets": ["mail", "outlook", "personal"],
194
222
  "scopes": ["Mail.Send"],
195
223
  "llmTip": "Forward an email preserving full HTML formatting and attachments. The 'comment' field adds text above the forwarded content. toRecipients is required. Do NOT reconstruct the email manually - this endpoint handles everything server-side."
196
224
  },
@@ -198,6 +226,7 @@
198
226
  "pathPattern": "/me/messages/{message-id}/reply",
199
227
  "method": "post",
200
228
  "toolName": "reply-mail-message",
229
+ "presets": ["mail", "outlook", "personal"],
201
230
  "scopes": ["Mail.Send"],
202
231
  "llmTip": "Reply to an email preserving full HTML formatting. The 'comment' field is your reply text. Do NOT reconstruct the email manually."
203
232
  },
@@ -205,6 +234,7 @@
205
234
  "pathPattern": "/me/messages/{message-id}/replyAll",
206
235
  "method": "post",
207
236
  "toolName": "reply-all-mail-message",
237
+ "presets": ["mail", "outlook", "personal"],
208
238
  "scopes": ["Mail.Send"],
209
239
  "llmTip": "Reply-all preserving full HTML formatting. The 'comment' field is your reply text."
210
240
  },
@@ -212,6 +242,7 @@
212
242
  "pathPattern": "/me/messages/{message-id}/createForward",
213
243
  "method": "post",
214
244
  "toolName": "create-forward-draft",
245
+ "presets": ["mail", "outlook", "personal"],
215
246
  "scopes": ["Mail.ReadWrite"],
216
247
  "llmTip": "Create a forward draft (does not send). Useful when user wants to review before sending."
217
248
  },
@@ -219,6 +250,7 @@
219
250
  "pathPattern": "/me/messages/{message-id}/createReply",
220
251
  "method": "post",
221
252
  "toolName": "create-reply-draft",
253
+ "presets": ["mail", "outlook", "personal"],
222
254
  "scopes": ["Mail.ReadWrite"],
223
255
  "llmTip": "For HTML replies pass Message.body.contentType: 'html' with Message.body.content as HTML. Note: supplying Message.body replaces the whole draft body, so the original quoted history is not included. Specifying both 'comment' and Message.body returns 400. Signatures are added by the Outlook client only, not via Graph."
224
256
  },
@@ -226,6 +258,7 @@
226
258
  "pathPattern": "/me/messages/{message-id}/createReplyAll",
227
259
  "method": "post",
228
260
  "toolName": "create-reply-all-draft",
261
+ "presets": ["mail", "outlook", "personal"],
229
262
  "scopes": ["Mail.ReadWrite"],
230
263
  "llmTip": "For HTML replies pass Message.body.contentType: 'html' with Message.body.content as HTML. Note: supplying Message.body replaces the whole draft body, so the original quoted history is not included. Specifying both 'comment' and Message.body returns 400. Signatures are added by the Outlook client only, not via Graph."
231
264
  },
@@ -233,6 +266,7 @@
233
266
  "pathPattern": "/me/messages/{message-id}/send",
234
267
  "method": "post",
235
268
  "toolName": "send-draft-message",
269
+ "presets": ["mail", "outlook", "personal"],
236
270
  "scopes": ["Mail.Send"],
237
271
  "llmTip": "No request body needed — just call with the message ID. Draft must exist in Drafts folder."
238
272
  },
@@ -240,6 +274,7 @@
240
274
  "pathPattern": "/me/mailFolders/{mailFolder-id}/messageRules",
241
275
  "method": "get",
242
276
  "toolName": "list-mail-rules",
277
+ "presets": ["mail", "outlook", "personal"],
243
278
  "scopes": ["MailboxSettings.Read"],
244
279
  "llmTip": "Lists all message rules for a mail folder. Use the Inbox folder ID (get it from list-mail-folders) for inbox rules. Each rule has displayName, sequence, isEnabled, conditions (fromAddresses, subjectContains, etc.), actions (moveToFolder, forwardTo, delete, etc.), and exceptions."
245
280
  },
@@ -247,6 +282,7 @@
247
282
  "pathPattern": "/me/mailFolders/{mailFolder-id}/messageRules",
248
283
  "method": "post",
249
284
  "toolName": "create-mail-rule",
285
+ "presets": ["mail", "outlook", "personal"],
250
286
  "scopes": ["MailboxSettings.ReadWrite"],
251
287
  "llmTip": "Creates a message rule for a mail folder. Use the Inbox folder ID (get it from list-mail-folders) for inbox rules. Body: { displayName: 'Rule name', sequence: 1, isEnabled: true, conditions: { fromAddresses: [{ emailAddress: { address: 'user@example.com' } }] }, actions: { moveToFolder: 'folder-id' } }. Actions: moveToFolder, copyToFolder, forwardTo, forwardAsAttachmentTo, delete, markAsRead, markImportance, stopProcessingRules."
252
288
  },
@@ -254,6 +290,7 @@
254
290
  "pathPattern": "/me/mailFolders/{mailFolder-id}/messageRules/{messageRule-id}",
255
291
  "method": "patch",
256
292
  "toolName": "update-mail-rule",
293
+ "presets": ["mail", "outlook", "personal"],
257
294
  "scopes": ["MailboxSettings.ReadWrite"],
258
295
  "llmTip": "Updates an existing message rule. Use the Inbox folder ID (get it from list-mail-folders) for inbox rules. Send only the properties to change. Common use: { isEnabled: false } to disable a rule, or update conditions/actions."
259
296
  },
@@ -261,6 +298,7 @@
261
298
  "pathPattern": "/me/mailFolders/{mailFolder-id}/messageRules/{messageRule-id}",
262
299
  "method": "delete",
263
300
  "toolName": "delete-mail-rule",
301
+ "presets": ["mail", "outlook", "personal"],
264
302
  "scopes": ["MailboxSettings.ReadWrite"],
265
303
  "llmTip": "Deletes a message rule permanently. Use the Inbox folder ID (get it from list-mail-folders) for inbox rules."
266
304
  },
@@ -268,6 +306,7 @@
268
306
  "pathPattern": "/me/inferenceClassification/overrides",
269
307
  "method": "get",
270
308
  "toolName": "list-focused-inbox-overrides",
309
+ "presets": ["mail", "outlook", "personal"],
271
310
  "scopes": ["Mail.Read"],
272
311
  "llmTip": "Lists Focused Inbox classification overrides — explicit rules that force messages from a given sender (by SMTP address) into either the Focused or Other tab, regardless of what the Outlook ML classifier would predict. Each override has id, classifyAs ('focused' or 'other'), and senderEmailAddress {name, address}. Returns an empty collection if the user has never set an override."
273
312
  },
@@ -275,6 +314,7 @@
275
314
  "pathPattern": "/me/inferenceClassification/overrides",
276
315
  "method": "post",
277
316
  "toolName": "create-focused-inbox-override",
317
+ "presets": ["mail", "outlook", "personal"],
278
318
  "scopes": ["Mail.ReadWrite"],
279
319
  "llmTip": "Creates a Focused Inbox override for a sender. Body: { classifyAs: 'focused', senderEmailAddress: { name: 'Display Name', address: 'sender@example.com' } }. classifyAs must be 'focused' or 'other'. If an override already exists for that SMTP address, POST updates the existing override's name and classifyAs (use this to rename a sender). Resolve the sender's address with list-users or by reading a recent mail header — do not invent SMTP addresses."
280
320
  },
@@ -282,6 +322,7 @@
282
322
  "pathPattern": "/me/inferenceClassification/overrides/{inferenceClassificationOverride-id}",
283
323
  "method": "patch",
284
324
  "toolName": "update-focused-inbox-override",
325
+ "presets": ["mail", "outlook", "personal"],
285
326
  "scopes": ["Mail.ReadWrite"],
286
327
  "llmTip": "Updates the classifyAs field of an existing override. Body: { classifyAs: 'focused' } or { classifyAs: 'other' }. Per Graph API, PATCH cannot change senderEmailAddress — to change the SMTP address, delete and recreate the override. To rename the display name only, POST a new override with the same SMTP address (it will overwrite the name)."
287
328
  },
@@ -289,6 +330,7 @@
289
330
  "pathPattern": "/me/inferenceClassification/overrides/{inferenceClassificationOverride-id}",
290
331
  "method": "delete",
291
332
  "toolName": "delete-focused-inbox-override",
333
+ "presets": ["mail", "outlook", "personal"],
292
334
  "scopes": ["Mail.ReadWrite"],
293
335
  "llmTip": "Deletes a Focused Inbox override. Future messages from that sender revert to the Outlook ML classifier's default behavior. Use list-focused-inbox-overrides to find the ID first."
294
336
  },
@@ -296,6 +338,7 @@
296
338
  "pathPattern": "/me/events",
297
339
  "method": "get",
298
340
  "toolName": "list-calendar-events",
341
+ "presets": ["calendar", "outlook", "personal"],
299
342
  "scopes": ["Calendars.Read"],
300
343
  "supportsTimezone": true,
301
344
  "supportsExpandExtendedProperties": true,
@@ -305,6 +348,7 @@
305
348
  "pathPattern": "/me/events/{event-id}",
306
349
  "method": "get",
307
350
  "toolName": "get-calendar-event",
351
+ "presets": ["calendar", "outlook", "personal"],
308
352
  "scopes": ["Calendars.Read"],
309
353
  "supportsTimezone": true,
310
354
  "supportsExpandExtendedProperties": true
@@ -313,6 +357,7 @@
313
357
  "pathPattern": "/me/events",
314
358
  "method": "post",
315
359
  "toolName": "create-calendar-event",
360
+ "presets": ["calendar", "outlook", "personal"],
316
361
  "scopes": ["Calendars.ReadWrite"],
317
362
  "llmTip": "CRITICAL: Do not try to guess the email address of the recipients. Use the list-users tool to find the email address of the recipients."
318
363
  },
@@ -320,6 +365,7 @@
320
365
  "pathPattern": "/me/events/{event-id}",
321
366
  "method": "patch",
322
367
  "toolName": "update-calendar-event",
368
+ "presets": ["calendar", "outlook", "personal"],
323
369
  "scopes": ["Calendars.ReadWrite"],
324
370
  "llmTip": "CRITICAL: Do not try to guess the email address of the recipients. Use the list-users tool to find the email address of the recipients. WARNING: Setting attendees replaces the entire attendee list — include all attendees, not just new ones."
325
371
  },
@@ -327,6 +373,7 @@
327
373
  "pathPattern": "/me/events/{event-id}",
328
374
  "method": "delete",
329
375
  "toolName": "delete-calendar-event",
376
+ "presets": ["calendar", "outlook", "personal"],
330
377
  "scopes": ["Calendars.ReadWrite"],
331
378
  "llmTip": "Deleting a seriesMaster deletes ALL occurrences of the recurring event. To cancel a single occurrence, delete that specific instance ID from list-calendar-event-instances."
332
379
  },
@@ -334,6 +381,7 @@
334
381
  "pathPattern": "/me/events/{event-id}/accept",
335
382
  "method": "post",
336
383
  "toolName": "accept-calendar-event",
384
+ "presets": ["calendar", "outlook", "personal"],
337
385
  "scopes": ["Calendars.ReadWrite"],
338
386
  "llmTip": "Accepts a meeting invitation. Optional body: { sendResponse: true, comment: 'I will attend.' }. Set sendResponse to false to accept silently without notifying the organizer."
339
387
  },
@@ -341,6 +389,7 @@
341
389
  "pathPattern": "/me/events/{event-id}/decline",
342
390
  "method": "post",
343
391
  "toolName": "decline-calendar-event",
392
+ "presets": ["calendar", "outlook", "personal"],
344
393
  "scopes": ["Calendars.ReadWrite"],
345
394
  "llmTip": "Declines a meeting invitation. Optional body: { sendResponse: true, comment: 'Cannot attend, conflict.' }. The event remains in the calendar as declined unless the user deletes it."
346
395
  },
@@ -348,6 +397,7 @@
348
397
  "pathPattern": "/me/events/{event-id}/tentativelyAccept",
349
398
  "method": "post",
350
399
  "toolName": "tentatively-accept-calendar-event",
400
+ "presets": ["calendar", "outlook", "personal"],
351
401
  "scopes": ["Calendars.ReadWrite"],
352
402
  "llmTip": "Tentatively accepts a meeting invitation. Optional body: { sendResponse: true, comment: 'I might be able to attend.' }. Use proposedNewTime to suggest an alternative: { proposedNewTime: { start: { dateTime, timeZone }, end: { dateTime, timeZone } } }."
353
403
  },
@@ -355,6 +405,7 @@
355
405
  "pathPattern": "/me/calendars/{calendar-id}/events",
356
406
  "method": "get",
357
407
  "toolName": "list-specific-calendar-events",
408
+ "presets": ["calendar", "outlook", "personal"],
358
409
  "scopes": ["Calendars.Read"],
359
410
  "supportsTimezone": true,
360
411
  "supportsExpandExtendedProperties": true,
@@ -364,6 +415,7 @@
364
415
  "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}",
365
416
  "method": "get",
366
417
  "toolName": "get-specific-calendar-event",
418
+ "presets": ["calendar", "outlook", "personal"],
367
419
  "scopes": ["Calendars.Read"],
368
420
  "supportsTimezone": true,
369
421
  "supportsExpandExtendedProperties": true
@@ -372,6 +424,7 @@
372
424
  "pathPattern": "/me/calendars/{calendar-id}/events",
373
425
  "method": "post",
374
426
  "toolName": "create-specific-calendar-event",
427
+ "presets": ["calendar", "outlook", "personal"],
375
428
  "scopes": ["Calendars.ReadWrite"],
376
429
  "llmTip": "CRITICAL: Do not try to guess the email address of the recipients. Use the list-users tool to find the email address of the recipients."
377
430
  },
@@ -379,6 +432,7 @@
379
432
  "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}",
380
433
  "method": "patch",
381
434
  "toolName": "update-specific-calendar-event",
435
+ "presets": ["calendar", "outlook", "personal"],
382
436
  "scopes": ["Calendars.ReadWrite"],
383
437
  "llmTip": "CRITICAL: Do not try to guess the email address of the recipients. Use the list-users tool to find the email address of the recipients. WARNING: Setting attendees replaces the entire attendee list — include all attendees, not just new ones."
384
438
  },
@@ -386,6 +440,7 @@
386
440
  "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}",
387
441
  "method": "delete",
388
442
  "toolName": "delete-specific-calendar-event",
443
+ "presets": ["calendar", "outlook", "personal"],
389
444
  "scopes": ["Calendars.ReadWrite"],
390
445
  "llmTip": "Deleting a seriesMaster deletes ALL occurrences. To cancel a single occurrence, use the specific instance ID."
391
446
  },
@@ -393,6 +448,7 @@
393
448
  "pathPattern": "/me/calendarView",
394
449
  "method": "get",
395
450
  "toolName": "get-calendar-view",
451
+ "presets": ["calendar", "outlook", "personal"],
396
452
  "scopes": ["Calendars.Read"],
397
453
  "supportsTimezone": true,
398
454
  "supportsExpandExtendedProperties": true,
@@ -402,6 +458,7 @@
402
458
  "pathPattern": "/me/calendars/{calendar-id}/calendarView",
403
459
  "method": "get",
404
460
  "toolName": "get-specific-calendar-view",
461
+ "presets": ["calendar", "outlook", "personal"],
405
462
  "scopes": ["Calendars.Read"],
406
463
  "supportsTimezone": true,
407
464
  "supportsExpandExtendedProperties": true,
@@ -411,6 +468,7 @@
411
468
  "pathPattern": "/me/calendar/getSchedule",
412
469
  "method": "post",
413
470
  "toolName": "get-schedule",
471
+ "presets": ["calendar", "outlook", "personal"],
414
472
  "readOnly": true,
415
473
  "workScopes": ["Calendars.Read"]
416
474
  },
@@ -418,12 +476,14 @@
418
476
  "pathPattern": "/users/{user-id}/calendar/events",
419
477
  "method": "get",
420
478
  "toolName": "list-shared-calendar-events",
479
+ "presets": ["work"],
421
480
  "workScopes": ["Calendars.Read.Shared"]
422
481
  },
423
482
  {
424
483
  "pathPattern": "/users/{user-id}/calendarView",
425
484
  "method": "get",
426
485
  "toolName": "get-shared-calendar-view",
486
+ "presets": ["work"],
427
487
  "workScopes": ["Calendars.Read.Shared"],
428
488
  "supportsTimezone": true
429
489
  },
@@ -431,6 +491,7 @@
431
491
  "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}/instances",
432
492
  "method": "get",
433
493
  "toolName": "list-calendar-event-instances",
494
+ "presets": ["calendar", "outlook", "personal"],
434
495
  "scopes": ["Calendars.Read"],
435
496
  "supportsTimezone": true,
436
497
  "supportsExpandExtendedProperties": true,
@@ -440,12 +501,14 @@
440
501
  "pathPattern": "/me/calendars",
441
502
  "method": "get",
442
503
  "toolName": "list-calendars",
504
+ "presets": ["calendar", "outlook", "personal"],
443
505
  "scopes": ["Calendars.Read"]
444
506
  },
445
507
  {
446
508
  "pathPattern": "/me/calendars",
447
509
  "method": "post",
448
510
  "toolName": "create-calendar",
511
+ "presets": ["calendar", "outlook", "personal"],
449
512
  "scopes": ["Calendars.ReadWrite"],
450
513
  "llmTip": "Creates a new personal calendar. Body: { name: 'My Calendar', color: 'auto' }. Available colors: auto, lightBlue, lightGreen, lightOrange, lightGray, lightYellow, lightTeal, lightPink, lightBrown, lightRed, maxColor."
451
514
  },
@@ -453,6 +516,7 @@
453
516
  "pathPattern": "/me/calendars/{calendar-id}",
454
517
  "method": "patch",
455
518
  "toolName": "update-calendar",
519
+ "presets": ["calendar", "outlook", "personal"],
456
520
  "scopes": ["Calendars.ReadWrite"],
457
521
  "llmTip": "Updates a calendar's properties. Body: { name: 'New Name', color: 'lightBlue' }. Cannot update the default calendar's name."
458
522
  },
@@ -460,6 +524,7 @@
460
524
  "pathPattern": "/me/calendars/{calendar-id}",
461
525
  "method": "delete",
462
526
  "toolName": "delete-calendar",
527
+ "presets": ["calendar", "outlook", "personal"],
463
528
  "scopes": ["Calendars.ReadWrite"],
464
529
  "llmTip": "Deletes a calendar and all its events. The default calendar cannot be deleted. This action cannot be undone."
465
530
  },
@@ -467,6 +532,7 @@
467
532
  "pathPattern": "/me/findMeetingTimes",
468
533
  "method": "post",
469
534
  "toolName": "find-meeting-times",
535
+ "presets": ["calendar", "outlook", "personal"],
470
536
  "readOnly": true,
471
537
  "workScopes": ["Calendars.Read.Shared"]
472
538
  },
@@ -474,12 +540,14 @@
474
540
  "pathPattern": "/me/drives",
475
541
  "method": "get",
476
542
  "toolName": "list-drives",
543
+ "presets": ["files", "onedrive", "personal"],
477
544
  "scopes": ["Files.Read"]
478
545
  },
479
546
  {
480
547
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/delta()",
481
548
  "method": "get",
482
549
  "toolName": "get-drive-delta",
550
+ "presets": ["files", "onedrive", "personal"],
483
551
  "scopes": ["Files.Read"],
484
552
  "llmTip": "Tracks changes to a driveItem and its children over time. Returns a collection of driveItems that have been created, modified, or deleted. Use get-drive-root-item first to get the root driveItem-id, then pass it here. Supports $select and delta tokens for incremental sync via @odata.deltaLink."
485
553
  },
@@ -487,24 +555,28 @@
487
555
  "pathPattern": "/drives/{drive-id}/root",
488
556
  "method": "get",
489
557
  "toolName": "get-drive-root-item",
558
+ "presets": ["files", "onedrive", "personal"],
490
559
  "scopes": ["Files.Read"]
491
560
  },
492
561
  {
493
562
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/children",
494
563
  "method": "get",
495
564
  "toolName": "list-folder-files",
565
+ "presets": ["files", "onedrive", "personal"],
496
566
  "scopes": ["Files.Read"]
497
567
  },
498
568
  {
499
569
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}",
500
570
  "method": "delete",
501
571
  "toolName": "delete-onedrive-file",
572
+ "presets": ["files", "onedrive", "personal"],
502
573
  "scopes": ["Files.ReadWrite"]
503
574
  },
504
575
  {
505
576
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/content",
506
577
  "method": "put",
507
578
  "toolName": "upload-file-content",
579
+ "presets": ["files", "onedrive", "personal"],
508
580
  "scopes": ["Files.ReadWrite"],
509
581
  "llmTip": "Body is a base64-encoded string of the file bytes; the server decodes it before PUT. Max 4MB inline (use create-upload-session above 4MB). For new files use path format: /items/root:/path/to/file.txt:/content. Overwrites existing files without warning."
510
582
  },
@@ -512,6 +584,7 @@
512
584
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/createUploadSession",
513
585
  "method": "post",
514
586
  "toolName": "create-upload-session",
587
+ "presets": ["files", "onedrive", "personal"],
515
588
  "scopes": ["Files.ReadWrite"],
516
589
  "llmTip": "For large file uploads (no size limit). Returns a pre-authenticated uploadUrl for direct PUT of file bytes. For new files use path: /items/{parentId}:/{fileName}:/createUploadSession. Body (optional): { item: { '@microsoft.graph.conflictBehavior': 'rename' } }."
517
590
  },
@@ -519,6 +592,7 @@
519
592
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}",
520
593
  "method": "get",
521
594
  "toolName": "get-drive-item",
595
+ "presets": ["files", "onedrive", "personal"],
522
596
  "scopes": ["Files.Read"],
523
597
  "llmTip": "Gets metadata for a file or folder: name, size, lastModifiedDateTime, createdBy, webUrl, file (mimeType, hashes), folder (childCount), parentReference, and @microsoft.graph.downloadUrl. For the bytes, call download-bytes with target=/drives/{drive-id}/items/{driveItem-id}/content (Graph redirects to the same downloadUrl)."
524
598
  },
@@ -526,6 +600,7 @@
526
600
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}",
527
601
  "method": "patch",
528
602
  "toolName": "move-rename-onedrive-item",
603
+ "presets": ["files", "onedrive", "personal"],
529
604
  "scopes": ["Files.ReadWrite"],
530
605
  "llmTip": "Move and/or rename a file or folder. To move, provide parentReference with the target folder's id. To rename, provide a new name. Both can be done in a single request."
531
606
  },
@@ -533,6 +608,7 @@
533
608
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/children",
534
609
  "method": "post",
535
610
  "toolName": "create-onedrive-folder",
611
+ "presets": ["files", "onedrive", "personal"],
536
612
  "scopes": ["Files.ReadWrite"],
537
613
  "llmTip": "Creates a new folder inside the specified drive item. Body must include name (string) and folder ({}) fields. Use @microsoft.graph.conflictBehavior to control behavior on name conflict: 'rename' (default), 'replace', or 'fail'."
538
614
  },
@@ -540,6 +616,7 @@
540
616
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/invite",
541
617
  "method": "post",
542
618
  "toolName": "share-drive-item",
619
+ "presets": ["files", "onedrive", "personal"],
543
620
  "scopes": ["Files.ReadWrite"],
544
621
  "llmTip": "Shares a file or folder with specific users. Body: { recipients: [{ email: 'user@example.com' }], roles: ['read'], sendInvitation: true, message: 'Please review this file.' }. Roles: 'read', 'write', 'owner'. Set requireSignIn to true to require authentication."
545
622
  },
@@ -547,6 +624,7 @@
547
624
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/createLink",
548
625
  "method": "post",
549
626
  "toolName": "create-drive-item-share-link",
627
+ "presets": ["files", "onedrive", "personal"],
550
628
  "scopes": ["Files.ReadWrite"],
551
629
  "llmTip": "Create a shareable link for a file or folder WITHOUT sending an email invitation. Body: { type: 'view' | 'edit' | 'embed', scope: 'anonymous' | 'organization' | 'users', password?: string, expirationDateTime?: ISO-8601, retainInheritedPermissions?: boolean }. Returns a permission with link.webUrl. Pair with share-drive-item when you want to grant explicit access; use this when you only need a URL to paste into a doc/email/chat without triggering OneDrive notifications."
552
630
  },
@@ -554,6 +632,7 @@
554
632
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/copy",
555
633
  "method": "post",
556
634
  "toolName": "copy-drive-item",
635
+ "presets": ["files", "onedrive", "personal"],
557
636
  "scopes": ["Files.ReadWrite"],
558
637
  "llmTip": "Asynchronously copy a file or folder to a new location and/or name. Body: { parentReference: { driveId: '...', id: '...' }, name?: 'New Name.xlsx' }. Returns 202 Accepted with a Location header pointing at a monitor URL for the async job. Ideal for duplicating templates (e.g. clone an Armhr Census Template per prospect), bulk file provisioning, or preserving an immutable snapshot of a working file."
559
638
  },
@@ -561,6 +640,7 @@
561
640
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/preview",
562
641
  "method": "post",
563
642
  "toolName": "create-drive-item-preview",
643
+ "presets": ["files", "onedrive", "personal"],
564
644
  "scopes": ["Files.Read"],
565
645
  "llmTip": "Generate a short-lived embeddable preview URL for a file (Office docs, PDFs, images). Body: { page?: number | string, zoom?: number, viewer?: 'onedrive' | 'office' }. Returns getUrl (interactive) and postUrl (form-post). Useful for surfacing inline previews in summary emails or chat messages without needing the recipient to open the file."
566
646
  },
@@ -568,6 +648,7 @@
568
648
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/thumbnails",
569
649
  "method": "get",
570
650
  "toolName": "list-drive-item-thumbnails",
651
+ "presets": ["files", "onedrive", "personal"],
571
652
  "scopes": ["Files.Read"],
572
653
  "llmTip": "Lists thumbnail sets for a file. Each set contains small (96px), medium (176px), large (800px) thumbnails with url and dimensions. Returns empty for unsupported types (text docs). Use $select=small,medium,large or $expand=small($select=url) to fetch specific sizes. The returned URLs are short-lived — fetch the bytes immediately."
573
654
  },
@@ -575,6 +656,7 @@
575
656
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/permissions",
576
657
  "method": "get",
577
658
  "toolName": "list-drive-item-permissions",
659
+ "presets": ["files", "onedrive", "personal"],
578
660
  "scopes": ["Files.Read"],
579
661
  "llmTip": "Lists all permissions (sharing links, direct access, inherited) on a file or folder. Each permission has roles, grantedTo (user), link (sharing URL), and inheritedFrom."
580
662
  },
@@ -582,6 +664,7 @@
582
664
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/permissions/{permission-id}",
583
665
  "method": "delete",
584
666
  "toolName": "delete-drive-item-permission",
667
+ "presets": ["files", "onedrive", "personal"],
585
668
  "scopes": ["Files.ReadWrite"],
586
669
  "llmTip": "Removes a specific permission from a file or folder. Only permissions that are not inherited can be deleted. Use list-drive-item-permissions first to find the permission ID."
587
670
  },
@@ -589,6 +672,7 @@
589
672
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/versions",
590
673
  "method": "get",
591
674
  "toolName": "list-drive-item-versions",
675
+ "presets": ["files", "onedrive", "personal"],
592
676
  "scopes": ["Files.Read"],
593
677
  "llmTip": "Lists version history of a file. Each version has id, lastModifiedDateTime, lastModifiedBy, and size. Use the version id with /versions/{id}/content to download a specific version."
594
678
  },
@@ -596,6 +680,7 @@
596
680
  "pathPattern": "/drives/{drive-id}/search(q='{q}')",
597
681
  "method": "get",
598
682
  "toolName": "search-onedrive-files",
683
+ "presets": ["files", "onedrive", "personal", "search"],
599
684
  "scopes": ["Files.Read"],
600
685
  "skipEncoding": ["q"],
601
686
  "llmTip": "Searches for files in a drive by name or content. The q parameter searches file names, metadata, and file content. Returns matching driveItems with id, name, webUrl, size, lastModifiedDateTime. Use list-drives first to get the drive-id."
@@ -604,6 +689,7 @@
604
689
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/charts/add",
605
690
  "method": "post",
606
691
  "toolName": "create-excel-chart",
692
+ "presets": ["excel", "personal"],
607
693
  "isExcelOp": true,
608
694
  "scopes": ["Files.ReadWrite"]
609
695
  },
@@ -611,6 +697,7 @@
611
697
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/format",
612
698
  "method": "patch",
613
699
  "toolName": "format-excel-range",
700
+ "presets": ["excel", "personal"],
614
701
  "isExcelOp": true,
615
702
  "scopes": ["Files.ReadWrite"],
616
703
  "skipEncoding": ["address"],
@@ -620,6 +707,7 @@
620
707
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range()/sort",
621
708
  "method": "patch",
622
709
  "toolName": "sort-excel-range",
710
+ "presets": ["excel", "personal"],
623
711
  "isExcelOp": true,
624
712
  "scopes": ["Files.ReadWrite"]
625
713
  },
@@ -627,6 +715,7 @@
627
715
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')",
628
716
  "method": "get",
629
717
  "toolName": "get-excel-range",
718
+ "presets": ["excel", "personal"],
630
719
  "isExcelOp": true,
631
720
  "scopes": ["Files.Read"],
632
721
  "skipEncoding": ["address"]
@@ -635,6 +724,7 @@
635
724
  "pathPattern": "/me/messages/{message-id}/$value",
636
725
  "method": "get",
637
726
  "toolName": "get-mail-message-mime",
727
+ "presets": ["mail", "outlook", "personal"],
638
728
  "scopes": ["Mail.Read"],
639
729
  "acceptType": "text/plain",
640
730
  "llmTip": "Download an email message as raw RFC 5322 MIME content (.eml format). Use this when archiving an email to disk preserving all original headers, body, and inline-encoded attachments. Returns the MIME stream as text. Find the message id with list-mail-messages first."
@@ -643,6 +733,7 @@
643
733
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')",
644
734
  "method": "patch",
645
735
  "toolName": "update-excel-range",
736
+ "presets": ["excel", "personal"],
646
737
  "isExcelOp": true,
647
738
  "scopes": ["Files.ReadWrite"],
648
739
  "skipEncoding": ["address"],
@@ -652,6 +743,7 @@
652
743
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/insert",
653
744
  "method": "post",
654
745
  "toolName": "insert-excel-range",
746
+ "presets": ["excel", "personal"],
655
747
  "isExcelOp": true,
656
748
  "scopes": ["Files.ReadWrite"],
657
749
  "skipEncoding": ["address"],
@@ -661,6 +753,7 @@
661
753
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/delete",
662
754
  "method": "post",
663
755
  "toolName": "delete-excel-range",
756
+ "presets": ["excel", "personal"],
664
757
  "isExcelOp": true,
665
758
  "scopes": ["Files.ReadWrite"],
666
759
  "skipEncoding": ["address"],
@@ -670,6 +763,7 @@
670
763
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/merge",
671
764
  "method": "post",
672
765
  "toolName": "merge-excel-range",
766
+ "presets": ["excel", "personal"],
673
767
  "isExcelOp": true,
674
768
  "scopes": ["Files.ReadWrite"],
675
769
  "skipEncoding": ["address"],
@@ -679,6 +773,7 @@
679
773
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/unmerge",
680
774
  "method": "post",
681
775
  "toolName": "unmerge-excel-range",
776
+ "presets": ["excel", "personal"],
682
777
  "isExcelOp": true,
683
778
  "scopes": ["Files.ReadWrite"],
684
779
  "skipEncoding": ["address"],
@@ -688,6 +783,7 @@
688
783
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/range(address='{address}')/clear",
689
784
  "method": "post",
690
785
  "toolName": "clear-excel-range",
786
+ "presets": ["excel", "personal"],
691
787
  "isExcelOp": true,
692
788
  "scopes": ["Files.ReadWrite"],
693
789
  "skipEncoding": ["address"],
@@ -697,6 +793,7 @@
697
793
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/usedRange()",
698
794
  "method": "get",
699
795
  "toolName": "get-excel-used-range",
796
+ "presets": ["excel", "personal"],
700
797
  "isExcelOp": true,
701
798
  "scopes": ["Files.ReadWrite"],
702
799
  "llmTip": "Get the smallest range that encompasses any cells with values or formatting on the worksheet. Returns address, values, formulas, numberFormat, rowCount, columnCount. Use this to discover the populated bounds of a sheet before reading or appending — avoids guessing how far data extends. Optional $select to trim the response."
@@ -705,6 +802,7 @@
705
802
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/tables/{workbookTable-id}/rows/itemAt(index={index})",
706
803
  "method": "patch",
707
804
  "toolName": "update-excel-table-row",
805
+ "presets": ["excel", "personal"],
708
806
  "isExcelOp": true,
709
807
  "scopes": ["Files.ReadWrite"],
710
808
  "skipEncoding": ["index"],
@@ -714,6 +812,7 @@
714
812
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/tables/{workbookTable-id}/rows/itemAt(index={index})",
715
813
  "method": "delete",
716
814
  "toolName": "delete-excel-table-row",
815
+ "presets": ["excel", "personal"],
717
816
  "isExcelOp": true,
718
817
  "scopes": ["Files.ReadWrite"],
719
818
  "skipEncoding": ["index"],
@@ -723,6 +822,7 @@
723
822
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets/{workbookWorksheet-id}/tables/add",
724
823
  "method": "post",
725
824
  "toolName": "create-excel-table",
825
+ "presets": ["excel", "personal"],
726
826
  "isExcelOp": true,
727
827
  "scopes": ["Files.ReadWrite"],
728
828
  "llmTip": "Convert a worksheet range into a formal Excel table. Body: { address: 'A1:H171', hasHeaders: true }. Required before using add-excel-table-rows / update-excel-table-row / delete-excel-table-row on a plain-cells sheet."
@@ -731,6 +831,7 @@
731
831
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/worksheets",
732
832
  "method": "get",
733
833
  "toolName": "list-excel-worksheets",
834
+ "presets": ["excel", "personal"],
734
835
  "isExcelOp": true,
735
836
  "scopes": ["Files.Read"]
736
837
  },
@@ -738,6 +839,7 @@
738
839
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/tables",
739
840
  "method": "get",
740
841
  "toolName": "list-excel-tables",
842
+ "presets": ["excel", "personal"],
741
843
  "isExcelOp": true,
742
844
  "scopes": ["Files.Read"],
743
845
  "llmTip": "Lists all named tables in a workbook. Each table has id, name, showHeaders, showTotals, columns, and style. Use the table name or id with other table endpoints."
@@ -746,6 +848,7 @@
746
848
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/tables/{workbookTable-id}",
747
849
  "method": "get",
748
850
  "toolName": "get-excel-table",
851
+ "presets": ["excel", "personal"],
749
852
  "isExcelOp": true,
750
853
  "scopes": ["Files.Read"],
751
854
  "llmTip": "Gets a specific table by name or ID. Returns table properties including columns, showHeaders, showTotals, and style."
@@ -754,6 +857,7 @@
754
857
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/tables/{workbookTable-id}/rows",
755
858
  "method": "get",
756
859
  "toolName": "list-excel-table-rows",
860
+ "presets": ["excel", "personal"],
757
861
  "isExcelOp": true,
758
862
  "scopes": ["Files.Read"],
759
863
  "llmTip": "Lists all rows in a table. Each row has index and values (array of cell values). Use $top and $skip for pagination on large tables."
@@ -762,6 +866,7 @@
762
866
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/workbook/tables/{workbookTable-id}/rows",
763
867
  "method": "post",
764
868
  "toolName": "add-excel-table-rows",
869
+ "presets": ["excel", "personal"],
765
870
  "isExcelOp": true,
766
871
  "scopes": ["Files.ReadWrite"],
767
872
  "llmTip": "Adds rows to a table. Body: { values: [['col1val', 'col2val', 'col3val'], ['row2col1', 'row2col2', 'row2col3']] }. Each inner array is one row. Values must match the number of columns in the table."
@@ -770,12 +875,14 @@
770
875
  "pathPattern": "/me/onenote/notebooks",
771
876
  "method": "get",
772
877
  "toolName": "list-onenote-notebooks",
878
+ "presets": ["onenote", "personal"],
773
879
  "scopes": ["Notes.Read"]
774
880
  },
775
881
  {
776
882
  "pathPattern": "/me/onenote/notebooks",
777
883
  "method": "post",
778
884
  "toolName": "create-onenote-notebook",
885
+ "presets": ["onenote", "personal"],
779
886
  "scopes": ["Notes.Create"],
780
887
  "llmTip": "Creates a new OneNote notebook. Body: { displayName: 'Notebook Name' }. The name must be unique across the user's notebooks."
781
888
  },
@@ -783,12 +890,14 @@
783
890
  "pathPattern": "/me/onenote/notebooks/{notebook-id}/sections",
784
891
  "method": "get",
785
892
  "toolName": "list-onenote-notebook-sections",
893
+ "presets": ["onenote", "personal"],
786
894
  "scopes": ["Notes.Read"]
787
895
  },
788
896
  {
789
897
  "pathPattern": "/me/onenote/notebooks/{notebook-id}/sections",
790
898
  "method": "post",
791
899
  "toolName": "create-onenote-section",
900
+ "presets": ["onenote", "personal"],
792
901
  "scopes": ["Notes.Create"],
793
902
  "llmTip": "Creates a new section in a notebook. Body: { displayName: 'Section Name' }."
794
903
  },
@@ -796,6 +905,7 @@
796
905
  "pathPattern": "/me/onenote/sections",
797
906
  "method": "get",
798
907
  "toolName": "list-all-onenote-sections",
908
+ "presets": ["onenote", "personal"],
799
909
  "scopes": ["Notes.Read"],
800
910
  "llmTip": "Lists all sections across all notebooks. Use list-onenote-notebook-sections to list sections within a specific notebook instead."
801
911
  },
@@ -803,42 +913,49 @@
803
913
  "pathPattern": "/me/onenote/sections/{onenoteSection-id}/pages",
804
914
  "method": "get",
805
915
  "toolName": "list-onenote-section-pages",
916
+ "presets": ["onenote", "personal"],
806
917
  "scopes": ["Notes.Read"]
807
918
  },
808
919
  {
809
920
  "pathPattern": "/me/onenote/pages/{onenotePage-id}/content",
810
921
  "method": "get",
811
922
  "toolName": "get-onenote-page-content",
923
+ "presets": ["onenote", "personal"],
812
924
  "scopes": ["Notes.Read"]
813
925
  },
814
926
  {
815
927
  "pathPattern": "/sites/{site-id}/onenote/notebooks",
816
928
  "method": "get",
817
929
  "toolName": "list-sharepoint-site-onenote-notebooks",
930
+ "presets": ["onenote", "work"],
818
931
  "workScopes": ["Notes.Read"]
819
932
  },
820
933
  {
821
934
  "pathPattern": "/sites/{site-id}/onenote/notebooks/{notebook-id}/sections",
822
935
  "method": "get",
823
936
  "toolName": "list-sharepoint-site-onenote-notebook-sections",
937
+ "presets": ["onenote", "work"],
824
938
  "workScopes": ["Notes.Read"]
825
939
  },
826
940
  {
827
941
  "pathPattern": "/sites/{site-id}/onenote/sections/{onenoteSection-id}/pages",
828
942
  "method": "get",
829
943
  "toolName": "list-sharepoint-site-onenote-section-pages",
944
+ "presets": ["onenote", "work"],
830
945
  "workScopes": ["Notes.Read"]
831
946
  },
832
947
  {
833
948
  "pathPattern": "/sites/{site-id}/onenote/pages/{onenotePage-id}/content",
834
949
  "method": "get",
835
950
  "toolName": "get-sharepoint-site-onenote-page-content",
951
+ "presets": ["onenote", "work"],
836
952
  "workScopes": ["Notes.Read"]
837
953
  },
838
954
  {
839
955
  "pathPattern": "/me/onenote/pages",
840
956
  "method": "post",
841
957
  "toolName": "create-onenote-page",
958
+ "presets": ["onenote", "personal"],
842
959
  "scopes": ["Notes.Create"],
843
960
  "contentType": "text/html",
844
961
  "llmTip": "Body must be a full HTML document (with <html><head><title>...</title></head><body>...</body></html>). Partial HTML or plain text fails silently or creates malformed pages."
@@ -847,6 +964,7 @@
847
964
  "pathPattern": "/me/onenote/sections/{onenoteSection-id}/pages",
848
965
  "method": "post",
849
966
  "toolName": "create-onenote-section-page",
967
+ "presets": ["onenote", "personal"],
850
968
  "scopes": ["Notes.Create"],
851
969
  "contentType": "text/html",
852
970
  "llmTip": "Body must be a full HTML document (with <html><head><title>...</title></head><body>...</body></html>). Partial HTML fails silently."
@@ -855,6 +973,7 @@
855
973
  "pathPattern": "/me/onenote/pages/{onenotePage-id}",
856
974
  "method": "delete",
857
975
  "toolName": "delete-onenote-page",
976
+ "presets": ["onenote", "personal"],
858
977
  "scopes": ["Notes.ReadWrite"],
859
978
  "llmTip": "Deletes a OneNote page permanently. This cannot be undone."
860
979
  },
@@ -862,6 +981,7 @@
862
981
  "pathPattern": "/me/todo/lists",
863
982
  "method": "get",
864
983
  "toolName": "list-todo-task-lists",
984
+ "presets": ["personal", "tasks"],
865
985
  "scopes": ["Tasks.Read"],
866
986
  "llmTip": "Lists all To Do task lists. Returns todoTaskList-id needed for all task operations. The default list is typically called 'Tasks'. NOTE: $select is NOT supported by this endpoint — do not pass select parameter, Graph returns 400."
867
987
  },
@@ -869,6 +989,7 @@
869
989
  "pathPattern": "/me/todo/lists/{todoTaskList-id}/tasks",
870
990
  "method": "get",
871
991
  "toolName": "list-todo-tasks",
992
+ "presets": ["personal", "tasks"],
872
993
  "scopes": ["Tasks.Read"],
873
994
  "llmTip": "Lists tasks in a To Do list. Requires todoTaskList-id — use list-todo-task-lists to find it. NOTE: $select is NOT supported — do not pass select, Graph returns 400. Use $filter=status eq 'notStarted' or $filter=status eq 'completed' to filter by status. Use $top to limit results. Status values: 'notStarted', 'inProgress', 'completed', 'waitingOnOthers', 'deferred'."
874
995
  },
@@ -876,6 +997,7 @@
876
997
  "pathPattern": "/me/todo/lists/{todoTaskList-id}/tasks/{todoTask-id}",
877
998
  "method": "get",
878
999
  "toolName": "get-todo-task",
1000
+ "presets": ["personal", "tasks"],
879
1001
  "scopes": ["Tasks.Read"],
880
1002
  "llmTip": "Returns a single To Do task. NOTE: $select is NOT supported — do not pass select parameter, Graph returns RequestBroker--ParseUri (400). Use $expand=linkedResources to include linked email/resource. Returns body content (HTML format), checklist items, and linked resources."
881
1003
  },
@@ -883,24 +1005,28 @@
883
1005
  "pathPattern": "/me/todo/lists/{todoTaskList-id}/tasks",
884
1006
  "method": "post",
885
1007
  "toolName": "create-todo-task",
1008
+ "presets": ["personal", "tasks"],
886
1009
  "scopes": ["Tasks.ReadWrite"]
887
1010
  },
888
1011
  {
889
1012
  "pathPattern": "/me/todo/lists/{todoTaskList-id}/tasks/{todoTask-id}",
890
1013
  "method": "patch",
891
1014
  "toolName": "update-todo-task",
1015
+ "presets": ["personal", "tasks"],
892
1016
  "scopes": ["Tasks.ReadWrite"]
893
1017
  },
894
1018
  {
895
1019
  "pathPattern": "/me/todo/lists/{todoTaskList-id}/tasks/{todoTask-id}",
896
1020
  "method": "delete",
897
1021
  "toolName": "delete-todo-task",
1022
+ "presets": ["personal", "tasks"],
898
1023
  "scopes": ["Tasks.ReadWrite"]
899
1024
  },
900
1025
  {
901
1026
  "pathPattern": "/me/todo/lists/{todoTaskList-id}/tasks/{todoTask-id}/linkedResources",
902
1027
  "method": "get",
903
1028
  "toolName": "list-todo-linked-resources",
1029
+ "presets": ["personal", "tasks"],
904
1030
  "scopes": ["Tasks.Read"],
905
1031
  "llmTip": "Lists resources linked to a To Do task (emails, URLs, etc.). Each linked resource has displayName, webUrl, applicationName, and externalId."
906
1032
  },
@@ -908,6 +1034,7 @@
908
1034
  "pathPattern": "/me/todo/lists/{todoTaskList-id}/tasks/{todoTask-id}/linkedResources",
909
1035
  "method": "post",
910
1036
  "toolName": "create-todo-linked-resource",
1037
+ "presets": ["personal", "tasks"],
911
1038
  "scopes": ["Tasks.ReadWrite"],
912
1039
  "llmTip": "Links a resource to a To Do task. Body: { webUrl: 'https://...', applicationName: 'Mail', displayName: 'Related email', externalId: 'optional-id' }. Use to link tasks to emails, files, or web pages for context."
913
1040
  },
@@ -915,6 +1042,7 @@
915
1042
  "pathPattern": "/me/todo/lists/{todoTaskList-id}/tasks/{todoTask-id}/linkedResources/{linkedResource-id}",
916
1043
  "method": "delete",
917
1044
  "toolName": "delete-todo-linked-resource",
1045
+ "presets": ["personal", "tasks"],
918
1046
  "scopes": ["Tasks.ReadWrite"],
919
1047
  "llmTip": "Removes a linked resource from a To Do task."
920
1048
  },
@@ -922,6 +1050,7 @@
922
1050
  "pathPattern": "/me/planner/tasks",
923
1051
  "method": "get",
924
1052
  "toolName": "list-planner-tasks",
1053
+ "presets": ["tasks", "work"],
925
1054
  "scopes": ["Tasks.Read"],
926
1055
  "llmTip": "Priority values: 0=Urgent, 1=Important, 3=Medium, 5=Low, 9=unset."
927
1056
  },
@@ -929,12 +1058,14 @@
929
1058
  "pathPattern": "/planner/plans/{plannerPlan-id}",
930
1059
  "method": "get",
931
1060
  "toolName": "get-planner-plan",
1061
+ "presets": ["tasks", "work"],
932
1062
  "scopes": ["Tasks.Read"]
933
1063
  },
934
1064
  {
935
1065
  "pathPattern": "/planner/plans/{plannerPlan-id}/tasks",
936
1066
  "method": "get",
937
1067
  "toolName": "list-plan-tasks",
1068
+ "presets": ["tasks", "work"],
938
1069
  "scopes": ["Tasks.Read"],
939
1070
  "llmTip": "Priority values: 0=Urgent, 1=Important, 3=Medium, 5=Low, 9=unset."
940
1071
  },
@@ -942,6 +1073,7 @@
942
1073
  "pathPattern": "/planner/tasks/{plannerTask-id}",
943
1074
  "method": "get",
944
1075
  "toolName": "get-planner-task",
1076
+ "presets": ["tasks", "work"],
945
1077
  "scopes": ["Tasks.Read"],
946
1078
  "llmTip": "Response includes @odata.etag — save it, required as If-Match header for update-planner-task. Use includeHeaders=true to capture it."
947
1079
  },
@@ -949,12 +1081,14 @@
949
1081
  "pathPattern": "/planner/tasks",
950
1082
  "method": "post",
951
1083
  "toolName": "create-planner-task",
1084
+ "presets": ["tasks", "work"],
952
1085
  "scopes": ["Tasks.ReadWrite"]
953
1086
  },
954
1087
  {
955
1088
  "pathPattern": "/planner/tasks/{plannerTask-id}",
956
1089
  "method": "patch",
957
1090
  "toolName": "update-planner-task",
1091
+ "presets": ["tasks", "work"],
958
1092
  "scopes": ["Tasks.ReadWrite"],
959
1093
  "llmTip": "CRITICAL: Requires If-Match header with the task's @odata.etag value, otherwise returns 412 Precondition Failed. Get the ETag from get-planner-task with includeHeaders=true. Priority values: 0=Urgent, 1=Important, 3=Medium, 5=Low, 9=unset."
960
1094
  },
@@ -962,6 +1096,7 @@
962
1096
  "pathPattern": "/planner/tasks/{plannerTask-id}/details",
963
1097
  "method": "get",
964
1098
  "toolName": "get-planner-task-details",
1099
+ "presets": ["tasks", "work"],
965
1100
  "scopes": ["Tasks.Read"],
966
1101
  "llmTip": "Response includes @odata.etag — required for update-planner-task-details. Use includeHeaders=true."
967
1102
  },
@@ -969,6 +1104,7 @@
969
1104
  "pathPattern": "/planner/tasks/{plannerTask-id}/details",
970
1105
  "method": "patch",
971
1106
  "toolName": "update-planner-task-details",
1107
+ "presets": ["tasks", "work"],
972
1108
  "scopes": ["Tasks.ReadWrite"],
973
1109
  "llmTip": "CRITICAL: Requires If-Match header with ETag from get-planner-task-details (use includeHeaders=true). Checklist items use GUID keys: {\"checklist\": {\"<guid>\": {\"title\": \"...\", \"isChecked\": false}}}."
974
1110
  },
@@ -976,12 +1112,14 @@
976
1112
  "pathPattern": "/planner/plans/{plannerPlan-id}/buckets",
977
1113
  "method": "get",
978
1114
  "toolName": "list-plan-buckets",
1115
+ "presets": ["tasks", "work"],
979
1116
  "scopes": ["Tasks.Read"]
980
1117
  },
981
1118
  {
982
1119
  "pathPattern": "/planner/buckets/{plannerBucket-id}",
983
1120
  "method": "get",
984
1121
  "toolName": "get-planner-bucket",
1122
+ "presets": ["tasks", "work"],
985
1123
  "scopes": ["Tasks.Read"],
986
1124
  "llmTip": "Response includes @odata.etag — required as If-Match for update-planner-bucket and delete-planner-bucket. Use includeHeaders=true."
987
1125
  },
@@ -989,12 +1127,14 @@
989
1127
  "pathPattern": "/planner/buckets",
990
1128
  "method": "post",
991
1129
  "toolName": "create-planner-bucket",
1130
+ "presets": ["tasks", "work"],
992
1131
  "scopes": ["Tasks.ReadWrite"]
993
1132
  },
994
1133
  {
995
1134
  "pathPattern": "/planner/buckets/{plannerBucket-id}",
996
1135
  "method": "patch",
997
1136
  "toolName": "update-planner-bucket",
1137
+ "presets": ["tasks", "work"],
998
1138
  "scopes": ["Tasks.ReadWrite"],
999
1139
  "llmTip": "CRITICAL: Requires If-Match header with ETag from get-planner-bucket (use includeHeaders=true)."
1000
1140
  },
@@ -1002,6 +1142,7 @@
1002
1142
  "pathPattern": "/planner/buckets/{plannerBucket-id}",
1003
1143
  "method": "delete",
1004
1144
  "toolName": "delete-planner-bucket",
1145
+ "presets": ["tasks", "work"],
1005
1146
  "scopes": ["Tasks.ReadWrite"],
1006
1147
  "llmTip": "CRITICAL: Requires If-Match header with ETag from get-planner-bucket (use includeHeaders=true)."
1007
1148
  },
@@ -1009,6 +1150,7 @@
1009
1150
  "pathPattern": "/me/contacts",
1010
1151
  "method": "get",
1011
1152
  "toolName": "list-outlook-contacts",
1153
+ "presets": ["contacts", "outlook", "personal"],
1012
1154
  "scopes": ["Contacts.Read"],
1013
1155
  "llmTip": "$filter only supports startswith() — contains() and eq on emailAddresses do not work. Use $search as alternative for broader matching."
1014
1156
  },
@@ -1016,18 +1158,21 @@
1016
1158
  "pathPattern": "/me/contacts/{contact-id}",
1017
1159
  "method": "get",
1018
1160
  "toolName": "get-outlook-contact",
1161
+ "presets": ["contacts", "outlook", "personal"],
1019
1162
  "scopes": ["Contacts.Read"]
1020
1163
  },
1021
1164
  {
1022
1165
  "pathPattern": "/me/contacts",
1023
1166
  "method": "post",
1024
1167
  "toolName": "create-outlook-contact",
1168
+ "presets": ["contacts", "outlook", "personal"],
1025
1169
  "scopes": ["Contacts.ReadWrite"]
1026
1170
  },
1027
1171
  {
1028
1172
  "pathPattern": "/me/contacts/{contact-id}",
1029
1173
  "method": "patch",
1030
1174
  "toolName": "update-outlook-contact",
1175
+ "presets": ["contacts", "outlook", "personal"],
1031
1176
  "scopes": ["Contacts.ReadWrite"],
1032
1177
  "llmTip": "emailAddresses array is replaced entirely — include all addresses, not just new ones."
1033
1178
  },
@@ -1035,18 +1180,21 @@
1035
1180
  "pathPattern": "/me/contacts/{contact-id}",
1036
1181
  "method": "delete",
1037
1182
  "toolName": "delete-outlook-contact",
1183
+ "presets": ["contacts", "outlook", "personal"],
1038
1184
  "scopes": ["Contacts.ReadWrite"]
1039
1185
  },
1040
1186
  {
1041
1187
  "pathPattern": "/me",
1042
1188
  "method": "get",
1043
1189
  "toolName": "get-current-user",
1190
+ "presets": ["personal", "users", "work"],
1044
1191
  "scopes": ["User.Read"]
1045
1192
  },
1046
1193
  {
1047
1194
  "pathPattern": "/me/mailboxSettings",
1048
1195
  "method": "get",
1049
1196
  "toolName": "get-mailbox-settings",
1197
+ "presets": ["mail", "outlook", "personal"],
1050
1198
  "scopes": ["MailboxSettings.Read"],
1051
1199
  "llmTip": "Gets the current user's mailbox settings including automaticRepliesSetting (out-of-office status, message, scheduledStartDateTime/EndDateTime, externalAudience), language, timeZone, dateFormat, timeFormat, delegateMeetingMessageDeliveryOptions, and userPurpose."
1052
1200
  },
@@ -1054,6 +1202,7 @@
1054
1202
  "pathPattern": "/me/mailboxSettings",
1055
1203
  "method": "patch",
1056
1204
  "toolName": "update-mailbox-settings",
1205
+ "presets": ["mail", "outlook", "personal"],
1057
1206
  "scopes": ["MailboxSettings.ReadWrite"],
1058
1207
  "llmTip": "Updates mailbox settings. Common use: configure Out-of-Office (automatic replies). Body example: { automaticRepliesSetting: { status: 'scheduled', scheduledStartDateTime: { dateTime: '2026-03-28T17:00:00', timeZone: 'Eastern Standard Time' }, scheduledEndDateTime: { dateTime: '2026-04-01T08:00:00', timeZone: 'Eastern Standard Time' }, internalReplyMessage: 'I am OOO.', externalReplyMessage: 'I am out of office.' } }. Status values: disabled, alwaysEnabled, scheduled."
1059
1208
  },
@@ -1061,6 +1210,7 @@
1061
1210
  "pathPattern": "/me/manager",
1062
1211
  "method": "get",
1063
1212
  "toolName": "get-my-manager",
1213
+ "presets": ["users", "work"],
1064
1214
  "workScopes": ["User.Read.All"],
1065
1215
  "llmTip": "Gets the current user's manager. Returns a directoryObject with displayName, mail, jobTitle, id. Use the id to chain further queries (e.g. get their direct reports or presence)."
1066
1216
  },
@@ -1068,6 +1218,7 @@
1068
1218
  "pathPattern": "/me/directReports",
1069
1219
  "method": "get",
1070
1220
  "toolName": "list-my-direct-reports",
1221
+ "presets": ["users", "work"],
1071
1222
  "workScopes": ["User.Read.All"],
1072
1223
  "llmTip": "Lists users who report directly to the current user. Returns directoryObjects with displayName, mail, jobTitle, id. Useful for building org charts or sending team-wide communications."
1073
1224
  },
@@ -1075,6 +1226,7 @@
1075
1226
  "pathPattern": "/users/{user-id}/manager",
1076
1227
  "method": "get",
1077
1228
  "toolName": "get-user-manager",
1229
+ "presets": ["users", "work"],
1078
1230
  "workScopes": ["User.Read.All"],
1079
1231
  "llmTip": "Gets the manager of a specific user by user ID or UPN (email). Returns a directoryObject with displayName, mail, jobTitle."
1080
1232
  },
@@ -1082,6 +1234,7 @@
1082
1234
  "pathPattern": "/users/{user-id}/directReports",
1083
1235
  "method": "get",
1084
1236
  "toolName": "list-user-direct-reports",
1237
+ "presets": ["users", "work"],
1085
1238
  "workScopes": ["User.Read.All"],
1086
1239
  "llmTip": "Lists users who report directly to a specific user. Use with get-user-manager to traverse the org hierarchy."
1087
1240
  },
@@ -1089,6 +1242,7 @@
1089
1242
  "pathPattern": "/me/people",
1090
1243
  "method": "get",
1091
1244
  "toolName": "list-relevant-people",
1245
+ "presets": ["users", "work"],
1092
1246
  "workScopes": ["People.Read"],
1093
1247
  "llmTip": "Lists people most relevant to the current user, ordered by relevance. Based on communication patterns, collaboration, and business relationships. Each person has displayName, emailAddresses, jobTitle, department, officeLocation. Use $search to find specific people by name. Use $top to limit results."
1094
1248
  },
@@ -1096,6 +1250,7 @@
1096
1250
  "pathPattern": "/me/memberOf",
1097
1251
  "method": "get",
1098
1252
  "toolName": "list-my-memberships",
1253
+ "presets": ["users", "work"],
1099
1254
  "workScopes": ["Directory.Read.All"],
1100
1255
  "llmTip": "Lists all groups, directory roles, and administrative units the current user is a member of. Returns directoryObjects — use $filter=isof('microsoft.graph.group') to filter to groups only. Each group has displayName, mail, groupTypes, membershipRule."
1101
1256
  },
@@ -1103,6 +1258,7 @@
1103
1258
  "pathPattern": "/groups",
1104
1259
  "method": "get",
1105
1260
  "toolName": "list-groups",
1261
+ "presets": ["work"],
1106
1262
  "workScopes": ["Group.Read.All"],
1107
1263
  "llmTip": "Lists organization groups (Microsoft 365 groups, security groups, distribution lists). Use $filter=groupTypes/any(g:g eq 'Unified') for M365 groups only. Use $filter=mailEnabled eq true and securityEnabled eq false for distribution lists. Use $search=\"displayName:keyword\" to search by name (requires ConsistencyLevel: eventual header). Use $select to limit fields."
1108
1264
  },
@@ -1110,6 +1266,7 @@
1110
1266
  "pathPattern": "/groups/{group-id}",
1111
1267
  "method": "get",
1112
1268
  "toolName": "get-group",
1269
+ "presets": ["work"],
1113
1270
  "workScopes": ["Group.Read.All"],
1114
1271
  "llmTip": "Gets a specific group's details: displayName, description, mail, visibility, groupTypes, membershipRule, createdDateTime. Use $select to limit returned properties."
1115
1272
  },
@@ -1117,6 +1274,7 @@
1117
1274
  "pathPattern": "/groups/{group-id}/calendarView",
1118
1275
  "method": "get",
1119
1276
  "toolName": "get-group-calendar-view",
1277
+ "presets": ["work"],
1120
1278
  "workScopes": ["Group.Read.All"],
1121
1279
  "supportsTimezone": true
1122
1280
  },
@@ -1124,6 +1282,7 @@
1124
1282
  "pathPattern": "/groups/{group-id}/events",
1125
1283
  "method": "get",
1126
1284
  "toolName": "list-group-events",
1285
+ "presets": ["work"],
1127
1286
  "workScopes": ["Group.Read.All"],
1128
1287
  "supportsTimezone": true
1129
1288
  },
@@ -1131,6 +1290,7 @@
1131
1290
  "pathPattern": "/groups/{group-id}/members",
1132
1291
  "method": "get",
1133
1292
  "toolName": "list-group-members",
1293
+ "presets": ["work"],
1134
1294
  "workScopes": ["GroupMember.Read.All"],
1135
1295
  "llmTip": "Lists members of a group. Returns directoryObjects with displayName, mail, jobTitle, userPrincipalName. Use $select to limit fields. Use $top and pagination for large groups."
1136
1296
  },
@@ -1138,6 +1298,7 @@
1138
1298
  "pathPattern": "/groups/{group-id}/owners",
1139
1299
  "method": "get",
1140
1300
  "toolName": "list-group-owners",
1301
+ "presets": ["work"],
1141
1302
  "workScopes": ["GroupMember.Read.All"],
1142
1303
  "llmTip": "Lists owners of a group. Owners can manage group settings and membership. Returns directoryObjects with displayName, mail, userPrincipalName."
1143
1304
  },
@@ -1145,18 +1306,21 @@
1145
1306
  "pathPattern": "/me/chats",
1146
1307
  "method": "get",
1147
1308
  "toolName": "list-chats",
1309
+ "presets": ["teams", "work"],
1148
1310
  "workScopes": ["Chat.Read"]
1149
1311
  },
1150
1312
  {
1151
1313
  "pathPattern": "/chats/{chat-id}",
1152
1314
  "method": "get",
1153
1315
  "toolName": "get-chat",
1316
+ "presets": ["teams", "work"],
1154
1317
  "workScopes": ["Chat.Read"]
1155
1318
  },
1156
1319
  {
1157
1320
  "pathPattern": "/chats/{chat-id}/members",
1158
1321
  "method": "get",
1159
1322
  "toolName": "list-chat-members",
1323
+ "presets": ["teams", "work"],
1160
1324
  "workScopes": ["ChatMember.Read"],
1161
1325
  "llmTip": "Lists members of a chat. Each member has displayName, email, roles (owner/guest), and visibleHistoryStartDateTime. For meeting chats, use the chatInfo.threadId from get-online-meeting as the chat-id to see who participated in the meeting chat."
1162
1326
  },
@@ -1164,18 +1328,21 @@
1164
1328
  "pathPattern": "/chats/{chat-id}/messages",
1165
1329
  "method": "get",
1166
1330
  "toolName": "list-chat-messages",
1331
+ "presets": ["teams", "work"],
1167
1332
  "workScopes": ["ChatMessage.Read"]
1168
1333
  },
1169
1334
  {
1170
1335
  "pathPattern": "/chats/{chat-id}/messages/{chatMessage-id}",
1171
1336
  "method": "get",
1172
1337
  "toolName": "get-chat-message",
1338
+ "presets": ["teams", "work"],
1173
1339
  "workScopes": ["ChatMessage.Read"]
1174
1340
  },
1175
1341
  {
1176
1342
  "pathPattern": "/chats/{chat-id}/messages/{chatMessage-id}/hostedContents",
1177
1343
  "method": "get",
1178
1344
  "toolName": "list-chat-message-hosted-contents",
1345
+ "presets": ["teams", "work"],
1179
1346
  "workScopes": ["ChatMessage.Read"],
1180
1347
  "llmTip": "Lists hosted-content references (inline images, code snippets) attached to a Teams chat message. Returns { id, contentType } per item. To download bytes, call download-bytes with target=/chats/{chat-id}/messages/{chatMessage-id}/hostedContents/{id}/$value. IDs can also be extracted from the <img src> URL in the message body between /hostedContents/ and /$value."
1181
1348
  },
@@ -1183,6 +1350,7 @@
1183
1350
  "pathPattern": "/chats/{chat-id}/messages",
1184
1351
  "method": "post",
1185
1352
  "toolName": "send-chat-message",
1353
+ "presets": ["teams", "work"],
1186
1354
  "workScopes": ["ChatMessage.Send"],
1187
1355
  "llmTip": "Use contentType 'html' in the body — plain text contentType gets mangled by Graph API."
1188
1356
  },
@@ -1190,60 +1358,70 @@
1190
1358
  "pathPattern": "/me/joinedTeams",
1191
1359
  "method": "get",
1192
1360
  "toolName": "list-joined-teams",
1361
+ "presets": ["teams", "work"],
1193
1362
  "workScopes": ["Team.ReadBasic.All"]
1194
1363
  },
1195
1364
  {
1196
1365
  "pathPattern": "/teams/{team-id}",
1197
1366
  "method": "get",
1198
1367
  "toolName": "get-team",
1368
+ "presets": ["teams", "work"],
1199
1369
  "workScopes": ["Team.ReadBasic.All"]
1200
1370
  },
1201
1371
  {
1202
1372
  "pathPattern": "/teams/{team-id}/channels",
1203
1373
  "method": "get",
1204
1374
  "toolName": "list-team-channels",
1375
+ "presets": ["teams", "work"],
1205
1376
  "workScopes": ["Channel.ReadBasic.All"]
1206
1377
  },
1207
1378
  {
1208
1379
  "pathPattern": "/teams/{team-id}/channels/{channel-id}",
1209
1380
  "method": "get",
1210
1381
  "toolName": "get-team-channel",
1382
+ "presets": ["teams", "work"],
1211
1383
  "workScopes": ["Channel.ReadBasic.All"]
1212
1384
  },
1213
1385
  {
1214
1386
  "pathPattern": "/teams/{team-id}/channels",
1215
1387
  "method": "post",
1216
1388
  "toolName": "create-team-channel",
1389
+ "presets": ["teams", "work"],
1217
1390
  "workScopes": ["Channel.Create"]
1218
1391
  },
1219
1392
  {
1220
1393
  "pathPattern": "/teams/{team-id}/channels/{channel-id}",
1221
1394
  "method": "patch",
1222
1395
  "toolName": "update-team-channel",
1396
+ "presets": ["teams", "work"],
1223
1397
  "workScopes": ["ChannelSettings.ReadWrite.All"]
1224
1398
  },
1225
1399
  {
1226
1400
  "pathPattern": "/teams/{team-id}/channels/{channel-id}",
1227
1401
  "method": "delete",
1228
1402
  "toolName": "delete-team-channel",
1403
+ "presets": ["teams", "work"],
1229
1404
  "workScopes": ["Channel.Delete.All"]
1230
1405
  },
1231
1406
  {
1232
1407
  "pathPattern": "/teams/{team-id}/channels/{channel-id}/messages",
1233
1408
  "method": "get",
1234
1409
  "toolName": "list-channel-messages",
1410
+ "presets": ["teams", "work"],
1235
1411
  "workScopes": ["ChannelMessage.Read.All"]
1236
1412
  },
1237
1413
  {
1238
1414
  "pathPattern": "/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}",
1239
1415
  "method": "get",
1240
1416
  "toolName": "get-channel-message",
1417
+ "presets": ["teams", "work"],
1241
1418
  "workScopes": ["ChannelMessage.Read.All"]
1242
1419
  },
1243
1420
  {
1244
1421
  "pathPattern": "/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}/hostedContents",
1245
1422
  "method": "get",
1246
1423
  "toolName": "list-channel-message-hosted-contents",
1424
+ "presets": ["teams", "work"],
1247
1425
  "workScopes": ["ChannelMessage.Read.All"],
1248
1426
  "llmTip": "Lists hosted-content references (inline images, code snippets) attached to a Teams channel message. Returns { id, contentType } per item. To download bytes, call download-bytes with target=/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}/hostedContents/{id}/$value."
1249
1427
  },
@@ -1251,6 +1429,7 @@
1251
1429
  "pathPattern": "/teams/{team-id}/channels/{channel-id}/messages",
1252
1430
  "method": "post",
1253
1431
  "toolName": "send-channel-message",
1432
+ "presets": ["teams", "work"],
1254
1433
  "workScopes": ["ChannelMessage.Send"],
1255
1434
  "llmTip": "Use contentType 'html' in the body — plain text contentType gets mangled by Graph API."
1256
1435
  },
@@ -1258,6 +1437,7 @@
1258
1437
  "pathPattern": "/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}/replies",
1259
1438
  "method": "post",
1260
1439
  "toolName": "reply-to-channel-message",
1440
+ "presets": ["teams", "work"],
1261
1441
  "workScopes": ["ChannelMessage.Send"],
1262
1442
  "llmTip": "Use contentType 'html' in the body — plain text contentType gets mangled by Graph API."
1263
1443
  },
@@ -1265,48 +1445,56 @@
1265
1445
  "pathPattern": "/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}/replies",
1266
1446
  "method": "get",
1267
1447
  "toolName": "list-channel-message-replies",
1448
+ "presets": ["teams", "work"],
1268
1449
  "workScopes": ["ChannelMessage.Read.All"]
1269
1450
  },
1270
1451
  {
1271
1452
  "pathPattern": "/teams/{team-id}/members",
1272
1453
  "method": "post",
1273
1454
  "toolName": "add-team-member",
1455
+ "presets": ["teams", "work"],
1274
1456
  "workScopes": ["TeamMember.ReadWrite.All"]
1275
1457
  },
1276
1458
  {
1277
1459
  "pathPattern": "/teams/{team-id}/members/{conversationMember-id}",
1278
1460
  "method": "delete",
1279
1461
  "toolName": "remove-team-member",
1462
+ "presets": ["teams", "work"],
1280
1463
  "workScopes": ["TeamMember.ReadWrite.All"]
1281
1464
  },
1282
1465
  {
1283
1466
  "pathPattern": "/teams/{team-id}/channels/{channel-id}/tabs",
1284
1467
  "method": "get",
1285
1468
  "toolName": "list-channel-tabs",
1469
+ "presets": ["teams", "work"],
1286
1470
  "workScopes": ["TeamsTab.Read.All"]
1287
1471
  },
1288
1472
  {
1289
1473
  "pathPattern": "/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}/setReaction",
1290
1474
  "method": "post",
1291
1475
  "toolName": "set-channel-message-reaction",
1476
+ "presets": ["teams", "work"],
1292
1477
  "workScopes": ["ChannelMessage.Send"]
1293
1478
  },
1294
1479
  {
1295
1480
  "pathPattern": "/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}/unsetReaction",
1296
1481
  "method": "post",
1297
1482
  "toolName": "unset-channel-message-reaction",
1483
+ "presets": ["teams", "work"],
1298
1484
  "workScopes": ["ChannelMessage.Send"]
1299
1485
  },
1300
1486
  {
1301
1487
  "pathPattern": "/teams/{team-id}/members",
1302
1488
  "method": "get",
1303
1489
  "toolName": "list-team-members",
1490
+ "presets": ["teams", "work"],
1304
1491
  "workScopes": ["TeamMember.Read.All"]
1305
1492
  },
1306
1493
  {
1307
1494
  "pathPattern": "/teams/{team-id}/channels/{channel-id}/filesFolder",
1308
1495
  "method": "get",
1309
1496
  "toolName": "get-channel-files-folder",
1497
+ "presets": ["teams", "work"],
1310
1498
  "workScopes": ["ChannelSettings.Read.All"],
1311
1499
  "llmTip": "Gets the SharePoint driveItem (folder) that contains the files for a Teams channel. Returns id, name, webUrl, and parentReference with driveId. Use the driveId and id with OneDrive/SharePoint endpoints (list-folder-files) to browse and download channel files."
1312
1500
  },
@@ -1314,12 +1502,14 @@
1314
1502
  "pathPattern": "/chats/{chat-id}/messages/{chatMessage-id}/replies",
1315
1503
  "method": "get",
1316
1504
  "toolName": "list-chat-message-replies",
1505
+ "presets": ["teams", "work"],
1317
1506
  "workScopes": ["ChatMessage.Read"]
1318
1507
  },
1319
1508
  {
1320
1509
  "pathPattern": "/chats/{chat-id}/messages/{chatMessage-id}/replies",
1321
1510
  "method": "post",
1322
1511
  "toolName": "reply-to-chat-message",
1512
+ "presets": ["teams", "work"],
1323
1513
  "workScopes": ["ChatMessage.Send"],
1324
1514
  "llmTip": "Use contentType 'html' in the body — plain text contentType gets mangled by Graph API."
1325
1515
  },
@@ -1327,84 +1517,98 @@
1327
1517
  "pathPattern": "/chats/{chat-id}/messages/{chatMessage-id}/setReaction",
1328
1518
  "method": "post",
1329
1519
  "toolName": "set-chat-message-reaction",
1520
+ "presets": ["teams", "work"],
1330
1521
  "workScopes": ["ChatMessage.Send"]
1331
1522
  },
1332
1523
  {
1333
1524
  "pathPattern": "/chats/{chat-id}/messages/{chatMessage-id}/unsetReaction",
1334
1525
  "method": "post",
1335
1526
  "toolName": "unset-chat-message-reaction",
1527
+ "presets": ["teams", "work"],
1336
1528
  "workScopes": ["ChatMessage.Send"]
1337
1529
  },
1338
1530
  {
1339
1531
  "pathPattern": "/chats/{chat-id}/pinnedMessages",
1340
1532
  "method": "get",
1341
1533
  "toolName": "list-pinned-chat-messages",
1534
+ "presets": ["teams", "work"],
1342
1535
  "workScopes": ["Chat.Read"]
1343
1536
  },
1344
1537
  {
1345
1538
  "pathPattern": "/chats/{chat-id}/pinnedMessages",
1346
1539
  "method": "post",
1347
1540
  "toolName": "pin-chat-message",
1541
+ "presets": ["teams", "work"],
1348
1542
  "workScopes": ["ChatMessage.Send"]
1349
1543
  },
1350
1544
  {
1351
1545
  "pathPattern": "/chats/{chat-id}/pinnedMessages/{pinnedChatMessageInfo-id}",
1352
1546
  "method": "delete",
1353
1547
  "toolName": "unpin-chat-message",
1548
+ "presets": ["teams", "work"],
1354
1549
  "workScopes": ["Chat.ReadWrite"]
1355
1550
  },
1356
1551
  {
1357
1552
  "pathPattern": "/sites",
1358
1553
  "method": "get",
1359
1554
  "toolName": "search-sharepoint-sites",
1555
+ "presets": ["search", "work"],
1360
1556
  "workScopes": ["Sites.Read.All"]
1361
1557
  },
1362
1558
  {
1363
1559
  "pathPattern": "/sites/{site-id}",
1364
1560
  "method": "get",
1365
1561
  "toolName": "get-sharepoint-site",
1562
+ "presets": ["work"],
1366
1563
  "workScopes": ["Sites.Read.All"]
1367
1564
  },
1368
1565
  {
1369
1566
  "pathPattern": "/sites/{site-id}/drives",
1370
1567
  "method": "get",
1371
1568
  "toolName": "list-sharepoint-site-drives",
1569
+ "presets": ["work"],
1372
1570
  "workScopes": ["Sites.Read.All"]
1373
1571
  },
1374
1572
  {
1375
1573
  "pathPattern": "/sites/{site-id}/drives/{drive-id}",
1376
1574
  "method": "get",
1377
1575
  "toolName": "get-sharepoint-site-drive-by-id",
1576
+ "presets": ["work"],
1378
1577
  "workScopes": ["Sites.Read.All"]
1379
1578
  },
1380
1579
  {
1381
1580
  "pathPattern": "/sites/{site-id}/items",
1382
1581
  "method": "get",
1383
1582
  "toolName": "list-sharepoint-site-items",
1583
+ "presets": ["work"],
1384
1584
  "workScopes": ["Sites.Read.All"]
1385
1585
  },
1386
1586
  {
1387
1587
  "pathPattern": "/sites/{site-id}/items/{baseItem-id}",
1388
1588
  "method": "get",
1389
1589
  "toolName": "get-sharepoint-site-item",
1590
+ "presets": ["work"],
1390
1591
  "workScopes": ["Sites.Read.All"]
1391
1592
  },
1392
1593
  {
1393
1594
  "pathPattern": "/sites/{site-id}/lists",
1394
1595
  "method": "get",
1395
1596
  "toolName": "list-sharepoint-site-lists",
1597
+ "presets": ["work"],
1396
1598
  "workScopes": ["Sites.Read.All"]
1397
1599
  },
1398
1600
  {
1399
1601
  "pathPattern": "/sites/{site-id}/lists/{list-id}",
1400
1602
  "method": "get",
1401
1603
  "toolName": "get-sharepoint-site-list",
1604
+ "presets": ["work"],
1402
1605
  "workScopes": ["Sites.Read.All"]
1403
1606
  },
1404
1607
  {
1405
1608
  "pathPattern": "/sites/{site-id}/lists/{list-id}/items",
1406
1609
  "method": "get",
1407
1610
  "toolName": "list-sharepoint-site-list-items",
1611
+ "presets": ["work"],
1408
1612
  "workScopes": ["Sites.Read.All"],
1409
1613
  "llmTip": "Add $expand=fields to include actual column values. Without it, only metadata is returned."
1410
1614
  },
@@ -1412,6 +1616,7 @@
1412
1616
  "pathPattern": "/sites/{site-id}/lists/{list-id}/items/{listItem-id}",
1413
1617
  "method": "get",
1414
1618
  "toolName": "get-sharepoint-site-list-item",
1619
+ "presets": ["work"],
1415
1620
  "workScopes": ["Sites.Read.All"],
1416
1621
  "llmTip": "Add $expand=fields to include actual column values. Without it, only metadata is returned."
1417
1622
  },
@@ -1419,6 +1624,7 @@
1419
1624
  "pathPattern": "/sites/{site-id}/lists/{list-id}/items",
1420
1625
  "method": "post",
1421
1626
  "toolName": "create-sharepoint-list-item",
1627
+ "presets": ["work"],
1422
1628
  "workScopes": ["Sites.ReadWrite.All"],
1423
1629
  "llmTip": "Creates a new item in a SharePoint list. Body: { fields: { Title: 'Item name', ColumnName: 'value', ... } }. Use list-sharepoint-site-lists to find the list ID and get-sharepoint-site-list to discover available columns."
1424
1630
  },
@@ -1426,6 +1632,7 @@
1426
1632
  "pathPattern": "/sites/{site-id}/lists/{list-id}/items/{listItem-id}",
1427
1633
  "method": "patch",
1428
1634
  "toolName": "update-sharepoint-list-item",
1635
+ "presets": ["work"],
1429
1636
  "workScopes": ["Sites.ReadWrite.All"],
1430
1637
  "llmTip": "Updates fields on an existing list item. Body: { fields: { ColumnName: 'new value' } }. Send only the fields you want to change. Use $expand=fields on get-sharepoint-site-list-item to see current values first."
1431
1638
  },
@@ -1433,6 +1640,7 @@
1433
1640
  "pathPattern": "/sites/{site-id}/lists/{list-id}/items/{listItem-id}",
1434
1641
  "method": "delete",
1435
1642
  "toolName": "delete-sharepoint-list-item",
1643
+ "presets": ["work"],
1436
1644
  "workScopes": ["Sites.ReadWrite.All"],
1437
1645
  "llmTip": "Deletes a list item permanently. This cannot be undone — the item is moved to the site recycle bin."
1438
1646
  },
@@ -1440,6 +1648,7 @@
1440
1648
  "pathPattern": "/sites/{site-id}/lists",
1441
1649
  "method": "post",
1442
1650
  "toolName": "create-sharepoint-list",
1651
+ "presets": ["work"],
1443
1652
  "workScopes": ["Sites.Manage.All"],
1444
1653
  "llmTip": "Creates a new SharePoint list in a site. Body: { displayName: 'My List', description: 'Optional', list: { template: 'genericList' }, columns: [ { name: 'Status', text: {} }, { name: 'Due', dateTime: {} } ] }. Templates include genericList, documentLibrary, tasks, calendar, contacts, links, announcements, survey. Columns can be defined inline at creation; otherwise add them later via create-sharepoint-list-column. Use search-sharepoint-sites or get-sharepoint-site-by-path to find the site ID first."
1445
1654
  },
@@ -1447,6 +1656,7 @@
1447
1656
  "pathPattern": "/sites/{site-id}/lists/{list-id}/columns",
1448
1657
  "method": "get",
1449
1658
  "toolName": "list-sharepoint-list-columns",
1659
+ "presets": ["work"],
1450
1660
  "workScopes": ["Sites.Read.All"],
1451
1661
  "llmTip": "Lists column definitions for a SharePoint list. Returns each column's id, name, displayName, description, type indicator (text, number, choice, dateTime, person, lookup, boolean, calculated, hyperlinkOrPicture, etc.), required, indexed, hidden, readOnly. Use this to discover the schema before creating or updating list items."
1452
1662
  },
@@ -1454,6 +1664,7 @@
1454
1664
  "pathPattern": "/sites/{site-id}/lists/{list-id}/columns",
1455
1665
  "method": "post",
1456
1666
  "toolName": "create-sharepoint-list-column",
1667
+ "presets": ["work"],
1457
1668
  "workScopes": ["Sites.Manage.All"],
1458
1669
  "llmTip": "Creates a new column on a SharePoint list. Body must include name and exactly one column type property: { name: 'Priority', text: {} } or { name: 'DueDate', dateTime: { format: 'dateOnly' } } or { name: 'Status', choice: { choices: ['Open','In Progress','Done'] } }. Other types: number, boolean, currency, hyperlinkOrPicture, personOrGroup, lookup, calculated. Optional: displayName, description, required, indexed, enforceUniqueValues."
1459
1670
  },
@@ -1461,6 +1672,7 @@
1461
1672
  "pathPattern": "/sites/{site-id}/lists/{list-id}/columns/{columnDefinition-id}",
1462
1673
  "method": "get",
1463
1674
  "toolName": "get-sharepoint-list-column",
1675
+ "presets": ["work"],
1464
1676
  "workScopes": ["Sites.Read.All"],
1465
1677
  "llmTip": "Gets a specific column definition by ID, including its full type configuration (choices for choice columns, format for dateTime, etc.). Use list-sharepoint-list-columns first to find the column ID."
1466
1678
  },
@@ -1468,6 +1680,7 @@
1468
1680
  "pathPattern": "/sites/{site-id}/lists/{list-id}/columns/{columnDefinition-id}",
1469
1681
  "method": "patch",
1470
1682
  "toolName": "update-sharepoint-list-column",
1683
+ "presets": ["work"],
1471
1684
  "workScopes": ["Sites.Manage.All"],
1472
1685
  "llmTip": "Updates a column definition. Body: { displayName: 'New name', description: 'New description', required: true, ... }. The column type itself (text, choice, etc.) cannot be changed — only its metadata and per-type options (e.g. choices array for a choice column). Send only the fields you want to change."
1473
1686
  },
@@ -1475,6 +1688,7 @@
1475
1688
  "pathPattern": "/sites/{site-id}/lists/{list-id}/columns/{columnDefinition-id}",
1476
1689
  "method": "delete",
1477
1690
  "toolName": "delete-sharepoint-list-column",
1691
+ "presets": ["work"],
1478
1692
  "workScopes": ["Sites.Manage.All"],
1479
1693
  "llmTip": "Deletes a column from a SharePoint list. This is irreversible — all data stored in this column across every list item is lost. Confirm with the user before calling. Cannot delete built-in columns (Title, Created, Modified, etc.)."
1480
1694
  },
@@ -1482,18 +1696,21 @@
1482
1696
  "pathPattern": "/sites/{site-id}/getByPath(path='{path}')",
1483
1697
  "method": "get",
1484
1698
  "toolName": "get-sharepoint-site-by-path",
1699
+ "presets": ["work"],
1485
1700
  "workScopes": ["Sites.Read.All"]
1486
1701
  },
1487
1702
  {
1488
1703
  "pathPattern": "/sites/delta()",
1489
1704
  "method": "get",
1490
1705
  "toolName": "get-sharepoint-sites-delta",
1706
+ "presets": ["work"],
1491
1707
  "workScopes": ["Sites.Read.All"]
1492
1708
  },
1493
1709
  {
1494
1710
  "pathPattern": "/search/query",
1495
1711
  "method": "post",
1496
1712
  "toolName": "search-query",
1713
+ "presets": ["personal", "search", "work"],
1497
1714
  "workScopes": [
1498
1715
  "Mail.Read",
1499
1716
  "Calendars.Read",
@@ -1508,6 +1725,7 @@
1508
1725
  "pathPattern": "/me/onlineMeetings",
1509
1726
  "method": "get",
1510
1727
  "toolName": "list-online-meetings",
1728
+ "presets": ["teams", "work"],
1511
1729
  "workScopes": ["OnlineMeetings.Read"],
1512
1730
  "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."
1513
1731
  },
@@ -1515,6 +1733,7 @@
1515
1733
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}",
1516
1734
  "method": "get",
1517
1735
  "toolName": "get-online-meeting",
1736
+ "presets": ["teams", "work"],
1518
1737
  "workScopes": ["OnlineMeetings.Read"],
1519
1738
  "llmTip": "Gets a specific online meeting by ID. Returns full details including subject, startDateTime, endDateTime, joinWebUrl, chatInfo (threadId for meeting chat), participants (organizer, attendees), lobbyBypassSettings, and videoTeleconferenceId. Use list-online-meetings first to find the meeting ID."
1520
1739
  },
@@ -1522,6 +1741,7 @@
1522
1741
  "pathPattern": "/me/onlineMeetings",
1523
1742
  "method": "post",
1524
1743
  "toolName": "create-online-meeting",
1744
+ "presets": ["teams", "work"],
1525
1745
  "workScopes": ["OnlineMeetings.ReadWrite"],
1526
1746
  "llmTip": "Creates a new online meeting. Required body: { subject, startDateTime, endDateTime }. Optional: participants (with organizer and attendees), lobbyBypassSettings, isEntryExitAnnounced, allowedPresenters (everyone/organization/roleIsPresenter/organizer). Returns the created meeting with joinWebUrl and meeting ID."
1527
1747
  },
@@ -1529,6 +1749,7 @@
1529
1749
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}",
1530
1750
  "method": "patch",
1531
1751
  "toolName": "update-online-meeting",
1752
+ "presets": ["teams", "work"],
1532
1753
  "workScopes": ["OnlineMeetings.ReadWrite"],
1533
1754
  "llmTip": "Updates an existing online meeting. Updatable properties: subject, startDateTime, endDateTime, participants, lobbyBypassSettings, isEntryExitAnnounced, allowedPresenters. Send only the properties you want to change."
1534
1755
  },
@@ -1536,6 +1757,7 @@
1536
1757
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}",
1537
1758
  "method": "delete",
1538
1759
  "toolName": "delete-online-meeting",
1760
+ "presets": ["teams", "work"],
1539
1761
  "workScopes": ["OnlineMeetings.ReadWrite"],
1540
1762
  "llmTip": "Deletes an online meeting. This cannot be undone. The meeting join link will no longer work after deletion."
1541
1763
  },
@@ -1543,6 +1765,7 @@
1543
1765
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}/transcripts",
1544
1766
  "method": "get",
1545
1767
  "toolName": "list-meeting-transcripts",
1768
+ "presets": ["teams", "work"],
1546
1769
  "workScopes": ["OnlineMeetingTranscript.Read.All"],
1547
1770
  "llmTip": "Lists available transcripts for a meeting. Get the meeting ID first via list-online-meetings."
1548
1771
  },
@@ -1550,6 +1773,7 @@
1550
1773
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}/transcripts/{callTranscript-id}",
1551
1774
  "method": "get",
1552
1775
  "toolName": "get-meeting-transcript",
1776
+ "presets": ["teams", "work"],
1553
1777
  "workScopes": ["OnlineMeetingTranscript.Read.All"],
1554
1778
  "llmTip": "Gets metadata for a specific transcript: createdDateTime, contentCorrelationId (links transcript to its recording), meetingId, meetingOrganizer. Use contentCorrelationId to match a transcript with its recording. For the actual transcript text, use get-meeting-transcript-content instead."
1555
1779
  },
@@ -1557,6 +1781,7 @@
1557
1781
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}/transcripts/{callTranscript-id}/content",
1558
1782
  "method": "get",
1559
1783
  "toolName": "get-meeting-transcript-content",
1784
+ "presets": ["teams", "work"],
1560
1785
  "workScopes": ["OnlineMeetingTranscript.Read.All"],
1561
1786
  "acceptType": "text/vtt",
1562
1787
  "llmTip": "Returns the transcript content in WebVTT format with speaker identification and timestamps."
@@ -1565,6 +1790,7 @@
1565
1790
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}/recordings",
1566
1791
  "method": "get",
1567
1792
  "toolName": "list-meeting-recordings",
1793
+ "presets": ["teams", "work"],
1568
1794
  "workScopes": ["OnlineMeetingRecording.Read.All"],
1569
1795
  "llmTip": "Lists recordings for a meeting. Each recording has createdDateTime, endDateTime, meetingOrganizer, contentCorrelationId (links to corresponding transcript). For recurring meetings, there is one recording per occurrence."
1570
1796
  },
@@ -1572,6 +1798,7 @@
1572
1798
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}/recordings/{callRecording-id}",
1573
1799
  "method": "get",
1574
1800
  "toolName": "get-meeting-recording",
1801
+ "presets": ["teams", "work"],
1575
1802
  "workScopes": ["OnlineMeetingRecording.Read.All"],
1576
1803
  "llmTip": "Gets metadata for a specific recording: createdDateTime, endDateTime, contentCorrelationId (links recording to its transcript), meetingOrganizer, callId. Use contentCorrelationId to match a recording with its transcript. For the actual video file, use get-meeting-recording-content instead."
1577
1804
  },
@@ -1579,6 +1806,7 @@
1579
1806
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}/recordings/{callRecording-id}/content",
1580
1807
  "method": "get",
1581
1808
  "toolName": "get-meeting-recording-content",
1809
+ "presets": ["teams", "work"],
1582
1810
  "workScopes": ["OnlineMeetingRecording.Read.All"],
1583
1811
  "returnDownloadUrl": true,
1584
1812
  "llmTip": "Returns a temporary download URL for the meeting recording in MP4 format. Use the download URL to access the video file. The recording may be large — do not attempt to stream it inline."
@@ -1587,6 +1815,7 @@
1587
1815
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}/attendanceReports",
1588
1816
  "method": "get",
1589
1817
  "toolName": "list-meeting-attendance-reports",
1818
+ "presets": ["teams", "work"],
1590
1819
  "workScopes": ["OnlineMeetingArtifact.Read.All"],
1591
1820
  "llmTip": "Lists attendance reports for a meeting. Each report has meetingStartDateTime, meetingEndDateTime, totalParticipantCount. For recurring meetings, there is one report per occurrence. Get the meeting ID first via list-online-meetings."
1592
1821
  },
@@ -1594,6 +1823,7 @@
1594
1823
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}/attendanceReports/{meetingAttendanceReport-id}",
1595
1824
  "method": "get",
1596
1825
  "toolName": "get-meeting-attendance-report",
1826
+ "presets": ["teams", "work"],
1597
1827
  "workScopes": ["OnlineMeetingArtifact.Read.All"],
1598
1828
  "llmTip": "Gets a specific attendance report with totalParticipantCount, meetingStartDateTime, meetingEndDateTime."
1599
1829
  },
@@ -1601,6 +1831,7 @@
1601
1831
  "pathPattern": "/me/onlineMeetings/{onlineMeeting-id}/attendanceReports/{meetingAttendanceReport-id}/attendanceRecords",
1602
1832
  "method": "get",
1603
1833
  "toolName": "list-meeting-attendance-records",
1834
+ "presets": ["teams", "work"],
1604
1835
  "workScopes": ["OnlineMeetingArtifact.Read.All"],
1605
1836
  "llmTip": "Lists individual attendance records for a meeting report. Each record has: identity (displayName), emailAddress, role (Organizer/Presenter/Attendee), totalAttendanceInSeconds, and attendanceIntervals with joinDateTime/leaveDateTime. Use to determine who attended, how long, and when they joined/left."
1606
1837
  },
@@ -1608,6 +1839,7 @@
1608
1839
  "pathPattern": "/groups/{group-id}/conversations",
1609
1840
  "method": "get",
1610
1841
  "toolName": "list-group-conversations",
1842
+ "presets": ["work"],
1611
1843
  "workScopes": ["Group.Read.All"],
1612
1844
  "llmTip": "Legacy — Microsoft recommends Teams channels instead of group conversations."
1613
1845
  },
@@ -1615,6 +1847,7 @@
1615
1847
  "pathPattern": "/groups/{group-id}/threads",
1616
1848
  "method": "get",
1617
1849
  "toolName": "list-group-threads",
1850
+ "presets": ["work"],
1618
1851
  "workScopes": ["Group.Read.All"],
1619
1852
  "llmTip": "Legacy — Microsoft recommends Teams channels instead of group threads."
1620
1853
  },
@@ -1622,6 +1855,7 @@
1622
1855
  "pathPattern": "/groups/{group-id}/threads/{conversationThread-id}/reply",
1623
1856
  "method": "post",
1624
1857
  "toolName": "reply-to-group-thread",
1858
+ "presets": ["work"],
1625
1859
  "workScopes": ["Group.ReadWrite.All"],
1626
1860
  "llmTip": "Legacy — Microsoft recommends Teams channels instead of group threads."
1627
1861
  },
@@ -1629,6 +1863,7 @@
1629
1863
  "pathPattern": "/me/presence",
1630
1864
  "method": "get",
1631
1865
  "toolName": "get-my-presence",
1866
+ "presets": ["teams", "work"],
1632
1867
  "workScopes": ["Presence.Read"],
1633
1868
  "llmTip": "Gets the current user's presence status. Returns availability (Available, Busy, DoNotDisturb, BeRightBack, Away, Offline) and activity (InACall, InAMeeting, Presenting, OutOfOffice, etc.). Useful to check your own status before scheduling."
1634
1869
  },
@@ -1636,6 +1871,7 @@
1636
1871
  "pathPattern": "/users/{user-id}/presence",
1637
1872
  "method": "get",
1638
1873
  "toolName": "get-user-presence",
1874
+ "presets": ["teams", "work"],
1639
1875
  "workScopes": ["Presence.Read.All"],
1640
1876
  "llmTip": "Gets presence status for a specific user by their user ID or UPN (email). Returns availability and activity. Use list-users to find the user ID first."
1641
1877
  },
@@ -1643,6 +1879,7 @@
1643
1879
  "pathPattern": "/communications/getPresencesByUserId",
1644
1880
  "method": "post",
1645
1881
  "toolName": "get-presences-by-user-id",
1882
+ "presets": ["teams", "work"],
1646
1883
  "workScopes": ["Presence.Read.All"],
1647
1884
  "contentType": "application/json",
1648
1885
  "llmTip": "Gets presence for multiple users in a single call. Body: { ids: ['user-id-1', 'user-id-2', ...] }. Returns array of presence objects. More efficient than calling get-user-presence for each user. Maximum 650 user IDs per request."
@@ -1651,6 +1888,7 @@
1651
1888
  "pathPattern": "/solutions/virtualEvents/webinars/{virtualEventWebinar-id}",
1652
1889
  "method": "get",
1653
1890
  "toolName": "get-virtual-event-webinar",
1891
+ "presets": ["teams", "work"],
1654
1892
  "workScopes": ["VirtualEvent.Read"],
1655
1893
  "llmTip": "Gets a specific webinar with full details: displayName, description, startDateTime, endDateTime, audience, coOrganizers, presenters, registrationConfiguration, and status."
1656
1894
  },
@@ -1658,6 +1896,7 @@
1658
1896
  "pathPattern": "/solutions/virtualEvents/webinars/{virtualEventWebinar-id}/sessions",
1659
1897
  "method": "get",
1660
1898
  "toolName": "list-webinar-sessions",
1899
+ "presets": ["teams", "work"],
1661
1900
  "workScopes": ["VirtualEvent.Read"],
1662
1901
  "llmTip": "Lists sessions for a webinar. Each session has startDateTime, endDateTime, joinWebUrl, subject, and is essentially an online meeting associated with the webinar."
1663
1902
  },
@@ -1665,6 +1904,7 @@
1665
1904
  "pathPattern": "/places/{place-id}/graph.room",
1666
1905
  "method": "get",
1667
1906
  "toolName": "get-room",
1907
+ "presets": ["calendar", "work"],
1668
1908
  "workScopes": ["Place.Read.All"],
1669
1909
  "llmTip": "Gets a place cast as a room, returning room-specific properties: displayName, emailAddress (for booking), capacity, building, floorNumber, floorLabel, isWheelChairAccessible, audioDeviceName, videoDeviceName, displayDeviceName. The place-id can be the room's ID or email address."
1670
1910
  },
@@ -1672,6 +1912,7 @@
1672
1912
  "pathPattern": "/places/{place-id}/graph.roomList",
1673
1913
  "method": "get",
1674
1914
  "toolName": "get-room-list",
1915
+ "presets": ["calendar", "work"],
1675
1916
  "workScopes": ["Place.Read.All"],
1676
1917
  "llmTip": "Gets a place cast as a room list, returning room list properties: displayName, emailAddress, address. Use the place-id (ID or email address) of the room list. Then use list-room-list-rooms to get the rooms within this list."
1677
1918
  },
@@ -1679,6 +1920,7 @@
1679
1920
  "pathPattern": "/places/{place-id}/graph.roomList/rooms",
1680
1921
  "method": "get",
1681
1922
  "toolName": "list-room-list-rooms",
1923
+ "presets": ["calendar", "work"],
1682
1924
  "workScopes": ["Place.Read.All"],
1683
1925
  "llmTip": "Lists rooms belonging to a specific room list. The place-id is the ID or email address of the room list (from get-room-list). Returns rooms with displayName, emailAddress, capacity, building, floorNumber, floorLabel, and AV equipment details. Combine with find-meeting-times to find available rooms for booking."
1684
1926
  },
@@ -1686,6 +1928,7 @@
1686
1928
  "pathPattern": "/places/{place-id}/graph.roomList/rooms/{room-id}",
1687
1929
  "method": "get",
1688
1930
  "toolName": "get-room-list-room",
1931
+ "presets": ["calendar", "work"],
1689
1932
  "workScopes": ["Place.Read.All"],
1690
1933
  "llmTip": "Gets a specific room within a room list. The place-id is the room list ID or email, and room-id is the specific room ID. Returns full room details including capacity, building, floor, and AV equipment."
1691
1934
  },
@@ -1693,6 +1936,7 @@
1693
1936
  "pathPattern": "/places/{place-id}",
1694
1937
  "method": "patch",
1695
1938
  "toolName": "update-place",
1939
+ "presets": ["calendar", "work"],
1696
1940
  "workScopes": ["Place.ReadWrite.All"],
1697
1941
  "llmTip": "Updates properties of a place (room, room list, building, floor, section, desk, workspace). Body can include: displayName, phone, capacity, building, floorNumber, floorLabel, tags, audioDeviceName, videoDeviceName, displayDeviceName, isWheelChairAccessible. Use get-room or get-room-list to verify current values before updating."
1698
1942
  },
@@ -1700,6 +1944,7 @@
1700
1944
  "pathPattern": "/me/insights/trending",
1701
1945
  "method": "get",
1702
1946
  "toolName": "list-trending-insights",
1947
+ "presets": ["personal"],
1703
1948
  "workScopes": ["Sites.Read.All"],
1704
1949
  "llmTip": "Lists documents trending around the current user. Each item has resourceVisualization (title, type, previewImageUrl, containerDisplayName), resourceReference (webUrl, id, type), and weight (relevance score). Use $filter=resourceVisualization/type eq 'PowerPoint' to filter by file type. Use $orderby=weight/value desc to sort by relevance."
1705
1950
  },
@@ -1707,6 +1952,7 @@
1707
1952
  "pathPattern": "/me/events/{event-id}/cancel",
1708
1953
  "method": "post",
1709
1954
  "toolName": "cancel-calendar-event",
1955
+ "presets": ["calendar", "outlook", "personal"],
1710
1956
  "scopes": ["Calendars.ReadWrite"],
1711
1957
  "llmTip": "Cancels a meeting (organizer only) and sends a cancellation message to all attendees. Body: { Comment (optional string, custom message) }. Use this instead of delete-calendar-event when you want attendees to see 'Canceled' in their calendar. Attendees calling this get HTTP 400 — they should use decline-calendar-event instead."
1712
1958
  },
@@ -1714,6 +1960,7 @@
1714
1960
  "pathPattern": "/me/events/{event-id}/forward",
1715
1961
  "method": "post",
1716
1962
  "toolName": "forward-calendar-event",
1963
+ "presets": ["calendar", "outlook", "personal"],
1717
1964
  "scopes": ["Calendars.ReadWrite"],
1718
1965
  "llmTip": "Forwards a meeting invitation to additional recipients. Body: { ToRecipients: [{ emailAddress: { address, name } }], Comment (optional) }. If the forwarder is an attendee (not organizer), the organizer is also notified and the new recipient is added to the organizer's attendee list."
1719
1966
  },
@@ -1721,6 +1968,7 @@
1721
1968
  "pathPattern": "/me/events/{event-id}/snoozeReminder",
1722
1969
  "method": "post",
1723
1970
  "toolName": "snooze-calendar-event-reminder",
1971
+ "presets": ["calendar", "outlook", "personal"],
1724
1972
  "scopes": ["Calendars.ReadWrite"],
1725
1973
  "llmTip": "Postpones a triggered event reminder. Body: { NewReminderTime: { dateTime (ISO 8601), timeZone (IANA or Windows, e.g. 'Pacific Standard Time') } }. The reminder will re-fire at the new time."
1726
1974
  },
@@ -1728,6 +1976,7 @@
1728
1976
  "pathPattern": "/me/events/{event-id}/dismissReminder",
1729
1977
  "method": "post",
1730
1978
  "toolName": "dismiss-calendar-event-reminder",
1979
+ "presets": ["calendar", "outlook", "personal"],
1731
1980
  "scopes": ["Calendars.ReadWrite"],
1732
1981
  "llmTip": "Dismisses a triggered event reminder so it won't re-fire. No request body required. Pair with list-calendar-events or get-schedule to find active reminders."
1733
1982
  },
@@ -1735,6 +1984,7 @@
1735
1984
  "pathPattern": "/me/events/delta()",
1736
1985
  "method": "get",
1737
1986
  "toolName": "list-calendar-events-delta",
1987
+ "presets": ["calendar", "outlook", "personal"],
1738
1988
  "scopes": ["Calendars.Read"],
1739
1989
  "llmTip": "Incremental sync of events across the default calendar. First call returns all events plus @odata.deltaLink. Subsequent calls with that link return only additions/updates/removals. Use $select to limit fields. Deltas expire after ~30 days — start over if the server returns 410 Gone. For a time-bounded view with delta semantics, use list-calendar-view-delta instead."
1740
1990
  },
@@ -1742,6 +1992,7 @@
1742
1992
  "pathPattern": "/me/calendarView/delta()",
1743
1993
  "method": "get",
1744
1994
  "toolName": "list-calendar-view-delta",
1995
+ "presets": ["calendar", "outlook", "personal"],
1745
1996
  "scopes": ["Calendars.Read"],
1746
1997
  "llmTip": "Incremental sync of events within a time window. Required query params on first call: startDateTime, endDateTime (ISO 8601). Returns events in the window plus @odata.deltaLink; subsequent calls with that link return only changes. Expands recurring events to individual occurrences (unlike list-calendar-events-delta which returns the series master). Use this for calendar UIs showing a week/month view."
1747
1998
  },
@@ -1749,6 +2000,7 @@
1749
2000
  "pathPattern": "/groups",
1750
2001
  "method": "post",
1751
2002
  "toolName": "create-group",
2003
+ "presets": ["work"],
1752
2004
  "workScopes": ["Group.ReadWrite.All"],
1753
2005
  "llmTip": "Creates a new group. Required body: { displayName, mailEnabled (bool), mailNickname (no spaces), securityEnabled (bool) }. For Microsoft 365 group: mailEnabled=true, securityEnabled=false, groupTypes=['Unified']. For security group: mailEnabled=false, securityEnabled=true, groupTypes=[]. Optional: description, visibility ('Public' or 'Private'), owners@odata.bind and members@odata.bind arrays with user directoryObject URLs."
1754
2006
  },
@@ -1756,6 +2008,7 @@
1756
2008
  "pathPattern": "/groups/{group-id}",
1757
2009
  "method": "patch",
1758
2010
  "toolName": "update-group",
2011
+ "presets": ["work"],
1759
2012
  "workScopes": ["Group.ReadWrite.All"],
1760
2013
  "llmTip": "Updates group properties. Body can include: displayName, description, visibility ('Public' or 'Private'), mailNickname. Use get-group to verify current values before updating."
1761
2014
  },
@@ -1763,6 +2016,7 @@
1763
2016
  "pathPattern": "/groups/{group-id}",
1764
2017
  "method": "delete",
1765
2018
  "toolName": "delete-group",
2019
+ "presets": ["work"],
1766
2020
  "workScopes": ["Group.ReadWrite.All"],
1767
2021
  "llmTip": "Permanently deletes a group and all its associated resources (conversations, files, calendar, planner). This action is irreversible. Use get-group to verify the group before deleting."
1768
2022
  },
@@ -1770,6 +2024,7 @@
1770
2024
  "pathPattern": "/groups/{group-id}/members/$ref",
1771
2025
  "method": "post",
1772
2026
  "toolName": "add-group-member",
2027
+ "presets": ["work"],
1773
2028
  "workScopes": ["GroupMember.ReadWrite.All"],
1774
2029
  "llmTip": "Adds a member to a group. Body: { '@odata.id': 'https://graph.microsoft.com/v1.0/directoryObjects/{user-id}' }. Use list-users to find the user ID first. The user must not already be a member."
1775
2030
  },
@@ -1777,6 +2032,7 @@
1777
2032
  "pathPattern": "/groups/{group-id}/members/{directoryObject-id}/$ref",
1778
2033
  "method": "delete",
1779
2034
  "toolName": "remove-group-member",
2035
+ "presets": ["work"],
1780
2036
  "workScopes": ["GroupMember.ReadWrite.All"],
1781
2037
  "llmTip": "Removes a member from a group. Use list-group-members to find the member's directory object ID first. Cannot remove the last owner of a group."
1782
2038
  },
@@ -1784,6 +2040,7 @@
1784
2040
  "pathPattern": "/groups/{group-id}/owners/$ref",
1785
2041
  "method": "post",
1786
2042
  "toolName": "add-group-owner",
2043
+ "presets": ["work"],
1787
2044
  "workScopes": ["Group.ReadWrite.All"],
1788
2045
  "llmTip": "Adds an owner to a group. Body: { '@odata.id': 'https://graph.microsoft.com/v1.0/users/{user-id}' }. Use list-users to find the user ID. A group can have a maximum of 100 owners."
1789
2046
  },
@@ -1791,6 +2048,7 @@
1791
2048
  "pathPattern": "/groups/{group-id}/owners/{directoryObject-id}/$ref",
1792
2049
  "method": "delete",
1793
2050
  "toolName": "remove-group-owner",
2051
+ "presets": ["work"],
1794
2052
  "workScopes": ["Group.ReadWrite.All"],
1795
2053
  "llmTip": "Removes an owner from a group. A group must have at least one owner — this call fails if you try to remove the last owner. Use list-group-owners to find the owner's ID."
1796
2054
  },
@@ -1798,6 +2056,7 @@
1798
2056
  "pathPattern": "/chats",
1799
2057
  "method": "post",
1800
2058
  "toolName": "create-chat",
2059
+ "presets": ["teams", "work"],
1801
2060
  "workScopes": ["Chat.Create", "Chat.ReadWrite"],
1802
2061
  "llmTip": "Creates a new 1:1 or group Teams chat. Body: { chatType ('oneOnOne' or 'group'), topic (optional, group only), members: [{ '@odata.type': '#microsoft.graph.aadUserConversationMember', roles: ['owner' | 'guest'], 'user@odata.bind': 'https://graph.microsoft.com/v1.0/users({id})' }] }. A oneOnOne chat requires exactly 2 members (self + other), both with role 'owner'. For group chats, include all participants. The signed-in user must be one of the members. Returns the created chat with its id — use that id with send-chat-message, list-chat-members, etc."
1803
2062
  },
@@ -1847,6 +2106,7 @@
1847
2106
  "pathPattern": "/drives/{drive-id}/items/{driveItem-id}/extractSensitivityLabels",
1848
2107
  "method": "post",
1849
2108
  "toolName": "extract-drive-item-sensitivity-labels",
2109
+ "presets": ["files", "onedrive", "personal"],
1850
2110
  "workScopes": ["Files.Read.All"],
1851
2111
  "llmTip": "Returns the Microsoft Information Protection (MIP) sensitivity labels assigned to a file. No request body. Response: { value: { labels: [{ sensitivityLabelId, assignmentMethod, tenantId }] } }. Use list-sensitivity-labels to map sensitivityLabelId to a human-readable name. Not supported for personal Microsoft accounts. May return 423 Locked if the file is double-key-encrypted or decryption is deferred."
1852
2112
  },
@@ -1854,6 +2114,7 @@
1854
2114
  "pathPattern": "/me/dataSecurityAndGovernance/sensitivityLabels",
1855
2115
  "method": "get",
1856
2116
  "toolName": "list-sensitivity-labels",
2117
+ "presets": ["files", "personal"],
1857
2118
  "workScopes": ["SensitivityLabel.Read"],
1858
2119
  "llmTip": "Lists Microsoft Information Protection (MIP) sensitivity labels available to the signed-in user. Use to map label IDs (returned by extract-drive-item-sensitivity-labels) to human-readable names. Not supported for personal Microsoft accounts."
1859
2120
  },
@@ -1861,6 +2122,7 @@
1861
2122
  "pathPattern": "/me/dataSecurityAndGovernance/sensitivityLabels/{sensitivityLabel-id}",
1862
2123
  "method": "get",
1863
2124
  "toolName": "get-sensitivity-label",
2125
+ "presets": ["files", "personal"],
1864
2126
  "workScopes": ["SensitivityLabel.Read"],
1865
2127
  "llmTip": "Gets a single MIP sensitivity label by id. Use list-sensitivity-labels to find ids. Not supported for personal Microsoft accounts."
1866
2128
  },
@@ -1868,6 +2130,7 @@
1868
2130
  "pathPattern": "/me/messages/{message-id}/copy",
1869
2131
  "method": "post",
1870
2132
  "toolName": "copy-mail-message",
2133
+ "presets": ["mail", "outlook", "personal"],
1871
2134
  "scopes": ["Mail.ReadWrite"],
1872
2135
  "llmTip": "Copies a message to another mail folder. Body: { DestinationId: '<mailFolder-id or well-known name like inbox, archive, junkemail>' }. Returns the newly created message (with a new id) in the destination folder. For moving instead of copying, use move-mail-message."
1873
2136
  },
@@ -1875,6 +2138,7 @@
1875
2138
  "pathPattern": "/me/mailFolders/{mailFolder-id}/messages/delta()",
1876
2139
  "method": "get",
1877
2140
  "toolName": "list-mail-folder-messages-delta",
2141
+ "presets": ["mail", "outlook", "personal"],
1878
2142
  "scopes": ["Mail.Read"],
1879
2143
  "llmTip": "Incremental sync of messages within a mail folder. Graph only supports delta scoped to a folder — use mailFolder-id = 'inbox' for the well-known inbox, or another folder id from list-mail-folders. First call returns all messages plus @odata.deltaLink; subsequent calls with that link return only changes (created/updated/deleted). @odata.nextLink paginates within a single delta window. Deltas expire after ~30 days of inactivity — start over if the server returns 410. Prefer this over full re-list for polling."
1880
2144
  },
@@ -1882,6 +2146,7 @@
1882
2146
  "pathPattern": "/me/outlook/masterCategories",
1883
2147
  "method": "get",
1884
2148
  "toolName": "list-outlook-categories",
2149
+ "presets": ["calendar", "mail", "outlook", "personal"],
1885
2150
  "scopes": ["MailboxSettings.Read"],
1886
2151
  "llmTip": "Lists the user's Outlook categories (colored labels) used to tag messages, events, contacts, and tasks. Each category has displayName and color (preset0 through preset24, or 'none'). Use this to show available tags before applying via update-mail-message or update-calendar-event with body { categories: ['Category Name'] }."
1887
2152
  },
@@ -1889,6 +2154,7 @@
1889
2154
  "pathPattern": "/me/outlook/masterCategories",
1890
2155
  "method": "post",
1891
2156
  "toolName": "create-outlook-category",
2157
+ "presets": ["calendar", "mail", "outlook", "personal"],
1892
2158
  "scopes": ["MailboxSettings.ReadWrite"],
1893
2159
  "llmTip": "Creates a new Outlook category. Body: { displayName (unique), color (one of: none, preset0 … preset24 — maps to red, orange, yellow, green, teal, olive, blue, purple, cranberry, steel, dark-steel, gray, dark-gray, black, dark-red, dark-orange, dark-yellow, dark-green, dark-teal, dark-olive, dark-blue, dark-purple, dark-cranberry) }. Category names are case-sensitive when applied to messages/events."
1894
2160
  },
@@ -1896,6 +2162,7 @@
1896
2162
  "pathPattern": "/me/getMailTips",
1897
2163
  "method": "post",
1898
2164
  "toolName": "get-mail-tips",
2165
+ "presets": ["mail", "outlook", "personal"],
1899
2166
  "scopes": ["Mail.Read"],
1900
2167
  "contentType": "application/json",
1901
2168
  "llmTip": "Looks up MailTips for one or more recipients before sending an email — answers 'is this person on auto-reply / OOF?', 'will my email exceed their mailbox quota?', 'are they an external recipient?', 'is this a mailbox or distribution list?'. Body: { EmailAddresses: ['user@contoso.com', ...], MailTipsOptions: 'automaticReplies, mailboxFullStatus, customMailTip, externalMemberCount, totalMemberCount, maxMessageSize, deliveryRestriction, moderationStatus, recipientScope, recipientSuggestions' (comma-separated subset) }. Returns mailTips per recipient with the requested fields populated. Use this to short-circuit urgent emails when a recipient is OOF, or to warn before fanning out to a large DL."
@@ -1904,6 +2171,7 @@
1904
2171
  "pathPattern": "/me/outlook/supportedTimeZones(TimeZoneStandard='{TimeZoneStandard}')",
1905
2172
  "method": "get",
1906
2173
  "toolName": "list-supported-time-zones",
2174
+ "presets": ["calendar", "mail", "outlook", "personal"],
1907
2175
  "scopes": ["User.Read"],
1908
2176
  "llmTip": "Lists time zones the user's mailbox server supports. TimeZoneStandard path parameter must be one of: Windows (default — Windows time zone names like 'Pacific Standard Time'), or Iana (IANA / Olson names like 'America/Los_Angeles'). Note the PascalCase — the values are case-sensitive enums, not lowercase strings. Returns timeZoneInformation objects with alias and displayName. Use the result to validate or look up the value before calling update-mailbox-settings to change the user's preferred timeZone — the format must match what the server expects."
1909
2177
  },
@@ -1911,6 +2179,7 @@
1911
2179
  "pathPattern": "/me/outlook/supportedLanguages()",
1912
2180
  "method": "get",
1913
2181
  "toolName": "list-supported-languages",
2182
+ "presets": ["calendar", "mail", "outlook", "personal"],
1914
2183
  "scopes": ["User.Read"],
1915
2184
  "llmTip": "Lists locales and languages the user's mailbox server supports for the Outlook UI and message rendering. Returns localeInfo objects with locale (e.g. 'en-US') and displayName ('English (United States)'). Use this to validate the locale value before calling update-mailbox-settings to change the user's preferred language."
1916
2185
  },
@@ -1918,6 +2187,7 @@
1918
2187
  "pathPattern": "/me/calendar/calendarPermissions",
1919
2188
  "method": "get",
1920
2189
  "toolName": "list-my-calendar-permissions",
2190
+ "presets": ["calendar", "outlook", "personal"],
1921
2191
  "scopes": ["Calendars.Read"],
1922
2192
  "llmTip": "Lists share recipients and delegates on the user's primary calendar. Returns calendarPermission objects with id, role ('none' | 'freeBusyRead' | 'limitedRead' | 'read' | 'write' | 'delegateWithoutPrivateEventAccess' | 'delegateWithPrivateEventAccess' | 'custom'), emailAddress { name, address }, isInsideOrganization, isRemovable, allowedRoles. Returns an empty collection when called by a delegate or share recipient (only the calendar owner sees the full list). For a non-primary calendar, use /me/calendars/{calendar-id}/calendarPermissions — not currently exposed."
1923
2193
  },
@@ -1925,6 +2195,7 @@
1925
2195
  "pathPattern": "/me/calendar/calendarPermissions",
1926
2196
  "method": "post",
1927
2197
  "toolName": "create-my-calendar-permission",
2198
+ "presets": ["calendar", "outlook", "personal"],
1928
2199
  "scopes": ["Calendars.ReadWrite"],
1929
2200
  "llmTip": "Shares the user's primary calendar with another user (or sets up a delegate). Body: { emailAddress: { name: 'Adele Vance', address: 'adele@contoso.com' }, role: 'read' | 'write' | 'delegateWithoutPrivateEventAccess' | 'delegateWithPrivateEventAccess', isInsideOrganization: true, isRemovable: true }. Use list-users to resolve the recipient SMTP. Returns the created calendarPermission with its id (used by update-my-calendar-permission and delete-my-calendar-permission)."
1930
2201
  },
@@ -1932,6 +2203,7 @@
1932
2203
  "pathPattern": "/me/calendar/calendarPermissions/{calendarPermission-id}",
1933
2204
  "method": "patch",
1934
2205
  "toolName": "update-my-calendar-permission",
2206
+ "presets": ["calendar", "outlook", "personal"],
1935
2207
  "scopes": ["Calendars.ReadWrite"],
1936
2208
  "llmTip": "Changes the role (permission level) granted to an existing share recipient or delegate. Body: { role: 'read' | 'write' | 'delegateWithoutPrivateEventAccess' | 'delegateWithPrivateEventAccess' }. Only the role property is writable — to change the recipient's email or other properties, delete and recreate via delete-my-calendar-permission + create-my-calendar-permission. Get the permission id via list-my-calendar-permissions."
1937
2209
  },
@@ -1939,6 +2211,7 @@
1939
2211
  "pathPattern": "/me/calendar/calendarPermissions/{calendarPermission-id}",
1940
2212
  "method": "delete",
1941
2213
  "toolName": "delete-my-calendar-permission",
2214
+ "presets": ["calendar", "outlook", "personal"],
1942
2215
  "scopes": ["Calendars.ReadWrite"],
1943
2216
  "llmTip": "Revokes a calendar share or delegate access. Get the permission id via list-my-calendar-permissions. Permissions where isRemovable=false (e.g. the implicit 'My Organization' default) cannot be deleted — Graph returns an error."
1944
2217
  },
@@ -1946,6 +2219,7 @@
1946
2219
  "pathPattern": "/me/contactFolders/{contactFolder-id}/childFolders",
1947
2220
  "method": "get",
1948
2221
  "toolName": "list-contact-folder-child-folders",
2222
+ "presets": ["contacts", "outlook", "personal"],
1949
2223
  "scopes": ["Contacts.Read"],
1950
2224
  "llmTip": "Lists immediate sub-folders under a given contact folder. Returns id, displayName, parentFolderId. Use list-contact-folders to discover top-level folders, then this tool to traverse one level deeper. Supports $filter, $top, $orderby. Note: contact folders are typically a flat list in Outlook clients, but Graph allows nesting via this endpoint."
1951
2225
  },
@@ -1953,6 +2227,7 @@
1953
2227
  "pathPattern": "/me/contactFolders/{contactFolder-id}/childFolders",
1954
2228
  "method": "post",
1955
2229
  "toolName": "create-contact-child-folder",
2230
+ "presets": ["contacts", "outlook", "personal"],
1956
2231
  "scopes": ["Contacts.ReadWrite"],
1957
2232
  "llmTip": "Creates a sub-folder under an existing contact folder. Body: { displayName: 'Sub-folder name' }. Use list-contact-folders to discover the parent id. The returned contactFolder has its own id usable with update-contact-folder, delete-contact-folder, list-contact-folder-contacts, and create-contact-in-folder — contactFolder ids are mailbox-unique regardless of nesting depth."
1958
2233
  },
@@ -1960,6 +2235,7 @@
1960
2235
  "pathPattern": "/me/contactFolders",
1961
2236
  "method": "get",
1962
2237
  "toolName": "list-contact-folders",
2238
+ "presets": ["contacts", "outlook", "personal"],
1963
2239
  "scopes": ["Contacts.Read"],
1964
2240
  "llmTip": "Lists the user's Outlook contact folders (the named buckets that organize contacts). Always includes the built-in 'Contacts' folder; user-created folders also appear. Returns id, displayName, and parentFolderId. To identify the default folder, match displayName === 'Contacts'. Use this before list-contact-folder-contacts or create-contact-in-folder to discover folder ids. Supports OData query parameters."
1965
2241
  },
@@ -1967,6 +2243,7 @@
1967
2243
  "pathPattern": "/me/contactFolders",
1968
2244
  "method": "post",
1969
2245
  "toolName": "create-contact-folder",
2246
+ "presets": ["contacts", "outlook", "personal"],
1970
2247
  "scopes": ["Contacts.ReadWrite"],
1971
2248
  "llmTip": "Creates a new contact folder under the user's mailbox root. Body: { displayName: 'Family' }. Returns the created contactFolder with its id. To create a sub-folder under an existing folder, use create-contact-child-folder."
1972
2249
  },
@@ -1974,6 +2251,7 @@
1974
2251
  "pathPattern": "/me/contactFolders/{contactFolder-id}",
1975
2252
  "method": "patch",
1976
2253
  "toolName": "update-contact-folder",
2254
+ "presets": ["contacts", "outlook", "personal"],
1977
2255
  "scopes": ["Contacts.ReadWrite"],
1978
2256
  "llmTip": "Updates a contact folder. Body: { displayName?: 'New name', parentFolderId?: '<id>' } — both displayName (rename) and parentFolderId (move) are writable. The default 'Contacts' folder may not be renameable. Get the folder id via list-contact-folders."
1979
2257
  },
@@ -1981,6 +2259,7 @@
1981
2259
  "pathPattern": "/me/contactFolders/{contactFolder-id}",
1982
2260
  "method": "delete",
1983
2261
  "toolName": "delete-contact-folder",
2262
+ "presets": ["contacts", "outlook", "personal"],
1984
2263
  "scopes": ["Contacts.ReadWrite"],
1985
2264
  "llmTip": "Deletes a contact folder. The default 'Contacts' folder cannot be deleted — Graph returns an error. The folder (and its contents) typically lands in Deleted Items rather than being permanently removed. Get the folder id via list-contact-folders."
1986
2265
  },
@@ -1988,6 +2267,7 @@
1988
2267
  "pathPattern": "/me/contactFolders/{contactFolder-id}/contacts",
1989
2268
  "method": "get",
1990
2269
  "toolName": "list-contact-folder-contacts",
2270
+ "presets": ["contacts", "outlook", "personal"],
1991
2271
  "scopes": ["Contacts.Read"],
1992
2272
  "llmTip": "Lists contacts inside a specific folder. Pair with list-contact-folders to discover the folder id. Note: the existing list-outlook-contacts (GET /me/contacts) only returns contacts from the default folder — use this tool to read contacts from any folder. Supports $filter, $search='query', $orderby, $top, $select."
1993
2273
  },
@@ -1995,6 +2275,7 @@
1995
2275
  "pathPattern": "/me/contactFolders/{contactFolder-id}/contacts",
1996
2276
  "method": "post",
1997
2277
  "toolName": "create-contact-in-folder",
2278
+ "presets": ["contacts", "outlook", "personal"],
1998
2279
  "scopes": ["Contacts.ReadWrite"],
1999
2280
  "llmTip": "Creates a contact inside a specific folder (instead of the default Contacts folder). Body is a contact resource: { givenName, surname, displayName, emailAddresses: [{ address, name }], businessPhones: [], mobilePhone, jobTitle, companyName, ... }. The existing create-outlook-contact (POST /me/contacts) writes to the default folder only; use this when organizing contacts into named folders. Get the folder id via list-contact-folders."
2000
2281
  },
@@ -2002,6 +2283,7 @@
2002
2283
  "pathPattern": "/me/photo/$value",
2003
2284
  "method": "put",
2004
2285
  "toolName": "upload-my-profile-photo",
2286
+ "presets": ["personal"],
2005
2287
  "scopes": ["User.ReadWrite"],
2006
2288
  "contentType": "image/jpeg",
2007
2289
  "llmTip": "Uploads a new profile photo for the signed-in user. Body is a base64-encoded string of the image bytes (the server decodes before PUT). Photo must be JPEG, max 4 MB. Microsoft 365 generates HD downsized variants automatically (48x48, 64x64, 96x96, 120x120, 240x240, 360x360, 432x432, 504x504, 648x648). For work or school accounts, ProfilePhoto.ReadWrite.All is the more granular alternative permission. Use download-bytes with target=/me/photo/$value to retrieve the current photo."
@@ -2010,6 +2292,7 @@
2010
2292
  "pathPattern": "/me/todo/lists",
2011
2293
  "method": "post",
2012
2294
  "toolName": "create-todo-task-list",
2295
+ "presets": ["personal", "tasks"],
2013
2296
  "scopes": ["Tasks.ReadWrite"],
2014
2297
  "llmTip": "Creates a new Microsoft To Do task list (the named buckets shown in the To Do app sidebar). Body: { displayName: 'My new list' }. Returns the created todoTaskList with its id, displayName, isOwner, isShared, and wellknownListName ('none' for user-created lists). The built-in lists ('Tasks', 'Flagged emails') already exist and cannot be re-created. Pair with create-todo-task to populate it."
2015
2298
  },
@@ -2017,6 +2300,7 @@
2017
2300
  "pathPattern": "/me/todo/lists/{todoTaskList-id}",
2018
2301
  "method": "patch",
2019
2302
  "toolName": "update-todo-task-list",
2303
+ "presets": ["personal", "tasks"],
2020
2304
  "scopes": ["Tasks.ReadWrite"],
2021
2305
  "llmTip": "Renames a Microsoft To Do task list. Body: { displayName: 'New name' }. Only displayName is writable. Built-in lists (Flagged emails, the default Tasks list) cannot be renamed — the API returns an error. Get list ids via list-todo-task-lists."
2022
2306
  },
@@ -2024,6 +2308,7 @@
2024
2308
  "pathPattern": "/me/todo/lists/{todoTaskList-id}",
2025
2309
  "method": "delete",
2026
2310
  "toolName": "delete-todo-task-list",
2311
+ "presets": ["personal", "tasks"],
2027
2312
  "scopes": ["Tasks.ReadWrite"],
2028
2313
  "llmTip": "Deletes a Microsoft To Do task list. Built-in lists (Flagged emails, the default Tasks list) cannot be deleted — the API returns an error for those. Get list ids via list-todo-task-lists."
2029
2314
  },
@@ -2031,6 +2316,7 @@
2031
2316
  "pathPattern": "/me/onenote/pages",
2032
2317
  "method": "get",
2033
2318
  "toolName": "list-onenote-pages",
2319
+ "presets": ["onenote", "personal"],
2034
2320
  "scopes": ["Notes.Read"],
2035
2321
  "llmTip": "Lists all OneNote pages across every notebook and section the user has access to — transverse alternative to walking notebooks → sections → pages. Default returns top 20 ordered by lastModifiedTime desc. Supports $filter (e.g. lastModifiedTime gt 2026-01-01, or contains(tolower(title), 'topic') for title search), $top (max 100), $select, and $expand=parentNotebook,parentSection. Use this instead of bouncing through list-onenote-notebooks / list-all-onenote-sections / list-onenote-section-pages when you have a topic in mind."
2036
2322
  },
@@ -2038,6 +2324,7 @@
2038
2324
  "pathPattern": "/me/onenote/sectionGroups",
2039
2325
  "method": "get",
2040
2326
  "toolName": "list-onenote-section-groups",
2327
+ "presets": ["onenote", "personal"],
2041
2328
  "scopes": ["Notes.Read"],
2042
2329
  "llmTip": "Lists all OneNote section groups (subfolders inside notebooks that contain their own sections and nested section groups) for the user. A section group is a folder-like container — many notebooks use them to organize sections by theme. Default sort is name asc. Supports $expand=sections,sectionGroups,parentNotebook,parentSectionGroup to traverse the full hierarchy. Pair with list-onenote-notebooks for a complete picture of the user's notebook structure."
2043
2330
  },
@@ -2045,6 +2332,7 @@
2045
2332
  "pathPattern": "/me/onenote/notebooks/getNotebookFromWebUrl",
2046
2333
  "method": "post",
2047
2334
  "toolName": "get-onenote-notebook-from-web-url",
2335
+ "presets": ["onenote", "personal"],
2048
2336
  "workScopes": ["Notes.Read"],
2049
2337
  "contentType": "application/json",
2050
2338
  "llmTip": "Resolves a OneNote notebook from its web URL (the link a user copies from OneNote / SharePoint / Teams). Body: { webUrl: 'https://...' }. Returns a notebook object with id, displayName, sectionsUrl, sectionGroupsUrl, and isShared — you can then list its sections via list-onenote-notebook-sections. Accepts user notebooks, group notebooks, and SharePoint-hosted team notebooks. Personal Microsoft accounts are not supported."
@@ -2053,6 +2341,7 @@
2053
2341
  "pathPattern": "/me/presence/setPresence",
2054
2342
  "method": "post",
2055
2343
  "toolName": "set-my-presence",
2344
+ "presets": ["teams", "work"],
2056
2345
  "workScopes": ["Presence.ReadWrite"],
2057
2346
  "contentType": "application/json",
2058
2347
  "llmTip": "Sets the user's presence session as an application. Body: { sessionId (your app's client/session id, required), availability + activity (must be one of these documented combos: Available/Available, Busy/InACall, Busy/InAConferenceCall, Away/Away, DoNotDisturb/Presenting), expirationDuration (ISO 8601 duration like 'PT1H' — defaults to PT5M, valid range PT5M–PT4H) }. Note: if the user also wants to override their *visible* status regardless of activity, prefer set-my-user-preferred-presence. clear-my-presence ends the session."
@@ -2061,6 +2350,7 @@
2061
2350
  "pathPattern": "/me/presence/clearPresence",
2062
2351
  "method": "post",
2063
2352
  "toolName": "clear-my-presence",
2353
+ "presets": ["teams", "work"],
2064
2354
  "workScopes": ["Presence.ReadWrite"],
2065
2355
  "contentType": "application/json",
2066
2356
  "llmTip": "Ends the application's presence session for the current user. Body: { sessionId } — must match the sessionId used in set-my-presence. If this was the user's only presence session, their status returns to Offline."
@@ -2069,6 +2359,7 @@
2069
2359
  "pathPattern": "/me/presence/setUserPreferredPresence",
2070
2360
  "method": "post",
2071
2361
  "toolName": "set-my-user-preferred-presence",
2362
+ "presets": ["teams", "work"],
2072
2363
  "workScopes": ["Presence.ReadWrite"],
2073
2364
  "contentType": "application/json",
2074
2365
  "llmTip": "Sets the user's preferred (sticky) availability and activity — the value Teams clients display regardless of underlying activity. Body: { availability + activity (must be one of these documented combos: Available/Available, Busy/Busy, DoNotDisturb/DoNotDisturb, BeRightBack/BeRightBack, Away/Away, Offline/OffWork), expirationDuration (ISO 8601 duration like 'PT2H' — if omitted, defaults to 1 day for DoNotDisturb/Busy and 7 days for other availability values; not 'indefinite'). Requires at least one active presence session (Teams client signed in or set-my-presence call) — otherwise the user appears Offline. Use this for 'put me in Do Not Disturb for 2 hours' workflows. clear-my-user-preferred-presence reverts to actual presence."
@@ -2077,6 +2368,7 @@
2077
2368
  "pathPattern": "/me/presence/clearUserPreferredPresence",
2078
2369
  "method": "post",
2079
2370
  "toolName": "clear-my-user-preferred-presence",
2371
+ "presets": ["teams", "work"],
2080
2372
  "workScopes": ["Presence.ReadWrite"],
2081
2373
  "contentType": "application/json",
2082
2374
  "llmTip": "Clears any preferred (sticky) presence override set via set-my-user-preferred-presence. The user's visible status returns to their actual activity. Body: {} (an empty JSON object — required, not 'no body')."
@@ -2085,6 +2377,7 @@
2085
2377
  "pathPattern": "/me/presence/setStatusMessage",
2086
2378
  "method": "post",
2087
2379
  "toolName": "set-my-status-message",
2380
+ "presets": ["teams", "work"],
2088
2381
  "workScopes": ["Presence.ReadWrite"],
2089
2382
  "contentType": "application/json",
2090
2383
  "llmTip": "Sets the user's Teams status message (the free-text note shown next to their name, e.g. 'Heads-down on Q3 plan'). Body: { statusMessage: { message: { content: 'text or HTML', contentType: 'text' | 'html' }, expiryDateTime: { dateTime: '2026-05-06T17:00:00', timeZone: 'UTC' } (optional) } }. Pass an empty object {} or message.content='' to clear. expiryDateTime is optional — omit for no expiration."
@@ -2093,6 +2386,7 @@
2093
2386
  "pathPattern": "/me/teamwork/associatedTeams",
2094
2387
  "method": "get",
2095
2388
  "toolName": "list-my-associated-teams",
2389
+ "presets": ["teams", "work"],
2096
2390
  "workScopes": ["Team.ReadBasic.All"],
2097
2391
  "llmTip": "Lists Teams the current user is associated with — both joined teams and host teams of shared channels the user is a direct member of. Returns associatedTeamInfo objects with id, displayName, and tenantId. Broader than list-joined-teams because it includes shared-channel host teams."
2098
2392
  },
@@ -2100,6 +2394,7 @@
2100
2394
  "pathPattern": "/me/teamwork/installedApps",
2101
2395
  "method": "get",
2102
2396
  "toolName": "list-my-installed-teams-apps",
2397
+ "presets": ["teams", "work"],
2103
2398
  "workScopes": ["TeamsAppInstallation.ReadForUser"],
2104
2399
  "llmTip": "Lists Teams apps installed in the current user's personal scope (the apps pinned to the user's Teams sidebar / accessible without joining a team or chat). Use $expand=teamsApp,teamsAppDefinition for full app metadata (displayName, version, distributionMethod). Useful before send-my-activity-notification to discover the user's own teamsAppId."
2105
2400
  },
@@ -2107,6 +2402,7 @@
2107
2402
  "pathPattern": "/me/teamwork/sendActivityNotification",
2108
2403
  "method": "post",
2109
2404
  "toolName": "send-my-activity-notification",
2405
+ "presets": ["teams", "work"],
2110
2406
  "workScopes": ["TeamsActivity.Send"],
2111
2407
  "contentType": "application/json",
2112
2408
  "llmTip": "Sends a Teams activity feed notification to the current user (the badge + entry in their Activity tab). Body: { topic: { source: 'entityUrl' | 'text', value: <Graph URL or plain text>, webUrl: <required when source='text', click-through URL> }, activityType: <must be declared in the calling Teams app's manifest, OR the reserved 'systemDefault' which provides free-form Actor+Reason text>, previewText: { content: 'short preview' }, templateParameters?: [{ name, value }] (substituted into the manifest's localized notification template), teamsAppId?: <optional disambiguator when multiple installed apps share a Microsoft Entra app ID — fetch via list-my-installed-teams-apps>, chainId?, iconId? }. Use to ping the user with 'action required' notifications from agentic workflows. See https://learn.microsoft.com/graph/teams-send-activityfeednotifications."