freshcrate
Home > MCP Servers > tenuo

tenuo

High-performance capability authorization engine for AI agents. Cryptographically attenuated warrants, task-scoped authority, verifiable offline. Rust core.

Description

High-performance capability authorization engine for AI agents. Cryptographically attenuated warrants, task-scoped authority, verifiable offline. Rust core.

README

tenuo

Capability tokens for AI agents.

CI Crates.io PyPI Docker Docs License

Tenuo Cloud β€” Early Access

Managed control plane with revocation, observability, and multi-tenant warrant issuance.

Request access β†’

Tenuo is cryptographic authorization infrastructure for AI agents. A useful mental model is a prepaid card instead of a corporate Amex: scoped capability tokens that expire with the task.

A warrant is a signed token specifying which tools an agent can call, under what constraints, and for how long. It is bound to a cryptographic key, and the caller must prove possession of that key (PoP). Verification is offline (~27ΞΌs), and delegation attenuates monotonically: authority can narrow but not expand. If an agent is prompt-injected, execution is still limited by warrant constraints.

Tenuo is designed for teams running tool-calling and multi-agent workflows where authorization must hold at runtime, not just at session start.

It can be deployed in-process or at boundary enforcement points (sidecar/gateway), with the same warrant semantics and enforcement behavior.

Status: v0.1 Beta - Core semantics are stable. APIs may evolve. See CHANGELOG.

# Using uv (recommended)
uv pip install tenuo

# Or standard pip
pip install tenuo

Open In Colab Explorer Docker Demo Blog

Quick Start

from tenuo import configure, SigningKey, mint_sync, guard, Capability, Pattern
from tenuo.exceptions import AuthorizationDenied

# 1. One-time setup: generate a key and configure Tenuo
configure(issuer_key=SigningKey.generate(), dev_mode=True, audit_log=False)

# 2. Protect a function β€” calls are blocked unless a warrant allows them
@guard(tool="send_email")
def send_email(to: str) -> str:
    return f"Sent to {to}"

# 3. Mint a warrant that only allows sending to @company.com
with mint_sync(Capability("send_email", to=Pattern("*@company.com"))):
    print(send_email(to="alice@company.com"))  # -> "Sent to alice@company.com"
    
    try:
        send_email(to="attacker@evil.com")
    except AuthorizationDenied:
        print("Blocked: attacker@evil.com")  # -> "Blocked: attacker@evil.com"

Even if the agent is prompt-injected, enforcement still happens at the tool boundary. The warrant allows *@company.com; attacker@evil.com is denied.

When the mint_sync block exits, the warrant expires naturally. No manual cleanup or revocation flow is required.

30-second architecture:

  1. Issuer mints a root warrant for a task.
  2. Delegator attenuates scope for downstream agents/tools.
  3. Authorizer verifies warrant + PoP at the tool-call boundary.
  4. Signed receipt records the authorization decision and execution context.

Why Tenuo?

IAM answers "who are you?" Tenuo adds "what can this workload do right now for this task?" That gives teams a deterministic authorization boundary at agent speed.

Failure mode in agent systems Tenuo strength Practical outcome
Session roles outlive individual tasks Task-scoped warrants with TTL Authority disappears when the task ends
Delegation chains increase blast radius Monotonic attenuation at every hop Scope only narrows, never expands
Bearer credentials can be replayed Holder-bound proofs (PoP) Stolen warrants are unusable without the key
Runtime policy calls add latency and dependency risk Offline verification (~27ΞΌs) Enforcement holds under load without network round-trips
Teams need defensible audit evidence Signed authorization receipts Each decision is attributable and reviewable

How It Works

Tenuo implements Subtractive Delegation: each step in the chain can only reduce authority, never expand it.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Control Plane   β”‚     β”‚  Orchestrator    β”‚     β”‚  Worker          β”‚
β”‚                  β”‚     β”‚                  β”‚     β”‚                  β”‚
β”‚  Issues root     │────▢│  Attenuates      │────▢│  Executes with   β”‚
β”‚  warrant         β”‚     β”‚  for task        β”‚     β”‚  proof           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
     Full scope     -->     Narrower      -->      Narrowest
  1. Control plane issues a root warrant with broad capabilities
  2. Orchestrator attenuates it for a specific task (scope can only shrink)
  3. Worker proves possession of the bound key and executes
  4. Warrant expires β€” no cleanup needed

What Tenuo Is Not

  • Not a sandbox β€” Tenuo authorizes actions, it doesn't isolate execution. Pair with containers/sandboxes/VMs for defense in depth.
  • Not prompt engineering β€” Tenuo does not rely on model instructions for security decisions.
  • Not an LLM filter β€” Tenuo gates tool calls at execution time rather than filtering model text.
  • Not a replacement for IAM β€” Tenuo complements IAM by adding task-scoped, attenuating capabilities on top of identity.

Key Features

Feature Description
Offline verification No network calls, ~27ΞΌs
Holder binding Stolen tokens are useless without the key
Semantic constraints 11 constraint types including Subpath, UrlSafe, Shlex, CEL β€” they parse inputs the way the target system will (why this matters)
Monotonic attenuation Capabilities only shrink, never expand
Framework integrations OpenAI, Google ADK, CrewAI, Temporal, LangChain, LangGraph, FastAPI, MCP, A2A, AutoGen

Integrations

OpenAI β€” Tool-call enforcement with streaming TOCTOU protection

from tenuo.openai import GuardBuilder, Subpath, UrlSafe, Range, Pattern

client = (GuardBuilder(openai.OpenAI())
    .allow("read_file", path=Subpath("/data"))        # Path traversal protection
    .allow("fetch_url", url=UrlSafe())                # SSRF protection
    .allow("transfer", amount=Range(max=1000))        # Value boundary enforcement
    .allow("send_email", to=Pattern("*@company.com"))
    .build())
# Out-of-scope recipient is denied at execution time

LangChain / LangGraph

from tenuo.langchain import guard_tools
from tenuo.langgraph import TenuoToolNode

protected = guard_tools([search_tool, email_tool])      # LangChain
graph.add_node("tools", TenuoToolNode([search, email])) # LangGraph

MCP β€” Model Context Protocol client and server-side verification

from tenuo.mcp import SecureMCPClient, MCPVerifier

# Client: injects warrant proofs into tool arguments
async with SecureMCPClient("python", ["server.py"]) as client:
    async with mint(Capability("read_file", path=Subpath("/data"))):
        result = await client.tools["read_file"](path="/data/file.txt")

# Server: verifies tool constraints offline before execution
verifier = MCPVerifier(...)
@mcp.tool()
async def read_file(path: str, **kwargs) -> str:
    clean = verifier.verify_or_raise("read_file", {"path": path, **kwargs})
    return open(clean["path"]).read()
More integrations: Google ADK, CrewAI, A2A, Temporal, FastAPI

Google ADK

from tenuo.google_adk import GuardBuilder
from tenuo.constraints import Subpath, UrlSafe

guard = (GuardBuilder()
    .allow("read_file", path=Subpath("/data"))
    .allow("web_search", url=UrlSafe(allow_domains=["*.google.com"]))
    .build())

agent = Agent(name="assistant", before_tool_callback=guard.before_tool)

CrewAI β€” Multi-agent crews with warrant-based authorization

from tenuo.crewai import GuardBuilder

guard = (GuardBuilder()
    .allow("search", query=Pattern("*"))
    .allow("write_file", path=Subpath("/workspace"))
    .build())

crew = guard.protect(my_crew)  # Enforces constraints across crew tools

A2A (Agent-to-Agent) β€” Warrant-based inter-agent delegation

from tenuo.a2a import A2AServerBuilder

server = A2AServerBuilder().name("Search Agent").url("https://...").key(my_key).trust(orchestrator_key).build()
@server.skill("search", constraints={"url": UrlSafe})
async def search(query: str, url: str) -> dict:
    return await do_search(query, url)

client = A2AClient("https://...")
warrant = await client.request_warrant(signing_key=worker_key, capabilities={"search": {}})
result = await client.send_task(skill="search", warrant=warrant, signing_key=worker_key)

Temporal β€” Durable workflows with warrant-based activity authorization

from tenuo.temporal import (
    TenuoTemporalPlugin, TenuoPluginConfig, EnvKeyResolver,
    AuthorizedWorkflow, execute_workflow_authorized,
)

plugin = TenuoTemporalPlugin(
    TenuoPluginConfig(key_resolver=EnvKeyResolver(), trusted_roots=[issuer_public_key])
)
client = await Client.connect("localhost:7233", plugins=[plugin])

@workflow.defn
class MyWorkflow(AuthorizedWorkflow):
    @workflow.run
    async def run(self, path: str) -> str:
        return await self.execute_authorized_activity(
            read_file, args=[path], start_to_close_timeout=timedelta(seconds=30),
        )

result = await execute_workflow_authorized(
    client=client,
    client_interceptor=plugin.client_interceptor,
    workflow_run_fn=MyWorkflow.run,
    workflow_id="wf-123",
    warrant=warrant,
    key_id="agent1",
    args=["/data/report.txt"],
    task_queue="my-queue",
)

See full Temporal examples: demo.py | multi_warrant.py | delegation.py

FastAPI β€” Extracts warrant from headers, verifies PoP offline

@app.get("/search")
async def search(query: str, ctx: SecurityContext = Depends(TenuoGuard("search"))):
    return {"results": do_search(query)}

Kubernetes β€” See Kubernetes guide


Documentation

Resource Description
Quickstart Get running in 5 minutes
Concepts Why capability tokens?
Constraints All 11 constraint types explained
Security Threat model and guarantees
OpenAI Direct API protection with streaming
Google ADK ADK agent tool protection
AutoGen AgentChat tool protection
A2A Inter-agent delegation
FastAPI Zero-boilerplate API protection
LangChain Tool protection
LangGraph Multi-agent graph security
CrewAI Multi-agent crew protection
Temporal Durable workflow authorization
MCP Model Context Protocol client + server verification

Requirements

Component Supported
Python 3.9 – 3.14
Node.js Coming v0.2
OS Linux, macOS, Windows
Rust Not required (binary wheels for macOS, Linux, Windows)

Optional Dependencies

uv pip install tenuo                  # Core only
uv pip install "tenuo[openai]"        # + OpenAI Agents SDK
uv pip install "tenuo[google_adk]"    # + Google ADK
uv pip install "tenuo[a2a]"           # + A2A (inter-agent delegation)
uv pip install "tenuo[fastapi]"       # + FastAPI integration
uv pip install "tenuo[langchain]"     # + LangChain (langchain-core β‰₯0.2)
uv pip install "tenuo[langgraph]"     # + LangGraph (includes LangChain)
uv pip install "tenuo[crewai]"        # + CrewAI
uv pip install "tenuo[temporal]"      # + Temporal workflows
uv pip install "tenuo[autogen]"       # + AutoGen AgentChat (Python β‰₯3.10)
uv pip install "tenuo[mcp]"           # + official MCP SDK, client & server verification (Python β‰₯3.10)
uv pip install "tenuo[fastmcp]"       # + FastMCP (TenuoMiddleware / FastMCP servers)

Docker & Kubernetes

Try the Demo β€” See the full delegation chain in action:

docker compose up

This runs the orchestrator -> worker -> authorizer demo showing warrant issuance, delegation, and verification.

Official Images on Docker Hub:

docker pull tenuo/authorizer:0.1.0-beta.22  # Sidecar for warrant verification
docker pull tenuo/control:0.1.0-beta.22     # Control plane (demo/reference)

Helm Chart:

helm install tenuo-authorizer ./charts/tenuo-authorizer \
  --set config.trustedRoots[0]="YOUR_CONTROL_PLANE_PUBLIC_KEY"

See Helm chart README and Kubernetes guide.


Deploying to Production

Self-hosted Tenuo is free forever. The core library and sidecar run entirely in your infrastructure β€” no external calls at verification time.

Self-hosted checklist:

  • Store signing keys in a secrets manager (Vault, AWS Secrets Manager, GCP Secret Manager) β€” not environment variables
  • Configure trusted_roots with your control plane's public keys
  • Ensure dry_run is disabled and warrants are required in all enforcement points
  • Enable audit callbacks and metrics for observability

See Security Model for the full threat model and production hardening guidance.

Tenuo Cloud adds managed warrant issuance, key rotation, revocation (SRL), observability dashboards, and multi-tenant isolation for teams that prefer a hosted control plane.


Rust

Building an authorizer sidecar, gateway, or high-throughput service in Rust? Use the core crate directly.

What you get in Rust:

  • Warrant minting, derivation, and verification
  • Monotonic attenuation enforcement across delegation hops
  • Typed constraint evaluation at execution time
  • Holder Proof of Possession (PoP) verification
  • Signed receipt generation for allow/deny decisions
[dependencies]
tenuo = "0.1.0-beta.22"

Use the Rust API when you need a language-native enforcement boundary without Python runtime dependencies.


Prior Art

Tenuo builds on capability token ideas described in CaMeL (Debenedetti et al., 2025). Inspired by Macaroons, Biscuit, and UCAN.

The token format and delegation protocol are being standardized as draft-niyikiza-oauth-attenuating-agent-tokens in the IETF OAuth Working Group. The core attenuation rules are formally verified with Alloy (capability and argument-key monotonicity) and Z3 (constraint-type subsumption bounds).

See Related Work for detailed comparison.


Featured In


Etymology

Tenuo (/tΙ›n-ju-oʊ/ β€’ Ten-YOO-oh)

From Latin tenuare: "to make thin; to attenuate." Authority starts broad at the root and is attenuated as it flows down the delegation chain.


Contributing

Contributions welcome. See CONTRIBUTING.md.

TypeScript SDK (Help Wanted)

We're planning a TypeScript/Node SDK for v0.2. If you're interested in leading or contributing to this effort, open an issue or email us at dev@tenuo.ai.

Security issues: Email security@tenuo.ai with PGP (key, not public issues).


License

MIT OR Apache-2.0, at your option.

Release History

VersionChangesUrgencyDate
v0.1.0-beta.22## What's Changed ### Fixed - **Delegation constraint violations no longer hang workflows** β€” `TemporalConstraintViolation` raised inside `tenuo_execute_child_workflow()`, `workflow_grant()`, and `workflow_issue_execution()` is now wrapped as `ApplicationError(non_retryable=True)`. Previously, misconfigured delegation chains caused infinite Temporal retries. - **PopDedupStore warning downgraded to DEBUG** β€” no more noisy warnings on every worker startup during local development. ### AdMedium4/14/2026
v0.1.0-beta.21## What's Changed ### Changed - **Modularized `tenuo.temporal` package** β€” the monolithic `temporal.py` (5 300+ lines) is now 15 focused submodules (`_interceptors`, `_workflow`, `_client`, `_config`, `_pop`, `_headers`, `_decorators`, `_state`, `_dedup`, `_observability`, `_constants`, `_resolvers`, `_warrant_source`, `exceptions`, `temporal_plugin`). Public imports (`from tenuo.temporal import X`) are unchanged thanks to `__getattr__` lazy loading. Internal (`_`-prefixed) symbols must noMedium4/14/2026
v0.1.0-beta.20### Breaking - **Removed `trusted_approvers` / `approval_threshold` from `TenuoPluginConfig`** β€” warrant is sole source of truth for approvers and threshold (#372) ### Security - Temporal child workflow header isolation β€” fail-closed without `tenuo_execute_child_workflow()` (#349) - Temporal mint activity fail-closed on missing `issue_execution()` (#349) - CodeQL path injection fix (#361) - Authorizer approval response blind spots (#362) ### Added - A2A approval transport for hMedium4/13/2026
v0.1.0-beta.19### Security - Guarded telemetry emissions across all adapters β€” control-plane outages can no longer crash the authorization path. - MCP client connection detection uses proper `isinstance` checks instead of fragile string matching. ### Added - MCP `request_hash` threading through the wire protocol for end-to-end approval correlation. - `tenuo.cp_transport` module β€” HTTP transport extracted from core for clean protocol/transport separation. - ADK `redact_args_in_logs` option to preveMedium4/10/2026
v0.1.0-beta.18See [CHANGELOG.md](https://github.com/tenuo-ai/tenuo/blob/v0.1.0-beta.18/CHANGELOG.md) for full history. ### Security - **Explorer** β€” Vite updated to 8.0.8+ (dev-server advisories: GHSA-p9ff-h696-f583, GHSA-v2wj-q39q-566r, GHSA-4w7w-66w2-5vf9). ### Added - **FastMCP `TenuoMiddleware`** β€” runs `MCPVerifier` on every `tools/call`; optional `tenuo[fastmcp]` extra. - **Temporal `TenuoTemporalPlugin`** β€” client + worker interceptors and sandbox passthrough; `TenuoPluginConfig.from_env()` foMedium4/9/2026
v0.1.0-beta.17## 0.1.0-beta.17 β€” 2026-04-05 See [CHANGELOG.md](https://github.com/tenuo-ai/tenuo/blob/v0.1.0-beta.17/CHANGELOG.md) for the full history. ### Security - **CodeQL / supply-chain hygiene** β€” `docs/_preview.py` resolves markdown only under `docs/` (realpath containment). Explorer uses `replaceAll` where global replacement is intended. Blog layout loads GoatCounter over HTTPS with Subresource Integrity. ### Added - **Signed approval envelopes in audit payloads** β€” `VerifiedApproval` Medium4/6/2026
v0.1.0-beta.16### Added - **Approval records in authorizer receipts** β€” `AuthorizationEvent` now includes verified `ApprovalRecord`s when human-in-the-loop approvals contributed to an authorization decision. Only approvals that passed all cryptographic and policy checks are included. - `**VerifiedApproval` struct** β€” new type propagated through `ChainVerificationResult` to avoid redundant Ed25519 re-verification in the audit path. ### Security - **15 new cryptographic tests** β€” comprehensive round-trip,Medium4/1/2026
v0.1.0-beta.15## What's Changed ### Added - **`ArgApprovalGate::Exempt`** β€” new approval gate variant (in development). See Tenuo Cloud documentation for usage details. - **`WRAP_TOOL_CALL_SUPPORTED` flag** exported from `tenuo.langgraph` β€” lets callers detect at runtime whether the installed LangGraph version supports authorization hooks (`wrap_tool_call` requires LangGraph β‰₯ 0.3 / Python 3.10+). - **rand 0.9 upgrade** β€” `SigningKey::generate` now uses `OsRng.try_fill_bytes` with `Zeroizing<[u8; 32]>Medium3/29/2026
v0.1.0-beta.14## What's new in beta.14 ### Signing correctness - **`SignedEvent.signing_payload`** β€” The exact CBOR bytes that were signed are now included in every audit event. The control plane verifies these directly instead of reconstructing the payload, eliminating cross-language CBOR encoding mismatches. - **`sign_event()` authorizer ID override** β€” Events buffered before registration completed were previously signed with a stale pending ID. The flush path now always uses the canonical registeredLow3/21/2026
v0.1.0-beta.13## What's new in beta.13 ### One-token Tenuo Cloud onboarding Connect an authorizer or Python SDK to Tenuo Cloud with a single env var from the dashboard's Quick Connect dialog β€” no separate URL, API key, or signing key required: ```sh # Kubernetes / Docker TENUO_CONNECT_TOKEN=tenuo_ct_... # Python SDK from tenuo.control_plane import connect connect(token="tenuo_ct_...") # or just set TENUO_CONNECT_TOKEN and call connect() ``` - **`TENUO_SIGNING_KEY` is now optional** β€” an eLow3/21/2026
v0.1.0-beta.12## What's new in beta.12 ### Features - **Control plane event streaming** β€” Authorization decisions (allow/deny) are now emitted as signed audit events to Tenuo Cloud across all four Python SDK integrations: MCP, LangGraph, Temporal, and Google ADK ([#245](https://github.com/tenuo-ai/tenuo/pull/245)) - **Formal verification** β€” Rigorous Alloy and Z3 proofs of AAT constraint semantics, with Rust conformance oracle tests ([#229](https://github.com/tenuo-ai/tenuo/pull/229)) - **WASM approval Low3/20/2026
v0.1.0-beta.11## What's New ### MCP Server-Side Verification - **`MCPVerifier`**: Framework-agnostic server-side warrant verification for MCP tool handlers - **`params._meta` transport**: Warrant + PoP are carried in the MCP spec's extension point (`params._meta["tenuo"]`), keeping tool arguments clean - **Multi-transport client**: `SecureMCPClient` supports SSE and StreamableHTTP in addition to stdio - **MCP session reconnection**: Auto-reconnects on transport failures with a single retry ### A2A ALow3/7/2026
v0.1.0-beta.10## Human-in-the-Loop Approvals Cryptographically signed approval policies for sensitive tool calls. Every approval binds to the exact (warrant, tool, args, holder) tuple via SHA-256. - **M-of-N multi-sig**: require 2-of-3 (or any threshold) approvers before execution - **Configurable TTL**: handler β†’ policy β†’ 300s fallback - **Diagnostic errors**: specific rejection reasons (e.g., "required 2, received 1 [rejected: 1 expired, 1 untrusted]") - **Built-in handlers**: `cli_prompt()`, `auto_approvLow2/21/2026
v0.1.0-beta.9## What's New - **Temporal distributed deployment**: Header propagation via outbound interceptor β€” works when client and worker are separate processes - **`AuthorizedWorkflow`**: Base class with fail-fast validation and automatic PoP - **`TenuoClientInterceptor`**: Client-side warrant header injection - **Live integration tests**: 36 tests including 5 against an in-process Temporal server - **Examples**: `authorized_workflow_demo.py`, `multi_warrant.py`, `delegation.py` ## Fixes - BLow2/17/2026
v0.1.0-beta.8## What's Changed ### Unified Enforcement Module - Shared `enforce_tool_call()` function for all Python integrations - `_enforcement.py` with 670+ lines of shared enforcement logic - `BaseGuardBuilder` DRY builder pattern ### Temporal Integration - Workflow and activity authorization with warrants ### Authorizer Improvements - Signing key requirement for cryptographic receipts - Audit events for denials - CBOR encoding fix for warrant chains ### Dependencies - axum 0.7.9 β†’ 0.Low2/15/2026
v0.1.0-beta.7## What's New ### AutoGen Integration (`tenuo[autogen]`) - **GuardBuilder API**: Fluent builder for protecting AutoGen AgentChat tools with Tenuo authorization - **Tier 1 (constraints-only)**: Lightweight validation using `GuardBuilder().allow("tool", arg=Constraint).build()` - **Tier 2 (warrant + PoP)**: Cryptographic enforcement with `with_warrant(warrant, signing_key)` - **Streaming TOCTOU protection**: Buffer-verify-emit strategy via `guard_stream()` prevents time-of-check time-of-use attacLow2/2/2026
v0.1.0-beta.6## Highlights ### OpenAI Integration - **Tier 1 & Tier 2 guardrails** for Chat Completions, Responses API, and Agents SDK - **`protect()`** zero-config entry point for quick setup - **Constraint validation** with `Subpath`, `UrlSafe`, `Shlex` for path traversal, SSRF, and command injection protection - **Streaming TOCTOU protection** - validates complete arguments before execution ### Google ADK Integration - **`TenuoGuard`** with `before_tool_callback` for callback-based authorizatioLow1/15/2026
v0.1.0-beta.5# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [0.1.0-beta.5] - 2026-01-10 ### Added #### OpenAI Integration - **Direct API wrapping**: `guard()` function wraps `openai.OpenAI()` client with guardrails - **GuardBuilder fluent API**: `.allow()`, `.deny()`, `.constrain()` for cLow1/11/2026
v0.1.0-beta.4## What's New ### Cryptographic Benchmark Suite - **37 security tests** validating forgery resistance, delegation monotonicity, key separation, multi-sig enforcement, and temporal constraints - Run with `python -m pytest benchmarks/cryptographic/ -v` ### AgentDojo Integration - Full prompt injection benchmark with Tenuo constraint enforcement - **CEL constraints** for list validation (`value.all(r, r.endsWith('@company.com'))`) - **JIT warrant mode** (`--jit`) for task-specific constraint poliLow1/5/2026
v0.1.0-beta.3# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [0.1.0-beta.3] - 2026-01-03 ### Added #### Approval Security Hardening - **Domain separation**: Approval signatures now include `tenuo-approval-v1` context prefix, preventing cross-protocol signature reuse attacks - **Nonce for rLow1/4/2026
v0.1.0-beta.2## What's New in Beta.2 ### Zero-Trust Constraints (Trust Cliff) When **any** constraint is defined on a capability, unknown fields are now **rejected by default**. This is a secure-by-default behavior change. - Use `Wildcard()` or `Any()` to explicitly allow specific fields - Use `_allow_unknown=True` to opt out entirely - `_allow_unknown` is NOT inherited during attenuation ### Multi-Signature Approval - New `Approval` class for cryptographic multi-sig workflows - `Authorizer.autLow1/1/2026
v0.1.0-beta.1πŸš€ **First public beta release** Capability tokens for AI agents. Offline verification in ~27ΞΌs. Monotonic attenuation. Proof-of-possession binding. ## Highlights - **Python SDK**: `pip install tenuo` - **Rust crate**: `tenuo = "0.1"` - **Docker**: `tenuo/authorizer:0.1.0-beta.1` ## Integrations LangChain, LangGraph, FastAPI, MCP ## Resources - πŸ“š [Documentation](https://tenuo.dev) - πŸ”¬ [Explorer](https://tenuo.dev/explorer/) - πŸ““ [Notebooks](https://colab.research.google.com/github/tenuoLow12/27/2025

Dependencies & License Audit

Loading dependencies...

Similar Packages

chronosChronos is visual AI agent builder - tailored for self-hosted deployments and observabilityv1.4.0
@friggframework/ai-agentsAI agent integration for Frigg Framework2.0.0--canary.522.cbd3d5a.0
ai-engineering-from-scratchLearn it. Build it. Ship it for others.0.0.0
damn-vulnerable-ai-agentThe AI agent you're supposed to break. 14 agents, 12 vulnerability categories, zero consequences.0.7.4
robot-resourcesRobot Resources β€” AI agent tools. One command to install everything.1.9.1