Identity and authorization for AI agents.
aiAuthZ checks who sent each message to an agent, decides whether the agent is allowed to act on it, and seals a receipt for every accepted call. Drops in front of any agent runtime The host process that runs an LLM agent end-to-end — handles prompts, tool calls, and the conversation loop. Examples: Hermes, OpenClaw, OpenAI Assistants, Anthropic Messages. — Hermes, OpenClaw, OpenAI Assistants, Anthropic, Claude Code, Cursor, LangChain, custom ReAct loops Reasoning-and-Acting agent pattern: the model thinks, calls a tool, observes the result, and repeats until the task is done. .
Integrations
Drops in front of any agent runtime.
The ownership problem
The agent can't tell the owner from a stranger.
Modern agents read inboxes, post in Slack, and execute scripts on host machines. They are helpful and uniformly trusting — the runtime cannot distinguish a message from the operator from a message from a stranger.
Identity and rules normally live in plain files (RULES.md, IDENTITY.md, SOUL.md) the agent itself reads and rewrites. A guest can ask the agent to leak them. A guest can ask the agent to rewrite them.
The gateway
aiAuthZ verifies every message before the agent acts.
Each operator holds an HMAC key Hash-based Message Authentication Code. A signature computed from the message and a secret key only the operator holds. The gateway recomputes it to verify the message wasn't sent by anyone else. . Messages reach the gateway with a signature, a session id Stable identifier for a chat thread or call session — for example, a Slack channel id or a Discord DM id. Bound to the operator at the first verified message. , and an active-message id Per-message id the gateway hands to the agent. Tool calls must echo it back so the gateway can match the policy decision to the originating message. . The gateway verifies the signature, refuses unsigned or replayed Re-sending an old, valid message to make the agent act again. Rejected by the gateway via a nonce TTL — each message id is single-use within a window. messages, and forwards only the verified ones to the agent.
Tool calls return through the gateway with the same id. Three checks decide whether each call runs — signature valid, session bound to the same operator, action on the role allow-list List of (role, action) pairs the gateway is permitted to run. Held off-host in Postgres. The agent has no credentials to read or modify it. . Policy lives in a separate database the agent has no credentials for. Whatever the agent rewrites in its own files, the gate does not move.
Every accepted call is sealed with a keyed image watermark Discrete Wavelet Transform plus Singular Value Decomposition — a keyed image-watermarking scheme. The seal is computed from the operator's HMAC, so a valid one cannot be produced without their secret. and dropped into an append-only audit log Database role with no UPDATE or DELETE on the audit_log table. New rows can be added, but rows already written cannot be modified or removed — including by us. . The receipt can be verified later without contacting the gateway. History cannot be edited, including by us.
host artefact
keyed seal
Each accepted call produces a 256×256 PNG. The inner seal is embedded via DWT-SVD using parameters derived from the operator's HMAC. A valid seal cannot be produced without that secret.
- 14:02:11.412sarah.chen@acmeread_chart/charts/14B.note8allow7a3c2b41e8d9f5a2role=clinician · path in scope
- 14:02:11.598sarah.chen@acmesend_email14allow9e1b7d2c4af6b083recipient in domain allowlist
- 14:02:34.103aditya.g@guestshellls -la /workspace3denyf02c8b13d7e9a410role_not_in_allowlist:member
- 14:02:34.129aditya.g@guestread_mailbox/var/mail/inbox4denyb48cd31207ea4f5drole_not_in_allowlist:member
- 14:02:51.842natalie.r@guestwrite_file/home/agent/heartbeat.sh5deny4d7f29c0bb13ea88destructive_op_owner_only
- 14:03:02.001? unverifiedmessage_ingestspoofs Chris display name1denyaa01ff9d6e2b71c4signature_mismatch · no_owner_hmac
- 14:03:18.554marcus.v@vendorread_invoiceinv_2042.pdf11allow13c4e8a5d0bb29f7vendor scope · own invoice
- 14:03:42.117agent.bot@svcmcp.tool_callgithub_create_issue22allow8f2147c0bb6a4ef3service_token + active_message_id ok
- 14:04:09.226agent.bot@svcshellrm -rf /workspace/*2denyc9b031ef7a4f8d12destructive_op_owner_only · agent token cannot rm
- 14:04:31.508sarah.chen@acmeexport_audit?range=24h88allowe2d59c0a7f3b4116role=clinician · export within retention
Why aiAuthZ
Where the alternatives leave gaps.
Identity, authorization, and tool-call gating live in three different layers. Most platforms cover one. The gap between them is where attacks land — mailbox wipes, owner spoofing, prompt injection, runaway resource loops.
- Owner authenticationA teammate (or a stranger) speaks in the same channel and the agent treats them as the owner.Slack AI prompt-injection (PromptArmor, Aug 2024) — any workspace member could leak a private channel.session token, re-used for every messageidentity at sign-in, not per messageno identity layerHMAC on every message, replay rejected
- Per-action authorizationThe model decides; the tool just runs. One bad turn writes to prod.Replit AI deleted a production database during an active code freeze (Jul 2025).decision happens once, at sign-indoesn't run between agent and toolsfilters model output, not tool callsevery tool call checked, after the model speaks
- Policy-store isolationRules and identity sit in files the agent can read and rewrite — guests can talk it into changing them."Constitution attack" reproduced eleven times across labs (Shapira et al., 2026).in the SaaS console — invisible at runtimeidentity rules onlyin-process YAML/Python the agent can rewriteoff-host Postgres; agent has no credentials
- Forensic-grade audit trailWhen an action is challenged, you have a JSON line. Anyone with table access can edit it.Microsoft Copilot indirect prompt-injection — exfil with no usable trail (Embrace The Red, 2024).JSON log; rows are mutableJSON log onlyJSON log onlykeyed image watermark; INSERT-only role
- Open-source coreYou cannot self-host or audit the gate.commercial SaaScommercial SaaSmixed licensesApache 2.0, vendored deps only
Built for high-stakes environments
No model training on customer data. No third-party data sharing beyond the authenticated dashboard. Operator-held encryption keys on Enterprise (BYO-KMS in rollout).
- Healthcare
HIPAA controls aligned. BAA available on Enterprise. PHI never observed in plaintext by the gateway.
- Kids & education
COPPA-aligned data handling. Customer data is never used to train models. EU residency on Enterprise (in rollout).
- Regulated enterprise
SOC 2 control mapping available on request. Type II audit in progress. Bring-your-own KMS (AWS / Azure / GCP) on Enterprise.
Pricing
Self-host the gateway, or run it as a managed service.
Apache 2.0. Forever.
- Full gateway, all tools
- Self-hosted infrastructure
- Community support
Solo dev or small project, hosted.
- 10 enrolled people
- 25,000 messages a month
- 100,000 tool calls a month
- 90 days of audit history
- Email support
Teams shipping AI agents with compliance requirements.
- 100 enrolled people
- 250,000 messages a month
- 1M tool calls a month
- 180 days of audit history
- SSO (SAML, OIDC) and SCIM provisioning
- SOC 2 control matrix on request
- 24-hour response, named CSM
Operator-held infra, encryption keys, and retention.
- Unlimited people, messages and tool calls
- Audit retained on operator's terms
- On-prem or operator's cloud
- SOC 2 control matrix (Type II in progress)
- BYO-KMS · operator-held encryption keys
Self-host deployment
One image. VPC-resident. Operator-held keys.
The same gateway image deploys to AWS, Azure, or GCP. The audit log is bound to the deployment's own account, the master key is held in the deployment's KMS, and traffic stays inside the VPC.
-
Deploy on AWSCloudFormation · ECS Fargate -
Deploy on AzureARM template · Container Apps - Deploy on GCPCloud Run · Cloud Shell
docker compose up 





