Skip to main content

Set up the Okta MCP server

The Okta MCP server gives AI agents access to your Okta organization — user lifecycle management, group membership, application provisioning, policy management, and system log retrieval. This guide covers creating an Okta API service app, generating a private key pair for headless authentication, granting API scopes, and adding the server to MintMCP.

Prerequisites

  • A MintMCP admin account
  • An Okta organization with super administrator access

Create an Okta API service app

The MintMCP connector authenticates to Okta using Private Key JWT — a headless flow that doesn't require browser interaction. This requires an API Services app in Okta (not a Native App).

  1. Sign in to your Okta Admin Console.

  2. Go to Applications > Applications.

  3. Click Create App Integration.

  4. Select API Services and click Next.

    Create a new app integration dialog with API Services selected as the sign-in method
  5. Enter a name — for example, MintMCP — and click Save.

Generate a key pair

  1. On your new app's General tab, find the Client Credentials section and click Edit.

  2. Set Client authentication to Public key / Private key.

    Client Credentials section with client authentication set to Public key / Private key
  3. Under Public keys, click Edit, then select Save keys in Okta.

  4. Click Add keyGenerate new key.

  5. Select PEM format, then click Copy to clipboard. Save the copied text — this is your private key (OKTA_PRIVATE_KEY). Okta does not show this key again after you dismiss the dialog.

    Add a public key dialog showing the generated key pair with the PEM private key to copy
  6. Click Done, then Save.

After saving, the Public keys section lists the new key as Active with a KID (Key ID). Copy this value — you'll enter it as OKTA_KEY_ID.

Client Credentials set to Public key / Private key with an active public key and its KID in the Public keys section

Disable DPoP

DPoP (Demonstrating Proof of Possession) is not compatible with headless service-app flows.

  1. In General Settings, click Edit.

  2. Uncheck Require Demonstrating Proof of Possession (DPoP) header in token requests.

  3. Click Save.

    General Settings with the Require DPoP header in token requests checkbox unchecked

Grant API scopes

  1. Go to the Okta API Scopes tab on your app.

  2. Click Grant for each scope your team needs.

    Okta API Scopes tab listing granted scopes such as okta.users.read and okta.groups.manage

At minimum, grant okta.users.read and okta.groups.read. Expand based on what the connector needs to do:

ScopeCapabilities granted
okta.users.readRead users and profile attributes
okta.users.manageCreate, update, and deactivate users
okta.groups.readList groups and their memberships
okta.groups.manageCreate, update, delete groups; manage group membership
okta.apps.readList and read application integrations
okta.apps.manageCreate, update, activate, and delete applications
okta.policies.readRead sign-on, password, and MFA policies
okta.policies.manageCreate, update, and delete policies and policy rules
okta.logs.readRead system log events
okta.brands.readRead brand themes and email templates
okta.brands.manageModify brand themes, sign-in pages, and error pages
okta.templates.readRead email template customizations
okta.templates.manageCreate and modify email customizations
okta.deviceAssurance.readRead device assurance policies
okta.deviceAssurance.manageCreate and manage device assurance policies
okta.domains.readRead custom domains
okta.domains.manageAdd, verify, and delete custom domains

Grant an admin role

API scopes alone aren't enough — Okta also requires the service app to hold an admin role. Without one, read calls still succeed but return empty results (listing users comes back with nothing), and write calls fail with 403. Grant a role that matches the scopes you assigned.

  1. Go to the Admin roles tab on your app. A new app shows No admin privileges assigned.

    Admin roles tab showing no admin privileges assigned to the app
  2. Click Edit assignments.

  3. Under Role, select the role the connector needs:

    Scopes grantedRole to assign
    Read-only (*.read)Read-only Administrator
    Read and write (*.manage)Organization Administrator, or a scoped custom role if your Okta org supports it
    Assignment dialog with Read-only Administrator selected as the role for the app
  4. Click Add assignment if it isn't already added, then click Save changes.

Add the Okta MCP server to MintMCP

  1. Go to app.mintmcp.com/vmcps?tab=manage-store.

  2. Find Okta in the list and click to install it.

  3. Enter the following values in the setup dialog:

    FieldValue
    OKTA_ORG_URLYour Okta org URL — for example, https://acme.okta.com
    OKTA_CLIENT_IDClient ID from the app's General tab
    OKTA_PRIVATE_KEYThe full PEM private key, including the -----BEGIN PRIVATE KEY----- and -----END PRIVATE KEY----- lines
    OKTA_KEY_IDKey ID shown next to the public key on the General tab
    OKTA_SCOPESSpace-separated scopes — defaults to okta.users.read okta.groups.read
  4. Click Save.

Security considerations

  • The private key grants API access to every Okta operation the service app is authorized for — treat it like a password and do not store it outside MintMCP.
  • All MintMCP users share the same service app connection, so actions are performed as the service app rather than as individual Okta users. Scope the permissions accordingly.
  • Grant only the scopes your team actually needs — avoid manage scopes unless write access is required.
  • If the private key is compromised, generate a new key pair in Okta, update the MintMCP connector, then delete the old public key from the service app.

Troubleshooting

  • invalid_client on token requests — the Key ID or private key doesn't match the public key saved in Okta. Confirm OKTA_KEY_ID matches the Key ID shown next to the public key, and that OKTA_PRIVATE_KEY is the full PEM including the header and footer lines.
  • invalid_dpop_proof or DPoP-related errors — DPoP is still enabled on the app. Uncheck Require Demonstrating Proof of Possession (DPoP) header in token requests under General Settings.
  • Empty results from read calls (e.g. listing users returns nothing) — the scope is granted but the app has no admin role. Reads return empty instead of erroring. Assign Read-only Administrator on the Admin roles tab.
  • 403 on write operations — the app has read access but no role that allows writes. Assign Organization Administrator (or a scoped custom role) for manage scopes.
  • invalid_scope — a scope in OKTA_SCOPES hasn't been granted on the Okta API Scopes tab. Grant it, or remove it from the connector config.

Next steps