mcp-server-microsoft365
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-server-microsoft365create a new user for Jane Doe with Microsoft 365 Business Basic license"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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_userslist_subscribed_skus(license lookup and seat availability)list_groups,get_group,list_group_membersget_user_license_details
Write tools (disabled by default):
create_userupdate_user(PATCH attributes on an existing user, incl.accountEnabledto enable/disable — e.g. activate a pre-created hire or disable a leaver)set_managerassign_license,remove_licenseadd_group_member,remove_group_memberset_usage_locationcreate_temporary_access_pass(passwordless first sign-in / MFA setup; regenerated until alphanumeric),delete_temporary_access_passactivate_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
refreshTokenoption /MS_REFRESH_TOKEN(plus the app'sMS_CLIENT_ID/MS_CLIENT_SECRET/MS_TENANT_ID). The server mints short-lived delegated access tokens via therefresh_tokengrant, 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_roleonly 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 |
|
Create users |
|
Update users / set manager / enable-disable |
|
Read license/SKU state |
|
Assign / remove licenses |
|
Manage group membership |
|
Create / delete Temporary Access Pass |
|
JIT PIM role activation ( | delegated |
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).
App registration and admin consent
In the Entra admin center, register an application (single tenant).
Under Certificates & secrets, create a client secret and copy its value.
Under API permissions, add the Microsoft Graph Application permissions above, then click Grant admin consent.
Copy the Directory (tenant) ID and Application (client) ID.
Setup
Install dependencies and build the CLI:
npm install
npm run buildProvide 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:httpThe 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
list_subscribed_skusto see which licenses exist and how many seats are free.create_userwith adisplayNameanduserPrincipalName. A strong temporary password is generated when you do not supply one, and returned in the result withforceChangePasswordNextSignInset. Store it securely and share it out-of-band.create_userfails clearly if the UPN already exists.assign_licensewith a friendly name (E3), askuPartNumber(ENTERPRISEPACK), or a SKU GUID. PassusageLocationon the same call for a brand-new user.add_group_memberto 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
usageLocationtoassign_license, it isPATCHed onto the user before the license is assigned.If you do not, the server reads the user's current
usageLocationand 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
skuPartNumbercase-insensitively;otherwise maps a friendly name (e.g.
E3→ENTERPRISEPACK/SPE_E3,E5→ENTERPRISEPREMIUM/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:liveSecurity and audit
Credentials are read from environment variables only.
MS_GRAPH_BASE_URLmust behttps://; loopbackhttp://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.1by default.
Security reports: security@borgels.com.
Available Tools
18 toolsactivate_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.
| Name | Required | Description | Default |
|---|---|---|---|
| duration | No | ||
| justification | No | ||
| directoryScopeId | No | ||
| roleDefinitionId | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| userId | Yes | ||
| groupId | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| license | Yes | ||
| disabledPlans | No | ||
| usageLocation | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| maxAttempts | No | ||
| isUsableOnce | No | ||
| startDateTime | No | ||
| lifetimeInMinutes | No | ||
| requireAlphanumeric | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| password | No | ||
| displayName | Yes | ||
| mailNickname | No | ||
| checkExisting | No | ||
| usageLocation | No | ||
| accountEnabled | No | ||
| userPrincipalName | Yes | ||
| forceChangePasswordNextSignIn | No |
TDQS
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.
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.
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.
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.
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.
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 PassADestructiveIdempotent
Delete a user's Temporary Access Pass. With methodId deletes that pass; otherwise deletes every TAP on the user.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| methodId | No |
TDQS
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.
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.
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.
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.
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.
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 GroupARead-onlyIdempotent
Fetch one group by object id.
| Name | Required | Description | Default |
|---|---|---|---|
| select | No | ||
| groupId | Yes |
TDQS
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.
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.
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.
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.
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.
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 UserARead-onlyIdempotent
Fetch one user by object id or userPrincipalName.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| select | No |
TDQS
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.
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.
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.
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.
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.
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 DetailsARead-onlyIdempotent
List the licenses currently assigned to a user.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes |
TDQS
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.
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.
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.
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.
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.
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 MembersCRead-onlyIdempotent
List the members of a group.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| groupId | Yes |
TDQS
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.
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.
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.
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.
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.
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 GroupsCRead-onlyIdempotent
List groups with optional $top, $filter, $select, and $orderby.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| filter | No | ||
| select | No | ||
| orderby | No |
TDQS
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.
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.
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.
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.
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.
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 SKUsARead-onlyIdempotent
List tenant subscribed SKUs for license lookup and seat availability.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 UsersARead-onlyIdempotent
List users with optional $top, $filter, $select, and $orderby.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| filter | No | ||
| select | No | ||
| orderby | No |
TDQS
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.
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.
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.
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.
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.
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 MemberADestructiveIdempotent
Remove a user from a group. Idempotent when the user is not a member.
| Name | Required | Description | Default |
|---|---|---|---|
| userId | Yes | ||
| groupId | Yes |
TDQS
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.
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.
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.
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.
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.
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 UserCDestructiveIdempotent
Remove a license from a user.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| license | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| manager | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | ||
| usageLocation | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | ||
| user | Yes | ||
| state | No | ||
| country | No | ||
| surname | No | ||
| jobTitle | No | ||
| givenName | No | ||
| department | No | ||
| otherMails | No | ||
| postalCode | No | ||
| companyName | No | ||
| displayName | No | ||
| mobilePhone | No | ||
| employeeType | No | ||
| streetAddress | No | ||
| usageLocation | No | ||
| accountEnabled | No | ||
| businessPhones | No | ||
| officeLocation | No |
TDQS
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.
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.
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.
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.
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.
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.
18 tool updates
v0.1.0- First observed
activate_pim_role - First observed
add_group_member - First observed
assign_license - First observed
create_temporary_access_pass - First observed
create_user - First observed
delete_temporary_access_pass - First observed
get_group - First observed
get_user - First observed
get_user_license_details - First observed
list_group_members - First observed
list_groups - First observed
list_subscribed_skus - First observed
list_users - First observed
remove_group_member - First observed
remove_license - First observed
set_manager - First observed
set_usage_location - First observed
update_user
TDQS
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.
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.
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.
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Manage Microsoft 365 email, calendar, contacts and inbox rules via the Graph API with OAuth 2.0.
Permissioned access to Outlook, OneDrive and Teams via the user's own Microsoft account
*Updated June 17th 2025** Manage your Microsoft 365 services effortlessly. Create and manage distr…
- ZopDev MCPOAuthdev.zop
Cloud cost, inventory and governance on AWS/Azure/GCP. Read-only by default, optional scoped writes
1
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceProvides 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.-
- AlicenseBqualityNot gradedmaintenanceProvides comprehensive management of Microsoft 365 services including Exchange, SharePoint, Teams, Azure AD, Intune device management, security & compliance frameworks, and universal access to 1000+ Microsoft Graph API endpoints with advanced features like batch operations, delta queries, and real-time webhooks.5015-
- AlicenseNot gradedqualityCmaintenanceEnables management of Microsoft 365 users, licenses, and groups through Microsoft Graph API. Supports user provisioning, license assignment, group management, and automated M365 administration workflows.2MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants and automation tools to manage Microsoft 365, Entra ID, and Intune resources through 32 tools for user/device/file management and infrastructure monitoring.6MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/borgels/mcp-server-microsoft365'
If you have feedback or need assistance with the MCP directory API, please join our Discord server