Connect OpenClaw and NanoClaw to Contro1
Connect OpenClaw and NanoClaw assistants to Contro1: one command per computer, owner approval, approvals for commands, and company apps over MCP.
Connect an agent
Run OpenClaw safely at work: an owner-approved identity per assistant, signed human approval before risky actions, no API key on the machine, one audit trail.
Updated Jul 20, 2026
OpenClaw can run shell commands, send email and spend money on its own. Contro1 lets a company say yes to it: every assistant has an accountable owner, risky actions wait for a signed human decision, and everything it did is on record.
Copy this skill link into your code agent to add OpenClaw and Contro1 to your system.
This page is about running OpenClaw at work once it is connected: where the risk lives, why the approval is a gate the assistant cannot bypass, the bridge and its settings, policy, and what one connection turns on.
The setup steps, with every command and what you should see, are on one page: install the Contro1 CLI, connect the OpenClaw agents, approve them as their owner, make OpenClaw stop for approval, start the bridge, and check it with contro1 doctor openclaw.
OpenClaw is an open-source personal AI assistant that runs on your own machine and answers you on the channels you already use: WhatsApp, Telegram, iMessage, Signal, Slack, Discord, and more. It is not a chatbot. It keeps persistent memory about you, your projects, and your people, it can browse the web, fill forms, run shell commands, manage email and calendar, and it can even write and improve its own skills. It works while you are asleep or at work.
That autonomy is the point, and it is also the risk. An assistant that can book, buy, deploy, delete, message people, and run code on your behalf will eventually reach an action you would not want it to take on its own authority. The question is not whether it is capable. It is which actions should stop for you, and how you know what it did when they did not.
Start with the case, because it is the one that actually happens. You run OpenClaw as your assistant. You give it access to your mailbox, because you message it privately and you want it to handle your email. That is exactly why you connected it.
OpenClaw answers on the channels you already use, and one of them is a group: a project with a client, a trip with friends, a team channel. Somebody in that group messages the assistant. It answers, and it has no way to know the person asking is not you. It performs the action with its own authority, so a request from the group and a request from your private thread look identical to it. Anyone in that group can now ask it what is in your mailbox.
No permission was changed and nothing was inherited. The assistant simply answered the channel it was on. This is the confused deputy problem, and it applies to any agent that more than one person can instruct while it holds standing access to one person's data.
Running OpenClaw on your own computer does not remove this. The bridge reaches it over a local socket as one operating system user, with no credential where the assistant could read it, and that is a real protection worth having. But it protects the credential, not the instruction surface. Who can reach the socket and who can message the assistant are different questions, and only the first is answered by running locally. An assistant on your own laptop can still be sitting in a group chat.
OpenClaw is free, installs in minutes and saves hours, so employees adopt it before anyone approves it. Security teams then find the same four problems on every machine.
Governing OpenClaw across your company · Secure your personal OpenClaw assistant
OpenClaw already pauses before risky host commands and can ask you in chat. That is the right mechanism, and this connector builds on it rather than replacing it. What a company needs on top is who decides, on what evidence, and for how many assistants.
| Question | OpenClaw on its own | OpenClaw with Contro1 |
|---|---|---|
| Who approves a risky action? | Whoever is watching that chat | The right role, with quorum, SLA and escalation |
| Can the approval be replayed for a different command? | OpenClaw binds the run plan | Also bound on the Contro1 side by a hash of the facts the reviewer saw |
| Which assistants exist, and who owns each? | Not tracked | Every assistant is a registered agent with an accountable owner |
| Where are credentials? | Usually a key in a file the assistant can read | Held by a local Contro1 service, never given to the assistant |
| Evidence for an audit or incident | Local metadata ledger | Durable, exportable record of every decision and autonomous action |
| A laptop is lost | Rotate every key it held | Revoke that one computer; the agent and its history stay |
Two things about OpenClaw cannot be enforced by this connector, and knowing which they are is worth more than a reassurance that covers them over.
FIRST: Contro1 cannot tell which conversation an instruction came from. OpenClaw answers on WhatsApp, Telegram, iMessage, Signal and Slack, any of which can be a group. The bridge sees an approval, not the channel it started in, and the fields an approval does carry (sessionKey, host, cwd) are best-effort projections that the CLI sanitizes, which is why this connector never makes a security decision from them. Nothing here can be scoped to "only when I ask in my private chat". An assistant that can use an account can be asked to use it by anyone who can reach the assistant.
SECOND: Contro1 cannot tell who is on the other end. There is no sender identity in the approval surface at all. A request from a colleague, from a client in a shared channel and from you look identical by the time they reach a reviewer.
So an OpenClaw assistant is treated as reachable by people Contro1 cannot name, and personal accounts are refused to it unless its owner allows that by name. Set CONTRO1_OPENCLAW_REACH=private when you know the assistant has no chat channels wired up. That is a claim with a person behind it, which is worth more than an inference with nobody behind it, and it stays visible in the record.
What this connector does enforce is unaffected by any of the above: a command stops before it runs, a named person decides, the decision is bound to the exact command by a hash that is recomputed before it is applied, and the whole exchange is recorded. That is a different guarantee from knowing who asked, and it is the one on offer.
This connector puts a governance layer around OpenClaw without slowing down the assistant. It does two jobs.
First, it turns the assistant's sensitive actions into signed, role-routed human approvals. OpenClaw already knows how to stop before a risky host command; the connector routes that decision to Contro1, waits for a signed answer, verifies it, and only then lets the action run. Second, it gives you a durable audit trail: every approved, denied, and auto-allowed action, plus - through an agent-side skill - the autonomous actions the assistant took that never needed an approval at all.
If you already talk to your assistant in WhatsApp, routing approvals somewhere else can look like a step sideways. It is not, and the reason is the nature of the work. OpenClaw runs in the background and takes many small actions on its own. You do not want a chat ping for each one, and you should not have to babysit the thread to stay safe.
What you actually want is two different things at once: to be interrupted only for the few actions that genuinely need an accountable, signed decision, and to have a complete record of everything else it did while you were busy. A chat reply is a casual "ok". A Contro1 approval is a signed, time-stamped, role-attributed decision with evidence attached - the right instrument when the action moves money, changes access, or cannot be undone. The two are not the same tool, and high-stakes actions deserve the stronger one.
A dedicated review surface also scales in a way a chat thread cannot. If you run more than one assistant - or a team runs several - WhatsApp gives you one noisy thread per assistant. Contro1 gives you one queue for all of them, with routing so the right owner gets the right decision and coverage so nothing waits on a single person being online.
OpenClaw is self-hosted, so it is normal to end up with several: one per person, one per project, one per device. Each one is autonomous, and each one occasionally needs a human.
Point every instance's bridge at the same Contro1 organization and their approvals land in one queue. A single reviewer, or a rota, can clear approvals from all of them, and role routing sends a finance action to finance and a deploy to platform no matter which assistant raised it. Evidence for every instance is searchable in one place, which is what an auditor or an incident review actually needs.
A guardrail that lives in the prompt is a suggestion: a capable, self-improving agent can reason its way around an instruction. This connector does not rely on instructions. OpenClaw enforces exec approvals out-of-process, on the execution host itself - the openclaw process on the gateway machine, or the companion app on a node. The model that decides to run a command is not the thing that runs it. It can only request; the host holds the gate.
Because enforcement is external, the way to make it truly unbypassable is to deny the assistant any authority to loosen it. Three rules do that, and they are all things you configure once:
contro1 connect openclaw finds the OpenClaw agents on the computer, shows what it is about to change, and asks the accountable owner to approve them. The owner sees the same short code, every agent by name, and exactly what each one will be allowed to do.
Nothing works before that approval, and no key is ever copied. It installs a small Contro1 service on the computer that keeps each assistant's key and gives each assistant its own private local endpoint, and writes a mapping file of agent to endpoint. The bridge talks to those endpoints and never holds a Contro1 credential.
It also gives each agent its own Contro1 MCP server, named contro1-<agent id>, with tool rules so each agent sees only its own server, and writes the bridge settings file ~/.openclaw/contro1.env, which tells the bridge where the mapping file is.
1 · On the computer
Finds the OpenClaw agents, previews the local changes and shows a short code.
2 · In Contro1
One screen: the code, each agent by name, and what they can and cannot do.
3 · On the computer
The Contro1 service holds the keys; the bridge only receives a per-agent mapping.
A connection starts at Approvals only: the assistant can ask people for approval and report what it did, and nothing else. It cannot use the organization's applications until the owner deliberately enables that later, on the agent's page.
The approval is time-limited (90 days by default) and renewals are grouped: when nothing about a set of connections changed, the owner renews all of them on one screen. A connection that did change, for example one that gained application access, is reviewed on its own.
| Mode | The assistant can | The assistant cannot |
|---|---|---|
| Approvals only (default) | Ask people for approval, report what happened | Use organization applications |
| Approvals + applications | Also use the applications it has been granted | Anything it has not been granted, or approve its own requests |
The bridge is the small server in the connector repo, examples/typescript, and starting it is a step in the connect page. It runs on the host that runs OpenClaw, as an OpenClaw operator client outside the gateway process, and as the same operating-system user that ran contro1 connect, because the local endpoints refuse anyone else. It reaches Contro1 through the local Contro1 service.
By default the bridge polls Contro1 for each decision, so it needs no inbound HTTPS. It re-reads the decision and only then resolves the approval in OpenClaw. A signed webhook callback to PUBLIC_BASE_URL/contro1/callback remains available when a public URL is intentionally configured.
The bridge can only govern actions OpenClaw stops for. OpenClaw exec mode has five values: deny, allowlist, ask, auto, and full. Set it to ask, or to auto with a conservative allowlist, so misses pause instead of running.
Then keep the fallback closed. When a prompt is required but no approver is reachable, askFallback decides what happens: deny, allowlist, or full. Keep it deny so an unreachable bridge means the action is denied, never run. This single setting is what makes the approval a gate rather than a suggestion. The cautious preset sets all of this in one step: an allowlist, ask on a miss, and askFallback deny.
Commands on the allowlist run without asking anyone, so they never reach Contro1. And by default OpenClaw lets an assistant save and rewrite its own skills; turning skills.workshop.autonomous.mode off stops that. Both commands, openclaw exec-policy preset cautious and the skills setting, are steps in the connect page.
The connector ships two skill files, and they do different jobs. The contro1-openclaw skill is the build guide for whoever sets up the bridge. The contro1-approvals skill installs into the assistant's own skills directory and teaches it the cooperative behavior: how to give a reviewer clear, factual context when an action needs approval, and to POST a short audit note to the bridge after each autonomous action.
Be clear about the split. The agent-side skill improves quality and completeness - good context, honest logging. It is not the enforcement. A well-behaved assistant follows it; an adversarial one cannot escape the approval path either way, because that path does not trust the assistant to call anything. Enforcement is the host guardrail; the skill is the good manners on top.
The bridge governs the actions OpenClaw already stops for - host shell commands and existing plugin approvals. An optional companion plugin extends that to any sensitive tool call the assistant makes: sending an email, buying something in the browser, deleting a file, deploying. Those pause for a human too, not just shell commands.
Install it from ClawHub, OpenClaw's registry, and pair it with the bridge. It is free up to 2,500 approval requests per month.
Use OPENCLAW_TRANSPORT=mock to see the Contro1 side without wiring a real gateway: you POST an approval to /mock/approvals as if OpenClaw had raised one, and watch it arrive in the Contro1 queue. The bridge still needs a connection, so run contro1 connect openclaw first; there is no mode that sends requests without an owner-approved identity.
Switch to OPENCLAW_TRANSPORT=cli against a real gateway once the operator token and exec mode are set.
An approval is permission for one exact action, not a standing licence. OpenClaw enforces this on its own side: it stores the canonical systemRunPlan at approval time and rejects a forwarded run whose command, cwd, agentId, or sessionKey changed after approval. It even re-binds a script to one concrete file and denies the run if that file changed after approval.
The bridge mirrors that rule on the Contro1 side. It hashes the machine-observed facts the reviewer saw, and before resolving an approved decision it re-reads the approval and re-checks the hash. Any drift, or an approval that is no longer pending, is a hard denial.
Policy classifies each approval from machine-observed facts only: the command OpenClaw captured, the agent id, and the session key. Text the assistant authored about its own intent is never consulted for a security decision.
| Decision | Default behavior |
|---|---|
| Auto-allow | Only when an operator-configured auto-allow pattern matches and the session is not production. Nothing is auto-allowed out of the box. |
| Require approval | Every plugin/system-agent approval, every production-session command, and any sensitive shape: pipe-to-shell, sudo, ssh, cloud CLIs, kubectl, terraform apply/destroy, docker run/exec, git push, npm publish, chmod 777, secret/.env/.ssh access. |
| Block | Before a reviewer sees them: rm -rf /, fork bombs, mkfs, dd to a device, and unknown agents when an allowed-agent list is set. |
The connector emits audit-first event names so security, operations, and compliance can search the full timeline - both the approvals and the assistant's self-logged autonomous work.
The MCP server grants nothing of its own. It is the Access page seen from wherever the call is coming from: the same grants, the same policy, the same refusals. Whoever is calling, not whoever is asking - an agent sees its own permissions, a coding assistant sees the permissions of the person who approved it.
Connecting is one thing, and it gives you two surfaces through the same credential: approval requests, and the Contro1 MCP server. They are not separate connections and there is no second key.
What the MCP server offers, though, depends on what the connection is allowed to do. An approvals-only connection carries requests:create, requests:read, requests:wait, requests:cancel_own and audit:write. The agent can identify itself, raise approval requests and write audit records. It has no invoke_action at all, so it cannot read a mailbox, and refusing to is the correct answer rather than a fault.
When the owner allows applications, the same connection gains actions:read, actions:preview, actions:execute, connections:read and skills:read. Same key, same endpoint, larger tool set. Nothing is reconnected and nothing is reissued.
That pattern is the whole design, and it holds for every caller. There is one MCP address, one tool catalog, and a gate that decides what each caller may reach: what changes between an agent on a connection and a person who has connected a coding assistant is not the endpoint or the list, it is the credential and therefore how far it may go. An agent acts as itself, with its own permissions. A coding assistant acts as the person who approved it, never with more than that person already has, and only if they approved running actions specifically. Neither can be widened by pointing at a different URL, because there is not one.
The third thing is the one people assume comes free with connecting, and it does not: a connection does not put Contro1 in the approval path. That also needs OpenClaw to stop for the command (the cautious exec policy) and the bridge running. Until both are true the connection is live and no approval is ever routed.
The bridge governs what OpenClaw stops for. To let an assistant use company applications such as mail, calendar or tickets, it uses the Contro1 MCP server. Contro1 then decides which application actions the assistant may use, asks a person where your policy says so, and records every call.
connect already gave each agent its own server, contro1-<agent id>, through OpenClaw's own configuration commands, and tool rules so each agent sees only its own. To give an agent applications, open it in Contro1, allow applications for its connection, and choose what it may use. The same server then lists those Actions: nothing is reconnected, and the assistant acts as the agent you approved rather than as you.
OpenClaw expires a pending exec approval after 30 minutes by default, then denies the waiting command. The bridge sets the Contro1 request expires_at to the approval's own expiry, so a reviewer is never asked to approve something OpenClaw has already given up on. For high-value actions, use Contro1 role routing, quorum, and SLA escalation to make sure a decision lands inside that window.
The bridge reaches OpenClaw through the documented openclaw approvals CLI by default. A direct Gateway WebSocket transport would subscribe to exec.approval.requested and resolve via approval.resolve, learning about approvals the instant they are raised.
That transport ships as a preview and is intentionally not implemented: the connect handshake requires signing the gateway challenge with the device-auth v3 payload from @openclaw/gateway-client, and that package was not published when the connector was built. It is now on npm (2026.9.4), so the transport can be built on the official client, but it is not implemented yet. The connector does not guess at an authentication payload, so the CLI transport remains the supported path.
Beyond the approval call, attach a run trace, the tools you invoked, and the context you retrieved. Each field is optional; add what you have. Identity always comes from your credential. When a named part of a multi-agent system made the call, say which with the Contro1-Sub-Agent header (as_sub_agent in the SDKs): Contro1 registers it under this agent, and it never has more authority than this agent.
The signed webhook is cryptographic proof of a human decision. Verify it inside the system that executes the action - not inside the agent. Any tool that must never run without human sign-off (payments, deploys, data deletion) should refuse to act without a verified approval; that way no agent, including shadow agents nobody registered, can trigger it by skipping Contro1.
The connector creates the runtime gate. The operating model around it defines which actions pause, which owner receives the decision, how a timeout escalates, and where the outcome is recorded across agent frameworks.
runtime human approval for AI agents · enterprise AI agent control plane
It can be, if three things are true: every assistant has a known, accountable owner, risky actions cannot run without a human decision that the assistant itself cannot give, and there is a record of what it did. OpenClaw provides the stopping point on the host. Contro1 adds the owner, the signed decision, the credential handling and the audit trail.
Assume it will happen and make it harmless. An injected instruction can make the assistant ask for a risky action, but the approval is enforced on the host and decided by a person in Contro1, bound to the exact command. Keep askFallback at deny, keep policy files out of the assistant's workspace, and never put a key where the assistant can read it. Contro1 classifies risk from machine-observed facts, never from text the assistant wrote about itself.
Nowhere the assistant can reach. contro1 connect openclaw creates a key on the computer that the local Contro1 service keeps, and the bridge only receives a mapping to a local endpoint. There is no API key to paste into .env, and the bridge refuses to start if one is present.
Each connected assistant is a registered agent in Contro1 with an owner, the computer it runs on, when it was approved and when it was last used. Readiness and connections are shown per agent, and contro1 status openclaw shows the same checks on the computer.
Revoke that computer's connection in Contro1. Its tokens stop working immediately, and because they last five minutes and only work with the key on that laptop, nothing copied from it keeps working. The agent, its owner and its history are kept, so reconnecting a replacement is one command.
Because the assistant works in the background and takes many actions on its own. You want to be interrupted only for the few that need an accountable, signed decision, and to have a durable audit of everything else. A chat reply is a casual ok; a Contro1 approval is signed, role-routed, and evidence-bearing. It also lets one reviewer handle approvals from many assistants in a single queue. A native WhatsApp approval surface is on the roadmap; the value of signed approvals and audit is the same either way.
Enforce it outside the model. OpenClaw runs exec approvals on the execution host, so the assistant can only request a command, not run it around the gate. Then remove its authority to loosen the rules: keep the host approvals file out of its workspace, require operator.admin for config changes (which its session should not hold), turn skills.workshop.autonomous.mode off so it cannot save or rewrite its own skills, keep askFallback at deny, and let the bridge - not the assistant - hold the OpenClaw approvals token.
Yes. Approved, denied, auto-allowed, and blocked actions are all recorded. The contro1-approvals skill additionally teaches the assistant to POST a short audit note after each autonomous action, so background work that never needed an approval is captured too - in a durable, exportable trail beyond OpenClaw's own 30-day metadata ledger.
No. It runs as an external operator client outside the gateway. OpenClaw native plugins run in-process and are not sandboxed, so an approval control inside a plugin would have gateway-wide blast radius. The bridge only needs an operator token scoped to approvals.
It was built against OpenClaw stable v2026.7.1, and the openclaw approvals commands the default CLI transport uses are unchanged in the v2026.9.4 documentation. Since v2026.8.1 allow-always grants are directory-bound; the bridge resolves with allow-once by default. The gateway WebSocket transport is still a preview and not implemented.
Connect OpenClaw and NanoClaw assistants to Contro1: one command per computer, owner approval, approvals for commands, and company apps over MCP.
Take NanoClaw from one admin DM to a team: credential use, package installs, MCP servers and new agents go to the right reviewer, with an owner and audit trail.
Use Contro1 audit records to log actions that agents are authorized to run autonomously, and correlation_id to connect requests and logs into one case timeline.
What OpenClaw guardrails already give you, where they stop, and how the Contro1 connector adds role routing, quorum, SLA escalation, and signed audit evidence. The mechanics behind securing OpenClaw, whether it is your own assistant or a whole team.
Learn when AI agents should require human approval, what actions should stay gated, and how to design HITL for production workflows.
Compare the best AI agent control plane tools for 2026, including Contro1, Microsoft Agent 365, Galileo Agent Control, ValidMind, Permit.io, and observability platforms. See what each layer controls before an agent acts, from MCP and API access to human approvals and agent skills.