Draft 0.1. The vocabulary may change before v=1 is frozen. Try it, implement it, tell us what breaks — but don't ship it to production yet.

Implement it

From seeing the header to sending it in five minutes, in the tool you already use.

Pick the value of mode from how the request is being made, not from what the model thinks: a person typing and reviewing is assisted; a workflow with approval points is supervised; a scheduled or unattended run is autonomous. If your runtime knows which it is, let the runtime set it.

curl

curl https://disclosure.cloudsecurityalliance.ai/assess \
  -H 'Agent-Disclosure: v=1, type=ai, mode=assisted, authority=operator'

assisted: you are typing the command and reading the answer.

Python (requests), set once on a Session

import requests
s = requests.Session()
s.headers["Agent-Disclosure"] = 'v=1, type=ai, mode=autonomous, authority=operator, operator="example.org"'
r = s.get("https://disclosure.cloudsecurityalliance.ai/assess")
print(r.json()["classification"])

autonomous: a scheduled job sends every request on this Session with no one approving each call. With httpx, the same thing is httpx.Client(headers={"Agent-Disclosure": "..."}).

JavaScript (fetch)

const r = await fetch("https://disclosure.cloudsecurityalliance.ai/assess", {
  headers: { "Agent-Disclosure": 'v=1, type=ai, mode=supervised, authority=delegated' }
});
console.log((await r.json()).classification);

supervised: your workflow pauses for a person to approve at defined steps; delegated because it acts for a customer.

Claude Code: set it from the harness, not the prompt

(a) Shell wrapper. Works for any tool that shells out to curl. Save as ~/bin/curl, make it executable, and put ~/bin earlier in PATH than the real curl:

#!/bin/sh
MODE="${AGENT_DISCLOSURE_MODE:-supervised}"
OP="${AGENT_DISCLOSURE_OPERATOR:+, operator=\"$AGENT_DISCLOSURE_OPERATOR\"}"
exec /usr/bin/curl -H "Agent-Disclosure: v=1, type=ai, mode=$MODE, authority=operator$OP" "$@"

The default is supervised; run export AGENT_DISCLOSURE_MODE=autonomous in any scheduled or headless job.

(b) PreToolUse hook. Claude Code passes every hook the session's permission_mode. Save this as ~/.claude/hooks/agent-disclosure.sh (it needs jq):

#!/bin/sh
# Adds Agent-Disclosure to curl in Bash tool calls that do not already send it.
jq -c '.permission_mode as $pm | .tool_input as $in
 | select(($in.command | test("\\bcurl ")) and ($in.command | test("Agent-Disclosure") | not))
 | (env.AGENT_DISCLOSURE_MODE // (if $pm == "bypassPermissions" or $pm == "dontAsk"
     then "autonomous" else "supervised" end)) as $m
 | {hookSpecificOutput: {hookEventName: "PreToolUse", updatedInput: ($in + {command:
   ($in.command | gsub("\\bcurl "; "curl -H \"Agent-Disclosure: v=1, type=ai, mode=\($m), authority=operator\" "))})}}'

Then register it in .claude/settings.json:

{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [
  { "type": "command", "command": "sh ~/.claude/hooks/agent-disclosure.sh" } ] } ] } }

Sessions where you approve tool calls send supervised; --dangerously-skip-permissions (bypassPermissions) and dontAsk send autonomous. Hooks are not told whether Claude Code is running as claude -p, so export AGENT_DISCLOSURE_MODE=autonomous in cron jobs; when that variable is set, it wins. In auto mode, Claude Code may refuse a command that a hook changed after auto mode reviewed it. If that happens, use the wrapper.

Belt and braces: add this line to your CLAUDE.md:

Add the Agent-Disclosure header to any HTTP request you construct; see https://disclosure.cloudsecurityalliance.ai/implement.

OpenClaw

OpenClaw's built-in web_fetch tool (2026.4.14) has a userAgent setting but no setting for extra request headers, so it cannot send the header yet. Requests the agent makes with curl through its exec tool can: install the wrapper above as ~/bin/curl for the gateway's user (the default gateway unit already puts ~/bin ahead of /usr/bin in PATH), then set the values for scheduled workflows with systemctl --user edit openclaw-gateway.service:

[Service]
Environment=AGENT_DISCLOSURE_MODE=autonomous
Environment=AGENT_DISCLOSURE_OPERATOR=agents.cloudsecurityalliance.ai

autonomous: these workflows run on a schedule with no one approving each request. Set the operator to the domain you publish your agents under, then restart the gateway.

Sending it? Add yourself to Who sends it.