Public log

@softeria/ms-365-mcp-server

A Model Context Protocol (MCP) server for interacting with Microsoft 365 and Office services through the Graph API

npm · fingerprint 6941232229b4af3dbf4cee1e · repository · RSS

197tools
9recorded versions
45dtracked
changed today

What changed

Changed 2026-10-18 11:10 UTC

4 descriptions rewritten, 3 schema or annotation changes with the description left byte-identical.

--- pinned/get-todo-task
+++ observed/get-todo-task
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Read the properties and relationships of a todoTask object.\n\n💡 TIP: 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.",
+   "description": "Read the properties and relationships of a todoTask object.\n\n💡 TIP: Returns a single To Do task. Use $expand=linkedResources to include linked email/resource. Returns body content (HTML format), checklist items, and linked resources.",
    "execution": {
      "taskSupport": "forbidden"
    },
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
-         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
+         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export.",
          "type": "boolean"
        },
        "includeHeaders": {
-       "select": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
-       },
        "todoTaskId": {
          "description": "Value for the 'todoTaskId' path segment. Pass it under the name 'todoTaskId', not as 'id'. Use the 'id' field of the todo task object as returned by Microsoft Graph.",
          "type": "string"
--- pinned/list-calendar-events-delta
+++ observed/list-calendar-events-delta
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
+         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export.",
          "type": "boolean"
        },
        "includeHeaders": {
--- pinned/list-calendar-view-delta
+++ observed/list-calendar-view-delta
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
+         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export.",
          "type": "boolean"
        },
        "includeHeaders": {
--- pinned/list-todo-checklist-items
+++ observed/list-todo-checklist-items
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Get the checklistItem resources associated to a todoTask from the checklistItems navigation property.\n\n💡 TIP: Lists the steps (checklist items) of a To Do task. Each item has id, displayName, isChecked, checkedDateTime, and createdDateTime. Graph supports no OData query parameters on this endpoint, so do not pass select, filter, orderby, or top. Requires todoTaskListId from list-todo-task-lists and todoTaskId from list-todo-tasks.",
+   "description": "Get the checklistItem resources associated to a todoTask from the checklistItems navigation property.\n\n💡 TIP: Lists the steps (checklist items) of a To Do task. Each item has id, displayName, isChecked, checkedDateTime, and createdDateTime. Requires todoTaskListId from list-todo-task-lists and todoTaskId from list-todo-tasks.",
    "execution": {
      "taskSupport": "forbidden"
    },
-       "count": {
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
-         "type": "boolean"
-       },
        "excludeResponse": {
          "description": "Exclude the full response body and only return success or failure indication",
          "type": "boolean"
-       "expand": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
-       },
        "fetchAllPages": {
-         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
+         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export.",
          "type": "boolean"
        },
-       "filter": {
-         "description": "OData filter expression. Add $count=true for advanced filters (flag/flagStatus, contains()). Cannot combine with $search.",
-         "type": "string"
-       },
        "includeHeaders": {
          "description": "Include response headers (including ETag) in the response metadata",
          "type": "boolean"
-       "orderby": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Sort expression, e.g. receivedDateTime desc"
-       },
-       "search": {
-         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
-         "type": "string"
-       },
-       "select": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
-       },
-       "skip": {
-         "description": "Items to skip for pagination. Not supported with $search.",
-         "minimum": 0,
-         "type": "integer"
-       },
-       "skiptoken": {
-         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
-         "type": "string"
-       },
        "todoTaskId": {
          "description": "Value for the 'todoTaskId' path segment. Pass it under the name 'todoTaskId', not as 'id'. Use the 'id' field of the todo task object as returned by Microsoft Graph.",
          "type": "string"
-       },
-       "top": {
-         "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "minimum": 0,
-         "type": "integer"
        }
      },
      "required": [
--- pinned/list-todo-linked-resources
+++ observed/list-todo-linked-resources
  {
    "annotations": {
      "destructiveHint": false,
-       "count": {
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
-         "type": "boolean"
-       },
        "excludeResponse": {
          "description": "Exclude the full response body and only return success or failure indication",
          "type": "boolean"
-       "expand": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
-       },
        "fetchAllPages": {
-         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
+         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter.",
          "type": "boolean"
        },
        "filter": {
-         "description": "OData filter expression. Add $count=true for advanced filters (flag/flagStatus, contains()). Cannot combine with $search.",
+         "description": "OData filter expression.",
          "type": "string"
        },
        "includeHeaders": {
-       "search": {
-         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
-         "type": "string"
-       },
-       "select": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
-       },
        "skip": {
-         "description": "Items to skip for pagination. Not supported with $search.",
+         "description": "Items to skip for pagination.",
          "minimum": 0,
          "type": "integer"
        },
-         "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
+         "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. For more rows, use @odata.nextLink from the response instead of a very large $top.",
          "minimum": 0,
          "type": "integer"
        }
--- pinned/list-todo-task-lists
+++ observed/list-todo-task-lists
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Get a list of the todoTaskList objects and their properties.\n\n💡 TIP: 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.",
+   "description": "Get a list of the todoTaskList objects and their properties.\n\n💡 TIP: Lists all To Do task lists. Returns todoTaskList-id needed for all task operations. The default list is typically called 'Tasks'.",
    "execution": {
      "taskSupport": "forbidden"
    },
-       "count": {
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
-         "type": "boolean"
-       },
        "excludeResponse": {
          "description": "Exclude the full response body and only return success or failure indication",
          "type": "boolean"
-       "expand": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
-       },
        "fetchAllPages": {
-         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
+         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter.",
          "type": "boolean"
        },
        "filter": {
-         "description": "OData filter expression. Add $count=true for advanced filters (flag/flagStatus, contains()). Cannot combine with $search.",
+         "description": "OData filter expression.",
          "type": "string"
        },
        "includeHeaders": {
-       "orderby": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Sort expression, e.g. receivedDateTime desc"
-       },
-       "search": {
-         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
-         "type": "string"
-       },
-       "select": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
-       },
        "skip": {
-         "description": "Items to skip for pagination. Not supported with $search.",
+         "description": "Items to skip for pagination.",
          "minimum": 0,
          "type": "integer"
        },
-         "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
+         "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. For more rows, use @odata.nextLink from the response instead of a very large $top.",
          "minimum": 0,
          "type": "integer"
        }
--- pinned/list-todo-tasks
+++ observed/list-todo-tasks
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Get the todoTask resources from the tasks navigation property of a specified todoTaskList.\n\n💡 TIP: 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'.",
+   "description": "Get the todoTask resources from the tasks navigation property of a specified todoTaskList.\n\n💡 TIP: Lists tasks in a To Do list. Requires todoTaskList-id — use list-todo-task-lists to find it. 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'. $orderby works on createdDateTime, lastModifiedDateTime, importance, status and reminderDateTime/dateTime, not on title or isReminderOn. A $filter on isReminderOn can also return 400; filter it client-side.",
    "execution": {
      "taskSupport": "forbidden"
    },
-       "count": {
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
-         "type": "boolean"
-       },
        "excludeResponse": {
          "description": "Exclude the full response body and only return success or failure indication",
          "type": "boolean"
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
-         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
+         "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter.",
          "type": "boolean"
        },
        "filter": {
-         "description": "OData filter expression. Add $count=true for advanced filters (flag/flagStatus, contains()). Cannot combine with $search.",
+         "description": "OData filter expression.",
          "type": "string"
        },
        "includeHeaders": {
-       "search": {
-         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
-         "type": "string"
-       },
-       "select": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
-       },
        "skip": {
-         "description": "Items to skip for pagination. Not supported with $search.",
+         "description": "Items to skip for pagination.",
          "minimum": 0,
          "type": "integer"
        },
-         "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
+         "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. For more rows, use @odata.nextLink from the response instead of a very large $top.",
          "minimum": 0,
          "type": "integer"
        }

Changed 2026-10-17 10:58 UTC

1 description rewritten, 1 schema or annotation change with the description left byte-identical, 1 tool added.

--- pinned/list-calendar-events-delta
+++ observed/list-calendar-events-delta
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Get a set of event resources that have been added, deleted, or updated in a calendarView (a range of events defined by start and end dates) of the user's primary calendar. Typically, synchronizing events in a calendarView in a local store entails a round of multiple delta function calls. The initial call is a full synchronization, and every subsequent delta call in the same round gets the incremental changes (additions, deletions, or updates). This allows you to maintain and synchronize a local store of events in the specified calendarView, without having to fetch all the events of that calendar from the server every time.\n\n💡 TIP: 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.",
+   "description": "Get a set of event resources that have been added, deleted, or updated in a calendarView (a range of events defined by start and end dates) of the user's primary calendar. Typically, synchronizing events in a calendarView in a local store entails a round of multiple delta function calls. The initial call is a full synchronization, and every subsequent delta call in the same round gets the incremental changes (additions, deletions, or updates). This allows you to maintain and synchronize a local store of events in the specified calendarView, without having to fetch all the events of that calendar from the server every time.\n\n💡 TIP: 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. 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.",
    "execution": {
      "taskSupport": "forbidden"
    },
-       "count": {
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
-         "type": "boolean"
-       },
-       "endDateTime": {
-         "description": "The end date and time of the time range in the function, represented in ISO 8601 format. For example, 2019-11-08T20:00:00-08:00",
-         "type": "string"
-       },
        "excludeResponse": {
          "description": "Exclude the full response body and only return success or failure indication",
          "type": "boolean"
-       "expand": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
-       },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
          "type": "boolean"
-       "filter": {
-         "description": "OData filter expression. Add $count=true for advanced filters (flag/flagStatus, contains()). Cannot combine with $search.",
-         "type": "string"
-       },
        "includeHeaders": {
          "description": "Include response headers (including ETag) in the response metadata",
          "type": "boolean"
-       "orderby": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Sort expression, e.g. receivedDateTime desc"
-       },
-       "search": {
-         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
-         "type": "string"
-       },
-       "select": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
-       },
-       "skip": {
-         "description": "Items to skip for pagination. Not supported with $search.",
-         "minimum": 0,
-         "type": "integer"
-       },
        "skiptoken": {
          "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
          "type": "string"
-       "startDateTime",
-       "endDateTime"
+       "startDateTime"
      ],
      "type": "object"
    },
--- pinned/list-calendar-view-delta
+++ observed/list-calendar-view-delta
  {
    "annotations": {
      "destructiveHint": false,
-       "count": {
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
-         "type": "boolean"
-       },
        "endDateTime": {
          "description": "The end date and time of the time range in the function, represented in ISO 8601 format. For example, 2019-11-08T20:00:00-08:00",
          "type": "string"
-       "expand": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
-       },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
          "type": "boolean"
-       "filter": {
-         "description": "OData filter expression. Add $count=true for advanced filters (flag/flagStatus, contains()). Cannot combine with $search.",
-         "type": "string"
-       },
        "includeHeaders": {
          "description": "Include response headers (including ETag) in the response metadata",
          "type": "boolean"
-       "orderby": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Sort expression, e.g. receivedDateTime desc"
-       },
-       "search": {
-         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
-         "type": "string"
-       },
-       "select": {
-         "anyOf": [
-           {
-             "type": "string"
-           },
-           {
-             "items": {
-               "type": "string"
-             },
-             "type": "array"
-           }
-         ],
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
-       },
-       "skip": {
-         "description": "Items to skip for pagination. Not supported with $search.",
-         "minimum": 0,
-         "type": "integer"
-       },
        "skiptoken": {
          "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
          "type": "string"

+ tool added: read-mail-text

Changed 2026-10-14 12:08 UTC

3 descriptions rewritten, 1 schema or annotation change with the description left byte-identical, 5 tools added.

+ tool added: create-todo-checklist-item

--- pinned/create-todo-task
+++ observed/create-todo-task
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Create a new task object in a specified todoTaskList.\n\n💡 TIP: Creates a new task in a Microsoft To Do list. Body: { title: \"...\" }; optional dueDateTime, reminderDateTime, importance, body (notes), recurrence, categories. Requires todoTaskListId from list-todo-task-lists.",
+   "description": "Create a new task object in a specified todoTaskList.\n\n💡 TIP: Creates a new task in a Microsoft To Do list. Body: { title: \"...\" }; optional dueDateTime, reminderDateTime, importance, body (notes), recurrence, categories, and checklistItems: [{ displayName: \"...\", isChecked: false }] to create the task's steps inline (isChecked is optional). Requires todoTaskListId from list-todo-task-lists. To change steps after the task exists, use the *-todo-checklist-item tools.",
    "execution": {
      "taskSupport": "forbidden"
    },

+ tool added: delete-todo-checklist-item

--- pinned/download-bytes
+++ observed/download-bytes
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Download binary content from Microsoft Graph and return it as base64. Single tool for any binary read: drive file content, mail attachment, profile photo, Teams hosted content, meeting recording. Returns { contentType, encoding: \"base64\", contentLength, contentBytes }. For large drive/SharePoint file content, prefer get-download-url, which returns a pre-authenticated URL to stream bytes out-of-band instead of base64 through the agent context.",
+   "description": "Download binary content from Microsoft Graph and return it as base64. Single tool for any binary read: drive file content, mail attachment, profile photo, Teams hosted content, meeting recording. Returns { contentType, encoding: \"base64\", contentLength, contentBytes }. For large drive/SharePoint file content, prefer get-download-url, which returns a pre-authenticated URL to stream bytes out-of-band instead of base64 through the agent context. With the server's blob output on, the bytes come back as a file resource instead (capped by the server's download limit); pass fileName to name it.",
    "execution": {
      "taskSupport": "forbidden"
    },
+       "fileName": {
+         "description": "Name of the file, used as the last segment of the returned resource URI when the server runs with blob output. Optional.",
+         "type": "string"
+       },
        "target": {
          "description": "Relative Microsoft Graph path starting with \"/\". Common paths: /drives/{drive-id}/items/{driveItem-id}/content (drive file content); /me/messages/{message-id}/attachments/{attachment-id}/$value (mail attachment, list-mail-attachments returns the IDs); /me/photo/$value or /users/{user-id}/photo/$value (profile photo); /chats/{chat-id}/messages/{chatMessage-id}/hostedContents/{chatMessageHostedContent-id}/$value (Teams chat hosted content, list-chat-message-hosted-contents returns the IDs); /teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}/hostedContents/{chatMessageHostedContent-id}/$value (Teams channel hosted content). For meeting recordings, use get-meeting-recording-content where available; Microsoft Graph returns authenticated recording bytes, not a pre-authenticated download URL.",
          "type": "string"

+ tool added: get-mail-attachment-content

--- pinned/get-mail-message-mime
+++ observed/get-mail-message-mime
  {
    "annotations": {
      "destructiveHint": false,
+       "fileName": {
+         "description": "Name of the file, used as the last segment of the returned resource URI when the server runs with blob output. Optional.",
+         "type": "string"
+       },
        "includeHeaders": {
          "description": "Include response headers (including ETag) in the response metadata",
          "type": "boolean"

+ tool added: list-todo-checklist-items

+ tool added: update-todo-checklist-item

--- pinned/update-todo-task
+++ observed/update-todo-task
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Update the properties of a todoTask object.\n\n💡 TIP: Updates a Microsoft To Do task. Use this to mark a to-do item complete or done (body: { status: \"completed\" }), reopen it (status: \"notStarted\"), rename it (title), or change its due date (dueDateTime), reminder (reminderDateTime), importance, or notes (body). Requires todoTaskListId from list-todo-task-lists and todoTaskId from list-todo-tasks.",
+   "description": "Update the properties of a todoTask object.\n\n💡 TIP: Updates a Microsoft To Do task. Use this to mark a to-do item complete or done (body: { status: \"completed\" }), reopen it (status: \"notStarted\"), rename it (title), or change its due date (dueDateTime), reminder (reminderDateTime), importance, or notes (body). Requires todoTaskListId from list-todo-task-lists and todoTaskId from list-todo-tasks. Steps (checklistItems) can't be changed here: Graph rejects checklistItems in a PATCH on the task with 400. Use create-todo-checklist-item, update-todo-checklist-item, or delete-todo-checklist-item instead.",
    "execution": {
      "taskSupport": "forbidden"
    },

Changed 2026-10-12 15:40 UTC

64 schema or annotation changes with the description left byte-identical, 2 tools added.

+ tool added: add-calendar-event-attachment

+ tool added: create-calendar-event-attachment-upload-session

--- pinned/get-calendar-event
+++ observed/get-calendar-event
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
--- pinned/get-calendar-view
+++ observed/get-calendar-view
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "endDateTime": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
--- pinned/get-current-user
+++ observed/get-current-user
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-drive-delta
+++ observed/get-drive-delta
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "driveId": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-drive-item
+++ observed/get-drive-item
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-drive-root-item
+++ observed/get-drive-root-item
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-excel-range-format
+++ observed/get-excel-range-format
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-excel-table
+++ observed/get-excel-table
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-mail-message
+++ observed/get-mail-message
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-mailbox-settings
+++ observed/get-mailbox-settings
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-my-profile
+++ observed/get-my-profile
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-outlook-contact
+++ observed/get-outlook-contact
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-planner-bucket
+++ observed/get-planner-bucket
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-planner-plan
+++ observed/get-planner-plan
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-planner-task
+++ observed/get-planner-task
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-planner-task-details
+++ observed/get-planner-task-details
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/get-specific-calendar-event
+++ observed/get-specific-calendar-event
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
--- pinned/get-specific-calendar-view
+++ observed/get-specific-calendar-view
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "endDateTime": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
--- pinned/get-todo-task
+++ observed/get-todo-task
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-all-onenote-sections
+++ observed/list-all-onenote-sections
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-calendar-event-instances
+++ observed/list-calendar-event-instances
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "endDateTime": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
--- pinned/list-calendar-events
+++ observed/list-calendar-events
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
--- pinned/list-calendar-events-delta
+++ observed/list-calendar-events-delta
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "endDateTime": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-calendar-view-delta
+++ observed/list-calendar-view-delta
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "endDateTime": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-calendars
+++ observed/list-calendars
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-contact-folder-child-folders
+++ observed/list-contact-folder-child-folders
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-contact-folder-contacts
+++ observed/list-contact-folder-contacts
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-contact-folders
+++ observed/list-contact-folders
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-drive-item-permissions
+++ observed/list-drive-item-permissions
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "driveId": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-drive-item-thumbnails
+++ observed/list-drive-item-thumbnails
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "driveId": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-drive-item-versions
+++ observed/list-drive-item-versions
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "driveId": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-drives
+++ observed/list-drives
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-excel-table-rows
+++ observed/list-excel-table-rows
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "driveId": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-excel-tables
+++ observed/list-excel-tables
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "driveId": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-excel-worksheets
+++ observed/list-excel-worksheets
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "driveId": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-focused-inbox-overrides
+++ observed/list-focused-inbox-overrides
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-folder-files
+++ observed/list-folder-files
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "driveId": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-mail-attachments
+++ observed/list-mail-attachments
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-mail-child-folders
+++ observed/list-mail-child-folders
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-mail-folder-messages
+++ observed/list-mail-folder-messages
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-mail-folder-messages-delta
+++ observed/list-mail-folder-messages-delta
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-mail-folders
+++ observed/list-mail-folders
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-mail-messages
+++ observed/list-mail-messages
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-mail-rules
+++ observed/list-mail-rules
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-my-calendar-permissions
+++ observed/list-my-calendar-permissions
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-onenote-notebook-sections
+++ observed/list-onenote-notebook-sections
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-onenote-notebooks
+++ observed/list-onenote-notebooks
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-onenote-pages
+++ observed/list-onenote-pages
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-onenote-section-groups
+++ observed/list-onenote-section-groups
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-onenote-section-pages
+++ observed/list-onenote-section-pages
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-outlook-categories
+++ observed/list-outlook-categories
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-outlook-contacts
+++ observed/list-outlook-contacts
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-plan-buckets
+++ observed/list-plan-buckets
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-plan-tasks
+++ observed/list-plan-tasks
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-planner-task-messages
+++ observed/list-planner-task-messages
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-planner-tasks
+++ observed/list-planner-tasks
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-specific-calendar-events
+++ observed/list-specific-calendar-events
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
--- pinned/list-subscriptions
+++ observed/list-subscriptions
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-supported-languages
+++ observed/list-supported-languages
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
--- pinned/list-supported-time-zones
+++ observed/list-supported-time-zones
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
--- pinned/list-todo-linked-resources
+++ observed/list-todo-linked-resources
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-todo-task-lists
+++ observed/list-todo-task-lists
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/list-todo-tasks
+++ observed/list-todo-tasks
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "excludeResponse": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
--- pinned/search-onedrive-files
+++ observed/search-onedrive-files
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains().",
+         "description": "Set true to enable advanced query mode (ConsistencyLevel: eventual). Required for complex $filter on flag/flagStatus or contains(). The response then includes @odata.count, the total for the filtered collection, which can exceed the items returned when fetchAllPages hits its page/item cap.",
          "type": "boolean"
        },
        "driveId": {
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\". Request ordinary fields with $select instead. Some APIs accept only one relationship per request, so prefer a single value. Some relationships support nested selection, e.g. children($select=id,name)."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",

Changed 2026-10-08 13:45 UTC

1 tool added.

+ tool added: get-upload-url

Changed 2026-10-07 13:39 UTC

2 schema or annotation changes with the description left byte-identical.

--- pinned/create-subscription
+++ observed/create-subscription
  {
    "annotations": {
      "destructiveHint": true,
+           },
+           "vapidPublicKey": {
+             "description": "Optional. The application server's VAPID public key, base64url-encoded (P-256 uncompressed point, 65 bytes pre-encoding). Obtained by calling the getVapidPublicKey function on the subscription collection. The browser passes this value to PushManager.subscribe({ applicationServerKey: vapidPublicKey }) to bind the push subscription to this server identity. Required when notificationUrl targets a known Web Push service origin (for example, *.push.apple.com, fcm.googleapis.com, updates.push.services.mozilla.com); rejected with 400 Bad Request if supplied on a standard webhook subscription. For more information, see RFC 8292.",
+             "type": [
+               "string",
+               "null"
+             ]
+           },
+           "webPushEncryptionP256dhPublicKey": {
+             "description": "Optional. The subscriber's ECDH public key, base64url-encoded (P-256 uncompressed point, 65 bytes pre-encoding). Obtained from the browser via PushSubscription.getKey('p256dh'). Used as the peer public key during ECDH key agreement to derive the per-message content encryption key for RFC 8291 payload encryption. Required when notificationUrl targets a known Web Push service origin; rejected with 400 Bad Request if supplied on a standard webhook subscription. For more information, see RFC 8291 Section 3.",
+             "type": [
+               "string",
+               "null"
+             ]
+           },
+           "webPushEncryptionSecret": {
+             "description": "Optional. The subscriber's auth secret, base64url-encoded (16 bytes pre-encoding). Obtained from the browser via PushSubscription.getKey('auth'). Used as the HMAC-SHA-256 salt for the HKDF combine step that derives key material for RFC 8291 payload encryption. Write-only: this value is never returned in GET responses (returned as null). Treat as a secret. Required when notificationUrl targets a known Web Push service origin; rejected with 400 Bad Request if supplied on a standard webhook subscription. For more information, see RFC 8291 Section 3.",
+             "type": [
+               "string",
+               "null"
+             ]
            }
          },
          "type": "object"
--- pinned/update-subscription
+++ observed/update-subscription
  {
    "annotations": {
      "destructiveHint": true,
+           },
+           "vapidPublicKey": {
+             "description": "Optional. The application server's VAPID public key, base64url-encoded (P-256 uncompressed point, 65 bytes pre-encoding). Obtained by calling the getVapidPublicKey function on the subscription collection. The browser passes this value to PushManager.subscribe({ applicationServerKey: vapidPublicKey }) to bind the push subscription to this server identity. Required when notificationUrl targets a known Web Push service origin (for example, *.push.apple.com, fcm.googleapis.com, updates.push.services.mozilla.com); rejected with 400 Bad Request if supplied on a standard webhook subscription. For more information, see RFC 8292.",
+             "type": [
+               "string",
+               "null"
+             ]
+           },
+           "webPushEncryptionP256dhPublicKey": {
+             "description": "Optional. The subscriber's ECDH public key, base64url-encoded (P-256 uncompressed point, 65 bytes pre-encoding). Obtained from the browser via PushSubscription.getKey('p256dh'). Used as the peer public key during ECDH key agreement to derive the per-message content encryption key for RFC 8291 payload encryption. Required when notificationUrl targets a known Web Push service origin; rejected with 400 Bad Request if supplied on a standard webhook subscription. For more information, see RFC 8291 Section 3.",
+             "type": [
+               "string",
+               "null"
+             ]
+           },
+           "webPushEncryptionSecret": {
+             "description": "Optional. The subscriber's auth secret, base64url-encoded (16 bytes pre-encoding). Obtained from the browser via PushSubscription.getKey('auth'). Used as the HMAC-SHA-256 salt for the HKDF combine step that derives key material for RFC 8291 payload encryption. Write-only: this value is never returned in GET responses (returned as null). Treat as a secret. Required when notificationUrl targets a known Web Push service origin; rejected with 400 Bad Request if supplied on a standard webhook subscription. For more information, see RFC 8291 Section 3.",
+             "type": [
+               "string",
+               "null"
+             ]
            }
          },
          "type": "object"

Changed 2026-10-05 14:48 UTC

12 descriptions rewritten, 64 schema or annotation changes with the description left byte-identical.

--- pinned/create-calendar-event
+++ observed/create-calendar-event
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Create (schedule) a new calendar event — a meeting or appointment — on the user's calendar. Set subject, start/end times, time zone, location, body, and attendees; supports online meetings and recurrence.\n\n💡 TIP: 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.",
+   "description": "Create (schedule) a new calendar event — a meeting or appointment — on the user's calendar. Times use nested objects, not flat fields: start: {dateTime, timeZone}, end: {dateTime, timeZone}. Do NOT use startDateTime/startTimeZone. For one-off events, UTC is simplest (e.g. 3:30 PM AEDT = 04:30 UTC). For recurring events, use the organizer's own time zone name instead — Graph resolves DST against the zone in start.timeZone, so UTC drifts after DST changes. Get the zone from get-mailbox-settings, or validate one with list-supported-time-zones instead of guessing from memory. Set subject, location, body, and attendees; supports online meetings and recurrence.\n\n💡 TIP: 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.",
    "execution": {
      "taskSupport": "forbidden"
    },
--- pinned/create-onedrive-folder
+++ observed/create-onedrive-folder
  {
    "annotations": {
      "destructiveHint": true,
-             "description": "[Note: Simplified from 137 properties to 25 most common ones]",
+             "description": "[Note: Simplified from 138 properties to 25 most common ones]",
              "properties": {
                "aboutMe": {
                  "description": "A freeform text entry field for the user to describe themselves. Requires $select to retrieve.",
-             "description": "[Note: Simplified from 137 properties to 25 most common ones]",
+             "description": "[Note: Simplified from 138 properties to 25 most common ones]",
              "properties": {
                "aboutMe": {
                  "description": "A freeform text entry field for the user to describe themselves. Requires $select to retrieve.",
--- pinned/create-specific-calendar-event
+++ observed/create-specific-calendar-event
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Use this API to create a new event in a calendar. The calendar can be one for a user, or the default calendar of a Microsoft 365 group.\n\n💡 TIP: 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.",
+   "description": "Create a calendar event on a specific calendar. Requires calendarId (the target calendar's ID). Times use nested {dateTime, timeZone} objects — do NOT use startDateTime/startTimeZone. UTC is simplest for one-off events; for recurring events use the organizer's own time zone (from get-mailbox-settings or list-supported-time-zones) instead of UTC, since Graph resolves DST against that zone.\n\n💡 TIP: 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.",
    "execution": {
      "taskSupport": "forbidden"
    },
--- pinned/delete-specific-calendar-event
+++ observed/delete-specific-calendar-event
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Delete a specific calendar event.\n\n💡 TIP: Deleting a seriesMaster deletes ALL occurrences. To cancel a single occurrence, use the specific instance ID.",
+   "description": "Delete a specific calendar event. Requires calendarId (the target calendar's ID) and eventId (the event's own ID).\n\n💡 TIP: Deleting a seriesMaster deletes ALL occurrences. To cancel a single occurrence, use the specific instance ID.",
    "execution": {
      "taskSupport": "forbidden"
    },
--- pinned/download-bytes-to-file
+++ observed/download-bytes-to-file
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Write authenticated Microsoft Graph byte content to a local file on the server, returning { path, contentType, bytesWritten } instead of base64. The only out-of-band way to save mail attachments and meeting recordings, whose bytes are exposed solely through authenticated endpoints. Also handles profile photos and Teams hosted content. Writes to an absolute outputPath and never overwrites an existing file. stdio mode only: not available over HTTP. For OneDrive or SharePoint file content, get-download-url is preferred — it returns a pre-authenticated URL for fully out-of-band download without the server fetching the bytes.",
+   "description": "Write authenticated Microsoft Graph byte content to a local file on the server, returning { path, contentType, bytesWritten } instead of base64. The only out-of-band way to save mail attachments and meeting recordings, whose bytes are exposed solely through authenticated endpoints. Also handles profile photos and Teams hosted content. Writes to an absolute outputPath and never overwrites an existing file. stdio mode, or HTTP with --http-local-file-tools. For OneDrive or SharePoint file content, get-download-url is preferred — it returns a pre-authenticated URL for fully out-of-band download without the server fetching the bytes.",
    "execution": {
      "taskSupport": "forbidden"
    },
--- pinned/get-calendar-event
+++ observed/get-calendar-event
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "timezone": {
          "description": "IANA timezone name (e.g., \"America/New_York\", \"Europe/London\", \"Asia/Tokyo\") for calendar event times. If not specified, times are returned in UTC.",
--- pinned/get-calendar-view
+++ observed/get-calendar-view
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "startDateTime": {
          "description": "The start date and time of the time range, represented in ISO 8601 format. For example, 2019-11-08T19:00:00-08:00",
          "type": "string"
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/get-current-user
+++ observed/get-current-user
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        }
      },
      "type": "object"
--- pinned/get-download-url
+++ observed/get-download-url
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Resolve a short-lived, pre-authenticated download URL for Microsoft Graph binary content that exposes one (drive/SharePoint file content). The returned URL streams the bytes with NO Authorization header, so the client can fetch it straight to disk (e.g. curl) without round-tripping base64 through the agent context. Prefer this over download-bytes for any file above a few KB or any bulk download. Returns { downloadUrl, name?, size?, contentType? }. NOTE: mail file attachments (/messages/{id}/attachments/{id}/$value) and meeting recordings do NOT expose a pre-authenticated URL — Graph offers no such link for them; use download-bytes for small ones.",
+   "description": "Resolve a short-lived, pre-authenticated download URL for Microsoft Graph binary content that exposes one (drive/SharePoint file content). The returned URL streams the bytes with NO Authorization header, so the client can fetch it straight to disk (e.g. curl) without round-tripping base64 through the agent context. Prefer this over download-bytes for any file above a few KB or any bulk download. Returns { downloadUrl, name?, size?, contentType? }. Mail file attachments (/messages/{id}/attachments/{id}/$value), meeting recordings and other $value byte endpoints have no pre-authenticated URL from Graph itself, but call this tool for them anyway: a server running with --enable-attachment-urls mints its own single-use URL for them, and one without it answers with the reason and points at download-bytes.",
    "execution": {
      "taskSupport": "forbidden"
    },
-         "description": "Relative Microsoft Graph path starting with \"/\". Either a driveItem content path or the item path itself, e.g. /drives/{drive-id}/items/{driveItem-id}/content, /me/drive/items/{driveItem-id}/content, or /sites/{site-id}/drive/items/{driveItem-id}. A trailing /content is optional and is stripped automatically for drive items. Mail attachment $value paths and meeting recordings are not supported (Graph exposes no pre-authenticated URL for them).",
+         "description": "Relative Microsoft Graph path starting with \"/\". Either a driveItem content path or the item path itself, e.g. /drives/{drive-id}/items/{driveItem-id}/content, /me/drive/items/{driveItem-id}/content, or /sites/{site-id}/drive/items/{driveItem-id}. A trailing /content is optional and is stripped automatically for drive items. Mail attachment $value paths and meeting recordings are accepted on a server running with --enable-attachment-urls.",
          "type": "string"
        }
      },
--- pinned/get-drive-delta
+++ observed/get-drive-delta
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/get-drive-item
+++ observed/get-drive-item
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        }
      },
      "required": [
--- pinned/get-drive-root-item
+++ observed/get-drive-root-item
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        }
      },
      "required": [
--- pinned/get-excel-range-format
+++ observed/get-excel-range-format
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "workbookWorksheetId": {
          "description": "Value for the 'workbookWorksheetId' path segment. Pass it under the name 'workbookWorksheetId', not as 'id'. Use the 'id' field of the workbook worksheet object as returned by Microsoft Graph.",
--- pinned/get-excel-table
+++ observed/get-excel-table
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "workbookTableId": {
          "description": "Value for the 'workbookTableId' path segment. Pass it under the name 'workbookTableId', not as 'id'. Use the 'id' field of the workbook table object as returned by Microsoft Graph.",
--- pinned/get-mail-message
+++ observed/get-mail-message
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        }
      },
      "required": [
--- pinned/get-mail-message-mime
+++ observed/get-mail-message-mime
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Download the raw MIME source (RFC 822 .eml content) of an Outlook email message by its message ID. Returns the complete original message including headers and encoded attachments.\n\n💡 TIP: 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.",
+   "description": "Download the raw MIME source (RFC 5322 .eml content) of an Outlook email message by its message ID. Returns the complete original message including headers and encoded attachments.\n\n💡 TIP: 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.",
    "execution": {
      "taskSupport": "forbidden"
    },
--- pinned/get-mailbox-settings
+++ observed/get-mailbox-settings
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        }
      },
      "type": "object"
--- pinned/get-my-profile
+++ observed/get-my-profile
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        }
      },
      "type": "object"
--- pinned/get-outlook-contact
+++ observed/get-outlook-contact
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        }
      },
      "required": [
--- pinned/get-planner-bucket
+++ observed/get-planner-bucket
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        }
      },
      "required": [
--- pinned/get-planner-plan
+++ observed/get-planner-plan
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        }
      },
      "required": [
--- pinned/get-planner-task
+++ observed/get-planner-task
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        }
      },
      "required": [
--- pinned/get-planner-task-details
+++ observed/get-planner-task-details
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        }
      },
      "required": [
--- pinned/get-specific-calendar-event
+++ observed/get-specific-calendar-event
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "timezone": {
          "description": "IANA timezone name (e.g., \"America/New_York\", \"Europe/London\", \"Asia/Tokyo\") for calendar event times. If not specified, times are returned in UTC.",
--- pinned/get-specific-calendar-view
+++ observed/get-specific-calendar-view
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "startDateTime": {
          "description": "The start date and time of the time range, represented in ISO 8601 format. For example, 2019-11-08T19:00:00-08:00",
          "type": "string"
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/get-subscription
+++ observed/get-subscription
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "subscriptionId": {
          "description": "Value for the 'subscriptionId' path segment. Pass it under the name 'subscriptionId', not as 'id'. Use the 'id' field of the subscription object as returned by Microsoft Graph.",
--- pinned/get-todo-task
+++ observed/get-todo-task
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "todoTaskId": {
          "description": "Value for the 'todoTaskId' path segment. Pass it under the name 'todoTaskId', not as 'id'. Use the 'id' field of the todo task object as returned by Microsoft Graph.",
--- pinned/list-all-onenote-sections
+++ observed/list-all-onenote-sections
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-calendar-event-instances
+++ observed/list-calendar-event-instances
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "startDateTime": {
          "description": "The start date and time of the time range, represented in ISO 8601 format. For example, 2019-11-08T19:00:00-08:00",
          "type": "string"
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-calendar-events
+++ observed/list-calendar-events
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "timezone": {
          "description": "IANA timezone name (e.g., \"America/New_York\", \"Europe/London\", \"Asia/Tokyo\") for calendar event times. If not specified, times are returned in UTC.",
          "type": "string"
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-calendar-events-delta
+++ observed/list-calendar-events-delta
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "startDateTime": {
          "description": "The start date and time of the time range in the function, represented in ISO 8601 format. For example, 2019-11-08T20:00:00-08:00",
          "type": "string"
--- pinned/list-calendar-view-delta
+++ observed/list-calendar-view-delta
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "startDateTime": {
          "description": "The start date and time of the time range in the function, represented in ISO 8601 format. For example, 2019-11-08T20:00:00-08:00",
          "type": "string"
+       },
+       "timezone": {
+         "description": "IANA timezone name (e.g., \"America/New_York\", \"Europe/London\", \"Asia/Tokyo\") for calendar event times. If not specified, times are returned in UTC.",
+         "type": "string"
        }
      },
      "required": [
--- pinned/list-calendars
+++ observed/list-calendars
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-contact-folder-child-folders
+++ observed/list-contact-folder-child-folders
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-contact-folder-contacts
+++ observed/list-contact-folder-contacts
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-contact-folders
+++ observed/list-contact-folders
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-drive-item-permissions
+++ observed/list-drive-item-permissions
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-drive-item-thumbnails
+++ observed/list-drive-item-thumbnails
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-drive-item-versions
+++ observed/list-drive-item-versions
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-drives
+++ observed/list-drives
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-excel-table-rows
+++ observed/list-excel-table-rows
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
        "workbookTableId": {
          "description": "Value for the 'workbookTableId' path segment. Pass it under the name 'workbookTableId', not as 'id'. Use the 'id' field of the workbook table object as returned by Microsoft Graph.",
--- pinned/list-excel-tables
+++ observed/list-excel-tables
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-excel-worksheets
+++ observed/list-excel-worksheets
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-focused-inbox-overrides
+++ observed/list-focused-inbox-overrides
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-folder-files
+++ observed/list-folder-files
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-mail-attachments
+++ observed/list-mail-attachments
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-mail-child-folders
+++ observed/list-mail-child-folders
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-mail-folder-messages
+++ observed/list-mail-folder-messages
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-mail-folder-messages-delta
+++ observed/list-mail-folder-messages-delta
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-mail-folders
+++ observed/list-mail-folders
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-mail-messages
+++ observed/list-mail-messages
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-mail-rules
+++ observed/list-mail-rules
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-my-calendar-permissions
+++ observed/list-my-calendar-permissions
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-onenote-notebook-sections
+++ observed/list-onenote-notebook-sections
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-onenote-notebooks
+++ observed/list-onenote-notebooks
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-onenote-pages
+++ observed/list-onenote-pages
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-onenote-section-groups
+++ observed/list-onenote-section-groups
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-onenote-section-pages
+++ observed/list-onenote-section-pages
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-outlook-categories
+++ observed/list-outlook-categories
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-outlook-contacts
+++ observed/list-outlook-contacts
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-plan-buckets
+++ observed/list-plan-buckets
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "plannerPlanId": {
          "description": "Value for the 'plannerPlanId' path segment. Pass it under the name 'plannerPlanId', not as 'id'. Use the 'id' field of the planner plan object as returned by Microsoft Graph.",
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-plan-tasks
+++ observed/list-plan-tasks
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Retrieve a list of plannerTask objects associated with a plannerPlan object.\n\n💡 TIP: Priority values: 0=Urgent, 1=Important, 3=Medium, 5=Low, 9=unset.",
+   "description": "Retrieve a list of plannerTask objects associated with a plannerPlan object.\n\n💡 TIP: Priority is 0-10 (lower = higher priority); Planner's own UI presets are 1=Urgent, 3=Important, 5=Medium, 9=Low.",
    "execution": {
      "taskSupport": "forbidden"
    },
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "plannerPlanId": {
          "description": "Value for the 'plannerPlanId' path segment. Pass it under the name 'plannerPlanId', not as 'id'. Use the 'id' field of the planner plan object as returned by Microsoft Graph.",
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-planner-task-messages
+++ observed/list-planner-task-messages
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "plannerTaskId": {
          "description": "Value for the 'plannerTaskId' path segment. Pass it under the name 'plannerTaskId', not as 'id'. Use the 'id' field of the planner task object as returned by Microsoft Graph.",
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-planner-tasks
+++ observed/list-planner-tasks
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Retrieve a list of plannertask objects assigned to a User.\n\n💡 TIP: Priority values: 0=Urgent, 1=Important, 3=Medium, 5=Low, 9=unset.",
+   "description": "Retrieve a list of plannertask objects assigned to a User.\n\n💡 TIP: Priority is 0-10 (lower = higher priority); Planner's own UI presets are 1=Urgent, 3=Important, 5=Medium, 9=Low.",
    "execution": {
      "taskSupport": "forbidden"
    },
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-specific-calendar-events
+++ observed/list-specific-calendar-events
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "expandExtendedProperties": {
          "description": "When true, expands singleValueExtendedProperties on each event. Use this to retrieve custom extended properties (e.g., sync metadata) stored on calendar events.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "timezone": {
          "description": "IANA timezone name (e.g., \"America/New_York\", \"Europe/London\", \"Asia/Tokyo\") for calendar event times. If not specified, times are returned in UTC.",
          "type": "string"
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-subscriptions
+++ observed/list-subscriptions
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-supported-languages
+++ observed/list-supported-languages
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "skip": {
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-supported-time-zones
+++ observed/list-supported-time-zones
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Get the list of time zones that are supported for the user, as configured on the user's mailbox server. You can explicitly specify to have time zones returned in the Windows time zone format or  Internet Assigned Numbers Authority (IANA) time zone (also known as Olson time zone) format. The Windows format is the default. When setting up an Outlook client, the user selects the preferred time zone from this supported list. You can subsequently get the preferred time zone by\ngetting the user's mailbox settings.\n\n💡 TIP: 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.",
+   "description": "Get the list of time zones that are supported for the user, as configured on the user's mailbox server. You can explicitly specify to have time zones returned in the Windows time zone format or  Internet Assigned Numbers Authority (IANA) time zone (also known as Olson time zone) format. The Windows format is the default. When setting up an Outlook client, the user selects the preferred time zone from this supported list. You can subsequently get the preferred time zone by\ngetting the user's mailbox settings.\n\n💡 TIP: 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, or before setting timeZone on a calendar event's start/end (especially for recurring events) — don't guess a time zone name from memory, look it up here.",
    "execution": {
      "taskSupport": "forbidden"
    },
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "skip": {
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-todo-linked-resources
+++ observed/list-todo-linked-resources
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "todoTaskId": {
          "description": "Value for the 'todoTaskId' path segment. Pass it under the name 'todoTaskId', not as 'id'. Use the 'id' field of the todo task object as returned by Microsoft Graph.",
          "type": "string"
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/list-todo-task-lists
+++ observed/list-todo-task-lists
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "type": "object"
--- pinned/list-todo-tasks
+++ observed/list-todo-tasks
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "search": {
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "todoTaskListId": {
          "description": "Value for the 'todoTaskListId' path segment. Pass it under the name 'todoTaskListId', not as 'id'. Use the 'id' field of the todo task list object as returned by Microsoft Graph.",
          "type": "string"
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/move-rename-onedrive-item
+++ observed/move-rename-onedrive-item
  {
    "annotations": {
      "destructiveHint": true,
-             "description": "[Note: Simplified from 137 properties to 25 most common ones]",
+             "description": "[Note: Simplified from 138 properties to 25 most common ones]",
              "properties": {
                "aboutMe": {
                  "description": "A freeform text entry field for the user to describe themselves. Requires $select to retrieve.",
-             "description": "[Note: Simplified from 137 properties to 25 most common ones]",
+             "description": "[Note: Simplified from 138 properties to 25 most common ones]",
              "properties": {
                "aboutMe": {
                  "description": "A freeform text entry field for the user to describe themselves. Requires $select to retrieve.",
--- pinned/search-onedrive-files
+++ observed/search-onedrive-files
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead.",
-         "items": {
-           "type": "string"
-         },
-         "type": "array"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Navigation properties to inline, e.g. attachments on a message or event. Only navigation properties can be expanded: expanding a non-navigation property such as a message body fails with \"Parsing OData Select and Expand failed\", and an unsupported value may be ignored rather than reported. Request ordinary fields with $select instead."
        },
        "fetchAllPages": {
          "description": "Follow @odata.nextLink and merge up to 100 pages into one response. Can return enormous payloads—only when the user explicitly needs a full export. Prefer a small $top first, then paginate or narrow with $filter/$search.",
-         "description": "Sort expression, e.g. receivedDateTime desc",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Sort expression, e.g. receivedDateTime desc"
        },
        "q": {
          "description": "Value for the 'q' path segment.",
-         "description": "KQL search query — wrap value in double quotes. Cannot combine with $filter.",
+         "description": "KQL search query in one pair of double quotes; directory (users/groups) instead quotes each clause with no outer pair. Cannot combine with $filter.",
          "type": "string"
        },
        "select": {
-         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime",
-         "type": "string"
+         "anyOf": [
+           {
+             "type": "string"
+           },
+           {
+             "items": {
+               "type": "string"
+             },
+             "type": "array"
+           }
+         ],
+         "description": "Comma-separated fields to return, e.g. id,subject,from,receivedDateTime"
        },
        "skip": {
          "description": "Items to skip for pagination. Not supported with $search.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        },
+       "skiptoken": {
+         "description": "Next page: the @odata.nextLink from the previous response. Keep the other arguments the same.",
+         "type": "string"
+       },
        "top": {
          "description": "Page size (Graph $top). Start small (e.g. 5–15) so responses fit the model context; raise only if needed. Use $select to return fewer fields per item. For more rows, use @odata.nextLink from the response instead of a very large $top.",
-         "type": "number"
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/update-calendar-event
+++ observed/update-calendar-event
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Update the properties of the event object.\n\n💡 TIP: 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.",
+   "description": "Update an event on the default calendar. Requires eventId (the event's ID from get-calendar-view or list-calendar-events). Times use nested {dateTime, timeZone} objects. UTC is simplest for one-off events; for recurring events use the organizer's own time zone (from get-mailbox-settings or list-supported-time-zones) instead of UTC, since Graph resolves DST against that zone.\n\n💡 TIP: 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.",
    "execution": {
      "taskSupport": "forbidden"
    },
--- pinned/update-planner-task
+++ observed/update-planner-task
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Update the properties of plannerTask object.\n\n💡 TIP: 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.",
+   "description": "Update the properties of plannerTask object.\n\n💡 TIP: 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 is 0-10 (lower = higher priority); Planner's own UI presets are 1=Urgent, 3=Important, 5=Medium, 9=Low.",
    "execution": {
      "taskSupport": "forbidden"
    },
--- pinned/update-specific-calendar-event
+++ observed/update-specific-calendar-event
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Update a specific calendar event.\n\n💡 TIP: 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.",
+   "description": "Update a specific calendar event. Requires calendarId (from list-calendars) and eventId (from list-specific-calendar-events or get-specific-calendar-view for that same calendar). Times use nested {dateTime, timeZone} objects. UTC is simplest for one-off events; for recurring events use the organizer's own time zone (from get-mailbox-settings or list-supported-time-zones) instead of UTC, since Graph resolves DST against that zone.\n\n💡 TIP: 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.",
    "execution": {
      "taskSupport": "forbidden"
    },

Changed 2026-09-04 10:48 UTC

2 descriptions rewritten.

--- pinned/get-calendar-view
+++ observed/get-calendar-view
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Get the occurrences, exceptions, and single instances of events in a calendar view defined by a time range, from the user's default calendar,\nor from some other calendar of the user.\n\n💡 TIP: Returns expanded recurring event instances (not just seriesMaster) within a date range for the default calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Use get-specific-calendar-view if you need a non-default calendar. To find Teams meetings, use $filter=isOnlineMeeting eq true. To search by subject, use $filter=contains(subject,'keyword'). Teams meetings expose their join link as onlineMeeting/joinUrl (select it with $select=onlineMeeting); the event resource has no joinWebUrl property. Pass that joinUrl to list-online-meetings as $filter=JoinWebUrl eq '{url}' to reach transcripts.",
+   "description": "Get the occurrences, exceptions, and single instances of events in a calendar view defined by a time range, from the user's default calendar,\nor from some other calendar of the user.\n\n💡 TIP: Returns expanded recurring event instances (not just seriesMaster) within a date range for the default calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Use get-specific-calendar-view if you need a non-default calendar. To find Teams meetings, use $select=subject,start,isOnlineMeeting,onlineMeetingProvider,onlineMeeting and keep the events with isOnlineMeeting true and onlineMeetingProvider teamsForBusiness; neither property is filterable (isOnlineMeeting returns 400 ErrorInvalidProperty). To search by subject, use $filter=contains(subject,'keyword'). Teams meetings expose their join link as onlineMeeting/joinUrl; the event resource has no joinWebUrl property. Pass that joinUrl to list-online-meetings as $filter=JoinWebUrl eq '{url}' to reach transcripts.",
    "execution": {
      "taskSupport": "forbidden"
    },
--- pinned/get-specific-calendar-view
+++ observed/get-specific-calendar-view
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "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.\n\n💡 TIP: Returns expanded recurring event instances (not just seriesMaster) within a date range for a specific calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Each instance includes seriesMasterId and type (occurrence/exception) fields for recurring event linkage. Use fetchAllPages=true to retrieve all results when there are many events. To find Teams meetings, use $filter=isOnlineMeeting eq true. Teams meetings expose their join link as onlineMeeting/joinUrl (select it with $select=onlineMeeting); the event resource has no joinWebUrl property. Pass that joinUrl to list-online-meetings as $filter=JoinWebUrl eq '{url}' to reach transcripts.",
+   "description": "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.\n\n💡 TIP: Returns expanded recurring event instances (not just seriesMaster) within a date range for a specific calendar. Requires startDateTime and endDateTime query parameters in ISO 8601 format (e.g., 2024-01-01T00:00:00Z). Each instance includes seriesMasterId and type (occurrence/exception) fields for recurring event linkage. Use fetchAllPages=true to retrieve all results when there are many events. To find Teams meetings, use $select=subject,start,isOnlineMeeting,onlineMeetingProvider,onlineMeeting and keep the events with isOnlineMeeting true and onlineMeetingProvider teamsForBusiness; neither property is filterable (isOnlineMeeting returns 400 ErrorInvalidProperty). Teams meetings expose their join link as onlineMeeting/joinUrl; the event resource has no joinWebUrl property. Pass that joinUrl to list-online-meetings as $filter=JoinWebUrl eq '{url}' to reach transcripts.",
    "execution": {
      "taskSupport": "forbidden"
    },

Current tools

Show all 197 tool fingerprints
accept-calendar-event
8f605d7206af7185
add-calendar-event-attachment
d222660b929e0295
add-excel-table-rows
5f11ca66b0d1226b
add-mail-attachment
a45734ab2f65ab78
cancel-calendar-event
5fac70731011f1d8
clear-excel-range
ede583ad0f1371e6
copy-drive-item
2333d0717d3cd3c5
copy-mail-message
37c81428aa220601
create-calendar
eda37fefba6cb20d
create-calendar-event
1d401a08b45005f6
create-calendar-event-attachment-upload-session
34971e05f403005a
create-contact-child-folder
1b1b88fba65f1f24
create-contact-folder
9280ddcb3d621f1e
create-contact-in-folder
72706151bad1c851
create-draft-email
b464bebdd0058400
create-drive-item-preview
2b646302abafcc2f
create-drive-item-share-link
6caf863fe9dab959
create-excel-chart
ab01d80ccfd1ed81
create-excel-table
e7c45b3841d88b1e
create-focused-inbox-override
388a9bcddb6b9300
create-forward-draft
1f2963a47a334ab1
create-mail-attachment-upload-session
4a1a9eb8529d144d
create-mail-child-folder
08bdd44cf5cc7624
create-mail-folder
694161fdc7bba7e2
create-mail-rule
5c6e3690b652b1b0
create-my-calendar-permission
866c69be6598f014
create-onedrive-folder
5bd964ab9217cf11
create-onenote-notebook
bea07f1847e904ed
create-onenote-page
fc4420d6dbf4b45d
create-onenote-section
11aacc0637792af8
create-onenote-section-page
1b2a0817897f4aaa
create-outlook-category
edfb5748d110fcb2
create-outlook-contact
146837afa717ae7e
create-planner-bucket
cbd8f945cab57669
create-planner-task
68a1a623705baec9
create-planner-task-message
525eacbdd3f9fe2d
create-reply-all-draft
5c41c1fc0d6e8863
create-reply-draft
eea558a301a1140b
create-specific-calendar-event
6dc82dd6db2eaff2
create-subscription
04d55ddf66d3e0f9
create-todo-checklist-item
8b1e64f5dfe8ab48
create-todo-linked-resource
726d894a7970bbe4
create-todo-task
66833b216406b0af
create-todo-task-list
88dec0112f53a0ab
create-upload-session
6c53ca9745fd8421
decline-calendar-event
8afaeb186be95141
delete-calendar
1b138305d5105203
delete-calendar-event
decec65cc215d023
delete-contact-folder
e17c87679b2760c8
delete-drive-item-permission
e1b0cf0a77e65326
delete-excel-range
eba25dee7b6c697e
delete-excel-table-row
6b3872d9c0155b6b
delete-focused-inbox-override
cf1b5f13e1d5c396
delete-mail-attachment
50768e7a8ee9763b
delete-mail-folder
3225f7faa2ef5981
delete-mail-message
1757b0da9c78fec6
delete-mail-rule
592b4c745eb42f34
delete-my-calendar-permission
598218b90fe76843
delete-onedrive-file
c619a1244f46f304
delete-onenote-page
8018e4b987ccb0a4
delete-outlook-contact
c6ffa2043e748626
delete-planner-bucket
f68dd7afbe8fd75d
delete-planner-task-message
1ccf9f5228e084f8
delete-specific-calendar-event
308629a5d6e6aa4e
delete-subscription
a3e46a13b16438f1
delete-todo-checklist-item
4dc97faf9718f4bd
delete-todo-linked-resource
3fa98ec1c4da78b0
delete-todo-task
4b7ff28b9dee293d
delete-todo-task-list
cd7c293b1210302f
dismiss-calendar-event-reminder
9db8ce70868fb282
download-bytes
6f1306f90389c658
download-bytes-to-file
d1215956cfaffab7
format-excel-range
4dc6ae8463039691
format-excel-range-border
36c442ec90e872ff
format-excel-range-fill
08dbaab1adcb4a1f
format-excel-range-font
1cd7bd4d57853880
forward-calendar-event
b6b9ecd382cdb6dd
forward-mail-message
58054c434829547f
get-calendar-event
630047bfadac9af3
get-calendar-view
50c508aa11c0f7e7
get-current-user
e1afe8c95a0e6bb7
get-download-url
f5965a441a03e06d
get-drive-delta
cd8e752037f46d60
get-drive-item
b46bf0d18de23815
get-drive-root-item
d18ede675c9f53a3
get-excel-range
e07b6ffa01fe607e
get-excel-range-format
41aabd27ed2fb355
get-excel-table
1a7176b691633605
get-excel-used-range
eb27ee860f624d2d
get-mail-attachment-content
a5a471f24c808f78
get-mail-message
a913ae92d24067ab
get-mail-message-mime
956131e1e73e7104
get-mail-tips
e24e6317b7b8074c
get-mailbox-settings
f0a56b49f5048a6c
get-my-profile
2ba2757eb37de469
get-onenote-page-content
5a3eff6d5ce34672
get-outlook-contact
334d7600bb30f1fb
get-planner-bucket
4c01a20cd53e50ff
get-planner-plan
4c95d341aebc2615
get-planner-task
849b1e6b858c1783
get-planner-task-details
1a1a37dea1840cdb
get-specific-calendar-event
140c59afd1ee45fa
get-specific-calendar-view
40df3fc00f34c5a4
get-subscription
23667eb553c26eb3
get-todo-task
610c7d87a1ebcaf9
get-upload-url
d522f4eca37c3f7d
graph-batch
e44c44c5bb3d5bda
insert-excel-range
acf7d629b4483fdd
list-accounts
44052c4d8712ac47
list-all-onenote-sections
22d7041e01b1dc54
list-calendar-event-instances
17f2e069f2652312
list-calendar-events
b1ef63db23e59422
list-calendar-events-delta
481eba2acedda231
list-calendar-view-delta
ea86af8059d9ccd2
list-calendars
3082b1db4a834e70
list-contact-folder-child-folders
7a5b232347ac9b55
list-contact-folder-contacts
4bed46134e3905bb
list-contact-folders
1297b04ce003f1be
list-drive-item-permissions
049fa45ddca33cae
list-drive-item-thumbnails
30e87fe77c382c81
list-drive-item-versions
163bc6d3e2f0d372
list-drives
2c6d4ffcd83c4ae6
list-excel-table-rows
d8de4c5ad8a2ddd8
list-excel-tables
55a347150640a26c
list-excel-worksheets
0cac231bea225179
list-focused-inbox-overrides
054b36de2a23b231
list-folder-files
6e692e636a9cb00b
list-mail-attachments
f477ef20c0155da3
list-mail-child-folders
811cd806133f6ace
list-mail-folder-messages
c0977fcf2d297026
list-mail-folder-messages-delta
d0116d6604a0c143
list-mail-folders
782ad8729ed0bc3c
list-mail-messages
1a9c5eafc2c42303
list-mail-rules
8e21f690fa309f73
list-my-calendar-permissions
ab176f5bc76bf22c
list-onenote-notebook-sections
13dae0d4103ba8c7
list-onenote-notebooks
70a6fc3c0de47aa8
list-onenote-pages
119635871cf2c183
list-onenote-section-groups
932a4baab5cc3672
list-onenote-section-pages
bbb84f006c5f7407
list-outlook-categories
d92d243197dde835
list-outlook-contacts
69f6881c699387dd
list-plan-buckets
58a065ea492ae589
list-plan-tasks
8d0875559606b92b
list-planner-task-messages
1ef564c1794030c3
list-planner-tasks
7470820b88a7e5a3
list-specific-calendar-events
1232ddc298b47c2f
list-subscriptions
91580557dc80b763
list-supported-languages
c3ef51d807009b50
list-supported-time-zones
e3948de38012e6cf
list-todo-checklist-items
51c186ff7c7e3480
list-todo-linked-resources
dd68b9e833abb910
list-todo-task-lists
5e71db8dd0ccd6d0
list-todo-tasks
cbddd65edf59fb8a
login
85fcedc301b8db47
logout
107143ab6edb951c
merge-excel-range
ffe42846a064ec16
move-mail-message
57e28066ce138dc4
move-rename-onedrive-item
5259723d7213ffd0
parse-teams-url
96e64fabbe8febdc
read-mail-text
e71380b5181e4eb5
reauthorize-subscription
a1c6630b20564b06
remove-account
0b874ec34913967e
reply-all-mail-message
1d4bddc350103677
reply-mail-message
28239c5a715f0b0f
search-onedrive-files
46e21c1c9b340038
select-account
81f88b9ee46b881a
send-draft-message
2847b473a8b49d5d
send-mail
126009fc2bd56c51
share-drive-item
ee15fe3678cdb3dd
snooze-calendar-event-reminder
f69cf07fd107655c
sort-excel-range
52a0f9f661403011
tentatively-accept-calendar-event
ee5b0046248afe54
unmerge-excel-range
f61e503285d9cf21
update-calendar
54e492c8b23ae103
update-calendar-event
a14174ba81d7361b
update-contact-folder
9c2c219bbee963b0
update-excel-range
22bbb7e4cfd6625b
update-excel-table-row
4fcc55f228225ea0
update-focused-inbox-override
d0ad1870f7dadb0f
update-mail-folder
abb8cf8fc2a1ba2a
update-mail-message
3a7672158de6e42b
update-mail-rule
1811fa73936a12f4
update-mailbox-settings
f363fd6ec0d86ae3
update-my-calendar-permission
ac6fd9fd1a5faa73
update-outlook-contact
56a9f6fb1c5dfdf0
update-planner-bucket
f97395ef966531a8
update-planner-task
89b862c6716644c5
update-planner-task-details
5a75172478467642
update-specific-calendar-event
9787a77a9b1e7b04
update-subscription
2c3e50445a94927e
update-todo-checklist-item
c8d58a4a183365b5
update-todo-task
c1950b6e533ae22a
update-todo-task-list
1734a09d5e686196
upload-file-content
0e2362f06ff5e7f7
upload-my-profile-photo
24ee60948f5addb3
verify-login
d9611e2b42e6a137

Watch this server yourself

If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.

npx -y mcp-pin@0.2.3 -- <your @softeria/ms-365-mcp-server command>

Or subscribe to this page's RSS feed to be told when it changes.

Badge

mcp-pin status badge for @softeria/ms-365-mcp-server

The badge states one fact about time and nothing else. It never claims a server is safe.

[![mcp-pin](https://mcp-pin.gautamkhosla.com/badge/6b2bed41fbea00f7.svg)](https://mcp-pin.gautamkhosla.com/servers/6b2bed41fbea00f7.html)