# Microsoft 365 MCP connector

The Microsoft 365 connector brings your Teams, channels, chats, chat messages and user directory into Claude, ChatGPT, Cursor and the Elaichi Agent, so each person can search and act on them inside their own Microsoft 365 access.

Source: https://elaichi.ai/connectors/microsoft/

## Facts

| | |
| --- | --- |
| Application | Microsoft 365 |
| Category | SSO |
| AI tools | 86 |
| Authentication | Connects over OAuth |
| Bring your own OAuth app | No |
| MCP endpoint | https://api.elaichi.ai/mcp |
| Works with | Claude, ChatGPT, Cursor, any MCP client, and the Elaichi Agent |
| Tools advertised by name | No. Connected tools are never listed one by one, however few there are. The endpoint advertises `search_tools` and `execute_tool` instead |

## What you can ask once Microsoft 365 is connected

- Post a recap of today's customer call to the Northwind channel
- Who is in the Support Escalations team right now?
- Find the chat where we discussed the Q3 pricing change

## Connect Microsoft 365 in Elaichi

This happens once for the organization, before any client is involved.

1. Open Connections, choose Add connection, and pick Microsoft 365.
2. Optionally set Share with, then press Connect.
3. Approve it in Microsoft 365. Microsoft 365's own window opens. Whoever approves it decides what this connection can reach.

Credentials are vaulted and nobody, including the AI, reads them back. The connection becomes a toolbox immediately, so you can curate which Microsoft 365 tools are exposed, rename them, or freeze arguments before anyone points a client at it.

## Microsoft 365 MCP connector for Claude

Endpoint: https://api.elaichi.ai/mcp

1. Open Customize, then Connectors.
2. Press Add.
3. Name it, paste the MCP server URL, then Continue.
4. Sign in and approve.

On Team and Enterprise, an Owner adds it once. Everyone else turns it on for themselves.

## Microsoft 365 MCP connector for ChatGPT

Endpoint: https://api.elaichi.ai/mcp

1. Open Plugins, then press the + button.
2. Name it and paste the endpoint into Server URL.
3. Leave Authentication on OAuth, then tick the risk acknowledgement.
4. Press Create, then sign in and approve.

Works on the web today. The plugin directory lives at chatgpt.com/plugins.

## Microsoft 365 MCP connector for Cursor

Endpoint: https://api.elaichi.ai/mcp

1. Open `~/.cursor/mcp.json`.
2. Add the endpoint under `mcpServers`.
3. Reload Cursor, then sign in and approve.

Set up per machine, so repeat it on each computer you work from.

## Connect Microsoft 365 to any MCP client

Endpoint: https://api.elaichi.ai/mcp

1. Add the endpoint as a remote MCP server.
2. Sign in and approve.

The Elaichi Agent already has these tools, with nothing to set up.

## What the consent screen decides

Every scope the client asks for starts ticked except "Delete data and remove access", which you tick yourself. Calling a Microsoft 365 tool needs "Run your connected tools". Over MCP there is no trusted place to confirm a write in the moment, so the consent screen is the standing approval rather than a formality. Think hard before granting Delete, which reaches into connected apps and cannot be undone.

## What teams do with Microsoft 365 through Elaichi

### Post the call recap to the deal channel

Sales. After a customer call, have the agent write a short recap and post it to the account's Teams channel so the rest of the deal team sees the next steps without being asked.

### Find the chat where the fix was agreed

Support. Search across chats and channels for the thread about a customer's issue, pull out what was decided, and reply in the same chat with the answer.

### Set up channels for a new project

Operations. Create the project channels, name them to match your convention, and start the kickoff chat with the right people, all in one request.

### Check who is still in which team

HR. List the members of a team, compare them with who should be there, and remove anyone who has moved on.

### Keep the user directory tidy

IT. Look up a person by name, confirm their account details, and remove accounts that should no longer exist in Microsoft 365.

### Catch up on a week of chats

Leadership. Ask what changed across the channels and chats you care about and get a summary with the open questions, instead of scrolling through Teams on Monday morning.

## Elaichi vs Zapier MCP vs Composio for Microsoft 365

All three can connect Microsoft 365 to an AI assistant, and all three have admin controls. They differ in where access lives and how you pay.

| What to check | Elaichi | Zapier MCP | Composio |
| --- | --- | --- | --- |
| Where the AI connects | One address for the whole organization. Endpoint: https://api.elaichi.ai/mcp | A server per member, created at sign-in. | An MCP endpoint per team, or an SDK. |
| Control over Microsoft 365 tools | Allow or restrict single Microsoft 365 tools, per role or user. | App and action restrictions on the account. | Role permissions, down to the action. |
| Record of calls | One audit entry per Microsoft 365 call. | A History tab of tool calls. | A log of every tool call. |
| Single sign-on | SAML or OIDC, plus SCIM, on Gold. | SAML on Enterprise. | SAML and OIDC on Enterprise. |
| Price | $15 per user per month. | 2 tasks per successful call. | Billed per tool call. |

Sources: Zapier MCP [docs](https://docs.zapier.com/mcp/get-started/quickstart), [security](https://docs.zapier.com/mcp/manage/security), [usage](https://docs.zapier.com/mcp/features/usage); Composio [docs](https://docs.composio.dev/docs/composio-connect), [gateway](https://composio.dev/mcp-gateway), [enterprise](https://composio.dev/enterprise), [pricing](https://composio.dev/pricing). Checked September 2026.

Longer take: [Zapier MCP alternative](/blog/zapier-mcp-alternative/) and [when you don't need an MCP gateway](/blog/when-you-dont-need-an-mcp-gateway/).

## Frequently asked questions

### How do I connect Microsoft 365 to Claude?

First, connect Microsoft 365 in Elaichi: a Microsoft sign-in window opens, you sign in with your work account and approve, and there is no OAuth application to register and no client ID or secret to generate. Then open Claude, go to Customize, then Connectors, then Add, and paste https://api.elaichi.ai/mcp as the endpoint. Claude asks you to sign in to Elaichi, and from then on it can work with your Microsoft 365 teams, channels and chats as you.

### Does Microsoft 365 work with ChatGPT and Cursor as well as Claude?

Yes. Once Microsoft 365 is connected in Elaichi, the same endpoint, https://api.elaichi.ai/mcp, works in Claude, ChatGPT, Cursor, any MCP client and the Elaichi Agent. You connect Microsoft 365 once and every client you use picks it up.

### What can an AI agent actually do with my Microsoft 365 data?

With Microsoft 365 connected, an agent can list your teams and their members, browse channels, read and search chats and chat messages, send a message into a chat, create or rename a channel, and look people up in the user directory. In practice that means asking for a recap of a channel, finding the chat where something was decided, or posting a note to the right team. Short, concrete asks work better than long sentences.

### Does connecting Microsoft 365 give the AI access to everything in my tenant?

No. Access follows the person who signed in, so an agent working through Microsoft 365 sees only the teams, channels and chats that person can already see, and a private channel they are not in stays hidden. Elaichi can narrow that access further with restrictions, and it never widens it beyond what Microsoft 365 already allows that person.

### Can my team share one Microsoft 365 connection?

Yes. One person connects Microsoft 365 in Elaichi and shares the connection with a team, and nobody else ever sees or handles a credential. Each teammate still signs in to Elaichi as themselves, so every action in Microsoft 365 is logged under the name of the person who asked for it.

### Can I stop an agent from deleting or changing things in Microsoft 365?

Yes. Restrictions in Elaichi work per action, so you can block deleting users, removing team members, deleting channels or chats, or editing messages while still allowing reading and searching. A restricted action is left out of the tool list the AI client receives for Microsoft 365, so it cannot be called no matter how the prompt is worded.

### What happens to a Microsoft 365 connection when someone leaves?

Offboarding a person in Elaichi ends their access to Microsoft 365 through every client at once. A shared Microsoft 365 connection keeps working for everyone else on the team. If you want to remove Microsoft 365 entirely, disconnecting it once in Elaichi removes it from Claude, ChatGPT, Cursor and every other client.

### Does the Microsoft 365 MCP connector work with Gemini, Codex, Claude Code or other MCP clients?

Yes. Microsoft 365 is reached over the same MCP endpoint every client uses, so anything that speaks MCP can call it — Gemini, Codex, Claude Code, Windsurf, Cline, Zed and OpenCode among them — alongside Claude, ChatGPT, Cursor, and the Elaichi Agent. The tools on offer and the access behind them are identical whichever client asks. Only the setup screen differs.

### Is Elaichi an alternative to Zapier MCP for Microsoft 365?

Yes. Both let Claude, ChatGPT or Cursor use Microsoft 365. Zapier MCP fits a team that already automates in Zapier, since each person signs in and acts as themselves in that account. Elaichi fits when IT wants one address for the whole company, per-tool rules by role, and a record of every Microsoft 365 call.

### How is Elaichi different from Composio for Microsoft 365?

Composio gives AI agents tools and sign-in handling across 1,000+ apps, for developers building agents or people using an assistant, billed per tool call. Elaichi gives a company's own people governed access to Microsoft 365: one address, restrictions per role or user, and $15 per user per month. Both have role permissions and a log of every call.

## All 86 Microsoft 365 tools

Every tool below is callable through https://api.elaichi.ai/mcp once Microsoft 365 is connected, subject to the toolbox it is in and the restrictions on the caller.

- **List all Microsoft 365 teams** (List). List Microsoft teams in the organization, with optional OData ordering, property selection, and entity expansion. Returns each team object including its id, displayName, description, memberSettings, and createdDateTime. Results are paginated.
- **Get single Microsoft 365 team by ID** (Get). Get the properties and relationships of a specific Microsoft team by id. Returns the team object, identified by its id. Required: id.
- **List all Microsoft 365 team members** (List). List members of a Microsoft team. Returns each conversation member's id plus its subtype-specific fields (attributes); membership ids are opaque strings and members may span tenants. Required: team_id.
- **Get single Microsoft 365 team member by ID** (Get). Get a single conversation member of a Microsoft team by id. Returns: id, displayName, roles, visibleHistoryStartDateTime, attributes, token_type, expires_in, ext_expires_in, access_token. Required: team_id and id.
- **Delete a Microsoft 365 team member by ID** (Delete). Remove a conversation member from a Microsoft team by id. Returns an empty 204 response on success. Required: team_id and id.
- **List all Microsoft 365 search** (List). Run a Microsoft Search query across Microsoft 365 content and return the matching search hits. Returns: id. Required: requests. Max 15 hits per page.
- **List all Microsoft 365 users** (List). List Microsoft Entra user objects in the directory. Returns: id, displayName, givenName, surname, userPrincipalName, mail, jobTitle, businessPhones, mobilePhone, officeLocation, preferredLanguage. Supports $search, $filter, $orderby, $select, and $expand; $search and $count queries require the ConsistencyLevel 'eventual' header.
- **Get single Microsoft 365 user by ID** (Get). Get a Microsoft Entra user by id. Returns: id, birthday, city, country, department, identities, interests, mail, print, responsibilities, schools, skills, state, surname, activities, authentication, calendar, calendars, chats, contacts, drive, drives, events, extensions, insights, manager, messages, notes, onenote, outlook, people, photo, photos, planner, presence, settings, solutions, sponsors,…
- **Delete a Microsoft 365 user by ID** (Delete). Delete a Microsoft Entra user by id. Returns an empty 204 response on success. Deleted users, including their mailbox and license assignments, are moved to a temporary container and can be restored within 30 days; after 30 days the object is permanently deleted. Required: id.
- **List all Microsoft 365 me** (List). Get the profile of the signed-in user from Microsoft Graph via the /me endpoint. Returns: id, birthday, city, country, department, identities, interests, mail, print, responsibilities, schools, skills, state, surname, activities, authentication, calendar, calendars, chats, contacts, drive, drives, events, extensions, insights, manager, messages, notes, onenote, outlook, people, photo, photos,…
- **List all Microsoft 365 channels** (List). List channels of a Microsoft Teams team. Returns each channel's id, displayName, and membershipType. Requires team_id.
- **Get single Microsoft 365 channel by ID** (Get). Get a single Microsoft Teams channel by id. Returns the channel object including id, displayName, and membershipType. Requires team_id and id.
- **Create a Microsoft 365 channel** (Create). Create a new channel in a Microsoft Teams team. Returns the created channel with its id, displayName, and membershipType. Requires team_id and displayName (max 50 characters; private channels allow up to 200 members).
- **Update a Microsoft 365 channel by ID** (Update). Update a Microsoft Teams channel by id with a partial channel payload (e.g. displayName, membershipType). Returns an empty 204 response on success. Requires team_id and id.
- **Delete a Microsoft 365 channel by ID** (Delete). Delete a Microsoft Teams channel by id. Returns an empty 204 response on success. Requires team_id and id.
- **List all Microsoft 365 chats** (List). List the Microsoft Teams chats the signed-in user is part of. Returns: id, members, lastMessagePreview. Supports $orderby, $select, and $expand to shape results.
- **Get single Microsoft 365 chat by ID** (Get). Get a single Microsoft Teams chat by id (without its messages). Returns: id, topic, viewpoint, members, messages, tabs. Required: id. Supports $select and $expand.
- **Create a Microsoft 365 chat** (Create). Create a new Microsoft Teams chat in Microsoft Graph. Returns the created chat object with its id plus the chat's properties (attributes) as defined by the Microsoft Graph chat resource schema.
- **Update a Microsoft 365 chat by ID** (Update). Update the properties of a Microsoft Teams chat by id. Returns an empty 204 response on success. Required: id.
- **Delete a Microsoft 365 chat by ID** (Delete). Soft-delete a Microsoft Teams chat by id. Returns an empty 204 response on success. Required: id.
- **List all Microsoft 365 chat messages** (List). List the messages in a Microsoft Teams chat. Returns chatMessage records including their id. Supports the OData options $select, $expand, $orderby, $filter, and $search. Required: chat_id.
- **Get single Microsoft 365 chat message by ID** (Get). Get a single message or message reply from a Microsoft Teams chat. Returns the chatMessage record, identified by its id. Required: chat_id and id.
- **Create a Microsoft 365 chat message** (Create). Send a new message to a Microsoft Teams chat. Returns the created chatMessage record, identified by its id. Required: chat_id and a chatMessage request body. This API can't create a new chat; the chat must already exist.
- **Update a Microsoft 365 chat message by ID** (Update). Update a message in a Microsoft Teams chat by supplying the chatMessage property values to apply. Returns an empty 204 response on success. Required: chat_id, id, and a chatMessage request body.
- **Delete a Microsoft 365 chat message by ID** (Delete). Soft delete a Microsoft Teams chat message in a chat owned by the signed-in user; the deletion can be undone via the undoSoftDelete action. Returns an empty 204 response on success. Required: chat_id, id.
- **List all Microsoft 365 channel messages** (List). List messages (without replies) in a Microsoft Teams channel. Returns chatMessage records including id and policyViolation. Required: team_id, channel_id (team_id falls back to the connection's default workspace when omitted).
- **Get single Microsoft 365 channel message by ID** (Get). Get a single message in a Microsoft Teams channel by id. Returns the chatMessage record including id and policyViolation. Required: team_id, channel_id, id.
- **Create a Microsoft 365 channel message** (Create). Send a new message to a Microsoft Teams channel. Returns the created chatMessage record including id and policyViolation. Required: team_id, channel_id, and a chatMessage request body.
- **Update a Microsoft 365 channel message by ID** (Update). Update a message in a Microsoft Teams channel by id, typically to set or clear its policyViolation (DLP) status. Returns an empty 204 response on success. Required: team_id, channel_id, id.
- **Delete a Microsoft 365 channel message by ID** (Delete). Soft-delete a message in a Microsoft Teams channel by id, marking it as deleted without permanently removing it. Returns an empty 204 response on success. Required: team_id, channel_id, id.
- **List all Microsoft 365 buckets** (List). List the buckets (columns) of a Microsoft Planner plan. Returns bucket objects including id, name, planId, orderHint, and createdDateTime. Required: plan_id.
- **Get single Microsoft 365 bucket by ID** (Get). Get a single Microsoft Planner bucket by id. Returns the bucket object including id, name, planId, orderHint, and createdDateTime. Required: id.
- **Delete a Microsoft 365 bucket by ID** (Delete). Delete a Microsoft Planner bucket by id. Returns an empty 204 response on success. Required: id.
- **Update a Microsoft 365 bucket by ID** (Update). Update a Microsoft Planner bucket by id, such as renaming it or changing its orderHint. Returns the updated bucket object including id, name, planId, and orderHint. Required: id and etag_value (If-Match ETag for optimistic concurrency).
- **Create a Microsoft 365 bucket** (Create). Create a new Microsoft Planner bucket. Returns the created bucket object including id, name, planId, orderHint, and createdDateTime.
- **List all Microsoft 365 attachments** (List). List the external reference links attached to a Microsoft Planner task's details. Returns the references dictionary where each entry has alias, previewPriority, type, and url. Required: task_id.
- **Microsoft 365 attachments download** (Download). Download the raw file content in Microsoft from a direct download URL. Returns the file's binary content stream rather than a JSON object. Required: base, path.
- **Get single Microsoft 365 attachment by ID** (Get). Get the shared driveItem behind a Microsoft sharing link. Returns the item's id, name, size, and webUrl. A sharing URL must be transformed into a sharing token before use. Required: id.
- **List all Microsoft 365 tasks** (List). List the Planner tasks in Microsoft that belong to a specific plan. Returns Planner task records, each identified by its id. Required: plan_id.
- **Get single Microsoft 365 task by ID** (Get). Get a single Planner task in Microsoft by id, including its properties and relationships. Returns the planner task object; the source documents only its id — remaining fields follow the Microsoft Graph plannerTask schema. Optional $select and $expand can narrow or expand the returned properties. Required: id.
- **Delete a Microsoft 365 task by ID** (Delete). Delete a Planner task in Microsoft by id. Optionally pass etag_value to match the task's ETag for optimistic concurrency. Returns an empty 204 response on success. Required: id.
- **Update a Microsoft 365 task by ID** (Update). Update a Planner task in Microsoft by id with a JSON body of planner task property values. Returns an empty 204 response on success. Required: id, etag_value (supplied as the If-Match ETag header, required by Microsoft Graph for this call).
- **List all Microsoft 365 me plans** (List). List Microsoft Planner plans shared with the signed-in user. Returns: id, title, owner, createdBy, createdDateTime, context.
- **Get single Microsoft 365 me plan by ID** (Get). Get a single Microsoft Planner plan by id. Returns: id, container, createdBy, createdDateTime, owner, title, buckets, details, tasks, context, token_type, expires_in, ext_expires_in, access_token. Required: id.
- **Update a Microsoft 365 me plan by ID** (Update). Update a Microsoft Planner plan by id. Returns: id, title, owner, createdBy, createdDateTime, context. Required: id, etag_value.
- **Delete a Microsoft 365 me plan by ID** (Delete). Delete a Microsoft Planner plan by id. Returns an empty 204 response on success. Required: id, etag_value.
- **Microsoft 365 drive item download download** (Download). Download the raw content of a file drive item from a Microsoft site's drive. Returns the file's binary content as a stream (application/octet-stream) — an opaque file payload with no JSON fields. Required: site_id, drive_id, item_id.
- **List all Microsoft 365 drives** (List). List the drives (document libraries) of a Microsoft site. Returns drive records including id. Required: site_id.
- **List all Microsoft 365 drive items** (List). List Microsoft SharePoint drive items in a drive folder. Returns each driveItem with its id, name, size, file/folder facet, parent info, and the expanded listItem with content-type-specific SharePoint fields. Required: site_id, drive_id, and item_id (defaults to 'root' to list from the drive root).
- **Get single Microsoft 365 drive item by ID** (Get). Get a single Microsoft SharePoint drive item by id within a site's drive. Returns the driveItem resource including its id plus the resource's remaining properties. Required: id, site_id, drive_id.
- ...and 36 more tools. Call `tools/list` via the MCP endpoint, or see the full catalog via the API, for the complete set.
