Microsoft Entra SCIM MCP server
Microsoft Entra SCIM 2.0 Provisioning API: user and group lifecycle, with a local mock.
2 stars89 downloads/wk
Reviews
Write oneNobody has reviewed Microsoft Entra SCIM yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Microsoft Entra SCIM tools (18, 9 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
add_group_membersAdd one or more users to a group. Auto-chunks at … member ids per PATCH call (Entra SCIM API constraint), and duplicate ids in the input are deduped. Idempotent — adding an existing member is a no-op, so retrying after a partial failure is safe. If a chunk fails mid-sequence the error reports addedMemberIds, failedMemberIds and notAttemptedMemberIds, because earlier chunks are already committed an
create_groupwrite actionCreate an Entra group via SCIM. displayName is required; the Entra extension flags decide the group type. securityEnabled true with mailEnabled false (or omitted) is a security group. mailEnabled true with securityEnabled false is a Microsoft 365 / Unified group and needs mailNickname. Entra does not support creating mail-enabled security groups, so setting both flags true is rejected. displayName
delete_groupwrite actionDELETE a group by id. Microsoft 365 / Unified groups are soft-deleted and restorable for 30 days, security groups are removed permanently — and either way restoration is a Microsoft Graph operation, not a SCIM one, so this server cannot undo it. The group's members are not deleted, only their membership. Any access granted through this group is revoked. A second call for the same id returns 404.
deprovision_userwrite actionDELETE a user by id. The user is soft-deleted into the Entra recycle bin and is restorable for 30 days — but only through Microsoft Graph, not SCIM, so this server cannot undo it. Deleting also strips every group membership, which is why a later remove_group_member for this user returns 404. A second call for the same id returns 404 rather than succeeding quietly.
get_groupFetch a single group by id. Note: members are NOT returned, at any page size or projection. To list this group's direct members, use list_users with a groups.value filter (Microsoft's recommended path); to find a user's groups, use list_groups with a members.value filter; to check one specific membership, filter list_groups on both id and members.value.
get_service_provider_configFetch the Entra SCIM service provider configuration (supported features: patch, filter, pagination, bulk). Answers what the endpoint supports, not what is in the directory. The response is the same for every tenant and changes only when Microsoft changes the API, so fetch it once and reuse it rather than calling it before each operation.
get_userFetch a single user by Entra object id. Two things are never in the response, whatever you project: Custom Security Attributes (the schema marks them returned:"request" — use get_user_custom_security_attributes) and group memberships (filter list_groups on members.value instead; for the reverse, a group's members, filter list_users on groups.value). To look a user up by userName rather than id, us
get_user_custom_security_attributesFetch Custom Security Attributes for a user, projected by attribute set. attributeSets is required — the API rejects the bare extension URN with a 400. CSAs never come back from a plain get_user; they are only returned when named explicitly here. A set the user holds no values in comes back empty, which is a valid answer rather than an error. Requires CustomSecAttributeAssignment.Read.All (covered
list_groupsList Entra groups via SCIM. Filter supports 'eq' on displayName/id/members.value/securityEnabled/mailEnabled/owners.value and 'ew' on displayName; only 'and' is supported. Cursor-based pagination. A members.value filter is the only way to discover which groups a user belongs to — neither get_user nor get_group reports membership. For the reverse, a group's members, use list_users filtered on group
list_resource_typesList the SCIM resource types Entra supports (User, Group) and the schemas each one uses. Pass id to fetch a single type. Static per API version — cache it rather than re-fetching.
list_schemasList Entra SCIM schemas (core User, core Group, enterprise extension, Entra extensions, CustomSecurityAttributes) with each attribute's type, mutability and whether it is returned by default. Use it to check an attribute name or extension URN before building a patch path. Pass id to fetch a single schema. Static per API version — cache it rather than re-fetching. It describes the schema shape only
list_usersList Entra users via SCIM. Filter supports 'eq' on userName/externalId/id/active/groups.value/mailNickname/ownedGroups.value and 'ew' on userName/mailNickname, with not(...) allowed on 'ew' clauses; only 'and' combines them. Cursor-based pagination. This is also how you resolve a userName to an object id, since every other user tool takes the id, and how you list a group's direct members (groups.v
provision_userwrite actionCreate a user in Entra via SCIM. Enforces the required attribute set: userName, password, displayName, givenName, familyName. mailNickname is optional — omit it and Entra derives it from userName. active defaults to true. Not idempotent — a second call with the same userName fails with a uniqueness conflict, so check with list_users first if a retry might be a duplicate. Group membership is not se
remove_group_memberwrite actionRemove a single user from a group. The Entra SCIM API only allows one removal per PATCH call and no other ops in the same call, so removing several members means several calls. A 404 here does not mean the group is missing: the API answers "Resource '<groupId>' does not exist or one of its queried reference-property objects are not present" — naming the group, not the member — whenever the user is
update_groupwrite actionPATCH group attributes — e.g. { op: "replace", path: "displayName", value: "Platform Engineering" }, or the Entra extension URN ending in ":description". Membership changes are NOT allowed here: a "members" path is rejected client-side before any request is sent, so use add_group_members / remove_group_member instead. Group type flags (mailEnabled, securityEnabled) are fixed at creation and cannot
update_userwrite actionupdate_user_custom_security_attributeswrite actionPATCH CustomSecurityAttributes on a user. Set a value with { op: "replace", path: "urn:ietf:params:scim:schemas:extension:Microsoft:Entra:2.0:CustomSecurityAttributes:Engineering.Team", value: "Platform" }. Clear one with op "remove" on the same path, or by replacing a multi-valued attribute with an empty array — both delete the assignment outright. The attribute set and attribute must already exi
update_user_lifecyclewrite actionPATCH lifecycle attributes on a user — currently employeeLeaveDateTime. Not an inert field: Entra Lifecycle Workflows can be scheduled off it, so writing a past or imminent date may start offboarding. Called with no attributes set it changes nothing and returns { noChanges: true } without issuing a request. Requires User-LifeCycleInfo.ReadWrite.All on the app registration, which is separate from t
Public scan report
scanner v0.1.10 · 2026-10-15 · same rubric, same numbers if you re-run it
- Code scan57 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitystatic API keys via environment variables6/15
- Maintenancelast push 2 days ago15/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
How Microsoft Entra SCIM compares
Against every graded MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 83/100
- higher than 65% of 48,243 servers
- Tools
- 18
- the typical server has 7
- Tools that change things
- 50%
- typical: 0%. Fewer write tools means less an agent can break
- GitHub stars
- 2
- more than 75% of 28,706 servers
- Downloads a week
- 89
- more than 60% of 12,306 servers with a package
What its tools let an agent do: 8 read · 2 create · 6 change · 2 delete
Release history: 3 versions in the registry since 2026-09-07, latest 2026-10-14, typically one every 22 days.
Install Microsoft Entra SCIM in Claude Code, Cursor or VS Code
Runs npx -y entra-scim-mcp on your machine. Read the scan report first; the gateway never runs local packages.
claude mcp add entra-scim-mcp -- npx -y entra-scim-mcp
What the publisher says
From the Microsoft Entra SCIM repository's README, as published. We do not edit it. Read it on GitHub
entra-scim-mcp
Model Context Protocol server for the Microsoft Entra SCIM 2.0 Provisioning API (GA April 2026). Exposes user and group lifecycle operations against https://graph.microsoft.com/rp/scim as MCP tools for agents like Claude.
What you can do with it
- Discover the tenant's SCIM capabilities (getserviceproviderconfig, listresourcetypes, listschemas)
- Provision, read, update, and deprovision users — including Custom Security Attributes and lifecycle attrs
- Create, update, and delete groups, and manage membership with the API's strict PATCH rules respected automatically
Prerequisites
Before this server can talk to your tenant, complete the one-time setup in the Microsoft docs:
- Entra ID P1 (or any SKU containing P1) and an Azure subscription to link for billing.
- Enable the SCIM Provisioning API in ID Governance → Dashboard and link a billing resource group.
- Register an application with the Microsoft Graph application permissions you need:
Grant admin consent.
- User.ReadWrite.All, Group.ReadWrite.All (core lifecycle)
- CustomSecAttributeAssignment.ReadWrite.All, CustomSecAttributeDefinition.Read.All (CSA tools)
- User-LifeCycleInfo.ReadWrite.All (lifecycle tools)
- User-Mail.ReadWrite.All, User-Phone.ReadWrite.All, User.EnableDisableAccount.All (least-privilege alternatives)
- Create either a client secret or upload a PEM client certificate.
Every SCIM API call is billed — this server does not batch beyond what the API requires.
Try it without an Entra tenant
The package ships a local mock of the Entra SCIM API (entra-scim-mock-server) so you can drive every tool with zero Azure setup and zero API billing:
# shell 1 — start the mock (seeds a small demo tenant)
npx -y --package entra-scim-mcp entra-scim-mock-serverThen point the MCP server at it:
{
"mcpServers": {
"entra-scim-mock": {
"command": "npx",
"args": ["-y", "entra-scim-mcp"],
"env": {
"ENTRA_SCIM_BASE_URL": "http://127.0.0.1:8990",
"ENTRA_SCIM_STATIC_TOKEN": "dev-token"
}
}
}
}Mock flags: --port, --token, --seed , --no-seed, --capture (log every request/response), --validator-compat (RFC-standard behavior for the Microsoft SCIM Validator — see docs/scim-validator.md).
Install / run
The server is a stdio MCP server, designed to be launched by your MCP client (Claude Desktop, Claude Code, etc.).
npx -y entra-scim-mcpRequired environment:
Set exactly one of ENTRACLIENTSECRET or ENTRACLIENTCERT_PATH.
Development / testing environment variables
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Microsoft Entra SCIM: common questions
- Is Microsoft Entra SCIM MCP server safe?
- Mostly: it is graded B (83/100). Read the Microsoft Entra SCIM safety report
- How do I install Microsoft Entra SCIM?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does Microsoft Entra SCIM need an API key?
- Yes. The registry entry asks for
ENTRA_CLIENT_SECRET,ENTRA_CLIENT_CERT_PASSWORD,ENTRA_SCIM_STATIC_TOKEN. - Is Microsoft Entra SCIM maintained?
- The last commit was 23 days ago (2026-10-14). The latest release is v0.4.0.
- How does Microsoft Entra SCIM compare with other MCP servers?
- safety score 83/100 (higher than 65% of 48,243 servers); tools 18 (the typical server has 7); tools that change things 50% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.