Inlock

Your agents can act. Something should decide whether they should.

Inlock sits between your agents and the tools they call, deciding per action: proceed, wait for a named person to sign off, or block. Every decision leaves a record an auditor can verify.

The problem

A content filter has nothing to say about an action.

Every AI guardrail on the market checks whether text is toxic or leaks PII. None of them notice when an agent with real tool access drops a table, sends money, or leaks a record — because that was never text in the first place. This isn't hypothetical:

How it works

Whatever's driving your agents, Inlock sits in the middle.

One classifier, generic across every MCP server — pattern matching resolves most calls instantly with no network call at all; an LLM only judges the rare, genuinely novel one, cached after the first time.

YOUR AGENTS YOUR SYSTEMS Mistral Bielik Claude GPT your own Database Cloud storage Email Slack / webhook Gov registries Inlock Policy engine allow · hold · deny Audit trail every decision, hash-chained every tool call only allowed calls
What happens to a call

It decides. It never executes.

Every tool call an agent makes passes through Inlock on its way to the tool. Inlock returns a verdict — the integration surface is what actually runs, or doesn't run, the call. Only an allow reaches your systems.

Three ways in, one engine behind them: an in-process wrapper for code you own, a hook for Claude Code, an MCP gateway for everything else. The same gates, the same trail, whichever door the call came through.

Agent Integration surface in-process wrapper · hook · MCP gateway Policy engine patterns first, a model only if needed Allow Hold Deny All three recorded — hash-chained, PII redacted
One engine, three views

Everyone sees the same record, from their own seat.

Four-eyes control for agents: a named person signs off what is risky, the auditor reads the proof, the manager sees what is waiting and what it costs, and engineers wire it in for free. One engine, one audit trail.

Buildengineers Operatemanagers Proveaudit ONE ENGINE · ONE AUDIT TRAIL

Prove

Who
CISO, internal audit, external auditors
Asks
Who approved this payment, and can you prove it?
Today
Hash-chained trail, verify and export, Auditor role built. Slack and Teams approvals next.

Operate

Who
Engineering and team managers
Asks
What are our agents doing, what do they cost, and what is waiting on me?
Today
Manager panel, org scoping, cost and usage built. Budget caps need a cost source the agent can’t fake.

Build

Who
Developers and platform leads
Asks
Can my agent merge, pay or delete without a person knowing?
Today
SDK, MCP gateway and Claude Code hook built. CI check code-complete.
Agent action guardrails

Every tool call, checked before it runs.

Databases, external communication, financial transactions — each classified the instant the call is made: let it through, hold it for a human, or block it outright. The check runs before the call does, in a fraction of a millisecond, which is what makes a held call one that has not happened yet rather than one you are reading about afterwards.

support-botread a customer recordCHECKED0.3 msTHE TOOL RUNS payroll-botchanges someone's bank detailsCHECKED0.5 msHELD FOR A PERSONthe tool has not run ops-crawlerdrops a database tableCHECKED0.2 msBLOCKEDit never ran at all The check happens before the call, not after it.
The real power

This is the engine, not a checkbox list.

What actually decides is a gate you write: a pattern to match, a condition that has to be true, an action to take when it is. Write one from scratch — templates are just a faster way to get to the same place.

A gate also says what happens when nobody answers. The default is deny, so nothing slips through because a reviewer was at lunch — but a gate may choose to allow instead, after a number of seconds it sets. That is the only way an unanswered call ends in allow, it is decided in advance, and the trail records it as the gate's decision rather than as a person's or as an expiry.

MATCH anything that changes payroll WHEN the amount is over $5,000 and the bank details changed THEN HOLD FOR A PERSON BLOCK IT If nobody answers, block it after 30 seconds. Something to match, something that must be true, something to do.
Starting points

Presets, so you're not starting blank.

Seven of them — database, network, financial, PII, shell execution, regulated actions, content moderation. Duplicate one and override what you need. The same picker you'd see in the product, and the same engine as the builder above, just pre-filled.

Database
Network / egress
Financial
PII / sensitive data
Shell / code exec
Regulated action
Content moderation
and more —
Shared audit log

A permanent record, hash-chained.

Every allow, hold, and deny — a timestamped entry whose hash covers its own fields plus the entry before it. Recomputing every hash from scratch is how tampering gets caught, not just a promise about the log.

Beside it sits a second record: who changed the org chart, a team, a member, an API key or the branding, who signed in, and who exported the trail. Administration is answerable too. Both are admins-only to read.

EVERY ACTION, IN ORDER 12,481 09:14:02BLOCKEDdrop a database table09:13:55ALLOWEDread a customer record09:12:31HELDpay a claim for $185,000Dana Whitfield09:11:47BLOCKEDflush the cache09:10:02ALLOWEDrefund $1809:08:44HELDchange bank detailsMarco Ilić09:07:19ALLOWEDlist storage bucketsnot checked09:06:50ALLOWEDlook up a claim Verify chain Export NDJSON + a second record: who changed the workspace
Cost & usage metrics

Spend, before it's an invoice.

Real token usage, read from wherever it actually exists — a local transcript, or reported directly by the agent itself — aggregated per agent and per model, not estimated after the fact, and carried forward over a month, a quarter or a year.

$0.94so far USAGE BY AGENTclaims-bot takes two thirds $3.02projected PROJECTED COST$0.94 measured, 31% in 387kprojected PROJECTED TOKENS120k measured, 31% in Nine days of thirty observed — real tokens, not an estimate.
Manager panel

Approvals scoped to who reports to whom.

Everyone signs in, and the org chart decides what they see: your own agents, plus everyone's below you. A manager gets their reports' fleet — what's running, what got denied, what's waiting on a decision — and approves or denies through the same engine and the same audit log as the main dashboard.

From here they can apply a gate across every agent the team runs in one action, closing off a class of risky calls instead of approving them one at a time. Worth building: only 7.2% of organizations name anyone formally accountable for agent behaviour (Gravitee, 2026).

Manager 2 agents4163 3 agents5849 restart a production service MANAGER APPROVES What their agents did, and the one call that needs you.
Roles & separation of duties

The person who audits never sees the queue.

Roles aren't a ladder with admin at the top. They're sets of powers, because the role an auditor needs cannot be expressed as a rung: they read the whole trail, which only an admin could, and they must never decide a held call, which almost everyone else can.

So an Auditor's dashboard has no approval queue — not hidden in the page, absent from the API and never streamed to them. Someone reviewing decisions after the fact was never in a position to influence them, and that is enforced by the server, not by a convention.

Every workspace also carries its own second record: who changed the org chart, a team, a member, an API key or the branding, who signed in, and who took the trail out of the system.

Inlock
Get in touch

Early access, feedback, or just a question.

No public release yet — this is where to hear about it first. A few lines is plenty; we read every one ourselves.

  • A walkthrough — twenty minutes, on your own agents if you want.
  • A sandbox of your own — a real workspace to point something at and watch it get stopped.
  • Just a question — answered without a call, if that suits you better.

Pre-release, and there is no sales team: whoever replies is the person who built it.