Skip to main content
Glama
borgels

mcp-server-microsoft365

by borgels

mcp-server-microsoft365

TypeScript MCP server for Microsoft 365 / Entra ID via Microsoft Graph. It runs app-only (client-credentials) and is intentionally boring good: typed, documented, read-first, least-privilege, credential-sane, and idempotent where Graph allows it. Its focus is identity provisioning — create a user, assign a license, manage group membership — plus the supporting reads you need to do that safely.

Disclaimer: This is an independent, unofficial project by Borgels. Borgels is not affiliated with, endorsed by, or supported by Microsoft. "Microsoft 365", "Microsoft Graph", and "Entra ID" are referenced only to describe what this server talks to. You need your own Entra ID app registration, and use of Microsoft Graph is subject to Microsoft's own terms.

Scope

Read tools (enabled by default):

  • get_user, list_users

  • list_subscribed_skus (license lookup and seat availability)

  • list_groups, get_group, list_group_members

  • get_user_license_details

Write tools (disabled by default):

  • create_user

  • update_user (PATCH attributes on an existing user, incl. accountEnabled to enable/disable — e.g. activate a pre-created hire or disable a leaver)

  • set_manager

  • assign_license, remove_license

  • add_group_member, remove_group_member

  • set_usage_location

  • create_temporary_access_pass (passwordless first sign-in / MFA setup; regenerated until alphanumeric), delete_temporary_access_pass

  • activate_pim_role (just-in-time PIM self-activation of an eligible directory role, e.g. Authentication Administrator for TAP — delegated mode only)

Related MCP server: Microsoft 365 Core MCP Server

Authentication modes

The server authenticates to Graph in one of three ways, chosen by which options are set (never as tool arguments):

  • App-only (client credentials)MS_TENANT_ID + MS_CLIENT_ID + MS_CLIENT_SECRET. Acts as the app; requires the application permissions below.

  • Delegated (on-behalf-of a user) — a refreshToken option / MS_REFRESH_TOKEN (plus the app's MS_CLIENT_ID/MS_CLIENT_SECRET/MS_TENANT_ID). The server mints short-lived delegated access tokens via the refresh_token grant, so calls act as the consenting user and are bounded by that user's own roles. Entra rotates the refresh token on use; the latest is exposed on the client (latestRefreshToken) so the host can persist it. activate_pim_role only works in this mode.

  • Static token — a pre-fetched MS_ACCESS_TOKEN / accessToken (short-circuits the grants).

Least-privilege application permissions

Grant the app registration only what it needs, then admin-consent:

Task

Application permission

Read users and groups

User.Read.All

Create users

User.Create (or User.ReadWrite.All)

Update users / set manager / enable-disable

User.ReadWrite.All

Read license/SKU state

LicenseAssignment.Read.All

Assign / remove licenses

LicenseAssignment.ReadWrite.All

Manage group membership

GroupMember.ReadWrite.All

Create / delete Temporary Access Pass

UserAuthenticationMethod.ReadWrite.All

JIT PIM role activation (activate_pim_role, delegated)

delegated RoleManagement.ReadWrite.Directory (bounded by the user's eligible roles)

User.Create is narrower than User.ReadWrite.All; use it when you only need to provision new users. update_user and set_manager require User.ReadWrite.All. Reading SKUs (/subscribedSkus) is covered by LicenseAssignment.Read.All.

Temporary Access Pass additionally requires the app to hold the Authentication Administrator (or Privileged Authentication Administrator) directory role — UserAuthenticationMethod.ReadWrite.All alone is not sufficient to manage another user's authentication methods. Assign the role to the app's service principal in Entra ID → Roles and administrators, and ensure the tenant's TAP policy is enabled (it also caps lifetimeInMinutes).

  1. In the Entra admin center, register an application (single tenant).

  2. Under Certificates & secrets, create a client secret and copy its value.

  3. Under API permissions, add the Microsoft Graph Application permissions above, then click Grant admin consent.

  4. Copy the Directory (tenant) ID and Application (client) ID.

Setup

Install dependencies and build the CLI:

npm install
npm run build

Provide credentials through the environment. The server never accepts them as tool arguments.

export MS_TENANT_ID="contoso.onmicrosoft.com"   # or the tenant GUID
export MS_CLIENT_ID="your-application-client-id"
export MS_CLIENT_SECRET="your-client-secret"

Optional settings:

export MS_GRAPH_BASE_URL="https://graph.microsoft.com/v1.0"
export MS_TIMEOUT_MS=30000
# export MS_AUTHORITY_HOST="https://login.microsoftonline.com"

If another process manages tokens, provide a bearer token directly:

export MS_ACCESS_TOKEN="your-access-token"

Claude or Cursor config

Use the stdio server for local MCP clients:

{
  "mcpServers": {
    "microsoft365": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-server-microsoft365/dist/transports/stdio.js"],
      "env": {
        "MS_TENANT_ID": "contoso.onmicrosoft.com",
        "MS_CLIENT_ID": "your-application-client-id",
        "MS_CLIENT_SECRET": "your-client-secret"
      }
    }
  }
}

During development:

{
  "mcpServers": {
    "microsoft365": {
      "command": "npm",
      "args": ["run", "dev", "--prefix", "/absolute/path/to/mcp-server-microsoft365"],
      "env": {
        "MS_TENANT_ID": "contoso.onmicrosoft.com",
        "MS_CLIENT_ID": "your-application-client-id",
        "MS_CLIENT_SECRET": "your-client-secret"
      }
    }
  }
}

Streamable HTTP transport

npm run dev:http

The HTTP transport binds to 127.0.0.1 by default and serves POST /mcp. Set MCP_HTTP_TOKEN to require bearer auth, and MCP_ALLOWED_ORIGINS for browser-based local clients. MCP_MAX_BODY_BYTES defaults to 10485760 (10 MiB).

Provisioning workflow

  1. list_subscribed_skus to see which licenses exist and how many seats are free.

  2. create_user with a displayName and userPrincipalName. A strong temporary password is generated when you do not supply one, and returned in the result with forceChangePasswordNextSignIn set. Store it securely and share it out-of-band. create_user fails clearly if the UPN already exists.

  3. assign_license with a friendly name (E3), a skuPartNumber (ENTERPRISEPACK), or a SKU GUID. Pass usageLocation on the same call for a brand-new user.

  4. add_group_member to place the user in the right groups. It is idempotent: an already-a-member response is treated as success.

The usageLocation gotcha

Microsoft Graph rejects a license assignment for a user with no usageLocation (the classic "License assignment failed because of an invalid usage location" error). This server sets usageLocation first:

  • If you pass usageLocation to assign_license, it is PATCHed onto the user before the license is assigned.

  • If you do not, the server reads the user's current usageLocation and returns a clear, actionable error when it is missing — rather than letting Graph fail cryptically.

usageLocation is an ISO 3166-1 alpha-2 country code, e.g. DK.

License resolution

assign_license / remove_license accept a friendly name, a skuPartNumber, or a SKU GUID. The server fetches /subscribedSkus (no $filter; it matches client-side) and:

  • matches a GUID directly against skuId;

  • otherwise matches skuPartNumber case-insensitively;

  • otherwise maps a friendly name (e.g. E3ENTERPRISEPACK / SPE_E3, E5ENTERPRISEPREMIUM / SPE_E5) to the first candidate the tenant owns;

  • checks availability (prepaidUnits.enabled - consumedUnits) and refuses to assign when no seats are free.

Rate limiting

On HTTP 429, the raised GraphHttpError carries the Retry-After value and the Graph request-id. The Borgels connector layer uses these to retry.

Borgels gateway

The ./gateway subpath exports the Borgels gateway contract:

import { createMicrosoft365Gateway, microsoft365GatewayTools } from 'mcp-server-microsoft365/gateway';

const gateway = createMicrosoft365Gateway({ tenantId, clientId, clientSecret });
const result = await gateway.callTool('list_subscribed_skus');

microsoft365GatewayTools lists the same tool surface as the MCP server, with riskLevel and enabledByDefault so the gateway can gate writes. Read tools are enabledByDefault: true; every write tool is enabledByDefault: false.

Live smoke test

The normal test suite uses mocked fetch. With real credentials in the environment you can run a read-only live smoke test that counts subscribed SKUs:

npm run smoke:live

Security and audit

  • Credentials are read from environment variables only.

  • MS_GRAPH_BASE_URL must be https://; loopback http:// is allowed for local mocks.

  • Formatted errors redact Authorization headers, client secrets, access tokens, and token-like material.

  • Write tools are disabled by default and surfaced with write/destructive annotations.

  • The Streamable HTTP transport binds to 127.0.0.1 by default.

Security reports: security@borgels.com.

Available Tools

18 tools
activate_pim_roleActivate PIM Role (self)A

Just-in-time PIM elevation: the delegated caller self-activates one of their own ELIGIBLE directory roles (e.g. Authentication Administrator, needed for Temporary Access Pass) for a bounded window. Requires a delegated token; fails if the caller is not eligible.

ParametersJSON Schema
NameRequiredDescriptionDefault
durationNo
justificationNo
directoryScopeIdNo
roleDefinitionIdYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds key behaviors not in annotations: the requirement of a delegated token, eligibility check, and bounded activation window. These supplement the annotation flags (readOnlyHint=false, idempotentHint=false) with meaningful operational context. It does not contradict any annotation.

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 two concise sentences that front-load the core action and include a practical example plus a critical prerequisite. Every clause adds information, with no redundant fillers.

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?

Despite being informative, the description lacks parameter-level guidance and does not mention what the response looks like or how to specify duration/justification. For a tool with four parameters and no output schema, this description is not fully sufficient for an agent to invoke it correctly without additional probing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description carries full responsibility for clarifying parameters, but it does not explicitly map any parameter names. It hints at 'bounded window' (likely duration) and 'eligible roles' (roleDefinitionId), but leaves justification and directoryScopeId unexplained, which is a significant gap.

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 defines the tool as a just-in-time PIM elevation action where the delegated caller self-activates one of their own eligible directory roles. It distinguishes itself from sibling tools by focusing on role activation rather than user/group/license management, and even provides an example (Authentication Administrator for Temporary Access Pass).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states clear prerequisites: requires a delegated token and fails if the caller is not eligible, which helps the agent know when to use it. It also implies the use case for elevating to a role needed for Temporary Access Pass. However, it does not explicitly contrast with alternative tools or say when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_group_memberAdd Group MemberA

Add a user to a group. Idempotent when the user is already a member.

ParametersJSON Schema
NameRequiredDescriptionDefault
userIdYes
groupIdYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds a behavioral detail not present in annotations: 'Idempotent when the user is already a member.' This is valuable context beyond the readOnlyHint, destructiveHint, and idempotentHint flags. No contradiction with annotations is present.

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 two sentences long and front-loads the primary action. Every word earns its place, with no filler or redundant information.

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?

For a simple two-parameter tool with no output schema, the description is adequate but minimal. It covers the core operation and one behavioral nuance, but does not mention return values, error conditions, or permissions. Given the simplicity, this is acceptable but leaves gaps that an agent might need to infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, and the description does not explain the parameters userId and groupId beyond their names. The names provide some semantic hint, but the description fails to add any meaning such as formats, valid values, or relationships.

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 action 'Add a user to a group' with a specific verb and resource. It distinguishes from sibling tools like remove_group_member and list_group_members by specifying the 'add' operation. The idempotency note further clarifies the purpose.

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 context for using this tool is implied by its name and description, but there is no explicit guidance on when to use it versus alternatives. No exclusions or alternative tool references are provided, but the purpose is clear enough that an agent could infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

assign_licenseAssign License To UserA

Assign a license to a user. Sets usageLocation first when provided; fails clearly if the user has no usageLocation.

ParametersJSON Schema
NameRequiredDescriptionDefault
userYes
licenseYes
disabledPlansNo
usageLocationNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a non-read-only, non-destructive write operation. The description adds valuable behavioral context: it sets usageLocation before assigning the license and fails if the usageLocation is missing. This discloses a side effect and failure condition beyond what annotations provide, without contradiction.

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 sentence that front-loads the core action, then adds a concise behavioral note. Every word earns its place, with no filler or repetition.

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?

For a 4-parameter tool with no output schema, the description is adequate but leaves gaps. It covers the key behavior and failure mode but does not explain disabledPlans, the expected format for user/license, or return values. It is a viable minimum but not richly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should compensate. It only clarifies usageLocation ('Sets usageLocation first when provided'), while user and license are self-explanatory from the tool name. However, disabledPlans is left completely unexplained—an agent would not know what it means without additional context.

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 tool's action: 'Assign a license to a user.' This is a specific verb+resource that distinguishes it from siblings like remove_license and set_usage_location. It also adds a unique behavioral note about usageLocation, further clarifying its purpose.

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 usage context by stating 'Sets usageLocation first when provided; fails clearly if the user has no usageLocation.' This suggests when to use the tool (to set usageLocation inline) and a prerequisite (user must have a usageLocation), but it does not explicitly name alternatives like set_usage_location or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_temporary_access_passCreate Temporary Access PassA

Create a Temporary Access Pass (TAP) for passwordless first sign-in / MFA setup. Multi-use by default; regenerated until the passcode is alphanumeric so it is easy to relay. lifetimeInMinutes is bounded by the tenant TAP policy. Returns the passcode; deliver it out-of-band.

ParametersJSON Schema
NameRequiredDescriptionDefault
userYes
maxAttemptsNo
isUsableOnceNo
startDateTimeNo
lifetimeInMinutesNo
requireAlphanumericNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses several important behavioral traits beyond annotations: multi-use by default, regeneration until alphanumeric, lifetime limited by tenant policy, and return of the passcode for out-of-band delivery. These details are valuable and not presented in the annotations.

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 three sentences, front-loaded with purpose, followed by behavioral details and return value. Every sentence adds meaningful information without unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers essential context for a creation tool: purpose, key behaviors, return value, and a security caveat. It lacks explicit error conditions or prerequisites like admin role, but given the absence of an output schema and the richness of the description, it is fairly complete.

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 description adds meaning to several parameters: 'multi-use by default' relates to isUsableOnce, 'regenerated until alphanumeric' relates to requireAlphanumeric, and 'lifetimeInMinutes bounded by policy' adds context. However, it does not explain maxAttempts, startDateTime, or user. With zero schema description coverage, this is partial compensation.

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 action ('Create'), the resource ('Temporary Access Pass'), and the specific use case ('passwordless first sign-in / MFA setup'). It also differentiates from related tools like delete_temporary_access_pass by emphasizing creation and default multi-use behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: during initial sign-in or MFA setup. It does not explicitly mention alternatives or exclusions, but the scenario is specific enough to imply appropriate usage. The security note to deliver the passcode out-of-band adds additional usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_userCreate Microsoft 365 UserB

Create a user with a generated temporary password. Returns the temporary password; store it securely and share out-of-band.

ParametersJSON Schema
NameRequiredDescriptionDefault
passwordNo
displayNameYes
mailNicknameNo
checkExistingNo
usageLocationNo
accountEnabledNo
userPrincipalNameYes
forceChangePasswordNextSignInNo

TDQS

B3.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful context beyond the annotations: it discloses that the password is generated, returns it, and instructs the agent to store it securely and share out-of-band. This complements the readOnlyHint=false and openWorldHint=true annotations by clarifying the security sensitivity of the generated secret. There is no contradiction with annotations.

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 one short sentence plus an imperative instruction, both front-loaded and free of fluff. It states the primary action first, then the critical security note, achieving high information density with zero wasted words.

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 tool's complexity (8 parameters, 2 required, no output schema) and the surrounding ecosystem (siblings like assign_license, set_usage_location), the description is too sparse. It does not hint at additional steps (e.g., assigning licenses) or potential failure conditions (e.g., duplicate UPN). The only useful context is the return of the temporary password, but that alone is insufficient for a create operation in a large tenant.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Description does not mention any input parameters or their meaning. With schema description coverage at 0%, the description must compensate, but it only vaguely refers to 'generated temporary password' without clarifying that the password field is optional or how displayName/userPrincipalName are used. The agent must rely entirely on the schema alone, which is insufficient for ambiguous fields like checkExisting or usageLocation.

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 tool's function: creating a Microsoft 365 user. It also specifies that a temporary password is generated and returned, which distinguishes it from other user-related tools like update_user or list_users. The action verb 'Create' and resource 'user' are explicit and unambiguous.

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 explicit guidance on when to use this tool versus alternatives. It does not mention prerequisites, such as licensing or usage location, nor does it exclude scenarios where another tool (e.g., create_temporary_access_pass) would be more appropriate. The only advice given is about handling the password, which pertains to post-creation behavior rather than tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_temporary_access_passDelete Temporary Access PassA
DestructiveIdempotent

Delete a user's Temporary Access Pass. With methodId deletes that pass; otherwise deletes every TAP on the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
userYes
methodIdNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already warn that the tool is destructive and not read-only. The description adds essential behavior: with methodId it deletes that specific pass, otherwise every TAP on the user. This conditional behavior goes beyond the annotations, giving agents clear expectations.

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, well-structured sentence that front-loads the primary action and uses a semicolon to add the conditional detail. Every word contributes to understanding, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, idempotent delete operation, the description covers all key decision points (whether methodId is provided) and does not need to explain return values since there is no output schema. Combined with annotations, it provides complete contextual guidance.

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 0% schema description coverage, the description compensates by explaining methodId's role and the default behavior when it is absent. It does not specify the format for user, but 'a user's' and sibling tool context imply a standard user identifier, making it sufficient.

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 opens with 'Delete a user's Temporary Access Pass,' clearly stating the action (delete), resource (Temporary Access Pass), and scope (a user's). This distinguishes it from the sibling create_temporary_access_pass and other user management tools, and the conditional methodId clause further refines the tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool—whenever a user's Temporary Access Pass needs deletion—and clarifies the two modes via methodId presence. It does not explicitly mention alternatives or exclusions, but the action is inherently differentiated from create and activate operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_groupGet Microsoft 365 GroupA
Read-onlyIdempotent

Fetch one group by object id.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectNo
groupIdYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (read-only, idempotent, non-destructive). The description adds no further behavioral context such as error handling, authentication, or return format, providing no value beyond the annotation layer.

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?

Single sentence with no fluff, front-loaded verb and resource. Every word earns its place.

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?

With 2 parameters and no output schema, the description omits the optional select parameter and any return/error details, making it incomplete for full usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage. The description clarifies that groupId is the object ID but says nothing about the select parameter, leaving it undocumented.

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 uses the verb 'fetch' with the resource 'group' and specifies 'by object id', clearly differentiating from siblings like list_groups (lists) and list_group_members (members). It is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It indicates the tool retrieves a single group by object ID, giving clear context for when to use it. However, it does not explicitly mention alternatives or exclusions, so it stops short of a full guideline.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_userGet Microsoft 365 UserA
Read-onlyIdempotent

Fetch one user by object id or userPrincipalName.

ParametersJSON Schema
NameRequiredDescriptionDefault
userYes
selectNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe, idempotent read. The description adds the lookup key context (object id or userPrincipalName) but no additional behavioral traits such as return format or error behavior. With strong annotations, the bar is lower, and the description meets it without adding extra value.

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 sentence that is concise and directly conveys the essential information. No wasted words or repetition of the title.

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?

The tool is simple, with good annotations and no output schema. The description tells how to identify the user but does not mention what fields are returned or that 'select' can be used to choose specific properties. For a basic fetch operation, this is adequate but not fully complete.

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 schema provides no descriptions for parameters (0% coverage), so the description must compensate. It clarifies that 'user' can be an object id or userPrincipalName, adding meaning to the first parameter. However, it does not explain the 'select' parameter (e.g., that it limits returned fields), leaving a gap for one of the two parameters.

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 'Fetch one user by object id or userPrincipalName,' using a specific verb and resource. It distinguishes this tool from siblings like list_users (which fetches multiple users) and get_group (which fetches a group). The scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: to retrieve a single user based on a specific identifier. It does not explicitly mention when not to use it or name alternatives, but the distinction from list_users is implied. This is sufficient for a straightforward read operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_user_license_detailsGet User License DetailsA
Read-onlyIdempotent

List the licenses currently assigned to a user.

ParametersJSON Schema
NameRequiredDescriptionDefault
userYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering safety. The description adds the nuance 'currently assigned,' which implies the result reflects the current state. However, it does not disclose pagination, sorting, or any other behavioral details beyond what annotations already provide.

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 sentence, front-loaded with the verb and object, with no wasted words. It is concise and structurally efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity—one parameter, good annotations, no output schema—the description adequately communicates the core purpose and what the result will be (a list of licenses). Minor gaps include the lack of parameter format and no mention of response structure, but these do not undermine the overall completeness for this straightforward read-only operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%—the parameter 'user' has only a type and minLength. The description does not add meaningful semantics: it says 'a user' but does not specify whether this is an ID, email, or UPN, nor any format constraints. The parameter name itself is self-explanatory, so the description adds minimal value.

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 'List the licenses currently assigned to a user' uses a specific verb ('List') and resource ('licenses') with clear scope ('to a user'). It distinguishes itself from sibling tools like assign_license and remove_license, and from list_subscribed_skus which lists available SKUs rather than user-assigned licenses.

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 intended use is implied: to fetch a user's current licenses. However, no explicit guidance is given on when to use this tool versus alternatives, nor are any exclusions or prerequisites mentioned. It is not misleading, but it lacks the explicitness of a higher score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_group_membersList Group MembersC
Read-onlyIdempotent

List the members of a group.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNo
groupIdYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds no behavioral context beyond the annotations. Annotations already declare readOnlyHint=true and destructiveHint=false, but the description does not mention pagination, ordering, error behavior, or other nuances. No contradiction with annotations.

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 a single concise sentence with no fluff. However, it is under-specified, lacking any detail beyond the basic action.

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 tool with 2 parameters and no output schema, the description is too sparse. It does not explain the meaning of 'top', what the response contains, or any usage distinctions. The annotations provide safety information, but the description itself is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, and the description does not explain the parameters 'groupId' or 'top'. 'top' is particularly ambiguous as it could mean a limit or count, but no clarification is provided.

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 uses the specific verb 'List' with the resource 'members of a group', clearly stating the action. It distinguishes itself from sibling tools like list_groups (which lists all groups) and add_group_member (which adds members).

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 information about when to use this tool versus alternatives, such as get_group or list_users. There are no conditions, prerequisites, or exclusions mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_groupsList Microsoft 365 GroupsC
Read-onlyIdempotent

List groups with optional $top, $filter, $select, and $orderby.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNo
filterNo
selectNo
orderbyNo

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. However, the description adds no behavioral context beyond the schema—it does not mention pagination, default result sizes, or response format. It only restates the parameter names.

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 a single sentence, front-loaded with the action 'List groups', and contains no filler or redundant content. While brief, it is efficiently structured.

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?

There is no output schema, so the description should clarify what the tool returns (e.g., a list of group objects). It also lacks usage context, parameter semantics, and any mention of limitations or defaults. Given the tool's relative simplicity, the description is under-specified for an agent to invoke it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no descriptions for parameters, and the description only lists their names without explaining their meaning or syntax. For example, it does not clarify that 'filter' uses OData filtering syntax or that 'select' limits returned properties. With 0% schema description coverage, this falls short of compensating for the lack of detail.

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 identifies the action ('List groups') and the resource (Microsoft 365 Groups), and it mentions the optional OData parameters ($top, $filter, $select, $orderby). It does not explicitly differentiate from sibling tools like get_group or list_group_members, but the resource is unambiguous.

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?

There is no guidance on when to use this tool versus alternatives. It does not mention scenarios such as 'use get_group for a single group' or 'use list_group_members for group members', leaving the selection to the agent's inference from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_subscribed_skusList Subscribed SKUsA
Read-onlyIdempotent

List tenant subscribed SKUs for license lookup and seat availability.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint, idempotentHint, and destructiveHint false, so the description only needs to add context. It adds tenant scope and the seat availability purpose but does not disclose return format or pagination. This is consistent but not highly enriching.

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?

A single, front-loaded sentence with no filler. It immediately states the action and purpose, making it easy for an agent to parse and understand.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple zero-parameter, read-only tool with rich annotations, the description is complete enough. It states what is listed and why, and the sibling context clarifies its role. No output schema exists, but the description's simplicity minimizes the need for more detail.

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 zero parameters and 100% schema coverage, so the description has no burden to explain parameters. According to the baseline for 0 params, this scores a 4. The description does not need to add any parameter guidance.

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 'List tenant subscribed SKUs' with a specific verb and resource. Adding 'for license lookup and seat availability' clarifies the purpose and distinguishes it from sibling tools like get_user_license_details or assign_license.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for license lookup and seat availability' provides clear context on when to use this tool, indicating tenant-level license inventory. It does not explicitly mention alternatives or exclusions, but the use case is well implied given the sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_usersList Microsoft 365 UsersA
Read-onlyIdempotent

List users with optional $top, $filter, $select, and $orderby.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNo
filterNo
selectNo
orderbyNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds only that query parameters are optional (already visible in the schema) but does not mention pagination, default response size, or rate limits.

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?

A single, punchy sentence that front-loads the primary action and lists the parameters succinctly. Every word earns its place, though it sacrifices depth for brevity.

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?

With no output schema and zero parameter explanations, the description leaves the agent uninformed about pagination, default return fields, or OData syntax. For a listing tool with 4 parameters, this is insufficient for confident invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate by explaining parameter meanings. It merely lists the parameter names without describing what $top, $filter, $select, or $orderby do semantically, adding minimal value over the schema.

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 tool's action ('List') and resource ('users'), distinct from siblings like get_user. It is specific and unambiguous, with the title reinforcing the Microsoft 365 scope.

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 usage for enumerating users but does not explicitly state when to use it versus alternatives like get_user or list_groups. No exclusion criteria or alternative tool references are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_group_memberRemove Group MemberA
DestructiveIdempotent

Remove a user from a group. Idempotent when the user is not a member.

ParametersJSON Schema
NameRequiredDescriptionDefault
userIdYes
groupIdYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds a specific edge-case behavior: 'Idempotent when the user is not a member.' This goes beyond the generic idempotentHint annotation and provides valuable context about how the tool behaves under a specific condition.

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 two short sentences with no fluff or redundant information. It states the core action and one key behavioral detail, making it highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the description combined with annotations covers the essential behavior. It doesn't mention return values or potential errors, but there is no output schema, and the annotations provide safety guidance (destructiveHint, idempotentHint). Overall, it is sufficiently complete for this mutation tool.

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 schema has two parameters (groupId, userId) with no descriptions (0% coverage). The description compensates by framing the action in terms of 'user' and 'group,' which maps to the parameters, but it doesn't provide additional constraints, formats, or context. The parameter names are self-explanatory, so the description adds minimal value beyond them.

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 action: 'Remove a user from a group.' This is a specific verb + resource, and it naturally distinguishes itself from siblings like add_group_member and remove_license. It also includes a useful behavioral note about idempotency.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool (removing a user from a group). It doesn't explicitly mention alternatives or exclusions, but the context is unambiguous and self-evident. For a simple operation, this is adequate guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_licenseRemove License From UserC
DestructiveIdempotent

Remove a license from a user.

ParametersJSON Schema
NameRequiredDescriptionDefault
userYes
licenseYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. However, the description adds no behavioral context beyond restating the action—no mention of permanence, side effects, or impacts on user access. Minimal additional transparency beyond annotations.

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 a single concise sentence, front-loaded with the action. It avoids redundancy and is easy to parse. However, it may be too terse, sacrificing necessary detail for brevity, but as a purpose statement it is appropriately sized.

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?

With two required parameters and no output schema, the description must provide enough context for correct invocation. It fails to specify parameter formats, prerequisites, or the operation's effect. The annotations cover safety but not usage completeness, leaving the tool under-specified for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain the 'user' or 'license' parameters beyond their names. It provides no hints about accepted formats (e.g., UPN vs object ID, SKU ID vs product name). With no enums or schema descriptions, the agent must guess, and the description offers little help.

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 uses a specific verb ('remove') and clearly identifies the resource and target ('license from a user'). It distinguishes from sibling tools like assign_license and remove_group_member. The action is unambiguous and matches the tool's title.

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 gives no guidance on when to use this tool versus alternatives. It does not mention prerequisites (e.g., checking current licenses with get_user_license_details), nor does it suggest scenarios where removal is appropriate. This is a bare statement with no usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_managerSet User ManagerB

Set a user's manager. Provide the manager's object id or userPrincipalName.

ParametersJSON Schema
NameRequiredDescriptionDefault
userYes
managerYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is a write operation (readOnlyHint=false) and not idempotent, but the description adds no behavioral context beyond that. It does not mention whether the manager is replaced, if validation occurs, or what side effects might happen (openWorldHint=true). The description is purely declarative without useful behavioral detail.

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 one brief sentence that gets straight to the point ('Set a user's manager') followed by a necessary input clarification. It is front-loaded and contains no superfluous words, making it highly concise and well-structured.

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?

For a simple 2-parameter setter with no output schema, the description is adequate but not complete. It covers the action and manager format, but omits details about the 'user' parameter, expected return values, or any preconditions. Given the tool's simplicity, this is acceptable but leaves some key questions unanswered.

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 provides no descriptions for either parameter (0% coverage). The description explains that the 'manager' parameter accepts an object id or userPrincipalName, which adds meaning beyond the schema. However, the 'user' parameter is not clarified at all; it is only implied to be the user whose manager is set, with no format specified. This partial compensation leaves a gap.

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 action ('Set a user's manager') with a specific resource (user) and distinguishes it from sibling tools like set_usage_location or assign_license. It also specifies the input format for the manager (object id or userPrincipalName), leaving no ambiguity about the tool's purpose.

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 gives no guidance on when to use this tool versus alternatives (e.g., update_user) and does not mention any prerequisites or exclusions. It is implied that this tool is for setting the manager field, but there is no explicit context or comparison with sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_usage_locationSet User Usage LocationA

Set a user usageLocation (required before license assignment).

ParametersJSON Schema
NameRequiredDescriptionDefault
userYes
usageLocationYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds little beyond the annotations. It does not disclose potential side effects, permission requirements, or consequences of setting the location. Annotations already indicate a non-read-only, non-destructive mutation, but the description does not elaborate on the openWorldHint or any subtle behaviors.

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?

One short sentence that is immediately clear and front-loaded. No wasted words.

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?

The tool is simple, but the description omits information about return values, parameter meanings, and behavioral nuances. The prerequisite note is helpful, but overall the description leaves the agent with unanswered questions, especially given no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description does not explain the semantics of 'user' or 'usageLocation' (e.g., that usageLocation is a two-letter country code). The parameter names are self-explanatory to a degree, but the description fails to compensate for the lack of schema descriptions.

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 action ('Set a user usageLocation') and identifies the resource, with a helpful prerequisite note ('required before license assignment'). This distinguishes it from sibling tools like assign_license.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'required before license assignment' provides clear context for when to use this tool (prior to assigning licenses). However, it does not explicitly mention alternatives or exclusion scenarios, stopping short of full when/not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_userUpdate Microsoft 365 UserA

Update attributes on an existing user (PATCH). Use accountEnabled to enable/disable an existing account (e.g. activate a pre-created hire or disable a leaver). Only provided fields are changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNo
userYes
stateNo
countryNo
surnameNo
jobTitleNo
givenNameNo
departmentNo
otherMailsNo
postalCodeNo
companyNameNo
displayNameNo
mobilePhoneNo
employeeTypeNo
streetAddressNo
usageLocationNo
accountEnabledNo
businessPhonesNo
officeLocationNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations establish that the tool is not read-only and not destructive. The description adds behavioral transparency beyond annotations by specifying the PATCH method and emphasizing that only provided fields are changed. It also gives concrete, real-world examples of accountEnabled usage. This aligns with annotations and adds useful context about side effects and scope of changes.

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 two sentences long, front-loaded with the primary purpose ('Update attributes on an existing user (PATCH)'), followed by a specific, high-value use case and a behavioral note. Every word contributes, with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having 19 parameters and no output schema, the description adequately covers the tool's core purpose and behavior: it updates existing users, uses PATCH semantics, and specifically highlights accountEnabled for account lifecycle management. The 'existing user' qualifier sets the context. While individual attributes are not enumerated, the generic 'Update attributes' phrase signals that any of the schema properties may be set, making the description sufficient for overall tool selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for explaining parameter meanings. It only explains accountEnabled (to enable/disable accounts), while the other 18 parameters (e.g., city, state, otherMails) receive no additional semantic context beyond their names. The schema already shows property names and types, but the description fails to clarify how these attributes are used or their business meaning, leaving most parameters without added value.

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 tool's function: 'Update attributes on an existing user (PATCH)'. It specifies the verb (update), the resource (existing user), and the HTTP method, distinguishing it from create_user and specific setter tools like set_usage_location. The accountEnabled example further clarifies a key use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: updating existing users, enabling/disabling accounts via accountEnabled (e.g., activating pre-created hires or disabling leavers). It also notes that only provided fields are changed, setting expectations for partial updates. However, it does not explicitly state when not to use it or name alternative tools for specific operations.

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. 18 tool updatesv0.1.0
    • First observedactivate_pim_role
    • First observedadd_group_member
    • First observedassign_license
    • First observedcreate_temporary_access_pass
    • First observedcreate_user
    • First observeddelete_temporary_access_pass
    • First observedget_group
    • First observedget_user
    • First observedget_user_license_details
    • First observedlist_group_members
    • First observedlist_groups
    • First observedlist_subscribed_skus
    • First observedlist_users
    • First observedremove_group_member
    • First observedremove_license
    • First observedset_manager
    • First observedset_usage_location
    • First observedupdate_user

TDQS

A3.7/5.0
Disambiguation5/5

Each tool targets a specific resource and action, such as get_user vs list_users, assign_license vs remove_license, and create_temporary_access_pass vs delete_temporary_access_pass. There is no meaningful overlap that would cause an agent to select the wrong tool.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (e.g., get_user, list_groups, assign_license, create_temporary_access_pass). No mixing of conventions or vague verbs.

Tool Count4/5

With 18 tools, the server is slightly above the typical 3-15 range but justifiably so, as it covers user/group management, licensing, temporary access passes, and PIM roles. The count feels appropriate for the broad Microsoft 365 domain without being bloated.

Completeness4/5

The tool surface covers core user lifecycle (create/get/update/list), license management, group membership, and authentication flows. The main gap is lack of user deletion, but this is workable via update_user disable, and group creation/deletion appears out of scope, making these minor gaps.

Maintenance

ActivityStale
ResponsivenessNo issues

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

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Provides secure access to Microsoft Entra ID (Azure AD) resources including users, devices, and applications through Microsoft Graph API. Enables querying organizational data with comprehensive audit logging to Azure Blob Storage.
    -
  • A
    license
    B
    quality
    Not graded
    maintenance
    Provides comprehensive management of Microsoft 365 services including Exchange, SharePoint, Teams, Azure AD, Intune device management, security & compliance frameworks, and universal access to 1000+ Microsoft Graph API endpoints with advanced features like batch operations, delta queries, and real-time webhooks.
    50
    15
    -

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/borgels/mcp-server-microsoft365'

If you have feedback or need assistance with the MCP directory API, please join our Discord server