Agent identity
AgentsEvery AI agent gets a signed, short-lived token with scoped capabilities, hard budget caps, and a live channel for human approval when it needs more.
Every agent gets a signed, short-lived identity with scoped capabilities, budget limits, and human approval for anything sensitive. Every user signs in with passkeys, social providers, or their company SSO. Built on open standards, so your existing OIDC library already works.
API keys cannot carry capability claims, enforce budgets, or pause for human approval. LumoAuth gives every agent a cryptographic identity and a live permission channel, so autonomous code runs with the same accountability you expect from a human user.
Every agent holds its own Ed25519 key and presents a signed, short-lived token on every call. Capabilities ride in the token claims. Audience, scope, and expiry are verified server-side, so a stolen token is useless 300 seconds later.
Pre-approve the safe scopes. For anything sensitive the agent pauses, sends a plain-English justification, and waits. The owner approves or denies from a push notification on their phone. The agent resumes with exactly the scope you granted.
Register MCP servers as protected resources. Agents read a single /.well-known URL, learn the scopes they need, and exchange for a scoped token. No hardcoded credentials, no custom handshake, no "allow all tools" escape hatch.
Every agent run produces a structured record: each tool call, token issued, permission requested, risk event fired. Inspect it in the observability dashboard or stream it to your SIEM.
# 1. Agent discovers protected resource
GET https://tools.acme.com/.well-known/oauth-protected-resource
# → Server responds with auth metadata
{
"resource": "https://tools.acme.com",
"authorization_servers": ["https://auth.acme.com/api/v1/.well-known/oauth-authorization-server"],
"scopes_supported": [
"tool:search_web",
"tool:send_email",
"tool:read_file"
],
"bearer_methods_supported": ["header"]
}
# 2. Agent requests scoped token
token = agent.request_token(
resource="https://tools.acme.com",
scope="tool:search_web",
)
# 3. Agent calls the tool. Token is bound to this agent.
agent.call_tool(token, "search_web", query="...")
# 4. Owner revokes the agent. The revocation event
# propagates to tools.acme.com in under a second.
# Next call returns 401.
Security guarantees
Secure autonomous AI agents, protect MCP servers, ship B2B login in an afternoon, or migrate off an incumbent without rewriting your app. Pick the scenario that matches your day.
API keys were never built for software that acts on its own. A stolen key has no scope, no expiry you can change, and no way to ask a human "is this okay?". LumoAuth gives every agent a signed, short-lived, capability-bound identity.
Each agent holds its own Ed25519 key. Tokens are signed, audience-bound, and expire in minutes. A stolen token is useless 300 seconds later.
Pre-approve the safe scopes. For anything sensitive the agent pauses, sends a plain-English justification, and waits for a decision.
Approve or deny from a push notification. The agent resumes with the exact scope you granted, nothing more. Every decision is signed and logged.
Cap tool calls, token spend, and wall time per task. Enforced at the authorization server, so prompt injection cannot raise them.
The Model Context Protocol tells agents how to discover auth. It does not tell anyone how to enforce it. LumoAuth plugs in as the authorization server for your MCP tools and hands out scoped, short-lived tokens for each connection.
Agents read one well-known URL and learn the exact scopes, grant types, and audience values they need. No custom handshakes, no one-off SDKs.
Issue a token that permits only tool:search or tool:send_email. A compromised agent cannot reach tools you never approved.
Revoked tokens stop working in under a second. MCP servers are notified through a push channel, not a 15-minute cache timeout.
Every tool call, token issue, and approval request lands on a per-agent timeline in the observability dashboard. Stream the same events to your SIEM.
Hosted login, passkeys, social providers, MFA, and multi-tenant organizations. Every customer gets their own branded sign-in experience, and your SDK does not need to know about any of it.
Every grant type you need, from browser code flows to machine-to-machine. Standard discovery means any library, any framework, any language works.
Phishing-proof sign-in with platform authenticators and hardware keys. No passwords to leak, no OTPs to intercept, no reset emails to send.
Each customer gets an isolated org with its own users, sign-in methods, branding, and policies. Row-level isolation is enforced at the database.
Point at any URL and the AI generates a hosted login page matching your brand in seconds. Or drop in your own HTML. Always hosted, always patched.
Customers already running Okta, Entra, or Google Workspace sign in through their own identity provider. Users are provisioned and deprovisioned automatically. Access decisions consider relationships, attributes, time, and location.
Federate from any enterprise identity provider, or act as one for your downstream apps. Inbound and outbound SSO live in the same tenant.
Users flow in from Okta, Entra, or Google Workspace automatically. When HR offboards someone, their sessions end in seconds.
"Alice can edit docs shared with her team, weekdays only" authored in plain English and compiled to a decision service that answers in under a millisecond.
Data subject requests, consent records, incident timelines, and records of processing activity ship in the core product, not a paid add-on.
LumoAuth speaks the same protocols your SDK already speaks. Change the issuer URL and client credentials in your config. Your SDK calls, token shape, and callback URLs stay exactly the same.
Same JWT shape. Same discovery document. Same redirect patterns. Your existing library does not care who minted the token.
Import bcrypt, argon2, and scrypt password hashes directly. Users keep their passkeys and second factors. Nobody is forced to reset.
Customer SSO, directory sync, fine-grained access, and GDPR tooling are in every plan. No per-connection fees. No tier upsell to unlock federation.
Export every user, grant, and session through a standard protocol. Rotate signing keys. Point any OIDC library at your tenant. Leaving is a twenty-minute job.
Most auth platforms treat enterprise SSO, directory sync, fine-grained access, GDPR tooling, and agent security as paid add-ons. We ship all of them in every plan.
Every AI agent gets a signed, short-lived token with scoped capabilities, hard budget caps, and a live channel for human approval when it needs more.
Sit in front of your MCP tools as the authorization server. Agents discover scopes from one well-known URL and receive tokens that permit one tool at a time.
Every grant type you actually need: browser code flows, device and TV flows, machine-to-machine, out-of-band approval, and token exchange. Any OIDC library works.
Phishing-proof sign-in with Face ID, Touch ID, Windows Hello, and hardware keys. No passwords to leak, no OTP codes to intercept, no reset emails to send.
Let customers sign in from their own Okta, Entra, or Google Workspace. Act as their identity provider for downstream apps. Inbound and outbound SSO in one tenant.
Auto-provision users from customer directories. The moment HR offboards someone, their sessions, tokens, and access grants are gone everywhere they were issued.
"Users can edit documents shared with their team, weekdays only, from the corporate network." The AI compiles that sentence into a live policy evaluated per request.
Step up authentication only when the signal calls for it: impossible travel, new device fingerprint, anonymizer network, or a tenant-defined rule you wrote yourself.
# 1. Install the SDK
$ npm install @lumoauth/sdk
# 2. Configure
import { LumoAuth } from '@lumoauth/sdk';
const lumo = new LumoAuth(fromEnv());
# 3. Protect a route
app.get('/api/me',
lumo.requireAuth(),
(req, res) => res.json(req.user)
);
# 4. Check a permission
const allowed = await lumo.check({
subject: req.user.id,
permission: 'billing:view_invoices',
resource: `org:${orgId}`,
});
# Decision returns in under a millisecond.
Typed SDKs. A full OpenAPI spec. Test tokens straight from the dashboard. Plain-English policy authoring. Standard discovery, so any library in any language talks to it.
Fully typed, auto-generated from the OpenAPI spec. IntelliSense everywhere. Agent SDKs for both languages out of the box.
Mint a signed token from the dashboard for any user, agent, or scope. Debug without clicking through a full sign-in flow.
Write "only approvers in the finance org can release payments over $10k" and the AI compiles it into a live, tested policy.
Ask "can this user do this action on this resource?" in the dashboard. See the decision and the exact rules that fired. No guessing, no redeploying.
Every tenant serves the OpenID Connect discovery document. Any library in any language talks to it without a custom adapter.
Paste your site URL. The AI extracts your brand and generates a hosted login page that looks like it belongs to you. Or drop in your own HTML.
Welcome to WordPress. This is your first post. Edit or delete it, then start writing!
Free up to 1,000 users and unlimited dev-mode agents. Everything is an open standard, so migrating in (or out) is a config change, not a rewrite.