ForIT Microsoft Graph
This lean MCP server provides direct Microsoft Graph API access with multi-tenant account management, designed to minimize context bloat while enabling comprehensive Microsoft 365 integration.
Core Capabilities:
Multi-tenant authentication - Log in to multiple Microsoft 365 accounts simultaneously using device code flow, ideal for headless/SSH environments
Universal Graph API access - Execute any Graph API request through a single
graph-requesttool supporting all HTTP methods (GET, POST, PUT, PATCH, DELETE), custom headers, and request bodiesCross-tenant querying - Target specific accounts via
accountIdparameter to query different tenants in the same conversation without switchingFull Microsoft 365 coverage - Access all services including Outlook, Calendar, OneDrive, Users, Groups, Teams, and SharePoint
Advanced OData queries - Use
$select,$filter,$top,$orderby,$expand,$count, and$searchfor precise data retrievalAPI version control - Choose between stable (v1.0) and preview (beta) endpoints
Account lifecycle management - List, select, verify status, and remove cached accounts
Context-efficient design - Only 7 tools (~1KB context) replace 30-40 specialized tools (~12KB), reducing AI model overhead
PnP CLI complement - Works alongside PnP CLI for specialized SharePoint, Teams, and Power Platform operations
Click on "Install 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., "@ForIT Microsoft Graphshow my upcoming calendar events for this week"
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 Master (MM)
Unified Microsoft 365 MCP server for AI assistants. One server, two tools, all of M365.
Prerequisites
Requirement | Why |
Python 3.10+ | MCP server runtime ( |
Docker | Session pool runs PowerShell modules in containers |
An Azure AD (Entra ID) app registration | Both tools authenticate via device code flow against your app |
MCPJungle (or any MCP host) | Hosts the |
Related MCP server: Microsoft 365 Core MCP Server
Quick Start
1. Create an Azure AD app registration
Every tenant you want to manage needs an app registration. This is how MM authenticates — there are no shared/default apps.
Option A: Azure Portal (recommended for first-time setup)
Name it something like
MM-CLI(or whatever you want)Set Supported account types to "Accounts in this organizational directory only"
Leave Redirect URI blank (device code flow doesn't need one)
Click Register
Copy the Application (client) ID — this is your
appIdCopy the Directory (tenant) ID — this is your
tenantIdGo to API permissions > Add a permission > Microsoft Graph > Delegated permissions and add:
Permission | For |
| Email (read, send, manage) |
| Calendar operations |
| OneDrive / SharePoint files |
| SharePoint sites |
| Basic profile |
| Look up other users |
| Contacts |
| To Do / Planner tasks |
| OneNote |
| Teams chat |
| Teams team info |
| Teams channels |
| Send Teams messages |
Click Grant admin consent (requires admin role)
No client secret needed. MM uses device code flow (public client), not client credentials.
Option B: CLI for Microsoft 365
npm install -g @pnp/cli-microsoft365
m365 setup # Creates the app registration interactivelySee docs/M365-CLI-SETUP.md for details.
2. Configure the connection registry
The connection registry tells MM which tenants exist and how to reach them.
# Create your first connection interactively
./mm-connections add Contoso-GAThis creates/updates ~/.m365-connections.json. You can also create it manually:
{
"connections": {
"Contoso-GA": {
"appId": "your-app-client-id",
"tenant": "contoso.com",
"tenantId": "your-tenant-guid",
"expectedEmail": "admin@contoso.com",
"description": "Contoso Global Admin",
"mcps": ["mm"]
}
}
}Connection fields:
Field | Required | Description |
| Yes | Application (client) ID from your app registration |
| Yes | Domain ( |
| Yes | Directory (tenant) ID GUID |
| Recommended | Expected sign-in email — MM warns if you auth as the wrong account |
| Yes | Human-readable label |
| Yes | Which MCP servers can use this connection ( |
| No | Set |
Connection naming convention:
GA — Global Admin (tenant admin operations)
Individual — Your user account on a work tenant
Personal — Your own personal tenant
Managing connections:
./mm-connections list # List all connections
./mm-connections add Contoso-GA # Add interactively
./mm-connections edit Contoso-GA appId abc-123 # Set a field
./mm-connections duplicate Contoso-GA Contoso-Individual # Copy
./mm-connections remove Old-Connection # Delete3. Install Python dependencies
cd mm
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt4. Start the session pool
The session pool runs PowerShell modules (Exchange, SharePoint, Azure, Teams) in Docker containers.
cd session-pool
docker compose -p m365-session-pool -f docker-compose.unified.yml up -dVerify it's running:
curl http://localhost:5200/health | jq5. Register with your MCP host
cp mm/mcpjungle-config.example.json mm/mcpjungle-config.json
# Edit mm/mcpjungle-config.json — update paths to match your system
mcpjungle register --conf mm/mcpjungle-config.jsonThe example config expects a venv at mm/.venv/bin/python. Update the command and args paths to match your setup.
6. Use it
# List connections
mcpjungle invoke mm run '{}'
# PowerShell (Exchange)
mcpjungle invoke mm run '{"connection":"Contoso-GA","module":"exo","command":"Get-Mailbox -ResultSize 1"}'
# Graph API
mcpjungle invoke mm graph_request '{"connection":"Contoso-GA","endpoint":"/me"}'
# Power Automate (Flow API)
mcpjungle invoke mm graph_request '{"connection":"Contoso-GA","endpoint":"/providers/Microsoft.ProcessSimple/environments","resource":"flow"}'Auth is automatic. If a connection isn't authenticated, the tool returns a device code:
DEVICE CODE: XXXXXXXX
Go to: https://microsoft.com/deviceloginComplete the sign-in, then retry the command. No pre-auth step needed.
Architecture
┌─────────────────────────────────────────────────────────┐
│ AI Assistant │
└─────────────────────┬───────────────────────────────────┘
│ MCP Protocol (stdio)
▼
┌─────────────┐
│ mm/server │ Python MCP server
│ │ - graph_request (MSAL → Graph API)
│ │ - run (HTTP → session pool)
└──────┬──────┘
│ HTTP :5200
▼
┌───────────────────────┐
│ session-pool/ │ Docker container(s)
│ session_pool.py │ - PowerShell processes per module
│ │ - Native device code auth
│ Modules: │ - Session persistence
│ exo, pnp, azure, │ - Command guardrails
│ teams │ - Comprehensive logging
└───────────────────────┘
│
┌───────────┴───────────┐
│ ~/.m365-connections │ Connection registry (READ-ONLY)
│ ~/.mm-graph-tokens/ │ Graph MSAL token cache
│ ~/.m365-logs/ │ Persistent logs
│ ~/.m365-state/ │ Session state persistence
└───────────────────────┘Tools
mm__run — PowerShell via Session Pool
Execute PowerShell commands through persistent Docker-hosted sessions.
Parameter | Description |
| Connection name from registry |
|
|
| PowerShell command to execute |
| Set |
Omit all parameters to list available connections.
mm__graph_request — Microsoft Graph REST API
Direct HTTP requests to Microsoft Graph (or Flow API) via MSAL tokens.
Parameter | Description |
| Connection name |
| API path (e.g., |
|
|
| Request body for POST/PATCH/PUT |
|
|
| Set |
Send Guards
Email and Teams message sends are blocked by default. When an AI assistant tries to send an email or Teams message, MM intercepts the request and returns a formatted draft preview instead. The assistant must re-call with confirmed: true to actually send.
Guarded Graph endpoints:
POST .../sendMail,.../reply,.../replyAll,.../forward,.../sendPOST /teams/{id}/channels/{id}/messages,/chats/{id}/messages
Guarded PowerShell commands:
Send-MailMessage,Send-MgUserMailNew-MgChatMessage,New-MgTeamChannelMessage,Submit-PnPTeamsChannelMessage
Disabling send guards:
Method | Scope | How |
Per-connection | Single connection | Add |
Global | All connections | Set env var |
Per-connection overrides the global setting. Example:
{
"connections": {
"Contoso-Automation": {
"appId": "...",
"skipSendGuards": true,
"description": "Automated sends, no confirmation needed"
}
}
}Session Pool
The session pool manages PowerShell processes with native device code authentication.
Deployment Modes
Mode | File | Use Case | RAM |
Unified |
| Dev, small servers | ~2-4GB total |
Isolated |
| Production, multi-user | ~512MB per connection |
Features
Session persistence — Authenticated sessions survive container restarts. Session metadata saved to
~/.m365-state/, PowerShell token caches persisted via Docker volumes. Azure sessions restore from cached tokens; EXO/Teams require re-auth (in-process only).Command guardrails — Blocks dangerous operations:
Install-Module(container integrity),New-AzRoleAssignment(access escalation), raw OAuth requests, app registration modifications. Warned but allowed:Remove-Az*, mail forwarding rules.Azure context isolation — In unified mode,
Disable-AzContextAutosave+Select-AzContextby expectedEmail prevents cross-tenant context contamination when multiple Azure sessions share~/.Azure.Comprehensive logging — Dual output: stdout (docker logs) + persistent files (
~/.m365-logs/). Every command's output content logged. AADSTS and auth error patterns flagged at WARNING level.Keepalive — Background thread pings authenticated sessions every 5 minutes to prevent token expiry. Stale sessions (auth_pending > 15 min) automatically reaped.
Metrics —
/metricsendpoint with request counts, error rates, response times, session states.
Session Pool API
Endpoint | Method | Description |
| GET | Health check |
| GET | All session states |
| GET | List registry connections |
| POST | Execute a command |
| POST | Reset a connection's sessions |
| GET | Performance metrics |
Host Directories
Path | Purpose |
| Connection registry (read-only) |
| Persistent log files |
| Session state for restart persistence |
| MSAL token cache for Graph API |
Monitoring
# Container health
docker ps --format "{{.Names}}\t{{.Status}}" | grep m365
# Live logs
docker logs -f m365-pool
# Persistent logs (survive container restarts)
tail -f ~/.m365-logs/session-pool-unified.log
# Session status
curl http://localhost:5200/status | jq
# Metrics
curl http://localhost:5200/metrics | jqHistory
This repo originally contained four separate MCP servers (graph, pnp, pwsh-manager, registry), consolidated in February 2026 into the single mm server. The old servers are preserved in _archived/ for reference.
License
MIT
Available Tools
7 toolsgraph-requestA
Execute a raw Microsoft Graph API request. Supports any Graph API endpoint. Can target specific account without switching.
Documentation:
Graph API Reference: https://learn.microsoft.com/en-us/graph/api/overview
Common endpoints: /me, /users, /groups, /me/messages, /me/calendar/events, /me/drive
OData query params: $select, $filter, $top, $orderby, $expand, $count, $search
Permissions reference: https://learn.microsoft.com/en-us/graph/permissions-reference
| Name | Required | Description | Default |
|---|---|---|---|
| endpoint | Yes | The Graph API endpoint path (e.g., "/me", "/users", "/me/messages") | |
| method | No | HTTP method | GET |
| body | No | Request body for POST/PUT/PATCH requests (JSON object) | |
| queryParams | No | Query parameters (e.g., {"$select": "displayName", "$top": "10"}) | |
| headers | No | Additional headers to include | |
| apiVersion | No | Graph API version | v1.0 |
| accountId | No | Target a specific account by ID without switching. Use list-accounts to see available IDs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions the ability to target specific accounts without switching (which is useful context), but doesn't address critical behavioral aspects like authentication requirements, rate limits, error handling, or what happens with destructive operations (DELETE/PATCH/PUT). For a raw API tool with 7 parameters and no annotations, this leaves significant gaps in understanding the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear purpose statement upfront followed by organized documentation sections. While comprehensive, some information (like the permissions reference link) might be more appropriate in annotations rather than the description. Most sentences earn their place by providing actionable guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, no annotations, no output schema), the description provides good basic context but has significant gaps. It explains what the tool does and provides documentation links, but doesn't address authentication requirements, response formats, error handling, or the implications of different HTTP methods. For a raw API execution tool, this leaves the agent without crucial operational knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 7 parameters thoroughly. The description adds some value by providing examples of common endpoints and OData query parameters, but doesn't significantly enhance the parameter understanding beyond what's in the schema. The baseline of 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Execute a raw Microsoft Graph API request' which provides a specific verb ('Execute') and resource ('Microsoft Graph API request'). It clearly distinguishes this from sibling tools like list-accounts or login by describing its unique capability to make direct API calls rather than managing authentication or accounts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool: 'Supports any Graph API endpoint' and 'Can target specific account without switching.' It also references the sibling tool 'list-accounts' for obtaining account IDs, creating clear alternatives and prerequisites. The documentation links further clarify appropriate usage contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-accountsB
List all available Microsoft accounts
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but only states the action without disclosing behavioral traits such as whether it requires authentication, returns paginated results, or includes inactive accounts. It's a basic statement that leaves critical operational details unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's function without any unnecessary words. It's front-loaded and wastes no space, making it highly concise and well-structured for its purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, no output schema, no annotations), the description is minimally adequate but lacks context on authentication needs, return format, or sibling differentiation. It meets basic requirements but doesn't fully compensate for the absence of structured data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately doesn't add parameter details, aligning with the schema's completeness, though it could hint at implicit context like authentication requirements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List') and resource ('all available Microsoft accounts'), making the purpose unambiguous. It doesn't differentiate from siblings like 'select-account' or 'remove-account', which would require more specific scope or filtering details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'select-account' for choosing a specific account or 'verify-login' for authentication checks. The description implies a general listing function but lacks explicit context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loginA
Authenticate with Microsoft using device code flow
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Force a new login even if already logged in |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but only states the authentication method. It doesn't disclose behavioral traits like required permissions, whether this persists credentials, rate limits, or what happens on success/failure. The description adds minimal context beyond the basic action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero wasted words. It's front-loaded with the core purpose and uses precise technical terminology ('device code flow') without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an authentication tool with no annotations and no output schema, the description is insufficient. It doesn't explain what authentication provides access to, what credentials are stored, how long sessions last, or what the tool returns. Given the complexity of authentication and lack of structured data, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage and only one optional parameter, the description doesn't need to explain parameters. The schema fully documents the 'force' parameter, so baseline is high. The description focuses appropriately on the tool's purpose rather than parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Authenticate') and target ('with Microsoft'), using the precise authentication method ('device code flow'). It distinguishes from siblings like 'verify-login' or 'logout' by specifying the authentication mechanism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for initial authentication, but doesn't explicitly state when to use it versus alternatives like 'verify-login' (for checking status) or 'select-account' (for switching accounts). No explicit exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logoutB
Log out from Microsoft account
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states the action ('Log out') but doesn't disclose behavioral traits like whether this invalidates all sessions, requires specific permissions, affects other tools, or what happens on success/failure. For a mutation tool with zero annotation coverage, this is inadequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero wasted words. It's appropriately sized for a simple tool and front-loads the essential information without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a mutation tool (logout implies state change) with no annotations and no output schema, the description is incomplete. It doesn't explain what the tool returns, error conditions, or side effects, leaving significant gaps for agent understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters with 100% schema description coverage, so the schema fully documents the lack of inputs. The description doesn't need to add parameter semantics, earning a baseline score of 4 for tools with no parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Log out') and target resource ('from Microsoft account'), providing a specific verb+resource combination. However, it doesn't explicitly differentiate from sibling tools like 'remove-account' or 'verify-login', which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'remove-account' (which might delete account data) or 'verify-login' (which checks login status). It also doesn't mention prerequisites such as needing to be logged in first, leaving usage context unclear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove-accountC
Remove a Microsoft account from the cache
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | The account ID to remove |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. While 'Remove' implies a destructive mutation, it doesn't specify whether this operation is reversible, what permissions are required, whether it affects active sessions, or what happens on success/failure. The mention of 'cache' hints at data removal rather than account deletion, but this isn't elaborated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's function without unnecessary words. It's front-loaded with the core action and resource, making it immediately scannable and easy to understand.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no annotations and no output schema, the description is insufficient. It doesn't explain what 'remove' entails (e.g., does it delete data, revoke access, or clear local cache?), what the expected outcome is, or potential side effects. Given the complexity of account management and lack of structured context, more detail is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with the single parameter 'accountId' clearly documented. The description adds no additional parameter semantics beyond what the schema provides, such as format examples or where to obtain the accountId. Since schema coverage is high, the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Remove') and target resource ('a Microsoft account from the cache'), making the purpose immediately understandable. However, it doesn't explicitly differentiate this tool from sibling tools like 'logout' or 'select-account', which might also involve account management operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., whether the account must be logged in or cached first), nor does it clarify relationships with sibling tools like 'logout' (which might handle session termination) or 'list-accounts' (which could show cached accounts).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select-accountC
Select a specific Microsoft account to use
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | The account ID to select |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden but only states the action without behavioral details. It doesn't disclose what 'select' entails (e.g., sets a default context, requires authentication, has side effects, or returns confirmation), making it vague for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with zero waste. It's front-loaded and appropriately sized for the tool's apparent simplicity, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete. It lacks details on what happens after selection (e.g., context change, return value, error handling), which is critical for a tool that likely affects subsequent operations in a multi-account environment.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter 'accountId' is documented in the schema. The description adds no additional meaning beyond implying selection targets an account, which the schema already covers, meeting the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Select') and the resource ('a specific Microsoft account'), making the purpose understandable. However, it doesn't differentiate from sibling tools like 'list-accounts' or 'verify-login' in terms of when selection is needed versus listing or verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing to list accounts first), exclusions, or how it relates to siblings like 'login' or 'remove-account', leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify-loginB
Check current Microsoft authentication status
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states the tool checks authentication status but doesn't disclose behavioral traits like what 'status' includes (e.g., logged in/out, token validity), whether it requires network calls, or potential error conditions. This leaves significant gaps for a tool that interacts with authentication systems.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that efficiently conveys the core function without unnecessary words. It's front-loaded with the essential action and resource, making it easy to parse. Every word earns its place, achieving ideal conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of authentication tools and lack of annotations or output schema, the description is incomplete. It doesn't explain what the check returns (e.g., boolean status, user details, error messages) or how it integrates with sibling tools. For a tool in this context, more detail is needed to guide effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description doesn't add param details, which is appropriate, but it also doesn't compensate for any gaps since none exist. A baseline of 4 is given as the tool has no parameters to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('Check') and resource ('current Microsoft authentication status'), making it immediately understandable. However, it doesn't differentiate itself from sibling tools like 'login' or 'list-accounts', which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With siblings like 'login', 'logout', and 'list-accounts', it's unclear if this should be used before authentication attempts, to verify session validity, or as a status check. No explicit when/when-not instructions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
7 tool updates
- First observed
graph-request - First observed
list-accounts - First observed
login - First observed
logout - First observed
remove-account - First observed
select-account - First observed
verify-login
TDQS
Each tool has a clearly distinct purpose with no overlap: graph-request handles API calls, list-accounts enumerates accounts, login/logout manage authentication, remove-account deletes cached accounts, select-account switches contexts, and verify-login checks status. The tools cover different aspects of the Microsoft Graph workflow without ambiguity.
All tool names follow a consistent snake_case pattern with clear verb-noun combinations (e.g., list-accounts, select-account, verify-login). The naming is uniform across all seven tools, making them predictable and easy to understand for an agent.
With 7 tools, the server is well-scoped for its purpose of interacting with Microsoft Graph. It provides essential operations for authentication, account management, and API requests, with each tool serving a necessary function without bloat or redundancy.
The tool set offers complete coverage for the domain: graph-request enables all CRUD operations via the Graph API, while the other tools handle authentication, account selection, and status verification. There are no obvious gaps, allowing agents to perform end-to-end workflows seamlessly.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Manage Microsoft 365 email, calendar, contacts and inbox rules via the Graph API with OAuth 2.0.
Permissioned access to Outlook, OneDrive and Teams via the user's own Microsoft account
Read and edit GA4, Search Console and Google Tag Manager from any MCP client. 29 tools.
*Updated June 17th 2025** Manage your Microsoft 365 services effortlessly. Create and manage distr…
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-
- AlicenseBqualityDmaintenanceUniversal Microsoft Graph API gateway providing access to 1000+ endpoints for managing Microsoft 365 services including Teams, SharePoint, Exchange, Intune, security, compliance, and Azure AD with dynamic tool generation and advanced features like batch operations and webhooks.55MIT
- AlicenseNot gradedqualityCmaintenanceEnables management of Microsoft 365 users, licenses, and groups through Microsoft Graph API. Supports user provisioning, license assignment, group management, and automated M365 administration workflows.2MIT
- FlicenseNot gradedqualityNot gradedmaintenanceProvides unified access to OneDrive and SharePoint through Microsoft Graph API, enabling file operations, SharePoint list management, Excel integration, and content search across personal and business Microsoft accounts.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ForITLLC/m365-mcp-suite'
If you have feedback or need assistance with the MCP directory API, please join our Discord server