Skip to main content

Authorization for AI agents: verifiable, scoped, revocable capability tokens (mandates) with attenuable delegation, for MCP and A2A. The reference implementation of agent authority — zero-dependency TypeScript & Python.

Project description

agent-authority (Python)

Authorization for AI agents — the reference implementation of agent authority (project name: Behalf). Verifiable, scoped, time-bound, revocable capability tokens (mandates) with attenuable, macaroon/biscuit-style delegation, plus MCP and agent-to-agent (A2A) middleware. Capability-based security, OAuth 2.1 on-behalf-of–style grants, and SPIFFE/SVID-style agent identity for multi-agent / LLM systems.

Identical API shape to the TypeScript library, zero dependencies (standard library only). The optional cryptography extra enables a constant-time Ed25519 backend and sealed credentials:

pip install agent-authority          # core, dependency-free
pip install "agent-authority[seal]"  # + sealed credentials / hardened crypto

In plain words

Think of a Mandate as a permission slip for an AI agent.

Imagine you hire an assistant to run errands for you. You don't hand over your wallet and house keys — you write a note: "You may read my calendar and spend up to $50, and only for the next hour." That note is a Mandate.

The five verbs are just the things you can do with that note:

  • grantwrite the permission slip. "This agent may do X, up to this limit, until this time."
  • authorizecheck the slip before acting. The agent must show the slip (and prove it's really theirs) before it's allowed to do something.
  • attenuatemake a smaller copy for a helper. A sub-agent can only get the same powers or fewer — never more.
  • revoketear the slip up. Cancel it instantly; every copy handed downstream stops working too.
  • auditthe logbook. Every check is written down, so you can see exactly what happened.

Two things make the slip safe: it can't be faked or upgraded (it's signed with cryptography, and a helper can only shrink the powers), and holding the paper isn't enough — an agent must prove it's the rightful holder, so a stolen copy by itself is useless.

The rest of this page shows how to do each of these in code.

The five verbs

from agent_authority import create_behalf

b = create_behalf()

# 1. GRANT
mandate = b.grant(
    principal="alice",
    agent="research-agent",
    can=["read:calendar", "spend:usd<=50"],
    expires_in="1h",
)

# 2. AUTHORIZE — raises AuthorizationError if denied
mandate.authorize("spend:usd=20")

# 3. ATTENUATE — narrow for a sub-agent; can only shrink
child = mandate.attenuate(can=["read:calendar"], expires_in="10m")

# 4. REVOKE — kills the mandate and its downstream chain
b.revoke(mandate.id)

# 5. AUDIT — every authorize() wrote a hash-chained record
trail = b.audit(mandate.id)

MCP / A2A middleware

from agent_authority.mcp import with_behalf

server = with_behalf(
    my_tool_server,  # exposes call_tool(name, args, ctx=None)
    policy={
        "send_email": "write:email",
        "read_calendar": "read:calendar",
        "transfer_funds": lambda args: f"spend:usd<={args['amount']}",
    },
    on_denied="throw",  # or "prompt" with on_prompt=...
)

# Pass the caller's mandate on the context:
server.call_tool("read_calendar", {}, {"mandate": mandate})

agent_authority.mcp.behalf_mcp_tools() returns the three discovery tools (request_mandate, present_mandate, check_authority).

Develop

python3 -m unittest discover -s tests   # 28 tests

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

agent_authority-0.1.2.tar.gz (46.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agent_authority-0.1.2-py3-none-any.whl (41.7 kB view details)

Uploaded Python 3

File details

Details for the file agent_authority-0.1.2.tar.gz.

File metadata

  • Download URL: agent_authority-0.1.2.tar.gz
  • Upload date:
  • Size: 46.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for agent_authority-0.1.2.tar.gz
Algorithm Hash digest
SHA256 6d450f22873f5032908e23ac65449af8687cfcef57cda074fe90cfbbdf30d671
MD5 7010e05c6a5b105f0c74ec7a3855f16d
BLAKE2b-256 c28b3dc402eaa4f4577338bfe0db27bd879b436461ba40ca0c68b8ad7f2b6416

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_authority-0.1.2.tar.gz:

Publisher: release.yml on novaai0401-ui/agent-authority

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file agent_authority-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: agent_authority-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 41.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for agent_authority-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 afb63a8c5d08f233034c0fd5b9589febc53a63946dabbe480cc3b67e58560dbe
MD5 3fe5cf57aea69f4328cd032bbed5d302
BLAKE2b-256 86e7f4ebbbce0089e154c9b75a57c1dab3a5890c1423fda3be444b6274f07e18

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_authority-0.1.2-py3-none-any.whl:

Publisher: release.yml on novaai0401-ui/agent-authority

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page