{
  "slug": "io-github-softeria-ms-365-mcp-server",
  "name": "Microsoft 365 MCP Server",
  "auditedAt": "2026-10-24T00:10:48Z",
  "version": "0.171.0",
  "ecosystem": "npm",
  "package": "@softeria/ms-365-mcp-server",
  "disclaimer": "Automated smoke test, not a security guarantee.",
  "complete": true,
  "checks": {
    "versionPin": {
      "status": "pass",
      "detail": "Pinned npm @softeria/ms-365-mcp-server@0.171.0",
      "version": "0.171.0"
    },
    "vulnerabilities": {
      "status": "pass",
      "detail": "No critical, high, or medium advisories were returned.",
      "critical": 0,
      "high": 0,
      "medium": 0,
      "low": 0,
      "packagesScanned": 80
    },
    "license": {
      "status": "pass",
      "detail": "MIT",
      "spdx": "MIT"
    },
    "installScripts": {
      "status": "pass",
      "detail": "No preinstall, install, postinstall, or prepare script.",
      "scripts": []
    },
    "secrets": {
      "status": "pass",
      "detail": "No credential patterns in the published artifact.",
      "findings": []
    },
    "packageSize": {
      "status": "pass",
      "detail": "360273 bytes",
      "bytes": 360273
    },
    "activity": {
      "status": "pass",
      "detail": "Active 0 days ago.",
      "ageDays": 0
    },
    "sandbox": {
      "status": "pass",
      "detail": "MCP handshake completed. 80 tools listed.",
      "starts": true,
      "handshake": true,
      "timeToReadyMs": 1594,
      "tools": [
        {
          "name": "login",
          "description": "Authenticate with Microsoft account"
        },
        {
          "name": "logout",
          "description": "Log out from Microsoft account"
        },
        {
          "name": "verify-login",
          "description": "Check current Microsoft authentication status"
        },
        {
          "name": "list-accounts",
          "description": "List all Microsoft accounts configured in this server. Use this to discover available account emails before making tool calls. Reflects accounts added mid-session via --login."
        },
        {
          "name": "select-account",
          "description": "Select a Microsoft account as the default. Accepts email address (e.g. user@outlook.com) or account ID. Use list-accounts to discover available accounts."
        },
        {
          "name": "remove-account",
          "description": "Remove a Microsoft account from the cache. Accepts email address (e.g. user@outlook.com) or account ID. Use list-accounts to discover available accounts."
        },
        {
          "name": "graph-batch",
          "description": "Combine up to 20 Graph requests into a single HTTP call. Body: { requests: [{ id: '1', method: 'GET'|'POST'|'PATCH'|'DELETE', url: '/me/messages?$top=5', headers?: {...}, body?: {...}, dependsOn?: ['1'] }, ...] }. Returns { responses: [{ id"
        },
        {
          "name": "get-drive-item",
          "description": "All items contained in the drive. Read-only. Nullable.\n\n\ud83d\udca1 TIP: Gets metadata for a file or folder: name, size, lastModifiedDateTime, createdBy, webUrl, file (mimeType, hashes), folder (childCount), parentReference, and @microsoft.graph.down"
        },
        {
          "name": "move-rename-onedrive-item",
          "description": "Move or rename a OneDrive item.\n\n\ud83d\udca1 TIP: Move and/or rename a file or folder. To move, provide parentReference with the target folder's id. To rename, provide a new name. Both can be done in a single request."
        },
        {
          "name": "delete-onedrive-file",
          "description": "Delete a OneDrive file."
        },
        {
          "name": "list-folder-files",
          "description": "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."
        },
        {
          "name": "create-onedrive-folder",
          "description": "Create a OneDrive folder.\n\n\ud83d\udca1 TIP: Creates a new folder inside the specified drive item. Body must include name (string) and folder ({}) fields. Use @microsoft.graph.conflictBehavior to control behavior on name conflict: 'rename' (default), "
        },
        {
          "name": "upload-file-content",
          "description": "The content stream, if the item represents a file.\n\n\ud83d\udca1 TIP: Body is a base64-encoded string of the file bytes; the server decodes it before PUT. Graph accepts up to 250MB here, but the whole string travels as a tool argument and a truncated "
        },
        {
          "name": "copy-drive-item",
          "description": "Copy a drive item.\n\n\ud83d\udca1 TIP: Asynchronously copy a file or folder to a new location and/or name. Body: { parentReference: { driveId: '...', id: '...' }, name?: 'New Name.xlsx' }. Returns 202 Accepted with a Location header pointing at a monit"
        },
        {
          "name": "create-drive-item-share-link",
          "description": "Create a link to share a driveItem driveItem. The createLink action creates a new sharing link if the specified link type doesn't already exist for the calling application.\nIf a sharing link of the specified type already exists for the app,"
        },
        {
          "name": "create-upload-session",
          "description": "Create an upload session.\n\n\ud83d\udca1 TIP: For large file uploads (no size limit, and no minimum unlike the Outlook attachment session). Returns a pre-authenticated uploadUrl; the caller PUTs the bytes there itself. This server does not perform the "
        },
        {
          "name": "get-drive-delta",
          "description": "Track changes in a driveItem and its children over time. Your app begins by calling delta without any parameters.\nThe service starts enumerating the drive's hierarchy, returning pages of items and either an @odata.nextLink or an @odata.delt"
        },
        {
          "name": "share-drive-item",
          "description": "Send a sharing invitation for a driveItem. A sharing invitation provides permissions to the recipients and, optionally, sends them an email to notify them that the item was shared.\n\n\ud83d\udca1 TIP: Shares a file or folder with specific users. Body: "
        },
        {
          "name": "list-drive-item-permissions",
          "description": "The set of permissions for the item. Read-only. Nullable.\n\n\ud83d\udca1 TIP: Lists all permissions (sharing links, direct access, inherited) on a file or folder. Each permission has roles, grantedTo (user), link (sharing URL), and inheritedFrom."
        },
        {
          "name": "delete-drive-item-permission",
          "description": "Delete a drive item permission.\n\n\ud83d\udca1 TIP: Removes a specific permission from a file or folder. Only permissions that are not inherited can be deleted. Use list-drive-item-permissions first to find the permission ID."
        },
        {
          "name": "create-drive-item-preview",
          "description": "Create a drive item preview.\n\n\ud83d\udca1 TIP: Generate a short-lived embeddable preview URL for a file (Office docs, PDFs, images). Body: { page?: number | string, zoom?: number, viewer?: 'onedrive' | 'office' }. Returns getUrl (interactive) and pos"
        },
        {
          "name": "list-drive-item-thumbnails",
          "description": "Collection of thumbnailSet objects associated with the item. For more information, see getting thumbnails. Read-only. Nullable.\n\n\ud83d\udca1 TIP: Lists thumbnail sets for a file. Each set contains small (96px), medium (176px), large (800px) thumbnail"
        },
        {
          "name": "list-drive-item-versions",
          "description": "The list of previous versions of the item. For more info, see getting previous versions. Read-only. Nullable.\n\n\ud83d\udca1 TIP: Lists version history of a file. Each version has id, lastModifiedDateTime, lastModifiedBy, and size. Use the version id w"
        },
        {
          "name": "list-excel-tables",
          "description": "Represents a collection of tables associated with the workbook. Read-only.\n\n\ud83d\udca1 TIP: Lists all named tables in a workbook. Each table has id, name, showHeaders, showTotals, columns, and style. Use the table name or id with other table endpoin"
        },
        {
          "name": "get-excel-table",
          "description": "Represents a collection of tables associated with the workbook. Read-only.\n\n\ud83d\udca1 TIP: Gets a specific table by name or ID. Returns table properties including columns, showHeaders, showTotals, and style."
        },
        {
          "name": "list-excel-table-rows",
          "description": "The list of all the rows in the table. Read-only.\n\n\ud83d\udca1 TIP: Lists all rows in a table. Each row has index and values (array of cell values). Use $top and $skip for pagination on large tables."
        },
        {
          "name": "add-excel-table-rows",
          "description": "Add Excel table rows.\n\n\ud83d\udca1 TIP: Adds rows to a table. Body: { values: [['col1val', 'col2val', 'col3val'], ['row2col1', 'row2col2', 'row2col3']] }. Each inner array is one row. Values must match the number of columns in the table."
        },
        {
          "name": "update-excel-table-row",
          "description": "Update an Excel table row.\n\n\ud83d\udca1 TIP: Update a single row in a formal Excel table by zero-based row index. Body: { values: [[...]] } with one inner array matching the column count."
        },
        {
          "name": "delete-excel-table-row",
          "description": "Delete an Excel table row.\n\n\ud83d\udca1 TIP: Delete a single row from a formal Excel table by zero-based row index."
        },
        {
          "name": "list-excel-worksheets",
          "description": "Represents a collection of worksheets associated with the workbook. Read-only."
        },
        {
          "name": "create-excel-chart",
          "description": "Creates a new chart."
        },
        {
          "name": "sort-excel-range",
          "description": "Sort an Excel range."
        },
        {
          "name": "get-excel-range",
          "description": "Get an Excel range."
        },
        {
          "name": "update-excel-range",
          "description": "Update an Excel range.\n\n\ud83d\udca1 TIP: Set cell values, formulas, or number format on any range \u2014 does NOT require the worksheet to be a formal Excel table. Body: { values: [['v1','v2','v3']] } for a single row, or [['a','b'],['c','d']] for multi-r"
        },
        {
          "name": "clear-excel-range",
          "description": "Clear an Excel range.\n\n\ud83d\udca1 TIP: Clear cell contents and/or formatting on the given range. Body: { applyTo: 'All' | 'Formats' | 'Contents' }. 'Contents' wipes values but keeps formatting; 'Formats' resets styling but keeps values; 'All' wipes "
        },
        {
          "name": "delete-excel-range",
          "description": "Delete an Excel range.\n\n\ud83d\udca1 TIP: Delete cells at the given range, shifting remaining content. Body: { shift: 'Up' } or { shift: 'Left' }. Use 'Up' to delete entire rows."
        },
        {
          "name": "get-excel-range-format",
          "description": "Returns a format object, encapsulating the range's font, fill, borders, alignment, and other properties. Read-only.\n\n\ud83d\udca1 TIP: Reads a range's format: alignment, wrapText, columnWidth, rowHeight. Font, fill, and borders are nested and omitted "
        },
        {
          "name": "format-excel-range",
          "description": "Format an Excel range.\n\n\ud83d\udca1 TIP: Apply rangeFormat properties to a specific range. Required path param 'address' (e.g. 'A1:E5' or 'Sheet1!A1:E5'). Body: { horizontalAlignment, verticalAlignment, wrapText, columnWidth, rowHeight }. Font, fill,"
        },
        {
          "name": "format-excel-range-border",
          "description": "Format an Excel range border.\n\n\ud83d\udca1 TIP: Sets one border side. The {sideIndex} path param selects which side: EdgeTop, EdgeBottom, EdgeLeft, EdgeRight, InsideVertical, InsideHorizontal, DiagonalDown, or DiagonalUp. To outline all four edges, c"
        },
        {
          "name": "format-excel-range-fill",
          "description": "Format an Excel range fill.\n\n\ud83d\udca1 TIP: Set the background fill color of a range's cells."
        },
        {
          "name": "format-excel-range-font",
          "description": "Format an Excel range font.\n\n\ud83d\udca1 TIP: Set font formatting on a range: bold, italic, underline, size, color, and font name."
        },
        {
          "name": "insert-excel-range",
          "description": "Insert an Excel range.\n\n\ud83d\udca1 TIP: Insert blank cells at the given range, shifting existing content. Body: { shift: 'Down' } or { shift: 'Right' }. Use 'Down' to insert blank rows above existing data."
        },
        {
          "name": "merge-excel-range",
          "description": "Merge an Excel range.\n\n\ud83d\udca1 TIP: Merge the cells in the given range into a single cell. Body: { across: false } merges the entire range into one cell; { across: true } merges each row separately. Useful for building styled headers, banner rows"
        },
        {
          "name": "unmerge-excel-range",
          "description": "Unmerge an Excel range.\n\n\ud83d\udca1 TIP: Unmerge any merged cells within the given range back into individual cells. No request body. Inverse of merge-excel-range."
        },
        {
          "name": "create-excel-table",
          "description": "Create a new table. The range source address determines the worksheet under which the table will be added. If the table can't be added (for example, because the address is invalid, or the table would overlap with another table), an error is"
        },
        {
          "name": "get-excel-used-range",
          "description": "Get an Excel used range.\n\n\ud83d\udca1 TIP: Get the smallest range that encompasses any cells with values or formatting on the worksheet. Returns address, values, formulas, numberFormat, rowCount, columnCount. Use this to discover the populated bounds"
        },
        {
          "name": "get-drive-root-item",
          "description": "The root folder of the drive. Read-only."
        },
        {
          "name": "search-onedrive-files",
          "description": "Search the hierarchy of items for items matching a query.\nYou can search within a folder hierarchy, a whole drive, or files shared with the current user.\n\n\ud83d\udca1 TIP: Searches for files in a drive by name or content. The q parameter searches fil"
        },
        {
          "name": "list-group-planner-plans",
          "description": "Retrieve a list of plannerPlan objects owned by a group object.\n\n\ud83d\udca1 TIP: Lists the plans owned by a Microsoft 365 group. For a team, the group id is the team id."
        },
        {
          "name": "get-current-user",
          "description": "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 th"
        },
        {
          "name": "list-my-calendar-permissions",
          "description": "The permissions of the users with whom the calendar is shared.\n\n\ud83d\udca1 TIP: Lists share recipients and delegates on the user's primary calendar. Returns calendarPermission objects with id, role ('none' | 'freeBusyRead' | 'limitedRead' | 'read' |"
        },
        {
          "name": "create-my-calendar-permission",
          "description": "Create a calendarPermission resource to specify the identity and role of the user with whom the specified calendar is being shared or delegated.\n\n\ud83d\udca1 TIP: Shares the user's primary calendar with another user (or sets up a delegate). Body: { e"
        },
        {
          "name": "update-my-calendar-permission",
          "description": "Update my calendar permission.\n\n\ud83d\udca1 TIP: Changes the role (permission level) granted to an existing share recipient or delegate. Body: { role: 'read' | 'write' | 'delegateWithoutPrivateEventAccess' | 'delegateWithPrivateEventAccess' }. Only t"
        },
        {
          "name": "delete-my-calendar-permission",
          "description": "Delete my calendar permission.\n\n\ud83d\udca1 TIP: Revokes a calendar share or delegate access. Get the permission id via list-my-calendar-permissions. Permissions where isRemovable=false (e.g. the implicit 'My Organization' default) cannot be deleted "
        },
        {
          "name": "list-calendars",
          "description": "Get all the user's calendars (/calendars navigation property), get the calendars from the default calendar group or from a specific calendar group."
        },
        {
          "name": "create-calendar",
          "description": "Create a new calendar for a user.\n\n\ud83d\udca1 TIP: Creates a new personal calendar. Body: { name: 'My Calendar', color: 'auto' }. Available colors: auto, lightBlue, lightGreen, lightOrange, lightGray, lightYellow, lightTeal, lightPink, lightBrown, l"
        },
        {
          "name": "update-calendar",
          "description": "Update a calendar.\n\n\ud83d\udca1 TIP: Updates a calendar's properties. Body: { name: 'New Name', color: 'lightBlue' }. Cannot update the default calendar's name."
        },
        {
          "name": "delete-calendar",
          "description": "Delete a calendar other than the default calendar.\n\n\ud83d\udca1 TIP: Deletes a calendar and all its events. The default calendar cannot be deleted. This action cannot be undone."
        },
        {
          "name": "get-specific-calendar-view",
          "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\ud83d\udca1 TIP: Returns expanded recurring event instances (not just seriesMaster) within a dat"
        },
        {
          "name": "list-specific-calendar-events",
          "description": "List events from one of the signed-in user's calendars, addressed by calendar ID.\n\n\ud83d\udca1 TIP: WARNING: Does NOT expand recurring events \u2014 only returns seriesMaster. Use get-specific-calendar-view instead."
        },
        {
          "name": "create-specific-calendar-event",
          "description": "Create a calendar event on a specific calendar. Requires calendarId (the target calendar's ID). Times use nested {dateTime, timeZone} objects \u2014 do NOT use startDateTime/startTimeZone. UTC is simplest for one-off events; for recurring events"
        },
        {
          "name": "get-specific-calendar-event",
          "description": "Get a single event from one of the signed-in user's calendars, addressed by calendar ID and event ID. Any calendar can be addressed this way, including the default one."
        },
        {
          "name": "update-specific-calendar-event",
          "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 simples"
        },
        {
          "name": "delete-specific-calendar-event",
          "description": "Delete a specific calendar event. Requires calendarId (the target calendar's ID) and eventId (the event's own ID).\n\n\ud83d\udca1 TIP: Deleting a seriesMaster deletes ALL occurrences. To cancel a single occurrence, use the specific instance ID."
        },
        {
          "name": "list-calendar-event-instances",
          "description": "The occurrences of a recurring series, if the event is a series master. This property includes occurrences that are part of the recurrence pattern, and exceptions modified, but doesn't include occurrences canceled from the series. Navigatio"
        },
        {
          "name": "get-calendar-view",
          "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\ud83d\udca1 TIP: Returns expanded recurring event instances (not j"
        },
        {
          "name": "list-calendar-view-delta",
          "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 e"
        },
        {
          "name": "list-contact-folders",
          "description": "Get the contact folder collection in the default Contacts folder of the signed-in user.\n\n\ud83d\udca1 TIP: Lists the user's Outlook contact folders (the named buckets that organize contacts). Always includes the built-in 'Contacts' folder; user-create"
        },
        {
          "name": "create-contact-folder",
          "description": "Create a new contactFolder under the user's default contacts folder. You can also create a new contactfolder as a child of any specified contact folder.\n\n\ud83d\udca1 TIP: Creates a new contact folder under the user's mailbox root. Body: { displayName"
        },
        {
          "name": "update-contact-folder",
          "description": "Update the properties of contactfolder object.\n\n\ud83d\udca1 TIP: Updates a contact folder. Body: { displayName?: 'New name', parentFolderId?: '<id>' } \u2014 both displayName (rename) and parentFolderId (move) are writable. The default 'Contacts' folder m"
        },
        {
          "name": "delete-contact-folder",
          "description": "Delete contactFolder other than the default contactFolder.\n\n\ud83d\udca1 TIP: Deletes a contact folder. The default 'Contacts' folder cannot be deleted \u2014 Graph returns an error. The folder (and its contents) typically lands in Deleted Items rather tha"
        },
        {
          "name": "list-contact-folder-child-folders",
          "description": "Get a collection of child folders under the specified contact folder.\n\n\ud83d\udca1 TIP: Lists immediate sub-folders under a given contact folder. Returns id, displayName, parentFolderId. Use list-contact-folders to discover top-level folders, then th"
        },
        {
          "name": "create-contact-child-folder",
          "description": "Create a new contactFolder as a child of a specified folder.  You can also create a new contactFolder under the user's default contact folder.\n\n\ud83d\udca1 TIP: Creates a sub-folder under an existing contact folder. Body: { displayName: 'Sub-folder n"
        },
        {
          "name": "list-contact-folder-contacts",
          "description": "Get a contact collection from the default Contacts folder of the signed-in user (.../me/contacts), or from the specified contact folder.\n\n\ud83d\udca1 TIP: Lists contacts inside a specific folder. Pair with list-contact-folders to discover the folder "
        },
        {
          "name": "create-contact-in-folder",
          "description": "Add a contact to the root Contacts folder or to the contacts endpoint of another contact folder.\n\n\ud83d\udca1 TIP: Creates a contact inside a specific folder (instead of the default Contacts folder). Body is a contact resource: { givenName, surname, "
        },
        {
          "name": "list-outlook-contacts",
          "description": "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:\n\n\ud83d\udca1 TIP: $filter only supports startswith() \u2014 contains() and eq on email"
        },
        {
          "name": "create-outlook-contact",
          "description": "Add a contact to the root Contacts folder or to the contacts endpoint of another contact folder."
        },
        {
          "name": "get-outlook-contact",
          "description": "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:"
        },
        {
          "name": "update-outlook-contact",
          "description": "Update the properties of a contact object.\n\n\ud83d\udca1 TIP: emailAddresses array is replaced entirely \u2014 include all addresses, not just new ones."
        },
        {
          "name": "delete-outlook-contact",
          "description": "Delete a contact."
        }
      ],
      "toolCount": 80,
      "resourceCount": null,
      "promptCount": null,
      "stderrExcerpt": "",
      "requiresCredentials": false,
      "network": "disabled",
      "networkAttemptedWhileOffline": false,
      "outboundHosts": []
    }
  },
  "tier": "gold",
  "tierReason": "Sandbox handshake completed and the published checks passed.",
  "logExcerpt": ""
}
