A few lines at the hook you already have.
Each plugin gates tool calls at your framework's pre-execution hook and sends them to Atbash for a verdict. HOLD and BLOCK mean the tool did not run.
import { Atbash } from "@atbash/sdk"; import { withAtbashGuard } from "@atbash/atbash-langchain"; const client = new Atbash(process.env.ATBASH_AGENT_PRIVKEY, { orgName: process.env.ATBASH_ORG_NAME, }); withAtbashGuard(tool, client); // HOLD, BLOCK or ERROR: the tool did not run
terminal
$ npm install @atbash/atbash-langchain $ node run.mjs › tool: send_bank_transfer › atbash verdict HOLD › reason: unverified payee · RL-12 › waiting for finance-lead
Seven frameworks
Where Atbash attaches
OpenClaw
before_tool_call hook
@atbash/atbash-openclawHermes
pre_tool_call hook, fail-closed
atbash-hermes-pluginLangGraph
Safety node with human approval on HOLD
@atbash/atbash-langgraphLangChain
Wraps any tool; HOLD and BLOCK stop the call
@atbash/atbash-langchainAutoGen
Judge before execution
@atbash/atbash-autogenElizaOS
Guard around action handlers
@atbash/atbash-elizaMCP
Atbash as an MCP server
@atbash/atbash-mcpYour own code
SDK, API and CLI
@atbash/sdkModel-agnostic
Atbash judges the action, not the model behind it
Your agents run on different models and reach into different tools. The verdict happens at the tool call.











