Quay lại blog
BananaBanana Teamtutorialmcpapi

Grok MCP: tạo ảnh và video qua API xAI

Cách kết nối máy chủ MCP từ xa với Grok qua API xAI hoặc connector tùy chỉnh trên grok.com để tạo ảnh, video và giọng nói. Cấu hình thật, giá từ $0.03.

Grok MCP: tạo ảnh và video qua API xAI

Remote MCP tools trong Grok là tính năng phía máy chủ của API xAI: bạn khai báo một máy chủ MCP trong mảng tools của yêu cầu, và chính runtime của xAI mở kết nối, đọc danh sách tool rồi gọi chúng trong lúc Grok viết câu trả lời. Máy của bạn không chạy gì cả. Đó là khác biệt so với Cursor hay Claude Code, nơi client MCP nằm trong trình soạn thảo trước mặt bạn và máy bạn mới là bên nói chuyện qua mạng.

Trả lời nhanh: thêm một object vào tools{"type": "mcp", "server_url": "https://bananabanana.pro/api/mcp", "server_label": "bananabanana", "authorization": "Bearer bb_live_…"} — và Grok có thêm mười tool tạo nội dung: ảnh với dòng Nano Banana, video với Veo 3.1 và Gemini Omni Flash, giọng nói với Gemini TTS. Ảnh từ $0.03, video từ $0.10, tài khoản mới có sẵn $0.20 để thử. Trên grok.com, cũng URL đó được dán vào Connectors → New Connector → Custom, tuy phần đăng nhập thì còn mơ hồ (có hẳn một mục bên dưới).

Minh họa biên tập: bong bóng thoại đưa cây cọ về phía tủ máy chủ ở xa

Mọi điều nói ở đây về phía chúng tôi đều được đo bằng request thật ngày 1 tháng 9 năm 2026. Mọi điều về phía xAI lấy từ tài liệu của họ đúng như nó hiển thị cùng ngày hôm đó, và tôi trích dẫn thay vì diễn giải, vì phần API này của họ thay đổi liên tục.

Hai bề mặt, một máy chủ

"Grok có hỗ trợ MCP không" thực ra là hai câu hỏi, và câu trả lời khác nhau.

Bề mặtxAI ghi gì trong tài liệuClient MCP chạy ở đâu
API xAIRemote MCP tools hoạt động trong "the xAI native SDK, the OpenAI compatible Responses API, and the Speech to Speech API"trên máy chủ của xAI
grok.comConnectors → New Connector → Custom: "Enter the MCP server URL and complete any required authentication"trên máy chủ của xAI
Grok bên trong IDEkhông có trong cả hai trang tài liệuchưa rõ

Hai ràng buộc trên cùng trang đó đáng đọc lại lần nữa. Về transport: "Only Streaming HTTP and SSE transports are supported". Còn nhánh tương thích OpenAI mất hai tham số, require_approvalconnector_id, nên yêu cầu xAI hiện bước xác nhận trước một lệnh gọi tốn tiền là chuyện không làm được ở đó. Hoặc bạn tự dựng, hoặc chọn tool thật cẩn thận.

Endpoint của chúng tôi là Streamable HTTP không trạng thái, đúng loại transport vượt qua yêu cầu ấy. Không header phiên phải giữ sống, không luồng SSE phải canh: mỗi request JSON-RPC đổi lấy một phản hồi JSON.

Nối BananaBanana vào API xAI

Cách nhỏ nhất mà chạy được, cURL thẳng tới Responses API:

curl https://api.x.ai/v1/responses \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $XAI_API_KEY" \
  -d '{
    "model": "grok-4.6",
    "input": [
      { "role": "user",
        "content": "Generate a 16:9 product photo of a ceramic cup on linen, soft morning light. Use nano-banana-pro, then give me the URL." }
    ],
    "tools": [
      {
        "type": "mcp",
        "server_url": "https://bananabanana.pro/api/mcp",
        "server_label": "bananabanana",
        "server_description": "Image, video and speech generation on Google models",
        "authorization": "Bearer bb_live_your_key_here",
        "allowed_tools": ["list_models", "generate_image", "get_result"]
      }
    ]
  }'

Vẫn việc đó với SDK Python của xAI, nơi hai tham số đổi tên:

from xai_sdk import Client
from xai_sdk.chat import user
from xai_sdk.tools import mcp
 
client = Client(api_key=os.environ["XAI_API_KEY"])
 
chat = client.chat.create(
    model="grok-4.6",
    tools=[
        mcp(
            server_url="https://bananabanana.pro/api/mcp",
            server_label="bananabanana",
            authorization=os.environ["BB_KEY"],          # extra_headers=… also works
            allowed_tool_names=["list_models", "generate_image", "get_result"],
        )
    ],
)
chat.append(user("Make me a 16:9 hero image of a ceramic cup on linen."))

Khóa bb_live_… lấy trong hồ sơ của bạn, mục API Keys. Nó chỉ hiện đúng một lần.

Có hai chi tiết khiến người ta mất nguyên buổi tối.

Tiền tố Bearer. xAI mô tả authorization là "a token that will be set in the Authorization header on requests to the MCP server", nên vẫn để ngỏ chuyện họ có tự bọc giá trị bằng Bearer hay không. Máy chủ của chúng tôi không đoán. Gửi token trần thì nhận lại lời than rất cụ thể:

{"error":{"code":-32001,"message":"Unsupported Authorization scheme. Use 'Authorization: Bearer <token>'."}}

Vậy hãy tự viết scheme vào: "authorization": "Bearer bb_live_…". Nếu có ngày phía xAI bọc thành hai lần, hãy dùng cách không thể nhầm lẫn và đặt header trực tiếp bằng headers: {"Authorization": "Bearer bb_live_…"}.

allowed_tools chỉ tùy chọn trên giấy. Tài liệu xAI nói thẳng: thiếu nó thì mọi định nghĩa tool của máy chủ đổ vào ngữ cảnh của mô hình, "if an MCP server exposes 10 different tools and you don't specify allowed_tools, all 10 tool definitions will be available". Chúng tôi phơi ra đúng mười tool. Một nửa tiêu tiền. Với một bot chuyên tạo ảnh, tôi sẽ chỉ cho phép list_models, generate_imageget_result, rồi mở rộng khi thật sự cần video.

Minh họa biên tập: tấm thẻ đục lỗ trượt vào khe máy chủ, bên cạnh treo chùm chìa khóa

Grok thấy gì khi gõ cửa

Đây là màn bắt tay của chúng tôi, chạy thật cho bài viết này. Việc đọc danh sách tool không cần thông tin xác thực:

curl -s -X POST https://bananabanana.pro/api/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
list_models, get_account, top_up, generate_image, edit_image,
generate_video, edit_video, generate_speech, get_result, list_generations

Mọi thứ thật sự làm gì đó đều trả 401 cho tới khi bạn xuất trình token, và phản hồi mang theo con trỏ mà một client đàng hoàng cần:

HTTP/2 401
www-authenticate: Bearer realm="bananabanana",
  error_description="Authentication required. Connect this server with OAuth,
  or create an API key at https://bananabanana.pro/profile",
  resource_metadata="https://bananabanana.pro/.well-known/oauth-protected-resource/api/mcp",
  scope="mcp"

URL trong resource_metadata trả về tài liệu protected resource metadata thuộc đặc tả ủy quyền của MCP; đó là cách các client biết OAuth tự tìm ra authorization server của chúng tôi. Đi theo đường API xAI thì bạn sẽ chẳng bao giờ gặp 401 đó, vì khóa của bạn đi kèm mọi lệnh gọi. Nhưng với câu chuyện connector bên dưới, nó lại quan trọng.

Minh họa biên tập: người gác cửa kiểm tra tấm phiếu giấy trước tủ đồ nghề đang mở

Thêm một ghi chú tương thích, vì nó hay cắn những ai tự viết client: chúng tôi không đòi header Accept: application/json, text/event-stream và trả lời bằng JSON thuần. Những máy chủ khăng khăng đòi Accept kiểu SSE mới là bên hay hỏng một cách khó hiểu khi đứng sau gateway.

Báo giá, job, polling: luồng khiến agent hụt chân

Tạo ảnh là một lệnh gọi rồi chờ. Video thì không, và đây là chỗ vòng lặp agent viết theo kiểu "gọi tool, đọc kết quả" bị kẹt.

Yêu cầu video và nhiều ảnh trả về báo giá thay vì job. Mô hình phải gọi tool lần thứ hai với confirm_cost đúng bằng con số đó, chính xác đến từng xu, trước khi có bất kỳ khoản trừ nào. Đây là gờ giảm tốc cố ý: một agent không nên tiêu $4.40 cho clip Veo 4K chỉ vì ai đó gõ "làm cho điện ảnh hơn".

Sau đó việc tạo là bất đồng bộ. generate_imagegenerate_video trả job_id ngay lập tức; get_result long-polling tối đa 30 giây mỗi lần gọi và bạn gọi lại tới khi trạng thái ổn định. Ảnh thường về trong 10 đến 60 giây. Video mất 1 đến 10 phút tùy mô hình và độ dài.

Hệ quả thực tế với Responses API: một lượt của người dùng có thể cần bốn hoặc năm lệnh gọi tool phía máy chủ, và nếu tích hợp của bạn giới hạn hai bước, Grok sẽ báo job_id rồi dừng như người phục vụ ghi xong món rồi về nhà. Hãy chừa chỗ cho nó. Cũng nên truyền idempotency_key khi tạo nội dung, để một lần thử lại không sinh ra khoản trừ thứ hai.

Thất bại tự hoàn tiền. Nếu bộ lọc nội dung của Google từ chối prompt hoặc lệnh gọi chết ở phía nhà cung cấp, số dư quay lại tự động và get_result giải thích giai đoạn nào đã từ chối. Bạn không bao giờ phải trả tiền cho video mình không nhận được.

Minh họa biên tập: tấm phiếu giấy được đổi lấy bức ảnh đã hoàn thành trên quầy

grok.com có làm được không?

Một phần, và câu trả lời trung thực có một lỗ hổng.

xAI ghi rõ đường đi: vào grok.com/connectors, bấm New Connector, chọn Custom, rồi "Enter the MCP server URL and complete any required authentication". Máy chủ phải truy cập được từ internet công cộng, điều mà máy chủ của chúng tôi hiển nhiên đáp ứng. Các connector dựng sẵn, vẫn theo trang đó, đều xác thực bằng OAuth.

Minh họa biên tập: phích cắm được đưa tới ổ điện nửa khuất sau tấm rèm

Điều trang đó không nói là connector tùy chỉnh chấp nhận những phương thức xác thực nào. Đúng một câu, "complete any required authentication", là toàn bộ đặc tả, và trang được cập nhật lần cuối ngày 17 tháng 7 năm 2026.

Còn đây là phía chúng tôi. Chúng tôi vận hành một authorization server OAuth 2.1 đầy đủ: đăng ký client động, PKCE với S256, protected resource metadata, resource indicators, trọn bộ đặc tả ủy quyền của MCP. Client nào tuân theo đặc tả đó đều kết nối được mà chúng tôi không phải viết thêm dòng nào, đúng như cách connector của Claude và ChatGPT đang làm. Nếu connector tùy chỉnh của Grok đi cùng luồng ấy, mọi thứ sẽ chạy và bạn sẽ thấy trang đăng nhập bình thường với tài khoản của mình.

Còn nếu nó chỉ lưu một URL và không gửi thông tin xác thực nào, bạn sẽ thấy đủ mười tool hiện trong danh sách của connector mà mọi lệnh gọi đều trả về 401. Việc đọc danh sách tool ở chỗ chúng tôi là ẩn danh, nên một connector có thể trông khỏe mạnh dù chẳng tạo được gì.

Tôi rất muốn nói chắc chắn hơn ở đoạn này. Nếu bạn đã thử, kết quả đáng gửi một email tới [email protected], và bảng tương thích trên trang MCP của chúng tôi sẽ được cập nhật ngay trong ngày.

Chi phí bao nhiêu

Giá tính theo từng lần tạo, trừ vào số dư trả trước, không kèm thuê bao.

Cái gìMô hìnhGiá
Ảnh, 1KNano Banana 2 Lite$0.03
Ảnh, 512–4KNano Banana 2$0.03–$0.13
Ảnh, 1K–4KNano Banana Pro$0.11–$0.20
Video, 4 giây 720p không tiếngVeo 3.1 Lite$0.10
Video, từVeo 3.1 Fast$0.35
Video, từVeo 3.1$0.70
Video có tiếng, mỗi giâyGemini Omni Flash$0.10 ($0.30 cho mức tối thiểu 3 giây)
Giọng nóiGemini 3.1 Flash TTS$0.01 cho mỗi 200 ký tự

Ảnh sản phẩm chiếc cốc gốm mờ đặt trên vải lanh nhàu dưới ánh sáng dịu từ cửa sổ, tạo bằng Nano Banana Pro

Chiếc cốc đó chính là prompt trong ví dụ cURL phía trên, chạy thật trong lúc viết bài: Nano Banana Pro ở 2K, bị trừ $0.11, xong sau 32 giây kể từ lệnh gọi tool.

Tài khoản mới bắt đầu với $0.20, đủ cho sáu ảnh Lite hoặc một clip Veo Lite ngắn. Đủ để kiểm tra đường dây, không đủ để đánh giá các mô hình tốt, và tôi thà nói thẳng điều đó.

Nạp tiền có thưởng theo mức: 5% từ $50, 10% từ $100. Mã khuyến mãi đang bật cộng thêm 10% giá trị nạp, tính trên cùng một cơ sở, nên nạp $100 kèm mã sẽ vào số dư $120. Con số hiện hành luôn nằm ở mục giá.

Grok vốn đã tạo được ảnh. Sao phải đi vòng?

Câu hỏi công bằng, và chính danh sách mô hình của xAI trả lời một nửa: họ có grok-imagine-image-2.0grok-imagine-video-1.5. Cần một tấm ảnh nhanh ngay trong khung chat thì cứ dùng chúng. Chẳng ai cần máy chủ MCP cho việc đó.

Minh họa biên tập: hai khung cửa, một mở ra chiếc máy ảnh lấy liền, một mở ra xưởng phim phía xa

Lý do đưa việc tạo nội dung ra ngoài hẹp hơn, và chủ yếu nằm ở chuyện dùng mô hình nào và hóa đơn đọc ra sao:

  • Đúng những mô hình của Google. Nano Banana Pro cho chữ trong ảnh và ảnh sản phẩm, Veo 3.1 cho video có âm thanh gốc, Omni Flash khi bạn cần tiếng và một lượt chỉnh sửa theo hội thoại trên chính clip đó.
  • Biết giá trước khi bị trừ. list_models trả về giá theo đơn vị theo thời gian thực, còn video báo giá trước khi tiêu. Có thể đặt hạn mức cho agent và nó thực sự tuân thủ.
  • Một số dư cho mọi client. Cùng một khóa dùng được từ Grok, Gemini CLI, Codexstudio web, và mọi kết quả rơi vào chung một lịch sử.
  • Hoàn tiền khi thất bại, điều quan trọng hơn vẻ ngoài của nó một khi có bộ lọc nội dung trong luồng.

Cái giá thật của đường đi này: thêm một chặng mạng và một vòng polling, video cần bước xác nhận, Omni Flash chỉ tới 720p, và schema tool được client cache lúc kết nối, nên một tham số mới ở phía chúng tôi buộc bạn kết nối lại thì Grok mới truyền được. Không có gì trong đó là chí mạng. Nhưng tất cả đều có thật.

FAQ

Grok có hỗ trợ máy chủ MCP không?

Có, ở phía API. Remote MCP Tools của xAI hoạt động trong SDK gốc, trong Responses API tương thích OpenAI và trong Speech to Speech API, với server_urlserver_label bắt buộc, còn authorization, headersallowed_tools là tùy chọn. Trên grok.com, connector MCP tùy chỉnh nằm ở Connectors → New Connector → Custom.

Tôi cần OAuth hay chỉ cần khóa API?

Với API xAI, một khóa bb_live_… là đủ và đơn giản hơn: truyền nó trong authorization kèm tiền tố Bearer. OAuth quan trọng với các client kiểu connector tự đăng nhập cho người dùng. Máy chủ của chúng tôi hỗ trợ cả hai trên cùng một endpoint.

Nên dùng mô hình Grok nào?

Ví dụ MCP của xAI dùng grok-4.6, mức khuyến nghị mặc định hiện tại của họ. Mô hình nào hỗ trợ tool phía máy chủ cũng được; hợp đồng của tool không đổi giữa các mô hình.

Có tạo được video kèm âm thanh theo cách này không?

Có, qua Veo 3.1 bật âm thanh hoặc Gemini Omni Flash vốn luôn có tiếng. Hãy tính trước bước xác nhận hai lần và việc polling từ một phút trở lên. Omni dừng ở 720p, nên đó không phải lựa chọn cho clip mở đầu toàn màn hình.

Chuyện gì xảy ra khi một lần tạo thất bại?

Khoản trừ được hoàn tự động và get_result trả về lý do từ phía nhà cung cấp kèm gợi ý bước tiếp theo. Với các lần bị bộ lọc nội dung từ chối, thử lại bằng cách diễn đạt khác là hợp lý: cùng một prompt vẫn có thể qua ở lần thứ hai, vì bộ lọc phán xét các điểm ảnh đã tạo chứ không chỉ yêu cầu.

tutorialmcpapi