Microsoft Graph MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_HOST | No | HTTP bind host | 127.0.0.1 |
| MCP_PORT | No | HTTP bind port | 3000 |
| MCP_API_KEY | No | Bearer token required for HTTP transport | |
| MCP_TRANSPORT | No | stdio or streamable-http | stdio |
| MSGRAPH_CLOUD | No | Sovereign cloud: global, us_gov_l4, us_gov_l5, china, germany | global |
| MSGRAPH_SCOPES | No | Comma-separated extra scopes | (built-in defaults) |
| MSGRAPH_BASE_URL | No | Override Graph base URL | (from cloud) |
| MSGRAPH_TOOLSETS | No | Reserved for future per-workload gating | core |
| MSGRAPH_AUTH_MODE | No | Authentication mode. One of: interactive, device_code, client_secret, certificate, obo, managed_identity, managed_identity_user, pre_token. | interactive |
| MSGRAPH_CERT_PATH | No | Path to PEM cert (certificate mode) | |
| MSGRAPH_CLIENT_ID | No | Entra app (client) ID | |
| MSGRAPH_LOG_LEVEL | No | Python log level | WARNING |
| MSGRAPH_MAX_PAGES | No | Max pages auto-paginated per collection | 50 |
| MSGRAPH_READ_ONLY | No | true disables every write tool | false |
| MSGRAPH_TENANT_ID | No | Entra tenant ID | common |
| MSGRAPH_API_VERSION | No | v1.0 or beta | v1.0 |
| MSGRAPH_ACCESS_TOKEN | No | Pre-acquired token (pre_token) | |
| MSGRAPH_CERT_PASSWORD | No | Optional cert password | |
| MSGRAPH_CLIENT_SECRET | No | App secret (client_secret / obo) | |
| MSGRAPH_TOKEN_CACHE_PATH | No | Token cache location | ~/.msgraph-mcp/token_cache.json |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_sign_in_logsD | – |
| get_sign_in_logD | – |
| list_directory_audit_logsD | – |
| list_provisioning_logsD | – |
| 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. |
| list_upcoming_eventsC | List upcoming events from the user's default calendar. |
| list_events_in_rangeB | List events in a date range. Dates in ISO 8601 format. |
| get_eventD | – |
| list_event_instancesB | List instances of a recurring event in a date range. |
| list_event_attachmentsD | – |
| list_calendarsD | – |
| list_calendars_in_groupD | – |
| list_roomsD | – |
| find_meeting_timesC | Find meeting slots. attendees: semicolon-separated email addresses. |
| get_scheduleC | Get free/busy schedule. availability_views: semicolon-separated email addresses. |
| create_eventB | Create a calendar event. Dates in ISO 8601. attendees: semicolon-separated emails. |
| update_eventD | – |
| cancel_eventD | – |
| respond_to_eventC | Respond to event. response: 'tentativelyAccept', 'accept', 'decline'. |
| create_subscriptionC | Create a webhook subscription for a resource. resource: e.g. 'me/messages', 'me/events', 'me/drive/root'. |
| list_subscriptionsD | – |
| reauthorize_subscriptionB | Reauthorize an expiring subscription. |
| delete_subscriptionD | – |
| delta_queryC | Execute a delta query on a resource. resource: 'me/messages', 'me/events', 'me/contacts', 'me/drive/root'. |
| list_chatsD | – |
| get_chatD | – |
| list_chat_messagesD | – |
| list_chat_membersD | – |
| send_chat_messageC | Send a message to a chat. content_type: 'text' or 'html'. |
| create_chatA | Create a chat. chat_type: 'group' or 'oneOnOne'. members: semicolon-separated UPNs. |
| search_messagesC | Search Teams messages using Microsoft Search KQL. |
| list_contactsD | – |
| get_contactD | – |
| list_contact_foldersD | – |
| list_folder_contactsD | – |
| create_contactD | – |
| update_contactD | – |
| delete_contactD | – |
| list_managed_devicesD | – |
| get_managed_deviceD | – |
| list_directory_devicesA | List directory (Entra) devices, not Intune-managed devices. |
| list_device_configurationsD | – |
| list_compliance_policiesD | – |
| list_mobile_appsD | – |
| get_mobile_appD | – |
| get_organizationD | – |
| list_directory_rolesD | – |
| list_directory_role_membersD | – |
| list_administrative_unitsD | – |
| get_administrative_unitD | – |
| list_administrative_unit_membersD | – |
| list_org_contactsD | – |
| get_org_contactD | – |
| get_objects_by_idsC | Resolve multiple object IDs in one call. ids: comma-separated GUIDs. |
| list_worksheetsB | List worksheets in an Excel workbook stored in OneDrive/SharePoint. |
| get_used_rangeC | Get the used (data) range of a worksheet. |
| read_rangeB | Read cell values from a range. address: e.g. 'A1:C10' or 'A1'. |
| list_tablesD | – |
| list_table_rowsD | – |
| write_rangeC | Write values to a range. values_json: JSON 2D array, e.g. '[["A",1],["B",2]]'. |
| append_table_rowB | Append a row to a table. values_json: JSON 1D array of cell values. |
| update_table_rowC | Update a table row. index: 0-based row index. |
| create_tableC | Create a table from a range. address: e.g. 'A1:D10'. |
| create_sessionA | Create a persistent Excel session for batch operations. Returns session ID. |
| list_recent_filesD | – |
| list_shared_with_meD | – |
| list_root_filesD | – |
| get_fileD | – |
| get_file_contentB | Get file content (returns base64-encoded). |
| list_folder_childrenD | – |
| list_file_versionsD | – |
| list_permissionsD | – |
| search_filesD | – |
| create_folderD | – |
| upload_fileC | Upload a file. content_base64: base64-encoded file content. |
| create_upload_sessionB | Create an upload session for large files (>4MB). Returns upload URL. |
| update_fileD | – |
| delete_fileD | – |
| copy_fileD | – |
| move_fileD | – |
| create_sharing_linkB | Create a sharing link. link_type: 'view', 'edit', 'embed'. scope: 'anonymous', 'organization', 'users'. |
| revoke_sharing_linkD | – |
| list_group_drive_filesD | – |
| list_groupsD | – |
| get_groupD | – |
| list_group_membersD | – |
| list_group_ownersD | – |
| list_transitive_membersD | – |
| create_groupD | – |
| add_memberD | – |
| remove_memberD | – |
| delete_groupD | – |
| list_access_reviewsD | – |
| get_access_reviewD | – |
| list_access_packagesD | – |
| list_directory_role_assignmentsC | List Entra ID directory role assignments (PIM-adjacent). |
| list_directory_role_definitionsD | – |
| list_messagesD | – |
| get_messageD | – |
| list_attachmentsD | – |
| download_attachmentA | Get attachment content (returns base64-encoded bytes). |
| list_mail_foldersD | – |
| list_folder_messagesD | – |
| list_inbox_rulesD | – |
| send_mailC | Send email. to_recipients/cc_recipients: semicolon-separated email addresses. |
| create_draftA | Create a mail draft for user review (does not send). |
| send_draftD | – |
| reply_to_messageD | – |
| reply_all_to_messageD | – |
| forward_messageD | – |
| update_messageD | – |
| move_messageD | – |
| delete_messageD | – |
| get_mailbox_settingsD | – |
| update_mailbox_settingsC | Update mailbox settings. automatic_replies_status: 'enabled', 'disabled', or 'scheduled'. |
| delta_messagesC | Get message changes. For first call, omit delta_token. start_date_time: ISO 8601. |
| list_notebooksD | – |
| list_sectionsD | – |
| list_notebook_sectionsD | – |
| list_section_pagesD | – |
| list_section_groupsD | – |
| get_page_contentA | Get OneNote page content as HTML. |
| get_pageD | – |
| create_pageC | Create a OneNote page. html_content: HTML body content. |
| update_page_contentD | – |
| delete_pageD | – |
| copy_section_to_notebookC | Copy a section to a notebook. |
| create_online_meetingC | Create a Teams online meeting. participants: semicolon-separated emails (optional). |
| list_online_meetingsD | – |
| get_online_meetingD | – |
| list_transcriptsD | – |
| get_transcript_contentD | – |
| list_attendance_reportsD | – |
| list_meeting_recordingsD | – |
| list_all_transcriptsC | List all transcripts for a meeting. |
| people_searchB | Search people using the relevance graph (colleagues ranked by interaction). |
| list_trendingD | – |
| list_usedD | – |
| list_shared_insightsD | – |
| get_my_rich_profileD | – |
| list_my_planner_plansD | – |
| list_group_plansD | – |
| list_bucketsD | – |
| list_planner_tasksD | – |
| list_my_tasksD | – |
| get_task_detailsD | – |
| create_planner_taskC | Create a planner task. assignments: comma-separated user IDs to assign. |
| update_planner_taskA | Update a planner task. Requires If-Match header (use etag from the task). |
| create_planner_planD | – |
| create_planner_bucketD | – |
| delete_planner_taskD | – |
| get_my_presenceD | – |
| get_user_presenceD | – |
| get_presences_by_user_idA | Get presence for multiple users. user_ids: comma-separated GUIDs. |
| set_user_presenceC | Set presence. availability/activity: e.g. 'Available'/'Available', 'Busy'/'InACall'. |
| get_active_user_reportC | Get M365 active user detail report. period: 'D7', 'D30', 'D90', 'D180'. |
| get_teams_user_activityD | – |
| get_mailbox_usageD | – |
| get_onedrive_usageD | – |
| get_sharepoint_usageD | – |
| search_queryB | Unified Microsoft Search (KQL). entity_types: comma-separated (message, driveItem, site, listItem, person, event). |
| search_externalC | Search a specific Microsoft Graph connector (externalItem). |
| list_security_alertsC | List Microsoft 365 Defender alerts (v2). |
| get_security_alertD | – |
| list_security_incidentsD | – |
| get_security_incidentD | – |
| list_secure_scoresD | – |
| list_secure_score_controlsD | – |
| search_sitesA | Search SharePoint sites by name/description. |
| get_root_siteD | – |
| 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. |
| get_siteD | – |
| list_sub_sitesD | – |
| list_site_drivesA | List document libraries (drives) on a site. |
| list_listsD | – |
| get_listD | – |
| list_list_itemsC | List items in a SharePoint list. Use expand_fields=true to get column values. |
| list_list_items_with_fieldsA | List SharePoint list items with all column values expanded. |
| get_list_itemD | – |
| create_list_itemB | Create a list item. fields_json: JSON object of {columnName: value}. |
| update_list_itemB | Update list item fields. fields_json: JSON object of {columnName: value}. |
| delete_list_itemD | – |
| list_columnsB | List column schema of a SharePoint list. |
| list_content_typesD | – |
| list_site_pagesD | – |
| list_my_teamsD | – |
| list_all_teamsD | – |
| get_teamD | – |
| list_channelsD | – |
| get_channelD | – |
| list_channel_messagesD | – |
| get_channel_messageD | – |
| list_message_repliesD | – |
| send_channel_messageB | Send message to a Teams channel. content_type: 'text' or 'html'. |
| list_team_membersD | – |
| create_channelC | Create a channel. membership_type: 'standard' or 'private'. |
| list_installed_appsD | – |
| list_team_tabsD | – |
| list_todo_listsD | – |
| list_todo_tasksD | – |
| get_todo_taskD | – |
| create_todo_listD | – |
| create_todo_taskB | Create a To Do task. due_date: YYYY-MM-DD. importance: 'low', 'normal', 'high'. |
| update_todo_taskC | Update a To Do task. status: 'notStarted', 'inProgress', 'completed', 'deferred'. |
| delete_todo_taskD | – |
| add_checklist_itemD | – |
| list_checklist_itemsD | – |
| get_my_profileD | – |
| get_userD | – |
| list_usersD | – |
| get_user_photoC | Get user profile photo (returns metadata, not bytes). |
| get_direct_reportsD | – |
| get_user_managerD | – |
| get_transitive_member_ofD | – |
| get_user_licensesD | – |
| check_member_groupsC | Check if user belongs to groups. group_ids: comma-separated GUIDs. |
| update_userD | – |
| get_my_managerD | – |
| get_my_groupsD | – |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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.