[cron:3c0c2c17-0faa-41cb-bd7b-068b2a259b28 chad-email-smart] Smart email check for chad@cfrfl.com:

1. Query ms-365 for unread emails (isRead eq false) from last 30 minutes
2. Compare with previously seen emails (track IDs in memory)
3. If NEW unread emails found:
   - Categorize each (urgent/action/fyi/newsletter)
   - Draft responses in Chad's voice for action items
   - Send summary notification with categories and drafts
4. If no new emails, reply HEARTBEAT_OK (silent)

Use file /home/crogers2287/memory/last-email-check.json to track seen email IDs.
Only report when there's something actionable. Be efficient.
Current time: Tuesday, February 3rd, 2026 — 7:06 AM (UTC)


Path escapes sandbox root (~): /usr/lib/node_modules/clawdbot/skills/mcporter/SKILL.md


---
name: mcporter
description: Use the mcporter CLI to list, configure, auth, and call MCP servers/tools directly (HTTP or stdio), including ad-hoc servers, config edits, and CLI/type generation.
homepage: http://mcporter.dev
metadata: {"clawdbot":{"emoji":"📦","requires":{"bins":["mcporter"]},"install":[{"id":"node","kind":"node","package":"mcporter","bins":["mcporter"],"label":"Install mcporter (node)"}]}}
---

# mcporter

Use `mcporter` to work with MCP servers directly.

Quick start
- `mcporter list`
- `mcporter list <server> --schema`
- `mcporter call <server.tool> key=value`

Call tools
- Selector: `mcporter call linear.list_issues team=ENG limit:5`
- Function syntax: `mcporter call "linear.create_issue(title: \"Bug\")"`
- Full URL: `mcporter call https://api.example.com/mcp.fetch url:https://example.com`
- Stdio: `mcporter call --stdio "bun run ./server.ts" scrape url=https://example.com`
- JSON payload: `mcporter call <server.tool> --args '{"limit":5}'`

Auth + config
- OAuth: `mcporter auth <server | url> [--reset]`
- Config: `mcporter config list|get|add|remove|import|login|logout`

Daemon
- `mcporter daemon start|status|stop|restart`

Codegen
- CLI: `mcporter generate-cli --server <name>` or `--command <url>`
- Inspect: `mcporter inspect-cli <path> [--json]`
- TS: `mcporter emit-ts <server> --mode client|types`

Notes
- Config default: `./config/mcporter.json` (override with `--config`).
- Prefer `--output json` for machine-readable results.


Command still running (session grand-dune, pid 2569988). Use process (list/poll/log/write/kill/clear/remove) for follow-up.

[error-handler] Error handlers installed
mcporter 0.7.3 — Listing 17 server(s) (per-server timeout: 30s)
- investigator (offline — unable to reach server, 0.0s)
- skills-sh (offline — unable to reach server, 0.1s)
- llamaswap (2 tools, 0.2s)
- fast-port-checker (3 tools, 0.3s)
- ace (18 tools, 0.7s)
- android (offline — unable to reach server, 0.7s)
- ms-365 (68 tools, 0.7s)
- unified-orchestrator (30 tools, 0.9s)
- code-execution-mode (2 tools, 0.9s)
- memlayer (6 tools, 0.9s)
- omada-mcp-server (17 tools, 0.9s)
- onepanel (offline — unable to reach server, 1.0s)
- terminator (35 tools, 1.1s)
- flowlens (8 tools, 3.0s)


[error-handler] Error handlers installed
mcporter 0.7.3 — Listing 17 server(s) (per-server timeout: 30s)
- investigator (offline — unable to reach server, 0.0s)
- skills-sh (offline — unable to reach server, 0.1s)
- llamaswap (2 tools, 0.2s)
- fast-port-checker (3 tools, 0.3s)
- ace (18 tools, 0.7s)
- android (offline — unable to reach server, 0.7s)
- ms-365 (68 tools, 0.7s)
- unified-orchestrator (30 tools, 0.9s)
- code-execution-mode (2 tools, 0.9s)
- memlayer (6 tools, 0.9s)
- omada-mcp-server (17 tools, 0.9s)
- onepanel (offline — unable to reach server, 1.0s)
- terminator (35 tools, 1.1s)
- flowlens (8 tools, 3.0s)

Process still running.


Killed session grand-dune.


exec

mcporter call ms-365.list_messages --output json --args '{"filter": "isRead eq false", "$top": 20}'


[error-handler] Error handlers installed
{
  content: [
    {
      type: 'text',
      text: 'MCP error -32602: Tool list_messages not found'
    }
  ],
  isError: true
}


mcporter list ms-365 --schema --output json 2>/dev/null | head -200


[error-handler] Error handlers installed
{
  "mode": "server",
  "name": "ms-365",
  "status": "ok",
  "durationMs": 732,
  "transport": "STDIO ms-365-mcp-server --toon",
  "source": {
    "kind": "local",
    "path": "/home/crogers2287/.mcporter/mcporter.json"
  },
  "tools": [
    {
      "name": "login",
      "description": "Authenticate with Microsoft using device code flow",
      "inputSchema": {
        "type": "object",
        "properties": {
          "force": {
            "type": "boolean",
            "default": false,
            "description": "Force a new login even if already logged in"
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "options": [
        {
          "property": "force",
          "cliName": "force",
          "description": "Force a new login even if already logged in",
          "required": false,
          "type": "boolean",
          "placeholder": "<force:true|false>",
          "exampleValue": "false",
          "defaultValue": false
        }
      ]
    },
    {
      "name": "logout",
      "description": "Log out from Microsoft account",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "options": []
    },
    {
      "name": "verify-login",
      "description": "Check current Microsoft authentication status",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "options": []
    },
    {
      "name": "list-accounts",
      "description": "List all available Microsoft accounts",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "options": []
    },
    {
      "name": "select-account",
      "description": "Select a specific Microsoft account to use",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "The account ID to select"
          }
        },
        "required": [
          "accountId"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "options": [
        {
          "property": "accountId",
          "cliName": "account-id",
          "description": "The account ID to select",
          "required": true,
          "type": "string",
          "placeholder": "<account-id>",
          "exampleValue": "example-id"
        }
      ]
    },
    {
      "name": "remove-account",
      "description": "Remove a Microsoft account from the cache",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "The account ID to remove"
          }
        },
        "required": [
          "accountId"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "options": [
        {
          "property": "accountId",
          "cliName": "account-id",
          "description": "The account ID to remove",
          "required": true,
          "type": "string",
          "placeholder": "<account-id>",
          "exampleValue": "example-id"
        }
      ]
    },
    {
      "name": "delete-onedrive-file",
      "description": "Delete navigation property items for drives",
      "inputSchema": {
        "type": "object",
        "properties": {
          "If-Match": {
            "type": "string",
            "description": "ETag"
          },
          "driveId": {
            "type": "string",
            "description": "Path parameter: driveId"
          },
          "driveItemId": {
            "type": "string",
            "description": "Path parameter: driveItemId"
          },
          "includeHeaders": {
            "type": "boolean",
            "description": "Include response headers (including ETag) in the response metadata"
          },
          "excludeResponse": {
            "type": "boolean",
            "description": "Exclude the full response body and only return success or failure indication"
          }
        },
        "required": [
          "driveId",
          "driveItemId"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "options": [
        {
          "property": "If-Match",
          "cliName": "-if--match",
          "description": "ETag",
          "required": false,
          "type": "string",
          "placeholder": "<-if--match>"
        },
        {
          "property": "driveId",
          "cliName": "drive-id",
          "description": "Path parameter: driveId",
          "required": true,
          "type": "string",
          "placeholder": "<drive-id>",
          "exampleValue": "example-id"
        },
        {
          "property": "driveItemId",
          "cliName": "drive-item-id",
          "description": "Path parameter: driveItemId",
          "required": true,
          "type": "string",
          "placeholder": "<drive-item-id>",
          "exampleValue": "example-id"
        },
        {
          "property": "includeHeaders",
          "cliName": "include-headers",
          "description": "Include response headers (including ETag) in the response metadata",
          "required": false,
          "type": "boolean",
          "placeholder": "<include-headers:true|false>",
          "exampleValue": "true"
        },
        {
          "property": "excludeResponse",


mcporter list ms-365 --schema --output json 2>/dev/null | grep -i "mail\|message\|inbox" | head -30


"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.",
                    "emailAddress": {
                          "description": "The email address of the person or entity."
                "description": "The preview of the message associated with the event. It's in text format."
                  "locationEmailAddress": {
                    "description": "Optional email address of the location."
      "description": "Update the navigation property events in me\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.",
                    "emailAddress": {
                          "description": "The email address of the person or entity."
                "description": "The preview of the message associated with the event. It's in text format."
                  "locationEmailAddress": {
                    "description": "Optional email address of the location."
              "emailAddresses": {
                      "description": "The email address of the person or entity."
                "description": "The contact's email addresses."
              "emailAddresses": {
                      "description": "The email address of the person or entity."
                "description": "The contact's email addresses."
      "description": "Get a list of event objects in the user's mailbox. The list contains single\ninstance meetings and series masters. To get expanded event instances, you can get the calendar view, or\nget the instances of an event. Currently, this operation returns event bodies in only HTML format. There are two scenarios where an app can get events in another user's calendar:",
      "description": "Create one or more multi-value extended properties in a new or existing instance of a resource. The following user resources are supported: The following group resources are supported: See Extended properties overview for more information about when to use\nopen extensions or extended properties, and how to specify extended properties.\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.",
                    "emailAddress": {
                          "description": "The email address of the person or entity."
                "description": "The preview of the message associated with the event. It's in text format."
                  "locationEmailAddress": {
                    "description": "Optional email address of the location."
      "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.",
                    "emailAddress": {
                          "description": "The email address of the person or entity."
                "description": "The preview of the message associated with the event. It's in text format."
                  "locationEmailAddress": {


mcporter list ms-365 --schema --output json 2>/dev/null | jq '.tools[] | select(.name | contains("mail") or contains("message")) | {name: .name, description: .description}' 2>/dev/null | head -100


(no output)


mcporter list ms-365 --schema --output json 2>/dev/null | jq '.tools[].name' 2>/dev/null | head -80


mcporter list ms-365 --schema 2>/dev_null | grep '"name":' | head -80


/bin/bash: line 1: /dev_null: Permission denied


mcporter list ms-365 --schema 2>/dev/null | grep '"name":' | head -80


"name": {
                    "name": {
                        "name": {
                    "name": {
                        "name": {
                    "name": {
                    "name": {
                    "name": {
                        "name": {
                    "name": {
                        "name": {
                    "name": {
                        "name": {
                    "name": {
                    "name": {
                        "name": {
                    "name": {
              "name": {
                        "name": {
                            "name": {
                        "name": {
                    "name": {
                    "name": {
                          "name": {


mcporter list ms-365 --schema 2>/dev/null | grep -E '^\s+"name": "' | head -80


mcporter list ms-365 --schema 2>/dev/null | grep '"name"' | head -80


[error-handler] Error handlers installed
ms-365

  /**
   * Authenticate with Microsoft using device code flow
   *
   * @param force? Force a new login even if already logged in
   */
  function login(force?: boolean);

  /**
   * Log out from Microsoft account
   */
  function logout();

  /**
   * Check current Microsoft authentication status
   */
  function verify-login();

  /**
   * List all available Microsoft accounts
   */
  function list-accounts();

  /**
   * Select a specific Microsoft account to use
   *
   * @param accountId The account ID to select
   */
  function select-account(accountId: string);

  /**
   * Remove a Microsoft account from the cache
   *
   * @param accountId The account ID to remove
   */
  function remove-account(accountId: string);

  /**
   * Delete navigation property items for drives
   *
   * @param If-Match? ETag
   * @param driveId Path parameter: driveId
   * @param driveItemId Path parameter: driveItemId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function delete-onedrive-file(If-Match?: string, driveId: string, driveItemId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Return a collection of DriveItems in the children relationship of a DriveItem. DriveItems with a
   * non-null folder or package facet can have one or more child DriveItems.
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param driveId Path parameter: driveId
   * @param driveItemId Path parameter: driveItemId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-folder-files(top?: number, skip?: number, search?: string, driveId: string, driveItemId: string);
  // optional (8): filter, count, orderby, select, expand, ...

  /**
   * The content stream, if the item represents a file.
   *
   * @param format? Format of the content
   * @param driveId Path parameter: driveId
   * @param driveItemId Path parameter: driveItemId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function download-onedrive-file-content(format?: string, driveId: string, driveItemId: string, fetchAllPages?: boolean, includeHeaders?: boolean);
  // optional (1): excludeResponse

  /**
   * The content stream, if the item represents a file.
   *
   * @param driveId Path parameter: driveId
   * @param driveItemId Path parameter: driveItemId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function upload-file-content(body: unknown, driveId: string, driveItemId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Represents a collection of worksheets associated with the workbook. Read-only.
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param driveId Path parameter: driveId
   * @param driveItemId Path parameter: driveItemId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-excel-worksheets(top?: number, skip?: number, search?: string, driveId: string, driveItemId: string);
  // optional (8): filter, count, orderby, select, expand, ...

  /**
   * Creates a new chart.
   *
   * @param driveId Path parameter: driveId
   * @param driveItemId Path parameter: driveItemId
   * @param workbookWorksheetId Path parameter: workbookWorksheetId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function create-excel-chart(body: unknown, driveId: string, driveItemId: string, workbookWorksheetId: string, includeHeaders?: boolean);
  // optional (1): excludeResponse

  /**
   * Update the navigation property format in drives
   *
   * @param driveId Path parameter: driveId
   * @param driveItemId Path parameter: driveItemId
   * @param workbookWorksheetId Path parameter: workbookWorksheetId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function format-excel-range(body: unknown, driveId: string, driveItemId: string, workbookWorksheetId: string, includeHeaders?: boolean);
  // optional (1): excludeResponse

  /**
   * Update the navigation property sort in drives
   *
   * @param driveId Path parameter: driveId
   * @param driveItemId Path parameter: driveItemId
   * @param workbookWorksheetId Path parameter: workbookWorksheetId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function sort-excel-range(body: unknown, driveId: string, driveItemId: string, workbookWorksheetId: string, includeHeaders?: boolean);
  // optional (1): excludeResponse

  /**
   * Invoke function range
   *
   * @param driveId Path parameter: driveId
   * @param driveItemId Path parameter: driveItemId
   * @param workbookWorksheetId Path parameter: workbookWorksheetId
   * @param address Path parameter: address
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function get-excel-range(driveId: string, driveItemId: string, workbookWorksheetId: string, address: string, fetchAllPages?: boolean);
  // optional (2): includeHeaders, excludeResponse

  /**
   * The root folder of the drive. Read-only.
   *
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param driveId Path parameter: driveId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function get-drive-root-item(select?: string[], expand?: string[], driveId: string, fetchAllPages?: boolean, includeHeaders?: boolean);
  // optional (1): excludeResponse

  /**
   * Retrieve the properties and relationships of user object. This operation returns by default only a
   * subset of the more commonly used properties for each user. These default properties are noted in the
   * Properties section. To get properties that are not returned by default, do a GET operation for the
   * user and specify the properties in a $select OData query option. Because the user resource supports
   * extensions, you can also use the GET operation to get custom properties and extension data in a user
   * instance. Customers through Microsoft Entra ID for customers can also use this API operation to
   * retrieve their details.
   *
   * @param ConsistencyLevel? Indicates the requested consistency level. Documentation URL:
   *                          https://docs.microsoft.com/graph/aad-advanced-queries
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function get-current-user(ConsistencyLevel?: string, select?: string[], expand?: string[], fetchAllPages?: boolean, includeHeaders?: boolean);
  // optional (1): excludeResponse

  /**
   * Get all the user's calendars (/calendars navigation property), get the calendars from the
   * default calendar group or from a specific calendar group.
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-calendars(top?: number, skip?: number, search?: string, filter?: string, count?: boolean);
  // optional (6): orderby, select, expand, fetchAllPages, includeHeaders, ...

  /**
   * The events in the calendar. Navigation property. Read-only.
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param calendarId Path parameter: calendarId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   * @param timezone? IANA timezone name (e.g., "America/New_York", "Europe/London", "Asia/Tokyo") for
   *                  calendar event times. If not specified, times are returned in UTC.
   */
  function list-specific-calendar-events(top?: number, skip?: number, search?: string, filter?: string, calendarId: string);
  // optional (8): count, orderby, select, expand, fetchAllPages, ...

  /**
   * 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.
   * 💡 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.
   *
   * @param calendarId Path parameter: calendarId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function create-specific-calendar-event(body: unknown, calendarId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * The events in the calendar. Navigation property. Read-only.
   *
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param calendarId Path parameter: calendarId
   * @param eventId Path parameter: eventId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   * @param timezone? IANA timezone name (e.g., "America/New_York", "Europe/London", "Asia/Tokyo") for
   *                  calendar event times. If not specified, times are returned in UTC.
   */
  function get-specific-calendar-event(select?: string[], expand?: string[], calendarId: string, eventId: string, fetchAllPages?: boolean);
  // optional (3): includeHeaders, excludeResponse, timezone

  /**
   * Update the navigation property events in me
   * 💡 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.
   *
   * @param calendarId Path parameter: calendarId
   * @param eventId Path parameter: eventId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function update-specific-calendar-event(body: unknown, calendarId: string, eventId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Delete navigation property events for me
   *
   * @param If-Match? ETag
   * @param calendarId Path parameter: calendarId
   * @param eventId Path parameter: eventId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function delete-specific-calendar-event(If-Match?: string, calendarId: string, eventId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Get the occurrences, exceptions, and single instances of events in a calendar view defined by a time
   * range, from the user's default calendar,
   * or from some other calendar of the user.
   *
   * @param startDateTime The start date and time of the time range, represented in ISO 8601 format. For
   *                      example, 2019-11-08T19:00:00-08:00
   * @param endDateTime The end date and time of the time range, represented in ISO 8601 format. For
   *                    example, 2019-11-08T20:00:00-08:00
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   * @param timezone? IANA timezone name (e.g., "America/New_York", "Europe/London", "Asia/Tokyo") for
   *                  calendar event times. If not specified, times are returned in UTC.
   */
  function get-calendar-view(startDateTime: string, endDateTime: string, top?: number, skip?: number, search?: string);
  // optional (9): filter, count, orderby, select, expand, ...

  /**
   * Get a contact collection from the default contacts folder of the signed-in user. There are two
   * scenarios where an app can get contacts in another user's contact folder:
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-outlook-contacts(top?: number, skip?: number, search?: string, filter?: string, count?: boolean);
  // optional (6): orderby, select, expand, fetchAllPages, includeHeaders, ...

  /**
   * Add a contact to the root Contacts folder or to the contacts endpoint of another contact folder.
   *
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function create-outlook-contact(body: unknown, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Retrieve the properties and relationships of a contact object. There are two scenarios where an app
   * can get a contact in another user's contact folder:
   *
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param contactId Path parameter: contactId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function get-outlook-contact(select?: string[], expand?: string[], contactId: string, fetchAllPages?: boolean, includeHeaders?: boolean);
  // optional (1): excludeResponse

  /**
   * Update the properties of a contact object.
   *
   * @param contactId Path parameter: contactId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function update-outlook-contact(body: unknown, contactId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Delete a contact.
   *
   * @param If-Match? ETag
   * @param contactId Path parameter: contactId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function delete-outlook-contact(If-Match?: string, contactId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Retrieve the list of Drive resources available for a target User, Group, or Site.
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-drives(top?: number, skip?: number, search?: string, filter?: string, count?: boolean);
  // optional (6): orderby, select, expand, fetchAllPages, includeHeaders, ...

  /**
   * Get a list of event objects in the user's mailbox. The list contains single
   * instance meetings and series masters. To get expanded event instances, you can get the calendar
   * view, or
   * get the instances of an event. Currently, this operation returns event bodies in only HTML format.
   * There are two scenarios where an app can get events in another user's calendar:
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   * @param timezone? IANA timezone name (e.g., "America/New_York", "Europe/London", "Asia/Tokyo") for
   *                  calendar event times. If not specified, times are returned in UTC.
   */
  function list-calendar-events(top?: number, skip?: number, search?: string, filter?: string, count?: boolean);
  // optional (7): orderby, select, expand, fetchAllPages, includeHeaders, ...

  /**
   * Create one or more multi-value extended properties in a new or existing instance of a resource. The
   * following user resources are supported: The following group resources are supported: See Extended
   * properties overview for more information about when to use
   * open extensions or extended properties, and how to specify extended properties.
   * 💡 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.
   *
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function create-calendar-event(body: unknown, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Get the properties and relationships of the specified event object. Currently, this operation
   * returns event bodies in only HTML format. There are two scenarios where an app can get an event in
   * another user's calendar: Since the event resource supports extensions, you can also use the GET
   * operation to get custom properties and extension data in an event instance.
   *
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param eventId Path parameter: eventId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   * @param timezone? IANA timezone name (e.g., "America/New_York", "Europe/London", "Asia/Tokyo") for
   *                  calendar event times. If not specified, times are returned in UTC.
   */
  function get-calendar-event(select?: string[], expand?: string[], eventId: string, fetchAllPages?: boolean, includeHeaders?: boolean);
  // optional (2): excludeResponse, timezone

  /**
   * Update the properties of the event object.
   * 💡 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.
   *
   * @param eventId Path parameter: eventId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function update-calendar-event(body: unknown, eventId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Removes the specified event from the containing calendar. If the event is a meeting, deleting the
   * event on the organizer's calendar sends a cancellation message to the meeting attendees.
   *
   * @param If-Match? ETag
   * @param eventId Path parameter: eventId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function delete-calendar-event(If-Match?: string, eventId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Get the mail folder collection directly under the root folder of the signed-in user. The returned
   * collection includes any mail search folders directly under the root. By default, this operation does
   * not return hidden folders. Use a query parameter includeHiddenFolders to include them in the
   * response. This operation does not return all mail folders in a mailbox, only the child folders of
   * the root folder. To return all mail folders in a mailbox, each child folder must be traversed
   * separately.
   *
   * @param includeHiddenFolders? Include Hidden Folders
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-mail-folders(includeHiddenFolders?: string, top?: number, skip?: number, search?: string, filter?: string);
  // optional (7): count, orderby, select, expand, fetchAllPages, ...

  /**
   * Get the folder collection under the specified folder. You can use the .../me/mailFolders shortcut to
   * get the top-level
   * folder collection and navigate to another folder. By default, this operation does not return hidden
   * folders. Use a query parameter includeHiddenFolders to include them in the response.
   *
   * @param includeHiddenFolders? Include Hidden Folders
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param mailFolderId Path parameter: mailFolderId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-mail-child-folders(includeHiddenFolders?: string, top?: number, skip?: number, search?: string, mailFolderId: string);
  // optional (8): filter, count, orderby, select, expand, ...

  /**
   * Get all the messages in the specified user's mailbox, or those messages in a specified folder
   * in the mailbox.
   * 💡 TIP: CRITICAL: When searching emails, the $search parameter value MUST be wrapped in double
   * quotes. Format: $search="your search query here". Use KQL (Keyword Query Language) syntax to search
   * specific properties: 'from:', 'subject:', 'body:', 'to:', 'cc:', 'bcc:', 'attachment:',
   * 'hasAttachments:', 'importance:', 'received:', 'sent:'. Examples: $search="from:john@example.com" |
   * $search="subject:meeting AND hasAttachments:true" | $search="body:urgent AND received>=2024-01-01" |
   * $search="from:alice AND importance:high". Remember: ALWAYS wrap the entire search expression in
   * double quotes! Reference: https://learn.microsoft.com/en-us/graph/search-query-parameter
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param mailFolderId Path parameter: mailFolderId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-mail-folder-messages(top?: number, skip?: number, search?: string, filter?: string, mailFolderId: string);
  // optional (7): count, orderby, select, expand, fetchAllPages, ...

  /**
   * Get an open extension (openTypeExtension object) identified by name or fully qualified name. The
   * table in the Permissions section lists the resources that support open extensions. The following
   * table lists the three scenarios where you can get an open extension from a supported resource
   * instance.
   * 💡 TIP: CRITICAL: When searching emails, the $search parameter value MUST be wrapped in double
   * quotes. Format: $search="your search query here". Use KQL (Keyword Query Language) syntax to search
   * specific properties: 'from:', 'subject:', 'body:', 'to:', 'cc:', 'bcc:', 'attachment:',
   * 'hasAttachments:', 'importance:', 'received:', 'sent:'. Examples: $search="from:john@example.com" |
   * $search="subject:meeting AND hasAttachments:true" | $search="body:urgent AND received>=2024-01-01" |
   * $search="from:john AND importance:high". Remember: ALWAYS wrap the entire search expression in
   * double quotes! Reference: https://learn.microsoft.com/en-us/graph/search-query-parameter
   *
   * @param includeHiddenMessages? Include Hidden Messages
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-mail-messages(includeHiddenMessages?: string, top?: number, skip?: number, search?: string, filter?: string);
  // optional (7): count, orderby, select, expand, fetchAllPages, ...

  /**
   * Create an open extension (openTypeExtension object) and add custom properties in a new or existing
   * instance of a resource. You can create an open extension in a resource instance and store custom
   * data to it all in the same operation, except for specific resources. The table in the Permissions
   * section lists the resources that support open extensions.
   *
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function create-draft-email(body: unknown, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Get the properties and relationships of the eventMessage object. Apply the $expand parameter on the
   * event navigation property to get the associated event in an attendee's calendar. Currently,
   * this operation returns event message bodies in only HTML format.
   *
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param messageId Path parameter: messageId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function get-mail-message(select?: string[], expand?: string[], messageId: string, fetchAllPages?: boolean, includeHeaders?: boolean);
  // optional (1): excludeResponse

  /**
   * Update the properties of an eventMessage object.
   *
   * @param messageId Path parameter: messageId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function update-mail-message(body: unknown, messageId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Delete eventMessage.
   *
   * @param If-Match? ETag
   * @param messageId Path parameter: messageId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function delete-mail-message(If-Match?: string, messageId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Retrieve a list of attachment objects.
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param messageId Path parameter: messageId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-mail-attachments(top?: number, skip?: number, search?: string, filter?: string, messageId: string);
  // optional (7): count, orderby, select, expand, fetchAllPages, ...

  /**
   * Use this API to create a new Attachment. An attachment can be one of the following types: All these
   * types of attachment resources are derived from the attachment
   * resource.
   *
   * @param messageId Path parameter: messageId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function add-mail-attachment(body: unknown, messageId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Read the properties, relationships, or raw contents of an attachment that is attached to a user
   * event, message, or group post. An attachment can be one of the following types: All these types of
   * attachments are derived from the attachment resource.
   *
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param messageId Path parameter: messageId
   * @param attachmentId Path parameter: attachmentId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function get-mail-attachment(select?: string[], expand?: string[], messageId: string, attachmentId: string, fetchAllPages?: boolean);
  // optional (2): includeHeaders, excludeResponse

  /**
   * Delete navigation property attachments for me
   *
   * @param If-Match? ETag
   * @param messageId Path parameter: messageId
   * @param attachmentId Path parameter: attachmentId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function delete-mail-attachment(If-Match?: string, messageId: string, attachmentId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Move a message to another folder within the specified user's mailbox. This creates a new copy
   * of the message in the destination folder and removes the original message.
   *
   * @param messageId Path parameter: messageId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function move-mail-message(body: unknown, messageId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Retrieve a list of notebook objects.
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-onenote-notebooks(top?: number, skip?: number, search?: string, filter?: string, count?: boolean);
  // optional (6): orderby, select, expand, fetchAllPages, includeHeaders, ...

  /**
   * Retrieve a list of onenoteSection objects from the specified notebook.
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param notebookId Path parameter: notebookId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-onenote-notebook-sections(top?: number, skip?: number, search?: string, filter?: string, notebookId: string);
  // optional (7): count, orderby, select, expand, fetchAllPages, ...

  /**
   * Create a new OneNote page in the default section of the default notebook. To create a page in a
   * different section in the default notebook, you can use the sectionName query parameter. Example:
   * ../onenote/pages?sectionName=My%20section The POST /onenote/pages operation is used only to
   * create pages in the current user's default notebook. If you're targeting other notebooks,
   * you can create pages in a specified section.
   *
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function create-onenote-page(body: unknown, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * The page's HTML content.
   *
   * @param onenotePageId Path parameter: onenotePageId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function get-onenote-page-content(onenotePageId: string, fetchAllPages?: boolean, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Retrieve a list of page objects from the specified section.
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param onenoteSectionId Path parameter: onenoteSectionId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-onenote-section-pages(top?: number, skip?: number, search?: string, filter?: string, onenoteSectionId: string);
  // optional (7): count, orderby, select, expand, fetchAllPages, ...

  /**
   * Retrieve a list of plannertask objects assigned to a User.
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-planner-tasks(top?: number, skip?: number, search?: string, filter?: string, count?: boolean);
  // optional (6): orderby, select, expand, fetchAllPages, includeHeaders, ...

  /**
   * Send the message specified in the request body using either JSON or MIME format. When using JSON
   * format, you can include a file attachment in the same sendMail action call. When using MIME format:
   * This method saves the message in the Sent Items folder. Alternatively, create a draft message to
   * send later. To learn more about the steps involved in the backend before a mail is delivered to
   * recipients, see here.
   * 💡 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.
   *
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function send-mail(body: unknown, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Get a list of the todoTaskList objects and their properties.
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-todo-task-lists(top?: number, skip?: number, search?: string, filter?: string, count?: boolean);
  // optional (6): orderby, select, expand, fetchAllPages, includeHeaders, ...

  /**
   * Get the todoTask resources from the tasks navigation property of a specified todoTaskList.
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param todoTaskListId Path parameter: todoTaskListId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-todo-tasks(top?: number, skip?: number, search?: string, filter?: string, todoTaskListId: string);
  // optional (7): count, orderby, select, expand, fetchAllPages, ...

  /**
   * Create a new task object in a specified todoTaskList.
   *
   * @param todoTaskListId Path parameter: todoTaskListId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function create-todo-task(body: unknown, todoTaskListId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Read the properties and relationships of a todoTask object.
   *
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param todoTaskListId Path parameter: todoTaskListId
   * @param todoTaskId Path parameter: todoTaskId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function get-todo-task(select?: string[], expand?: string[], todoTaskListId: string, todoTaskId: string, fetchAllPages?: boolean);
  // optional (2): includeHeaders, excludeResponse

  /**
   * Update the properties of a todoTask object.
   *
   * @param todoTaskListId Path parameter: todoTaskListId
   * @param todoTaskId Path parameter: todoTaskId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function update-todo-task(body: unknown, todoTaskListId: string, todoTaskId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Delete a todoTask object.
   *
   * @param If-Match? ETag
   * @param todoTaskListId Path parameter: todoTaskListId
   * @param todoTaskId Path parameter: todoTaskId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function delete-todo-task(If-Match?: string, todoTaskListId: string, todoTaskId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Retrieve the properties and relationships of a plannerplan object.
   *
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param plannerPlanId Path parameter: plannerPlanId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function get-planner-plan(select?: string[], expand?: string[], plannerPlanId: string, fetchAllPages?: boolean, includeHeaders?: boolean);
  // optional (1): excludeResponse

  /**
   * Retrieve a list of plannerTask objects associated with a plannerPlan object.
   *
   * @param top? Show only the first n items
   * @param skip? Skip the first n items
   * @param search? Search items by search phrases
   * @param filter? Filter items by property values
   * @param count? Include count of items
   * @param orderby? Order items by property values
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param plannerPlanId Path parameter: plannerPlanId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function list-plan-tasks(top?: number, skip?: number, search?: string, filter?: string, plannerPlanId: string);
  // optional (7): count, orderby, select, expand, fetchAllPages, ...

  /**
   * Create a new plannerTask.
   *
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function create-planner-task(body: unknown, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Retrieve the properties and relationships of plannerTask object.
   *
   * @param select? Select properties to be returned
   * @param expand? Expand related entities
   * @param plannerTaskId Path parameter: plannerTaskId
   * @param fetchAllPages? Automatically fetch all pages of results
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function get-planner-task(select?: string[], expand?: string[], plannerTaskId: string, fetchAllPages?: boolean, includeHeaders?: boolean);
  // optional (1): excludeResponse

  /**
   * Update the properties of plannerTask object.
   *
   * @param If-Match ETag value.
   * @param plannerTaskId Path parameter: plannerTaskId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function update-planner-task(body: unknown, If-Match: string, plannerTaskId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Update the properties of plannerTaskDetails object.
   *
   * @param If-Match ETag value.
   * @param plannerTaskId Path parameter: plannerTaskId
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function update-planner-task-details(body: unknown, If-Match: string, plannerTaskId: string, includeHeaders?: boolean, excludeResponse?: boolean);

  /**
   * Runs the query specified in the request body. Search results are provided in the response.
   *
   * @param includeHeaders? Include response headers (including ETag) in the response metadata
   * @param excludeResponse? Exclude the full response body and only return success or failure indication
   */
  function search-query(body: unknown, includeHeaders?: boolean, excludeResponse?: boolean);

  Examples:
    mcporter call ms-365.login(force: false)

  Optional parameters hidden; run with --all-parameters to view all fields.

  68 tools · 795ms · STDIO ms-365-mcp-server --toon


I can see the ms-365 MCP server has `list-mail-messages` tool. Let me query for unread emails from the last 30 minutes.

mcporter call ms-365.list-mail-messages --output json --args '{"filter": "isRead eq false and receivedDateTime ge 2026-02-03T06:36:00Z", "top": 20, "orderby": "receivedDateTime desc"}'


[error-handler] Error handlers installed
{
  content: [
    {
      type: 'text',
      text: 'MCP error -32602: Input validation error: Invalid arguments for tool list-mail-messages: [\n' +
        '  {\n' +
        '    "code": "invalid_type",\n' +
        '    "expected": "array",\n' +
        '    "received": "string",\n' +
        '    "path": [\n' +
        '      "orderby"\n' +
        '    ],\n' +
        '    "message": "Expected array, received string"\n' +
        '  }\n' +
        ']'
    }
  ],
  isError: true
}


mcporter call ms-365.list-mail-messages --output json --args '{"filter": "isRead eq false and receivedDateTime ge 2026-02-03T06:36:00Z", "top": 20}'


[error-handler] Error handlers installed
{ content: [ { type: 'text', text: 'value[0]:' } ] }


mcporter call ms-365.list-mail-messages filter="isRead eq false and receivedDateTime ge 2026-02-03T06:36:00Z" top:20 --output json


mcporter call ms-365.list-mail-messages --output json