OIDC · SAML · SCIM
An identity provider for testing your app's sign-in and provisioning.
Create test users and groups, sign them in to your app over OIDC or SAML, push them over SCIM, and read every request. It runs on your machine, so there is no tenant to set up.
brew install --cask rselbach/tap/scimtest-desktop
What you can test
Each environment has its own users, groups, credentials, and history, so you can keep one per app or per scenario.
OIDC provider
Authorization code with PKCE, public and confidential clients, refresh rotation, introspection, and back-channel logout. Entra, Okta, and Google claim personas.
SAML provider
HTTP-POST sign-in with metadata, response and assertion signing, AES-GCM assertion encryption, and single logout in both directions.
SCIM client
Pushes users and groups to your SCIM endpoint with background sync, reconciliation, the Entra PATCH dialect, and a trace of every request.
Fault injection
Expired tokens, wrong audiences, alg none, stale JWKS, and SAML signature-wrapping forgeries that keep a valid signature.
Joiner, mover, leaver
Move users through hires, role changes, and departures, then check how each change lands over SCIM, OIDC, and SAML.
Traffic inspector
The last 100 identity exchanges, with decoded JWTs and SAML. Credentials stay redacted unless you turn on secret capture.
Public tunnel
An HTTPS address for your local IdP, so a deployed staging app can complete OIDC and SAML sign-ins through it.
Local API
81 operations over a token-authenticated JSON API, plus an agent skill so coding agents can set up and run tests.
Drive it from scripts and agents
Everything the window does is also an API call. Create environments, seed directories, run sign-in flows, and read the results from a test suite or a coding agent.
$ curl -s localhost:8080/api/v1/environments \ -H "X-Scimtest-Instance-Token: $TOKEN" \ --json '{"name": "Greendale Portal", "oidc_enabled": true}' $ curl -s -X POST -H "X-Scimtest-Instance-Token: $TOKEN" \ localhost:8080/api/v1/environments/$ID/tools/seed-sample {"groups_changed": 3, "users_changed": 10}