Deterministic policy enforcement and MCP management for AI agent tool calls.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Deterministic policy enforcement for AI agent tool calls. Every action an agent proposes passes through user-defined rules before execution. No LLM in the authorization path. Advisory nudges are separate from authorization. 25ms end-to-end.
There is no npm or PyPI package for signet-eval. The public distribution path is
crates.io plus source install from GitHub. The MCP Registry listing points at
the repository metadata; the runtime is the local signet-eval serve stdio
server.
1. Hook into Claude Code β add to ~/.claude/settings.json:
For Codex, enable hooks in ~/.codex/config.toml or <repo>/.codex/config.toml:
Then add ~/.codex/hooks.json or <repo>/.codex/hooks.json:
For Antigravity, add this block to ~/.gemini/config/hooks.json (merge it with any existing hook groups):
The same configuration is available at hooks/antigravity-hooks.json.
2. Done. Every tool call now passes through policy evaluation. The default policy blocks destructive operations, protects its own configuration, and allows everything else.
3. (Optional) Customize β talk to Claude with the MCP server:
Then say: "Add a $50 limit for amazon orders" or "Block all rm commands".
Self-protection rules are locked β they cannot be removed, edited, or reordered by the AI agent, even through the MCP management server. This prevents the agent from disabling its own guardrails.
| Action | Decision | Locked |
|---|---|---|
Write/Edit/Bash touching .signet/ | deny | yes |
Write/Edit/Bash touching signet-eval binary | deny | yes |
Write/Edit settings.json / settings.local.json | ask | yes |
Bash kill/pkill/killall + signet | deny | yes |
| Direct edit tools without recent Kindex tag/search/context | deny | yes |
Claude Task* tools (ephemeral task state) | deny | yes |
rm, rmdir | deny | |
git push --force | ask | |
Git remote and gh operations with mismatched target-owner identity | deny | |
mkfs, format, dd if= | deny | |
curl | sh, wget | sh | deny | |
| Everything else | allow |
Edit ~/.signet/policy.yaml:
Rules are evaluated in order β first match wins. Multiple conditions on a rule are AND'd. Rules with locked: true cannot be modified through the MCP management server.
INJECT rules probabilistically add advisory context near the tool call that
triggered them. They are nudges, not authorization: the normal
ALLOW/DENY/ASK/GATE/ENSURE pass remains first-match-wins and
deterministic. Injection runs afterward and only emits context when a matching
inject rule fires.
Trigger modes:
| Mode | Behavior |
|---|---|
constant / step | Fixed probability after cooldown |
linear | Ramps from 0 to peak over peak_after_seconds |
exponential | Approaches peak with exponential decay |
Payload sources:
| Source | Notes |
|---|---|
text | Inline literal text |
text_file | Bare filename under ~/.signet/injections/ |
from_command | HMAC-signed allowlist entry from ~/.signet/inject_commands.yaml; direct exec, no shell |
Template substitutions are enabled by default: {tool_name}, {cwd}, {date},
and {matched_param.X}. See examples/inject_examples.yaml.
| Function | Description | Example |
|---|---|---|
contains(parameters, 'X') | Tool input contains string | contains(parameters, 'rm ') |
any_of(parameters, 'X', 'Y') | Any string present | any_of(parameters, 'mkfs', 'format') |
param_eq(field, 'value') | Field equals value | param_eq(category, 'books') |
param_ne(field, 'value') | Field not equal | param_ne(role, 'admin') |
param_gt(field, N) | Field > number | param_gt(amount, 100) |
param_lt(field, N) | Field < number | param_lt(amount, 5) |
param_contains(field, 'X') | Field contains substring | param_contains(command, 'sudo') |
matches(field, 'regex') | Field matches regex | matches(file_path, '\\.env$') |
has_credential('name') | Credential exists in vault | has_credential('cc_visa') |
spend_gt('cat', N) | Session spend > limit | spend_gt('books', 200) |
spend_plus_amount_gt('cat', field, N) | Spend + this amount > limit | spend_plus_amount_gt('books', amount, 200) |
not(condition) | Negate condition | not(param_eq(format, 'json')) |
or(A || B) | Either condition | or(contains(parameters, '-f') || contains(parameters, '--force')) |
has_recent_action('search', N) | Recent allowed action matches in tool name or detail; pipe-delimited OR | has_recent_action('EnterPlanMode|TaskCreate', 500) |
has_current_session() | Hook host supplied a distinct chat/session identifier | has_current_session() |
true / false | Literal | true |
Three-tier encrypted storage with passphrase-derived key hierarchy (Argon2id + AES-256-GCM):
| Tier | Encryption | Contents |
|---|---|---|
| 1 | None | Action log, spending ledger |
| 2 | Session key | Session state |
| 3 | Compartment key | CC numbers, API tokens, secrets |
Credentials support scoped access via request_capability: domain restrictions, purpose constraints, per-use amount caps, and one-time tokens that auto-invalidate after a single use.
Spending limits use the vault ledger β each tool call that spends money is logged, and spend_plus_amount_gt() checks cumulative totals before allowing the next purchase.
signet-eval ships with locked rules that prevent an AI agent from disabling its own policy enforcement:
protect_signet_dir β Denies any Write, Edit, or Bash command touching .signet/ (policy files, vault, HMAC)
protect_signet_binary β Denies tampering with the signet-eval binary itself
protect_hook_config β Requires user confirmation before modifying settings.json (where the hook is configured)
protect_signet_process β Denies kill/pkill/killall commands targeting signet processes
protect_preflight_storage β Denies agent-side mutation of preflight records
require_kindex_engagement_before_edits β Denies direct edit tools until durable session context is recorded
prefer_persistent_task_store β Denies ephemeral Task* state and points agents to Kindex tasks
protect_checks_dir β Denies agent-side replacement of trusted ENSURE scripts
protect_vault_passphrase β Reserves vault setup and unlock operations for the human
protect_signet_symlink β Denies symlink bypasses targeting protected enforcement surfaces
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/signet-eval)<a href="https://allmcps.com/mcp/signet-eval"><img src="https://allmcps.com/api/badge/signet-eval?style=directory" alt="Signet Eval on AllMCPs" /></a>