Overview
Genesis Data Agents provides enterprise-grade security controls through a multi-layered approach to access management. Administrators can control what users can see, which agents they can interact with, and what actions agents can perform on behalf of users.Users and Roles Management
The Users and Roles Management interface provides a centralized location for managing all security configurations. Access this through the Genesis UI sidebar under Config → Users & Roles.Key Features
User Management
Role Definitions
Agent Access
Tool Access
Role Configuration
Editing Roles
When editing a role, you’ll have access to five main configuration sections:Basic Information
Basic Information
Permissions
Permissions
access_config_panel: Access to configuration panelaccess_pulse_panel: Access to pulse/monitoring panelmanage_genesis_enhancements: Open the Genesis Enhancements page to view and submit enhancement requestsmanage_users: Manage users and rolesmanage_agents: Create, update, delete agents. At least one active agent must always hold this permission so agent administration from chat remains possible; Genesis refuses lifecycle or RBAC changes that would leave none.manage_document_indexes: Create and manage document indexes, add documents, and poll background upload status through the document-index API.manage_repos: Manage unified Git-backed sources for skills, flows, apps, blueprints, and document indexes (Knowledge Base feeds) (/api/managed-sources; Config → Managed Sources and Document Indexes → Sync from Git)manage_skills: Register and sync managed Skill Git sources; edit/push skill workspacesmanage_flows: Register and sync managed Flow Git sources; edit/push flow workspaces; manage flow bindingsmanage_apps: Register and sync managed App Git sources; edit/push app workspacesmanage_git: Bind managed-artifact dependencies and administer shared Git repository settings used by Blueprints and artifact librariesmanage_all_connections: Manage all database connectionsmanage_secrets: Manage secrets and credentialsaccess_pat_connections_databases: Allow PAT-class saved connection modes for database connectorsaccess_pat_connections_git: Allow PAT-class saved connection modes for Git & Code connectorsaccess_pat_connections_cloud: Allow PAT-class saved connection modes for Cloud & Storage connectorsaccess_pat_connections_pipelines: Allow PAT-class saved connection modes for Data Pipelines connectorsaccess_pat_connections_tools: Allow PAT-class saved connection modes for Dev Tools connectorsview_apps: View the apps library and app deploymentsview_context_graph: View the Context Graph / Digital Twinview_deployments: View the deployments panelview_flows: View flowsview_connections: View database connections in Config and Data Explorer, browse or run governed transition-contract verification under Data → Migration verification, and browse or run the Estate source-contract characterization API (/api/estate/...)ratify_transition_contract: Approve (sign) qualified correspondence rules for a migration transition; required for the in-app rule approval modal andPOST /api/transition_contract/rules/{rule_hash}/ratify. Agents and chat can propose and qualify rules but cannot ratify. Included in the built-inadminrole; requires authentication enabled and a configured ratifier signing keyratify_source_contract: Adjudicate mined source-contract rule candidates, seal draft source contracts, and change ruling-library authority (settle, ratify provisional directions, unsettle, or answer build-time ruling questions); required forPOST /api/estate/candidates/{candidate_id}/adjudicate,POST /api/estate/contracts/{contract_id}/seal, and the ruling-library write routes under/api/estate/rulings/...and/api/estate/ruling-questions/{question_id}/answer. Browse the library withview_connections(GET /api/estate/rulings,GET /api/estate/ruling-questions). Agents can propose and trigger characterization workflows but cannot adjudicate, seal, or settle rulings. Included in the built-inadminrole; requires authentication enabled and a genuinely authenticated human callerapprove_agent_action: Sign off on an action an agent has staged but cannot authorize for itself, such as an irreversible CRM record merge; required for CRM merge preview, approval, and execute routes (/api/salesforce/merge/...,/api/crm/.../merge/...,/api/crm/merge/approvals). Included in the built-inadminrole; grant explicitly to custom roles when reviewers should not also holdmanage_all_connections. Requires authentication enabled and a genuinely authenticated human caller for approve and execute; list and approve operations are scoped to connections the caller can accessmanage_upgrades: Use the Upgrades page on a managed deployment to configure upgrade policy and maintenance windows, pause upgrades, record customer scan results, and approve releases. Included in the built-inadminrole. Every page operation requires this permission; changes additionally require a genuinely authenticated human, so an agent cannot make them even when its role holds the permission. With authentication disabled, the page is read-only. For the deployment flag that exposes this page, see Advanced Settings — Launchpad feature flags.approve_agent_actionalso authorizes an authenticated human to waive a server-owned Blueprintrequired_checkthroughPOST /api/runs/{run_id}/required-checks/{check_name}/waive. Internal service tokens cannot record this waiver.view_scheduler: View scheduler jobs and historyview_sandboxes: View sandboxes and deployment runtimesview_shared_role_resources: See missions and apps created by other members of a role you shareview_all_threads: View all chat threadsview_all_secrets: View all secretsview_model_config: See active chat and embedding model configurationview_all_blueprints: View and run every blueprint (view+execute) without per-blueprint grantsmanage_all_blueprints: Full control of every blueprint (view,edit,manage,execute), including sharing and access managementwiki_author: Legacy non-default permission for operator-authored wiki learnings. Dashboard commentary usesview_gitinstead; grantwiki_authoronly when a custom integration still expects the retired learnings API.
view_shared_role_resources is intended for team-style roles. When two users share a role that includes this permission, Genesis can show them each other’s missions and apps without manual invitations. It widens only view-style access and is not assigned to built-in roles by default.Team Wiki page commentary in the dashboard (GET/POST/DELETE
/api/wiki/v1/pages/{qualified_name}/commentary) requires view_git. Callers
can delete only their own live comments. Agent- and Librarian-driven learnings
still depend on wiki.write_enabled in AppConfig when writes are enabled.These PAT permissions are separate from manage_all_connections. Each one
controls whether a role can create, update, or test PAT-class saved
connections for one connector category. When a category permission is
absent, Genesis hides PAT-based auth modes for that category in the
Connections UI and blocks PAT-based connection saves and tests there.Connection discovery applies the same boundary: the finder considers only
connections visible to the requesting user, usable by that user, and
accessible to the active agent. It does not expose a hidden or inaccessible
connection merely because a pasted URL matches its host. A recommendation
selection is validated again against the original user, agent, and thread
before the connection is used.Genesis uses the top-level view_* permissions to decide whether major
workspaces appear in the primary sidebar when authentication is enabled.manage_genesis_enhancements opens the Genesis Enhancements page so holders
can view and submit enhancement requests without access_config_panel or
the built-in admin role. It grants no other configuration access. The
Genesis Enhancements API routes accept either access_config_panel or
manage_genesis_enhancements; dormant-review scheduler start and stop still
require manage_scheduler.Agent Access
Agent Access
You can:
- Grant access to specific agents by selecting them individually
- Restrict access by leaving agents unselected
- Update agent access as your organization’s needs evolve
Secret Access
Secret Access
Tool Access
Tool Access
- Select specific tools to allow
- Use “Select All” and then remove specific tools to create an allowlist
- Remove tool access entirely to create the most restrictive permissions
Three-Layer Tool Control System
Genesis implements a sophisticated three-layer approach to tool access control, providing defense-in-depth security:Layer 1: Tool Configuration (Agent Toolbox)
- Each agent has a configured set of tools available in its toolbox
- By default, agents can add tools to themselves dynamically as needed
- Administrators can disable the “Allow Agents to Add Tools to Itself” setting to prevent self-service tool addition
Layer 2: RBAC Tool Usage Control (Primary Access Control)
How it works:- Each role has a list of allowed tools defined by the administrator
- Administrators can include or exclude any tool for any role
- The configured authorization mode decides how the two role checks combine
Strict settings for regulated deployments
Two settings control how strict Layer 2 and connection credential access are. Both live in thesecurity section of Genesis configuration:
security.force_double_key_on_connections does not narrow tool authorization,
and selecting intersection does not change how connections are treated. A
regulated deployment that wants both sets both.
Set either as an environment variable
(SECURITY_TOOL_AUTH_MODE=intersection,
SECURITY_FORCE_DOUBLE_KEY_ON_CONNECTIONS=true), through a Helm value that sets
those variables, or in Config → Advanced Settings.
Note the scope of require_double_key: it decides whether both the user and the
agent must pass secret-level access checks at a connection, which covers both
resolving that connection’s credentials and whether the connection is visible at
all. It does not affect tool authorization, which is what
security.tool_auth_mode covers.
What double key means when only one principal is present
Double key asks two principals to pass. A request that carries only one — a scheduled job or a webhook, which arrives with an agent and no user — cannot answer that question, and Genesis does not answer it the same way everywhere. This is the behaviour ofrequire_double_key itself, and turning on
security.force_double_key_on_connections extends it to every connection rather
than changing it:
require_double_key and
are not raised by security.force_double_key_on_connections: Databricks headless M2M
embeddings, and the Google Chat shared service-account event route. Both are
capability checks rather than access checks — they ask whether a connection can
serve a call that has no user at all, and both already refuse a connection whose
stored flag is on. Extending the switch to them would not add a check, because
there is no second principal to ask for; it would withdraw the capability from
every strict deployment. To block either one, turn on require_double_key on the
connection it uses, which is the setting those checks read.
If security.tool_auth_mode holds a value that is neither union nor
intersection, Genesis logs the misconfiguration and uses intersection — an
unreadable security setting must not resolve to the permissive one.
Every tool authorization decision is written to the log with the mode in force,
which principal or principals satisfied the check, and what decided the outcome,
so an auditor can tell a union-mode grant from an intersection-mode grant after
the fact. Grants and denials alike are kept whatever LOG_LEVEL the deployment
runs at: these records go to a dedicated audit logger that the level filter does
not apply to, so raising the level to quieten a busy server does not thin the
audit trail. A denial is emitted at WARNING and a grant at INFO, so the two are
still distinguishable in the stream.
Layer 3: Global Tool Toggles (System-Level Override)
How it works:- Independent control that overrides Layer 1 and Layer 2
- Blocks specific high-risk and coding-agent tools identified by Genesis
- When a tool family is blocked, those tools are unavailable system-wide
dbt_action— dbt Actionsexecute_python_code— Local Python Executionrun_repo_script— Repository Required Checks_run_sqlite_cli_commands— SQLite CLI Commands
_claude_code— Claude Code_codex_code— Codex_cortex_code— Cortex Code
- ✓ An agent has the tool configured (Layer 1)
- ✓ Layer 2 authorizes the call under the configured mode
Sandbox Thread Token Controls
When a chat thread runs Claude Code in a sandbox container or Kubernetes Pod, Genesis mints a thread-scoped token for the agent’s calls back to MCP and the internal LLM proxy. The token is resolved to the user who owns that thread, never to the system user, so the usual RBAC, tenancy, connection, and tool checks continue to apply. The token is valid only for its own(bot, thread) identity. If the caller supplies the
optional x-genesis-thread-id header, it must match the token’s thread. Genesis fails
closed when the token is invalid, expired, presented for another thread, or the thread
has no resolvable owner. A separate route-and-method capability contract limits the REST
calls the MCP server can make on the agent’s behalf to conversation and governed-data
operations; configuration, user/RBAC, connection, credential, and secret management
remain outside the contract. Requests outside it return 403.
Unowned coding and sandbox runs receive an additional execution contract on the
permitted tool-call route; see Tool-call execution contract
for the prohibited operations, refusal response, and permitted read exceptions.
A sandbox token cannot POST a message to the thread it was minted for, including
the /messages, /messages/sync, and /messages/websocket endpoints. Genesis
returns 403 because the token acts as that thread’s owner, so accepting the
request would record the agent as the owner speaking; the agent’s words reach its
own thread through its output. Messages to other threads remain allowed.
When a sandbox request is rejected at the HTTP authentication boundary, the client
sees the credential-specific cause: Authorization: Bearer gsk_... is a
per-sandbox-run token and expires with that run. A personal access token
(gp_...) is not a substitute for the sandbox token, and vice versa.
Genesis persists the token record in the metadata store, so a backend restart does not
extend its lifetime or invalidate it early; the token’s stored expiry and revocation
state remain authoritative. If the token store cannot be used, Genesis rejects the
request rather than bypassing token validation.
This control is an endpoint ceiling, not a replacement for user authorization: the
sandbox agent still acts with the owning user’s effective permissions. For request
headers and response codes, see Hosted MCP gateway endpoints.
The sandbox connectivity probe at /api/internal/sandbox-llm/api/hello is a separate
GET/HEAD reachability check: it returns 200 without a thread token and does not
invoke the LLM proxy. See Internal sandbox LLM proxy endpoints.
GenesisApp Server Token Controls
GenesisApps useX-Genesis-App-Token for server-originated calls, but the token
is limited to the platform routes in the app server token capability manifest.
Calls outside that contract return 403; app code should fetch
GET /api/apps/{app_id}/capabilities rather than assume that a route is
available. The full route list and response contract are documented in the
Genesis App server token capability manifest.
Genesis Desktop lock and origin controls
In Genesis Desktop laptop mode, the backend refuses API requests while the app is locked. Only the lock-screen status, sign-in start, sign-in status and cancellation (/api/desktop/auth/attempt and /api/desktop/auth/cancel),
callback, activation, check-in, and sign-out routes remain available; GET and
HEAD reads of
/api/desktop/activity and /api/desktop/update/ are also allowed. The update
read lets Update now on the Update required lock screen check the
install’s release channel; see Genesis Desktop release-channel updates.
Other desktop API routes and the MCP, Git, SCIM, and Outpost tunnel API surfaces
stay locked. Requests from a website other than the app are rejected by the
desktop origin guard, which also limits sign-in initiation to the desktop
client. These desktop-only controls do not change behavior on hosted deployments.
Desktop activity tracking counts a person’s interactions, not the process’s
background work. API writes count only when they do not carry this process’s
valid internal service token; chat prompts identified as internal service calls,
such as scheduled-flow prompts, are also excluded. This keeps background lineage,
twin-client, and scheduler work from being attributed to someone using Desktop.
Without authentication, an API write with a missing or invalid internal service
token is still treated as a person’s interaction.
For Genesis Desktop’s per-install master-key handling and saved-credential
recovery, see Master encryption key.
Signing in and activating are required to use Genesis Desktop. Each process
start must also receive a successful live answer (an activation or check-in)
from the provisioner before the app can be used; while it is running, it must
receive another successful answer at least once per hour. If no live answer has
been received since start, or the last successful answer is more than an hour
old, the API is locked against new work. A turn already in progress can finish
and continue streaming; the lock screen appears after it finishes. Once the
offline grace expires, the lock screen says:
Genesis can't reach the Genesis servers. Check your internet connection and try again.
The provisioner can also require an app update. When the running version is
below its required minimum, or the provisioner refuses it outright, Desktop
locks with lock_reason: "update_required" and refuses new API work with HTTP
423; an active agent turn can finish before the lock screen appears. Desktop
continues checking in at its normal cadence, so a policy change that lowers the
minimum can unlock the app at the next check-in. The status fields and
provisioner policy contract are documented in
Genesis Desktop version policy.
The 30-day desktop trial is informational: days remaining appear below the
user’s initials, and an in-app banner appears after it ends, but trial status
never locks the app. When an install is revoked, the lock screen’s Contact
Genesis action points to [email protected] by default. For automatic
diagnostic log uploads at startup and daily, see Genesis Desktop diagnostics.
Sharing a full-screen app URL does not share the opener’s session or app grants.
For top-level app proxy links, Auth0 and OIDC deployments can send an anonymous
viewer through sign-in and return them with a short-lived token that is moved
into an app-scoped HTTP-only cookie; the viewer must still pass the app’s normal
view authorization check. See Genesis App proxy behavior
for the redirect conditions and token handling.
For anonymous top-level /git/... page opens, the Git Browser shell does not
grant repository access; see Git repository and file endpoints.
Headless Hosted MCP Authentication
Headless MCP clients can authenticate to the hosted/mcp/ transport with a
Genesis personal access token instead of browser OAuth. Send the token as
Authorization: Bearer gp_...; Genesis hydrates the persisted PAT owner and
enforces that user’s roles, agent access, permissions, and deployment access.
Invalid or unverifiable owner identity returns 401, while a valid PAT whose
owner is not allowed to access the deployment returns 403.
HTTP authentication and authorization refusals use the standard JSON error
envelope and include a correlation ID in both request_id and X-Request-Id.
This applies to PAT, GenesisApp, sandbox-thread, and other API credentials;
see HTTP authentication refusal responses
for the shared fields and error_type values.
PATs are bearer credentials: create an expiring token from API Keys, store it
as a secret, and revoke it there when it is no longer needed. For the creation,
rotation, and REST schemas, see Personal access tokens.
The hosted MCP request and response contract is documented in Hosted MCP gateway
endpoints.
Signed artifact download links are the exception to the hosted transport’s normal
browser-session or bearer requirement: the HMAC-signed, single-use, expiring token
in artifacts[].download_url authenticates GET /api/mcp/artifacts/{artifact_id}.
Hosted Try Me Instance Isolation
Try Me’s provisioner credential is not a user credential; see the internal demo API routes for its scope and demo access gate settings. An identity denied by the gate is rejected before Genesis provisions a user record. In a browser, the denial leads to the refusal page instead of restarting sign-in; see HTTP authentication refusal responses.Built-in Roles
Genesis provides default roles for common use cases:Admin
User
user role includes all five category-scoped PAT connection
permissions, so dashboard users can post Team Wiki commentary (via
view_git) and use PAT-class saved connection modes across
Databases, Git & Code, Cloud & Storage, Data Pipelines, and Dev Tools
unless an admin removes those permissions.Current User Information
View your own role assignments and permissions by navigating to Users & Roles → Current User Info. This section shows:- Your assigned roles (or the active Access Preview role set when preview is on)
- Permissions granted to you (preview-aware, matching the same source as
GET /api/rbac/me/permissions) - Agents you have access to
- Tools you’re authorized to use
Security Best Practices
Apply Least Privilege
Review Tool Access Regularly
Review Global Tool Toggles
Use Role-Based Agent Assignment
Monitor Agent Tool Usage
Secure Secrets Properly
Creating Custom Roles
To create a new role tailored to your organization’s needs:- Navigate to Users & Roles in the Genesis UI
- Click Create New Role
- Configure the four main sections:
- Basic Information: Name and description
- Permissions: UI and system access
- Agent Access: Which agents this role can use
- Tool Access: Which tools are permitted
- Click Save to activate the role
Agent Role Assignment
All agents are assigned roles just like users:- Eve (the primary Genesis agent) has the admin role by default
- New agents are automatically assigned the user role
- Administrators can assign additional roles to agents as needed
- Agent role permissions are combined with user role permissions at Layer 2, according to
security.tool_auth_mode
union mode either principal’s role can authorize the
call; set security.tool_auth_mode to intersection when both must.FAQ
What happens if I disable a tool an agent is currently using?
What happens if I disable a tool an agent is currently using?
Can I create roles that have access to some agents but not others?
Can I create roles that have access to some agents but not others?
What's the difference between Layer 2 and Layer 3 tool controls?
What's the difference between Layer 2 and Layer 3 tool controls?
Can agents add tools to themselves even with RBAC restrictions?
Can agents add tools to themselves even with RBAC restrictions?
How do I see which tools are currently blocked by the global tool toggles?
How do I see which tools are currently blocked by the global tool toggles?

