Originally published on NextFuture
Bạn muốn một chương trình bên ngoài duyệt hoặc chặn từng tool call của coding agent. Trong sáu CLI phổ biến hiện nay, chỉ bốn cái cho bạn làm điều đó — và hai cái trong số đó mặc định là deny khi chương trình của bạn không trả lời.
Số liệu dưới đây đến từ nhóm phát triển Calyx, một terminal macOS chạy song song nhiều coding agent. Họ phải viết tích hợp vào từng CLI nên đã so sánh bốn thứ: đọc cấu hình MCP ở đâu, hook được gọi ra sao, có chặn được permission prompt không, và báo gì về subagent. Version được ghim ở Claude Code 2.1.251, Codex 0.148.0, OpenCode 1.18.18; Hermes, Grok và pi tính theo thời điểm giữa tháng 9/2026.
Bốn cột đáng đọc
CLICấu hình MCPSố eventEvent chặn đượcKhông trả lời thì sao
Claude Code 2.1.251~/.claude.json, JSON10PermissionRequestCLI tự hỏi người dùng
Codex 0.148.0~/.codex/config.toml, TOML9PermissionRequestCLI tự hỏi người dùng
OpenCode 1.18.18opencode.json, JSON7không dùng—
Hermesconfig.yaml, YAML0không có—
Grokconfig.toml, TOML12PreToolUsedeny
pikhông có; extension tự nói JSON-RPC5 + gatetool_calldeny
Khác biệt lớn nhất nằm ở ô "không trả lời"
Với Claude Code và Codex, nếu chương trình duyệt của bạn không phản hồi hoặc không chạy, CLI quay về prompt của chính nó — người dùng vẫn bấm được và công việc vẫn chạy tiếp. Với Grok và pi, im lặng nghĩa là từ chối.
Đó là hai triết lý fail-open và fail-closed, và nó quyết định cách bạn viết service duyệt lệnh. Nếu bạn dựng cổng duyệt trên Grok hoặc pi, service đó thành điểm chết đơn lẻ: nó sập là agent ngừng làm được việc. Trên Claude Code và Codex thì ngược lại — service sập là cổng duyệt của bạn biến mất mà không ai nhận ra. Phía nào cũng cần một cảnh báo, nhưng là hai loại cảnh báo khác nhau.
Hermes hiện không phơi event nào, nên không có chỗ để cắm giám sát; OpenCode có 7 event nhưng theo mô tả trên thì không dùng event chặn. Về subagent, Claude Code và Grok báo cả trạng thái lẫn tool đang chạy, Codex báo vòng đời, OpenCode báo vòng đời ở dạng tổng hợp lại, còn Hermes và pi không báo gì.
Hai cái bẫy cấu hình làm hỏng cả file
Với Claude Code, một tham chiếu ${VAR} tới biến môi trường chưa được định nghĩa sẽ làm hỏng bước parse của toàn bộ ~/.claude.json — tức là mất MCP ở mọi terminal khác mà bạn chạy Claude Code. Vì vậy cú pháp họ viết luôn kèm default rỗng: ${CALYX_SURFACE_ID:-}.
Với Grok, hai định nghĩa cho cùng một TOML table là lỗi parse, và cái giá là toàn bộ MCP server khác trong file. Còn file YAML của Hermes bị nhóm này xử lý bằng regex thay vì YAML parser, và họ chọn báo lỗi thay vì đoán trong ba trường hợp: mcp_servers: {} viết inline, thụt đầu dòng bằng tab, và ký tự điều khiển nằm trong scalar.
Điểm chung của cả ba: file cấu hình agent là một điểm hỏng dùng chung. Sửa tay một dòng cho một dự án có thể tắt MCP của mọi dự án còn lại trên máy.
Kiểm tra trong mười phút
Mở file cấu hình MCP của CLI bạn đang dùng theo đúng đường dẫn trong bảng, và xác nhận mọi
${VAR}đều có default rỗng.Nếu đang viết cổng duyệt lệnh: thử tắt hẳn service đó rồi chạy một tool call, để biết CLI của bạn fail-open hay fail-closed trước khi lên production.
Kiểm lại version: các con số trên được ghim ở ba version cụ thể, và ba CLI còn lại chỉ tính theo giữa tháng 9/2026.
This article was originally published on NextFuture. Follow us for more fullstack & AI engineering content.
Top comments (0)