Two tools between your agent and everything it touches.
Install the Tier Two Client — or add the MCP server to any host. Your agent requests access, a human grants it, and every action rides a signed authorization.
One request, end to end.
Your agent asks; Tier Two decides as which identity, checks policy, and signs. Only then does the call reach your system.
Why install this?
Because the alternative is a credential in a config file.
No approval, no policy, no record. The credential is the only control.
Every call runs as a governed identity, and the ledger keeps the receipt.
Your machine never holds the org's credentials.
On org-provisioned connections the device only signs the request. Tier Two evaluates policy server-side, decrypts the credential only when needed, forwards the call, and writes the ledger entry. The credential never reaches your laptop.
Lose the laptop? Revoke the device in the dashboard and every key on it stops working.
The agent runtime API.
request_access(domain, action, resource?, reason?)
Asks for a standing grant and waits for the decision, showing exactly where to approve. Once granted, sign_request works for that scope without prompting.
sign_request(domain, action, resource?)
Mints a short-lived signed authorization for one call. Covered by a standing grant — or a just-in-time approval your policy requires — it just works; otherwise it tells the agent to request access.
Install once per machine.
The Tier Two Client covers every MCP host on the machine — Claude Code, Claude Desktop, Cursor, Codex, or anything else that speaks MCP. No client yet, or on Windows? The npx server works everywhere.
# 1. Install the client — trytiertwo.com/download
# 2. Pair from the tray; confirm the number in your dashboard
# 3. Claude Code and Cursor register themselves
# stdio-only host? Point it at the running client:
npx -y @tiertwo/mcp connectOne app per machine: it owns the device identity and serves every MCP host on it.
Verify every authorization yourself.
Every authorization is an Ed25519-signed JWT. Verify it offline against our published keys: no API key, no callback, fails closed.
import { createRemoteJWKSet, jwtVerify } from "jose";
const jwks = createRemoteJWKSet(
new URL("https://trytiertwo.com/.well-known/jwks.json"),
);
// Fails closed: expired token, unknown key, wrong issuer all throw.
const { payload } = await jwtVerify(token, jwks, {
issuer: "https://trytiertwo.com",
});Standard JOSE: verify our signatures offline with any JWT library.
Give your agents an identity you control.
Self-serve and free while in beta. Start with one agent and one connection.