Skip to content

Rul1an/assay

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,660 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Assay

The firewall for MCP tool calls — with a replayable audit trail.

Crates.io CI License

See It Work · Quick Start · CI Guide · Discussions


Your MCP agent calls read_file, exec, web_search — but should it?

Assay sits between your agent and its tools. It intercepts every MCP tool call, checks it against your policy, and blocks what shouldn't happen. Every decision produces an evidence trail you can audit, diff, and replay.

  Agent ──► Assay ──► MCP Server
              │
              ├─ ✅ ALLOW (policy match)
              ├─ ❌ DENY  (blocked, logged)
              └─ 📋 Evidence bundle

No hosted backend. No API keys. Deterministic — same input, same decision, every time.

The average MCP server scores 34/100 on security. Assay gives you the policy gate and audit trail to fix that. Covers 7 of 10 OWASP MCP Top 10 risks.

See It Work

cargo install assay-cli

mkdir -p /tmp/assay-demo && echo "safe content" > /tmp/assay-demo/safe.txt

assay mcp wrap --policy examples/mcp-quickstart/policy.yaml \
  -- npx @modelcontextprotocol/server-filesystem /tmp/assay-demo
✅ ALLOW  read_file  path=/tmp/assay-demo/safe.txt  reason=policy_allow
✅ ALLOW  list_dir   path=/tmp/assay-demo/           reason=policy_allow
❌ DENY   read_file  path=/etc/passwd                reason=path_constraint_violation
❌ DENY   exec       cmd=ls                          reason=tool_denied

Then inspect the audit artifact Assay can hand to security or compliance:

assay evidence show demo/fixtures/bundle.tar.gz

Evidence Bundle Inspector

The bundle is tamper-evident and cryptographically verifiable. If your run includes signed mandate events, the same bundle also carries the Ed25519-backed authorization trail for high-risk actions.

Is This For Me?

Yes, if you:

  • Build with Claude Desktop, Cursor, Windsurf, or any MCP client
  • Ship agents that call tools and you need to control which ones
  • Want a CI gate that catches tool-call regressions before production
  • Need a deterministic audit trail, not sampled observability

Not yet, if you:

  • Don't use MCP (Assay is MCP-native; other protocols are on the roadmap)
  • Need a hosted dashboard (Assay is CLI-first and offline)

Add to Cursor in 30 Seconds

Assay ships a helper that finds your local Cursor MCP config path and prints a ready-to-paste entry:

assay mcp config-path cursor

It generates JSON like:

{
  "filesystem-secure": {
    "command": "assay",
    "args": [
      "mcp",
      "wrap",
      "--policy",
      "/path/to/policy.yaml",
      "--",
      "npx",
      "-y",
      "@modelcontextprotocol/server-filesystem",
      "/Users/you"
    ]
  }
}

The same wrapped command works in other MCP clients:

  • Cursor: paste the generated entry into mcpServers
  • Windsurf: paste the same mcpServers entry into ~/.codeium/windsurf/mcp_config.json
  • Zed: paste the wrapped command into context_servers in your settings JSON

See MCP Quick Start for client-specific examples.

Policy Is Simple

version: "2.0"
name: "my-policy"

tools:
  allow: ["read_file", "list_dir"]
  deny: ["exec", "shell", "write_file"]

schemas:
  read_file:
    type: object
    additionalProperties: false
    properties:
      path:
        type: string
        pattern: "^/app/.*"
        minLength: 1
    required: ["path"]

Already have a legacy constraints: policy? Assay still reads it, warns once, and ships assay policy migrate to write the v2 JSON Schema form.

Or don't write one — generate it from what your agent actually does:

assay init --from-trace trace.jsonl

See Policy Files for the full YAML schema.

OpenTelemetry In, Evidence Out

Already tracing with Langfuse or an OTel-enabled agent stack? Keep that pipeline. Assay ingests OpenTelemetry JSONL, turns it into replayable traces, and gives you deterministic policy gates plus exportable evidence bundles.

assay trace ingest-otel \
  --input otel-export.jsonl \
  --db .eval/eval.db \
  --out-trace traces/otel.v2.jsonl

Then run assay ci on the converted trace or export an Evidence Bundle for audit handoff. See OpenTelemetry & Langfuse.

Add to CI

# .github/workflows/assay.yml
name: Assay Gate
on: [push, pull_request]
permissions:
  contents: read
  security-events: write
jobs:
  assay:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: Rul1an/assay-action@v2

PRs that violate policy get blocked. SARIF results show up in the Security tab.

Measured Latency

On the M1 Pro/macOS fragmented-IPI harness, Assay's protected tool-decision path measured:

  • Main protection run: 0.771ms p50 / 1.913ms p95
  • Fast-path scenario: 0.345ms p50 / 1.145ms p95

These are tool-decision timings, not end-to-end model latency.

Beyond MCP: Protocol Adapters

Assay already ships adapters for emerging agent protocols:

Protocol Adapter What it maps
ACP (OpenAI/Stripe) assay-adapter-acp Checkout events, payment intents, tool calls
A2A (Google) assay-adapter-a2a Agent capabilities, task delegation, artifacts
UCP (Google/Shopify) assay-adapter-ucp Discover/buy/post-purchase state transitions

Each adapter translates protocol-specific events into Assay's canonical evidence format. Same policy engine, same evidence trail — regardless of which protocol your agent speaks.

The agent protocol landscape is fragmenting (ACP, A2A, UCP, AP2, x402). Assay's bet: governance is protocol-agnostic. The evidence and policy layer stays the same even as protocols come and go.

Why Assay

Deterministic Same input, same decision, every time. Not probabilistic.
MCP-native Built for MCP tool calls. Adapters for ACP, A2A, UCP.
Evidence trail Every decision is auditable, diffable, replayable.
Offline-first No backend, no API keys. Runs on your machine.
Measured 0.771ms p50 / 1.913ms p95 in the main M1 Pro/macOS tool-decision harness.
Tested 3 security experiments, 12 attack vectors, 0 false positives.

Install

cargo install assay-cli

In CI: use the GitHub Action directly.

Python SDK: pip install assay-it

Learn More

Contributing

cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings

See CONTRIBUTING.md. Join the discussion.

License

MIT

About

The firewall for MCP tool calls. Block unsafe calls, audit every decision, replay anything. Deterministic policy enforcement with evidence bundles.

Topics

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Contributors