Bỏ qua điều hướng

Công khaiSeries

Tự host Cloud Harness MCP cho ChatGPT (1/3): Tổng quan và điều kiện cần

Phần 1/3: Cloud Harness MCP là gì, vì sao cần VPS, Cloudflare Access và domain riêng, điều kiện cần trước khi thiết lập và thứ tự đầu cuối.

11 phút đọc · v1.0.0 · Cập nhật 16/09/2026

EN · Self-hosting Cloud Harness MCP for ChatGPT (1/3): Overview and prerequisites · Đọc bản tiếng Anh

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.

Request đi từ AI client qua ingress không giữ secret, MCP API không trạng thái, tới trusted runner là nơi duy nhất giữ Docker authority, state và credential, rồi tới executor non-root cô lập
Chỉ trusted runner giữ Docker authority, state và credential.
Thành phầnVì sao không thay được
VPSQuyền điều khiển Docker, runner và state đều nằm ở đây. Cloudflare và ChatGPT không chạy container
Cloudflare AccessChatGPT không có chỗ gắn Authorization: Bearer, nên phải có lớp OAuth và JWT ở biên mạng
GitHub AppExecutor 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êngManaged 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

Hai luồng: Managed OAuth qua Cloudflare Access cho ChatGPT và Claude Desktop, API key cố định cho Cursor, Claude Code, Codex và dòng lệnh
ChatGPT chỉ hỗ trợ OAuth, nên bài này đi theo luồng Managed OAuth.
LuồngEndpointXác thựcDùng cho
Managed OAuth<MCP_HOST>/mcpSSO (Single Sign-On, đăng nhập một lần) qua Cloudflare AccessChatGPT, Claude Desktop
API (Application Programming Interface) key cố địnhapi.<ROOT_DOMAIN>/mcpAuthorization: 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:

  1. 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.
  2. Chọn connector CloudHarness trong menu công cụ, hoặc gõ @CloudHarness.
  3. Mô tả việc cần làm kèm URL repo, ví dụ: "clone https://github.com/<OWNER>/<REPO>.git, chạy npm test rồ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ênTool agent gọi
Mở workspace và clone repoworkspace_open
Đọc và sửa codefiles_list, files_read, grep_search, files_write
Chạy lệnh và testexec_run
Commit rồi đóng workspacegit_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ồngKết quảVì sao
owner-bearer, dùng cho Cursor, Claude Code, Codex, dòng lệnhChạy đượcRepo 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 webKhô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.dev hay *.cfargotunnel.com có 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ệnVì sao
1VPS 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
2Hostname do bạn kiểm soát, nằm trong zone Cloudflare, trỏ về VPSdocs/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
3Tổ 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)
4AUTH_MODE=cloudflare-access cùng issuer, audience, JWKS trên máy chủ gốcMáy chủ gốc chỉ tin JWT do Access phát hành
5Gó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
6Managed OAuth và Allowed redirect URIs trên ứng dụng AccessChatGPT không có chỗ gắn header Authorization: Bearer
7Access 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
8Chat một-một trên webKhô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.

ChatGPT Developer mode

Zone Cloudflare đã Active

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ĩaGiá trị mẫu, hoặc vùng bị làm mờ trong ảnh
<MCP_HOST>Hostname công khai của MCPVí dụ mcp.example.com
<ROOT_DOMAIN>Zone CloudflareVí dụ example.com
<MCP_SUBDOMAIN>Subdomain của bản ghi Amcp (không làm mờ)
<VPS_PUBLIC_IP>IPv4 của VPSVí dụ 203.0.113.10 (nội dung bản ghi A)
<CF_TEAM>Tên team của Zero TrustTên team và team domain
<ACCESS_AUD>Application Audience (AUD) TagChuỗi hex trong tab AUD tag
<GITHUB_APP_SLUG>Slug của GitHub AppTê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ậpTê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 đíchEndpoint
MCP (ChatGPT OAuth)https://<MCP_HOST>/mcp
Dashboardhttps://<MCP_HOST>/dashboard
Gắn GitHubhttps://<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 keyhttps://api.<ROOT_DOMAIN>/mcp

A. Thứ tự đầu cuối

  1. Chuẩn bị VPS, domain trên Cloudflare, Zero Trust và gói ChatGPT (mục 2).
  2. Tạo bản ghi DNS ở chế độ Proxied và chọn chế độ SSL/TLS (Phần 2, mục 3).
  3. Bootstrap VPS, cấp TLS, deploy hai lượt ở chế độ owner-bearer, kiểm /readyz cục bộ trả 200 (mục 4).
  4. Tạo ứng dụng Access, hostname, policy và IdP (mục 5).
  5. Bật Managed OAuth, thêm redirect URI, lấy AUD và team domain (mục 6).
  6. Tạo service token cho canary, chuyển sang cloudflare-access bằng một lượt deploy riêng, rồi kiểm 401 (mục 7).
  7. Tạo connector trên ChatGPT (mục 8).
  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/>

Dùng bài này trong agent của bạn

Lấy API key

Ché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ở.

Dán vào agent
Đọ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)
terminal
claude mcp add --transport http modernengineer \
  https://api.modernengineer.dev/mcp \
  --header "Authorization: Bearer <API key>"
Cách nối Codex, Cursor và client khác

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