cipp-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LOG_LEVEL | No | error, warn, info (default), or debug | |
| CIPP_API_KEY | No | Static Bearer token (use this OR the OAuth trio) | |
| CIPP_BASE_URL | No | Your CIPP deployment URL (e.g. https://cipp.yourdomain.com) | |
| MCP_HTTP_PORT | No | Port for HTTP mode (default: 8080) | |
| MCP_TRANSPORT | No | stdio (default) or http | |
| CIPP_CLIENT_ID | No | OAuth client ID issued by CIPP's API Client Management page | |
| CIPP_TENANT_ID | No | Entra tenant ID that owns the CIPP API-client app registration | |
| CIPP_TOKEN_URL | No | Override OAuth token endpoint (sovereign clouds only) | |
| CIPP_TOKEN_SCOPE | No | Override OAuth scope (default: <clientId>/.default) | |
| CIPP_CLIENT_SECRET | No | OAuth client secret paired with CIPP_CLIENT_ID |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| cipp_list_tenantsB | List all tenants managed in CIPP |
| cipp_get_tenant_detailsC | Get detailed information about a specific tenant |
| cipp_list_usersC | List users in a tenant |
| cipp_create_userA | ⚠ HIGH-IMPACT. Creates a new user account in the tenant, which grants directory presence and may include initial credentials and license/role eligibility. Reversible by deleting or disabling the user. Confirm with the user before invoking. |
| cipp_edit_userA | ⚠ HIGH-IMPACT. Edits an existing user's properties, which can include directory attributes, usage location, and may grant or revoke roles or license eligibility. Reversible by editing again. Confirm with the user before invoking. CIPP rebuilds the UPN from the account's current username + domain on every edit, so the current UPN is always resolved first (editing without it would rename the account). That lookup is retried for ~10s when the user is not found yet, because a just-created account can lag in Microsoft Graph. |
| cipp_disable_userA | ⚠ HIGH-IMPACT. Disables a user account, blocking sign-in. Reversible by re-enabling the account. Confirm with the user before invoking. |
| cipp_reset_passwordA | ⚠ HIGH-IMPACT. Resets a user's password, invalidating their current password. CIPP always generates the new password itself (a caller cannot choose one) and returns it in the response, or a PWPush link if PWPush is enabled in CIPP, so treat the response as a secret. The previous password cannot be restored; resetting again issues another new one. Confirm with the user before invoking. |
| cipp_reset_mfaA | ⚠ HIGH-IMPACT. Resets all MFA methods for a user, requiring them to re-register their authentication methods. Reversible by re-enabling MFA. Confirm with the user before invoking. |
| cipp_revoke_sessionsA | ⚠ HIGH-IMPACT. Revokes all active sessions for a user, forcing them to re-authenticate. Reversible by the user signing in again. Confirm with the user before invoking. |
| cipp_offboard_userA | ⚠ DESTRUCTIVE — IRREVERSIBLE. Queues CIPP's offboarding job for a user. Every action is opt-in: at least one must be enabled or the call is rejected. Returns once the job is QUEUED — CIPP reports success on task creation, not completion, so confirm the outcome in CIPP's Offboarding view before reporting the account as offboarded. Confirm with the user before invoking. |
| cipp_bec_checkB | Run a Business Email Compromise check on a user |
| cipp_list_mfa_usersB | List users and their MFA status in a tenant |
| cipp_list_user_devicesB | List devices enrolled by a user |
| cipp_list_user_groupsC | List groups a user is a member of |
| cipp_list_user_signin_logsA | List one user's most recent interactive Entra ID sign-ins, newest first. Each row gives the time, app and resource, IP address, location, success/failure with the error code and failure reason, client app, Conditional Access status and the policies that evaluated, authentication requirement (whether MFA was required) and the authentication methods/steps Graph recorded, first factor included, device, and risk when flagged — plus a summary of failures, distinct IPs and countries. Answers "why can't this user sign in", "was this account used from somewhere unexpected", and "did MFA/CA apply". Accepts a UPN or Entra object id; a UPN is resolved to the object id first, because the upstream filter matches object ids only. One tenant and one user per call. Requires Entra ID P1/P2 in the tenant. For tenant-wide sign-ins this is the wrong tool — use CIPP's Sign-Ins report (ListSignIns). |
| cipp_list_groupsC | List groups in a tenant |
| cipp_create_groupA | ⚠ HIGH-IMPACT. Creates a new group in the tenant, which can be used for security policy assignments (RBAC, Conditional Access) or mail distribution. Reversible by deleting the group. Confirm with the user before invoking. |
| cipp_list_mailboxesC | List mailboxes in a tenant |
| cipp_list_mailbox_permissionsB | List permissions on a specific mailbox |
| cipp_list_trusted_blocked_sendersA | List a mailbox's safe-sender (trusted) and blocked-sender entries from its Exchange Online junk email settings. Read-only; returns an empty list when the mailbox has none configured, which is normal, not an error. |
| cipp_list_mailbox_usageA | Report mailbox and online-archive sizes across a tenant, largest first, with tenant-wide totals. Each mailbox reports bytes used, a human-readable size, item count, quota and percent-of-quota, for both the primary store and the archive. Answers 'who is near quota', 'which mailboxes need archiving', and 'how much Exchange storage does this tenant use'. Sizes come from CIPP's reporting database, which must have been synced — the live Exchange query carries no size data at all. For one mailbox, or when the cache is unavailable, use cipp_get_mailbox_usage. |
| cipp_get_mailbox_usageA | Report the primary mailbox size and online-archive size for a single mailbox, with item counts, quotas and percent-of-quota. Reads live from Exchange, so unlike cipp_list_mailbox_usage it needs no CIPP report-cache sync and still returns real sizes for a tenant that conceals names in its Microsoft 365 usage reports. |
| cipp_set_out_of_officeA | ⚠ HIGH-IMPACT. Configures the out-of-office / auto-reply for a mailbox, which causes automated messages to be sent to internal and/or external senders. Reversible by disabling the auto-reply. Confirm with the user before invoking. |
| cipp_set_email_forwardingA | ⚠ HIGH-IMPACT. Configures email forwarding on a mailbox, silently redirecting the user's incoming mail to another address. This is a common data-exfiltration vector. Reversible by removing the forwarding rule. Confirm with the user before invoking. |
| cipp_list_conditional_access_policiesB | List Conditional Access policies for a tenant |
| cipp_list_named_locationsA | List named locations (trusted IPs) for a tenant |
| cipp_get_secure_scoreA | Read a tenant's Microsoft Secure Score live: latest points, percentage of the maximum, comparison with all tenants (basis AllTenants) and similarly sized tenants (basis TotalSeats), the control-by-control achievement on that latest reading (lowest completion first), and the recent daily history newest-first. There is no dedicated CIPP list endpoint — this calls ListGraphRequest with Endpoint security/secureScores. top defaults to 7 and caps at 90; it is sent with NoPagination so it limits the series instead of only setting Graph's page size. allTenants is rejected (CIPP's estate view is the nightly cache, not this call). An empty collection is reported as no reading, never as a score of zero. Changing a control's state is not this tool. |
| cipp_list_secure_score_controlsA | List a tenant's Microsoft Secure Score control profiles — the recommendation catalog, not the achievement. Each profile includes title, category, rank, max points, implementation cost, user impact, remediation, threats, compliance mappings, and any non-default state updates (resolved by a third party, or ignored / risk accepted). Calls ListGraphRequest with Endpoint security/secureScoreControlProfiles. Use cipp_get_secure_score for the current score and which controls are complete. allTenants is rejected. Read-only; CIPP's ExecUpdateSecureScore write is not exposed. |
| cipp_list_enterprise_appsA | List enterprise applications (service principals) in a tenant — including third-party SaaS apps that customers have integrated via OAuth (Slack, Salesforce, Zoom, etc.). Returns appId, displayName, publisher, owner-org, signInAudience, tags, and creation date. Use tenantFilter='allTenants' for cross-tenant fan-out — CIPP handles per-tenant errors inline, so a 403 from one opt-out tenant returns as an error row rather than failing the call. Excludes Microsoft-built-in apps by default (owner org f8cdef31-…); pass includeBuiltIn=true to include them. |
| cipp_list_standardsB | List compliance standards configured for a tenant |
| cipp_run_standards_checkC | Trigger a standards compliance check for a tenant |
| cipp_list_standard_templatesA | List the CIPP Standards Templates configured across the partner tenant. |
| cipp_get_tenant_driftA | Report standards drift — settings that deviate from a tenant's assigned Standards Template. Omit tenantFilter to report drift across all tenants. |
| cipp_get_tenant_alignmentA | Report each tenant's alignment percentage against its assigned Standards Templates — the key signal for deciding which standards are safe to promote to Remediate. Omit tenantFilter to report on all tenants. |
| cipp_create_standard_templateA | ⚠ HIGH-IMPACT. Creates or updates a CIPP Standards Template (upsert by GUID). A template assigned to tenants with any Remediate-action standard WILL modify those tenants on the next standards run. Confirm with the user before invoking. |
| cipp_delete_standard_templateA | ⚠ HIGH-IMPACT. Permanently deletes a CIPP Standards Template by ID. Tenants assigned to it lose the standards it enforced. Confirm with the user before invoking. |
| cipp_list_bpaC | Get Best Practice Analyser results for a tenant |
| cipp_list_domain_healthB | Check domain health (DMARC, DKIM, SPF) for a tenant |
| cipp_list_licensesB | List license assignments and usage for a tenant |
| cipp_list_csp_licensesB | List all CSP licenses across tenants |
| cipp_list_audit_logsC | List audit log entries for a tenant |
| cipp_list_alert_queueA | List queued alerts across all tenants |
| cipp_list_gdap_rolesB | List available GDAP (Granular Delegated Admin Privileges) roles |
| cipp_list_gdap_invitesA | List pending GDAP relationship invites |
| cipp_list_scheduled_itemsC | List scheduled tasks in CIPP |
| cipp_add_scheduled_itemC | Create a new scheduled task |
| cipp_pingA | Check CIPP API connectivity |
| cipp_get_versionA | Get CIPP version information |
| cipp_list_logsC | List CIPP application logs |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 49 tools
Most tools target a clearly distinct resource+action, and the few genuinely close pairs (cipp_list_mailbox_usage vs cipp_get_mailbox_usage, cipp_list_licenses vs cipp_list_csp_licenses, cipp_list_logs vs cipp_list_audit_logs, cipp_get_secure_score vs cipp_list_secure_score_controls) have descriptions that explicitly state when to use which. That leaves little room for misselection, though the density of similarly named list_* tools means an agent must read descriptions carefully rather than pick by name alone.
The set is overwhelmingly consistent snake_case with a cipp_ prefix plus a verb_noun shape (list_users, get_tenant_details, create_group, reset_password). Minor deviations exist: creation uses both 'create_' and 'add_' (cipp_add_scheduled_item vs cipp_create_user), and cipp_ping / cipp_bec_check don't follow verb_noun. These are readable and predictable overall.
49 tools is heavy for a single MCP surface, and the server is dominated by one-shot read tools (list_*) for many narrow report types. Even granting the broad MSP/multi-tenant M365 domain, the set would be easier to route with consolidation (e.g. fewer list_* variants) or grouping, so it sits well past the 'feels heavy' 16-25 band.
Read coverage is genuinely broad (identity, mail, security score, standards, GDAP, audit, domains), and high-impact writes are thoughtfully gated. But lifecycle coverage is uneven: scheduled items can only be added/listed (no edit, delete, or run), groups and mailboxes have no membership/permission modification, there is no delete_user or unassign-license path, and standards templates lack a get-details tool. Agents will hit dead ends on common admin follow-ups.