Skip to main content
Glama

Microsoft Graph MCP Server

GitHub release Quality gates Security Container security Coverage drift

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 (raw httpx), 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 $batch

❌

❌

❌

❌

❌

❌

✅

No SDK dependency (msgraph-sdk/azure-identity)

n/a

n/a

✅

✅

n/a

❌

✅

Sovereign clouds (US Gov, China, Germany)

❌

✅

❌

❌

❌

❌

✅

Hard read-only guard (MSGRAPH_READ_ONLY)

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, no azure-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(); set MSGRAPH_READ_ONLY=true to 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-full

Option 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-full

Run 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 creds

Option 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.toml pins mcp<2 (the stable FastMCP v1 API). mcp 2.x renamed FastMCP to MCPServer and changed the API surface; this server targets the FastMCP v1 API for simplicity and stability.

2. Register an app in Microsoft Entra ID

  1. App registrations → New registration.

  2. Under Authentication, add a public client / redirect for the auth mode you plan to use (device-code and interactive need no redirect URI).

  3. Grant the API permissions your tools need (delegated and/or application). DEFAULT_DELEGATED_SCOPES in auth.py lists sensible defaults.

  4. 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 true

scripts/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 registration

The 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-full

A 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-full

Client secret (app-only / daemon)

export MSGRAPH_AUTH_MODE=client_secret
export MSGRAPH_CLIENT_ID=...
export MSGRAPH_CLIENT_SECRET=...
export MSGRAPH_TENANT_ID=...
msgraph-mcp-full

Certificate (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-full

On-behalf-of

export MSGRAPH_AUTH_MODE=obo
export MSGRAPH_CLIENT_ID=... MSGRAPH_CLIENT_SECRET=... MSGRAPH_TENANT_ID=...
msgraph-mcp-full

Managed identity (Azure)

export MSGRAPH_AUTH_MODE=managed_identity     # or `managed_identity_user`
export MSGRAPH_CLIENT_ID=...                  # the managed identity's client id
msgraph-mcp-full

Pre-existing token

export MSGRAPH_AUTH_MODE=pre_token
export MSGRAPH_ACCESS_TOKEN=eyJ...
msgraph-mcp-full

4. 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 under env: 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"

list_messages top=10

Recent messages (sender, subject, preview).

"Draft a reply to Oliver accepting the meeting"

get_message → reply_message

Draft/sent confirmation (or draft body to review).

"What's on my calendar this week?"

list_events_in_range

A short event list with times.

"Create a 1-hour meeting tomorrow at 10:00"

create_event

Created event with id + link.

"Upload report.xlsx to my OneDrive root"

upload_file

File metadata + sharing-ready link.

"List questions asked in the #general channel today"

list_channel_messages

Channel messages with authors.

"What tasks are due in my To Do this week?"

list_tasks

Tasks with due dates and states.

"Any high-severity security alerts?"

list_security_alerts

Alerts with severity + status.

"Who signed in from outside the US recently?"

list_sign_in_logs

Matching sign-in log entries.


Configuration

Variable

Default

Description

MSGRAPH_AUTH_MODE

interactive

interactive, device_code, client_secret, certificate, obo, managed_identity, managed_identity_user, pre_token

MSGRAPH_CLIENT_ID

(empty)

Entra app (client) ID

MSGRAPH_TENANT_ID

common

Entra tenant ID

MSGRAPH_CLIENT_SECRET

(empty)

App secret (client_secret / obo)

MSGRAPH_CERT_PATH

(empty)

Path to PEM cert (certificate mode)

MSGRAPH_CERT_PASSWORD

(empty)

Optional cert password

MSGRAPH_SCOPES

(built-in defaults)

Comma-separated extra scopes

MSGRAPH_CLOUD

global

global, us_gov_l4, us_gov_l5, china, germany

MSGRAPH_BASE_URL

(from cloud)

Override Graph base URL

MSGRAPH_API_VERSION

v1.0

v1.0 or beta

MSGRAPH_ACCESS_TOKEN

(empty)

Pre-acquired token (pre_token)

MSGRAPH_HTTP_TIMEOUT

60

Seconds a tool call waits for the Graph response; raise for interactive/device_code sign-in, which waits for you in the browser

MSGRAPH_TOKEN_CACHE_PATH

~/.msgraph-mcp/token_cache.json

Token cache location

MSGRAPH_READ_ONLY

false

true disables every write tool

MSGRAPH_MAX_PAGES

50

Max pages auto-paginated per collection

MSGRAPH_LOG_LEVEL

WARNING

Python log level

MSGRAPH_TOOLSETS

core

Reserved for future per-workload gating

MCP_TRANSPORT

stdio

stdio or streamable-http

MCP_HOST

127.0.0.1

HTTP bind host

MCP_PORT

3000

HTTP bind port

MCP_API_KEY

(empty)

Bearer token required for HTTP transport


Tool reference

Tools are grouped by workload (each module under src/msgraph_mcp/tools/).

Workload

# Tools

Examples

mail

19

list/send/reply/forward messages, folders, drafts, rules, attachments, mailbox settings

files

19

OneDrive items, upload sessions, versions, permissions, sharing links, revoke

sharepoint

17

sites, lists, columns, content types, list items

calendar

14

events, calendars, free/busy, findMeetingTimes, rooms, schedule

teams

13

teams, channels, messages, replies, members, tabs

users

12

profiles, photo, direct reports, licenses, transitive memberships

onenote

11

notebooks, sections, section groups, pages (CRUD + copy)

planner

11

plans, buckets, tasks, task details, assignments

excel

10

workbooks, worksheets, ranges, tables, sessions

directory

9

directory objects, members, roles

groups

9

CRUD, members, owners, transitive membership

todo

9

task lists, tasks, checklist items

online_meetings

8

create meetings, transcripts, attendance, recordings

chat

7

chats, messages, create chat

contacts

7

contacts, contact folders

device_management

7

managed devices, compliance

security

6

alerts, incidents, secure scores

change_notifications

5

subscriptions (webhooks), delta

identity_governance

5

access reviews, entitlement mgmt, PIM

people

5

relevance search, insights, profile

reports

5

Microsoft 365 usage reports

audit_logs

4

sign-ins, directory audits, provisioning

presence

4

user presence, batch presence

search

2

unified Microsoft Search (KQL)

batch

1

Graph $batch

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=true to 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_CLOUD accordingly.

  • MSGRAPH_API_VERSION=beta exposes beta endpoints that may change without notice — prefer v1.0 unless 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.0 is 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 $batch call.


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 :-)

Support via PayPal


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 tools
add_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_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_sharepoint_usageD

Inputs: period.

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_shared_insightsD

Inputs: no named parameters.

list_shared_with_meD

Inputs: top.

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_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).

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.

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

    D1.7/5.0

    Scored across 219 tools

    Disambiguation2/5

    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.

    Naming Consistency4/5

    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.

    Tool Count1/5

    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.

    Completeness2/5

    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

    Related MCP Servers

    • A
      license
      B
      quality
      Not graded
      maintenance
      Provides 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.
      50
      15
      -
    • A
      license
      C
      quality
      Not graded
      maintenance
      An 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
      -
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables 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 npm
      MIT