Skip to main content

The Python framework for building applications that humans use and agents can safely operate.

Project description

Quater

CI Coverage Python 3.11+ License: MIT Docs

Most backend frameworks were designed for one main job: serve data to a frontend, then let humans click through that frontend to get work done.

That model still matters, but it is no longer enough. Moving ahead, more work is going to be done by AI agents. Asking those agents to use a product through screens, buttons, and forms is slow, fragile, and often the wrong level of access. Agents need a safe way to work with the backend directly.

That does not mean giving agents unlimited access. It means exposing the right operations, with clear inputs, clear descriptions, real auth, audit trails, and approval gates where the action is sensitive.

Quater is a Python backend framework built for this shift. You build a normal backend for people and services, and you can expose selected views directly to MCP Clients through MCP or to AI agents through the CLI. The same operation can serve the app, power an agent, and support production workflows without becoming three different pieces of code.

The goal is simple: make the backend usable by humans and operable by AI agents, without losing safety, structure, or ownership of the application logic.

Quater is not trying to replace Django/FastAPI/Flask, ship an ORM, or hide your architecture behind a large dependency graph. It focuses on the parts this new backend model needs: typed handlers, explicit auth boundaries, AI-readable metadata, operator-friendly actions, generated docs, and a small request path.

Highlights

  • One view serves HTTP, MCP, and CLI. You annotate the route once and all three entry points share the same logic, auth, and validation.
  • Exposing a view to AI agents takes a single flag. No extra service, no separate schema file, no adapter to maintain.
  • Security is on by default. Host checking, CORS, body limits, and request IDs run without you touching configuration.
  • Every request carries source and entrypoint metadata, so audit logs always know weather a human or an AI agent used your backend and how it arrived.
  • It gives slightly better performance than FastAPI for real workloads, with no measurable overhead when database I/O dominates.
  • Its simple to use, with a small API surface and no extra configuration required.

A Small App

from quater import AuthContext, AuthRequest, HTTPError, Quater, Request


async def authenticate(ctx: AuthRequest) -> AuthContext | None:
    if ctx.headers.get("authorization") != "Bearer admin-token":
        return None
    return AuthContext(subject="admin")


app = Quater(mcp_auth=authenticate, cli_auth=authenticate)

ORDERS: dict[str, dict[str, object]] = {
    "ord_1001": {"id": "ord_1001", "status": "paid", "total": 42.5}
}


@app.get("/health")
async def health() -> dict[str, bool]:
    return {"ok": True}


@app.get(
    "/orders/{order_id}",
    tool=True,
    cli=True,
    auth=authenticate,
    description="Fetch one order by id.",
)
async def get_order(order_id: str, request: Request) -> dict[str, object]:
    order = ORDERS.get(order_id)
    if order is None:
        raise HTTPError("Order not found", status_code=404)
    assert request.auth is not None
    return {
        **order,
        "subject": request.auth.subject,
        "source": request.context.source,
        "entrypoint": request.context.entrypoint,
    }

Run it:

python -m pip install quater
quater dev main.py

If you use uv, install with uv add quater instead.

Expected server output:

[INFO] Starting granian
[INFO] Listening at: http://127.0.0.1:8000
  1. Call HTTP:
curl -H "Authorization: Bearer admin-token" \
  http://127.0.0.1:8000/orders/ord_1001
{
  "id": "ord_1001",
  "status": "paid",
  "total": 42.5,
  "subject": "admin",
  "source": "api",
  "entrypoint": "server"
}
  1. Call the same handler as an MCP tool:
curl http://127.0.0.1:8000/mcp \
  -H "Authorization: Bearer admin-token" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_order","arguments":{"order_id":"ord_1001"}}}'
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\"id\":\"ord_1001\",\"status\":\"paid\",\"total\":42.5,\"subject\":\"admin\",\"source\":\"mcp\",\"entrypoint\":\"server\"}"
      }
    ],
    "isError": false
  }
}
  1. Call the same handler from the local CLI without a server round trip:
export QUATER_APP=main:app
export QUATER_TOKEN=admin-token
quater actions list
quater call get_order --order-id ord_1001
{
  "id": "ord_1001",
  "status": "paid",
  "total": 42.5,
  "subject": "admin",
  "source": "cli",
  "entrypoint": "local"
}
  1. For a hosted app, connect once and call the named remote, just like git:
quater connect store https://api.example.com --token admin-token
quater actions describe store get_order
quater call store get_order --order-id ord_1001

Data flow diagram

flowchart TB
    caller["Caller\nperson, service, or AI agent"]
    http["HTTP request\nGET /orders/ord_1001"]
    mcp["MCP tool call\ntools/call get_order"]
    remote_cli["Remote CLI action\nquater call store get_order"]
    adapter["Server adapter\nRSGI / ASGI / WSGI"]
    checks["Framework checks\nhost, body limit, CORS, request id"]
    router["Route metadata\nmethod, path, auth, resources"]
    mcp_surface_auth["MCP auth\nmcp_auth"]
    cli_surface_auth["CLI auth\ncli_auth"]
    route_auth["Route auth\nauth="]
    handler["Your handler\nget_order(...)"]
    response["Serialized response\nJSON, text, bytes, stream"]

    caller --> http
    caller --> mcp
    caller --> remote_cli
    http --> adapter
    mcp --> adapter
    remote_cli --> adapter
    adapter --> checks
    checks --> router
    router -->|HTTP| route_auth
    router -->|MCP| mcp_surface_auth --> route_auth
    router -->|remote CLI| cli_surface_auth --> route_auth
    route_auth --> handler
    handler --> response

Why This Shape

Quater treats HTTP, MCP, and CLI as different ways to reach the same backend capability, not as three products you have to maintain.

  • For people and services: Quater gives you normal HTTP APIs with route decorators, OpenAPI, Swagger UI, request binding, response classes, route groups, middleware, and tests.
  • For MCP Clients: tool=True exposes selected routes through MCP with required descriptions, generated input schemas, transport auth, MCP docs, and audit hooks.
  • For AI agents: cli=True exposes selected routes as local or remote CLI actions with discovery, dry-run, approval hooks, and JSON output for scripts.
  • For the app itself: route auth, resources, app.state, lifespan hooks, and serialization stay attached to the handler instead of drifting into wrappers.
  • For performance: the request path stays deliberately small with Granian/RSGI, msgspec JSON, and a native route matcher.

Benchmarks

To measure performance, we ran benchmarks on an Apple M2 with an 8-core CPU, 16 GiB RAM, macOS 26.3, Python 3.11.12, and one worker per app. Quater performed slightly better than FastAPI when real database work was involved.

For very small endpoints without database access, FastAPI can be faster because the benchmark mostly measures framework overhead. Quater still runs built-in checks such as host validation, request IDs, body limits, and security headers on every request.

In the latest run, Quater used Granian/RSGI, while FastAPI used Uvicorn with uvloop and httptools. Full setup, commands, and CSV files are available in benchmarks.

No database throughput No database p95 latency
Postgres throughput Postgres p95 latency

Current Status

Quater is in pre-release stage. The documented top-level imports are the public surface, but names and defaults can still change before the first stable release.

Documentation

Agent Skills

Quater ships two agent skills:

  • quater-apps: for operating applications built with Quater through MCP, CLI actions, and HTTP. The applications build on quater can have their own skills for operating their applications.
  • quater-framework: for building and debugging applications with Quater.

Install the app-operator skill:

npx -y skills add \
  https://github.com/DevilsAutumn/quater/tree/main/agent-skills/quater-apps

Install the framework-development skill:

npx -y skills add \
  https://github.com/DevilsAutumn/quater/tree/main/agent-skills/quater-framework

Working On Quater

This repo uses uv for local development:

uv sync --group dev
uv run pytest
uv run mypy
uv run ruff format --check src tests scripts
uv run ruff check src tests scripts
uv build

Docs use VitePress:

npm install
npm run docs:reference
npm run docs:dev
npm run docs:build

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

quater-0.1.0a2.tar.gz (395.8 kB view details)

Uploaded Source

Built Distributions

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

quater-0.1.0a2-cp311-abi3-win_amd64.whl (272.4 kB view details)

Uploaded CPython 3.11+Windows x86-64

quater-0.1.0a2-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (373.5 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ x86-64

quater-0.1.0a2-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (361.9 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ ARM64

quater-0.1.0a2-cp311-abi3-macosx_11_0_arm64.whl (342.9 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

quater-0.1.0a2-cp311-abi3-macosx_10_12_x86_64.whl (350.4 kB view details)

Uploaded CPython 3.11+macOS 10.12+ x86-64

File details

Details for the file quater-0.1.0a2.tar.gz.

File metadata

  • Download URL: quater-0.1.0a2.tar.gz
  • Upload date:
  • Size: 395.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for quater-0.1.0a2.tar.gz
Algorithm Hash digest
SHA256 ff26d50190963b90cfe0d9b774b3dd44e06f123733d7d2b2f9ffe5df5c1284af
MD5 108a44510387de3008e0f9fb82fc511a
BLAKE2b-256 ad9a4bea6855cc157b65cfbefe6fc96d7cf6b2bd369bdd7978854069d09004bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for quater-0.1.0a2.tar.gz:

Publisher: release.yml on DevilsAutumn/quater

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

File details

Details for the file quater-0.1.0a2-cp311-abi3-win_amd64.whl.

File metadata

  • Download URL: quater-0.1.0a2-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 272.4 kB
  • Tags: CPython 3.11+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for quater-0.1.0a2-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 056042e5f245c27725b1770030ef91be96311aeb19eb8b79446f18ddd727ee46
MD5 424649fe131fbe909dda0fba8f691572
BLAKE2b-256 8dbc3719564c369d3e343c24695f37f34ed46a0c1156535e6bc61962758a77a6

See more details on using hashes here.

Provenance

The following attestation bundles were made for quater-0.1.0a2-cp311-abi3-win_amd64.whl:

Publisher: release.yml on DevilsAutumn/quater

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

File details

Details for the file quater-0.1.0a2-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for quater-0.1.0a2-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 63dcdac655d0a9e093cf873b39d13d879cbcb50cd52422ede0b11bf1cef02a5f
MD5 b45cdf8d02503b80755d0dccac51d70e
BLAKE2b-256 5932adebbf6ce278f53de1556677af9ea08d734399b1eb10f0e89a77ef71413c

See more details on using hashes here.

Provenance

The following attestation bundles were made for quater-0.1.0a2-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on DevilsAutumn/quater

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

File details

Details for the file quater-0.1.0a2-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for quater-0.1.0a2-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 96350f99ea24157456017e05614629d7a5e656aa268b20dbaf985c78c4191449
MD5 b844d562a1142d3364f698deeb322386
BLAKE2b-256 b1ccc9f6e13abdd21c2a9c260726c3018048b6150775fd52ac4a18325ab79b15

See more details on using hashes here.

Provenance

The following attestation bundles were made for quater-0.1.0a2-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on DevilsAutumn/quater

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

File details

Details for the file quater-0.1.0a2-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for quater-0.1.0a2-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 da4301b95e0e91b2d74867e1ba7a5d0238273dc4fe7df596a9b68c379d2a4d94
MD5 6f065f81e95484d17479e7eddb36a821
BLAKE2b-256 8b918a556317ef3c58f8b7cca817269d21774d68a1bfca1364f1b8d9b243c92b

See more details on using hashes here.

Provenance

The following attestation bundles were made for quater-0.1.0a2-cp311-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on DevilsAutumn/quater

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

File details

Details for the file quater-0.1.0a2-cp311-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for quater-0.1.0a2-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 708ae9652e701c00a51b458f72650decc08b3fb02b420448787232a0de8686bc
MD5 4242faccb345e55e71b4d3ceb8571e15
BLAKE2b-256 a8d37ac8ed4dca59e448044a41543e4d764e75a745f823f1387948429226698f

See more details on using hashes here.

Provenance

The following attestation bundles were made for quater-0.1.0a2-cp311-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on DevilsAutumn/quater

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