An open API service indexing awesome lists of open source software.

https://github.com/cullis-security/cullis

Trust infrastructure for AI agents across organizations. Verified identity, explicit authorization, cryptographic audit trail.
https://github.com/cullis-security/cullis

ai-agents api-gateway cryptography dpop e2e-encryption fastapi federated-identity iam mcp mtls multi-agent-systems pki python self-hosted spiffe trust-broker workload-identity zero-trust

Last synced: about 1 month ago
JSON representation

Trust infrastructure for AI agents across organizations. Verified identity, explicit authorization, cryptographic audit trail.

Awesome Lists containing this project

README

          


Cullis


Cullis β€” Zero-trust identity and audit for AI agents.

Start air-gapped in your organization. Scale to cross-company federation without redeploy.


License
Python
CI
Status: early-stage

---

> πŸ“– **Why Cullis exists, architecture deep-dives, use cases, deployment patterns β†’ [cullis.io](https://cullis.io)**
>
> This README is the engineer's entry point: what it is, how to run it, how the code is laid out. Everything else lives on the site.

---

## Status

> [!WARNING]
> **Early-stage research project β€” not production-ready.**
>
> Cullis is in active study and prototyping. The architecture is real and
> the demo runs end-to-end on a laptop, but the codebase has not been
> externally security-audited, and APIs may still break without notice.
>
> Use it to learn, explore, prototype, and contribute β€” not yet to handle
> real users, real credentials, or real traffic.

---

## What Cullis is

AI agents act on your behalf β€” they make decisions, move data, and
increasingly talk to each other. When something goes wrong, three questions
matter: **who was it, what were they allowed to do, and what did they actually do?**

Cullis gives each agent a cryptographic identity, enforces policy at the
organization boundary, and records every action in a tamper-evident
hash-chain. The same binary runs standalone inside your organization or
federated across companies β€” no redeploy between the two.

---

## Three components

| | **Cullis Connector** | **Cullis Mastio** | **Cullis Court** |
|---|---|---|---|
| **Where it runs** | User's laptop | Your organization | Cross-org network |
| **Owned by** | End user | Your org admin | Network operator |
| **What it does** | User identity + MCP↔Cullis translation | Agent certs, policy, local audit, tool reverse-proxy | Org registry, trust federation, cross-org routing |

The **Connector** is a desktop app that turns any MCP client (Claude
Desktop, Cursor, Cline) into a Cullis-aware agent. The **Mastio** is the
authority that governs agents inside a single organization. The **Court**
federates Mastios across different organizations.

The Mastio runs in two modes β€” **standalone** (air-gapped, single-org,
no external dependency) or **federated** (attached to a Court, reaches
agents in other companies). Same binary, admin action switches between
them, no agent re-enrollment.
[Deployment patterns β†’ cullis.io](https://cullis.io).

---

## Quickstart β€” single host (bundles)

For a single-host evaluation: a Mastio + multi-user Frontdesk chat in two
commands, no repo clone needed. Both bundles pull the published images
from `ghcr.io` and configure themselves with sensible defaults.

**Requirements**: Docker Engine with Compose v2, ~2 GB RAM.

```bash
# 1. Mastio (org gateway + first-boot Org CA + dashboard on :9443)
curl -L https://github.com/cullis-security/cullis/releases/download/mastio-v0.3.2-rc3/cullis-mastio-bundle.tar.gz | tar xz
cd cullis-mastio-bundle && ./deploy.sh

# 2. Frontdesk (multi-user chat on :8080, enrolls against the Mastio above)
cd ..
curl -L https://github.com/cullis-security/cullis/releases/download/frontdesk-bundle-v0.2.0-rc3/cullis-frontdesk-bundle.tar.gz | tar xz
cd cullis-frontdesk-bundle && ./deploy.sh
```

> **Why pinned tags, not `releases/latest/`?** GitHub's `Latest` marker
> points to a single release across the whole repo. Cullis ships two
> independent bundles (Mastio + Frontdesk) with separate version
> trains; a `releases/latest/download/cullis-frontdesk-bundle.tar.gz`
> URL 404s the moment a Mastio release becomes Latest. Newer versions
> are at .

The Mastio dashboard is at `https://localhost:9443/proxy/login` (self-signed
TLS, accept the warning); the Frontdesk SPA is at `http://localhost:8080`.
See [`packaging/mastio-bundle/README.md`](packaging/mastio-bundle/README.md)
and [`packaging/frontdesk-bundle/README.md`](packaging/frontdesk-bundle/README.md)
for production overrides (custom hostname, oauth2-proxy + IDP, image pinning).

## Quickstart β€” full enterprise stack (sandbox)

Boot the full enterprise stack β€” Court + 2 Mastios + 3 agents + 2 MCP servers
in 2 organizations, wired with SPIRE, Keycloak, Vault and Postgres β€” then
replay intra-org and cross-org traffic.

**Requirements**: Docker Engine with Compose v2, ~6 GB free disk, ~4 GB RAM.

```bash
git clone https://github.com/cullis-security/cullis
cd cullis
./sandbox/demo.sh full
```

Replay scenarios (stack must be up):

```bash
./sandbox/demo.sh mcp-catalog # intra-org: agent β†’ MCP tool call (Org A)
./sandbox/demo.sh mcp-inventory # intra-org: agent β†’ MCP tool call (Org B)
./sandbox/demo.sh oneshot-a-to-b # cross-org: A2A encrypted message A β†’ B
./sandbox/demo.sh oneshot-b-to-a # cross-org: A2A encrypted message B β†’ A
./sandbox/demo.sh guide # open the onboarding walkthrough
```

See [`sandbox/GUIDE.md`](sandbox/GUIDE.md) for the
step-by-step onboarding β€” attach-CA flow, Mastio counter-signature pin
(ADR-009), Connector Desktop enrollment, MCP resource registration.

For single-user install, download the [Connector desktop
app](https://github.com/cullis-security/cullis/releases).

---

## Key features

- **x509 PKI + SPIFFE per-agent identity** β€” each agent gets a cert
signed by its organization's CA, with `spiffe://org/agent` SAN
- **ECC end-to-end encryption** β€” ECDH P-256 key exchange, AES-256-GCM
payload, ECDSA signatures
- **DPoP token binding (RFC 9449)** β€” every token bound to an ephemeral
EC key
- **Default-deny federated policy** β€” PDP webhook or OPA per organization,
both orgs must allow on cross-org traffic
- **Local hash-chain audit** β€” append-only, SHA-256 chain, never leaves
the organization
- **Self-service org onboarding** β€” invite tokens, attach-CA for existing
PKIs, automatic Org CA generation
- **KMS backends** β€” local filesystem (dev), HashiCorp Vault KV v2 (prod)

---

## SDK

```python
from cullis_sdk.client import CullisClient

client = CullisClient("https://mastio.example.com")
client.login("alice", "acme", "agent.pem", "agent-key.pem")

agents = client.discover(capabilities=["supply"])
session_id = client.open_session("widgets::supplier", "widgets", ["supply"])
client.send(session_id, "acme::alice", {"order": "100 units"}, "widgets::supplier")
```

TypeScript SDK in [`sdk-ts/`](sdk-ts/). MCP server exposing Cullis as a
set of tools (so any MCP-compatible LLM becomes a Cullis agent) in
`cullis_sdk/mcp_server.py`.

---

## Project layout

```
app/ Cullis Court (network control plane)
mcp_proxy/ Cullis Mastio (org trust authority)
cullis_connector/ Cullis Connector (desktop app)
cullis_sdk/ Python SDK + MCP server
sdk-ts/ TypeScript SDK
alembic/ Court database migrations
sandbox/ Public quickstart demo (SPIRE, Keycloak, Vault, Postgres)
deploy/ Helm chart, Docker Compose, env templates
enterprise-kit/ BYOCA guide, OPA policy bundles, PDP template
docs/ cullis.io site source + ops runbook
tests/ Unit, integration, e2e tests
demo_network/ Test infrastructure for the CI smoke gate (federation
+ standalone matrix). Not a user-facing demo.
```

> [!NOTE]
> `app/` and `mcp_proxy/` are legacy directory names that predate the
> Court / Mastio rebrand. The on-disk paths and the brand names refer to
> the same components. Python package imports follow the same legacy
> (`from app import ...` for Court, `from mcp_proxy import ...` for
> Mastio). Each directory has its own README with a per-component
> overview.

Runtime: Python 3.11 Β· FastAPI Β· PostgreSQL 16 Β· Redis Β· HashiCorp Vault Β· cryptography Β· PyJWT Β· OpenTelemetry + Jaeger Β· OPA Β· Docker Β· Helm.

---

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, PR workflow, and code conventions.

Security vulnerabilities: [SECURITY.md](SECURITY.md) for private reporting.

## Contact

| | |
|---|---|
| General, partnerships, demos | [hello@cullis.io](mailto:hello@cullis.io) |
| Security (private) | [security@cullis.io](mailto:security@cullis.io) Β· [SECURITY.md](SECURITY.md) |
| Bugs, feature requests | [GitHub Issues](https://github.com/cullis-security/cullis/issues) |
| Discussion | [GitHub Discussions](https://github.com/cullis-security/cullis/discussions) |

## License

Split licensing:

- **Court (`app/`) and Mastio (`mcp_proxy/`)** β€” [FSL-1.1-Apache-2.0](LICENSE). Non-competing use permitted (internal deployments, services, research, modifications, forks). Each release becomes [Apache 2.0](LICENSE-APACHE-2.0) two years after publication.
- **Python SDK (`cullis_sdk/`)** β€” [Apache 2.0](cullis_sdk/LICENSE). Permissive, permanent.
- **TypeScript SDK (`sdk-ts/`)** β€” [MIT](sdk-ts/LICENSE). Permissive, permanent.
- **Integration templates (`enterprise-kit/`)** β€” [Apache 2.0](enterprise-kit/LICENSE). Permissive, permanent.

See [NOTICE](NOTICE) for the component-by-component map.

---

> Architecture deep-dives, use cases, deployment patterns, and the project's reason for existing all live at **[cullis.io](https://cullis.io)**.