Audit OpenClaw allowed tools against observed tool usage.
Project description
openclaw-tool-audit
openclaw-tool-audit is a small CLI for reviewing OpenClaw tool permissions against actual local tool usage. It is intentionally focused on permission-versus-usage visibility for security reviews.
Install
pipx install openclaw-tool-audit
brew install pfrederiksen/tap/openclaw-tool-audit
From a checkout:
python -m pip install -e .
openclaw-tool-audit --help
Examples
openclaw-tool-audit
openclaw-tool-audit --agent main --last 14d
openclaw-tool-audit --json
openclaw-tool-audit --markdown --broadest-first
openclaw-tool-audit --config fixtures/agents --sessions fixtures/sessions --top-tools 5
openclaw-tool-audit --version
By default the CLI checks these config locations:
./.openclaw/agents./agents~/.openclaw/agents
And these observed session locations:
./.openclaw/sessions./sessions~/.openclaw/sessions~/.openclaw/transcripts~/.openclaw/agents/<agentId>/sessions
Use --config PATH and --sessions PATH to point at specific files or directories. Both flags may be repeated.
Where Allowed Tools Come From
Allowed tools are read from local agent configuration files. The CLI supports .json, .toml, .yaml, and .yml files.
It looks for common allowlist fields at any depth:
allowed_toolstoolstool_allowlistallow_toolsallowedToolNamesallowed_tools_list
Values may be a list of strings, a comma/space separated string, a list of objects with name, tool, or id, or a mapping where enabled tools are marked true, allow, allowed, or enabled.
Where Observed Tools Come From
Observed tools are read from local session or transcript files. The CLI supports .json, .jsonl, .ndjson, .txt, .md, and .log.
Structured JSON scanning recognizes common tool-call shapes:
{"type": "tool_call", "name": "read_file"}{"type": "tool_use", "tool": "web"}{"type": "tool", "tool": {"name": "shell"}}{"type": "input_tool_call", "name": "read"}{"type": "tool_use", "toolName": "edit"}{"recipient_name": "functions.exec_command"}{"function": {"name": "fetch_url"}}{"function_call": {"name": "summarize"}}{"functionCall": {"name": "web_fetch"}}{"message": {"tool_calls": [{"function": {"name": "exec"}}]}}{"message": {"content": [{"type": "input_tool_call", "name": "read"}]}}
Plain text transcripts are scanned with conservative patterns such as to=tool_name, recipient_name, and <tool>tool_name</tool>.
Output
Terminal output includes:
- allowed tools
- observed tools and invocation counts
- unused allowed tools
- observed-but-not-allowed tools
- tools used most often
- suspicious broad allowances
- cron/job summaries when job names are present in transcripts
Suspicious broad allowances are heuristics. The CLI flags wildcard-like tools, broad capability tokens such as shell, filesystem, network, web, and github, and allowlists where most entries were not observed.
Options
--agent NAME Only show one agent.
--last 14d Filter observations by transcript file mtime. Supports h, d, and w.
--json Emit JSON.
--markdown Emit Markdown.
--top-tools N Limit observed tool lists to the top N.
--unused-only Only show agents with unused allowed tools.
--broadest-first Sort agents by broad allowance signals first.
Development
python -m pip install -e ".[dev]"
pytest
This project has no runtime dependencies. YAML support uses PyYAML when available and otherwise falls back to a small parser that handles simple key/value and list allowlists.
Release
Releases are tag-driven. Create a version tag such as:
git tag v0.1.0
git push origin v0.1.0
The release workflow builds the package, publishes to PyPI, creates a GitHub release, and bumps the Homebrew formula in pfrederiksen/homebrew-tap.
Required repository secrets:
HOMEBREW_TAP_TOKEN, a GitHub token that can push topfrederiksen/homebrew-tap.
For PyPI, either configure Trusted Publishing for this repository or set PYPI_API_TOKEN as a repository secret.
Do not commit PyPI tokens to the repository.
Limitations
- OpenClaw config and transcript formats are inferred from common local shapes; unusual schemas may need explicit
--configand--sessionspaths or parser updates. --lastcurrently filters by transcript file modification time, not by event-level timestamps.- Text transcript parsing is best effort and may miss custom tool-call formats.
- The audit is visibility-focused; it does not enforce permissions or block tool usage.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file openclaw_tool_audit-0.1.2.tar.gz.
File metadata
- Download URL: openclaw_tool_audit-0.1.2.tar.gz
- Upload date:
- Size: 20.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a954acb77c950d5de827c4efbb07fb057369f7c0b86ab86b5f4bbaf156ed4e00
|
|
| MD5 |
a2df99312bbfab69205a88e5994ee55c
|
|
| BLAKE2b-256 |
34416f8313fbd7f5239e1b88f4c0463fa5e9223b212a2c198cc69c06c1862b48
|
File details
Details for the file openclaw_tool_audit-0.1.2-py3-none-any.whl.
File metadata
- Download URL: openclaw_tool_audit-0.1.2-py3-none-any.whl
- Upload date:
- Size: 13.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a6b7bb8ddfcdd680311a0334ce59f2c6cd2ef34f95c963b87623f7987a8b37b
|
|
| MD5 |
765a047456dfa101df56b0882aab5948
|
|
| BLAKE2b-256 |
3e379af78d85df53b3394c71cc566870206ce2d1316d3e60712128b3e2aa3a7c
|