Skip to main content
CTRLRun works with agents you can’t modify as well as the ones you can, because it checks the action, not the agent. A WhatsApp, Slack or Teams bot, Claude Code, Cursor or Codex, a ChatGPT connector, a no-code builder: if the agent’s actions reach a tool server or an API you run, CTRLRun sits at that point and decides each one before it runs. The agent is not rebuilt, redeployed or told. That is the principle: autonomy belongs to the action, not the agent. If you own the agent’s code, Three ways in covers it.

Which agents does this cover?

It depends on where the action goes, not on who built the agent. The first two cover most business agents. The third is the one to check before you plan.

Which agents, by name?

Any AI agent you have. An unlisted tool is covered like the row it resembles.

How do I put the gateway in front of a hosted agent?

Point the agent’s connector at the gateway instead of at the tool server. The gateway decides every tools/call against your policy and relays everything else untouched. The command is an illustration; the hostnames are invented.
Three things change when the agent runs on a vendor’s servers rather than yours:
  • The gateway must be reachable from outside. It listens on loopback unless you pass --allow-remote, and it speaks plain HTTP, so put HTTPS in front of it.
  • Name who is acting. --principal fixes one name for a single bot. --identity-jwt takes the agent from a verified bearer token when several bots share one gateway.
  • A refusal is an answer the agent can read. A deny comes back as ctrlrun.denied, an approve as ctrlrun.approval_required. Once a person grants it, the identical call goes through, and a changed one does not.
A coding agent on your own machine is simpler: the gateway stays on loopback and the agent’s MCP config points at it. The walkthrough, policy included, is Put the gateway in front of MCP.

How do I protect an API the agent calls?

Decorate the function that acts. You change your backend, not the agent: whichever bot called the endpoint, the refund is decided before it leaves. The provider call is elided.
The same holds for crm.update_record behind a webhook step, or email.send behind a custom action. Protect a function has the version that runs.

What about the platform’s own built-in actions?

When a platform’s agent uses the platform’s own tool, the call starts and ends inside the platform. Meta AI sending a WhatsApp message never touches anything you run, so nothing you run can check it, CTRLRun included. The way to a yes is to move the capability, not to intercept it:
  1. Take the built-in away. Turn off the native action, or run the agent under an account with no write access to the system that matters.
  2. Give it back as your tool. Add the same capability as a custom action or connector that points at the gateway or a protected endpoint.
  3. Now there is one way through, and it is checked.
Whether a platform allows both halves is a fact about that platform. Consumer assistants usually allow neither.

What this page does not claim

  • A platform’s audit log is not control. A record of what already happened cannot keep an action to at most once and exactly as approved.
  • One path has not been run end to end yet: a hosted client, through a public gateway, to a tool server that requires OAuth. Whether a strict client accepts a login discovery document naming the server rather than the gateway is open; the roadmap records it.

Next