Toolguard
README.md
<a name="top"></a>
<div align="center">
<img src="https://capsule-render.vercel.app/api?type=rect&color=0:6b46c1,100:2b6cb0&height=120§ion=header&text=TOOLGUARD&fontSize=48&fontColor=ffffff&fontAlignY=58" width="100%" alt="TOOLGUARD"/>
# TOOLGUARD
### Runtime allowlist and policy for agent tool-calls
<img src="https://readme-typing-svg.demolab.com?font=Fira+Code&size=18&duration=3500&pause=1000&color=6B46C1¢er=true&vCenter=true&width=720&lines=Runtime+allowlist+and+policy+for+agent+toolcalls;Self-hostable+%C2%B7+MCP-native+%C2%B7+CI-ready+%C2%B7+polyglot" width="720"/>
[](https://pypi.org/project/cognis-toolguard/) [](https://github.com/cognis-digital/toolguard/actions) [](LICENSE) [](https://github.com/cognis-digital)
*AI Agents & LLMOps ā build, route, evaluate, and secure agents.*
</div>
```bash
pip install cognis-toolguard
toolguard scan . # ā prioritized findings in seconds
```
<!-- cognis:example:start -->
## š Example output
Real, reproducible output from the tool ā runs offline:
```console
$ toolguard-emit --version
toolguard 0.1.0
```
```console
$ toolguard-emit --help
usage: toolguard [-h] [--version] [--format {table,json}]
{check,audit,policy} ...
Runtime allowlist and policy for agent tool-calls.
positional arguments:
{check,audit,policy}
check evaluate a single tool-call (flags or stdin JSON)
audit evaluate a batch of tool-calls from a JSON array
policy print the active (or default) policy as JSON
options:
-h, --help show this help message and exit
--version show program's version number and exit
--format {table,json}
output format (default: table)
```
> Blocks above are real `toolguard` output ā reproduce them from a clone.
**Sample result format** _(illustrative values ā run on your own data for real findings):_
```
{
"timestamp": "2023-02-16T14:30:00Z",
"actor": {
"name": "John Doe"
},
"object": {
"type": "indicator",
"guid": "1234567890abcdef",
"name": "Suspicious Domain",
"description": "Domain used by attackers",
"confidence": 0.8,
"labels": ["malware", "phishing"],
"observables": [
{
"type": "domain-name",
"value": "example.com"
},
{
"type": "ip-address",
"value": "192.168.1.100"
}
]
}
}
```
<!-- cognis:example:end -->
## Usage ā step by step
1. **Install** (Python 3.9+):
```bash
pip install toolguard
```
2. **Check a single tool-call** against the policy (built-in by default). Pass the tool name and its arguments as `key=value`:
```bash
toolguard check --tool shell --arg cmd="rm -rf /"
```
Or pipe a tool-call as JSON on stdin:
```bash
echo '{"tool":"shell","args":{"cmd":"ls"}}' | toolguard check
```
3. **Use your own policy** file:
```bash
toolguard check --policy policy.json --tool http --arg url="https://example.com"
```
4. **Audit a batch** of tool-calls from a JSON array and read the verdicts as JSON:
```bash
toolguard --format json audit --policy policy.json --input calls.json | jq '.[] | {tool, decision}'
```
5. **Inspect / version the active policy** in CI:
```bash
toolguard policy --policy policy.json > active_policy.json
```
## Contents
- [Why toolguard?](#why) Ā· [Features](#features) Ā· [Quick start](#quick-start) Ā· [Example](#example) Ā· [Architecture](#architecture) Ā· [AI stack](#ai-stack) Ā· [How it compares](#how-it-compares) Ā· [Integrations](#integrations) Ā· [Install anywhere](#install-anywhere) Ā· [Related](#related) Ā· [Contributing](#contributing)
<a name="why"></a>
## Why toolguard?
agent safety
`toolguard` is single-purpose, scriptable, and self-hostable: point it at a target, get prioritized results in the format your workflow already speaks (table Ā· JSON Ā· SARIF), gate CI on it, and let agents drive it over MCP.
<div align="right"><a href="#top">ā back to top</a></div>
<a name="features"></a>
## Features
- ā
Load Policy
- ā
Runs on Linux/macOS/Windows Ā· Docker Ā· devcontainer
- ā
Ports in Python, JavaScript, Go, and Rust (`ports/`)
<div align="right"><a href="#top">ā back to top</a></div>
<a name="quick-start"></a>
## Quick start
```bash
pip install cognis-toolguard
toolguard --version
toolguard scan . # scan current project
toolguard scan . --format json # machine-readable
toolguard scan . --fail-on high # CI gate (non-zero exit)
```
<div align="right"><a href="#top">ā back to top</a></div>
<a name="example"></a>
## Example
```text
$ toolguard scan .
[HIGH ] TOO-001 example finding (./src/app.py)
[MEDIUM ] TOO-002 another signal (./config.yaml)
2 findings Ā· risk score 5 Ā· 38ms
```
<div align="right"><a href="#top">ā back to top</a></div>
<a name="architecture"></a>
## Architecture
```mermaid
flowchart LR
IN[agent / A2A traffic] --> P[toolguard<br/>map + analyze]
P --> OUT[graph + flags]
```
<div align="right"><a href="#top">ā back to top</a></div>
<a name="ai-stack"></a>
## Use it from any AI stack
`toolguard` is interoperable with every popular way of using AI:
- **MCP server** ā `toolguard mcp` (Claude Desktop, Cursor, Cognis.Studio, [uncensored-fleet](https://github.com/cognis-digital/uncensored-fleet))
- **OpenAI-compatible / JSON** ā pipe `toolguard scan . --format json` into any agent or LLM
- **LangChain Ā· CrewAI Ā· AutoGen Ā· LlamaIndex** ā wrap the CLI/JSON as a tool in one line
- **CI / scripts** ā exit codes + SARIF for non-AI pipelines
<div align="right"><a href="#top">ā back to top</a></div>
<a name="how-it-compares"></a>
## How it compares
| | **Cognis toolguard** | llm-guard |
|---|:---:|:---:|
| Self-hostable, no account | ā
| varies |
| Single command, zero config | ā
| ā ļø |
| JSON + SARIF for CI | ā
| varies |
| MCP-native (AI agents) | ā
| ā |
| Polyglot ports (JS/Go/Rust) | ā
| ā |
| Open license | ā
COCL | varies |
*Built in the spirit of **llm-guard**, re-framed the Cognis way. Missing a credit? Open a PR.*
<div align="right"><a href="#top">ā back to top</a></div>
<a name="integrations"></a>
## Integrations
Pipes into your stack: **SARIF** for code-scanning, **JSON** for anything, an **MCP server** (`toolguard mcp`) for AI agents, and a webhook forwarder for SIEM/Slack/Jira. See [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md).
<div align="right"><a href="#top">ā back to top</a></div>
<a name="install-anywhere"></a>
## Install ā every way, every platform
```bash
pip install "git+https://github.com/cognis-digital/toolguard.git" # pip (works today)
pipx install "git+https://github.com/cognis-digital/toolguard.git" # isolated CLI
uv tool install "git+https://github.com/cognis-digital/toolguard.git" # uv
pip install cognis-toolguard # PyPI (when published)
docker run --rm ghcr.io/cognis-digital/toolguard:latest --help # Docker
brew install cognis-digital/tap/toolguard # Homebrew tap
curl -fsSL https://raw.githubusercontent.com/cognis-digital/toolguard/main/install.sh | sh
```
| Linux | macOS | Windows | Docker | Cloud |
|---|---|---|---|---|
| `scripts/setup-linux.sh` | `scripts/setup-macos.sh` | `scripts/setup-windows.ps1` | `docker run ghcr.io/cognis-digital/toolguard` | [DEPLOY.md](docs/DEPLOY.md) (AWS/Azure/GCP/k8s) |
<div align="right"><a href="#top">ā back to top</a></div>
<a name="related"></a>
## Related Cognis tools
- [`agentsmith`](https://github.com/cognis-digital/agentsmith) ā Config-first scaffolding and orchestration for multi-agent workflows
- [`skillhub`](https://github.com/cognis-digital/skillhub) ā Local skill registry and installer for AI agents
- [`evalbench`](https://github.com/cognis-digital/evalbench) ā Offline LLM / agent eval harness with regression gates
- [`ragkit`](https://github.com/cognis-digital/ragkit) ā Batteries-included local RAG pipeline ā ingest, index, serve
- [`memorybank`](https://github.com/cognis-digital/memorybank) ā Portable long-term memory store for agents, exposed over MCP
- [`promptpack`](https://github.com/cognis-digital/promptpack) ā Versioned prompt / template registry with A/B and rollbacks
**Explore the suite ā** [šļø all 170+ tools](https://github.com/cognis-digital/cognis-neural-suite) Ā· [ā awesome-cognis](https://github.com/cognis-digital/awesome-cognis) Ā· [š cognis-sources](https://github.com/cognis-digital/cognis-sources) Ā· [š¤ uncensored-fleet](https://github.com/cognis-digital/uncensored-fleet) Ā· [š§ engram](https://github.com/cognis-digital/engram)
<div align="right"><a href="#top">ā back to top</a></div>
<a name="contributing"></a>
## Contributing
PRs, new rules, and demo scenarios are welcome under the collaboration-pull model ā see [CONTRIBUTING.md](CONTRIBUTING.md) and [SECURITY.md](SECURITY.md).
> ### ā If `toolguard` saved you time, **star it** ā it genuinely helps others find it.
## Interoperability
`{}` composes with the 300+ tool Cognis suite ā JSON in/out and a shared
OpenAI-compatible `/v1` backbone. See **[INTEROP.md](INTEROP.md)** for the
suite map, composition patterns, and reference stacks.
## License
Source-available under the **Cognis Open Collaboration License (COCL) v1.0** ā free for personal, internal-evaluation, research, and educational use; **commercial / production use requires a license** (licensing@cognis.digital). See [LICENSE](LICENSE).
---
<div align="center"><sub><b><a href="https://cognis.digital">Cognis Digital</a></b> Ā· one of 170+ tools in the <a href="https://github.com/cognis-digital/cognis-neural-suite">Cognis Neural Suite</a> Ā· <i>Making Tomorrow Better Today</i></sub></div>
This server cannot be deployed
Maintenance
ActivityStale
ResponsivenessNo issues