cordon
すべての企業がAIエージェントを導入したいと考えていますが、データベースの鍵をエージェントに渡すことを望む企業はありません。
Cordonは信頼のギャップを埋めます。
デモ
https://github.com/user-attachments/assets/153d978f-6303-443a-b49b-b4ec7ebf0452
課題
Model Context Protocol (MCP) により、AIエージェントにデータベース、ファイルシステム、API、クラウドインフラなどの強力なツールへのアクセスを簡単に提供できるようになりました。
しかし、MCPには組み込みのセキュリティモデルがありません。監査ログも、承認ワークフローも、レート制限もありません。現在、AIエージェントはオフかフル管理者権限のどちらかであり、その中間が存在しません。
これが、AIエージェントが本番環境に到達するのを阻む最大の障壁となっています。
解決策
Cordonは、LLMとMCPサーバーの間に配置されるセキュリティゲートウェイです。
これはファイアウォール、監査人、そしてリモートコントロールとして機能し、AIエージェントができることとできないことに対して完全な可視性と権限を提供します。
┌─────────┐ ┌──────────┐ ┌──────────────┐
│ LLM / │ ──▶ │ Cordon │ ──▶ │ MCP Server │
│ Agent │ ◀── │ Gateway │ ◀── │ (database, │
└─────────┘ └──────────┘ │ fs, APIs) │
│ └──────────────┘
├── Policy Engine
├── Audit Logger
└── Approval Workflowsインフラの変更は不要です。書き換えも不要です。設定ファイルは1つだけです。
クイックスタート
ステップ1 — 初期化
プロジェクト内(claude_desktop_config.jsonが存在する場所)で以下を実行します:
npx cordon-cli initこれにより、既存のClaude DesktopのMCP設定が読み取られ、cordon.config.tsが生成され、すべてのツール呼び出しがCordonを経由するようにClaude Desktopにパッチが適用されます。
ステップ2 — 開始
npx cordon-cli startCordonが起動し、MCPサーバーに接続してツール呼び出しのインターセプトを開始します。Claude Desktopを再起動すると、すべてのツール呼び出しがゲートウェイを経由するようになります。
手動セットアップ
手動で設定したい場合は、グローバルにインストールして設定を作成してください:
npm install -g cordon-cli
cordon initcordon initはcordon.config.tsを生成します:
import { defineConfig } from 'cordon-sdk';
export default defineConfig({
servers: [
{
name: 'database',
transport: 'stdio',
command: 'npx',
args: ['-y', '@my-org/db-mcp-server'],
policy: 'read-only', // Block all write operations
},
{
name: 'github',
transport: 'stdio',
command: 'npx',
args: ['-y', '@modelcontextprotocol/server-github'],
policy: 'approve-writes', // Reads pass; writes require approval
tools: {
delete_branch: 'block', // Never, regardless of approval
},
},
],
audit: {
enabled: true,
output: 'stdout', // or 'file'
},
approvals: {
channel: 'terminal',
timeoutMs: 60_000, // auto-deny after 60s if no response
},
});Cordonを選ぶ理由
Cordonなし | Cordonあり |
エージェントがツールに無制限にアクセス可能 | ツールごとの詳細なポリシー |
エージェントの動作が可視化されない | すべての呼び出しの構造化された監査証跡 |
「エージェントがテーブルを削除した?」 | リアルタイムのターミナル承認 |
読み取りと書き込みが同じ扱い |
|
コンプライアンスチームがAIに反対 | エクスポート可能な監査ログ |
機能
ポリシーエンジン
ツールごと、サーバーごと、またはグローバルにルールを定義します。ツールレベルのポリシーはサーバーポリシーを上書きします。
// Server-level default
policy: 'approve-writes',
// Per-tool overrides
tools: {
query: 'allow', // reads: pass through
execute: 'approve', // writes: pause for human approval
drop_table: 'block', // catastrophic: always reject
list_tables: 'log-only', // audit but don't interrupt
},ヒューマン・イン・ザ・ループ承認
ツール呼び出しに承認が必要な場合、Cordonはエージェントを一時停止し、ターミナルで直接あなたにプロンプトを表示します:
╔══════════════════════════════════════╗
║ ⚠ APPROVAL REQUIRED ║
╚══════════════════════════════════════╝
Server : database
Tool : execute_sql
Args :
{
"query": "DELETE FROM sessions WHERE expires_at < NOW()"
}
[A]pprove [D]eny
>エージェントは待機します。あなたが決定を下します。
監査ログ
すべてのツール呼び出しは、リクエスト、ポリシー決定、レスポンス、タイミングを含む構造化されたJSONとしてログに記録されます。stdoutにパイプするか、コンプライアンスチームのためにファイルに書き出します。
{"event":"tool_call_received","callId":"...","serverName":"database","toolName":"execute_sql","timestamp":1773434469641}
{"event":"approval_requested","callId":"...","serverName":"database","toolName":"execute_sql","timestamp":1773434469641}
{"event":"tool_call_approved","callId":"...","serverName":"database","toolName":"execute_sql","timestamp":1773434471203}
{"event":"tool_call_completed","callId":"...","durationMs":34,"isError":false,"timestamp":1773434471237}読み取り専用モード
サーバー全体のすべての書き込み操作をブロックするポリシー設定です。書き込みとみなされるものについて推測する必要はありません。Cordonはツール名からそれを検出します。
policy: 'read-only' // any tool starting with write/create/update/delete/drop/execute/... is blocked仕組み
Cordonは単一の集約型MCPプロキシとして動作します。Claude DesktopがMCPサーバーに直接接続する代わりに、Cordonに接続します。その後、Cordonが内部でサーバーを管理します。
Before: Claude ──▶ MCP Server A (full access)
Claude ──▶ MCP Server B (full access)
After: Claude ──▶ Cordon ──▶ MCP Server A (governed)
──▶ MCP Server B (governed)LLMクライアントとMCPサーバーは一切変更されません。cordon initが設定のパッチ適用を処理します。
設定
ポリシーアクション
ポリシー | 動作 |
| 即座に通過させる |
| 拒否 — エージェントはエラーを受け取る |
| ターミナルでの人間による承認待ちで一時停止 |
| 読み取りは通過、書き込みは承認が必要 |
| すべての書き込み操作をブロック |
| 通過させるが、監査ログにフラグを立てる |
ポリシーはサーバーレベル(全ツールのデフォルト)またはツールごと(サーバーのデフォルトを上書き)に設定できます:
{
name: 'my-server',
policy: 'approve-writes', // server default
tools: {
safe_read: 'allow', // override: always allow
nuke_db: 'block', // override: always block
},
}承認チャネル
チャネル | ステータス |
| 利用可能 — ターミナルでの対話型プロンプト |
| 利用可能 — Block Kitメッセージ、HMAC検証済みインタラクション |
| v0.3で対応予定 |
| v0.3で対応予定 |
監査出力
出力 | ステータス |
| 利用可能 |
| 利用可能 — ローカルファイルに書き込まれるJSON行 |
| 利用可能 — Cordonダッシュボードにイベントを送信 |
| v0.3で対応予定 |
パッケージ
パッケージ | 説明 |
| CLI — |
| TypeScript設定SDK — |
| コアプロキシエンジン — ポリシー評価器、監査ロガー、承認マネージャー |
ロードマップ
[x] 集約モデルを備えたMCPプロキシ(複数のサーバー、1つのゲートウェイ)
[x] ポリシーエンジン — allow, block, approve, approve-writes, read-only, log-only
[x] TTYセーフなプロンプトを備えたターミナル承認チャネル
[x] Slack承認チャネル — Block Kitメッセージ、応答のポーリング
[x] stdout、ファイル、またはホスト型ダッシュボードへの構造化JSON監査ログ
[x]
cordon init— Claude Desktop設定の自動読み取りとパッチ適用[x] レート制限 — スライディングウィンドウ、グローバル / サーバーごと / ツールごと
[x] ホスト型ダッシュボード — 監査ログ履歴、CSV/JSONエクスポート、GitHub OAuth
[x] Stripe課金 — 無料およびProプラン
[ ] OpenTelemetryエクスポート
[ ] チームアカウントと一元管理
[ ] HTTP/SSEトランスポートサポート
例
本番データベーステーブルを削除しようとするエージェントをCordonがインターセプトする動作デモについては、examples/security-showcaseを参照してください。
cd examples/security-showcase
npm install
npm run demoユースケース
個人開発者 — ローカルのClaude/Cursor環境を保護します。エージェントが何を呼び出しているかを正確に把握し、本番環境に到達する前に危険な操作をブロックします。
スタートアップチーム — 自信を持ってエージェントを導入します。すべてのツール呼び出しがログに記録され、書き込みには承認が必要となり、コンプライアンスチームは監査証跡を確保できます。
エンタープライズ — すべてのAIエージェント導入における一元管理。ポリシー・アズ・コード、構造化ログ、SOC2対応の監査証跡への明確な道筋を提供します。
優れた連携ツール
Agent Toolbelt — すぐに使えるMCPツール(ウェブ検索、フェッチ、ファイルシステムなど)の型付きツールキットです。これをClaude Desktopに組み込み、Cordon経由でツール呼び出しをルーティングすることで、ポリシー強制と監査ログ記録が可能になります。Agent Toolbeltはエージェントに力を与え、Cordonはそれを使用する前に確認を徹底させます。
Build & Ship MCP Tools — MCPサーバーをゼロから構築する方法を解説するコンパニオンコースです。モジュール6では、Cordonを使用したサーバーの保護について扱っています。
貢献
Cordonはオープンソースであり、貢献を歓迎します。
git clone https://github.com/marras0914/cordon.git
cd cordon
npm install
npm run build
npm run devライセンス
MIT — 詳細はLICENSEを参照してください。
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/marras0914/cordon'
If you have feedback or need assistance with the MCP directory API, please join our Discord server