Key takeaways
- Check every tool call in code the model can’t change, and deny the call when that check fails.
- Copilot Studio runs a tool when its external security check misses a one-second budget, unless set to block.
- A Claude Code PreToolUse hook that times out or crashes doesn’t block the call unless onFailure is block.
- OpenAI’s tool guardrails skip hosted tools, the shell and handoffs, so back them with scoped credentials.
- Claude Code users approved about 93% of permission prompts. Ask people only about irreversible or high-value actions.
To block AI agent actions in real time, check each tool call after the model proposes it and before your code runs it. Put that check somewhere the model can’t edit, and make it deny the call when the check itself errors or times out. Claude Code hooks, the OpenAI Agents SDK’s tool guardrails and approvals, LangGraph interrupts and MCP gateways all give you that moment, and each sees only part of what an agent can do.
The defaults need a careful read. Copilot Studio runs a tool if your security endpoint hasn’t answered within one second, unless an admin changes the setting.1 A Claude Code hook that times out doesn’t block the call it was written to check.2
This guide covers where a check can sit, what each mechanism can and can’t block as of 30 October 2026, and how to decide what to block automatically and what to send to a person.
Four places to block AI agent actions in real time
Every action an agent takes passes four points where you can stop it or limit the damage, and each point sees something different.
Before the tool call. The agent runtime holds the tool’s name and full arguments before anything runs, so a hook or middleware there can deny the call, change its arguments or pause it for a person. It sees only the tools that runtime executes, and once it lets a shell command through, it has no view of what the command does.
At the tool or API boundary. A gateway or proxy between the agent and its tools applies one policy to every agent and framework that routes through it, out of reach of the agent’s code. An MCP gateway sees only MCP calls, and an egress proxy only outbound connections. In February 2026, Anthropic’s red team phished an employee into running a prompt that told Claude Code to read AWS credentials and send them to an outside server, and Claude did so in 24 of 25 attempts. Anthropic concluded that only egress controls and filesystem boundaries hold against an attack like that.3
At the credential layer. A credential scoped to the task makes out-of-scope calls fail at the API, whatever route the agent takes. Stripe recommends restricted keys for any key you give an AI agent, GitHub App installation tokens expire after an hour, and an AWS STS session can be as short as 15 minutes.456 Credentials are coarse, though. They can’t say that refunds above £50 need a person.
After the call. Audit logs, alerts and rollback decide how fast you notice and how much you can undo. Claude Code’s checkpoints restore files its editing tools changed, and they don’t track files changed only by shell commands.7 A sent email or a payment can’t be rewound at all. When a poisoned tool result steers an agent into sending data out, Anthropic notes, “the log just shows a successful, authorized API call”.3
Our containment lessons cover egress allowlists and per-run credentials in depth, so the rest of this post concentrates on the first two layers.
AI agent guardrails compared, as of 30 October 2026
Each row comes from the vendor’s documentation as of 30 October 2026. The fifth column shows where a failed or slow check lets the call through.
| Mechanism | When it runs | What it sees | What it can do | Where it can fail open | Blind spots |
|---|---|---|---|---|---|
Claude Code PreToolUse hook |
Before every tool call | Tool name and full input | Allow, deny, ask, defer, rewrite the input | A crash or timeout passes the call to the normal checks unless onFailure is "block"; default timeout 600 s |
Files added with @ mentions; what a command does once it runs |
| Claude Code permission rules | Before every tool call | Tool name, command text, paths, domains | Deny, then ask, then allow | Static rules, nothing to fail | The same program in another form, such as /usr/bin/curl or sh -c |
Claude Agent SDK hooks and canUseTool |
Before every tool call | Tool name and input | Allow, deny, ask | A PreToolUse callback that times out blocks the call |
canUseTool never sees calls an allow rule or the mode approved |
| OpenAI Agents SDK input guardrail | Alongside the first agent, by default | The user’s input | Trip a wire that halts the run | Runs in parallel by default, so tools may run before it trips | Tool calls; agents reached by handoff |
| OpenAI Agents SDK tool guardrail | Around each guarded function tool | Arguments, then output | Allow, reject with a message, halt the run | Runs in your code, on your timeouts | Hosted tools, shell, computer use, apply_patch, handoffs |
OpenAI Agents SDK needs_approval |
Before the tool runs | Parsed arguments | Pause the run for approve or reject | Arguments it can’t parse go to manual approval | Approval doesn’t make the call run only once |
| LangChain human-in-the-loop middleware on LangGraph | Before listed tools | Arguments, through a when predicate |
Approve, edit, reject, respond | The run waits in the checkpointer until resumed | respond reads to the model as a successful result |
Google ADK before_tool_callback |
Before each tool | Arguments | Run the tool, or replace its result | Runs in your code, on your timeouts | Any returned dict, even {}, becomes the tool’s result |
| agentgateway | On MCP traffic through the gateway | Tool, target and JWT claims; processors see full parameters | Hide tools, reject calls, mask fields | CEL processors fail closed; remote ones too, unless set to failOpen |
Anything that isn’t MCP through the gateway |
| Policy in Amazon Bedrock AgentCore | On calls through an AgentCore Gateway | Identity, tool, input parameters, session history | Permit or forbid, with default deny | LOG_ONLY mode logs decisions and blocks nothing |
Calls that don’t go through the gateway |
| Copilot Studio external threat detection (preview) | Before each tool call under generative orchestration | Planned inputs, planner reasoning, earlier tool outputs | Allow or block | The tool runs after 1,000 ms or an error, unless set to block | Classic agents; each environment is set up separately |
| Scoped, short-lived credentials | At the API being called | Whatever the API checks | The API refuses the call | Nothing to fail | Anything the credential does allow |
Sources: Claude Code and Agent SDK docs,28910 OpenAI Agents SDK docs,1112 LangChain and ADK docs,1314 agentgateway docs,1516 AWS docs,1718 and Microsoft Learn.191
Claude Code hooks and permission rules
Claude Code checks each tool call in two layers before it runs. Permission rules are evaluated deny first, then ask, then allow, so a narrow allow rule can’t carve an exception out of a broad deny.8 A PreToolUse hook receives the tool name and full input as JSON once Claude has written the call, and can allow it, deny it, ask the user, defer it in headless runs or rewrite its input.2 A hook’s allow never overrides a deny or ask rule, and a hook that blocks stops the call before allow rules are checked.8
Three details decide whether a hook works as a gate. A command or HTTP hook that times out or crashes on PreToolUse doesn’t block the call, which carries on through the normal permission flow, and the default timeout is 600 seconds. Exit code 1 is a non-blocking error, so a policy script should exit 2 or return deny. Since v2.1.295, onFailure: "block" turns a crash or timeout into a block, and v2.1.312, from 27 October, was the latest release on 30 October 2026.220 The Claude Agent SDK works the other way round, and a PreToolUse callback that times out blocks the call.9 Its canUseTool callback never sees calls an allow rule or the permission mode already approved, so put the checks you rely on in a hook.10
This project settings file denies two things, asks before any tool from a payments MCP server, and sends every tool call to a policy service you run. The service replies with the same JSON a command hook prints, such as a "deny" decision with a reason Claude sees. If it is down, returns an error or takes more than five seconds, the call is blocked.
{
"permissions": {
"deny": ["Bash(git push *)", "Read(./.env)"],
"ask": ["mcp__payments__*"]
},
"hooks": {
"PreToolUse": [
{
"matcher": "*",
"hooks": [
{
"type": "http",
"url": "http://localhost:8080/policy/pre-tool-use",
"timeout": 5,
"onFailure": "block"
}
]
}
]
}
}
Rules match the text Claude writes. Anthropic’s docs show a Bash(curl *) deny rule missing /usr/bin/curl and sh -c 'curl ...', and state that such a rule isn’t a security boundary around the program.8 The sandbox covers that gap for shell commands with a proxy that checks each host against an allowlist, though WebFetch, local MCP servers and hooks run outside it.21 The settings files that hold hooks can also be planted by an attacker, as our post on agent config files that run code shows.
OpenAI Agents SDK guardrails and tool approval
OpenAI’s Agents SDK has three mechanisms, and two of them act on tool calls.11
- Input guardrails check the user’s message, in parallel with the agent by default, and the docs warn that the agent may already have executed tools when a tripwire stops it.
run_in_parallel=Falsemakes the guardrail finish first. Input guardrails run only for the first agent in a chain and output guardrails only for the last, so neither checks a tool call made after a handoff. - Tool guardrails wrap function tools and can allow a call, replace its result with a message to the model, or halt the run. They don’t run for hosted tools such as web search, code interpreter and hosted MCP, for the shell, computer use and apply_patch tools, or for handoffs.
- Approvals pause the run.
needs_approvaltakesTrueor a function of the parsed arguments, and a call with arguments the SDK can’t parse goes to manual approval. You approve or reject each pending interruption and resume from a storedRunState.12
Two details matter for anything that pays or sends. Approval doesn’t make a call run exactly once. If the process stops after the tool acts and before the state is saved, resuming can run it again, and OpenAI’s example is a payment, so it recommends an idempotency key that the destination enforces. The shell and apply_patch tools also need no approval unless you set needs_approval, and an always_approve decision for them can carry over to another agent’s shell after a handoff.12
The sketch below combines a hard ceiling, a review threshold and an idempotency key, written against v0.24.0 of the Python SDK, released on 15 October and still the latest on 30 October 2026.22 With pre_approval_tool_input_guardrails=True, the ceiling is checked before anyone is asked to approve, so no reviewer sees a refund the policy would refuse.11
import json
from agents import (Agent, RunConfig, Runner, ToolExecutionConfig,
ToolGuardrailFunctionOutput, function_tool, tool_input_guardrail)
from agents.tool_context import ToolContext
CEILING_GBP = 500 # refused outright, whoever approves
REVIEW_GBP = 50 # a person approves anything above this
@tool_input_guardrail
def refund_ceiling(data):
args = json.loads(data.context.tool_arguments or "{}")
if float(args.get("amount_gbp", 0)) > CEILING_GBP:
return ToolGuardrailFunctionOutput.reject_content(
f"Refunds over £{CEILING_GBP} go to the finance team. Tell the customer.")
return ToolGuardrailFunctionOutput.allow()
async def needs_review(_ctx, params, _call_id) -> bool:
return float(params.get("amount_gbp", 0)) > REVIEW_GBP
@function_tool(needs_approval=needs_review, tool_input_guardrails=[refund_ceiling])
async def issue_refund(ctx: ToolContext, order_id: str, amount_gbp: float) -> str:
"""Refund part or all of an order."""
# payments is your client; one key per tool call lets it drop a repeat
return await payments.refund(order_id, amount_gbp, idempotency_key=ctx.tool_call_id)
async def main():
agent = Agent(name="Support", tools=[issue_refund])
config = RunConfig(tool_execution=ToolExecutionConfig(pre_approval_tool_input_guardrails=True))
result = await Runner.run(agent, "Refund order 1042 in full", run_config=config)
for item in result.interruptions: # refunds waiting for a person
print(item.name, item.arguments)
LangGraph interrupts and human approval for AI agent actions
LangChain’s HumanInTheLoopMiddleware, which runs on LangGraph, pauses before the tools you list and lets a reviewer approve, edit, reject or respond to each call.13 Since langchain 1.3.3, a when predicate can decide from the arguments, so a SELECT runs unattended while a DELETE waits. Paused runs live in a checkpointer, which the docs say should be a persistent one, such as Postgres, in production.
The docs flag two traps. A respond decision reaches the model as a successful tool result, so denying a side-effecting call with it reads as if the action happened, and reject is the decision for a denial. Heavy edits to the arguments can also make the model re-plan and call the tool again.13 LangGraph resumes an interrupted node from its first line, so a side effect placed before interrupt() repeats.23 Our framework comparison covers where each framework keeps runs that wait days for an approval.
ToolCallLimitMiddleware caps calls per run and per thread. By default it blocks the extra call with an error message and lets the model carry on, so set exit_behavior="error" when the limit should stop the run.24 Google’s ADK has a trap of its own. A before_tool_callback that returns any dict, even an empty one, skips the tool and hands that dict to the model as the result, so make the dict say the call was blocked and why.14
AI agent policy enforcement at the tool boundary
The MCP specification says a human should always be able to deny tool invocations, and that clients should show tool inputs to the user before calling a server. Servers must validate inputs, enforce access control and rate-limit tool calls, and clients must treat tool annotations as untrusted unless the server is trusted.25 Enforcement is left to the server or a gateway in front of it. On an MCP server we built for a fashion commerce platform as part of our AI engineering work, third-party clients get the store’s assistant with its order-placing actions switched off, enforced on the server, as our write-up describes.
agentgateway, an Apache-licensed proxy for agent and MCP traffic, reached v1.7.0 on 27 October 2026.26 Its mcpAuthorization rules allow tools by name, target server and the caller’s JWT claims, and remove denied tools from tools/list so the model never sees them. Those rules can’t read a call’s arguments.15 Its guardrail processors can, before the call is forwarded. Expression processors fail closed when the expression errors, and remote processors, which call a policy service you run, fail closed unless set to failOpen.16 Added to a route’s policies, this blocks email to outside domains and sends every other call to your service.
mcpGuardrails:
processors:
- kind: expression
methods:
tools/call: request
condition: >-
mcp.params.name == 'send_email' &&
!(has(mcp.params.arguments) && has(mcp.params.arguments.to) &&
mcp.params.arguments.to.endsWith('@example.com'))
reject: "This agent can only email example.com addresses"
- kind: remote
host: "localhost:9001"
failureMode: failClosed
methods:
tools/call: request
Policy in Amazon Bedrock AgentCore, generally available since 3 March 2026, checks every tool call through an AgentCore Gateway against Cedar policies. It denies by default, a forbid beats any permit, and conditions can use the caller’s identity and the call’s input parameters.2717 Temporal policies, written in the Cedar-compatible Dogwood language, add conditions on the session’s history, such as a prior approval within a time window, a count of earlier calls or a running total.28 In LOG_ONLY mode every call succeeds whatever the policies say, and anyone with bedrock-agentcore:UpdateGateway can switch a gateway to that mode or remove its policy engine.18
Copilot Studio can send each planned tool call, with its inputs, the planner’s reasoning and earlier tool outputs, to an external threat detection endpoint that answers allow or block.19 The endpoint has 1,000 ms. On a timeout or an error the tool runs, unless an admin sets the environment’s error behaviour to block. The feature is in preview, applies only under generative orchestration and is set up one environment at a time.1 Microsoft Defender offers a managed version whose default rule only audits, while custom rules block four threat types, including secret exfiltration and email to unsafe domains, before the action runs.29
Failure modes: workarounds, injected tool output, approval fatigue and latency
Agents route around a block. Each mechanism covers one route. A Claude Code deny rule matches command text, OpenAI’s tool guardrails skip the shell, and an MCP gateway sees only MCP. Our post on agents that work around limits shows Claude models finding another route when a tool refused them. Pair each per-tool rule with a control that covers every route, such as an egress allowlist or a credential that can’t do the forbidden thing.
Instructions arrive in tool output. A web page, an email or an API response can carry text that steers the next call. Anthropic treats tool output as an attack surface even when the tool is trusted, and its products route tool calls through proxies that can inspect results before the model sees them, using a small, fast classifier.3 OpenAI’s tool output guardrails, agentgateway’s response-phase processors and Defender’s checks on tool responses sit at the same point. Once an agent has read untrusted content, send its next payment or outbound message to a person.
Approval fatigue. Anthropic’s telemetry showed Claude Code users approved about 93% of permission prompts, and Anthropic says attention fell as the approvals piled up.3 Its OS-level sandbox cut prompts by 84%. Its auto mode classifier catches about 83% of overeager actions, so about 17% get through, and it blocks about 0.4% of harmless commands. These are Anthropic’s own figures. Ask people about fewer things, and show them the exact arguments, destination and amount.
Latency budgets. A synchronous check sits on every call it covers. As an assumption for scale, a model-based check that adds 700 ms to each of 40 tool calls adds 28 seconds to a task. Rules on names, arguments and counts cost far less, so run them on every call and keep model-based checks for calls that write, send or pay. OpenAI’s parallel input guardrails save that time at the cost of tools running before the check finishes.11 Set every timeout to deny, or the check stops protecting you whenever the policy service is overloaded.
A policy design checklist
- Allowlist tools per task. Give each agent only the tools its task needs. A denylist fails on the first action nobody thought to list.
- Check parsed arguments. Validate recipients, domains, amounts, paths and SQL as structured values. Anthropic’s docs call argument patterns in Bash rules fragile.8
- Limit rates and spend. Cap calls and money per run, per session and per day, with running totals in your own store. AgentCore’s temporal policies and LangChain’s call-limit middleware help within their scope.
- Start in dry-run mode. Default each write path to a dry run that returns the exact request it would send, with live mode behind a server-side setting. 9io Alpha, our trading research platform, starts every order path in paper trading or a dry run, as our order safety post explains.
- Approve irreversible actions. Payments, messages, deletions, publishing, permission grants and deploys go to a person who sees the exact arguments, and the call carries an idempotency key.
- Make timeouts deny. Use
onFailure: "block"in Claude Code,failClosedin agentgateway and the block setting in Copilot Studio. - Build a kill switch. Keep one flag that every check reads on every call, plus a way to revoke the agent’s credentials and stop its sessions, and test it on a schedule. For high-risk systems, the EU AI Act asks for a stop button or similar procedure that brings the system to a halt in a safe state.30
- Log every decision. Record each proposed call, the decision, the rule or person behind it, and the result. Run new rules in audit mode first, as Defender’s default rule and AgentCore’s
LOG_ONLYmode allow.2918 - Protect the policy. The agent’s identity must not be able to change its own rules. Keep
UpdateGatewayaway from an AgentCore agent’s role. Claude Code treats.claude/as a protected path that allow rules can’t pre-approve.31
What to block automatically and what to send to a person
Take the first line that fits.
- The kill switch is on, or the check can’t decide because it errored, timed out or lacks data. Deny.
- The action is outside the task’s allowlist, over a hard limit, or aimed at a destination the policy never allows. Deny automatically and return a reason the agent can report. Don’t queue it for a person, because asking people to approve what policy forbids teaches them to click yes.
- The action can’t be undone, reaches outside your system, crosses a review threshold or follows untrusted content the agent read in this session. Payments, messages, deletions, publishing, permission grants and deploys all count. Pause for a person and show the exact arguments.
- Anything else. Allow it, log it and review a sample each week.
Ask a person only when they can judge the action from what you show them. Anthropic makes the same point when it matches the strength of isolation to how well the user can oversee the agent.3 Track approval rates per action type as well. If reviewers approve a type almost every time, replace the approval with an automatic rule and a limit. A type they often reject points to a prompt or tool that keeps proposing the wrong thing, so deny it automatically while you fix the cause.
-
Microsoft Learn, “Enable external threat detection and protection for Copilot Studio custom agents (preview)”, https://learn.microsoft.com/en-us/microsoft-copilot-studio/external-security-provider ↩↩↩
-
Anthropic, “Hooks reference”, Claude Code docs, https://code.claude.com/docs/en/hooks ↩↩↩↩
-
Anthropic, “How we contain Claude across products”, 25 May 2026, https://www.anthropic.com/engineering/how-we-contain-claude ↩↩↩↩↩
-
Stripe Docs, “Restricted API keys”, https://docs.stripe.com/keys/restricted-api-keys ↩
-
GitHub Docs, “Generating an installation access token for a GitHub App”, https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app ↩
-
AWS, “AssumeRole”, AWS Security Token Service API Reference, https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html ↩
-
Anthropic, “Checkpointing”, Claude Code docs, https://code.claude.com/docs/en/checkpointing ↩
-
Anthropic, “Configure permissions”, Claude Code docs, https://code.claude.com/docs/en/permissions ↩↩↩↩↩
-
Anthropic, “Intercept and control agent behavior with hooks” (hook timeout), Claude Agent SDK docs, https://code.claude.com/docs/en/agent-sdk/hooks ↩↩
-
Anthropic, “Configure permissions”, Claude Agent SDK docs, https://code.claude.com/docs/en/agent-sdk/permissions ↩↩
-
OpenAI Agents SDK, “Guardrails”, https://openai.github.io/openai-agents-python/guardrails/, and OpenAI, “Guardrails and human review”, https://developers.openai.com/api/docs/guides/agents/guardrails-approvals ↩↩↩↩
-
OpenAI Agents SDK, “Human-in-the-loop”, https://openai.github.io/openai-agents-python/human_in_the_loop/ ↩↩↩
-
LangChain, “Human-in-the-loop”, https://docs.langchain.com/oss/python/langchain/human-in-the-loop ↩↩↩
-
Google, “Types of callbacks”, Agent Development Kit docs, https://adk.dev/callbacks/types-of-callbacks/ ↩↩
-
agentgateway, “MCP authorization”, https://agentgateway.dev/docs/standalone/latest/configuration/security/mcp-authz/ ↩↩
-
agentgateway, “About MCP guardrails” and “Guardrail processors”, https://agentgateway.dev/docs/standalone/latest/documentation/mcp/guardrails/about/ and https://agentgateway.dev/docs/standalone/latest/documentation/mcp/guardrails/processors/ ↩↩
-
AWS, “Policy in Amazon Bedrock AgentCore: Control Agent Interactions” and “Core concepts”, https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/policy.html and https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/policy-core-concepts.html ↩↩
-
AWS, “Policy enforcement modes”, https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/policy-enforcement-modes.html ↩↩↩
-
Microsoft Learn, “Build a runtime threat detection system for Copilot Studio agents”, updated 15 October 2026, https://learn.microsoft.com/en-us/microsoft-copilot-studio/external-security-webhooks-interface-developers ↩↩
-
Anthropic, Claude Code release v2.1.312, 27 October 2026, https://github.com/anthropics/claude-code/releases/tag/v2.1.312 ↩
-
Anthropic, “Configure the sandboxed Bash tool”, Claude Code docs, https://code.claude.com/docs/en/sandboxing ↩
-
OpenAI Agents SDK for Python, release v0.24.0, 15 October 2026, https://github.com/openai/openai-agents-python/releases/tag/v0.24.0 ↩
-
LangChain, “Interrupts”, LangGraph docs, https://docs.langchain.com/oss/python/langgraph/interrupts ↩
-
LangChain, “Prebuilt middleware” (tool call limit), https://docs.langchain.com/oss/python/langchain/middleware/built-in ↩
-
Model Context Protocol specification 2026-07-28, “Tools”, https://modelcontextprotocol.io/specification/2026-07-28/server/tools ↩
-
agentgateway repository, licence and release v1.7.0, https://github.com/agentgateway/agentgateway ↩
-
AWS, “Policy in Amazon Bedrock AgentCore is now generally available”, 3 March 2026, https://aws.amazon.com/about-aws/whats-new/2026/03/policy-amazon-bedrock-agentcore-generally-available/ ↩
-
AWS, “Temporal policies”, https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/policy-temporal.html ↩
-
Microsoft Learn, “Protect AI agents in real time using Microsoft Defender”, updated 20 October 2026, https://learn.microsoft.com/en-us/defender-xdr/security-for-ai/ai-agent-real-time-protection ↩↩
-
EU AI Act, Article 14 “Human oversight”, paragraph 4(e), via the AI Act Explorer, https://artificialintelligenceact.eu/article/14/ ↩
-
Anthropic, “Choose a permission mode” (protected paths), Claude Code docs, https://code.claude.com/docs/en/permission-modes ↩
Frequently asked questions
How do I stop an AI agent before it acts?
Check each tool call after the model proposes it and before your code runs it, somewhere the model can’t edit. Claude Code PreToolUse hooks, OpenAI Agents SDK tool guardrails and approvals, LangGraph interrupts and MCP gateway policies all work this way. Make the check deny the call when it errors or times out, and back it with scoped credentials.
What happens when a Claude Code hook times out?
On PreToolUse, a command or HTTP hook that times out or crashes doesn’t block the call, which carries on through Claude Code’s normal permission rules. The default timeout is 600 seconds. Set onFailure to block, available since Claude Code 2.1.295, to deny the call instead.
How do I add human approval for AI agent actions?
Mark risky tools as needing approval so the run pauses with the exact arguments. In the OpenAI Agents SDK that is needs_approval, on LangGraph it is LangChain’s HumanInTheLoopMiddleware or interrupt(), and in Claude Code an ask rule or a hook’s ask decision. Store paused runs outside the process, and give each action an idempotency key so an approved call can’t run twice.
Can an MCP gateway block AI agent tool calls?
Yes, for calls that pass through it. agentgateway can hide tools by name and caller identity and reject a tools/call based on its arguments, failing closed by default. Policy in Amazon Bedrock AgentCore applies Cedar policies with default deny to every call through an AgentCore Gateway. Neither sees what an agent does through a shell or a direct HTTP request.
What is an AI agent kill switch?
One control that stops an agent’s actions everywhere at once. In practice it is a flag that every policy check reads on each call and that denies everything when it is set or can’t be read, plus a way to revoke the agent’s credentials and stop running sessions.
Should an AI agent ask for approval before every action?
No. Anthropic’s telemetry showed Claude Code users approved about 93% of permission prompts, and Anthropic says attention fell as the prompts piled up. Deny what policy forbids automatically, allow reversible actions within limits, and ask a person about irreversible, external or high-value actions.
Building something like this?
9io is a small team of senior engineers with a fractional CTO. We work by the hour, and plans start at $5,000. Send us a note about your product. The reply comes from the person who'd do the work.