Tóm tắt nhanh: bạn cần một VPS để chạy Docker, một domain đặt trong Cloudflare để làm cổng đăng nhập OAuth, và một gói ChatGPT có hỗ trợ MCP (Model Context Protocol). Thứ tự là: deploy lên VPS, che hostname bằng Cloudflare Access, bật Managed OAuth, chuyển máy chủ gốc sang chế độ
cloudflare-access, rồi tạo connector trên ChatGPT. GitHub App chỉ cần khi bạn clone repo riêng tư.
Công khai: mình là maintainer của AgentKit và có quan hệ affiliate: link AgentKit trong bài là link affiliate, mua qua link này bạn được giảm 30%. Cloud Harness MCP do Duy Nguyen (@mrgoonie) viết. Mã nguồn ở repo bestagentkits/cloud-harness-mcp trong tổ chức AgentKit trên GitHub, tài liệu ở docs.harness.agentkit.best. Mình không phải tác giả Cloud Harness; loạt bài này là cách mình tự dựng lại theo repo đó.
Ảnh trong bài là ảnh chụp thật từ instance đang chạy. Ảnh và đường đi menu theo giao diện ChatGPT, Cloudflare và GitHub ngày 16/09/2026; các giao diện này đổi khá thường xuyên, nên nếu không thấy đúng nút, hãy tìm theo tên mục. Mọi giá trị nhận dạng đã được làm mờ: hostname, domain gốc, IP của VPS, email, AUD, team domain, tên người dùng, tên và ID của GitHub App, tên repo. Mỗi vùng bị làm mờ ứng với một placeholder trong bảng ở cuối mục 2. Ngày 29/10/2026 mình đối chiếu lại các bước với repo ở bản v0.79.1; repo cập nhật gần như mỗi ngày, nên khi lệch nhau thì docs/ trong repo là nguồn đúng.
Đây là phần 1 của loạt bài ba phần. Phần này nói Cloud Harness MCP là gì, điều kiện cần và thứ tự đầu cuối. Phần 2 đi qua các bước deploy và nối connector ChatGPT, còn Phần 3 đưa prompt để giao phần việc trên VPS cho AI agent. Phần 1 ai cũng đọc được; Phần 2 và Phần 3 dành cho Subscriber.
1. Giới thiệu
Mục này nói Cloud Harness MCP là gì, vì sao cần đủ bộ VPS và Cloudflare, và thiết lập xong thì bạn làm được gì.
Cloud Harness MCP là gì
Cloud Harness MCP là một harness (lớp điều khiển hành vi agent) chạy trên máy chủ của bạn, chỉ một chủ sở hữu dùng, mở ra ngoài qua MCP có xác thực, dùng giao thức Streamable HTTP (HyperText Transfer Protocol). Thay vì để agent chạy lệnh trên máy bạn, nó mở một workspace tạm trên VPS: clone repo vào sandbox, chạy lệnh trong một executor Docker không có quyền root, tự dọn khi hết thời hạn, rồi trả kết quả về client AI.
Agent chạy trên một máy Linux riêng do Harness cấp, không phải trên máy bạn. Repo và Docker đều nằm trong một container trên máy đó; hết TTL thì Harness dọn container và file workspace, còn VPS vẫn giữ nguyên.
Kiến trúc
Kiến trúc tách quyền xác thực khỏi quyền chạy Docker. Các điều kiện ở mục sau đều suy ra từ sơ đồ này.
| Thành phần | Vì sao không thay được |
|---|---|
| VPS | Quyền điều khiển Docker, runner và state đều nằm ở đây. Cloudflare và ChatGPT không chạy container |
| Cloudflare Access | ChatGPT không có chỗ gắn Authorization: Bearer, nên phải có lớp OAuth và JWT ở biên mạng |
| GitHub App | Executor không bao giờ thấy token GitHub; broker đưa thông tin xác thực qua stdin. Repo riêng tư bắt buộc phải có App |
| Domain riêng | Managed OAuth cần hostname nằm trong zone Cloudflare do bạn kiểm soát |
Mô hình này được thiết kế cho một người vận hành đáng tin, không phải sandbox nhiều tenant để chống kẻ tấn công.
Hai luồng kết nối
| Luồng | Endpoint | Xác thực | Dùng cho |
|---|---|---|---|
| Managed OAuth | <MCP_HOST>/mcp | SSO (Single Sign-On, đăng nhập một lần) qua Cloudflare Access | ChatGPT, Claude Desktop |
| API (Application Programming Interface) key cố định | api.<ROOT_DOMAIN>/mcp | Authorization: Bearer <dashboard-api-key> | Cursor, Claude Code, Codex, dòng lệnh |
Bài này đi theo luồng Managed OAuth, vì ChatGPT chỉ hỗ trợ OAuth. Luồng API key có thể làm sau nếu cần.
Thiết lập xong thì làm được gì
Trên ChatGPT bản web, bạn chỉ làm ba việc:
- Mở một cuộc chat một-một mới. Không dùng Custom GPT, chat trong Project, Canvas hay ứng dụng di động.
- Chọn connector CloudHarness trong menu công cụ, hoặc gõ
@CloudHarness. - Mô tả việc cần làm kèm URL repo, ví dụ: "clone
https://github.com/<OWNER>/<REPO>.git, chạynpm testrồi commit phần sửa".
Khi bạn chat, agent tự đi qua bốn bước dưới đây và gọi tool tương ứng:
| Bước trong phiên | Tool agent gọi |
|---|---|
| Mở workspace và clone repo | workspace_open |
| Đọc và sửa code | files_list, files_read, grep_search, files_write |
| Chạy lệnh và test | exec_run |
| Commit rồi đóng workspace | git_status, git_commit, git_push, workspace_close |
Xong việc thì bảo agent đóng workspace. Quên cũng không sao. Workspace tự hủy khi hết thời gian chờ (idle TTL) hoặc hết thời gian sống tối đa (wall TTL). Mặc định là 5 phút và 15 phút (vẫn đúng ở bản v0.79.1). Bạn đổi được trong Settings của dashboard, áp dụng cho workspace mở sau đó, hoặc qua WORKSPACE_IDLE_TTL_SECONDS và WORKSPACE_WALL_TTL_SECONDS ở trang biến môi trường.
Bộ tool đầy đủ: Tools Reference.
Nếu chưa có domain riêng
Bài này giả định bạn có một hostname nằm trong zone Cloudflare do mình quản lý. Không có thì chỉ làm được một nửa:
| Luồng | Kết quả | Vì sao |
|---|---|---|
owner-bearer, dùng cho Cursor, Claude Code, Codex, dòng lệnh | Chạy được | Repo mặc định dùng cloud-harness-mcp.<ip>.sslip.io; Let's Encrypt cấp được chứng chỉ vì sslip.io trỏ về IP nằm ngay trong tên. Đổi lại, dashboard bị tắt ở chế độ này |
cloudflare-access, dùng cho ChatGPT bản web | Không chạy được | Ứng dụng tự host trong Access phải gắn với hostname trong zone Cloudflare của bạn, và cần tổ chức Zero Trust khớp với zone đó. docs/deployment.md ghi rõ: "requires a hostname in an owner-controlled Cloudflare-managed zone… the current sslip.io hostname may not satisfy that prerequisite" |
Nếu đích là ChatGPT, bạn cần một hostname trong zone mình quản lý, không cần domain đẹp. Một domain giá rẻ thêm vào gói miễn phí của Cloudflare là đủ. Bạn cũng có thể giữ domain ở nhà đăng ký khác rồi trỏ nameserver, hoặc giao riêng một subdomain, sang Cloudflare. Gói miễn phí của Zero Trust đủ cho một người dùng, nên chi phí chính chỉ là tiền domain.
Chưa xác minh:
*.workers.dev,*.pages.devhay*.cfargotunnel.comcó dùng làm ứng dụng tự host trong Access được không. Mình hiểu là không, vì đó không phải zone bạn kiểm soát, nhưng chưa kiểm chứng, nên đừng coi là kết luận.
2. Điều kiện cần
Có tám điều kiện phải đủ trước khi bắt đầu. Ba điều kiện đầu là hạ tầng, bốn điều kiện sau là tài khoản và quyền, điều kiện cuối là cách dùng.
| # | Điều kiện | Vì sao |
|---|---|---|
| 1 | VPS Linux (repo khuyên Ubuntu 24.04 LTS hoặc Debian 12; RAM tối thiểu 4 GB, nên 8 GB; SSD từ 40 GB) có Docker Engine 26 trở lên và Compose v2, nginx, Certbot (plugin nginx), Git, curl, OpenSSL, systemd; cổng 80 và 443 đi vào nginx | Đây là nơi clone repo và chạy executor. Mỗi workspace dùng tới 1 GiB RAM và một CPU. Cloudflare và ChatGPT không chạy Docker thay được |
| 2 | Hostname do bạn kiểm soát, nằm trong zone Cloudflare, trỏ về VPS | docs/deployment.md yêu cầu "hostname in an owner-controlled Cloudflare-managed zone". Hostname dạng sslip.io không đạt. Chỉ bắt buộc cho luồng ChatGPT |
| 3 | Tổ chức Cloudflare Zero Trust khớp với zone đó | Để tạo ứng dụng Access, policy Allow và nhà cung cấp danh tính (IdP, Identity Provider) |
| 4 | AUTH_MODE=cloudflare-access cùng issuer, audience, JWKS trên máy chủ gốc | Máy chủ gốc chỉ tin JWT do Access phát hành |
| 5 | Gói ChatGPT có hỗ trợ MCP đầy đủ | Kiểm trang trợ giúp của OpenAI cho gói của bạn. Có gói bật được Developer mode và tạo connector nháp, nhưng vẫn báo FORBIDDEN: This conversation does not support developer MCPs khi chạy |
| 6 | Managed OAuth và Allowed redirect URIs trên ứng dụng Access | ChatGPT không có chỗ gắn header Authorization: Bearer |
| 7 | Access service token cho canary lúc deploy | Ở chế độ Access, lệnh deploy kiểm bản mới qua cổng HTTPS công khai bằng service token. Thiếu token thì canary lỗi và bản deploy tự rollback |
| 8 | Chat một-một trên web | Không chạy được trong Custom GPT, chat trong Project (trừ khi bật), Canvas, chat tạm thời hay ứng dụng di động |
Chỉ cần khi có nhu cầu cụ thể: GitHub App (khi clone repo riêng tư) và cổng API key api.<ROOT_DOMAIN> (luồng riêng cho IDE và dòng lệnh). Luồng API key không bắt buộc Cloudflare Access, và theo bảng ở mục 1, chế độ owner-bearer vẫn chạy với hostname sslip.io.
Chỉ có một bên thì không đủ. Có Cloudflare mà không có VPS thì không có chỗ chạy workspace và Docker. Có VPS mà không có Cloudflare Access thì ChatGPT bản web không đi được luồng OAuth như tài liệu mô tả.
Bật Developer mode trên ChatGPT
Đường vào: https://chatgpt.com/, bấm avatar, chọn Settings → Security and login → Developer mode (#settings/Security?section=developer-mode). Bật công tắc và đọc cảnh báo ELEVATED RISK. Nếu menu của bạn khác, tài liệu Cloud Harness ghi đường Settings → Apps → Advanced settings → Developer mode.


Còn trình cài một lệnh thì sao
Repo giờ có scripts/install.sh, cài trọn bằng một lệnh với Caddy hoặc Cloudflare Tunnel. Trình cài này ghi AUTH_MODE=owner-bearer, tức luồng API key cho IDE và dòng lệnh. Phần chuyển sang Cloudflare Access trong docs/deployment.md được viết cho đường nginx, nên loạt bài này đi theo đường nginx.
Placeholder và giá trị mẫu
Các mục từ đây trở đi dùng placeholder thay cho giá trị thật. Trong ảnh, đây là các vùng bị làm mờ.
| Placeholder | Ý nghĩa | Giá trị mẫu, hoặc vùng bị làm mờ trong ảnh |
|---|---|---|
<MCP_HOST> | Hostname công khai của MCP | Ví dụ mcp.example.com |
<ROOT_DOMAIN> | Zone Cloudflare | Ví dụ example.com |
<MCP_SUBDOMAIN> | Subdomain của bản ghi A | mcp (không làm mờ) |
<VPS_PUBLIC_IP> | IPv4 của VPS | Ví dụ 203.0.113.10 (nội dung bản ghi A) |
<CF_TEAM> | Tên team của Zero Trust | Tên team và team domain |
<ACCESS_AUD> | Application Audience (AUD) Tag | Chuỗi hex trong tab AUD tag |
<GITHUB_APP_SLUG> | Slug của GitHub App | Tên app trên GitHub và dòng breadcrumb |
<GITHUB_APP_ID> | App ID dạng số | Dòng App ID: |
<GITHUB_INSTALLATION_ID> | Installation ID dạng số | Dòng INSTALLATION ID: trên dashboard |
<OWNER>/<REPO> | Repo HTTPS không kèm thông tin đăng nhập | Tên repo trong danh sách |
<OPERATOR_EMAIL> | Email trong policy Allow | Ô email trong policy |
Cấu hình và secret nằm ở /etc/cloud-harness-mcp trên VPS (thư mục của root, quyền 700). Runner thấy thư mục này ở /run/cloud-harness-secrets, chỉ đọc. Lệnh chạy trên VPS dùng đường dẫn thứ nhất; biến môi trường trỏ tới file secret, như GITHUB_APP_PRIVATE_KEY_FILE, dùng đường dẫn thứ hai.
Các endpoint sau khi thay giá trị:
| Mục đích | Endpoint |
|---|---|
| MCP (ChatGPT OAuth) | https://<MCP_HOST>/mcp |
| Dashboard | https://<MCP_HOST>/dashboard |
| Gắn GitHub | https://<MCP_HOST>/dashboard/github |
MCP gateway (cùng ứng dụng Access với /mcp) | https://<MCP_HOST>/mcp-gateway |
| Kiểm tra sức khỏe cục bộ | http://127.0.0.1:3100/readyz |
| Luồng API key | https://api.<ROOT_DOMAIN>/mcp |
A. Thứ tự đầu cuối
- Chuẩn bị VPS, domain trên Cloudflare, Zero Trust và gói ChatGPT (mục 2).
- Tạo bản ghi DNS ở chế độ Proxied và chọn chế độ SSL/TLS (Phần 2, mục 3).
- Bootstrap VPS, cấp TLS, deploy hai lượt ở chế độ
owner-bearer, kiểm/readyzcục bộ trả 200 (mục 4). - Tạo ứng dụng Access, hostname, policy và IdP (mục 5).
- Bật Managed OAuth, thêm redirect URI, lấy AUD và team domain (mục 6).
- Tạo service token cho canary, chuyển sang
cloudflare-accessbằng một lượt deploy riêng, rồi kiểm 401 (mục 7). - Tạo connector trên ChatGPT (mục 8).
- Tạo GitHub App và gắn trên dashboard, chỉ với repo riêng tư (mục 9).
Muốn giao phần việc trên VPS cho AI agent thì xem Phần 3.
D. Tài liệu tham khảo
Tài liệu chính thức: <https://docs.harness.agentkit.best/>
- Cloud Harness MCP: tài liệu chính thức:
docs.harness.agentkit.best - Kiến trúc và cách hoạt động:
/how-it-works - Tự host và deploy:
/self-host - Vòng đời workspace bốn bước:
/getting-started - Nối ChatGPT:
/ai-tools/chatgpt - Gắn GitHub:
/dashboard/github - API key cho luồng IDE và dòng lệnh:
/dashboard/api-keys - Biến môi trường:
/reference/environment-variables - Mô hình bảo mật:
/security-model - Xử lý sự cố:
/troubleshooting - Repo trên GitHub của Duy Nguyen (@mrgoonie):
bestagentkits/cloud-harness-mcp - Runbook deploy trên VPS:
docs/deployment.md - GitHub App cho repo riêng tư:
docs/github-app-private-repositories.md
Dùng bài này trong agent của bạn
Lấy API keyChép đoạn dưới, dán vào Claude Code, Codex hay agent bạn đang dùng. Agent đọc bài rồi đối chiếu với repo đang mở.
Đọc bài "Tự host Cloud Harness MCP cho ChatGPT (1/3): Tổng quan và điều kiện cần" trên modernEngineer rồi áp dụng vào repo này.
1. Gọi tool content_get của MCP server modernengineer với locale "vi", slug "cloud-harness-mcp-chatgpt-setup". Nếu chưa nối MCP hoặc bị từ chối quyền, đọc thẳng trang https://modernengineer.dev/vi/library/cloud-harness-mcp-chatgpt-setup.
2. Tóm tắt các bước chính của bài, chỉ ra bước nào áp dụng được cho repo này.
3. Đề xuất thay đổi cụ thể và hỏi tôi trước khi sửa file.Nối MCP cho Claude Code (một lần)
claude mcp add --transport http modernengineer \
https://api.modernengineer.dev/mcp \
--header "Authorization: Bearer <API key>"Bài mở cho mọi người: chưa nối MCP thì agent vẫn đọc được thẳng từ link bài.
- Phiên bản
- v1.0.0
- Cập nhật
- 16/09/2026
- Giấy phép
- Bảo lưu mọi quyền
- Slug
- cloud-harness-mcp-chatgpt-setup


