Security gateway for MCP. Policy enforcement, audit logging, human-in-the-loop approvals.
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.
Cordon for MCP
Quickstart β’ Why Cordon β’ How It Works β’ Configuration β’ Roadmap β’ Contributing
Every company wants to deploy AI agents. No company is willing to give an agent the keys to their database.
Cordon closes the trust gap.
From the maintainer of Agent Toolbelt β 25+ MCP tools, ~1,600 weekly npm downloads.
https://github.com/user-attachments/assets/153d978f-6303-443a-b49b-b4ec7ebf0452
The Model Context Protocol (MCP) has made it trivially easy to give AI agents access to powerful tools β databases, file systems, APIs, cloud infrastructure.
But MCP has no built-in security model. No audit logs. No approval workflows. No rate limits. Today, an AI agent is either off or full admin. There is nothing in between.
This is the single biggest blocker preventing AI agents from reaching production.
Cordon is the security gateway that sits between the LLM and your MCP servers.
It acts as a firewall, an auditor, and a remote control β giving you complete visibility and authority over what your AI agents can and cannot do.
No infrastructure changes. No rewrites. One config file.
Step 1 β Initialize
Run this inside your project (where your claude_desktop_config.json exists):
This reads your existing Claude Desktop MCP config, generates cordon.config.ts, and patches Claude Desktop to route all tool calls through Cordon.
Step 2 β Start
Cordon starts, connects to your MCP servers, and begins intercepting tool calls. Restart Claude Desktop and every tool call now flows through the gateway.
If you prefer to configure manually, install globally and create a config:
cordon init generates a cordon.config.ts:
| Without Cordon | With Cordon |
|---|---|
| Agent has unrestricted tool access | Granular per-tool policies |
| No visibility into what agents did | Structured audit trail of every call |
| "Did the agent just drop a table?" | Real-time terminal approvals |
| Reads and writes treated the same | approve-writes lets reads through automatically |
| Compliance team says no to AI | Audit logs ready for export |
Define rules per tool, per server, or globally. Tool-level policies override server policies.
When a tool call requires approval, Cordon pauses the agent and prompts you directly in your terminal:
The agent waits. You decide.
Prefer Slack? Connect your workspace once with Add to Slack in the dashboard β no bot token to create or paste β then set approvals: { channel: 'slack' }. A flagged call posts an Approve / Deny card to your channel and pauses until a human clicks, and the approver's name is written onto the audit record. See the Slack approvals setup.
When nobody answers in time. The call is denied and the agent moves on, but the request isn't lost. Cordon retains the pending approval with its full context, and the dashboard lists it under What changed β Timed-out approvals. If someone approves the card after it expired, that late decision is recorded and the call can be re-run:
The replay executes the tool and logs the outcome to the same audit stream with reason replay of late-approved call. It recovers the tool call, not the agent's session β the agent that asked is long gone. Only a call approved after timing out is replayable, since replaying a call that already ran would double-execute it.
Every tool call is logged as structured JSON β the request, the policy decision, the response, and timing. Pipe to stdout or write to a file for your compliance team.
One policy setting to block all write operations across a server. Zero guesswork about what counts as a write β Cordon detects it from the tool name.
For tools the model should never even see β not just rejected on call, but filtered from the tools/list response entirely. Closes a prompt-injection surface: if the model never knows a tool exists, it can't be tricked into calling it.
For database MCP servers where a single tool takes arbitrary SQL (Postgres, SQLite, BigQuery, etc.), tool-name heuristics aren't precise enough β the name query doesn't tell you whether the agent's about to SELECT or DROP TABLE. Cordon ships two policies that parse the SQL itself and decide based on the statement type.
Both policies use the PostgreSQL dialect by default (others coming later) and are fail-closed: unparseable SQL is blocked rather than allowed. Prompt-injection patterns like SELECT 1; DROP TABLE users; and block-comment-wrapped keywords are correctly classified as writes by the AST parser.
Declare the exact tool surface your upstream server is expected to advertise. When the upstream adds a new tool in a future release, Cordon blocks it automatically until you explicitly promote it.
If the next Postgres MCP release adds truncate_table, Cordon blocks it with a stderr warning β no policy update needed. Leave knownTools undefined for backwards-compatible open-world behavior.

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/cordon)<a href="https://allmcps.com/mcp/cordon"><img src="https://allmcps.com/api/badge/cordon?style=directory" alt="Cordon on AllMCPs" /></a>