You put a human in the loop by making the agent stop before an action and wait for your yes: an "ask" rule in Claude Code, an approval policy in Codex, the write-action confirmation in ChatGPT, or an interrupt in your own agent code. Gate the actions you can't take back (sending email, posting publicly, spending money, deleting) and let reads and drafts run. The tradeoff is always the same: every prompt costs you a minute, and too many prompts teach you to click yes without reading. Docs checked 2026-10-27.
Which agent actions need your approval?
The ones that leave your account and can't be undone. A useful test is to ask what it would cost to reverse the action an hour later.
- Ask first: sending an email or DM, publishing a post or page, paying or committing spend, deleting records, inviting someone, changing anything a customer sees.
- Let it run: reading, searching, summarizing, drafting into a file or doc, creating a task for yourself.
- Gray zone: updating your CRM, scheduling a calendar event, editing a shared doc. Gate these while you're learning how the agent behaves, then loosen them.
For outreach, the line usually sits at "draft vs send". The agent can research and write a hundred emails. A person signs off before any of them go out. Our AI SDR post walks through that split for a sales setup, and the content workflow post does the same for publishing.
How do you make Claude Code ask before it acts?
Add an ask rule or keep it in Manual mode. Claude Code's permission docs define three rule types: allow rules run without approval, "Ask rules prompt for confirmation whenever Claude Code tries to use the specified tool", and deny rules block the tool. Rules are checked deny first, then ask, then allow, so an ask rule wins over a narrower allow rule.
MCP tools are named mcp__<server>__<tool>, so you can put an ask rule on one tool (say, a Gmail send tool) and leave the rest of that server open. The default mode, labeled Manual, "Prompts for permission on first use of each tool". acceptEdits auto-accepts file edits, plan explores without editing your source, auto replaces your prompts with a background classifier, and bypassPermissions skips prompts, which the docs say to use only in isolated environments like containers or VMs.
For anything more specific than a tool name, use a PreToolUse hook. It runs a script before the tool call and returns allow, deny, ask or defer, so you can inspect the actual arguments (the recipient, the amount) and decide. Hooks don't bypass your rules: a matching ask rule still prompts even when the hook returns allow.
If your team uses Claude connectors, Team and Enterprise owners can set each connector permission to Always allow, Needs approval or Blocked. That setting applies org-wide and individual users can't override it.
How does ChatGPT handle approvals?
For custom MCP tools, ChatGPT confirms write actions by default. On connectors added in developer mode, OpenAI's developer mode guide says "Write actions by default require confirmation". It treats any tool without a readOnlyHint annotation as a write. You can tell it to remember an approve or deny choice for one tool for the rest of a conversation, and a new conversation prompts again.
ChatGPT agent is no longer available; longer multi-step tasks now run in ChatGPT Work. Per the Work help article, when an action needs your approval you approve or decline it with on-screen controls, spoken approval isn't supported, and connected-app permissions and approval requirements still apply. The article doesn't list which actions trigger a prompt, so don't count on it to catch a specific send.
What are Codex's approval modes?
Codex pairs a sandbox with an approval policy. In the agent approvals and security docs, on-request runs commands inside the sandbox without asking and prompts for anything outside it, such as network access or edits outside the workspace. never turns prompts off. A granular policy keeps chosen prompt categories (MCP prompts among them) interactive and auto-rejects the rest. untrusted has been retired.
The part that matters for non-coding work: "Destructive app/MCP tool calls always require approval when the tool advertises a destructive annotation." So the tool's own metadata can force the prompt.
How do MCP tools signal that an action is risky?
Through tool annotations. The MCP schema defines readOnlyHint and destructiveHint (plus idempotentHint and openWorldHint). Clients like Codex and ChatGPT use them to decide when to prompt. The MCP tools spec adds two cautions: "there SHOULD always be a human in the loop with the ability to deny tool invocations", and clients "MUST consider tool annotations to be untrusted unless they come from trusted servers". A hint is the server's claim about itself, not a guarantee.
MCP also has elicitation, where a server asks the user for input mid-task and gets back accept, decline or cancel. It's built for collecting details, and servers must not use it to request sensitive information.
How do you add approval to an agent you build yourself?
Pause the run before the tool executes, save its state, and resume after a person decides. Two frameworks document this directly.
- OpenAI Agents SDK. Set
needs_approvalon a tool, eitherTrueor a function that decides per call. The run pauses with the pending calls ininterruptions; you callstate.approve(...)orstate.reject(...)and resume. The human-in-the-loop guide shows how to serialize that state to a database so approval can happen hours later, and warns that loaded snapshots aren't authenticated, so keep them on your server. - LangGraph. Call
interrupt()inside a node or tool. It saves state through a checkpointer and waits; you resume withCommand(resume=...). Per the interrupts docs, the resume value can approve, reject or replace the tool's arguments, so the reviewer can edit before it runs.
Which approach should a small team pick?
Pick the one that lives where your agent already runs, then add a dedicated layer only if prompts are landing in the wrong place.
| Mechanism | Where you approve | Can you edit before it runs? | Source |
|---|---|---|---|
| Claude Code ask rules and hooks | Claude Code session | Hooks can rewrite tool input | permissions, hooks |
| ChatGPT write-action confirmation | The ChatGPT conversation | Not documented | developer mode |
| Codex approval policy | Codex session | Not documented | approvals and security |
OpenAI Agents SDK needs_approval |
Your own app or queue | Approve or reject documented | Agents SDK |
LangGraph interrupt() |
Your own app or queue | Yes, via resume value | LangGraph |
The built-in prompts share one limit: you approve inside the session that's running the agent. That's fine when you're watching. It breaks when an agent runs on a schedule, or when the person who should approve a client email isn't the person running the agent.
That gap is why dedicated approval gates exist. Permission Slip sends agent requests to your phone and holds the credentials, so the agent never sees your tokens. withHuman intercepts tool calls from Claude Code and Codex hooks and agent SDKs, auto-approves routine calls by rule, and routes the rest to the right person. Both are open source. If you run several agents across tools, a gate that sits outside any one tool keeps the rules in one place.
Where does Tokenrip fit?
Tokenrip is a shared workspace your agents in Claude, ChatGPT, Codex and Grok connect to, and it gives you one place to approve what they want to do. When an agent wants to send, post or publish, it can ask first: it files a proposal in the workspace, and the proposal waits In review until you approve it, edit it or skip it. Your agent checks back, sees the decision, and does the work where it runs. Tokenrip runs none of the agents and sends nothing itself, so the approval sits with you and the action stays in the tool you already use. A teammate or a client you invite can decide proposals addressed to them, without sitting in your Claude session.
Connect me to Tokenrip. Fetch https://tokenrip.com/setup?ref=human-in-the-loop-ai-agents and follow it.