skein_user
Instance-wide user accounts. ADMIN ONLY — every action returns not_admin to a non-admin caller, before any database access. action="update" covers both the patch (name / role / password) and the deactivate / reactivate flip: deactivating cascades into API key revocation in the same transaction and is reversible with deactivated=false. Role admin is refused with admin_role_disabled while the instance admin role is disabled on the installation. action="space_add" makes the user a member of a space at once (no invitation, no consent). Read-only actions: list.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"action": "<action>"
},
"name": "skein_user"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name (free-form, trimmed). Required for create; on update, omit to leave it unchanged. | |
| role | No | Role of the account. Required for create; on update, omit to leave it unchanged. Demoting the last active admin returns `last_admin_cannot_demote`; a concurrent change after three attempts returns `concurrent_change` (retry). | |
| No | User email address. Must match a basic email regex; uniqueness is enforced on lower(email). Required for create. | ||
| limit | No | Only read by list: maximum rows to return, 1..100. Default 50. | |
| space | No | Only read by space_add: short id of the space (skein_whoami lists the spaces). | |
| action | Yes | What to do: - "list" → users of the instance, cursor-paginated, optionally filtered by `search`. - "create" → a new account; the user can sign in immediately with the supplied password. - "update" → patch name / role / password, or flip `deactivated`. - "space_add" → add `userId` to the space `space` at once. | |
| cursor | No | Only read by list: opaque cursor token from a prior response's nextCursor. | |
| search | No | Only read by list: case-insensitive substring filter on email, username and name. | |
| userId | No | UUID of the user to write to, as returned by list or create. Required for update and space_add. | |
| archived | No | Only read by list: list deactivated users instead of active ones. Default false. | |
| password | No | Password, at least 8 characters. Required for create; on update, set it to reset the user's password. The user should rotate an admin-supplied password via POST /api/v1/me/password on first sign-in. | |
| username | No | Desired username (lowercase, 3..30 chars, [a-z0-9][a-z0-9_-]*). Only read by create; derived from the email local-part when omitted. | |
| deactivated | No | Only read by update: true → soft-deactivate (cascades into API key revocation), false → reactivate (does not un-revoke the previous keys). When set, name/role/password are ignored. Deactivating the last active admin returns `last_admin_cannot_demote`; a concurrent change after three attempts returns `concurrent_change` (retry). | |
| is_external | No | Only read by create: make the account an EXTERNAL collaborator. External users are visibility-scoped to their own projects and are permanently capped at role='user' — combining is_external=true with role='admin' is rejected (external_cannot_be_admin). Defaults to false (internal user). Set only at create time; there is no conversion path. |