AI Guardian
AI Guardian is an MCP server for governing and observing local LLM runtimes (Ollama, llama.cpp, LM Studio, vLLM): it inventories models, audits provenance, scans prompts for secrets/PII/jailbreaks, enforces model allow/deny policy, records usage/audit logs, and provides undoable write operations.
Read/model inventory:
list_models,running_models,model_details,server_status,vram_usage,model_provenance— inspect installed/loaded models, VRAM, policy verdicts, and digest drift.Policy & provenance:
policy_view,set_model_allowlist,set_model_denylist,pin_model_digest— manage model allow/deny glob patterns and pin expected digests.Content governance:
scan_promptruns a deterministic offline scan for secrets, PII, source leakage, and jailbreaks, returning a weighted risk band.Route-through guard:
guarded_generateandobserve_chatscan + policy-gate + record a prompt, then call the runtime only if allowed (blocking above a risk threshold or for disallowed models).Usage/audit queries:
usage_eventsandanomaly_reportroll up observed prompts, shadow models, blocked calls, and high-risk findings.Write operations:
pull_model,remove_model(with dry-run/undo),unload_model— manage local models where the runtime supports lifecycle.Undo system:
undo_listandundo_applylist and replay recorded inverse operations with dry-run support.Proxy guidance:
proxy_guidanceexplains how to run the transparent capture proxy and its chokepoint (non-enforcement) caveat.
Provides observability and governance for local LLMs running on Ollama, including model inventory, content scanning, and policy-enforced prompt routing.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AI Guardianlist all installed models"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AI Guardian
Disclaimer: Community-maintained open-source project. Not affiliated with, endorsed by, or sponsored by Ollama, IGEL, or any AI-security vendor. Product and trademark names belong to their owners. MIT licensed.
Governed observability + governance for on-endpoint local LLMs. It lets you
observe + audit what your local models are actually fed, and gate what leaves in
a prompt — the complement to IGEL AI Armor. AI Armor governs whether a
local model may run on the endpoint; ai-guardian records what it did and gates
what goes into the prompt (secrets, PII, source, jailbreaks) plus which model
may serve it. Self-contained: it talks to each runtime's REST API and needs
nothing beyond httpx and the MCP SDK. v0.1 provides opt-in route-through
content governance, plus a transparent capture proxy for clients that did not opt in.
Supported runtimes
One tool, several local runtimes, selected per target by a runtime field in
config.yaml (the init wizard asks). Ollama uses its native API; the other three
share one OpenAI-compatible transport (/v1/models + /v1/chat/completions).
Runtime |
| Default port | List / policy | Scan + route-through guard | Provenance |
Ollama |
| 11434 | ✅ | ✅ | digest (content hash — strong) |
llama.cpp ( |
| 8080 | ✅ | ✅ | props — |
LM Studio |
| 1234 | ✅ | ✅ | id only — weaker; pins report |
vLLM (local single-node) |
| 8000 | ✅ | ✅ | id only — weaker; pins report |
The allow/deny model policy, the deterministic prompt scanner, the route-through
guard (guarded_generate / observe_chat), provenance drift, and doctor work
across all runtimes. Model lifecycle writes (pull / remove / unload)
are Ollama-only — the OpenAI-compatible servers load a model at startup and expose
no lifecycle endpoint, so those writes are refused with a clear message.
Provenance honesty: only Ollama (content digest) and llama.cpp (a /props-derived
path/size identity) expose something to pin. LM Studio and vLLM expose only a model
id, so a pinned digest is reported unverifiable rather than a false DRIFT.
vLLM here is a LOCAL endpoint-guarding use case. GPU inference-cluster operations (autoscale, drain, Ray Serve/Jobs, model lifecycle at fleet scale) belong to a different tool in the line — GPU cluster ops → inference-aiops.
What it does
Ollama persists no queryable prompt/response history — conversational context is client-supplied on every request. So ai-guardian observes on two fronts:
Passive inventory / state auditing — over
/api/tags,/api/ps,/api/show,/api/version: what models are installed and running, their VRAM residency, license/params/capabilities, and their provenance digests. Every model is annotated with an allow/deny policy verdict, so shadow (unsanctioned) models showallowed: false.Opt-in route-through content governance — callers send a prompt through ai-guardian (
guarded_generate/observe_chat). It scans the text (secrets / PII / source / jailbreak), checks the model against policy, records the interaction to its own usage log (~/.ai-guardian/usage.db), and only then calls Ollama — blocking when the risk band is too high or the model is disallowed. The raw prompt is never stored (only its length + redacted findings).
Now available (
ai-guardian proxy serve): a transparent capture proxy that applies the same scan + model policy + recording to traffic from clients that never opted in — point them at the proxy instead of the runtime. It inspects requests and streams responses through untouched, and it is a chokepoint, not an enforcement boundary: a client that can still reach the runtime's real port bypasses it entirely.proxy_guidancereturns the command and that caveat; the CLI prints it on every start.
Related MCP server: agent-sudo-mcp
Key features
Deterministic, offline prompt scanner — no I/O, no network, so it is fully testable offline. Flags secrets (AWS
AKIA, private-key blocks, GitHub / Slack / OpenAI / Google tokens, JWTs, assignedapi_key=…, high-entropy fallback), PII (email, US SSN, credit card with a Luhn check), source/config-leak heuristics, and jailbreak / prompt-injection signatures — rolled up into a weighted risk band (low / medium / high / critical; any critical dominates). Findings are redacted — the scanner never re-emits the secret it caught.Model allow/deny policy (shell-glob patterns) so shadow / unsanctioned models surface as
allowed: false, plus provenance digest pinning to flag a model whose digest drifted (re-pulled / tampered).Route-through guard —
guarded_generate/observe_chatscan + policy-gaterecord + run-if-allowed, blocking on risk-band >=
block_threshold(defaulthigh) or a disallowed model.
Vendored governance harness — audit log, token/runaway budget guard, descriptive risk tiers, and undo-token recording, bundled in the package (no external dependency).
Highly self-testable — Ollama is free + local for the API parts; the scanner, policy, and risk-band are pure deterministic offline logic.
What this tool does, and does not, decide
It delivers local-LLM observability and operations — reads and writes — accurately, and records every one of them. It does not decide whether a write to the model estate is allowed to happen. That is the agent's judgement, or the permission of the host and account you run it under: point it at a runtime the account cannot administer — an Ollama daemon whose model store the user can't modify, or an endpoint the agent reaches read-only — and the writes fail at the runtime, the place that actually owns the permission. Simplest of all, hand the connecting agent only the scan/observe tools.
So the harness has no read-only switch, no deny-rules file, and no approval gate
to configure. (Content governance is a separate, product-level thing that stays:
the model allow/deny policy and the guarded_generate block threshold still
scan and gate what a model is asked to do.) The one thing the harness guarantees
is that nothing is silent: every call, over MCP and over the CLI alike, lands
an audit row in ~/.ai-guardian/audit.db, and destructive writes still capture
their before-state and record an inverse where one exists.
Each tool declares a
risk_level, kept in agreement with its[READ]/[WRITE]documentation tag by a test, and carried into the audit row as a descriptive tier — so a reviewer can see at a glance that a row was a high-risk delete. It is a label, not a gate.
Running a smaller / local model? See agent-guardrails.md — it lists the guardrails this tool now enforces for you (so you don't spend prompt budget restating them) and gives a ready-made system prompt for what's left.
Capability matrix (21 MCP tools)
Reads (11)
Tool | Risk | What it returns |
| low | installed models, each with the allow/deny verdict (shadow → |
| low | loaded models: VRAM footprint + residency expiry |
| low | license / parameters / capabilities for one model |
| low | Ollama reachability + version |
| low | total VRAM used by loaded models; flag over-budget |
| low | current allow/deny policy + provenance digest pins |
| low | each installed digest vs its pin; flag drift |
| low | pure text scan → findings + weighted risk band (no model call) |
| low | query the observed-usage log |
| low | rollup: shadow models, digest drift, high-risk + blocked prompts |
| low | the |
Writes (8)
Tool | Risk | Undo / safety |
| medium | refused if it violates policy |
| high | dry-run + undo (re-pull) |
| medium | evict from VRAM ( |
| medium | undo → prior allowlist |
| medium | undo → prior denylist |
| medium | pin a model's expected provenance digest |
| medium | the route-through guard: scan + policy-gate + record + run-if-allowed |
| medium | same, for |
Undo (2)
Tool | Risk | What it does |
| low | list recorded undo tokens |
| medium | replay a recorded inverse descriptor |
Risk-band gating: guarded_generate / observe_chat block when the prompt's
risk band >= block_threshold (default high) or the model is disallowed.
Blocked calls never reach Ollama and are recorded as blocked in the usage log.
Quick start
As a Claude Code plugin
One install gives an agent both the skill and the MCP server:
/plugin marketplace add AIops-tools/marketplace
/plugin install ai-guardian@aiops-toolsThe MCP server is fetched with uv and pinned to the
package version this plugin declares, so an audit row can be traced back to the
code that wrote it. Credentials are still configured with ai-guardian init — see below.
As an OpenClaw plugin
The same bundle is published on ClawHub, where one install delivers the skill and its MCP server together:
openclaw plugins install clawhub:@zw008/ai-guardian
openclaw skills info ai-guardian # expect: Visible to model: yesRestart the OpenClaw gateway afterwards so it loads the plugin. The MCP server is
fetched with uv, pinned to this exact release, so
uvx has to be on PATH — without it the skill still installs but reports
Visible to model: no. Credentials are configured exactly as below.
As a CLI or standalone MCP server
uv tool install ai-guardian-aiops # or: pipx install ai-guardian-aiops
ai-guardian doctor # Ollama reachability + policy summary (works zero-config)
ai-guardian overview # models installed/running, shadow count, usage stats
ai-guardian model list # installed models with allow/deny verdicts
ai-guardian guard scan "my key is AKIAIOSFODNN7EXAMPLE" # deterministic scan → risk bandThe command and the package have different names. The CLI, the skill and this repo are all
ai-guardian; the PyPI distribution isai-guardian-aiopsbecauseai-guardianwas already taken. Both spellings below are correct and intentional — installai-guardian-aiops, then runai-guardian.
Route a prompt through the guard (scan + policy-gate + record + run-if-allowed) via MCP:
guarded_generate(model="llama3.2:3b", prompt="…", block_threshold="high")Run as an MCP server (stdio) — the full 21-tool surface; the CLI is a convenience subset:
export AI_GUARDIAN_AIOPS_MASTER_PASSWORD=... # only if a target has a stored token
ai-guardian mcp # or: ai-guardian-mcpWhere that password then lives: an exported variable is readable by every process this shell starts and is recorded by shell history. On a shared or long-lived host, prefer the interactive prompt, or inject it from a secret manager for the life of the one command that needs it.
Governance
Every operation — MCP and CLI — passes through the bundled @governed_tool
harness. It records; it does not authorize (see above).
Audit — every call (params, result, status, duration, risk tier, and any operator-supplied approver/rationale) is logged to
~/.ai-guardian/audit.db(relocatable viaAI_GUARDIAN_AIOPS_HOME). This is separate from~/.ai-guardian/usage.db, which holds the observed local-LLM usage.Runaway guard — a safety backstop, not an authorization gate: the same call hammered in a tight loop trips a circuit breaker so a stuck agent can't burn unbounded calls/time. Disable with
AI_GUARDIAN_RUNAWAY_MAX=0; optional hard ceilings viaAI_GUARDIAN_MAX_TOOL_CALLS/AI_GUARDIAN_MAX_TOOL_SECONDS.Undo recording — reversible writes record an inverse descriptor built from the fetched before-state.
Risk tier — a descriptive label on the audit row derived from
risk_level; it gates nothing.
Supported scope + limitations
Scope: on-endpoint local LLMs — Ollama plus the OpenAI-compatible llama.cpp / LM Studio / local single-node vLLM — single-endpoint local-LLM observability + content governance. Not GPU inference-cluster ops (→ inference-aiops).
v0.1 = passive inventory/state auditing plus opt-in route-through content governance. A transparent capture proxy for other clients' traffic is v0.2 roadmap, not v0.1.
IGEL AI Armor interop is doc-level positioning today (complementary roles), not a wired integration.
Validation status — the scanner, policy, and risk-band are pure deterministic offline logic and are exercised as such by the test suite. The core Ollama route-through (real generation + policy deny + undo capture) was exercised against a live Ollama 0.24.0 on 2026-07-13; the rest of the Ollama surface and the OpenAI-compatible dialects (llama.cpp / LM Studio / local vLLM) are still covered by mocked responses only.
ai-guardian doctoris the fastest live check; seedocs/VERIFICATION.mdfor exactly which boxes are ticked.
Missing a capability?
Want a passive capture proxy, another scanner signature, a richer policy model, or an AI Armor hook? Open an issue or PR — feedback and contributions welcome.
Available Tools
21 toolsanomaly_reportBRead-only
[READ] Rollup: shadow models, digest drift, high-risk prompts, blocked count.
Args: target: Ollama target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, and '[READ]' merely restates it. The description does add useful context by enumerating the four anomaly categories the rollup covers, but it omits the aggregation window/time range and any auth or scoping constraints, which matter for interpreting an anomaly report.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact lines with the read tag front-loaded and the parameter note last; nothing is padded. The category list is dense but each item is informative rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does list the reported categories, which is adequate. However, for an anomaly rollup the missing time window/aggregation scope leaves an agent unable to interpret or scope results confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the parameter burden, and it does: 'target' is identified as an Ollama target name from config, and the default behavior (omit for the default) is explained. This goes meaningfully beyond the bare anyOf string/null schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource: a read-only rollup reporting shadow models, digest drift, high-risk prompts, and blocked count. That is far more concrete than a restated name. It does not, however, distinguish itself from siblings like usage_events, server_status, or model_provenance, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this tool versus the many sibling reporting tools. The only guidance present ('omit for the default') concerns the parameter, not tool selection or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
guarded_generateADestructive
[WRITE][risk=medium] Scan + policy-gate a prompt, record it, then run if allowed.
The route-through guard: scans the prompt (secrets/PII/code/jailbreak), checks the model against policy, blocks if the risk band >= block_threshold or the model is disallowed, records the interaction to the usage log, and only calls Ollama if allowed. The raw prompt is never stored.
Args: model: Model to run. prompt: The prompt text (scanned before any model call). agent / user: Actor attribution recorded in the usage log. block_threshold: Block when risk band >= this (none/low/medium/high/critical). target: Ollama target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | ||
| agent | No | unknown | |
| model | Yes | ||
| prompt | Yes | ||
| target | No | ||
| block_threshold | No | high |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: scan targets (secrets/PII/code/jailbreak), the block condition, the usage-log record, and the guarantee that the raw prompt is never stored. The annotations' destructiveHint=true goes unexplained since nothing in the described flow is destructive, but this is a mild gap rather than a direct contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with [WRITE][risk=medium] and a one-line summary before the flow detail, then a compact Args block. Dense but every sentence carries information; only the repetition of the scan/gate sequence in both summary and body costs a little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema mutation tool with six parameters, the description covers inputs, gating logic, and side effects (usage log, no prompt retention) well. It stops short of describing the shape of a blocked or successful response, which is the one thing an agent cannot infer from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates fully: it documents all six parameters, gives the risk-band vocabulary for block_threshold (none/low/medium/high/critical) which the schema lacks as an enum, and explains target's default behavior. It adds real meaning the schema does not carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific pipeline (scan + policy-gate + record + conditional generate) and states the key verb ordering, which clearly separates it from the plain sibling scan_prompt. An agent can tell that this is the guarded generate path, not merely a scanner.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the use context explicit ('run if allowed', 'only calls Ollama if allowed') and ties the gating behavior to the block_threshold parameter. It does not, however, compare itself against scan_prompt or a bare generate path, so the agent must infer when to pick this over those.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_modelsARead-only
[READ] Installed models, each annotated with the allow/deny policy verdict.
Shadow (unsanctioned) models show allowed: false.
Args: target: Ollama target name from config; omit for the default (local).
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The [READ] marker is consistent with readOnlyHint=true and adds nothing on its own, but the description goes beyond annotations by disclosing the returned content: each model is annotated with a policy verdict and unsanctioned "shadow" models surface as allowed: false. That is meaningful behavioral context for a policy-aware tool, though error/timeout behavior against a target is not covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the [READ] marker and the core purpose, then one short clarifying sentence, then the arg note. Every sentence earns its place; the "Args:" block is slightly formulaic but harmless.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-param read-only lister with no output schema, the description covers what is listed, the special output case (shadow models with allowed: false), and the parameter's default semantics. It stops short of describing the return shape (e.g. name/hash fields) or failure modes against an unavailable target, which would make it fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does: it identifies target as an Ollama target name from config and states that omitting it selects the default (local). It doesn't enumerate valid target names or where in config they live, so it is not fully compensating, but it is well above the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a specific verb and resource — installed models — plus the distinctive twist that each entry carries an allow/deny policy verdict. The "installed" scope implicitly separates it from running_models and model_details, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the resource scope (list what's installed rather than what's running), and the target arg guidance says to omit it for the default. There is no explicit when-to-use or when-not-to-use statement versus alternatives like running_models or model_details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
model_detailsBRead-only
[READ] License / parameters / capabilities for one model.
Args: model: Model name (e.g. "llama3.2:3b"). target: Ollama target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description's '[READ]' tag merely echoes that. It does add value by naming what the call returns (license/parameters/capabilities), but says nothing about error behavior when a model is absent or how large/rich the payload is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose in one bracketed line, then lists only the two parameters. Every sentence is useful, though the '[READ]' marker duplicates the annotation and the Args block could be folded together.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema and a clear annotation, the description supplies purpose, returned content, and both parameter meanings. Adequate; only absent-model/error semantics are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and mostly succeeds: it gives a concrete example format for 'model' ("llama3.2:3b") and explains 'target' as an Ollama target name with an explicit default when omitted. Minor gap: it doesn't say whether target accepts multiple entries or how names are discovered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb and resource — read details for a single model — and enumerates the returned content (license, parameters, capabilities). The 'one model' scope implicitly separates it from list_models/running_models, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to use this versus list_models, model_provenance, or running_models. Only the target parameter's default behavior is hinted at ('omit for the default'), which is parameter guidance, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
model_provenanceARead-only
[READ] Compare each installed model's digest against its pin; flag drift.
Args: target: Ollama target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes this is a safe, non-mutating read, so the '[READ]' tag adds nothing beyond the annotation. The description does add operational context (it compares digests to pins and reports drift), but it omits what happens when a model has no pin, how drift is presented, or any cost/rate considerations. Adequate, not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short units, both earning their place: the purpose sentence is front-loaded and the Args block documents the single parameter tersely. No filler, no restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter read tool with no output schema, the description covers what the tool does and how to call it. The main residual gap is the notion of a 'pin' — how it is established (via the pin_model_digest sibling) and what the drift report looks like — but this is minor at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema only exposes a bare 'Target' with default null, so the description must carry the meaning — and it does, defining target as an Ollama target name from config and stating that omitting it selects the default. That is genuinely useful semantics beyond the schema, though it doesn't say where the config value comes from.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete verb+resource: compare each installed model's digest against its pin and flag drift. That is clearly distinct from siblings like pin_model_digest (writes a pin) or model_details (inspects one model), even though no sibling is named explicitly. It stops just short of 5 because it never routes the agent relative to those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the drift-audit tool, and 'omit for the default' tells it how to call the parameter. There is no explicit when-to-use, when-not-to-use, or comparison against pin_model_digest / model_details, so it lands at implied-usage level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
observe_chatADestructive
[WRITE][risk=medium] Scan + policy-gate a chat exchange, record it, then run if allowed.
Args: model: Model to run. messages: OpenAI-style [{"role","content"}] messages (contents are scanned). agent / user: Actor attribution recorded in the usage log. block_threshold: Block when risk band >= this. target: Ollama target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | ||
| agent | No | unknown | |
| model | Yes | ||
| target | No | ||
| messages | Yes | ||
| block_threshold | No | high |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations declaring destructiveHint=true and idempotentHint=false, the description adds meaningful behavioral detail: the scan-then-gate-then-record-then-run sequence, the block_threshold gating logic, and the WRITE/risk=medium tag. This goes beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The [WRITE][risk=medium] prefix front-loads the mutation and risk profile efficiently. The Args block is structured and readable, though slightly verbose in listing trivial parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description should explain what is returned (the model response? a policy decision?). It doesn't. For a mutation tool with pipeline behavior, the absence of return-value context is a notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents all 6 parameters reasonably — model, messages, agent/user, block_threshold, target — but lacks detail on format syntax (e.g., valid risk bands for block_threshold, config target format). Adequate but incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific compound verb sequence: 'Scan + policy-gate a chat exchange, record it, then run if allowed.' This clearly states what the tool does. It is distinguishable from guarded_generate and scan_prompt, though it doesn't explicitly name those siblings to differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the pipeline description but no explicit when-to-use vs alternatives is given. The relationship to guarded_generate and scan_prompt is unclear — an agent cannot tell which tool to pick for a given task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pin_model_digestADestructive
[WRITE][risk=medium] Pin a model's expected provenance digest (drift detection).
Args: model: Model name. digest: The expected digest to pin (from list_models / model_details).
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | ||
| digest | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The [WRITE][risk=medium] tag adds context beyond the annotations, and the digest-source pointer is genuinely helpful. But with destructiveHint=true declared, the description never says whether pinning overwrites an existing pinned digest or whether the change is reversible via undo_apply — meaningful gaps for a destructive write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very compact: one summary line plus two short arg lines, with the risk/write markers front-loaded. No wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive write with no output schema and no annotation-adjacent detail, the definition covers the essentials but omits overwrite semantics, reversibility, and any confirmation behavior — all relevant to a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load. It does define both parameters minimally ('model: Model name', 'digest: The expected digest to pin (from list_models / model_details)'), including the provenance of the digest value, but adds no format, validation, or constraint detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Pin a model's expected provenance digest', with the parenthetical '(drift detection)' explaining why. It is distinguishable from siblings like model_provenance or list_models, though it never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (drift detection) and usefully points to where the digest value comes from (list_models / model_details). However it gives no when-not-to-use guidance and does not mention the related undo_apply tool that could reverse a pin.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
policy_viewBRead-only
[READ] The current model allow/deny policy + provenance digest pins.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe, non-mutating call, so the description does not need to restate safety. It adds the substantive content of the response (allow/deny policy and digest pins), which is genuine added context. It says nothing about permissions, freshness, or whether pins are scoped per model, so it stays at a baseline 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the read-only marker front-loaded and no filler. The '[READ]' tag is slightly redundant against readOnlyHint, but it is a cheap, useful scannable prefix and the sentence is appropriately sized for a zero-arg tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only a readOnlyHint annotation, the description carries the burden of explaining the return value, and it does so only in compressed form ('provenance digest pins'). It is enough for an agent to decide to call it, but thin on what the payload actually looks like or whether pins are per-model or global.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to document and the baseline of 4 applies. The description correctly adds no redundant parameter talk.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete resource and its contents: the current model allow/deny policy plus provenance digest pins. That is far more specific than the bare name policy_view and tells the agent exactly what data comes back. It does not explicitly differentiate itself from siblings such as model_provenance, which partially overlaps on the provenance aspect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus the write-side siblings (set_model_allowlist, set_model_denylist, pin_model_digest) or versus model_provenance. The '[READ]' prefix hints at the read-only role but gives no condition or context for selecting it. Usage is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_guidanceARead-only
[READ] How to run the transparent capture proxy, and what it does NOT guarantee.
WRITES NOTHING and starts no listener — it composes the ai-guardian proxy serve command plus the client-side change, and returns the caveat that
matters: the proxy is a CHOKEPOINT, not an enforcement boundary. Any client
that can still reach the runtime's real port bypasses it entirely, and this
tool cannot detect that. Captured traffic is a sample, not the population,
until the runtime is unreachable except through the proxy.
Requests are scanned before forwarding; responses stream through uninspected, because buffering them would turn every streaming client into a blocking one. A governed request whose body cannot be parsed is refused, not forwarded.
Args: listen_host: Address the proxy would bind. listen_port: Port the proxy would bind (default 11435). target: Runtime target from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| listen_host | No | 127.0.0.1 | |
| listen_port | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=true in annotations, the description should carry heavy behavioral burden and it does: it discloses that nothing is written, no listener starts, request scanning vs. response streaming behavior, refusal of unparseable governed bodies, and the critical chokepoint-vs-enforcement caveat. This goes well beyond the annotation's safety hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the key [READ]/WRITES NOTHING framing and organized into clear paragraphs. It is slightly verbose in places but every sentence adds meaningful caveats or behavioral detail rather than restating schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, no annotations beyond readOnlyHint, and 0% schema description coverage, the description supplies the missing context: what the tool does not do, what it returns (the caveat), how the proxy behaves, and parameter meanings. An agent has enough to invoke and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain parameters. It documents listen_host, listen_port (with default 11435), and target semantics reasonably, though listen_host's default (127.0.0.1) is omitted and format expectations are not fully specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ([READ] How to run the transparent capture proxy) and immediately differentiates itself from siblings by clarifying it WRITES NOTHING and starts no listener. An agent can tell this is a guidance/composition tool rather than an execution tool without checking the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly frames the guidance context ('how to run... and what it does NOT guarantee') and explains the composition behavior, but does not explicitly name alternative sibling tools or state precise when-not-to-use conditions (e.g., when to use running_models or server_status instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pull_modelADestructive
[WRITE][risk=medium] Pull a model — refused if it violates the deny/allow policy.
Args: model: Model name to pull. target: Ollama target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the destructive, non-idempotent, non-readonly profile, so the safety bar is lowered. The description adds genuine value beyond that by disclosing the deny/allow policy gate that can refuse the operation, which is not captured in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation type and risk tag, then the one-line purpose, then the args. The args section is justified by the 0% schema coverage, and there is no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a medium-risk write operation it covers the key gaps (the policy gate and both parameters) while annotations handle the safety profile, but it says nothing about the nature of the pull (registry download, potential size/time cost, or failure behavior). Adequate but leaves meaningful operational questions open.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the param burden, and it does: it defines 'model' and explains that 'target' is an Ollama config name that should be omitted for the default. This compensates well for the empty schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Pull a model') and tags the operation type and risk level via '[WRITE][risk=medium]'. This clearly separates it from read-oriented siblings like list_models and model_details, though it does not name a specific sibling to contrast with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Adds one useful condition ('refused if it violates the deny/allow policy') that tells the agent when the call fails, but gives no explicit guidance on when to pull versus unload/remove/pin operations. Usage is largely inferred from the purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_modelADestructive
[WRITE][risk=high] Delete a local model. Destructive — pass dry_run=True to preview.
Captures the model's manifest so the harness records an undo (re-pull).
An undo is recorded only when the allow/deny policy would permit re-pulling the model. For a denied one the result says reversible=false and explains why, rather than recording a re-pull that undo_apply is bound to refuse. The dry-run preview carries the same verdict, so the caller learns it before the deletion rather than after.
Args: model: Model name to delete. dry_run: If True, return what WOULD be deleted without deleting. target: Ollama target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | ||
| target | No | ||
| dry_run | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds substantial context the annotations cannot: undo/re-pull recording, the interaction with the allow/deny policy, the reversible=false outcome for denied models, and that dry-run carries the same verdict. This is exactly the beyond-annotation disclosure an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the risk marker and destructive warning, which is the right structure for a high-risk tool. The undo-policy explanation spans several sentences and restates the dry-run verdict point, so it is slightly more verbose than needed, but most sentences earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent tool without an output schema, the description covers the critical unknowns: reversibility, undo recording, policy preconditions, and dry-run behavior. It does not detail the actual return payload beyond reversible=false, but the essential decision inputs are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and documents all three parameters, including intent for dry_run ('return what WOULD be deleted without deleting') and target ('Ollama target name from config; omit for the default'). Only model is covered tersely, but the semantics are adequately conveyed, so it compensates for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a local model') and immediately flags the WRITE/high-risk nature. It is clearly distinguishable from siblings like unload_model (unload vs. permanent delete) and pull_model, so an agent can route correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use instruction for the dry_run preview ('pass dry_run=True to preview'), which is actionable guidance. It does not, however, contrast itself against the semantically close sibling unload_model or state when not to use it, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
running_modelsARead-only
[READ] Currently loaded models: VRAM footprint + residency expiry.
Args: target: Ollama target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and the description reinforces it with a '[READ]' marker, so the safety profile is covered twice over. It adds the useful detail that results include VRAM footprint and residency expiry, but says nothing about freshness, scoping to a single target, or failure modes when the target is unreachable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key information (read-only, currently loaded, what is returned) is front-loaded in a single line, with the argument detail tucked into an Args block. The prose is tight with no filler; the Args block is slightly heavyweight for one optional parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must at least signal what comes back, and it does (VRAM footprint + residency expiry). For a zero-required-parameter read tool with annotations covering safety, that is close to sufficient, though the shape/units of the returned figures remain unknown.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for the single parameter — and it does: 'Ollama target name from config; omit for the default' explains both meaning and the optional/default behavior. No format examples or naming conventions for targets are provided, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific operation (list currently loaded models) and even names the returned content (VRAM footprint + residency expiry), which lets an agent separate it from list_models (catalogue listing) and vram_usage. It stops short of explicitly naming those siblings, so differentiation is inferable rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the phrase 'currently loaded models' and the '[READ]' tag. There is guidance for the target argument ('omit for the default') but no statement of when to prefer this over list_models, vram_usage or server_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_promptARead-only
[READ] Pure content scan of a text for secrets / PII / code / jailbreak.
No Ollama call — a deterministic scan returning findings + a weighted risk band. Use it to pre-check anything before sending it to a local model.
Args: text: The text to scan.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description carries real added weight: it discloses that no Ollama/LLM call is made, that the scan is deterministic, and that it returns findings plus a weighted risk band. That is meaningful behavior beyond the annotation, though it omits details like severity thresholds or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the [READ] tag and the one-line purpose, then the key behavioral note, then usage. The trailing Args block restating a self-evident parameter is slightly wasteful but overall tight and well-ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description usefully sketches the return value (findings + weighted risk band) and the deterministic nature. Nothing critical for invoking it correctly is missing, though the output shape is described only in the abstract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but there is only one parameter and the description's 'Args: text: The text to scan' is essentially redundant with the schema title 'Text'. It neither compensates with format guidance (e.g., size limits, encoding) nor leaves anything genuinely unclear, so a baseline 3 fits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (scan) and resource (a text/prompt) with a clearly enumerated scope: secrets / PII / code / jailbreak. It also implicitly distinguishes itself from the sibling 'guarded_generate' by being the pure scan rather than the generation path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to 'use it to pre-check anything before sending it to a local model,' which gives a clear usage context. It stops short of naming the alternative (guarded_generate) or stating when NOT to use it, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_statusARead-only
[READ] Ollama reachability + version.
Args: target: Ollama target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered; the '[READ]' prefix merely restates that. The description adds that the call returns version info, but says nothing about auth requirements, failure/timeout behavior, or latency, which would matter for a reachability probe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short elements, front-loaded with the purpose before the argument note. No filler sentences; every line earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-optional-param read probe with no output schema, the description covers what is checked (reachability + version) and how to select a target. Nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden for the single 'target' parameter. It explains that target is an 'Ollama target name from config' and that omitting it selects the default, which is real meaning beyond the bare anyOf string/null schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource: it checks Ollama reachability and reports its version. That is clearly distinct from the sibling tools (list_models, running_models, pull_model, etc.), though it never explicitly names what it is not for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (call this to see whether the Ollama server is up and what version it runs), and the param note 'omit for the default' gives a small routing hint. There is no explicit when-to-use/when-not or reference to alternative siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_model_allowlistADestructive
[WRITE][risk=medium] Replace the model allowlist (glob patterns; empty = allow-all).
Args: models: Shell-glob patterns of permitted model names (e.g. ["llama3.", "qwen"]).
| Name | Required | Description | Default |
|---|---|---|---|
| models | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, but the description adds real value: the [WRITE][risk=medium] tag and the fact that this is a full replacement whose empty value means allow-all (a dangerous default worth surfacing). The one gap is that the annotation idempotentHint=false sits oddly with 'Replace' semantics, and no side effects (audit entries, immediate enforcement) are disclosed to explain it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely economical: a leading write/risk marker, one sentence of semantics, and one argument line with syntax plus example. Nothing is redundant and the risk/write signal is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema mutation whose annotations already carry the destructive profile, the description supplies the argument format and the critical empty-value behavior. It omits revert guidance despite an undo_apply sibling existing, and does not describe enforcement timing, minor gaps for a medium-risk write.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single 'models' parameter is undocumented in the schema, so the description carries the load. It does so well: it specifies shell-glob syntax, gives concrete examples like ["llama3.*", "qwen*"], and defines the empty-list edge case as allow-all. It does not say how malformed patterns are handled, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Replace the model allowlist', which immediately distinguishes it from set_model_denylist and other model-management siblings. 'Replace' also clarifies it is a full overwrite rather than an append. It stops short of naming the sibling it is not, so it is clear but not maximally differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance: nothing says when an allowlist is preferable to set_model_denylist, what precedence applies if both are set, or whether the change takes effect on already-running models. The 'empty = allow-all' note is a semantic default, not usage routing. The agent must infer the operating context from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_model_denylistBDestructive
[WRITE][risk=medium] Replace the model denylist (deny patterns always win).
Args: models: Shell-glob patterns of forbidden model names.
| Name | Required | Description | Default |
|---|---|---|---|
| models | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write, destructive, and non-idempotent profile, so the [WRITE][risk=medium] tag is largely redundant. The description does add real context beyond the annotations: "Replace" discloses full-overwrite semantics (existing entries are discarded) and "deny patterns always win" discloses precedence over the allowlist. It says nothing about validation, persistence, or required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Terse header plus a one-line Args block is front-loaded and waste-free. The risk tag partially duplicates the annotations, but the size is well matched to a one-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single parameter, no output schema, and annotations covering the safety profile, the description is close to sufficient: it names the resource, the replacement semantics, the precedence rule, and the pattern syntax. It omits interaction with the allowlist tool and any confirmation/permission requirements, which leaves a mild gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema only types the single parameter as an array of strings, so the description must carry the burden. "Shell-glob patterns of forbidden model names" adds the matching syntax (shell-glob) and the meaning of each element, which is exactly what the schema omits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Replace the model denylist") plus the scope qualifier that deny patterns take precedence. An agent can distinguish it from the sibling set_model_allowlist by the resource word alone, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is given; the agent is not told when to choose this over set_model_allowlist, pin_model_digest, or removal tools. The "deny patterns always win" note hints at precedence relative to the allowlist but does not state a usage condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_applyADestructive
[WRITE][risk=medium] Apply a recorded undo by dispatching its inverse tool.
The inverse runs through its own governed tool, so its real risk tier is recorded there. Pass dry_run=True to preview the inverse call without executing it. A token can only be applied once.
Args:
undo_id: The undoId from undo_list (or an _undo_id in a write result).
dry_run: If True, preview the inverse tool + params without running it.
target: Passed through to the inverse tool when it accepts a target.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| dry_run | No | ||
| undo_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and idempotentHint=false; the description adds real value on top by explaining that the actual risk tier lives with the dispatched inverse tool, that dry_run previews without executing, and that the token is single-use. It does not describe what the inverse dispatch returns or what failure looks like, so it is not maximally transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The [WRITE][risk=medium] tag and the core behavior/constraint sentences are front-loaded and efficient, and the Args block is compact. The Args list partially restates schema parameter names, but each entry adds meaning, so waste is minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent, destructive, three-parameter mutation with no output schema, the description supplies the missing context an agent needs: the risk marker, the once-only token rule, the preview path, and parameter sourcing. Only the result shape of the dispatched inverse call is left unspecified, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and largely meets it: undo_id is traced to its source (undo_list or `_undo_id` in a write result), dry_run is defined as a preview flag, and target is explained as pass-through to the inverse tool. The pass-through semantics of `target` (when it is rejected or ignored) remain somewhat vague.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Apply a recorded undo') and explains the mechanism (dispatching its inverse tool), which separates it cleanly from the sibling undo_list that only lists tokens. An agent can immediately tell what this does that its siblings do not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the context of use (apply a token obtained from undo_list or an `_undo_id` in a write result) and offers dry_run=True as the preview path, plus the constraint that a token can be applied only once. There is no explicit when-not-to-use or named alternative beyond undo_list, so it stops just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_listARead-only
[READ] List recorded, not-yet-applied undo tokens (most recent first).
Each entry names the original tool, the inverse tool that undo_apply
would run, and a human note. Use the undoId with undo_apply.
Returns {"undos": [...], "returned": N, "limit": L, "truncated": bool}.
truncated is measured (one extra row is fetched), not guessed from a
length coincidence: when it is true there are MORE tokens than shown, so
re-run with a higher limit rather than reporting the list as complete.
Each entry carries effectVerified. False means the original write lost
its response, so the change it reverses is PROBABLE, not confirmed — check
the live state before applying, and do not report the result as a restore
of a state that may never have been reached.
Args: limit: Max rows to return (default 50, capped at 500). target: Unused (undo state is host-local); accepted for CLI uniformity.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=true; the description goes well beyond that by disclosing the return shape, that truncation is *measured* via an extra-row fetch, and that effectVerified=false means the reversed change is only PROBABLE, with a caution to check live state and not over-report. This is meaningful operational context the annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the sibling handoff, then structured paragraphs for return value and the effectVerified caveat. Every sentence carries information, though the emphasis on truncation being 'measured, not guessed from a length coincidence' is slightly verbose for the value it adds.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description supplies the return JSON shape, the meaning of every field an agent must act on (returned, limit, truncated, effectVerified), and the follow-up behavior for truncation. Nothing needed to call or interpret it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and no param has an enum, so the description must compensate, and it does fully: limit is documented as default 50 / capped at 500, and target is documented as ignored with the reason (host-local undo state, kept for CLI uniformity).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List recorded, not-yet-applied undo tokens') plus ordering ('most recent first'). The [READ] tag and the reference to undo_apply make it clearly distinguishable from the sibling that actually applies tokens.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use the undoId with undo_apply.' and tells it to re-run with a higher limit when truncated rather than reporting a partial list as complete. It lacks an explicit 'when not to use this' condition, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unload_modelADestructive
[WRITE][risk=medium] Evict a model from VRAM (keep_alive:0).
Args: model: Model name to unload. target: Ollama target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and idempotentHint=false, so safety is covered. The description adds real value beyond them by disclosing the mechanism (keep_alive:0) and a 'risk=medium' signal, telling the agent exactly how eviction is performed rather than just that it mutates state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the write/risk classifier and the core action before the Args block, with no wasted prose. The Args section slightly restates the header's intent but is compact and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity two-parameter write tool with no output schema and annotations covering the safety profile, the description supplies purpose, mechanism, and both parameter meanings. The only material gap is the unaddressed overlap with the remove_model sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load — and it does, documenting both parameters: 'model' as the model name to unload and 'target' as an Ollama target from config, including the important 'omit for the default' behavior that the schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Evict a model from VRAM (keep_alive:0)' — an agent immediately knows this frees GPU memory rather than deleting a model. However, it never distinguishes itself from the very similar sibling remove_model, leaving the agent to infer that 'unload' is memory-eviction and 'remove' is disk-deletion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the header tag '[WRITE][risk=medium]' and the VRAM-eviction phrasing, so an agent can infer it's for freeing memory. But there is no explicit when/when-not guidance and no pointer to the near-identical remove_model sibling, which is exactly the ambiguity that needed resolving.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
usage_eventsARead-only
[READ] Query the observed-usage log (route-through prompts + their findings).
Args: model: Filter by model name. risk_level: Filter by risk band (none/low/medium/high/critical). allowed: True = only allowed calls; False = only blocked. since: ISO start timestamp. limit: Max rows.
Returns {"events": [...], "count": N, "returned": N, "limit": L, "truncated": bool}. When truncated is true more prompts were observed
than were returned — raise the limit or narrow the filters. Never conclude
"no risky prompts were observed" from a truncated result.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| model | No | ||
| since | No | ||
| allowed | No | ||
| risk_level | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is already declared, and the description still adds significant behavioral context: the exact return envelope, the meaning of truncated, and the explicit warning not to conclude 'no risky prompts were observed' from a truncated result. That goes well beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose line followed by a compact Args block and return-contract paragraph; nothing is wasted and the crucial truncation caveat is prominent. The Args list partially echoes schema names, but each entry adds a semantic gloss, so the cost is low.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and zero schema-description coverage, the description compensates by documenting the return envelope and the truncation interpretation rule. Nothing an agent needs to invoke or correctly read this call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and meets it: all five parameters (model, risk_level, allowed, since, limit) are explained, including the non-obvious allowed=True/False semantics and the enumerated risk bands (none/low/medium/high/critical) absent from the schema. Only the default limit value is left unstated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Query the observed-usage log', with a clarifying parenthetical ('route-through prompts + their findings') that distinguishes it from the raw-scan/policy siblings like scan_prompt and anomaly_report. An agent can identify what this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use/when-not versus alternatives among the 20 siblings (e.g., anomaly_report vs raw event listing). It does give filter semantics and a strong interpretation caveat about truncated results, but routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vram_usageBRead-only
[READ] Total VRAM used by loaded models; flag over-budget.
Args: budget_bytes: Optional VRAM budget; models over it are flagged. target: Ollama target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| budget_bytes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The [READ] prefix is consistent with readOnlyHint=true and adds no contradiction. Beyond the annotation, the description discloses one useful behavioral trait: models exceeding a supplied budget are flagged. It says nothing about output format beyond that flag or about cost/latency of the call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded summary sentence followed by a compact Args block; each line carries information. The [READ] tag slightly duplicates the readOnlyHint annotation but is cheap and useful for scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description covers the operation, both parameters, and the one non-obvious output behavior (over-budget flagging). Missing only return-shape detail and sibling routing, which are minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does document both parameters: budget_bytes as an optional VRAM budget with over-budget flagging behavior, and target as an Ollama config name that defaults when omitted. Only the byte unit/format of budget_bytes is left implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb-like operation and resource: reports total VRAM consumed by loaded models and flags models over budget. It is clearly distinguishable from siblings like server_status or running_models, though it never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool versus alternatives (e.g. running_models or server_status), and no prerequisites or exclusions. The only usage-like guidance is 'omit for the default' on the target parameter, which is parameter-level rather than tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.10.0- Added
proxy_guidance
20 tool updates
v0.6.0- First observed
anomaly_report - First observed
guarded_generate - First observed
list_models - First observed
model_details - First observed
model_provenance - First observed
observe_chat - First observed
pin_model_digest - First observed
policy_view - First observed
pull_model - First observed
remove_model - First observed
running_models - First observed
scan_prompt - First observed
server_status - First observed
set_model_allowlist - First observed
set_model_denylist - First observed
undo_apply - First observed
undo_list - First observed
unload_model - First observed
usage_events - First observed
vram_usage
TDQS
Scored across 21 tools
Most tools target clearly distinct actions/resources: scanning (scan_prompt), generation (guarded_generate), chat (observe_chat), policy (allowlist/denylist), and state reads (server_status, policy_view). The one soft cluster is model introspection—list_models, running_models, model_details, and vram_usage—but their descriptions clearly separate installed, loaded, single-model, and aggregate-VRAM views.
There is a loose but not reliable pattern: action tools are verb_noun (pull_model, remove_model, unload_model, scan_prompt, set_model_allowlist, pin_model_digest, undo_apply) while many state tools are noun phrases (server_status, policy_view, vram_usage, usage_events, anomaly_report, model_provenance). The mix is readable and grep-able, but not predictable enough to be a clean convention.
At 21 tools this is on the heavy side for the rubric's 3-15 sweet spot, spanning model introspection, model lifecycle, policy/provenance, scanning/governance, usage analytics, undo, and proxy guidance. Most tools appear justified by a genuinely broad domain, but the surface is large enough that count is borderline rather than well-scoped.
Coverage is strong: model lifecycle (list/pull/remove/unload/details), policy management (view/allow/deny/pin/provenance), governance (scan, guarded_generate, observe_chat, usage_events, anomaly_report), and an undo mechanism (undo_list/undo_apply). Minor gaps remain—allowlist/denylist can only be replaced wholesale (no per-model toggle), and there is no persistent block-threshold configuration tool—but core workflows are covered without dead ends.
Maintenance
Related MCP Connectors
The WAF for agents. Pattern-based + heuristic firewall scans prompts, RAG documents, tool argume...
Security gateway for AI agents: policy, approval, and audited execution, no secrets shared.
Deterministic runtime safety for AI agents: scan PII, gate tool actions, verify LLM output.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with locally running Ollama models through chat, generation, and model management operations. Supports listing, downloading, and deleting models while maintaining conversation history for interactive sessions.248 npmMIT
- AlicenseAqualityBmaintenanceLocal zero-trust permission gateway for AI agents. Enforces policy-based tool authorization, human approvals, scoped permissions, and cryptographically verifiable audit logs.466 PyPI5Apache 2.0
- FlicenseBqualityDmaintenanceEnables AI agents to interact with local Ollama models for text generation and tool calling with prompt injection protection.5-
- AlicenseAqualityCmaintenanceEnables Claude Code to offload routine code generation and text processing tasks to a local Ollama LLM, saving Cloud API tokens and costs with automatic model selection and security features.11270 npm4Apache 2.0