Eight services. One docker compose up. Every component below is a real server, not a diagram box. The model making tool calls is the Anthropic API. The token in the JWT inspector is from a live OAuth exchange with Authentik.
Click any platform node to jump to its component detail below.
Eight services. Click any card to expand the full detail.
The entry point for any AI model. Wraps the Bank API as a set of tools any MCP-compatible agent can call. Model-agnostic — Claude, ChatGPT, and Gemini all connect the same way.
The enforcement proxy. Every request from the MCP Server passes through here before reaching the Bank API. External to the model's execution context — a prompt-injected agent cannot bypass it.
The identity provider. Issues JWTs for all five agent channel types. Five fixed OAuth clients — one per channel type. Enrollment never creates a new client; it writes to the Agent Registry instead.
One row per enrollment. The source of truth for who has enrolled which agent, with what scopes, and at what trust tier. Also stores the ROA that the Border Gateway fetches on every request.
Handles all consent interactions — push consent for new requests, step-up challenges for out-of-scope actions, and batch consent for multiple intents at enrollment.
Classifies every inbound request on five dimensions before the Border Gateway makes its allow/deny decision. Not ML-based — deterministic rules matching the demo scenarios.
The mock banking backend. Five endpoints covering the core banking actions the demo needs. Sarah Chen's data lives in memory — the auth stack around it is real.
Stores every AER receipt generated by the Border Gateway. Not a log — a signed pre-execution commitment. The receipt exists whether the action was allowed or denied. HMAC-SHA256 signed with GATEWAY_SIGNING_KEY.
| Service | URL | Purpose | |
|---|---|---|---|
| Bank API | http://localhost:8000/docs | Swagger UI — all endpoints | |
| Bank API health | http://localhost:8000/health | {"status":"healthy","phase":2} | |
| Border Gateway health | http://localhost:8200/gateway/health | {"status":"healthy"} | |
| Consent Engine | http://localhost:8300/health | {"status":"healthy"} | |
| MCP Server | http://localhost:8100/sse | SSE transport endpoint | |
| Authentik admin | http://localhost:9000/if/admin/ | IDP admin console | |
| Authentik OIDC discovery | http://localhost:9000/application/o/lara-bank/.well-known/openid-configuration | OpenID configuration | |
| Authentik JWKS | http://localhost:9000/application/o/lara-bank/jwks/ | Public keys for token validation | |
| Frontend | http://localhost:3001 | This app |
In Channel 1 (Your AI assistant), the agent is not simulated. It is a live Claude session via the Anthropic API. When you open Cowork and ask Claude to check Sarah's balance, that is claude-sonnet-4-6 making a real tool call to the MCP Server running on your machine.
The model does not see Sarah's accounts directly. It sees the tool result returned by the MCP Server — which has already passed through the Border Gateway enforcement stack. The model cannot request data outside what the MCP tools expose, and the MCP tools enforce auth on every call.
Channels 2–5 use the same MCP Server and Border Gateway. The model layer is swappable — MoneyDash (Channel 3) could use OpenAI's function calling; the enforcement stack does not care.
git clone https://github.com/lakshsinghal/lara-trust cd lara-trust docker compose up -d python3 scripts/setup_authentik.py # first run only python3 scripts/test_phase2_gateway.py # verify everything is working
Then open http://localhost:3001.
To connect your own Claude session (Channel 1):
{
"mcpServers": {
"lara-trust": { "url": "http://localhost:8100/sse" }
}
}You'll need an Anthropic API key for the embedded agent (set ANTHROPIC_API_KEY in .env).
MIT licence. Fork it, extend it, break it, fix it.