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.3.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.3-py3-none-any.whl (41.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: agent_authority-0.1.3.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.3.tar.gz
Algorithm Hash digest
SHA256 dbfdb160114d4b7d567c0e0e45129e8491c3ebb128650148df4805e125a4f94c
MD5 9313191b2b92526b20ccfc711d626e04
BLAKE2b-256 e0c26420da27f944b957e09cd62c7440b146fac7cb364ea101631d348e020c02

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_authority-0.1.3.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.3-py3-none-any.whl.

File metadata

  • Download URL: agent_authority-0.1.3-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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 b5e2b170f6497f6671dbb85cbd403b7866e8e93e9a30abbd5c292347cd5beb1b
MD5 18bc8a79f91f9ade61a74a4f9f8d53d5
BLAKE2b-256 e6460d23a36e18e655832114c35449973c594104953eeb0304abc9b09c068aa9

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_authority-0.1.3-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