authgent-server
The open-source OAuth 2.1 Authorization Server for AI agents — MCP-native, delegation-aware, with DPoP sender-constrained tokens and human-in-the-loop step-up authorization.
Install
pip install authgent-server
# With PostgreSQL support
pip install authgent-server[postgres]
Quick Start
# Start the server (auto-initializes on first run)
authgent-server run
Server starts at http://localhost:8000:
GET /.well-known/oauth-authorization-server— server metadataGET /.well-known/jwks.json— public signing keysGET /docs— interactive Swagger UI
CLI Commands
authgent-server run # Start server (auto-initializes on first run)
authgent-server init # Explicitly init (custom DB URL, force-regenerate)
authgent-server create-agent # Register an agent interactively
authgent-server migrate # Run Alembic migrations
authgent-server migrate --dry-run # Preview pending migrations
API Endpoints
OAuth 2.1 Core
| Method | Path | Description |
|---|---|---|
POST |
/register |
Dynamic client registration (RFC 7591) |
POST |
/token |
Token endpoint — all grant types |
GET |
/authorize |
Authorization code + PKCE (consent page) |
POST |
/authorize |
Authorization code (consent submission) |
POST |
/introspect |
Token introspection (RFC 7662) |
POST |
/revoke |
Token revocation (RFC 7009) |
Device Authorization (RFC 8628)
| Method | Path | Description |
|---|---|---|
POST |
/device/authorize |
Request device + user codes |
POST |
/device/approve |
Human approves device code |
POST |
/device/deny |
Human denies device code |
Step-Up Authorization (HITL)
| Method | Path | Description |
|---|---|---|
POST |
/stepup |
Create step-up request |
GET |
/stepup/{id} |
Poll step-up status |
POST |
/stepup/{id}/approve |
Human approves |
POST |
/stepup/{id}/deny |
Human denies |
Agent Identity Registry
| Method | Path | Description |
|---|---|---|
POST |
/agents |
Register agent (auto-creates OAuth client) |
GET |
/agents |
List agents (paginated, filterable) |
GET |
/agents/{id} |
Get agent details |
PATCH |
/agents/{id} |
Update agent |
DELETE |
/agents/{id} |
Deactivate agent |
Discovery & Health
| Method | Path | Description |
|---|---|---|
GET |
/.well-known/oauth-authorization-server |
Server metadata (RFC 8414) |
GET |
/.well-known/openid-configuration |
OIDC-compatible alias |
GET |
/.well-known/jwks.json |
Public signing keys |
GET |
/.well-known/oauth-protected-resource |
Resource metadata (RFC 9728) |
GET |
/health |
Liveness check |
GET |
/ready |
Readiness (DB + signing keys) |
Configuration
All settings via AUTHGENT_* environment variables. See .env.example for the full list.
Essential
| Variable | Default | Description |
|---|---|---|
AUTHGENT_SECRET_KEY |
generated | Master secret for HKDF key derivation |
AUTHGENT_DATABASE_URL |
sqlite+aiosqlite:///./authgent.db |
Database URL |
AUTHGENT_HOST |
0.0.0.0 |
Bind address |
AUTHGENT_PORT |
8000 |
Bind port |
Token Lifetimes
| Variable | Default | Description |
|---|---|---|
AUTHGENT_ACCESS_TOKEN_TTL |
900 |
Access token (15 min) |
AUTHGENT_REFRESH_TOKEN_TTL |
86400 |
Refresh token (24 hr) |
AUTHGENT_EXCHANGE_TOKEN_TTL |
300 |
Exchanged token (5 min) |
Policy
| Variable | Default | Description |
|---|---|---|
AUTHGENT_MAX_DELEGATION_DEPTH |
5 |
Max delegation chain hops |
AUTHGENT_REQUIRE_DPOP |
false |
Require DPoP on all token requests |
AUTHGENT_CONSENT_MODE |
auto_approve |
auto_approve, ui, headless |
AUTHGENT_REGISTRATION_POLICY |
open |
open, token, admin |
Pluggable Providers
| Variable | Default | Description |
|---|---|---|
AUTHGENT_ATTESTATION_PROVIDER |
null | Dotted import path |
AUTHGENT_POLICY_PROVIDER |
null | Custom policy enforcement |
AUTHGENT_HITL_PROVIDER |
webhook | Step-up notification backend |
AUTHGENT_KEY_PROVIDER |
database | Signing key storage |
AUTHGENT_EVENT_EMITTER |
database | Audit event backend |
AUTHGENT_CLAIM_ENRICHER |
null | Custom token claim enrichment |
Deployment
Docker
docker compose up -d
The included docker-compose.yml runs the server with PostgreSQL.
Docker (standalone)
docker build -t authgent-server .
docker run -p 8000:8000 \
-e AUTHGENT_SECRET_KEY=your-secret-key \
-e AUTHGENT_DATABASE_URL=sqlite+aiosqlite:///./authgent.db \
authgent-server
Production Checklist
- Set a strong
AUTHGENT_SECRET_KEY(64+ characters) - Use PostgreSQL (
AUTHGENT_DATABASE_URL=postgresql+asyncpg://...) - Run migrations:
authgent-server migrate - Set
AUTHGENT_REGISTRATION_POLICY=tokenoradmin - Set
AUTHGENT_CONSENT_MODE=uifor human-facing flows - Enable DPoP:
AUTHGENT_REQUIRE_DPOP=true - Configure CORS origins:
AUTHGENT_CORS_ORIGINS=["https://your-app.com"] - Put behind a reverse proxy (nginx/Caddy) with TLS
- Set up log aggregation (structured JSON output)
Architecture
Endpoints → Services → Models → DB
(thin) (stateless) (ORM) (async)
- Endpoints — FastAPI routers, HTTP validation, dependency injection
- Services — All business logic, receive
db: AsyncSessionper call - Models — SQLAlchemy 2.0 async ORM, 9 tables
- Providers — 7 pluggable Python Protocol interfaces (attestation, policy, HITL, keys, events, claim enricher, human auth)
See ARCHITECTURE.md for the full implementation design.
Development
# Setup
git clone https://github.com/authgent/authgent.git
cd authgent/server
pip install -e ".[dev,migrations]"
authgent-server init
# Test (192 tests)
pytest -v
# Lint + format
ruff check . && ruff format --check .
# Type check
mypy authgent_server/ --ignore-missing-imports
# Coverage
coverage run -m pytest tests/ && coverage report
License
Metadata
Release files for authgent-server 0.3.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| authgent_server-0.3.4.tar.gz | 199.5 kB | Without provenance | Details for authgent_server-0.3.4.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| authgent_server-0.3.4-py3-none-any.whl | Python 3 | none | any | Details for authgent_server-0.3.4-py3-none-any.whl |
Total release size: 326.0 kB
Release files / authgent_server-0.3.4.tar.gz
| Download URL | authgent_server-0.3.4.tar.gz |
|---|---|
| Size | 199.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
af94ab0dd68ade4788c077c7d50fb7295f905663db543fe8ced7fb760decb794
|
|
BLAKE2b-256 checksum How to use checksums |
5688129b69ff006da9231f74bda0b798389f9904be369522ae57fdc0150afd0f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Release files / authgent_server-0.3.4-py3-none-any.whl
| Download URL | authgent_server-0.3.4-py3-none-any.whl |
|---|---|
| Size | 126.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e187aa9d9503cc346b29fa02f122570c7fc3b9b6a9be89f23fb64b2c36ce1d27
|
|
BLAKE2b-256 checksum How to use checksums |
32ba6bbfc6be113aaf794b1a583640ef9e9b665fa171f1f4758dad9941fa3edb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Security for authgent-server 0.3.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.