@softeria/ms-365-mcp-server 0.139.0 → 0.139.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -55,10 +55,22 @@ export function createAndSaveSimplifiedOpenAPI(
55
55
  description: `Path parameter: ${paramName}`,
56
56
  schema: { type: 'string' },
57
57
  }));
58
+ // The fallback used to be the llmTip, then the tool name itself, which reached the
59
+ // model as the whole description ("update-sharepoint-site-onenote-page-content
60
+ // (synthesized)"). Prefer a real sentence built from the same name.
61
+ //
62
+ // The synthesized sentence goes ahead of the llmTip on purpose: graph-tools appends
63
+ // the llmTip to the description at registration, so using it here too shipped it
64
+ // twice in the same tool description. The llmTip stays as the fallback for the tool
65
+ // names with no verb to synthesize from (graph-batch).
66
+ const synthesizedDescription =
67
+ synthesizeDescriptionFromToolName(endpoint.toolName) ||
68
+ endpoint.llmTip ||
69
+ `${endpoint.toolName} (synthesized)`;
58
70
  pathSpec[methodLower] = {
59
71
  tags: ['drives.driveItem'],
60
- summary: endpoint.llmTip || `${endpoint.toolName} (synthesized)`,
61
- description: endpoint.llmTip || `${endpoint.toolName} (synthesized)`,
72
+ summary: synthesizedDescription,
73
+ description: synthesizedDescription,
62
74
  operationId: endpoint.toolName,
63
75
  parameters: synthesizedParameters,
64
76
  requestBody:
@@ -126,6 +138,7 @@ export function createAndSaveSimplifiedOpenAPI(
126
138
  if (!operation.description && operation.summary) {
127
139
  operation.description = operation.summary;
128
140
  }
141
+ operation.description = replaceNavPropertyStub(operation.description, eo.toolName);
129
142
  if (operation.parameters) {
130
143
  operation.parameters = operation.parameters.map((param) => {
131
144
  if (param.$ref && param.$ref.startsWith('#/components/parameters/')) {
@@ -166,6 +179,147 @@ export function createAndSaveSimplifiedOpenAPI(
166
179
  fs.writeFileSync(openapiTrimmedFile, yaml.dump(openApiSpec));
167
180
  }
168
181
 
182
+ // Microsoft's spec is generated from CSDL, so operations that are plain CRUD over a
183
+ // navigation property never get prose. They get scaffolding naming the property and its
184
+ // parent instead - "Create new navigation property to messages for users" - which
185
+ // describes neither the operation nor the resource it acts on. Actions and functions get
186
+ // the same treatment in a different shape ("Invoke action setReaction"). That string is
187
+ // what the model sees as the tool description.
188
+ //
189
+ // Only these prose-free shapes are replaced, and each is anchored at both ends so a stub
190
+ // prefix followed by real text is never swallowed. Descriptions carrying real prose are
191
+ // left alone, including the ones that describe the property rather than the operation
192
+ // ("The messages in a mailbox or folder. Read-only. Nullable."): those are the wrong
193
+ // subject but often carry detail worth keeping, and descriptionOverride is the right tool
194
+ // when they aren't.
195
+ const NAV_PROPERTY_STUB =
196
+ /^(?:Create new navigation property(?: to \S+)?(?: for \S+)?|Update the navigation property \S+ in \S+|Delete navigation property \S+ for \S+|Get \S+ from \S+|Invoke (?:action|function) \S+)\.?$/i;
197
+
198
+ // Leading tool-name tokens that read as verbs. The tool name is a better source than the
199
+ // HTTP method: sort-excel-range is a PATCH, and "Update" would lose the point of it.
200
+ // Listed explicitly rather than inferred: an unknown leading token means we leave
201
+ // Microsoft's text alone, which is the safe direction. `copilot` and `graph` are the only
202
+ // tool-name leads that aren't verbs, and both fall out of this map on purpose.
203
+ const TOOL_NAME_VERBS = {
204
+ accept: 'Accept',
205
+ add: 'Add',
206
+ cancel: 'Cancel',
207
+ clear: 'Clear',
208
+ copy: 'Copy',
209
+ create: 'Create',
210
+ decline: 'Decline',
211
+ delete: 'Delete',
212
+ dismiss: 'Dismiss',
213
+ extract: 'Extract',
214
+ find: 'Find',
215
+ format: 'Format',
216
+ forward: 'Forward',
217
+ get: 'Get',
218
+ insert: 'Insert',
219
+ list: 'List',
220
+ merge: 'Merge',
221
+ move: 'Move',
222
+ pin: 'Pin',
223
+ reauthorize: 'Reauthorize',
224
+ remove: 'Remove',
225
+ rename: 'Rename',
226
+ reply: 'Reply to',
227
+ search: 'Search',
228
+ send: 'Send',
229
+ set: 'Set',
230
+ share: 'Share',
231
+ snooze: 'Snooze',
232
+ sort: 'Sort',
233
+ unmerge: 'Unmerge',
234
+ unpin: 'Unpin',
235
+ unset: 'Unset',
236
+ update: 'Update',
237
+ upload: 'Upload',
238
+ };
239
+
240
+ // Multi-word verbs, matched before the single-token map. Chaining tokens generically
241
+ // would read "Tentatively or accept" for tentatively-accept-event.
242
+ //
243
+ // reply-all has to live here rather than fall through: "all" reads as a possessive lead
244
+ // (see POSSESSIVE_LEADS), so reply-all-mail-message would render "Reply to all mail
245
+ // message" - which says reply to every message in the mailbox, the opposite of what the
246
+ // tool does.
247
+ const COMPOUND_VERBS = {
248
+ 'move-rename': 'Move or rename',
249
+ 'reply-all': 'Reply to all recipients of',
250
+ 'tentatively-accept': 'Tentatively accept',
251
+ };
252
+
253
+ const PRODUCT_NAMES = {
254
+ excel: 'Excel',
255
+ onedrive: 'OneDrive',
256
+ onenote: 'OneNote',
257
+ outlook: 'Outlook',
258
+ planner: 'Planner',
259
+ sharepoint: 'SharePoint',
260
+ };
261
+
262
+ // "my calendar permission" already says whose it is.
263
+ const POSSESSIVE_LEADS = new Set(['my', 'your', 'all']);
264
+
265
+ // Deliberately conservative: a false "singular" only costs an article that reads slightly
266
+ // off, while a false "plural" drops an article the sentence needed. Words like status,
267
+ // series and news end in s without being plural.
268
+ function isPlural(word) {
269
+ return /s$/i.test(word) && !/(ss|us|is|ews)$/i.test(word);
270
+ }
271
+
272
+ // Mass nouns take no article: "Send a mail" and "Upload a file content" both read wrong.
273
+ // Only the tail is checked, since that is the noun the article has to agree with - a
274
+ // leading "content" would be a modifier ("content type"), which is countable again.
275
+ const UNCOUNTABLE_TAILS = new Set(['content', 'mail', 'mime', 'delta']);
276
+
277
+ // Sound, not spelling. OneDrive/OneNote open with a consonant sound, and so does the
278
+ // "yoo" class of u-words (user, unit, unique) - but not upload or update, which really do
279
+ // take "an". Listing the yoo- prefixes is narrower and safer than a blanket /^u/.
280
+ const CONSONANT_SOUNDING_VOWEL = /^(?:one|use|user|uni|uti|ubi|eu)/i;
281
+
282
+ function articleFor(word) {
283
+ if (CONSONANT_SOUNDING_VOWEL.test(word)) return 'a ';
284
+ return /^[aeiou]/i.test(word) ? 'an ' : 'a ';
285
+ }
286
+
287
+ export function synthesizeDescriptionFromToolName(toolName) {
288
+ const parts = toolName.split('-');
289
+
290
+ let verb = null;
291
+ const compound = Object.keys(COMPOUND_VERBS).find((prefix) => toolName.startsWith(`${prefix}-`));
292
+ if (compound) {
293
+ verb = COMPOUND_VERBS[compound];
294
+ parts.splice(0, compound.split('-').length);
295
+ } else if (parts.length > 1 && TOOL_NAME_VERBS[parts[0]]) {
296
+ verb = TOOL_NAME_VERBS[parts.shift()];
297
+ }
298
+ if (!verb) return null;
299
+
300
+ // reply-to-chat-message: the verb phrase already ends in that preposition.
301
+ if (parts[0] === 'to' && verb.endsWith(' to')) parts.shift();
302
+ if (parts.length === 0) return null;
303
+
304
+ const words = parts.map((word) => PRODUCT_NAMES[word] ?? word);
305
+ // The article is chosen for the head word, so a plural head has to suppress it too -
306
+ // "a presences by user id" otherwise. The tail matters as well, since that is the noun
307
+ // the phrase is actually about ("Excel table rows").
308
+ const skipArticle =
309
+ verb === 'List' ||
310
+ POSSESSIVE_LEADS.has(parts[0]) ||
311
+ isPlural(parts[0]) ||
312
+ isPlural(parts[parts.length - 1]) ||
313
+ UNCOUNTABLE_TAILS.has(parts[parts.length - 1]);
314
+
315
+ return `${verb} ${skipArticle ? '' : articleFor(words[0])}${words.join(' ')}.`;
316
+ }
317
+
318
+ export function replaceNavPropertyStub(description, toolName) {
319
+ if (!description || !NAV_PROPERTY_STUB.test(description.trim())) return description;
320
+ return synthesizeDescriptionFromToolName(toolName) ?? description;
321
+ }
322
+
169
323
  function normalizeWildcardSuccessResponses(paths) {
170
324
  Object.values(paths || {}).forEach((pathItem) => {
171
325
  if (!pathItem || typeof pathItem !== 'object') return;
@@ -105,6 +105,7 @@
105
105
  "pathPattern": "/users/{user-id}/messages/{message-id}",
106
106
  "method": "get",
107
107
  "toolName": "get-shared-mailbox-message",
108
+ "descriptionOverride": "Get a single Outlook message from another user's mailbox or a shared mailbox, by message ID. The user-id is the mailbox owner's ID or email address, and delegated access to that mailbox is required.",
108
109
  "presets": ["work"],
109
110
  "workScopes": ["Mail.Read.Shared"]
110
111
  },
@@ -411,6 +412,7 @@
411
412
  "pathPattern": "/me/calendars/{calendar-id}/events",
412
413
  "method": "get",
413
414
  "toolName": "list-specific-calendar-events",
415
+ "descriptionOverride": "List events from one of the signed-in user's calendars, addressed by calendar ID.",
414
416
  "presets": ["calendar", "outlook", "personal"],
415
417
  "scopes": ["Calendars.Read"],
416
418
  "supportsTimezone": true,
@@ -421,6 +423,7 @@
421
423
  "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}",
422
424
  "method": "get",
423
425
  "toolName": "get-specific-calendar-event",
426
+ "descriptionOverride": "Get a single event from one of the signed-in user's calendars, addressed by calendar ID and event ID. Any calendar can be addressed this way, including the default one.",
424
427
  "presets": ["calendar", "outlook", "personal"],
425
428
  "scopes": ["Calendars.Read"],
426
429
  "supportsTimezone": true,
@@ -464,6 +467,7 @@
464
467
  "pathPattern": "/me/calendars/{calendar-id}/calendarView",
465
468
  "method": "get",
466
469
  "toolName": "get-specific-calendar-view",
470
+ "descriptionOverride": "List the occurrences, exceptions, and single instances of events over a time range, from one of the signed-in user's calendars addressed by calendar ID.",
467
471
  "presets": ["calendar", "outlook", "personal"],
468
472
  "scopes": ["Calendars.Read"],
469
473
  "supportsTimezone": true,
@@ -482,6 +486,7 @@
482
486
  "pathPattern": "/users/{user-id}/calendar/events",
483
487
  "method": "get",
484
488
  "toolName": "list-shared-calendar-events",
489
+ "descriptionOverride": "List events in another user's default calendar. The user-id is the calendar owner's ID or email address, and delegated access to that calendar is required. Recurring events are returned as a single series master, not expanded into occurrences - use get-shared-calendar-view for that.",
485
490
  "presets": ["work"],
486
491
  "workScopes": ["Calendars.Read.Shared"]
487
492
  },
@@ -489,6 +494,7 @@
489
494
  "pathPattern": "/users/{user-id}/calendarView",
490
495
  "method": "get",
491
496
  "toolName": "get-shared-calendar-view",
497
+ "descriptionOverride": "List the occurrences, exceptions, and single instances of events in another user's default calendar over a time range. Requires the startDateTime and endDateTime query parameters in ISO 8601 format. Unlike list-shared-calendar-events, recurring series are expanded into individual occurrences.",
492
498
  "presets": ["work"],
493
499
  "workScopes": ["Calendars.Read.Shared"],
494
500
  "supportsTimezone": true
@@ -1979,6 +1985,7 @@
1979
1985
  "pathPattern": "/copilot/retrieval",
1980
1986
  "method": "post",
1981
1987
  "toolName": "copilot-retrieve",
1988
+ "descriptionOverride": "Search Microsoft 365 content using the Copilot Retrieval API. Grounds a natural-language query against the hybrid index behind Microsoft 365 Copilot and returns permission-trimmed text extracts with their source URLs.",
1982
1989
  "presets": ["search", "work"],
1983
1990
  "readOnly": true,
1984
1991
  "workScopes": [["Files.Read.All", "Sites.Read.All"], ["ExternalItem.Read.All"]],
@@ -2015,7 +2022,7 @@
2015
2022
  }
2016
2023
  }
2017
2024
  },
2018
- "llmTip": "Semantic/hybrid search over Microsoft 365 content via the Copilot Retrieval API. Grounds a natural-language query against the same hybrid index that powers Microsoft 365 Copilot and returns permission-trimmed text extracts with their source URLs — unlike search-query/search-onedrive-files/search-sharepoint-sites, which are lexical KQL. Prefer this for paraphrase/intent queries (e.g. resolving an informal project nickname, or matching 'packaging requirements' against text that never uses that phrase). Pass the request fields nested under a 'body' object: { queryString, dataSource, filterExpression?, resourceMetadata?, maximumNumberOfResults? }. Returns { retrievalHits: [{ webUrl, extracts: [{ text, relevanceScore }], resourceType, resourceMetadata, sensitivityLabel? }] }. Work/school accounts only (personal accounts are not supported). dataSource 'sharePoint'/'oneDriveBusiness' need delegated Files.Read.All + Sites.Read.All (requested by default); dataSource 'externalItem' (Copilot connectors) needs ExternalItem.Read.All, which is not requested by default - add it with --extra-scopes ExternalItem.Read.All."
2025
+ "llmTip": "Retrieval here is semantic/hybrid, unlike search-query/search-onedrive-files/search-sharepoint-sites, which are lexical KQL. Prefer this for paraphrase/intent queries (e.g. resolving an informal project nickname, or matching 'packaging requirements' against text that never uses that phrase). Pass the request fields nested under a 'body' object: { queryString, dataSource, filterExpression?, resourceMetadata?, maximumNumberOfResults? }. Returns { retrievalHits: [{ webUrl, extracts: [{ text, relevanceScore }], resourceType, resourceMetadata, sensitivityLabel? }] }. Work/school accounts only (personal accounts are not supported). dataSource 'sharePoint'/'oneDriveBusiness' need delegated Files.Read.All + Sites.Read.All (requested by default); dataSource 'externalItem' (Copilot connectors) needs ExternalItem.Read.All, which is not requested by default - add it with --extra-scopes ExternalItem.Read.All."
2019
2026
  },
2020
2027
  {
2021
2028
  "pathPattern": "/me/onlineMeetings",
@@ -2216,17 +2223,19 @@
2216
2223
  "pathPattern": "/places/{place-id}/graph.roomList/rooms",
2217
2224
  "method": "get",
2218
2225
  "toolName": "list-room-list-rooms",
2226
+ "descriptionOverride": "List the meeting rooms that belong to a room list.",
2219
2227
  "presets": ["calendar", "work"],
2220
2228
  "workScopes": ["Place.Read.All"],
2221
- "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."
2229
+ "llmTip": "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."
2222
2230
  },
2223
2231
  {
2224
2232
  "pathPattern": "/places/{place-id}/graph.roomList/rooms/{room-id}",
2225
2233
  "method": "get",
2226
2234
  "toolName": "get-room-list-room",
2235
+ "descriptionOverride": "Get a single meeting room from a room list, by room ID.",
2227
2236
  "presets": ["calendar", "work"],
2228
2237
  "workScopes": ["Place.Read.All"],
2229
- "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."
2238
+ "llmTip": "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."
2230
2239
  },
2231
2240
  {
2232
2241
  "pathPattern": "/places/{place-id}",
@@ -5555,7 +5555,7 @@ const endpoints = makeApi([
5555
5555
  method: "patch",
5556
5556
  path: "/chats/:chatId/messages/:chatMessageId",
5557
5557
  alias: "update-chat-message",
5558
- description: `Update the navigation property messages in chats`,
5558
+ description: `Update a chat message.`,
5559
5559
  requestFormat: "json",
5560
5560
  parameters: [
5561
5561
  {
@@ -5671,7 +5671,7 @@ const endpoints = makeApi([
5671
5671
  method: "post",
5672
5672
  path: "/chats/:chatId/messages/:chatMessageId/replies",
5673
5673
  alias: "reply-to-chat-message",
5674
- description: `Create new navigation property to replies for chats`,
5674
+ description: `Reply to a chat message.`,
5675
5675
  requestFormat: "json",
5676
5676
  parameters: [
5677
5677
  {
@@ -5687,7 +5687,7 @@ const endpoints = makeApi([
5687
5687
  method: "post",
5688
5688
  path: "/chats/:chatId/messages/:chatMessageId/setReaction",
5689
5689
  alias: "set-chat-message-reaction",
5690
- description: `Invoke action setReaction`,
5690
+ description: `Set a chat message reaction.`,
5691
5691
  requestFormat: "json",
5692
5692
  parameters: [
5693
5693
  {
@@ -5703,7 +5703,7 @@ const endpoints = makeApi([
5703
5703
  method: "post",
5704
5704
  path: "/chats/:chatId/messages/:chatMessageId/unsetReaction",
5705
5705
  alias: "unset-chat-message-reaction",
5706
- description: `Invoke action unsetReaction`,
5706
+ description: `Unset a chat message reaction.`,
5707
5707
  requestFormat: "json",
5708
5708
  parameters: [
5709
5709
  {
@@ -5852,7 +5852,7 @@ const endpoints = makeApi([
5852
5852
  method: "patch",
5853
5853
  path: "/drives/:driveId/items/:driveItemId",
5854
5854
  alias: "move-rename-onedrive-item",
5855
- description: `Update the navigation property items in drives`,
5855
+ description: `Move or rename a OneDrive item.`,
5856
5856
  requestFormat: "json",
5857
5857
  parameters: [
5858
5858
  {
@@ -5902,7 +5902,7 @@ const endpoints = makeApi([
5902
5902
  method: "delete",
5903
5903
  path: "/drives/:driveId/items/:driveItemId",
5904
5904
  alias: "delete-onedrive-file",
5905
- description: `Delete navigation property items for drives`,
5905
+ description: `Delete a OneDrive file.`,
5906
5906
  requestFormat: "json",
5907
5907
  parameters: [
5908
5908
  {
@@ -5967,7 +5967,7 @@ const endpoints = makeApi([
5967
5967
  method: "post",
5968
5968
  path: "/drives/:driveId/items/:driveItemId/children",
5969
5969
  alias: "create-onedrive-folder",
5970
- description: `Create new navigation property to children for drives`,
5970
+ description: `Create a OneDrive folder.`,
5971
5971
  requestFormat: "json",
5972
5972
  parameters: [
5973
5973
  {
@@ -6033,7 +6033,7 @@ const endpoints = makeApi([
6033
6033
  method: "post",
6034
6034
  path: "/drives/:driveId/items/:driveItemId/copy",
6035
6035
  alias: "copy-drive-item",
6036
- description: `Invoke action copy`,
6036
+ description: `Copy a drive item.`,
6037
6037
  requestFormat: "json",
6038
6038
  parameters: [
6039
6039
  {
@@ -6066,7 +6066,7 @@ If a sharing link of the specified type already exists for the app, the existing
6066
6066
  method: "post",
6067
6067
  path: "/drives/:driveId/items/:driveItemId/createUploadSession",
6068
6068
  alias: "create-upload-session",
6069
- description: `Invoke action createUploadSession`,
6069
+ description: `Create an upload session.`,
6070
6070
  requestFormat: "json",
6071
6071
  parameters: [
6072
6072
  {
@@ -6136,7 +6136,7 @@ Items with this property set should be removed from your local state.`,
6136
6136
  method: "post",
6137
6137
  path: "/drives/:driveId/items/:driveItemId/extractSensitivityLabels",
6138
6138
  alias: "extract-drive-item-sensitivity-labels",
6139
- description: `Invoke action extractSensitivityLabels`,
6139
+ description: `Extract drive item sensitivity labels.`,
6140
6140
  requestFormat: "json",
6141
6141
  response: z.void()
6142
6142
  },
@@ -6210,7 +6210,7 @@ Items with this property set should be removed from your local state.`,
6210
6210
  method: "delete",
6211
6211
  path: "/drives/:driveId/items/:driveItemId/permissions/:permissionId",
6212
6212
  alias: "delete-drive-item-permission",
6213
- description: `Delete navigation property permissions for drives`,
6213
+ description: `Delete a drive item permission.`,
6214
6214
  requestFormat: "json",
6215
6215
  parameters: [
6216
6216
  {
@@ -6225,7 +6225,7 @@ Items with this property set should be removed from your local state.`,
6225
6225
  method: "post",
6226
6226
  path: "/drives/:driveId/items/:driveItemId/preview",
6227
6227
  alias: "create-drive-item-preview",
6228
- description: `Invoke action preview`,
6228
+ description: `Create a drive item preview.`,
6229
6229
  requestFormat: "json",
6230
6230
  parameters: [
6231
6231
  {
@@ -6461,7 +6461,7 @@ Items with this property set should be removed from your local state.`,
6461
6461
  method: "post",
6462
6462
  path: "/drives/:driveId/items/:driveItemId/workbook/tables/:workbookTableId/rows",
6463
6463
  alias: "add-excel-table-rows",
6464
- description: `Create new navigation property to rows for drives`,
6464
+ description: `Add Excel table rows.`,
6465
6465
  requestFormat: "json",
6466
6466
  parameters: [
6467
6467
  {
@@ -6477,7 +6477,7 @@ Items with this property set should be removed from your local state.`,
6477
6477
  method: "patch",
6478
6478
  path: "/drives/:driveId/items/:driveItemId/workbook/tables/:workbookTableId/rows/itemAt(index=:index)",
6479
6479
  alias: "update-excel-table-row",
6480
- description: `Update a single row in a formal Excel table by zero-based row index. Body: { values: [[...]] } with one inner array matching the column count.`,
6480
+ description: `Update an Excel table row.`,
6481
6481
  requestFormat: "json",
6482
6482
  parameters: [
6483
6483
  {
@@ -6513,7 +6513,7 @@ Items with this property set should be removed from your local state.`,
6513
6513
  method: "delete",
6514
6514
  path: "/drives/:driveId/items/:driveItemId/workbook/tables/:workbookTableId/rows/itemAt(index=:index)",
6515
6515
  alias: "delete-excel-table-row",
6516
- description: `Delete a single row from a formal Excel table by zero-based row index.`,
6516
+ description: `Delete an Excel table row.`,
6517
6517
  requestFormat: "json",
6518
6518
  parameters: [
6519
6519
  {
@@ -6609,7 +6609,7 @@ Items with this property set should be removed from your local state.`,
6609
6609
  method: "patch",
6610
6610
  path: "/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range()/sort",
6611
6611
  alias: "sort-excel-range",
6612
- description: `Update the navigation property sort in drives`,
6612
+ description: `Sort an Excel range.`,
6613
6613
  requestFormat: "json",
6614
6614
  parameters: [
6615
6615
  {
@@ -6627,7 +6627,7 @@ Items with this property set should be removed from your local state.`,
6627
6627
  method: "get",
6628
6628
  path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')`,
6629
6629
  alias: "get-excel-range",
6630
- description: `Invoke function range`,
6630
+ description: `Get an Excel range.`,
6631
6631
  requestFormat: "json",
6632
6632
  response: z.void()
6633
6633
  },
@@ -6635,7 +6635,7 @@ Items with this property set should be removed from your local state.`,
6635
6635
  method: "patch",
6636
6636
  path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')`,
6637
6637
  alias: "update-excel-range",
6638
- description: `Set cell values, formulas, or number format on any range \u2014 does NOT require the worksheet to be a formal Excel table. Body: { values: [['v1','v2','v3']] } for a single row, or [['a','b'],['c','d']] for multi-row. Use this for append (target the next empty row's address, e.g. 'A172:H172'), update (target a single cell like 'H42'), or prepend-style edits (read existing, concatenate, write back). Number of inner-array values must match the column count of the address.`,
6638
+ description: `Update an Excel range.`,
6639
6639
  requestFormat: "json",
6640
6640
  parameters: [
6641
6641
  {
@@ -6671,7 +6671,7 @@ Items with this property set should be removed from your local state.`,
6671
6671
  method: "post",
6672
6672
  path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/clear`,
6673
6673
  alias: "clear-excel-range",
6674
- description: `Invoke action clear`,
6674
+ description: `Clear an Excel range.`,
6675
6675
  requestFormat: "json",
6676
6676
  parameters: [
6677
6677
  {
@@ -6687,7 +6687,7 @@ Items with this property set should be removed from your local state.`,
6687
6687
  method: "post",
6688
6688
  path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/delete`,
6689
6689
  alias: "delete-excel-range",
6690
- description: `Invoke action delete`,
6690
+ description: `Delete an Excel range.`,
6691
6691
  requestFormat: "json",
6692
6692
  parameters: [
6693
6693
  {
@@ -6723,7 +6723,7 @@ Items with this property set should be removed from your local state.`,
6723
6723
  method: "patch",
6724
6724
  path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/format`,
6725
6725
  alias: "format-excel-range",
6726
- description: `Update the navigation property format in drives`,
6726
+ description: `Format an Excel range.`,
6727
6727
  requestFormat: "json",
6728
6728
  parameters: [
6729
6729
  {
@@ -6739,7 +6739,7 @@ Items with this property set should be removed from your local state.`,
6739
6739
  method: "patch",
6740
6740
  path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/format/borders/:sideIndex`,
6741
6741
  alias: "format-excel-range-border",
6742
- description: `Sets one border side. The {sideIndex} path param selects which side: EdgeTop, EdgeBottom, EdgeLeft, EdgeRight, InsideVertical, InsideHorizontal, DiagonalDown, or DiagonalUp. To outline all four edges, call once per side.`,
6742
+ description: `Format an Excel range border.`,
6743
6743
  requestFormat: "json",
6744
6744
  parameters: [
6745
6745
  {
@@ -6780,7 +6780,7 @@ Items with this property set should be removed from your local state.`,
6780
6780
  method: "patch",
6781
6781
  path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/format/fill`,
6782
6782
  alias: "format-excel-range-fill",
6783
- description: `Set the background fill color of a range's cells.`,
6783
+ description: `Format an Excel range fill.`,
6784
6784
  requestFormat: "json",
6785
6785
  parameters: [
6786
6786
  {
@@ -6820,7 +6820,7 @@ Items with this property set should be removed from your local state.`,
6820
6820
  method: "patch",
6821
6821
  path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/format/font`,
6822
6822
  alias: "format-excel-range-font",
6823
- description: `Set font formatting on a range: bold, italic, underline, size, color, and font name.`,
6823
+ description: `Format an Excel range font.`,
6824
6824
  requestFormat: "json",
6825
6825
  parameters: [
6826
6826
  {
@@ -6856,7 +6856,7 @@ Items with this property set should be removed from your local state.`,
6856
6856
  method: "post",
6857
6857
  path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/insert`,
6858
6858
  alias: "insert-excel-range",
6859
- description: `Invoke action insert`,
6859
+ description: `Insert an Excel range.`,
6860
6860
  requestFormat: "json",
6861
6861
  parameters: [
6862
6862
  {
@@ -6872,7 +6872,7 @@ Items with this property set should be removed from your local state.`,
6872
6872
  method: "post",
6873
6873
  path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/merge`,
6874
6874
  alias: "merge-excel-range",
6875
- description: `Invoke action merge`,
6875
+ description: `Merge an Excel range.`,
6876
6876
  requestFormat: "json",
6877
6877
  parameters: [
6878
6878
  {
@@ -6888,7 +6888,7 @@ Items with this property set should be removed from your local state.`,
6888
6888
  method: "post",
6889
6889
  path: `/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/range(address=':address')/unmerge`,
6890
6890
  alias: "unmerge-excel-range",
6891
- description: `Invoke action unmerge`,
6891
+ description: `Unmerge an Excel range.`,
6892
6892
  requestFormat: "json",
6893
6893
  response: z.void()
6894
6894
  },
@@ -6912,7 +6912,7 @@ Items with this property set should be removed from your local state.`,
6912
6912
  method: "get",
6913
6913
  path: "/drives/:driveId/items/:driveItemId/workbook/worksheets/:workbookWorksheetId/usedRange()",
6914
6914
  alias: "get-excel-used-range",
6915
- description: `Invoke function usedRange`,
6915
+ description: `Get an Excel used range.`,
6916
6916
  requestFormat: "json",
6917
6917
  response: z.void()
6918
6918
  },
@@ -7764,7 +7764,7 @@ from the default calendar of a group.`,
7764
7764
  method: "patch",
7765
7765
  path: "/me/calendar/calendarPermissions/:calendarPermissionId",
7766
7766
  alias: "update-my-calendar-permission",
7767
- description: `Update the navigation property calendarPermissions in me`,
7767
+ description: `Update my calendar permission.`,
7768
7768
  requestFormat: "json",
7769
7769
  parameters: [
7770
7770
  {
@@ -7780,7 +7780,7 @@ from the default calendar of a group.`,
7780
7780
  method: "delete",
7781
7781
  path: "/me/calendar/calendarPermissions/:calendarPermissionId",
7782
7782
  alias: "delete-my-calendar-permission",
7783
- description: `Delete navigation property calendarPermissions for me`,
7783
+ description: `Delete my calendar permission.`,
7784
7784
  requestFormat: "json",
7785
7785
  parameters: [
7786
7786
  {
@@ -7877,7 +7877,7 @@ from the default calendar of a group.`,
7877
7877
  method: "patch",
7878
7878
  path: "/me/calendars/:calendarId",
7879
7879
  alias: "update-calendar",
7880
- description: `Update the navigation property calendars in me`,
7880
+ description: `Update a calendar.`,
7881
7881
  requestFormat: "json",
7882
7882
  parameters: [
7883
7883
  {
@@ -8110,7 +8110,7 @@ from the default calendar of a group.`,
8110
8110
  method: "patch",
8111
8111
  path: "/me/calendars/:calendarId/events/:eventId",
8112
8112
  alias: "update-specific-calendar-event",
8113
- description: `Update the navigation property events in me`,
8113
+ description: `Update a specific calendar event.`,
8114
8114
  requestFormat: "json",
8115
8115
  parameters: [
8116
8116
  {
@@ -8178,7 +8178,7 @@ from the default calendar of a group.`,
8178
8178
  method: "delete",
8179
8179
  path: "/me/calendars/:calendarId/events/:eventId",
8180
8180
  alias: "delete-specific-calendar-event",
8181
- description: `Delete navigation property events for me`,
8181
+ description: `Delete a specific calendar event.`,
8182
8182
  requestFormat: "json",
8183
8183
  parameters: [
8184
8184
  {
@@ -8386,7 +8386,7 @@ or from some other calendar of the user.`,
8386
8386
  method: "get",
8387
8387
  path: "/me/chats",
8388
8388
  alias: "list-chats",
8389
- description: `Get chats from me`,
8389
+ description: `List chats.`,
8390
8390
  requestFormat: "json",
8391
8391
  parameters: [
8392
8392
  {
@@ -8920,7 +8920,7 @@ or from some other calendar of the user.`,
8920
8920
  method: "get",
8921
8921
  path: "/me/dataSecurityAndGovernance/sensitivityLabels",
8922
8922
  alias: "list-sensitivity-labels",
8923
- description: `Get sensitivityLabels from me`,
8923
+ description: `List sensitivity labels.`,
8924
8924
  requestFormat: "json",
8925
8925
  parameters: [
8926
8926
  {
@@ -8970,7 +8970,7 @@ or from some other calendar of the user.`,
8970
8970
  method: "get",
8971
8971
  path: "/me/dataSecurityAndGovernance/sensitivityLabels/:sensitivityLabelId",
8972
8972
  alias: "get-sensitivity-label",
8973
- description: `Get sensitivityLabels from me`,
8973
+ description: `Get a sensitivity label.`,
8974
8974
  requestFormat: "json",
8975
8975
  parameters: [
8976
8976
  {
@@ -10525,7 +10525,7 @@ resource.`,
10525
10525
  method: "delete",
10526
10526
  path: "/me/messages/:messageId/attachments/:attachmentId",
10527
10527
  alias: "delete-mail-attachment",
10528
- description: `Delete navigation property attachments for me`,
10528
+ description: `Delete a mail attachment.`,
10529
10529
  requestFormat: "json",
10530
10530
  parameters: [
10531
10531
  {
@@ -10572,7 +10572,7 @@ resource.`,
10572
10572
  method: "post",
10573
10573
  path: "/me/messages/:messageId/createForward",
10574
10574
  alias: "create-forward-draft",
10575
- description: `Invoke action createForward`,
10575
+ description: `Create a forward draft.`,
10576
10576
  requestFormat: "json",
10577
10577
  parameters: [
10578
10578
  {
@@ -12421,7 +12421,7 @@ Currently, a user can be associated with a team in two different ways:`,
12421
12421
  method: "get",
12422
12422
  path: "/places/:placeId/graph.roomList/rooms",
12423
12423
  alias: "list-room-list-rooms",
12424
- description: `Get rooms from places`,
12424
+ description: `List room list rooms.`,
12425
12425
  requestFormat: "json",
12426
12426
  parameters: [
12427
12427
  {
@@ -12471,7 +12471,7 @@ Currently, a user can be associated with a team in two different ways:`,
12471
12471
  method: "get",
12472
12472
  path: "/places/:placeId/graph.roomList/rooms/:roomId",
12473
12473
  alias: "get-room-list-room",
12474
- description: `Get rooms from places`,
12474
+ description: `Get a room list room.`,
12475
12475
  requestFormat: "json",
12476
12476
  parameters: [
12477
12477
  {
@@ -12985,7 +12985,7 @@ A site resource represents a team site in SharePoint.`,
12985
12985
  method: "get",
12986
12986
  path: "/sites/:siteId:/:path",
12987
12987
  alias: "get-sharepoint-site-by-path",
12988
- description: `Resolve a SharePoint site from its server-relative URL. site-id is the hostname (contoso.sharepoint.com) and path is the site path without a leading slash (sites/marketing, teams/hr). Returns the site object whose id feeds list-sharepoint-site-drives.`,
12988
+ description: `Get a SharePoint site by path.`,
12989
12989
  requestFormat: "json",
12990
12990
  parameters: [
12991
12991
  {
@@ -13352,7 +13352,7 @@ To list them, include system in your $select statement.`,
13352
13352
  method: "patch",
13353
13353
  path: "/sites/:siteId/lists/:listId/columns/:columnDefinitionId",
13354
13354
  alias: "update-sharepoint-list-column",
13355
- description: `Update the navigation property columns in sites`,
13355
+ description: `Update a SharePoint list column.`,
13356
13356
  requestFormat: "json",
13357
13357
  parameters: [
13358
13358
  {
@@ -13402,7 +13402,7 @@ To list them, include system in your $select statement.`,
13402
13402
  method: "delete",
13403
13403
  path: "/sites/:siteId/lists/:listId/columns/:columnDefinitionId",
13404
13404
  alias: "delete-sharepoint-list-column",
13405
- description: `Delete navigation property columns for sites`,
13405
+ description: `Delete a SharePoint list column.`,
13406
13406
  requestFormat: "json",
13407
13407
  parameters: [
13408
13408
  {
@@ -13503,7 +13503,7 @@ To list them, include system in your $select statement.`,
13503
13503
  method: "patch",
13504
13504
  path: "/sites/:siteId/lists/:listId/items/:listItemId",
13505
13505
  alias: "update-sharepoint-list-item",
13506
- description: `Update the navigation property items in sites`,
13506
+ description: `Update a SharePoint list item.`,
13507
13507
  requestFormat: "json",
13508
13508
  parameters: [
13509
13509
  {
@@ -13584,7 +13584,7 @@ To list them, include system in your $select statement.`,
13584
13584
  method: "post",
13585
13585
  path: "/sites/:siteId/onenote/notebooks",
13586
13586
  alias: "create-sharepoint-site-onenote-notebook",
13587
- description: `Create new navigation property to notebooks for sites`,
13587
+ description: `Create a SharePoint site OneNote notebook.`,
13588
13588
  requestFormat: "json",
13589
13589
  parameters: [
13590
13590
  {
@@ -13700,7 +13700,7 @@ To list them, include system in your $select statement.`,
13700
13700
  method: "post",
13701
13701
  path: "/sites/:siteId/onenote/notebooks/:notebookId/sections",
13702
13702
  alias: "create-sharepoint-site-onenote-section",
13703
- description: `Create new navigation property to sections for sites`,
13703
+ description: `Create a SharePoint site OneNote section.`,
13704
13704
  requestFormat: "json",
13705
13705
  parameters: [
13706
13706
  {
@@ -13716,7 +13716,7 @@ To list them, include system in your $select statement.`,
13716
13716
  method: "delete",
13717
13717
  path: "/sites/:siteId/onenote/pages/:onenotePageId",
13718
13718
  alias: "delete-sharepoint-site-onenote-page",
13719
- description: `Delete navigation property pages for sites`,
13719
+ description: `Delete a SharePoint site OneNote page.`,
13720
13720
  requestFormat: "json",
13721
13721
  parameters: [
13722
13722
  {
@@ -13739,7 +13739,7 @@ To list them, include system in your $select statement.`,
13739
13739
  method: "patch",
13740
13740
  path: "/sites/:siteId/onenote/pages/:onenotePageId/content",
13741
13741
  alias: "update-sharepoint-site-onenote-page-content",
13742
- description: `update-sharepoint-site-onenote-page-content (synthesized)`,
13742
+ description: `Update SharePoint site OneNote page content.`,
13743
13743
  requestFormat: "json",
13744
13744
  parameters: [
13745
13745
  {
@@ -13865,7 +13865,7 @@ To list them, include system in your $select statement.`,
13865
13865
  method: "post",
13866
13866
  path: "/sites/:siteId/onenote/sectionGroups/:sectionGroupId/sections",
13867
13867
  alias: "create-sharepoint-site-onenote-section-group-section",
13868
- description: `Create new navigation property to sections for sites`,
13868
+ description: `Create a SharePoint site OneNote section group section.`,
13869
13869
  requestFormat: "json",
13870
13870
  parameters: [
13871
13871
  {
@@ -13931,7 +13931,7 @@ To list them, include system in your $select statement.`,
13931
13931
  method: "post",
13932
13932
  path: "/sites/:siteId/onenote/sections/:onenoteSectionId/pages",
13933
13933
  alias: "create-sharepoint-site-onenote-section-page",
13934
- description: `Create new navigation property to pages for sites`,
13934
+ description: `Create a SharePoint site OneNote section page.`,
13935
13935
  requestFormat: "json",
13936
13936
  parameters: [
13937
13937
  {
@@ -14571,7 +14571,7 @@ Only the policyViolation property of a chatMessage can be updated in application
14571
14571
  method: "patch",
14572
14572
  path: "/teams/:teamId/channels/:channelId/messages/:chatMessageId/replies/:chatMessageId1",
14573
14573
  alias: "update-channel-message-reply",
14574
- description: `Update the navigation property replies in teams`,
14574
+ description: `Update a channel message reply.`,
14575
14575
  requestFormat: "json",
14576
14576
  parameters: [
14577
14577
  {
@@ -14587,7 +14587,7 @@ Only the policyViolation property of a chatMessage can be updated in application
14587
14587
  method: "post",
14588
14588
  path: "/teams/:teamId/channels/:channelId/messages/:chatMessageId/setReaction",
14589
14589
  alias: "set-channel-message-reaction",
14590
- description: `Invoke action setReaction`,
14590
+ description: `Set a channel message reaction.`,
14591
14591
  requestFormat: "json",
14592
14592
  parameters: [
14593
14593
  {
@@ -14603,7 +14603,7 @@ Only the policyViolation property of a chatMessage can be updated in application
14603
14603
  method: "post",
14604
14604
  path: "/teams/:teamId/channels/:channelId/messages/:chatMessageId/unsetReaction",
14605
14605
  alias: "unset-channel-message-reaction",
14606
- description: `Invoke action unsetReaction`,
14606
+ description: `Unset a channel message reaction.`,
14607
14607
  requestFormat: "json",
14608
14608
  parameters: [
14609
14609
  {
@@ -15105,7 +15105,7 @@ Only the policyViolation property of a chatMessage can be updated in application
15105
15105
  method: "post",
15106
15106
  path: "/users/:userId/messages",
15107
15107
  alias: "create-shared-mailbox-draft",
15108
- description: `Create new navigation property to messages for users`,
15108
+ description: `Create a shared mailbox draft.`,
15109
15109
  requestFormat: "json",
15110
15110
  parameters: [
15111
15111
  {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@softeria/ms-365-mcp-server",
3
3
  "mcpName": "io.github.Softeria/ms-365-mcp-server",
4
- "version": "0.139.0",
4
+ "version": "0.139.1",
5
5
  "description": " A Model Context Protocol (MCP) server for interacting with Microsoft 365 and Office services through the Graph API",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
@@ -105,6 +105,7 @@
105
105
  "pathPattern": "/users/{user-id}/messages/{message-id}",
106
106
  "method": "get",
107
107
  "toolName": "get-shared-mailbox-message",
108
+ "descriptionOverride": "Get a single Outlook message from another user's mailbox or a shared mailbox, by message ID. The user-id is the mailbox owner's ID or email address, and delegated access to that mailbox is required.",
108
109
  "presets": ["work"],
109
110
  "workScopes": ["Mail.Read.Shared"]
110
111
  },
@@ -411,6 +412,7 @@
411
412
  "pathPattern": "/me/calendars/{calendar-id}/events",
412
413
  "method": "get",
413
414
  "toolName": "list-specific-calendar-events",
415
+ "descriptionOverride": "List events from one of the signed-in user's calendars, addressed by calendar ID.",
414
416
  "presets": ["calendar", "outlook", "personal"],
415
417
  "scopes": ["Calendars.Read"],
416
418
  "supportsTimezone": true,
@@ -421,6 +423,7 @@
421
423
  "pathPattern": "/me/calendars/{calendar-id}/events/{event-id}",
422
424
  "method": "get",
423
425
  "toolName": "get-specific-calendar-event",
426
+ "descriptionOverride": "Get a single event from one of the signed-in user's calendars, addressed by calendar ID and event ID. Any calendar can be addressed this way, including the default one.",
424
427
  "presets": ["calendar", "outlook", "personal"],
425
428
  "scopes": ["Calendars.Read"],
426
429
  "supportsTimezone": true,
@@ -464,6 +467,7 @@
464
467
  "pathPattern": "/me/calendars/{calendar-id}/calendarView",
465
468
  "method": "get",
466
469
  "toolName": "get-specific-calendar-view",
470
+ "descriptionOverride": "List the occurrences, exceptions, and single instances of events over a time range, from one of the signed-in user's calendars addressed by calendar ID.",
467
471
  "presets": ["calendar", "outlook", "personal"],
468
472
  "scopes": ["Calendars.Read"],
469
473
  "supportsTimezone": true,
@@ -482,6 +486,7 @@
482
486
  "pathPattern": "/users/{user-id}/calendar/events",
483
487
  "method": "get",
484
488
  "toolName": "list-shared-calendar-events",
489
+ "descriptionOverride": "List events in another user's default calendar. The user-id is the calendar owner's ID or email address, and delegated access to that calendar is required. Recurring events are returned as a single series master, not expanded into occurrences - use get-shared-calendar-view for that.",
485
490
  "presets": ["work"],
486
491
  "workScopes": ["Calendars.Read.Shared"]
487
492
  },
@@ -489,6 +494,7 @@
489
494
  "pathPattern": "/users/{user-id}/calendarView",
490
495
  "method": "get",
491
496
  "toolName": "get-shared-calendar-view",
497
+ "descriptionOverride": "List the occurrences, exceptions, and single instances of events in another user's default calendar over a time range. Requires the startDateTime and endDateTime query parameters in ISO 8601 format. Unlike list-shared-calendar-events, recurring series are expanded into individual occurrences.",
492
498
  "presets": ["work"],
493
499
  "workScopes": ["Calendars.Read.Shared"],
494
500
  "supportsTimezone": true
@@ -1979,6 +1985,7 @@
1979
1985
  "pathPattern": "/copilot/retrieval",
1980
1986
  "method": "post",
1981
1987
  "toolName": "copilot-retrieve",
1988
+ "descriptionOverride": "Search Microsoft 365 content using the Copilot Retrieval API. Grounds a natural-language query against the hybrid index behind Microsoft 365 Copilot and returns permission-trimmed text extracts with their source URLs.",
1982
1989
  "presets": ["search", "work"],
1983
1990
  "readOnly": true,
1984
1991
  "workScopes": [["Files.Read.All", "Sites.Read.All"], ["ExternalItem.Read.All"]],
@@ -2015,7 +2022,7 @@
2015
2022
  }
2016
2023
  }
2017
2024
  },
2018
- "llmTip": "Semantic/hybrid search over Microsoft 365 content via the Copilot Retrieval API. Grounds a natural-language query against the same hybrid index that powers Microsoft 365 Copilot and returns permission-trimmed text extracts with their source URLs — unlike search-query/search-onedrive-files/search-sharepoint-sites, which are lexical KQL. Prefer this for paraphrase/intent queries (e.g. resolving an informal project nickname, or matching 'packaging requirements' against text that never uses that phrase). Pass the request fields nested under a 'body' object: { queryString, dataSource, filterExpression?, resourceMetadata?, maximumNumberOfResults? }. Returns { retrievalHits: [{ webUrl, extracts: [{ text, relevanceScore }], resourceType, resourceMetadata, sensitivityLabel? }] }. Work/school accounts only (personal accounts are not supported). dataSource 'sharePoint'/'oneDriveBusiness' need delegated Files.Read.All + Sites.Read.All (requested by default); dataSource 'externalItem' (Copilot connectors) needs ExternalItem.Read.All, which is not requested by default - add it with --extra-scopes ExternalItem.Read.All."
2025
+ "llmTip": "Retrieval here is semantic/hybrid, unlike search-query/search-onedrive-files/search-sharepoint-sites, which are lexical KQL. Prefer this for paraphrase/intent queries (e.g. resolving an informal project nickname, or matching 'packaging requirements' against text that never uses that phrase). Pass the request fields nested under a 'body' object: { queryString, dataSource, filterExpression?, resourceMetadata?, maximumNumberOfResults? }. Returns { retrievalHits: [{ webUrl, extracts: [{ text, relevanceScore }], resourceType, resourceMetadata, sensitivityLabel? }] }. Work/school accounts only (personal accounts are not supported). dataSource 'sharePoint'/'oneDriveBusiness' need delegated Files.Read.All + Sites.Read.All (requested by default); dataSource 'externalItem' (Copilot connectors) needs ExternalItem.Read.All, which is not requested by default - add it with --extra-scopes ExternalItem.Read.All."
2019
2026
  },
2020
2027
  {
2021
2028
  "pathPattern": "/me/onlineMeetings",
@@ -2216,17 +2223,19 @@
2216
2223
  "pathPattern": "/places/{place-id}/graph.roomList/rooms",
2217
2224
  "method": "get",
2218
2225
  "toolName": "list-room-list-rooms",
2226
+ "descriptionOverride": "List the meeting rooms that belong to a room list.",
2219
2227
  "presets": ["calendar", "work"],
2220
2228
  "workScopes": ["Place.Read.All"],
2221
- "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."
2229
+ "llmTip": "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."
2222
2230
  },
2223
2231
  {
2224
2232
  "pathPattern": "/places/{place-id}/graph.roomList/rooms/{room-id}",
2225
2233
  "method": "get",
2226
2234
  "toolName": "get-room-list-room",
2235
+ "descriptionOverride": "Get a single meeting room from a room list, by room ID.",
2227
2236
  "presets": ["calendar", "work"],
2228
2237
  "workScopes": ["Place.Read.All"],
2229
- "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."
2238
+ "llmTip": "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."
2230
2239
  },
2231
2240
  {
2232
2241
  "pathPattern": "/places/{place-id}",