Microsoft 365 MCP Server

Audited

io.github.Softeria/ms-365-mcp-server

Interact with Microsoft 365 and Office services through the Microsoft Graph API.

Install

npx -y @softeria/[email protected]

Client fit

Inferred for Cursor, Claude, Codex. Basis: stdio. This is not a certification from those products.

Transports: stdio.

Links

Other

Audit report

Audited Audited by AddonAudit.

Sandbox handshake completed and the published checks passed.

Automated smoke test, not a security guarantee.

Version
0.171.0
Audited
24 Oct 2026
Package
npm @softeria/ms-365-mcp-server
Advisories
0 critical, 0 high, 0 medium, 0 low
Time to ready
1594 ms
Network
Disabled
  • Pass Version. Pinned npm @softeria/[email protected]
  • Pass Known vulnerabilities. No critical, high, or medium advisories were returned.
  • Pass License. MIT
  • Pass Install scripts. No preinstall, install, postinstall, or prepare script.
  • Pass Credential patterns. No credential patterns in the published artifact.
  • Pass Package size. 351.8 KB
  • Pass Maintainer activity. Active 0 days ago.
  • Pass Sandbox. MCP handshake completed. 80 tools listed.

Tools

  • login Authenticate with Microsoft account
  • logout Log out from Microsoft account
  • verify-login Check current Microsoft authentication status
  • list-accounts 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.
  • select-account Select a Microsoft account as the default. Accepts email address (e.g. [email protected]) or account ID. Use list-accounts to discover available accounts.
  • remove-account Remove a Microsoft account from the cache. Accepts email address (e.g. [email protected]) or account ID. Use list-accounts to discover available accounts.
  • graph-batch 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
  • get-drive-item All items contained in the drive. Read-only. Nullable. 💡 TIP: Gets metadata for a file or folder: name, size, lastModifiedDateTime, createdBy, webUrl, file (mimeType, hashes), folder (childCount), parentReference, and @microsoft.graph.down
  • move-rename-onedrive-item Move or rename a OneDrive item. 💡 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.
  • delete-onedrive-file Delete a OneDrive file.
  • list-folder-files 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.
  • create-onedrive-folder Create a OneDrive folder. 💡 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),
  • upload-file-content The content stream, if the item represents a file. 💡 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
  • copy-drive-item Copy a drive item. 💡 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
  • create-drive-item-share-link 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. If a sharing link of the specified type already exists for the app,
  • create-upload-session Create an upload session. 💡 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
  • get-drive-delta Track changes in a driveItem and its children over time. Your app begins by calling delta without any parameters. The service starts enumerating the drive's hierarchy, returning pages of items and either an @odata.nextLink or an @odata.delt
  • share-drive-item 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. 💡 TIP: Shares a file or folder with specific users. Body:
  • list-drive-item-permissions The set of permissions for the item. Read-only. Nullable. 💡 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.
  • delete-drive-item-permission Delete a drive item permission. 💡 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.
  • create-drive-item-preview Create a drive item preview. 💡 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
  • list-drive-item-thumbnails Collection of thumbnailSet objects associated with the item. For more information, see getting thumbnails. Read-only. Nullable. 💡 TIP: Lists thumbnail sets for a file. Each set contains small (96px), medium (176px), large (800px) thumbnail
  • list-drive-item-versions The list of previous versions of the item. For more info, see getting previous versions. Read-only. Nullable. 💡 TIP: Lists version history of a file. Each version has id, lastModifiedDateTime, lastModifiedBy, and size. Use the version id w
  • list-excel-tables Represents a collection of tables associated with the workbook. Read-only. 💡 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
  • get-excel-table Represents a collection of tables associated with the workbook. Read-only. 💡 TIP: Gets a specific table by name or ID. Returns table properties including columns, showHeaders, showTotals, and style.
  • list-excel-table-rows The list of all the rows in the table. Read-only. 💡 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.
  • add-excel-table-rows Add Excel table rows. 💡 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.
  • update-excel-table-row Update an Excel table row. 💡 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.
  • delete-excel-table-row Delete an Excel table row. 💡 TIP: Delete a single row from a formal Excel table by zero-based row index.
  • list-excel-worksheets Represents a collection of worksheets associated with the workbook. Read-only.
  • create-excel-chart Creates a new chart.
  • sort-excel-range Sort an Excel range.
  • get-excel-range Get an Excel range.
  • update-excel-range Update an Excel range. 💡 TIP: Set cell values, formulas, or number format on any range — 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
  • clear-excel-range Clear an Excel range. 💡 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
  • delete-excel-range Delete an Excel range. 💡 TIP: Delete cells at the given range, shifting remaining content. Body: { shift: 'Up' } or { shift: 'Left' }. Use 'Up' to delete entire rows.
  • get-excel-range-format Returns a format object, encapsulating the range's font, fill, borders, alignment, and other properties. Read-only. 💡 TIP: Reads a range's format: alignment, wrapText, columnWidth, rowHeight. Font, fill, and borders are nested and omitted
  • format-excel-range Format an Excel range. 💡 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,
  • format-excel-range-border Format an Excel range border. 💡 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
  • format-excel-range-fill Format an Excel range fill. 💡 TIP: Set the background fill color of a range's cells.
  • format-excel-range-font Format an Excel range font. 💡 TIP: Set font formatting on a range: bold, italic, underline, size, color, and font name.
  • insert-excel-range Insert an Excel range. 💡 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.
  • merge-excel-range Merge an Excel range. 💡 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
  • unmerge-excel-range Unmerge an Excel range. 💡 TIP: Unmerge any merged cells within the given range back into individual cells. No request body. Inverse of merge-excel-range.
  • create-excel-table 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
  • get-excel-used-range Get an Excel used range. 💡 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
  • get-drive-root-item The root folder of the drive. Read-only.
  • search-onedrive-files Search the hierarchy of items for items matching a query. You can search within a folder hierarchy, a whole drive, or files shared with the current user. 💡 TIP: Searches for files in a drive by name or content. The q parameter searches fil
  • list-group-planner-plans Retrieve a list of plannerPlan objects owned by a group object. 💡 TIP: Lists the plans owned by a Microsoft 365 group. For a team, the group id is the team id.
  • get-current-user 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
  • list-my-calendar-permissions The permissions of the users with whom the calendar is shared. 💡 TIP: Lists share recipients and delegates on the user's primary calendar. Returns calendarPermission objects with id, role ('none' | 'freeBusyRead' | 'limitedRead' | 'read' |
  • create-my-calendar-permission Create a calendarPermission resource to specify the identity and role of the user with whom the specified calendar is being shared or delegated. 💡 TIP: Shares the user's primary calendar with another user (or sets up a delegate). Body: { e
  • update-my-calendar-permission Update my calendar permission. 💡 TIP: Changes the role (permission level) granted to an existing share recipient or delegate. Body: { role: 'read' | 'write' | 'delegateWithoutPrivateEventAccess' | 'delegateWithPrivateEventAccess' }. Only t
  • delete-my-calendar-permission Delete my calendar permission. 💡 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
  • list-calendars Get all the user's calendars (/calendars navigation property), get the calendars from the default calendar group or from a specific calendar group.
  • create-calendar Create a new calendar for a user. 💡 TIP: Creates a new personal calendar. Body: { name: 'My Calendar', color: 'auto' }. Available colors: auto, lightBlue, lightGreen, lightOrange, lightGray, lightYellow, lightTeal, lightPink, lightBrown, l
  • update-calendar Update a calendar. 💡 TIP: Updates a calendar's properties. Body: { name: 'New Name', color: 'lightBlue' }. Cannot update the default calendar's name.
  • delete-calendar Delete a calendar other than the default calendar. 💡 TIP: Deletes a calendar and all its events. The default calendar cannot be deleted. This action cannot be undone.
  • get-specific-calendar-view 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. 💡 TIP: Returns expanded recurring event instances (not just seriesMaster) within a dat
  • list-specific-calendar-events List events from one of the signed-in user's calendars, addressed by calendar ID. 💡 TIP: WARNING: Does NOT expand recurring events — only returns seriesMaster. Use get-specific-calendar-view instead.
  • create-specific-calendar-event Create a calendar event on a specific calendar. Requires calendarId (the target calendar's ID). Times use nested {dateTime, timeZone} objects — do NOT use startDateTime/startTimeZone. UTC is simplest for one-off events; for recurring events
  • get-specific-calendar-event 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.
  • update-specific-calendar-event 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
  • delete-specific-calendar-event Delete a specific calendar event. Requires calendarId (the target calendar's ID) and eventId (the event's own ID). 💡 TIP: Deleting a seriesMaster deletes ALL occurrences. To cancel a single occurrence, use the specific instance ID.
  • list-calendar-event-instances 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
  • get-calendar-view 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. 💡 TIP: Returns expanded recurring event instances (not j
  • list-calendar-view-delta 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
  • list-contact-folders Get the contact folder collection in the default Contacts folder of the signed-in user. 💡 TIP: Lists the user's Outlook contact folders (the named buckets that organize contacts). Always includes the built-in 'Contacts' folder; user-create
  • create-contact-folder 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. 💡 TIP: Creates a new contact folder under the user's mailbox root. Body: { displayName
  • update-contact-folder Update the properties of contactfolder object. 💡 TIP: Updates a contact folder. Body: { displayName?: 'New name', parentFolderId?: '<id>' } — both displayName (rename) and parentFolderId (move) are writable. The default 'Contacts' folder m
  • delete-contact-folder Delete contactFolder other than the default contactFolder. 💡 TIP: Deletes a contact folder. The default 'Contacts' folder cannot be deleted — Graph returns an error. The folder (and its contents) typically lands in Deleted Items rather tha
  • list-contact-folder-child-folders Get a collection of child folders under the specified contact folder. 💡 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
  • create-contact-child-folder 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. 💡 TIP: Creates a sub-folder under an existing contact folder. Body: { displayName: 'Sub-folder n
  • list-contact-folder-contacts Get a contact collection from the default Contacts folder of the signed-in user (.../me/contacts), or from the specified contact folder. 💡 TIP: Lists contacts inside a specific folder. Pair with list-contact-folders to discover the folder
  • create-contact-in-folder Add a contact to the root Contacts folder or to the contacts endpoint of another contact folder. 💡 TIP: Creates a contact inside a specific folder (instead of the default Contacts folder). Body is a contact resource: { givenName, surname,
  • list-outlook-contacts 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: 💡 TIP: $filter only supports startswith() — contains() and eq on email
  • create-outlook-contact Add a contact to the root Contacts folder or to the contacts endpoint of another contact folder.
  • get-outlook-contact 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:
  • update-outlook-contact Update the properties of a contact object. 💡 TIP: emailAddresses array is replaced entirely — include all addresses, not just new ones.
  • delete-outlook-contact Delete a contact.

Raw audit JSON

Metadata checks

  • Repository activity: Active in the last 180 days
  • License: Recognized SPDX id
  • Metadata quality: High

Score 100 uses public metadata only. It is separate from the audit tier. Payment never changes a score. How listings are checked.

Audited by AddonAudit

Free to use on this listing. The mark links back to this page and does not change the score or the tier.

Light

Audited by AddonAudit
[![Audited by AddonAudit](https://addonaudit.com/badges/audited.svg)](https://addonaudit.com/addon/io-github-softeria-ms-365-mcp-server/)
<a href="https://addonaudit.com/addon/io-github-softeria-ms-365-mcp-server/"><img alt="Audited by AddonAudit" src="https://addonaudit.com/badges/audited.svg" width="162" height="20"></a>
Audited by AddonAudit
[![Audited by AddonAudit](https://addonaudit.com/badges/audited-dark.svg)](https://addonaudit.com/addon/io-github-softeria-ms-365-mcp-server/)
<a href="https://addonaudit.com/addon/io-github-softeria-ms-365-mcp-server/"><img alt="Audited by AddonAudit" src="https://addonaudit.com/badges/audited-dark.svg" width="162" height="20"></a>
Audited by AddonAudit Audited by AddonAudit
[![Audited by AddonAudit](https://addonaudit.com/badges/audited-seal.svg)](https://addonaudit.com/addon/io-github-softeria-ms-365-mcp-server/)
<a href="https://addonaudit.com/addon/io-github-softeria-ms-365-mcp-server/"><img alt="Audited by AddonAudit" src="https://addonaudit.com/badges/audited-seal.svg" width="240" height="240"></a>
[![Audited by AddonAudit](https://addonaudit.com/badges/audited-seal-dark.svg)](https://addonaudit.com/addon/io-github-softeria-ms-365-mcp-server/)
<a href="https://addonaudit.com/addon/io-github-softeria-ms-365-mcp-server/"><img alt="Audited by AddonAudit" src="https://addonaudit.com/badges/audited-seal-dark.svg" width="240" height="240"></a>

Get your add-on audited

Request a free audit of a public MCP server or AI coding add-on. A request does not buy a listing, a tier, or a score change.

Request an audit Featured option

Data notes
  • Tool count is not part of this registry record, so it is blank.