Skip to main content
Glama

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 (mm/server.py)

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 mm MCP server for your AI assistant

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)

  1. Go to Azure Portal > App Registrations > New registration

  2. Name it something like MM-CLI (or whatever you want)

  3. Set Supported account types to "Accounts in this organizational directory only"

  4. Leave Redirect URI blank (device code flow doesn't need one)

  5. Click Register

  6. Copy the Application (client) ID — this is your appId

  7. Copy the Directory (tenant) ID — this is your tenantId

  8. Go to API permissions > Add a permission > Microsoft Graph > Delegated permissions and add:

Permission

For

Mail.ReadWrite

Email (read, send, manage)

Calendars.ReadWrite

Calendar operations

Files.ReadWrite.All

OneDrive / SharePoint files

Sites.ReadWrite.All

SharePoint sites

User.Read

Basic profile

User.ReadBasic.All

Look up other users

Contacts.ReadWrite

Contacts

Tasks.ReadWrite

To Do / Planner tasks

Notes.ReadWrite.All

OneNote

Chat.ReadWrite

Teams chat

Team.ReadBasic.All

Teams team info

Channel.ReadBasic.All

Teams channels

ChannelMessage.Send

Send Teams messages

  1. 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 interactively

See 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-GA

This 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

appId

Yes

Application (client) ID from your app registration

tenant

Yes

Domain (contoso.com) or tenantId

tenantId

Yes

Directory (tenant) ID GUID

expectedEmail

Recommended

Expected sign-in email — MM warns if you auth as the wrong account

description

Yes

Human-readable label

mcps

Yes

Which MCP servers can use this connection (["mm"])

skipSignatureStrip

No

Set true to skip email signature stripping (default: false)

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         # Delete

3. Install Python dependencies

cd mm
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

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

Verify it's running:

curl http://localhost:5200/health | jq

5. 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.json

The 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/devicelogin

Complete 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

Connection name from registry

module

exo (Exchange), pnp (SharePoint), azure, teams

command

PowerShell command to execute

confirmed

Set true to bypass send guards (see Send Guards)

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

Connection name

endpoint

API path (e.g., /me/messages)

method

GET, POST, PATCH, PUT, DELETE (default: GET)

body

Request body for POST/PATCH/PUT

resource

graph (default) or flow for Power Automate

confirmed

Set true to bypass send guards (see Send Guards)

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, .../send

  • POST /teams/{id}/channels/{id}/messages, /chats/{id}/messages

Guarded PowerShell commands:

  • Send-MailMessage, Send-MgUserMail

  • New-MgChatMessage, New-MgTeamChannelMessage, Submit-PnPTeamsChannelMessage

Disabling send guards:

Method

Scope

How

Per-connection

Single connection

Add "skipSendGuards": true to the connection in ~/.m365-connections.json

Global

All connections

Set env var MM_SEND_GUARDS=false

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

docker-compose.unified.yml

Dev, small servers

~2-4GB total

Isolated

docker-compose.isolated.yml

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-AzContext by 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/metrics endpoint with request counts, error rates, response times, session states.

Session Pool API

Endpoint

Method

Description

/health

GET

Health check

/status

GET

All session states

/connections

GET

List registry connections

/run

POST

Execute a command

/reset

POST

Reset a connection's sessions

/metrics

GET

Performance metrics

Host Directories

Path

Purpose

~/.m365-connections.json

Connection registry (read-only)

~/.m365-logs/

Persistent log files

~/.m365-state/

Session state for restart persistence

~/.mm-graph-tokens/

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 | jq

History

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 tools
graph-requestA

Execute a raw Microsoft Graph API request. Supports any Graph API endpoint. Can target specific account without switching.

Documentation:

ParametersJSON Schema
NameRequiredDescriptionDefault
endpointYesThe Graph API endpoint path (e.g., "/me", "/users", "/me/messages")
methodNoHTTP methodGET
bodyNoRequest body for POST/PUT/PATCH requests (JSON object)
queryParamsNoQuery parameters (e.g., {"$select": "displayName", "$top": "10"})
headersNoAdditional headers to include
apiVersionNoGraph API versionv1.0
accountIdNoTarget a specific account by ID without switching. Use list-accounts to see available IDs.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoForce a new login even if already logged in

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe account ID to remove

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesThe account ID to select

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 7 tool updates
    • First observedgraph-request
    • First observedlist-accounts
    • First observedlogin
    • First observedlogout
    • First observedremove-account
    • First observedselect-account
    • First observedverify-login

TDQS

A3.7/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessSyncing

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

Related MCP Servers

Latest Blog Posts

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