$curl -fsSL https://downloads.withhuman.ai/install.sh | sh -s -- onboard
# Connects Claude Code, Codex,
# OpenClaw, Pi, Hermes and
# DeepSeek on this machine.
Hooks are in place.
Finish in the browser: the request
appears there for you to approve
or deny.
~/.claude.json
MCP gateway$withhuman agent install claude-code
{
"mcpServers": {
"withhuman-gateway": {
"command": "withhuman",
"args": [
"mcp",
"claude-code",
"withhuman-gateway"
]
}
}
}
$pip install "agentapprovalprotocol[langgraph]"
from langchain.agents import create_agent
from agentapprovalprotocol.langgraph import (
ApprovalMiddleware,
)
# Every tool call waits for a decision.
approvals = ApprovalMiddleware(
os.environ["AAP_URL"],
os.environ["AAP_INSTANCE_TOKEN"],
)
agent = create_agent(
model,
tools=[lookup_order, issue_refund],
middleware=[approvals],
)
$pip install "agentapprovalprotocol[deep-agents]"
from deepagents import create_deep_agent
from agentapprovalprotocol.langgraph import (
ApprovalMiddleware, deep_agent_subagents,
)
approvals = ApprovalMiddleware(
os.environ["AAP_URL"],
os.environ["AAP_INSTANCE_TOKEN"],
)
agent = create_deep_agent(
model=model,
tools=[lookup_order],
middleware=[approvals],
# Subagents don't inherit middleware.
subagents=deep_agent_subagents(approvals, [billing]),
)
$pip install "agentapprovalprotocol[pydantic-ai]"
from pydantic_ai import Agent
from agentapprovalprotocol.pydantic_ai import (
ApprovalCapability,
)
approvals = ApprovalCapability(
os.environ["AAP_URL"],
os.environ["AAP_INSTANCE_TOKEN"],
)
# Add it to every agent that calls tools.
agent = Agent(
model,
tools=[lookup_order, issue_refund],
capabilities=[approvals],
)
$pip install "agentapprovalprotocol[openai-agents]"
from agents import Agent, Runner
from agentapprovalprotocol.openai_agents import (
Approvals,
)
approvals = Approvals(
os.environ["AAP_URL"],
os.environ["AAP_INSTANCE_TOKEN"],
)
agent = Agent(
name="support",
tools=[lookup_order, issue_refund],
)
# Covers its tools, agents used as tools and handoffs.
agent = approvals.protect(agent)
result = await Runner.run(agent, task)
$pip install "agentapprovalprotocol[claude-agent-sdk]"
from claude_agent_sdk import ClaudeAgentOptions, query
from agentapprovalprotocol.claude_agent_sdk import (
ApprovalHooks,
)
approvals = ApprovalHooks(
os.environ["AAP_URL"],
os.environ["AAP_INSTANCE_TOKEN"],
)
# Adds the approval hooks to your options.
options = approvals.options(ClaudeAgentOptions(
mcp_servers={"shop": shop},
))
async for message in query(prompt=task, options=options):
print(message)
$pip install "agentapprovalprotocol[adk]"
from google.adk.apps import App
from agentapprovalprotocol.adk import (
ApprovalPlugin, check_coverage,
)
# One plugin covers every agent in the app.
approvals = ApprovalPlugin(
os.environ["AAP_URL"],
os.environ["AAP_INSTANCE_TOKEN"],
)
app = App(
name="support",
root_agent=support,
plugins=[approvals],
)
check_coverage(app, approvals)
$pip install "agentapprovalprotocol[crewai]"
from crewai import Crew
from agentapprovalprotocol.crewai import ApprovalHooks
# Covers every crew, agent and delegation.
ApprovalHooks(
os.environ["AAP_URL"],
os.environ["AAP_INSTANCE_TOKEN"],
).install()
crew = Crew(agents=[support, billing], tasks=[task])
result = crew.kickoff()
$npm install @agentapprovalprotocol/sdk @agentapprovalprotocol/ai-sdk
import { ToolLoopAgent } from "ai";
import { Client, Gate } from "@agentapprovalprotocol/sdk";
import { approvals } from "@agentapprovalprotocol/ai-sdk";
const gate = new Gate(new Client(
process.env.AAP_URL!,
process.env.AAP_INSTANCE_TOKEN!,
));
const agent = new ToolLoopAgent({
model,
tools: { lookup_order, issue_refund },
...approvals({ gate }),
});
$npm install @agentapprovalprotocol/sdk @agentapprovalprotocol/mastra
import { Agent } from "@mastra/core/agent";
import { Client, Gate } from "@agentapprovalprotocol/sdk";
import { Approvals } from "@agentapprovalprotocol/mastra";
const approvals = new Approvals(new Gate(new Client(
process.env.AAP_URL!,
process.env.AAP_INSTANCE_TOKEN!,
)));
// Build every agent with approvals.config.
const agent = new Agent(approvals.config({
id: "support",
name: "Support",
instructions,
model,
tools: { lookup_order, issue_refund },
}));
$POST /api/aap/v1/requests
{
"tool": "issue_refund",
"server": "stripe",
"arguments": {
"amount": 4900,
"reason": "duplicate_charge"
},
"timeout": "30m"
}