Open Source

Your agent reads the database. Then writes it to disk.
Your allowlist approved both.

That's exfiltration in two steps, and per-tool allowlists can't see it. Cordon tracks the call graph inside an agent turn and blocks the shape of the attack — not just individual tools.

✓ read_database("customers") allowed ✓ read_database("sessions") allowed   ✗ CALL-GRAPH BLOCK Tool : write_file Args : { "path": "/tmp/data.json", "data": "<query results>" } Rule : read_* → write_file (same turn) Reason : Potential exfil — read followed by write

Sequence-aware policies

Glob the names, match the order.

policy: {
  sequences: [
    {
      pattern: ['read_*', 'write_file'],
      action: 'block',
      reason: 'Potential exfil — read followed by write in same turn'
    }
  ]
}
$ cordon start gateway ready · policy loaded ✓ read_database("customers") allowed ✓ read_database("sessions") allowed ✗ write_file → BLOCKED rule : read_* → write_file (same turn) reason : potential exfil — read then write

Each read is allowed on its own. The sequence gets caught.

No other MCP gateway does this at the policy layer. See how Cordon compares →

How it works

Cordon is a transparent proxy. It requires no changes to your existing MCP servers or client config — cordon init handles the wiring. Every call is checked against your policy and streamed to the audit log on the way through.

Claude Desktop / Code / n8n
        │  stdio or HTTP
        ▼
    Cordon  ──stdio──▶  MCP server A
        ├────stdio──▶  MCP server B
        └────stdio──▶  MCP server N

Works with your setup

Any MCP client, any MCP server. Cordon speaks stdio — the transport every major client already uses — and Streamable HTTP for a shared team gateway (n8n and other HTTP-speaking clients). cordon init auto-patches supported clients; others drop in with a one-line config change.

Claude Desktop
Claude Code
Cursor
Windsurf
VS Code
n8n (HTTP)
Any stdio MCP client

Using an MCP server? If it runs over stdio, Cordon proxies it — no server-side changes required.

What you get

🛡

Policy enforcement

Block entire tool categories or specific tools by name. Reads pass, writes require approval — or block everything except an explicit allowlist.

Human-in-the-loop approvals

Dangerous operations pause and wait for a human. Connect your workspace once — Add to Slack — and approvals post to your channel with the approver's name captured on the record. Terminal approvals too. Miss one? A timed-out approval is retained, not lost, and can be replayed if it's approved late. How it works →

📈

Drift detection

Cordon watches your agents and tells you when they start doing something new — a tool never called before, a new read-then-write sequence, a volume spike. A weekly digest to Slack, or live in the dashboard.

Suggested policies

From your real audit history, Cordon proposes the rules worth adding — the gates and rate limits that match how your agents actually behave. Review, then ship.

📋

Full audit log

Every tool call — args, result, policy decision, approver, timestamp — logged to a file or shipped to the hosted dashboard. Search by tool, export CSV or JSON for an auditor.

☁️

Hosted dashboard

Centralized audit logs across your team. Manage API keys, view call history, connect Slack, export for compliance.

Know when your agents change

A policy tells you what you already decided to block. Drift tells you what you didn't see coming. Cordon learns each agent's normal behavior from its own history, then flags the new stuff — a tool it never called before, a fresh read-then-write sequence, a sudden volume spike. Delivered as a weekly Slack digest, or live in the dashboard.

What changed this week
New tool delete_file first seen Tuesday · 14 calls
New sequence query_customers → http_post read → external send
Spike execute_sql 6× the baseline daily rate

What your team sees

Every call streams to the hosted dashboard — allowed, blocked, or approved, with args, the rule that fired, and who signed off. Search the log, and export CSV or JSON to hand an auditor.

Cordon dashboard audit log — an external POST blocked as an exfil attempt, and a benefit-status write approved by a named case supervisor

Get started in 2 minutes

Step 1 — Install
npm install -g @getcordon/cli
Step 2 — Initialize (patches Claude Desktop automatically)
cordon init
Step 3 — Configure your policy
// cordon.config.ts
import { defineConfig } from '@getcordon/policy';

export default defineConfig({
  servers: [
    {
      name: 'my-db',
      transport: 'stdio',
      command: 'npx',
      args: ['-y', '@my-org/db-mcp'],
      policy: 'approve-writes',
      tools: {
        drop_table: { action: 'block' },
      },
    },
  ],
});
Step 4 — Start
cordon start
Step 5 — Approvals in your Slack (optional)

Click Add to Slack once in the dashboard — no bot token to create or paste. Then a sensitive tool call posts an Approve / Deny card to your channel and pauses until a human clicks, with the approver's name saved to the audit record.

// cordon.config.ts — that's the whole approvals block
approvals: { channel: 'slack' },

Design partners

Shipping agents to a team or a customer?

We're looking for a handful of teams to work closely with as we build out the enterprise features — centralized policy management, SSO, compliance exports. Early partners shape the roadmap and get priority support.

Get in touch →