# io.github.nitin27may/ms-graph-mcp (pypi · ms-graph-mcp)

Microsoft Graph MCP server — 85 tools for mail, calendar, Teams, files, SharePoint, and Entra ID

- Trust score: 66/100 (medium)
- Change this week: −15
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- pypi · `ms-graph-mcp`: 66/100 (this document), [markdown](https://verifymcp.io/servers/nitin27may-ms-graph-mcp/ms-graph-mcp.md), [page](https://verifymcp.io/servers/nitin27may-ms-graph-mcp/ms-graph-mcp)

## Channel facts

- Registry: `pypi`
- Package: `ms-graph-mcp`
- Version: `0.3.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Supply Chain Security**: 50/100
  - Malware scan not yet available for this package.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it.
  - 1 of 42 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 35/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - License check failed: no license is declared.
  - Actively maintained (last published 30 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 82/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2483 tokens (~107/item across 23 items; 23 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 80/100
  - Stability observed for 24 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 23 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 23 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the io.github.nitin27may/ms-graph-mcp server?

io.github.nitin27may/ms-graph-mcp runs locally as a PyPI package, launched with uvx ms-graph-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add nitin27may-ms-graph-mcp -- uvx ms-graph-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "nitin27may-ms-graph-mcp": {
      "command": "uvx",
      "args": [
        "ms-graph-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "nitin27may-ms-graph-mcp": {
      "command": "uvx",
      "args": [
        "ms-graph-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add nitin27may-ms-graph-mcp -- uvx ms-graph-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "nitin27may-ms-graph-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "ms-graph-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add nitin27may-ms-graph-mcp --command uvx --arg ms-graph-mcp
```

### Hermes

```yaml
mcp_servers:
  nitin27may-ms-graph-mcp:
    command: "uvx"
    args: ["ms-graph-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "nitin27may-ms-graph-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "ms-graph-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add nitin27may-ms-graph-mcp -t stdio -c uvx -a ms-graph-mcp
```

### Other

```json
{
  "mcpServers": {
    "nitin27may-ms-graph-mcp": {
      "command": "uvx",
      "args": [
        "ms-graph-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 66, −3)

- [functional] Stability: pass → 0.80

### 2026-09-19 (score 69, +1)

- [security] Stability: 0.97 → pass

### 2026-09-17 (score 68, −14)

- [security regression] Malware scan: pass → unverified

### 2026-09-16 (score 82, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-09-15 (score 67, +1)

No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-14 (score 66, −15)

- [security regression] Malware scan: pass → unverified

### 2026-09-12 (score 81, +16)

- [security improvement] Malware scan: unverified → pass

### 2026-09-11 (score 65, −15)

- [security regression] Malware scan: pass → unverified

## MCP tools (23)

### `calendar_list_upcoming_events` (~117 tokens)

List the signed-in user's upcoming calendar events for the next N days, soonest first. Returns id, subject, start and end times, organiser and whether it is online. This is the tool for 'what's on my calendar'. Use calendar_list_events_in_range for a specific window, and calendar_get_event for full detail including the join URL. Requires Calendars.Read.

Input parameters:

- `days_ahead` (integer): Number of days ahead to look (1-14)
- `max_results` (integer): Maximum meetings to return

### `calendar_get_event` (~93 tokens)

Get one calendar event in full by its id: subject, times, organiser, location, agenda preview, the Teams join URL and the complete attendee list with each person's response status. Takes an event id from calendar_list_upcoming_events or calendar_list_events_in_range. Use calendar_get_event_attendees when only the attendee list is needed. Requires Calendars.Read.

Input parameters:

- `meeting_id` (string, required): The calendar event ID

### `calendar_get_event_attendees` (~87 tokens)

List who was invited to a calendar event and how each person replied — accepted, declined, tentative or no response. Returns email, display name and response status per attendee. Use this when the question is about who is coming; calendar_get_event returns the same list alongside the event's other detail. Requires Calendars.Read.

Input parameters:

- `meeting_id` (string, required): The calendar event ID

### `calendar_list_events_in_range` (~152 tokens)

List calendar events between two dates, in chronological order. Use for any window that is not simply 'the next few days' — last week's meetings, a specific month, or a range the user names. Dates are ISO 8601 (2026-01-15) and the whole of both end days is included. Returns id, subject, times and organiser. Requires Calendars.Read.

Input parameters:

- `end_date` (string, required): End date ISO 8601 (e.g. 2024-01-22)
- `max_results` (integer): Maximum events to return
- `start_date` (string, required): Start date ISO 8601 (e.g. 2024-01-15)

### `calendar_find_meeting_times` (~196 tokens)

Ask Microsoft Graph to suggest meeting times when the given attendees are free, ranked by how likely everyone is to attend. Returns candidate slots with a confidence percentage and per-attendee availability. This reads calendars and books nothing — pass a chosen slot to calendar_create_event to actually schedule it. Requires Calendars.Read.Shared.

Input parameters:

- `attendees` (array): Who must attend. Empty looks at the signed-in user's calendar only.
- `duration_minutes` (integer): Meeting length in minutes
- `max_suggestions` (integer): How many candidate slots to return
- `minimum_attendee_percentage` (integer): Only suggest slots where at least this percentage of attendees are free (0-100)
- `time_zone` (string): Time zone for the window
- `window_end` (string): Latest acceptable end, ISO 8601
- `window_start` (string): Earliest acceptable start, ISO 8601. Defaults to now.

### `calendar_get_free_busy` (~165 tokens)

Look up whether people are free or busy across a time window, without seeing what their meetings are. Returns per-person busy periods and a slot-by-slot free/tentative/busy/out of office breakdown. Use to answer 'when is X available'; calendar_find_meeting_times is better when the goal is a slot that suits a whole group. Requires Calendars.ReadBasic.

Input parameters:

- `emails` (array, required): Email addresses to check availability for
- `end` (string, required): End of the window, ISO 8601
- `interval_minutes` (integer): Granularity of each availability slot, 5 to 1440
- `start` (string, required): Start of the window, ISO 8601
- `time_zone` (string): Time zone for start and end

### `mail_list_attachments` (~76 tokens)

List the file attachments on one email — name, content type and size in bytes. Returns metadata only and never file contents, so it is safe to call on messages with very large attachments. Inline images such as signature logos are excluded. Requires Mail.Read.

Input parameters:

- `message_id` (string, required): The message id to list attachments for

### `mail_search` (~130 tokens)

Search the signed-in user's mailbox by keyword, subject or sender name. Returns id, subject, sender, date and a preview snippet, newest first. Searchable folders are inbox, sentitems, drafts, or all. Use mail_list_recent when the ask is time-based rather than keyword-based, and mail_get_thread to read a whole conversation. Requires Mail.Read.

Input parameters:

- `folder` (string): Mail folder: inbox | sentitems | drafts | all
- `max_results` (integer): Maximum emails to return (1–50)
- `query` (string, required): Search keywords, subject, or sender name

### `mail_list_recent` (~98 tokens)

List the signed-in user's most recent emails from the last N days, newest first. Returns id, subject, sender, date and a preview snippet. Use for 'what came in today' or catching up after time away; mail_search is the tool when specific keywords or a sender are known. Requires Mail.Read.

Input parameters:

- `days_back` (integer): Number of days back to fetch
- `max_results` (integer): Maximum emails to return

### `mail_list_flagged` (~93 tokens)

List emails the signed-in user has flagged for follow-up, newest first. Returns id, subject, sender, date and preview. Flags are the user's own marker for 'come back to this', so use it for 'what do I still need to deal with' rather than mail_list_recent, which returns everything regardless of state. Requires Mail.Read.

Input parameters:

- `max_results` (integer): Maximum flagged emails to return

### `mail_get_thread` (~95 tokens)

Read every message in one email conversation, oldest first, given a conversation id from any of the mail listing tools. Returns full message bodies rather than previews, so it is the tool for understanding what was actually discussed before replying or summarising. Requires Mail.Read.

Input parameters:

- `conversation_id` (string, required): The email conversationId to fetch all messages in the thread
- `max_results` (integer): Maximum messages in the thread to return

### `files_search` (~98 tokens)

Search the signed-in user's OneDrive and the SharePoint sites they can reach, by filename or content keyword. Returns id, name, drive id, size, last-modified date and web URL. OneDrive and SharePoint document libraries are the same underlying resource, so one search covers both. Requires Files.Read.All.

Input parameters:

- `max_results` (integer): Maximum files to return
- `query` (string, required): Search keywords to find files and documents

### `files_list_trending` (~84 tokens)

List documents currently trending around the signed-in user — files their colleagues are actively working on, ranked by Microsoft 365 activity signals rather than by the user's own history. Use for 'what is the team working on'. files_list_recent is the tool for what this user personally touched. Requires Files.Read.All.

Input parameters:

- `max_results` (integer): Maximum trending files to return

### `files_list_recent` (~91 tokens)

List files the signed-in user has recently opened or edited, most recent first. Returns id, name, drive id and web URL. Use for 'the document I was working on yesterday' — files_search is better when the name or a keyword is known, and files_list_trending covers what colleagues are working on. Requires Files.Read.

Input parameters:

- `max_results` (integer): Maximum recently accessed files to return

### `files_get_content` (~114 tokens)

Read the text content of a file in OneDrive or SharePoint, given a drive id and item id from files_search or files_list_recent. Works for text, Office documents and PDFs; binary files return a placeholder instead of bytes. Output is truncated to a caller-specified character limit. Requires Files.Read.All.

Input parameters:

- `drive_id` (string, required): The OneDrive/SharePoint drive ID
- `item_id` (string, required): The file item ID
- `max_chars` (integer): Maximum characters of content to extract

### `files_list_shared_with_me` (~86 tokens)

List files other people have shared directly with the signed-in user, with the owner and web URL for each. Covers items shared via OneDrive or SharePoint that do not live in the user's own drive, which is why files_list_recent and files_search may not surface them. Requires Files.Read.All.

Input parameters:

- `max_results` (integer): Maximum shared-with-me files to return

### `search_query` (~156 tokens)

Search across Microsoft 365 in one call — email, calendar events, files, SharePoint sites and lists, and people. Best first move for a vague request, since it spans workloads no other single tool covers. Supports KQL such as 'budget filetype:xlsx'. Each entity type needs its own permission. Requires Mail.Read, Calendars.Read, Files.Read.All, Sites.Read.All and People.Read.

Input parameters:

- `entity_types` (array): What to search: message, event, driveItem, listItem, site, person
- `max_results` (integer): Maximum hits to return (1-25)
- `query` (string, required): What to search for. Supports KQL, e.g. 'budget filetype:xlsx'.

### `people_search` (~105 tokens)

Find colleagues the signed-in user actually works with, ranked by relevance from their own mail and meeting history — so it finds the right 'Priya' without exact spelling. Returns name, email, title and department. Use directory_search_users to search the whole tenant instead, or people_list_contacts for the saved address book. Requires People.Read.

Input parameters:

- `max_results` (integer): Maximum people to return
- `query` (string, required): Name or keyword to search for people in the org

### `people_list_contacts` (~86 tokens)

List the signed-in user's saved Outlook contacts, with names, email addresses and phone numbers. This is the user's personal address book and is the only place external contacts live — people with no account in the tenant, invisible to people_search and directory_search_users. Use it for phone numbers. Requires Contacts.Read.

Input parameters:

- `max_results` (integer): Maximum contacts to return (1-100)

### `people_search_contacts` (~101 tokens)

Search the signed-in user's saved Outlook contacts by name or company, returning emails and phone numbers. Searches the personal address book only — use people_search for colleagues the user works with, or directory_search_users to search the whole tenant. This is the one that finds external contacts. Requires Contacts.Read.

Input parameters:

- `max_results` (integer): Maximum contacts to return (1-100)
- `query` (string, required): Name or company to look for in the address book

### `people_get` (~90 tokens)

Look up one person in the organisation by their exact email address and return their profile: display name, job title, department, office location and phone numbers. Use when the address is already known — people_search is the tool for finding someone by partial or approximate name. Fails if the address does not belong to a tenant account. Requires User.Read.All.

Input parameters:

- `email` (string, required): The person's email address

### `people_get_my_profile` (~81 tokens)

Get the signed-in user's own profile — their name, email address, job title, department and office. Call this first when a request says 'me', 'my' or 'I' and the user's own identity or email address is needed to answer it, for example before filtering a calendar or addressing a message. Takes no arguments. Requires User.Read.

### `files_get_group_drive` (~89 tokens)

Get the document library backing a Microsoft 365 group or Teams team, given a group id from directory_search_groups. Returns the drive id and web URL, which is what the other file tools need to read or write inside a team's shared files. Requires Files.Read.All and Group.Read.All.

Input parameters:

- `group_id` (string, required): Microsoft 365 group (Team) id — same as team.id

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/nitin27may-ms-graph-mcp/ms-graph-mcp#diagnostics

## Score history

- 2026-09-20: 66
- 2026-09-19: 69
- 2026-09-18: 68
- 2026-09-17: 68
- 2026-09-16: 82
- 2026-09-15: 67
- 2026-09-14: 66
- 2026-09-13: 81
- 2026-09-12: 81
- 2026-09-11: 65
- 2026-09-10: 80
- 2026-09-09: 79
- 2026-09-08: 79
- 2026-09-07: 78
- 2026-09-06: 78
- 2026-09-05: 77
- 2026-09-04: 77
- 2026-09-03: 76
- 2026-09-02: 76
- 2026-09-01: 75
- 2026-08-31: 75
- 2026-08-30: 74
- 2026-08-29: 74
- 2026-08-28: 74
- 2026-08-27: 70
- 2026-08-26: 70
- 2026-08-25: 68
- 2026-08-24: 68
- 2026-08-23: 68
- 2026-08-22: 68

## Common questions

### What is the io.github.nitin27may/ms-graph-mcp server?

io.github.nitin27may/ms-graph-mcp is listed in the public MCP registry as io.github.nitin27may/ms-graph-mcp. Microsoft Graph MCP server, 85 tools for mail, calendar, Teams, files, SharePoint, and Entra ID. This page covers its PyPI package (ms-graph-mcp).

### Is the io.github.nitin27may/ms-graph-mcp server safe to use?

io.github.nitin27may/ms-graph-mcp scores 66 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.github.nitin27may/ms-graph-mcp server expose?

io.github.nitin27may/ms-graph-mcp exposes 23 tools: calendar_list_upcoming_events, calendar_get_event, calendar_get_event_attendees, calendar_list_events_in_range, calendar_find_meeting_times, and 18 more. Their descriptions and schemas cost roughly 2,483 tokens of context every time the server is loaded.

### Is the io.github.nitin27may/ms-graph-mcp server still maintained?

io.github.nitin27may/ms-graph-mcp is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- PyPI project: https://pypi.org/project/ms-graph-mcp/
- Socket report: https://socket.dev/pypi/package/ms-graph-mcp
- Repository: https://github.com/nitin27may/ms-graph-mcp
- Changelog RSS feed: https://verifymcp.io/servers/nitin27may-ms-graph-mcp/ms-graph-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/nitin27may-ms-graph-mcp/ms-graph-mcp.json
- HTML version of this page: https://verifymcp.io/servers/nitin27may-ms-graph-mcp/ms-graph-mcp
