- MCP (Model Context Protocol) là chuẩn mở cho coding agent gọi tool ngoài.
- Codex CLI hỗ trợ MCP native, đặt config trong file JSON tại $HOME/.codex/.
- Postgres MCP cho phép Codex query database trực tiếp, không cần copy paste schema.
- GitHub MCP cho phép Codex tạo PR, comment issue, review code mà không phải mở browser.
- Slack MCP gửi notification từ task headless, dev solo biết kết quả không phải SSH check.
Codex CLI nguyên bản đã mạnh, nhưng khi kết hợp với MCP server thì biến thành coding agent đa năng. Thay vì chỉ edit file local, Codex có thể query Postgres, tạo Pull Request GitHub, gửi message Slack, hay gọi bất kỳ API nào bạn expose qua MCP. Bài này hướng dẫn setup 3 MCP server phổ biến nhất cho dev VN: Postgres, GitHub, Slack.
Mình giả định bạn đã có Codex CLI cài trên VPS Ubuntu. Nếu chưa, có bài hướng dẫn cài 5 phút trên blog. MCP server có thể chạy local trên VPS chung với Codex hoặc remote qua HTTP, bài này tập trung mô hình local cho đơn giản và an toàn.
MCP là chuẩn mở, không phụ thuộc version Codex cụ thể. Cấu trúc config có thể thay đổi nhỏ giữa các version Codex, nhưng concept và workflow giữ nguyên.
MCP là gì và tại sao cần dùng
Model Context Protocol do Anthropic khởi xướng, sau đó được nhiều tool áp dụng (Codex CLI, Claude Code, Continue.dev, vv). Ý tưởng đơn giản: định nghĩa cách AI agent gọi tool ngoài qua giao thức chuẩn, thay vì mỗi tool tự sáng tạo cách riêng.
Với MCP, bạn cài 1 lần "Postgres MCP server", Codex CLI và Claude Code đều dùng được mà không cần code adapter riêng. Khi Anthropic ra version mới hay OpenAI cập nhật Codex, MCP server vẫn dùng được. Tránh được lock-in cho từng tool.
Mỗi MCP server expose 1 nhóm tool theo schema. Ví dụ Postgres MCP expose tool query, schema, explain. Codex CLI khi cần info DB sẽ gọi đúng tool đó, có type-checked argument, có error handling sạch.
Cấu trúc config MCP trong Codex CLI
Codex CLI đọc file mcp-servers.json (hoặc tích hợp trong config.toml tùy version) ở thư mục config. Cấu trúc là array các server, mỗi server có command, args, env.
// $HOME/.codex/mcp-servers.json
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://user:pass@host/db"],
"env": {}
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "$YOUR_GITHUB_TOKEN"
}
},
"slack": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
"SLACK_BOT_TOKEN": "$YOUR_SLACK_TOKEN",
"SLACK_TEAM_ID": "$YOUR_TEAM_ID"
}
}
}
}
Codex CLI sẽ spawn từng MCP server thành child process khi start session. Mỗi server lắng nghe stdio, Codex gửi/nhận JSON-RPC. Không có port mở ra ngoài, an toàn cho production.
Postgres MCP: query database từ Codex
Đây là MCP hữu ích nhất cho dev backend. Khi Codex hiểu schema database, nó viết query đúng, suggest index thông minh, debug N+1 query nhanh hơn.
# Cài Postgres MCP server (chạy 1 lần để cache npx)
npx -y @modelcontextprotocol/server-postgres --help
# Test connection trước khi đưa vào config
psql "postgresql://user:pass@localhost/mydb" -c "SELECT 1"
Sau khi test psql ok, thêm vào mcp-servers.json. Tip quan trọng: nên tạo Postgres user riêng cho MCP với quyền READ ONLY, tránh Codex vô tình DROP TABLE.
-- Tạo user readonly cho Codex MCP
CREATE USER codex_mcp WITH PASSWORD 'random_strong_pass';
GRANT CONNECT ON DATABASE mydb TO codex_mcp;
GRANT USAGE ON SCHEMA public TO codex_mcp;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO codex_mcp;
-- Đảm bảo table mới cũng auto grant
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO codex_mcp;
Dùng connection string của user codex_mcp trong MCP config. Nếu Codex thực sự cần ghi (rare), bạn cấp riêng tài khoản tạm thời, dùng xong revoke.
GitHub MCP: tự động hoá workflow Git
GitHub MCP cho phép Codex thao tác trên GitHub mà không cần bạn mở browser. Tạo PR, comment review, list issue, search code repo public - tất cả trong terminal.
# Tạo Personal Access Token (PAT) cho Codex MCP
# Vào https://github.com/settings/tokens/new
# Chọn scope tối thiểu cần thiết:
# - repo (full control of private repos)
# - workflow (nếu Codex cần update Actions)
# - read:org (nếu repo trong org)
# KHÔNG cho scope delete_repo, admin
# Export token (KHÔNG commit vào git)
export GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxx
Cấu hình env trong mcp-servers.json không nên ghi token trực tiếp. Thay vào đó, dùng env reference hoặc đọc từ secret file. Cách an toàn nhất:
# Tạo file secret riêng, chmod 600
mkdir -p $HOME/.codex/secrets
cat > $HOME/.codex/secrets/github.env
Mở editor và thêm dòng GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxx vào file đó, save và set quyền:
chmod 600 $HOME/.codex/secrets/github.env
# Trong .bashrc, source file này khi mở terminal
echo 'set -a; source $HOME/.codex/secrets/github.env 2>/dev/null; set +a' >> $HOME/.bashrc
# Verify
echo $GITHUB_PERSONAL_ACCESS_TOKEN | head -c 10
Cách này giữ token ngoài git, chỉ accessible bởi user của bạn trên VPS. Khi cần revoke, xóa file là xong.
Slack MCP: notification cho task headless
Khi để Codex chạy headless qua đêm trên VPS, bạn muốn biết kết quả mà không phải SSH check liên tục. Slack MCP cho Codex tự gửi message vào channel khi xong task hoặc gặp lỗi.
- Tạo Slack app tại api.slack.com/apps, chọn From scratch.
- Add Bot Token Scope: chat:write, chat:write.public, channels:read.
- Install app vào workspace của bạn, copy Bot User OAuth Token (bắt đầu xoxb-).
- Lấy SLACK_TEAM_ID từ URL Slack workspace (https://app.slack.com/client/T01XXXX/...).
- Mời bot vào channel bạn muốn nhận notification.
# Lưu vào secret file
cat > $HOME/.codex/secrets/slack.env
Trong editor thêm:
SLACK_BOT_TOKEN=xoxb-your-token-here
SLACK_TEAM_ID=T01XXXX
Lưu file, chmod 600, source trong .bashrc giống GitHub. Sau khi config xong, restart Codex CLI, nó sẽ nhận MCP server Slack và bạn có thể bảo "gửi message vào channel dev-alerts: Build xong".
Kiểm tra MCP đã load thành công
Sau khi config xong, restart Codex CLI và kiểm tra MCP đã được nhận. Có vài cách:
# Cách 1: list MCP server trong session Codex
# Khi mở Codex, gõ:
/mcp list
# Codex sẽ in danh sách MCP server đã connect, có tick xanh hoặc đỏ
# Cách 2: kiểm tra log
tail -f $HOME/.codex/logs/latest.log | grep -i mcp
# Cách 3: thử trực tiếp
# Trong Codex prompt, gõ: "list tất cả table trong database"
# Nếu Postgres MCP work, Codex sẽ gọi tool list_tables và return kết quả
Lỗi phổ biến khi load MCP: thiếu env var, port conflict, npx download fail (network chậm). Đọc log thường thấy ngay nguyên nhân. Sau khi fix, không cần restart toàn bộ Codex, chỉ cần reload MCP config (/mcp reload trong session).
Best practice bảo mật MCP
MCP server thường chạy với quyền user dev, nhưng có thể truy cập DB production, GitHub repo, Slack workspace. Cần khóa cẩn thận để tránh leak hoặc abuse.
| Loại MCP | Rủi ro chính | Mitigation |
|---|---|---|
| Postgres | Codex chạy DELETE/DROP nhầm | User READ ONLY, separate write user |
| GitHub | Token bị leak, tạo PR sai repo | PAT scope tối thiểu, expire ngắn |
| Slack | Spam channel, leak conversation | Bot token chỉ scope chat:write |
| Filesystem MCP | Read file system rộng | Whitelist thư mục cụ thể |
| Shell MCP | Chạy command nguy hiểm | Sandbox, không enable nếu không cần |
Quy tắc chung: principle of least privilege. Mỗi MCP chỉ có quyền tối thiểu cần để hoàn thành task. Không cấp admin nếu chỉ cần read. Token có thể rotate định kỳ (1-3 tháng), không để token sống vô thời hạn.
Workflow điển hình với 3 MCP server
Khi cả Postgres, GitHub và Slack MCP đều chạy, một workflow phổ biến cho dev backend VN:
- Trong Codex: "Phân tích bảng users tìm record duplicate theo email". Codex gọi Postgres MCP query, return danh sách.
- Sau khi bạn approve plan fix: "Viết migration SQL thêm UNIQUE constraint email". Codex tạo file migration.
- "Commit và push lên branch fix/email-dup, tạo PR vào main với mô tả chi tiết". Codex commit và gọi GitHub MCP tạo PR.
- "Sau khi PR tạo xong, gửi link vào channel dev-review". Codex gọi Slack MCP.
Toàn bộ workflow trên trong 1 session Codex, không cần switch tab browser. Đây là sức mạnh thực sự của MCP: tool chain hoá hết, AI làm orchestrator.
Performance và tài nguyên
Mỗi MCP server là 1 process Node.js, ăn RAM. Postgres MCP thường 80-120MB, GitHub MCP 60-100MB, Slack MCP 60-90MB. Tổng 3 MCP khoảng 250-350MB. Trên VPS 2GB RAM dư sức, nhưng VPS 1GB hơi tight nếu cùng chạy app khác.
CPU usage rất thấp khi idle. Chỉ spike khi Codex gọi tool. Không ảnh hưởng performance VPS cho mục đích khác. Network outgoing tăng nhẹ khi GitHub/Slack call API, nhưng không đáng kể với bandwidth thông thường.
Tự viết MCP server riêng
Nếu service bạn cần không có MCP sẵn (vd: hệ thống nội bộ, CRM riêng), tự viết MCP server không khó. SDK có sẵn cho Node.js, Python, TypeScript.
# Cài SDK Node.js
npm install @modelcontextprotocol/sdk
# Hoặc Python
pip install mcp
Cấu trúc cơ bản: định nghĩa tool name + schema input, viết handler trả về kết quả. SDK lo phần JSON-RPC, transport stdio. Một MCP server đơn giản chỉ 50-100 dòng code.
Mẫu code và full tutorial nên tham khảo modelcontextprotocol.io. Cộng đồng có nhiều MCP server đóng góp open-source cho các dịch vụ phổ biến: Notion, Linear, Jira, Stripe, vv. Trước khi tự viết, search xem có sẵn chưa.
FAQ về MCP server với Codex CLI
MCP server có chạy trên cloud được không hay phải local?
Cả hai. Codex CLI mặc định chạy MCP local qua stdio (an toàn nhất). Cũng hỗ trợ remote MCP qua HTTP/SSE cho trường hợp tool nặng cần chạy trên server riêng. Local đơn giản và bảo mật cao hơn, recommend cho hầu hết use case. Remote chỉ cần khi nhiều client share chung 1 MCP backend.
Có thể dùng cùng 1 MCP cho cả Codex CLI và Claude Code không?
Có. MCP là chuẩn mở, cùng 1 server hoạt động với mọi client tuân thủ chuẩn (Codex CLI, Claude Code, Continue.dev, Cursor, vv). Bạn cài 1 lần, config thêm vào từng client là dùng được. Đây là lợi ích chính của MCP so với plugin proprietary.
MCP có log lại tất cả lệnh Codex gọi không?
Tùy MCP. Đa số MCP server có log mặc định ghi vào stderr, Codex CLI capture vào log file. Bạn có thể tail -f log để xem realtime. Một số MCP có flag log-level để tăng/giảm verbosity. Khi debug nên bật debug level, khi production nên giảm xuống info để giữ disk space.
Có giới hạn số MCP server cho 1 Codex session không?
Về technical thì không giới hạn cứng, nhưng quá nhiều MCP (trên 10) làm Codex chậm khi start session và tăng RAM dùng. Khuyên tối đa 5-7 MCP cùng lúc cho dev solo. Nếu có nhiều MCP, có thể tạo profile theo project (project A chỉ cần Postgres+GitHub, project B chỉ cần Slack+Notion).
MCP có tốn quota OpenAI không?
Bản thân MCP server không tốn quota OpenAI (chỉ là tool external). Nhưng kết quả MCP trả về sẽ vào context Codex gửi lên model, nên tốn token đó. Tối ưu: yêu cầu MCP return concise (vd query SQL với LIMIT, không SELECT * khi không cần). Hợp lý hoá output giảm token tiêu thụ đáng kể.
Có thể disable tạm 1 MCP mà không sửa config không?
Có, trong session Codex gõ /mcp disable postgres (tùy version). Hoặc thêm flag "disabled": true vào config server đó rồi reload. Cách này tiện khi MCP đang down, không muốn Codex retry mỗi lần start session. Khi cần dùng lại, set false và reload.
VPS đủ RAM cho Codex + nhiều MCP server đồng thời
Cloud VPS TND sẵn AlmaLinux 9, Ubuntu 22/24, Debian 12/13. SSD CEPH, snapshot 1-click, backup hằng ngày, network 200Mbps trong nước. Đủ tài nguyên cho Codex CLI + Postgres MCP + GitHub MCP + Slack MCP chạy đồng thời cho dev backend full-stack.
Xem 8 cấu hình Cloud VPS →


