Thiết lập Codex MCP: Tạo ảnh và video từ một file config.toml
Kết nối Codex CLI, extension trên IDE và ChatGPT desktop vào cùng một server media MCP: config.toml với bearer_token_env_var, 5 lưu ý quan trọng, video demo Veo giá $0.70.

Một server MCP cho Codex giống như một hộp công cụ bên ngoài mà AI hỗ trợ lập trình của OpenAI có thể gọi từ cả ba giao diện cùng một lúc: CLI, extension trên IDE và tab Codex trong ứng dụng ChatGPT desktop. Chỉ cần một khối cấu hình TOML, một trợ lý vốn chỉ quen chỉnh sửa code nay đã có thêm những siêu năng lực mà các mô hình mặc định không được trang bị sẵn, bao gồm cả tạo ảnh và video. Codex có thể giúp bạn tối ưu hóa code (refactor) và chạy test cả ngày, nhưng bản thân mô hình đứng sau nó thì không thể tự tay xuất ra một file MP4. Việc tích hợp thêm một server thế này biến yêu cầu kiểu "làm một clip giới thiệu cho tài liệu cập nhật (release notes)" thành một câu lệnh terminal đơn giản và kết quả cuối cùng là một file video thực tế.
Nếu bạn chỉ muốn thiết lập nhanh và đi thẳng vào vấn đề, đây là toàn bộ các bước cần làm. Hãy tạo một API key trong trang BananaBanana profile của bạn, sau đó thêm đoạn cấu hình dưới đây vào file ~/.codex/config.toml:
[mcp_servers.bananabanana]
url = "https://bananabanana.pro/api/mcp"
bearer_token_env_var = "BB_API_KEY"
Khai báo biến môi trường bằng lệnh export BB_API_KEY=bb_live_YOUR_KEY rồi khởi động lại Codex. Chỉ đơn giản vậy thôi: không cần chạy server local, không cần dự án Google Cloud và không cần đăng ký gói thuê bao tháng. Chi phí tạo ảnh sẽ được trừ vào số dư trả trước của bạn chỉ từ $0.03 mỗi lượt, còn video thì từ $0.10. Video minh họa ở phần dưới bài viết được tạo ra bằng chính endpoint này thông qua một key thực tế khi tôi đang soạn nội dung, và chi tiết hóa đơn $1.03 cho toàn bộ tài nguyên media trong bài viết này được liệt kê ở phần cuối.
Tại sao một file cấu hình duy nhất lại giải quyết được mọi việc
Hầu hết các ứng dụng MCP client hiện nay đều bắt bạn cấu hình riêng biệt cho từng giao diện. Nhưng Codex thì không, và đây chính là điểm cực kỳ tinh tế của nó. official Codex MCP docs (tài liệu MCP chính thức của Codex) đã tóm gọn điều này trong một câu: "Ứng dụng ChatGPT desktop, Codex CLI và extension trên IDE dùng chung cấu hình này." Bạn chỉ cần dán khối TOML một lần duy nhất, 7 công cụ tạo nội dung đó sẽ đi theo bạn mọi lúc mọi nơi, từ cửa sổ terminal vào đến VS Code hay tab Codex trên ứng dụng desktop.

Chính điều này đã thay đổi hoàn toàn cách chúng ta sử dụng server. Trong Cursor hoặc VS Code, một công cụ tạo ảnh thường chỉ phục vụ riêng cho dự án (repo) bạn đang mở. Nhưng với Codex, bản thân cửa sổ terminal của bạn đã trở thành một bảng điều khiển media: bạn có thể yêu cầu render video ngay từ một shell trống trơn mà không cần mở bất kỳ trình soạn thảo code nào, rồi sau đó kiểm tra lại kết quả trên ứng dụng desktop. Đối với một người quen "ăn ngủ" cùng tmux và xem các ứng dụng đồ họa GUI giống như những vị khách lâu lâu mới ghé thăm, điều này tạo ra ranh giới rõ rệt giữa "một plugin tôi cài đặt vứt đó" và "một câu lệnh thực sự hữu dụng mà tôi gọi hàng ngày."
Giải pháp thay thế quen thuộc là tự chạy một server MCP local với Google API key cá nhân, kèm theo việc quản lý hạn mức (quota) và hóa đơn thanh toán liên kết với tài khoản đám mây của riêng bạn. Cách này chạy được, nhưng bạn sẽ mất kha khá thời gian để "chăm sóc" hệ thống. Trong khi đó, endpoint từ xa của chúng tôi đã được thiết lập sẵn, chạy trên cùng một đường ống xử lý (pipeline) với BananaBanana web generator, và thông tin xác thực duy nhất bạn cần chỉ là một key bb_live_ (có thể thu hồi bất cứ lúc nào).
Làm thế nào để kết nối Codex với một server MCP?
Các thông tin cấu hình chi tiết dưới đây được đối chiếu dựa trên tài liệu Codex MCP chính thức cập nhật đến ngày 11 tháng 7 năm 2026 (OpenAI vừa mới chuyển trang tài liệu từ developers.openai.com sang learn.chatgpt.com, nên đừng ngạc nhiên nếu bạn thấy link bị tự động chuyển hướng).
Đầu tiên, hãy tiến hành register (đăng ký) và truy cập vào mục Profile → MCP API Keys. Key chỉ hiển thị một lần duy nhất và phía chúng tôi chỉ lưu trữ bản mã hóa một chiều (hashed), nên bạn cần sao chép và cất giữ ngay lập tức. Các tài khoản mới tạo sẽ có sẵn $0.20 trong số dư, đủ để bạn tạo thử 3 bức ảnh test trên mô hình rẻ nhất.
Thứ hai, thêm khối TOML từ đầu bài viết này vào file ~/.codex/config.toml (hãy tự tạo file nếu chưa có). Khai báo [mcp_servers.bananabanana] sẽ nhận trường url từ bất kỳ server HTTP hỗ trợ Streamable nào và trường bearer_token_env_var để phục vụ xác thực: Codex sẽ đọc tên biến môi trường này khi khởi động và gửi giá trị của nó trong header Authorization. Key của bạn không bao giờ bị ghi trực tiếp vào file cấu hình, đồng nghĩa với việc bạn có thể thoải mái chia sẻ file này (ngay cả trong các kho lưu trữ dotfiles công khai). Trang MCP server page của chúng tôi cũng lưu sẵn đoạn cấu hình này kèm theo bảng tương thích cho từng phần mềm client mà chúng tôi đã kiểm thử thành công:

Thứ ba, export biến môi trường rồi khởi động lại. Đối với CLI, lệnh codex sẽ tự động liệt kê các công cụ (tools) của server ngay khi kết nối thành công; hãy thử yêu cầu nó "call list_models on bananabanana" và bạn sẽ nhận được thông tin bảng giá cập nhật tức thì của 7 công cụ, từ list_models cho tới list_generations. Extension trên IDE và ứng dụng ChatGPT desktop cũng sẽ tự động nhận cấu hình tương tự ở lần khởi chạy tiếp theo mà bạn không cần cấu hình thêm bất cứ điều gì.
Một lưu ý cực kỳ quan trọng đối với ứng dụng desktop trên hệ điều hành macOS: một ứng dụng đồ họa GUI khi được khởi chạy từ Dock sẽ không đọc file .zshrc của bạn, do đó lệnh export hoạt động tốt trên terminal có thể hoàn toàn vô giá trị đối với ChatGPT. Nếu các công cụ hiển thị bình thường trên CLI nhưng lại báo lỗi xác thực trên ứng dụng desktop, thì nguyên nhân hầu như luôn là do vấn đề này. Câu lệnh launchctl setenv BB_API_KEY bb_live_… sẽ giúp giải quyết triệt để, mặc dù cách này mang lại cảm giác giống như một giải pháp tình thế chống cháy (và thực tế nó đúng là như vậy).
Liệu tính năng Connectors của bản thân ChatGPT có thể dùng chung key này không?
Câu trả lời nhanh là: "Hiện tại thì chưa", và chúng ta cũng nên tìm hiểu kỹ lý do tại sao. ChatGPT tích hợp một hệ thống kết nối riêng biệt có tên Connectors (trong Settings → Connectors, tính năng này bị ẩn sau nút gạt chế độ nhà phát triển đối với các tài khoản trả phí) giúp thêm các server MCP vào cửa sổ chat thông thường thay vì Codex. Các kết nối này bắt buộc phải xác thực thông qua luồng OAuth. Hiện tại, endpoint của chúng tôi chỉ hỗ trợ Bearer key thông thường. Chúng tôi đã có kế hoạch hỗ trợ OAuth 2.1, và một khi tính năng này hoàn thiện, giao diện chat thông thường của ChatGPT sẽ trở thành một client được hỗ trợ chính thức. Từ giờ cho đến lúc đó, ranh giới vô cùng rõ ràng: các giao diện Codex (CLI, IDE, tab Codex trong ứng dụng desktop) hoạt động ổn định ngay hôm nay qua file config.toml, còn các kết nối phía cửa sổ chat thì không. Bảng thống kê mức độ tương thích compatibility table sẽ liên tục cập nhật tình trạng này cho từng phần mềm kèm theo mốc thời gian rõ ràng.
Ứng dụng thực tế: Tạo video giới thiệu sản phẩm mà không cần mở bất kỳ ứng dụng nào
Kịch bản thực tế mà chúng tôi xây dựng xung quanh bài viết này: vào ngày phát hành phiên bản mới, tài liệu thay đổi (changelog) của bạn cần có một clip giới thiệu ngắn nhưng bạn lại lười không muốn rời khỏi màn hình terminal đen ngòm quen thuộc. Bạn có thể yêu cầu Codex tạo một đoạn video giới thiệu sản phẩm, nó sẽ tự động biên soạn một đoạn mô tả (prompt) đậm chất điện ảnh rồi gọi công cụ generate_video. Công cụ này không bao giờ trừ tiền ngay ở lượt gọi đầu tiên; nó sẽ trả về một báo giá (quote) cụ thể, sau đó AI agent sẽ thực hiện lại lệnh gọi kèm theo tham số confirm_cost khớp với mức giá báo để chính thức bắt đầu quá trình render video. Dưới đây là nhật ký hoạt động thực tế từ phiên làm việc của tôi:
→ generate_video {"prompt": "Cinematic product promo shot: matte pearl-white
wireless earbuds in an open charging case on a slowly rotating dark
pedestal, dramatic rim lighting in violet and warm amber, soft haze,
slow dolly-in from a slightly low angle, shallow depth of field,
premium tech commercial style", "model": "veo-3.1-fast",
"duration": 8, "resolution": "720p"}
← {"status": "confirmation_required", "quoted_cost_usd": 0.70,
"message": "This video costs $0.70. Nothing has been charged."}
→ generate_video {..., "confirm_cost": 0.70}
← {"job_id": "cmrgrpxgf0002mk7fvfepg82j", "status": "processing",
"cost_charged_usd": 0.70, "balance_remaining_usd": 1553.37}
→ get_result {"job_id": "cmrgrpxgf0002mk7fvfepg82j", "wait_seconds": 30}
← {"status": "completed", "files": [{"url": "https://…/api/files/…"}]}
Chỉ mất đúng 2 phút 15 giây từ thời điểm xác nhận cho đến khi nhận được file video 720p hoàn chỉnh. Dưới đây là chính xác đoạn clip được tạo bởi Veo 3.1 Fast ngay trong lần đầu tiên, không hề cần chạy lại (reroll):
Cấu trúc của đoạn prompt tuân thủ chính xác quy tắc được hướng dẫn trong bài viết Veo 3.1 prompt guide của chúng tôi: chủ thể (subject), hành động (action), ánh sáng (lighting), chuyển động camera, tiêu cự lens và phong cách (style). Sau đó, Codex sẽ tự động tải file từ một đường dẫn URL có chữ ký bảo mật (hiệu lực trong vòng 24 giờ; gọi lại lệnh get_result để làm mới link) về thư mục mà bạn chỉ định, thậm chí nó còn tự viết luôn cả mã nguồn thẻ <video> HTML để bạn chèn thẳng vào trang changelog của mình.
Một lưu ý chân thành về sản phẩm đầu ra: chi phí $0.70 là dành cho phiên bản video "không tiếng". Nếu muốn thêm âm thanh tự nhiên tương ứng cho cùng một clip thì mức giá sẽ là $1.00, và mô hình Omni Flash kèm âm thanh có giá $0.10 mỗi giây — tức $0.80 cho một clip có độ dài tương đương. Đối với một video chạy lặp tự động (loop) và tắt tiếng (mute) trên một trang đích (landing page) giới thiệu dịch vụ thì phiên bản không tiếng rõ ràng là lựa chọn hoàn hảo nhất; còn nếu là video để đăng lên mạng xã hội, bạn có thể sẽ sẵn sàng chi thêm 30 cent để video sinh động hơn.
Quá trình tạo ảnh cũng hoạt động tương tự ngoại trừ việc bỏ qua bước xác nhận chi phí, vì giá tạo một bức ảnh đơn lẻ cực kỳ rẻ nên hệ thống sẽ tiến hành chạy ngay lập tức: gửi câu lệnh generate_image kèm prompt sẽ trả về một ID tiến trình (job id), tiếp đó get_result sẽ trả về file ảnh hoàn chỉnh cùng một ảnh xem trước (inline preview) nhỏ để Codex có thể "nhìn" trực tiếp.
Những thói quen "khó chiều" của Codex bạn cần nắm rõ trước khi sử dụng
Đây là những kinh nghiệm xương máu được tích lũy trong suốt quá trình thử nghiệm thiết lập hệ thống ở trên, được sắp xếp gần như theo đúng trình tự các vấn đề bạn rất dễ gặp phải.

1. CLI không tự viết file cấu hình này giúp bạn.
Dù lệnh codex mcp add có tồn tại, nhưng theo tài liệu hướng dẫn chính thức, lệnh này hoàn toàn không hỗ trợ tùy chọn bearer-token đối với các server giao thức HTTP; lệnh này được thiết kế để kết nối các server stdio local và đăng nhập qua luồng OAuth (codex mcp login). Đối với một server từ xa xác thực bằng khóa bảo mật (key), bạn bắt buộc phải tự chỉnh sửa thủ công file ~/.codex/config.toml. Quá trình chỉnh sửa chỉ mất vỏn vẹn 30 giây, nhưng nếu bạn mong đợi một trải nghiệm gõ lệnh một dòng cực nhanh kiểu claude mcp add --header thì Codex sẽ khiến bạn hơi hụt hẫng một chút.
2. File dùng định dạng TOML, và bảng khai báo phải là mcp_servers.
Quy tắc đặt tên là chữ thường cách nhau bằng dấu gạch dưới (snake_case), sử dụng dấu ngoặc vuông và tuyệt đối không viết theo cú pháp JSON. Các đoạn cấu hình được sao chép trực tiếp từ tài liệu hướng dẫn của Cursor hoặc Claude (thường dùng chữ lạc đà mcpServers hoặc dấu ngoặc nhọn) chắc chắn sẽ bị lỗi phân tích cú pháp (parse), và các lỗi cú pháp TOML trong file này có xu hướng "im lặng" chứ không hề báo lỗi rõ ràng ra ngoài. Nếu server của bạn không thấy xuất hiện trong danh sách, hãy mở terminal chạy lệnh codex và quan sát các dòng thông tin khởi chạy đầu tiên trước khi nghi ngờ bất kỳ nguyên nhân nào khác.
3. Các biến bảo mật có một trường khai báo đúng và một trường khai báo sai rất dễ gây nhầm lẫn.
Trường bearer_token_env_var giúp khóa bảo mật của bạn hoàn toàn nằm ngoài file cấu hình. Giải pháp thay thế là map http_headers sẽ lưu trữ các giá trị tĩnh dạng text thô (plaintext), điều này đồng nghĩa với việc key bb_live_ thực tế của bạn sẽ nằm lộ thiên trong một file cấu hình rất dễ bị các công cụ đồng bộ dotfiles chia sẻ lên các kho lưu trữ công khai. Ngoài ra còn có trường env_http_headers hỗ trợ đọc các header tùy chỉnh từ biến môi trường. Quy tắc bất di bất dịch của tôi là: luôn dùng bearer_token_env_var cho mọi thông tin nhạy cảm, tuyệt đối không bao giờ dùng http_headers.
4. Thời gian timeout mặc định của công cụ là 60 giây, và nó hoàn toàn ổn, nhưng chỉ nhờ vào cách cơ chế polling hoạt động.
Mặc định Codex áp dụng giới hạn tool_timeout_sec = 60 cho mỗi lượt gọi công cụ. Một tác vụ tạo video thường mất từ 1 đến 10 phút, nghe qua thì có vẻ như sẽ bị lỗi quá thời gian timeout, thế nhưng lệnh generate_video sẽ trả về ID tiến trình gần như ngay lập tức và lệnh get_result sẽ sử dụng kỹ thuật yêu cầu lặp dài (long-polling) với thời gian phản hồi tối đa là 30 giây cho mỗi lượt gọi. Do đó, mỗi lượt gọi riêng lẻ vẫn nằm an toàn trong giới hạn timeout; AI agent chỉ đơn giản là gọi lại lệnh check kết quả vài lần. Đừng cố gắng "sửa" điều này bằng cách tăng giới hạn timeout lên 600 giây, bạn hoàn toàn không cần đến nó và nếu server thực sự bị treo, nó sẽ chặn đứng hoạt động của AI agent trong suốt mười phút đồng hồ.
5. Cơ chế phê duyệt có thể cấu hình riêng cho từng server, và những gì liên quan đến tiền bạc thì xứng đáng được cài đặt ở chế độ prompt.
Theo tài liệu, trường default_tools_approval_mode chấp nhận các giá trị bao gồm auto, prompt, writes và approve. Đối với một server sở hữu nhiều công cụ tiêu tốn tiền thật cho mỗi lần gọi, tôi khuyên bạn nên giữ chế độ yêu cầu xác nhận (prompt) để tự tay duyệt từng lượt gọi cụ thể; các công cụ miễn phí (list_models, get_account, get_result) mới là những cái tên xứng đáng được đưa vào danh sách cho phép chạy tự động (allowlist) nếu cấu hình hệ thống của bạn hỗ trợ phân quyền chi tiết cho từng công cụ. Video dù thế nào đi nữa cũng có một lớp khóa bảo mật thứ hai ở phía chúng tôi: không có bất kỳ khoản phí nào bị trừ nếu không có lệnh gửi kèm confirm_cost chính xác khớp với báo giá.
Chi phí cho tài nguyên media minh họa trong bài viết là bao nhiêu?
Đây là mức giá tạo tài nguyên tiêu chuẩn, hoàn toàn trùng khớp với các con số mà lệnh list_models phản hồi cho AI agent, không hề có bất kỳ chương trình giảm giá nội bộ nào:
| Tài nguyên | Mô hình | Chi phí |
|---|---|---|
| Video demo giới thiệu, tạo qua MCP với key thực tế | Veo 3.1 Fast, 720p, 8 s, silent | $0.70 |
| Ảnh bìa + 2 ảnh minh họa trong bài | Nano Banana Pro, 1K | $0.33 |
| Ảnh chụp màn hình trang tài liệu | chụp từ trình duyệt, không phải tạo bằng AI | $0.00 |
| Tổng cộng | $1.03 |
Đoạn video minh họa ở trên đã được tạo thành công ngay từ lượt thử đầu tiên, nhưng tôi khuyên bạn không nên quá tự tin rằng lúc nào mọi chuyện cũng diễn ra suôn sẻ như vậy; các góc quay dạng giới thiệu sản phẩm thường khá dễ tạo, còn bất kỳ hình ảnh nào có chi tiết bàn tay hoặc chứa các đoạn văn bản có thể đọc được thì cực kỳ phức tạp. Hãy luôn chuẩn bị sẵn ngân sách dự phòng cho vài lượt tạo lại (reroll) đối với các trường hợp này.
If you already run this server in another client, the TOML block above is the only new part: same key, same balance, same generation history everywhere. Starting from zero, the Claude Code walkthrough covers four more use cases that transfer to Codex almost word for word. Create a key and ask Codex for your first render.
FAQ
Codex có hỗ trợ các server MCP từ xa sử dụng cơ chế xác thực Bearer không?
Có, Codex hỗ trợ hoàn toàn mặc định. Một server từ xa được khai báo dưới dạng bảng [mcp_servers.<name>] trong file ~/.codex/config.toml với trường url cụ thể, và trường bearer_token_env_var sẽ định nghĩa tên của biến môi trường chứa khóa bảo mật mà Codex sẽ gửi đi trong header Authorization. Thông tin này đã được đối chiếu chính xác với tài liệu Codex MCP chính thức vào ngày 11 tháng 7 năm 2026. Luồng xác thực OAuth cũng được hỗ trợ (đây là chế độ auth mặc định cho các server có cung cấp tính năng này), nhưng một thiết lập dùng khóa tĩnh thì hoàn toàn không cần cấu hình gì thêm ngoài hai dòng khai báo ở trên.
Cấu hình MCP có thực sự được dùng chung giữa Codex CLI, extension trên IDE và ChatGPT desktop không?
Có. Tài liệu hướng dẫn của Codex nêu rõ rằng ứng dụng ChatGPT desktop, Codex CLI và extension trên IDE sử dụng chung file cấu hình config.toml. Tuy nhiên, trong thực tế vận hành, có một điểm duy nhất không tự động đồng bộ là biến môi trường: các khai báo export trong shell của bạn chỉ hiển thị đối với giao diện CLI, trong khi đó một ứng dụng desktop khởi chạy từ Dock lại yêu cầu biến môi trường đó phải được thiết lập ở cấp độ hệ điều hành (lệnh launchctl setenv trên macOS), nếu không ứng dụng sẽ báo lỗi xác thực dù dùng chung một file cấu hình y hệt.
Tôi có thể thêm server bằng câu lệnh codex mcp add thay vì chỉnh sửa file thủ công không?
Đối với loại server này thì không thể. Tài liệu hướng dẫn không cung cấp bất kỳ cờ tùy chọn bearer-token nào đi kèm lệnh codex mcp add đối với các server giao thức HTTP, do đó một endpoint từ xa xác thực bằng key đồng nghĩa với việc bạn phải tự mở và chỉnh sửa file ~/.codex/config.toml. Điểm cộng của việc chỉnh sửa thủ công là kết quả hiển thị vô cùng rõ ràng và có thể dễ dàng quản lý phiên bản; khối cấu hình chỉ có đúng 3 dòng và key bảo mật được lưu trữ an toàn trong môi trường hệ thống thay vì lưu trực tiếp trong file.
Tại sao key bb_live_ của tôi không hoạt động trong phần cài đặt Connectors của ChatGPT?
Bởi vì đó là hai cổng tích hợp hoàn toàn khác nhau. Tính năng Connectors trong cửa sổ chat của ChatGPT (cả bản web và desktop, ẩn sau nút gạt chế độ nhà phát triển) bắt buộc xác thực các server MCP thông qua luồng OAuth chứ không phải dán trực tiếp API key tĩnh, vì thế một endpoint chỉ hỗ trợ Bearer key ở thời điểm hiện tại chưa thể hoàn thành luồng kết nối đó. Ngược lại, các giao diện Codex đọc trực tiếp file config.toml nên hoạt động hoàn hảo với key bảo mật. Một khi hệ thống của chúng tôi hoàn tất việc hỗ trợ OAuth 2.1, các cổng kết nối phía cửa sổ chat thông thường cũng sẽ trở thành một giải pháp khả thi; bảng danh sách client client table sẽ liên tục cập nhật trạng thái mới nhất của tính năng này.
Codex có thể tạo video được không, và mức giá cụ thể là bao nhiêu?
Được, nhưng bắt buộc phải có bước xác nhận chi phí trước khi thực hiện. Lệnh generate_video luôn luôn trả về một bảng báo giá bằng USD trước và hoàn toàn chưa tính phí; AI agent sẽ thực hiện lại lệnh gọi kèm theo tham số confirm_cost khớp với mức giá báo để chính thức bắt đầu quá trình render video. Giá dịch vụ dao động từ $0.10 cho một clip Veo 3.1 Lite không tiếng độ phân giải 720p dài 4 giây, cho đến $0.70 cho đoạn clip minh họa Veo 3.1 Fast dài 8 giây trong bài viết này, và tối đa là $4.40 cho một bản render video Veo 3.1 chất lượng cao 4K kèm âm thanh đầy đủ; mô hình Omni Flash kèm âm thanh có giá $0.10 mỗi giây ($0.30–$1.00 mỗi clip). Các lượt tạo nội dung thất bại sẽ được hệ thống tự động hoàn tiền đầy đủ.