Microsoft Graph MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Microsoft Graph MCP Server Show my unread emails from the last hour"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Microsoft Graph MCP Server
Project
A Model Context Protocol (MCP) server that exposes the full Microsoft Graph API to AI agents such as opencode, Claude, Cursor and any other MCP client — 219 tools across 25 workloads: mail, calendar, files, Teams, SharePoint, Planner, To Do, OneNote, Excel, presence, search, identity governance, security, reports, audit logs and more.
Microsoft Graph is the single REST entry point into Microsoft 365. This server lets an agent authenticate to your tenant once and then operate your real mail, files, calendar, Teams and SharePoint data directly — reading inboxes, drafting and sending mail, creating calendar events and meetings, uploading or sharing files, answering Teams channels, maintaining Planner/To Do tasks, and administering users, groups, security and audit logs.
Self-hosted & by-design full-coverage. Unlike the hosted Microsoft-hosted "MCP Server for Enterprise", this server runs on your machine or container, uses your own credentials (interactive, device-code, client-secret, certificate, on-behalf-of, managed identity), and can write — with a hard read-only guard when you want it safe.
Related MCP server: Microsoft 365 MCP Server
Table of Contents
Why another Microsoft Graph MCP server?
Several Microsoft Graph / Microsoft 365 MCP servers already exist. I have no affiliation with any of them — they are referenced honestly for comparison, exactly as with this project's siblings.
The main players
Official — Microsoft MCP Server for Enterprise — hosted by Microsoft, read-only Entra directory only. It does not expose one tool per Graph operation; instead it uses RAG to generate Queries on the fly (
microsoft_graph_suggest_queries,microsoft_graph_get,microsoft_graph_list_properties). Global cloud only, write support still in preview, no self-hosting.Softeria/ms-365-mcp-server — Node.js, the closest "full coverage" alternative: 300+ tools, 1:1 endpoint mapping, MSAL, read-only mode, tool presets + dynamic discovery. Worth evaluating.
DustHoff/msgraphmcp — Node.js/TypeScript, 140+ tools, four auth modes, notably deep Intune coverage (~64 Intune tools).
nitin27may/ms-graph-mcp — Python, 85 tools, no SDK / no
azure-identity(rawhttpx), namespaced tools, read/write separation behind a write scope.CodyBuilder-dev/ms-graph-mcp — Node.js, device-code auth, mail/calendar/ Teams/To Do/contacts/files/OneDrive/SharePoint, but no directory surface.
timfurlong/msgraph-mcp — Python, on PyPI, mail + calendar + read-only Teams, MSAL device code only, uses the Graph SDK.
What sets this project apart
Capability | Microsoft official | Softeria | DustHoff | nitin27may | CodyBuilder | timfurlong | this project |
Language / runtime | hosted | Node.js | Node.js | Python | Node.js | Python | Python |
Tools | 3 | 300+ | 140+ | 85 | ~50 | ~45 | 219 |
Read-only Entra directory | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ |
Mail (send/reply/rules/archive) | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Calendar + meetings + rooms | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Files / OneDrive (upload, sharing, revoke) | ❌ | ✅ | ✅ | ✅ | ✅ | partial | ✅ |
SharePoint sites/lists/columns/items | ❌ | ✅ | ✅ | partial | ✅ | ❌ | ✅ |
Teams channels + messages | ❌ | ✅ | ✅ | ✅ | ✅ | read-only | ✅ |
Planner + To Do | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ |
OneNote notebooks/pages | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ |
Excel workbooks/ranges/tables | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
Intune / device management | ❌ | partial | deep | ❌ | ❌ | ❌ | ✅ |
Identity governance (reviews/PIM) | partial | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
Security alerts/incidents + audit logs | ❌ | partial | ❌ | ❌ | ❌ | ❌ | ✅ |
Reports (M365 usage) | ❌ | partial | ❌ | ❌ | ❌ | ❌ | ✅ |
Change notifications / delta | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
Graph | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
No SDK dependency ( | n/a | n/a | ✅ | ✅ | n/a | ❌ | ✅ |
Sovereign clouds (US Gov, China, Germany) | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
Hard read-only guard ( | n/a | ✅ | ❌ | ✅ | partial | ❌ | ✅ |
Coverage drift CI vs official Graph spec | n/a | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
Tool counts and capabilities are approximate, from the respective READMEs at the time of writing — always verify against the source. The point is not that "more is better", but that this project is the deliberate Python, self-hostable, write-capable, zero-SDK option covering the practical day-to-day Microsoft 365 surface an agent actually uses, with CI that keeps it honest against the ever-growing Graph API.
Key differentiators
Full coverage, one auth seam. Authenticate once (six modes) and reach mail, files, calendar, Teams, SharePoint, Planner, To Do, OneNote, Excel, presence, security, audit and admin — instead of stitching together several single-workload servers.
No
msgraph-sdk, noazure-identity. A thin raw-HTTP client (httpx) +msal. A radically smaller dependency tree and an inspectable wire path.Writes are possible but guarded. Write tools call
require_write(); setMSGRAPH_READ_ONLY=trueto forbid every one of them. Nothing mutates your tenant by accident.Coverage drift CI. A scheduled job compares the tool surface against the official Microsoft Graph OpenAPI spec and files an issue when Microsoft ships endpoints we don't cover yet — so the gap is visible instead of silent.
What it provides
A single stdio/HTTP MCP server exposing 219 tools across 25 workloads:
Mail — list/search/get messages, send, reply, forward, drafts, folders, move, rules, attachments, mailbox settings
Files — OneDrive + SharePoint drives: items, upload sessions, versions, permissions, sharing links, revoke
Calendar — events, calendars, free/busy, meeting times, rooms, schedules
Teams — teams, channels, messages, replies, members, tabs
Users & groups — profiles, photos, licenses, memberships, members/owners
Planner & To Do — plans, buckets, tasks, assignments, checklist items
OneNote — notebooks, sections, section groups, pages
Excel — workbooks, worksheets, ranges, tables, sessions
SharePoint — sites, lists, columns, content types, list items
Admin & security — directory, device management, security alerts/incidents, audit logs, reports, identity governance
Meetings & presence — online meetings, transcripts, attendance, recordings, presence
Search & integration — unified Microsoft Search,
$batch, change notifications / delta
—
Getting started
You need an MCP-capable client (opencode, Claude Desktop, Cursor, etc.).
1. Install
Option A — from PyPI (recommended)
uvx msgraph-mcp-full
# or
pip install msgraph-mcp-fullOption B — from GitHub (latest source)
uvx --from "git+https://github.com/oliverhruby/msgraph-mcp.git" msgraph-mcp-full
# or
pip install "git+https://github.com/oliverhruby/msgraph-mcp.git"Option C — development from source
git clone https://github.com/oliverhruby/msgraph-mcp.git
cd msgraph-mcp
uv sync # or: python -m venv .venv && .venv/bin/python -m pip install -e ".[dev]"
uv run msgraph-mcp-fullRun the checks before merging changes:
uv run ruff check src scripts tests
uv run pytest -q # offline unit suite (auth, client, 219-tool sweep)
uv run pytest -m integration -q # live read-only tests; skips without credsOption D — Docker
docker pull ghcr.io/oliverhruby/msgraph-mcp:latest
docker run --rm -i \
-e MSGRAPH_AUTH_MODE=client_secret \
-e MSGRAPH_CLIENT_ID=... -e MSGRAPH_CLIENT_SECRET=... \
-e MSGRAPH_TENANT_ID=... \
ghcr.io/oliverhruby/msgraph-mcp:latest
pyproject.tomlpinsmcp<2(the stable FastMCP v1 API).mcp 2.xrenamedFastMCPtoMCPServerand changed the API surface; this server targets the FastMCP v1 API for simplicity and stability.
2. Register an app in Microsoft Entra ID
App registrations → New registration.
Under Authentication, add a public client / redirect for the auth mode you plan to use (device-code and interactive need no redirect URI).
Grant the API permissions your tools need (delegated and/or application).
DEFAULT_DELEGATED_SCOPESinauth.pylists sensible defaults.Note the Tenant ID, Client ID (and Client Secret / cert if using those modes).
Automated (Azure CLI) — the same registration can be created from your
az identity with one command (Bicep/ARM cannot register Entra apps; they live
in Microsoft Graph, not Azure Resource Manager):
az ad app create --display-name msgraph-mcp-local \
--sign-in-audience AzureADMyOrg \
--public-client-redirect-uris "http://localhost" \
--is-fallback-public-client truescripts/setup_entra_app.ps1 wraps this for the common cases — it reuses an
app if it already exists, prints the Client ID / Tenant ID, optionally
persists MSGRAPH_CLIENT_ID / MSGRAPH_TENANT_ID (setx), dumps the IDs to a
JSON file for other tooling, and can tear the registration back down:
.\scripts\setup_entra_app.ps1 # create + print IDs
.\scripts\setup_entra_app.ps1 -SetEnv # + persist env vars
.\scripts\setup_entra_app.ps1 -OutFile C:\temp\g.json # + write IDs for pipeline
.\scripts\setup_entra_app.ps1 -Delete -AppId <clientId> # remove registrationThe equivalent automation paths are the Microsoft Graph API (e.g. via
az rest --method POST --uri https://graph.microsoft.com/v1.0/applications)
or the Entra (azuread) Terraform provider, if you need full IaC.
3. Authenticate
Configuration is entirely via environment variables.
Interactive (default)
export MSGRAPH_AUTH_MODE=interactive
export MSGRAPH_CLIENT_ID=00000000-0000-0000-0000-000000000000
export MSGRAPH_TENANT_ID=11111111-1111-1111-1111-111111111111
msgraph-mcp-fullA browser opens, you sign in, and a token cache is saved at
~/.msgraph-mcp/token_cache.json for later runs.
Device code
export MSGRAPH_AUTH_MODE=device_code
export MSGRAPH_CLIENT_ID=...
msgraph-mcp-fullClient secret (app-only / daemon)
export MSGRAPH_AUTH_MODE=client_secret
export MSGRAPH_CLIENT_ID=...
export MSGRAPH_CLIENT_SECRET=...
export MSGRAPH_TENANT_ID=...
msgraph-mcp-fullCertificate (app-only)
export MSGRAPH_AUTH_MODE=certificate
export MSGRAPH_CLIENT_ID=...
export MSGRAPH_CERT_PATH=/path/to/cert.pem
export MSGRAPH_TENANT_ID=...
msgraph-mcp-fullOn-behalf-of
export MSGRAPH_AUTH_MODE=obo
export MSGRAPH_CLIENT_ID=... MSGRAPH_CLIENT_SECRET=... MSGRAPH_TENANT_ID=...
msgraph-mcp-fullManaged identity (Azure)
export MSGRAPH_AUTH_MODE=managed_identity # or `managed_identity_user`
export MSGRAPH_CLIENT_ID=... # the managed identity's client id
msgraph-mcp-fullPre-existing token
export MSGRAPH_AUTH_MODE=pre_token
export MSGRAPH_ACCESS_TOKEN=eyJ...
msgraph-mcp-full4. Register with your MCP client
opencode — add to ~/.config/opencode/opencode.json (or opencode.jsonc):
{
"mcp": {
"msgraph": {
"type": "local",
"enabled": true,
"command": ["uvx", "msgraph-mcp-full"],
"env": {
"MSGRAPH_AUTH_MODE": "client_secret",
"MSGRAPH_CLIENT_ID": "{env:MSGRAPH_CLIENT_ID}",
"MSGRAPH_CLIENT_SECRET": "{env:MSGRAPH_CLIENT_SECRET}",
"MSGRAPH_TENANT_ID": "{env:MSGRAPH_TENANT_ID}"
}
}
}
}Put credentials in your shell/environment (or a
.env) and reference them with{env:VAR}, or hardcode them underenv:directly.
Claude Desktop / Cursor — use claude_desktop_config.json / .mcp.json
with a standard mcpServers entry pointing command/args at the venv python
and -m msgraph_mcp, plus an env block.
Over HTTP/SSE (MCP_TRANSPORT=streamable-http):
{
"mcpServers": {
"msgraph": {
"url": "http://127.0.0.1:3000/mcp",
"headers": { "Authorization": "Bearer <MCP_API_KEY>" }
}
}
}After editing client config, restart the client so the MCP server is loaded.
Prompt examples
User prompt | Likely tool call(s) | Expected response |
"Show my last 10 emails" |
| Recent messages (sender, subject, preview). |
"Draft a reply to Oliver accepting the meeting" |
| Draft/sent confirmation (or draft body to review). |
"What's on my calendar this week?" |
| A short event list with times. |
"Create a 1-hour meeting tomorrow at 10:00" |
| Created event with id + link. |
"Upload |
| File metadata + sharing-ready link. |
"List questions asked in the #general channel today" |
| Channel messages with authors. |
"What tasks are due in my To Do this week?" |
| Tasks with due dates and states. |
"Any high-severity security alerts?" |
| Alerts with severity + status. |
"Who signed in from outside the US recently?" |
| Matching sign-in log entries. |
Configuration
Variable | Default | Description |
|
|
|
| (empty) | Entra app (client) ID |
|
| Entra tenant ID |
| (empty) | App secret (client_secret / obo) |
| (empty) | Path to PEM cert (certificate mode) |
| (empty) | Optional cert password |
| (built-in defaults) | Comma-separated extra scopes |
|
|
|
| (from cloud) | Override Graph base URL |
|
|
|
| (empty) | Pre-acquired token (pre_token) |
|
| Seconds a tool call waits for the Graph response; raise for interactive/ |
|
| Token cache location |
|
|
|
|
| Max pages auto-paginated per collection |
|
| Python log level |
|
| Reserved for future per-workload gating |
|
|
|
|
| HTTP bind host |
|
| HTTP bind port |
| (empty) | Bearer token required for HTTP transport |
Tool reference
Tools are grouped by workload (each module under src/msgraph_mcp/tools/).
Workload | # Tools | Examples |
| 19 | list/send/reply/forward messages, folders, drafts, rules, attachments, mailbox settings |
| 19 | OneDrive items, upload sessions, versions, permissions, sharing links, revoke |
| 17 | sites, lists, columns, content types, list items |
| 14 | events, calendars, free/busy, findMeetingTimes, rooms, schedule |
| 13 | teams, channels, messages, replies, members, tabs |
| 12 | profiles, photo, direct reports, licenses, transitive memberships |
| 11 | notebooks, sections, section groups, pages (CRUD + copy) |
| 11 | plans, buckets, tasks, task details, assignments |
| 10 | workbooks, worksheets, ranges, tables, sessions |
| 9 | directory objects, members, roles |
| 9 | CRUD, members, owners, transitive membership |
| 9 | task lists, tasks, checklist items |
| 8 | create meetings, transcripts, attendance, recordings |
| 7 | chats, messages, create chat |
| 7 | contacts, contact folders |
| 7 | managed devices, compliance |
| 6 | alerts, incidents, secure scores |
| 5 | subscriptions (webhooks), delta |
| 5 | access reviews, entitlement mgmt, PIM |
| 5 | relevance search, insights, profile |
| 5 | Microsoft 365 usage reports |
| 4 | sign-ins, directory audits, provisioning |
| 4 | user presence, batch presence |
| 2 | unified Microsoft Search (KQL) |
| 1 | Graph |
Total | 219 |
Each tool is decorated with @graph_tool(...) carrying its HTTP method, Graph
endpoint, and the delegated + application scopes required. Read any tool's
docstring for exact behaviour; write tools call require_write() and fail fast
in read-only mode.
Data & safety notes
Most tools are read-only. The write tools (send/reply, create event, upload/share/revoke file, create task, admin mutations, …) mutate real Microsoft 365 state. Use them with care, or set
MSGRAPH_READ_ONLY=trueto disable the entire write surface.The server acts as your credentials — it can reach only what the authenticated principal can reach. Delegated modes honour your user's permissions; app-only modes use the application's granted permissions.
Sovereign-cloud endpoints differ; set
MSGRAPH_CLOUDaccordingly.MSGRAPH_API_VERSION=betaexposes beta endpoints that may change without notice — preferv1.0unless you know you need a beta API.
Contributing
Contributor and maintainer guidance is in CONTRIBUTING.md.
Contribution workflow and local setup
Architecture and implementation details
Release process (PyPI, GitHub Releases, GHCR)
CI quality gates and upstream coverage drift checks
Limitations
Token lifetime = server lifetime. The auth session lives for the lifetime of the MCP server process; restarting the client means signing in again (the on-disk cache in
~/.msgraph-mcp/helps for interactive/device flows).Beta surface is opt-in. Only
v1.0is covered by the coverage-drift baseline; beta endpoints are registered but not independently monitored.Coverage is broad, not exhaustive. The Graph API has ~18,000 v1.0 operations; this server wraps the practical day-to-day surface (219 tools) and tracks the gap via the coverage-drift canary rather than claiming 100%.
Intune & admin depth. Device management and Intune are covered at a useful level but not as deep as a dedicated Intune server (e.g. DustHoff's).
No Graph Explorer-grade generality. For an arbitrary, not-yet-covered endpoint, prefer the official server, GraphMind-style indexing, or a raw
$batchcall.
Support
If you like this project and want to support or request a feature, send me a beer, it keeps my mind relaxed and ideas will come :-)
![]()
License
MIT © Oliver Hrubý
This project is not affiliated with or endorsed by Microsoft or any of the other MCP servers referenced above. Microsoft Graph and Microsoft 365 are trademarks of Microsoft Corporation.
Available Tools
219 toolsadd_checklist_itemD
Inputs: list_id (required), task_id (required), display_name (required).
add_memberD
Inputs: user_id (required), group_id (required).
append_table_rowB
Append a row to a table. values_json: JSON 1D array of cell values.
Inputs: file_id (required), table_id (required), values_json (required).
batch_requestA
Execute up to 20 Graph requests in one round trip. requests_json: JSON array of {id, method, url, body?, headers?}. Relative URLs like '/me/messages' are relative to the selected API version.
Inputs: requests_json (required).
cancel_eventD
Inputs: event_id (required).
check_member_groupsC
Check if user belongs to groups. group_ids: comma-separated GUIDs.
Inputs: user_id (required), group_ids (required).
copy_fileD
Inputs: name (required), file_id (required), parent_id.
copy_section_to_notebookC
Copy a section to a notebook.
Inputs: section_id (required), notebook_id (required), site_id, site_collection_id.
create_channelC
Create a channel. membership_type: 'standard' or 'private'.
Inputs: team_id (required), display_name (required), description, membership_type.
create_chatA
Create a chat. chat_type: 'group' or 'oneOnOne'. members: semicolon-separated UPNs.
Inputs: chat_type (required), topic, members.
create_contactD
Inputs: surname (required), given_name (required), job_title, company_name, +2 more.
create_draftA
Create a mail draft for user review (does not send).
Inputs: body (required), subject (required), to_recipients (required), body_type, +1 more.
create_eventB
Create a calendar event. Dates in ISO 8601. attendees: semicolon-separated emails.
Inputs: subject (required), end_datetime (required), start_datetime (required), body, +5 more.
create_folderD
Inputs: name (required), parent_id (required).
create_groupD
Inputs: display_name (required), group_types, mail_enabled, security_enabled.
create_list_itemB
Create a list item. fields_json: JSON object of {columnName: value}.
Inputs: list_id (required), site_id (required), fields_json (required).
create_online_meetingC
Create a Teams online meeting. participants: semicolon-separated emails (optional).
Inputs: subject (required), end_datetime (required), start_datetime (required), participants, +1 more.
create_pageC
Create a OneNote page. html_content: HTML body content.
Inputs: section_id (required), html_content (required), title.
create_planner_bucketD
Inputs: name (required), plan_id (required).
create_planner_planD
Inputs: title (required), group_id (required).
create_planner_taskC
Create a planner task. assignments: comma-separated user IDs to assign.
Inputs: title (required), plan_id (required), bucket_id (required), assignments, +2 more.
create_sessionA
Create a persistent Excel session for batch operations. Returns session ID.
Inputs: file_id (required), persist_changes.
create_sharing_linkB
Create a sharing link. link_type: 'view', 'edit', 'embed'. scope: 'anonymous', 'organization', 'users'.
Inputs: file_id (required), scope, link_type.
create_subscriptionC
Create a webhook subscription for a resource. resource: e.g. 'me/messages', 'me/events', 'me/drive/root'.
Inputs: resource (required), notification_url (required), change_type, client_state, +1 more.
create_tableC
Create a table from a range. address: e.g. 'A1:D10'.
Inputs: address (required), file_id (required), has_headers.
create_todo_listD
Inputs: display_name (required).
create_todo_taskB
Create a To Do task. due_date: YYYY-MM-DD. importance: 'low', 'normal', 'high'.
Inputs: title (required), list_id (required), due_date, body_text, +3 more.
create_upload_sessionB
Create an upload session for large files (>4MB). Returns upload URL.
Inputs: name (required), file_size (required), parent_id (required).
delete_contactD
Inputs: contact_id (required).
delete_fileD
Inputs: file_id (required).
delete_groupD
Inputs: group_id (required).
delete_list_itemD
Inputs: item_id (required), list_id (required), site_id (required).
delete_messageD
Inputs: message_id (required).
delete_pageD
Inputs: page_id (required).
delete_planner_taskD
Inputs: task_id (required), if_match.
delete_subscriptionD
Inputs: subscription_id (required).
delete_todo_taskD
Inputs: list_id (required), task_id (required).
delta_messagesC
Get message changes. For first call, omit delta_token. start_date_time: ISO 8601.
Inputs: delta_token, start_date_time.
delta_queryC
Execute a delta query on a resource. resource: 'me/messages', 'me/events', 'me/contacts', 'me/drive/root'.
Inputs: resource (required), delta_token.
download_attachmentA
Get attachment content (returns base64-encoded bytes).
Inputs: message_id (required), attachment_id (required).
find_meeting_timesC
Find meeting slots. attendees: semicolon-separated email addresses.
Inputs: end (required), start (required), attendees (required), is_required, +2 more.
forward_messageD
Inputs: message_id (required), to_recipients (required), comment.
get_access_reviewD
Inputs: review_id (required).
get_active_user_reportC
Get M365 active user detail report. period: 'D7', 'D30', 'D90', 'D180'.
Inputs: period.
get_administrative_unitD
Inputs: unit_id (required).
get_channelD
Inputs: team_id (required), channel_id (required).
get_channel_messageD
Inputs: team_id (required), channel_id (required), message_id (required).
get_chatD
Inputs: chat_id (required).
get_contactD
Inputs: contact_id (required), select.
get_direct_reportsD
Inputs: user_id (required).
get_eventD
Inputs: event_id (required), select.
get_fileD
Inputs: file_id (required), select.
get_file_contentB
Get file content (returns base64-encoded).
Inputs: file_id (required).
get_groupD
Inputs: group_id (required), expand, select.
get_listD
Inputs: list_id (required), site_id (required).
get_list_itemD
Inputs: item_id (required), list_id (required), site_id (required), expand_fields.
get_mailbox_settingsD
Inputs: no named parameters.
get_mailbox_usageD
Inputs: period.
get_managed_deviceD
Inputs: device_id (required).
get_messageD
Inputs: message_id (required), select.
get_mobile_appD
Inputs: app_id (required).
get_my_groupsD
Inputs: no named parameters.
get_my_managerD
Inputs: no named parameters.
get_my_presenceD
Inputs: no named parameters.
get_my_profileD
Inputs: no named parameters.
get_my_rich_profileD
Inputs: no named parameters.
get_objects_by_idsC
Resolve multiple object IDs in one call. ids: comma-separated GUIDs.
Inputs: ids (required), types.
get_onedrive_usageD
Inputs: period.
get_online_meetingD
Inputs: meeting_id (required).
get_organizationD
Inputs: no named parameters.
get_org_contactD
Inputs: contact_id (required).
get_pageD
Inputs: page_id (required).
get_page_contentA
Get OneNote page content as HTML.
Inputs: page_id (required).
get_presences_by_user_idA
Get presence for multiple users. user_ids: comma-separated GUIDs.
Inputs: user_ids (required).
get_root_siteD
Inputs: no named parameters.
get_scheduleC
Get free/busy schedule. availability_views: semicolon-separated email addresses.
Inputs: end_date (required), start_date (required), availability_views (required), interval_minutes.
get_security_alertD
Inputs: alert_id (required).
get_security_incidentD
Inputs: incident_id (required).
get_sign_in_logD
Inputs: log_id (required).
get_siteD
Inputs: site_id (required).
get_site_by_pathA
Get a site by its full path. hostname: e.g. 'contoso.sharepoint.com'. path: e.g. 'sites/marketing' or '' for root.
Inputs: path (required), hostname (required).
get_task_detailsD
Inputs: task_id (required).
get_teamD
Inputs: team_id (required).
get_teams_user_activityD
Inputs: period.
get_todo_taskD
Inputs: list_id (required), task_id (required).
get_transcript_contentD
Inputs: user_id (required), meeting_id (required), transcript_id (required).
get_transitive_member_ofD
Inputs: user_id (required).
get_used_rangeC
Get the used (data) range of a worksheet.
Inputs: file_id (required), worksheet.
get_userD
Inputs: user_id (required).
get_user_licensesD
Inputs: user_id (required).
get_user_managerD
Inputs: user_id (required).
get_user_photoC
Get user profile photo (returns metadata, not bytes).
Inputs: user_id (required).
get_user_presenceD
Inputs: user_id (required).
list_access_packagesD
Inputs: top.
list_access_reviewsD
Inputs: top, filter.
list_administrative_unit_membersD
Inputs: unit_id (required).
list_administrative_unitsD
Inputs: top.
list_all_teamsD
Inputs: top.
list_all_transcriptsC
List all transcripts for a meeting.
Inputs: user_id (required), meeting_id (required).
list_attachmentsD
Inputs: message_id (required).
list_attendance_reportsD
Inputs: user_id (required), meeting_id (required).
list_bucketsD
Inputs: plan_id (required), group_id (required).
list_calendarsD
Inputs: no named parameters.
list_calendars_in_groupD
Inputs: group_id (required).
list_channel_messagesD
Inputs: team_id (required), channel_id (required), top.
list_channelsD
Inputs: team_id (required), top, filter.
list_chat_membersD
Inputs: chat_id (required).
list_chat_messagesD
Inputs: chat_id (required), top.
list_chatsD
Inputs: top, filter.
list_checklist_itemsD
Inputs: list_id (required), task_id (required).
list_columnsB
List column schema of a SharePoint list.
Inputs: list_id (required), site_id (required).
list_compliance_policiesD
Inputs: top.
list_contact_foldersD
Inputs: no named parameters.
list_contactsD
Inputs: top, filter, select, order_by.
list_content_typesD
Inputs: list_id (required), site_id (required).
list_device_configurationsD
Inputs: top.
list_directory_audit_logsD
Inputs: top, filter.
list_directory_devicesA
List directory (Entra) devices, not Intune-managed devices.
Inputs: top, filter.
list_directory_role_assignmentsC
List Entra ID directory role assignments (PIM-adjacent).
Inputs: top, filter.
list_directory_role_definitionsD
Inputs: top.
list_directory_role_membersD
Inputs: role_id (required).
list_directory_rolesD
Inputs: no named parameters.
list_event_attachmentsD
Inputs: event_id (required).
list_event_instancesB
List instances of a recurring event in a date range.
Inputs: end_date (required), event_id (required), start_date (required).
list_events_in_rangeB
List events in a date range. Dates in ISO 8601 format.
Inputs: end_date (required), start_date (required), top.
list_file_versionsD
Inputs: file_id (required).
list_folder_childrenD
Inputs: file_id (required), top.
list_folder_contactsD
Inputs: folder_id (required), top.
list_folder_messagesD
Inputs: folder_id (required), top, filter.
list_group_drive_filesD
Inputs: group_id (required), top.
list_group_membersD
Inputs: group_id (required), top.
list_group_ownersD
Inputs: group_id (required).
list_group_plansD
Inputs: group_id (required).
list_groupsD
Inputs: top, filter, search, select, +1 more.
list_inbox_rulesD
Inputs: no named parameters.
list_installed_appsD
Inputs: team_id (required).
list_list_itemsC
List items in a SharePoint list. Use expand_fields=true to get column values.
Inputs: list_id (required), site_id (required), top, filter.
list_list_items_with_fieldsA
List SharePoint list items with all column values expanded.
Inputs: list_id (required), site_id (required), top, filter.
list_listsD
Inputs: site_id (required), top.
list_mail_foldersD
Inputs: top.
list_managed_devicesD
Inputs: top, filter, select.
list_meeting_recordingsD
Inputs: meeting_id (required).
list_message_repliesD
Inputs: team_id (required), channel_id (required), message_id (required).
list_messagesD
Inputs: top, filter, search, select, +1 more.
list_mobile_appsD
Inputs: top, filter.
list_my_planner_plansD
Inputs: no named parameters.
list_my_tasksD
Inputs: no named parameters.
list_my_teamsD
Inputs: top.
list_notebooksD
Inputs: top.
list_notebook_sectionsD
Inputs: notebook_id (required).
list_online_meetingsD
Inputs: top.
list_org_contactsD
Inputs: top.
list_permissionsD
Inputs: file_id (required).
list_planner_tasksD
Inputs: plan_id (required), group_id (required).
list_provisioning_logsD
Inputs: top, filter.
list_recent_filesD
Inputs: top.
list_roomsD
Inputs: no named parameters.
list_root_filesD
Inputs: top, select, order_by.
list_section_groupsD
Inputs: no named parameters.
list_section_pagesD
Inputs: section_id (required), top.
list_sectionsD
Inputs: top.
list_secure_score_controlsD
Inputs: top.
list_secure_scoresD
Inputs: top.
list_security_alertsC
List Microsoft 365 Defender alerts (v2).
Inputs: top, filter.
list_security_incidentsD
Inputs: top, filter.
list_sign_in_logsD
Inputs: top, filter.
list_site_drivesA
List document libraries (drives) on a site.
Inputs: site_id (required).
list_site_pagesD
Inputs: site_id (required).
list_subscriptionsD
Inputs: no named parameters.
list_sub_sitesD
Inputs: site_id (required).
list_table_rowsD
Inputs: file_id (required), table_id (required).
list_tablesD
Inputs: file_id (required).
list_team_membersD
Inputs: team_id (required).
list_team_tabsD
Inputs: team_id (required), channel_id (required).
list_todo_listsD
Inputs: top.
list_todo_tasksD
Inputs: list_id (required), top, filter.
list_transcriptsD
Inputs: user_id (required), meeting_id (required).
list_transitive_membersD
Inputs: group_id (required).
list_trendingD
Inputs: no named parameters.
list_upcoming_eventsC
List upcoming events from the user's default calendar.
Inputs: top.
list_usedD
Inputs: no named parameters.
list_usersD
Inputs: top, filter, search, select, +1 more.
list_worksheetsB
List worksheets in an Excel workbook stored in OneDrive/SharePoint.
Inputs: file_id (required).
move_fileD
Inputs: file_id (required), parent_id (required).
move_messageD
Inputs: message_id (required), destination_id (required).
people_searchB
Search people using the relevance graph (colleagues ranked by interaction).
Inputs: query (required), top.
read_rangeB
Read cell values from a range. address: e.g. 'A1:C10' or 'A1'.
Inputs: address (required), file_id (required), worksheet.
reauthorize_subscriptionB
Reauthorize an expiring subscription.
Inputs: subscription_id (required).
remove_memberD
Inputs: user_id (required), group_id (required).
reply_all_to_messageD
Inputs: message_id (required), comment.
reply_to_messageD
Inputs: message_id (required), comment.
respond_to_eventC
Respond to event. response: 'tentativelyAccept', 'accept', 'decline'.
Inputs: event_id (required), response (required), send_response.
revoke_sharing_linkD
Inputs: file_id (required), permission_id (required).
search_externalC
Search a specific Microsoft Graph connector (externalItem).
Inputs: query (required), connection_id (required), size.
search_filesD
Inputs: query (required), top.
search_messagesC
Search Teams messages using Microsoft Search KQL.
Inputs: query (required), top.
search_queryB
Unified Microsoft Search (KQL). entity_types: comma-separated (message, driveItem, site, listItem, person, event).
Inputs: query (required), size, entity_types.
search_sitesA
Search SharePoint sites by name/description.
Inputs: query (required).
send_channel_messageB
Send message to a Teams channel. content_type: 'text' or 'html'.
Inputs: content (required), team_id (required), channel_id (required), content_type.
send_chat_messageC
Send a message to a chat. content_type: 'text' or 'html'.
Inputs: chat_id (required), content (required), content_type.
send_draftD
Inputs: message_id (required).
send_mailC
Send email. to_recipients/cc_recipients: semicolon-separated email addresses.
Inputs: body (required), subject (required), to_recipients (required), body_type, +2 more.
set_user_presenceC
Set presence. availability/activity: e.g. 'Available'/'Available', 'Busy'/'InACall'.
Inputs: user_id (required), activity (required), session_id (required), availability (required), +1 more.
update_contactD
Inputs: contact_id (required), surname, given_name, phone_number, +1 more.
update_eventD
Inputs: event_id (required), subject, end_datetime, start_datetime.
update_fileD
Inputs: file_id (required), name, description.
update_list_itemB
Update list item fields. fields_json: JSON object of {columnName: value}.
Inputs: item_id (required), list_id (required), site_id (required), fields_json (required).
update_mailbox_settingsC
Update mailbox settings. automatic_replies_status: 'enabled', 'disabled', or 'scheduled'.
Inputs: automatic_replies_body, automatic_replies_status.
update_messageD
Inputs: message_id (required), is_read, flag_status.
update_page_contentD
Inputs: page_id (required), html_content (required).
update_planner_taskA
Update a planner task. Requires If-Match header (use etag from the task).
Inputs: task_id (required), title, if_match, due_datetime, +1 more.
update_table_rowC
Update a table row. index: 0-based row index.
Inputs: index (required), file_id (required), table_id (required), values_json (required).
update_todo_taskC
Update a To Do task. status: 'notStarted', 'inProgress', 'completed', 'deferred'.
Inputs: list_id (required), task_id (required), title, status, +2 more.
update_userD
Inputs: user_id (required), mail, about_me, display_name.
upload_fileC
Upload a file. content_base64: base64-encoded file content.
Inputs: name (required), parent_id (required), content_base64 (required), content_type.
write_rangeC
Write values to a range. values_json: JSON 2D array, e.g. '[["A",1],["B",2]]'.
Inputs: address (required), file_id (required), values_json (required), worksheet.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 219 tools
While most tools are named for a distinct resource/action, there are multiple near-duplicate or ambiguous tools: list_list_items vs list_list_items_with_fields, list_transcripts vs list_all_transcripts, list_sections vs list_notebook_sections, and delta_messages vs delta_query. With 219 tools, an agent is likely to select the wrong listing or search tool.
The overwhelming majority use a consistent lowercase verb_noun pattern such as list_, get_, create_, update_, and delete_. A few tools like batch_request, delta_query, search_query, and people_search break the verb-first convention, so the pattern is not perfectly uniform.
219 tools is an extreme surface area for any agent to evaluate and falls far beyond the well-scoped 3-15 tool range. Even though Microsoft Graph is vast, exposing all these operations as flat MCP tools makes selection and maintenance unwieldy.
The server gives solid lifecycle coverage to popular resources like mail, calendar events, files, and SharePoint list items, but many areas are read-only or partial: Teams has no create_team, planner plans/buckets cannot be updated or deleted, security alerts cannot be acted on, and directory/device tools mostly list or get only. batch_request provides a generic escape hatch, but it still requires the agent to know raw Graph API details, so significant gaps remain.
Related MCP Connectors
Hosted MCP catalog with 30 tenant-isolated browser, RAG, AI, mail and media tools.
Microsoft 365, CRM, Partner Center and tenant operations for organisations and MSPs.
Permissioned access to Outlook, OneDrive and Teams via the user's own Microsoft account
Unified MCP Server is a remote MCP connector for AI agents and vertical AI products that provides access to 22,000+ authorized SaaS tools across 400+ integrations and 24 categories directly inside LLMs (Claude, GPT, Gemini, Cohere). Tools operate only on explicitly authorized customer connections, enabling agents to safely read and write against live third-party systems.
Related MCP Servers
- AlicenseBqualityNot gradedmaintenanceProvides comprehensive management of Microsoft 365 services including Exchange, SharePoint, Teams, Azure AD, Intune device management, security & compliance frameworks, and universal access to 1000+ Microsoft Graph API endpoints with advanced features like batch operations, delta queries, and real-time webhooks.5015-
- AlicenseCqualityNot gradedmaintenanceAn MCP server that enables interaction with Microsoft 365 services like Outlook, OneDrive, Teams, and SharePoint via the Microsoft Graph API. It supports comprehensive operations including email management, file access, and organizational collaboration for personal and work accounts.78-
- AlicenseNot gradedqualityBmaintenanceEnables interaction with Microsoft 365 and Office services through the Microsoft Graph API, including email, calendar, files, Teams, SharePoint, and more.62,694 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables interacting with Microsoft 365 and Office services through the Microsoft Graph API, covering email, calendar, files, Teams, SharePoint, contacts, tasks, and related organizational resources with authentication, read-only, and tool-filtering options.62,694 npmMIT