Grok MCP: imágenes y vídeo desde la API de xAI
Cómo conectar un servidor MCP remoto a Grok, por la API de xAI o con un conector personalizado de grok.com, para que genere imágenes, vídeo y voz. Configuración real y precios desde $0.03.

Las herramientas MCP remotas en Grok son una función del lado del servidor de la API de xAI: indicas un servidor MCP dentro del array tools de la petición y el propio runtime de xAI abre la conexión, lee la lista de herramientas y las llama mientras Grok escribe su respuesta. En tu portátil no se ejecuta nada. Esa es toda la diferencia con Cursor o Claude Code, donde el cliente MCP vive en el editor que tienes delante y es tu máquina la que habla.
Respuesta rápida: añade un objeto a tools — {"type": "mcp", "server_url": "https://bananabanana.pro/api/mcp", "server_label": "bananabanana", "authorization": "Bearer bb_live_…"} — y Grok gana diez herramientas de generación: imágenes con la familia Nano Banana, vídeo con Veo 3.1 y Gemini Omni Flash, voz con Gemini TTS. Las imágenes cuestan desde $0.03, el vídeo desde $0.10, y una cuenta nueva trae $0.20 para probar. En grok.com esa misma URL se pega en Connectors → New Connector → Custom, aunque la parte del inicio de sesión está menos clara (hay una sección para eso más abajo).

Todo lo que se dice aquí sobre nuestro lado del cable se midió con peticiones reales el 1 de septiembre de 2026. Todo lo que se dice sobre el lado de xAI viene de su documentación tal como estaba ese mismo día, y la cito en lugar de parafrasearla porque esta parte de su API se mueve.
Dos superficies, un servidor
"¿Grok soporta MCP?" son en realidad dos preguntas, y tienen respuestas distintas.
| Superficie | Qué documenta xAI | Dónde corre el cliente MCP |
|---|---|---|
| API de xAI | Las herramientas MCP remotas funcionan en "the xAI native SDK, the OpenAI compatible Responses API, and the Speech to Speech API" | en los servidores de xAI |
| grok.com | Connectors → New Connector → Custom: "Enter the MCP server URL and complete any required authentication" | en los servidores de xAI |
| Grok dentro de un IDE | no aparece en ninguna de las dos páginas | desconocido |
Dos restricciones de esa misma página merecen una segunda lectura. Transportes: "Only Streaming HTTP and SSE transports are supported". Y la vía compatible con OpenAI pierde dos parámetros, require_approval y connector_id, así que pedirle a xAI una confirmación previa a una llamada de pago no es una opción ahí. O la construyes tú, o eliges las herramientas con cuidado.
Nuestro endpoint es Streamable HTTP sin estado, justo el transporte que cumple ese requisito. Sin cabecera de sesión que mantener viva, sin stream SSE que vigilar: una respuesta JSON por cada petición JSON-RPC.
Conectar BananaBanana a la API de xAI
Lo mínimo que funciona, con cURL directo contra la 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"]
}
]
}'
Lo mismo con el SDK de Python de xAI, donde dos parámetros cambian de nombre:
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."))
La clave bb_live_… se crea en tu perfil, sección API Keys. Se muestra una sola vez.
Hay dos detalles que cuestan una tarde cada uno.
El prefijo Bearer. xAI describe authorization como "a token that will be set in the Authorization header on requests to the MCP server", lo que deja abierto si envuelven el valor en Bearer por ti. Nuestro servidor no adivina. Si mandas el token pelado, te responde algo muy concreto:
{"error":{"code":-32001,"message":"Unsupported Authorization scheme. Use 'Authorization: Bearer <token>'."}}
Así que escribe el esquema tú mismo: "authorization": "Bearer bb_live_…". Si algún día eso se duplica del lado de xAI, usa la forma inequívoca y fija la cabecera directamente con headers: {"Authorization": "Bearer bb_live_…"}.
allowed_tools es opcional solo sobre el papel. La documentación de xAI es tajante: sin él, todas las definiciones de herramientas del servidor entran en el contexto del modelo, "if an MCP server exposes 10 different tools and you don't specify allowed_tools, all 10 tool definitions will be available". Nosotros exponemos exactamente diez. La mitad gasta dinero. Para un bot de imágenes yo permitiría list_models, generate_image y get_result, nada más, y ampliaría cuando de verdad quiera vídeo.

Qué ve Grok cuando llama a la puerta
Este es nuestro saludo inicial, ejecutado para este artículo. El descubrimiento de herramientas no necesita credenciales:
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
Todo lo que realmente hace algo responde 401 hasta que presentas un token, y la respuesta lleva el puntero que un cliente bien educado necesita:
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"
Esa URL de resource_metadata devuelve el documento protected resource metadata de la especificación de autorización de MCP, que es como los clientes con OAuth encuentran solos nuestro servidor de autorización. Por la vía de la API de xAI nunca verás ese 401, porque tu clave viaja en cada llamada. Para la historia del conector de abajo sí importa.

Otra nota de compatibilidad, porque muerde a quien escribe su propio cliente: no exigimos la cabecera Accept: application/json, text/event-stream y respondemos JSON plano. Los servidores que insisten en el Accept con sabor a SSE son los que fallan de forma misteriosa detrás de una pasarela.
Presupuesto, trabajo, sondeo: el flujo que sorprende a los agentes
Generar una imagen es una llamada y una espera. El vídeo no, y ahí se atasca un bucle de agente escrito con la idea de "llamo a la herramienta y leo la respuesta".
Las peticiones de vídeo y de varias imágenes devuelven un presupuesto en lugar de un trabajo. El modelo tiene que llamar a la herramienta una segunda vez con confirm_cost fijado a esa cifra exacta, al céntimo, antes de que se cobre nada. Es un badén deliberado: un agente no debería poder gastar $4.40 en un clip 4K de Veo porque alguien escribió "hazlo más cinematográfico".
Después la generación es asíncrona. generate_image y generate_video devuelven un job_id al instante; get_result hace long-polling de hasta 30 segundos por llamada y hay que repetirlo hasta que el estado se asiente. Las imágenes suelen llegar entre 10 y 60 segundos. El vídeo tarda de 1 a 10 minutos según modelo y duración.
Consecuencia práctica para la Responses API: un turno de usuario puede necesitar cuatro o cinco llamadas de herramienta del lado del servidor, y si tu integración limita los pasos a dos, Grok anunciará un job_id y se detendrá como un camarero que toma la comanda y se va a casa. Dale margen. Pasa también idempotency_key en las generaciones, para que un reintento no genere un segundo cargo.
Los fallos se devuelven solos. Si el filtro de contenido de Google rechaza un prompt o la llamada muere aguas arriba, el saldo vuelve automáticamente y get_result explica qué etapa lo rechazó. Nunca pagas por un vídeo que no recibiste.

¿Puede grok.com hacer esto también?
En parte, y la respuesta honesta tiene un agujero.
xAI documenta el camino con claridad: entra en grok.com/connectors, pulsa New Connector, elige Custom y luego "Enter the MCP server URL and complete any required authentication". El servidor tiene que ser accesible desde internet, cosa que el nuestro evidentemente es. Los conectores integrados, dice la misma página, se autentican por OAuth.

Lo que la página no dice es qué métodos de autenticación acepta un conector personalizado. Esa única frase, "complete any required authentication", es toda la especificación, y la página se actualizó por última vez el 17 de julio de 2026.
Nuestra situación es esta. Tenemos un servidor de autorización OAuth 2.1 completo: registro dinámico de clientes, PKCE con S256, protected resource metadata, resource indicators, toda la especificación de autorización de MCP. Cualquier cliente que la siga se conecta sin una sola línea de trabajo por nuestra parte, que es exactamente como lo hacen los conectores de Claude y de ChatGPT. Si el conector personalizado de Grok recorre ese mismo flujo, funcionará sin más y verás una página de inicio de sesión normal con tu cuenta.
Si solo guarda una URL y no envía credenciales, verás aparecer las diez herramientas en la lista del conector y cada llamada volverá con un 401. El descubrimiento de herramientas es anónimo en nuestro servidor, así que un conector puede parecer sano sin poder generar nada.
Me encantaría ser más categórico aquí. Si lo has probado, el resultado merece un correo a [email protected], y la tabla de compatibilidad de nuestra página de MCP se actualiza el mismo día.
Cuánto cuesta
Los precios son por generación, se cobran de un saldo prepago y no llevan suscripción.
| Qué | Modelo | Precio |
|---|---|---|
| Imagen, 1K | Nano Banana 2 Lite | $0.03 |
| Imagen, 512–4K | Nano Banana 2 | $0.03–$0.13 |
| Imagen, 1K–4K | Nano Banana Pro | $0.11–$0.20 |
| Vídeo, 4s 720p sin sonido | Veo 3.1 Lite | $0.10 |
| Vídeo, desde | Veo 3.1 Fast | $0.35 |
| Vídeo, desde | Veo 3.1 | $0.70 |
| Vídeo con audio, por segundo | Gemini Omni Flash | $0.10 ($0.30 el mínimo de 3s) |
| Voz | Gemini 3.1 Flash TTS | $0.01 por cada 200 caracteres |

Esa taza es el prompt del ejemplo de cURL de más arriba, ejecutado de verdad mientras escribía esto: Nano Banana Pro a 2K, $0.11 cobrados, terminado 32 segundos después de la llamada.
Una cuenta nueva arranca con $0.20, que dan para seis imágenes Lite o un clip corto de Veo Lite. Suficiente para comprobar el cableado, insuficiente para juzgar los modelos buenos, y prefiero decirlo claro antes que fingir lo contrario.
Las recargas suman un bonus por volumen: 5% desde $50, 10% desde $100. Un código promocional activo añade otro 10% del depósito, calculado sobre la misma base, así que $100 con código acreditan $120. Las cifras vigentes están siempre en la sección de precios.
Grok ya genera imágenes. ¿Por qué desviarse?
Pregunta justa, y la propia lista de modelos de xAI responde a la mitad: tienen grok-imagine-image-2.0 y grok-imagine-video-1.5. Para una imagen rápida dentro del chat, úsalos. Nadie necesita un servidor MCP para eso.

Las razones para mandar la generación fuera son más estrechas y tienen que ver sobre todo con qué modelos y cómo se lee la factura:
- Modelos concretos de Google. Nano Banana Pro para texto dentro de la imagen y producto, Veo 3.1 para vídeo con audio nativo, Omni Flash cuando quieres sonido y una edición conversacional del mismo clip.
- Un precio antes del cargo.
list_modelsdevuelve precios por unidad en vivo y el vídeo presupuesta antes de gastar. A un agente se le puede fijar un presupuesto y lo respeta de verdad. - Un saldo para todos los clientes. La misma clave sirve desde Grok, Gemini CLI, Codex y el estudio web, y todos los resultados caen en un mismo historial.
- Reembolsos ante los fallos, que importan más de lo que parece cuando hay un filtro de contenido en el circuito.
Los costes honestos de esta ruta: un salto de red extra y un bucle de sondeo, un vídeo que exige confirmación, Omni Flash limitado a 720p, y esquemas de herramientas que los clientes cachean al conectarse, de modo que un parámetro nuevo por nuestra parte obliga a reconectar antes de que Grok pueda pasarlo. Nada de esto es fatal. Todo es real.
FAQ
¿Grok soporta servidores MCP?
Sí, por el lado de la API. Las Remote MCP Tools de xAI funcionan en el SDK nativo, en la Responses API compatible con OpenAI y en la Speech to Speech API, con server_url y server_label obligatorios y authorization, headers y allowed_tools opcionales. En grok.com, los conectores MCP personalizados están en Connectors → New Connector → Custom.
¿Necesito OAuth o basta con una clave de API?
Para la API de xAI basta una clave bb_live_… y es más simple: pásala en authorization incluyendo el prefijo Bearer. OAuth importa para clientes tipo conector que inician la sesión del usuario ellos mismos. Nuestro servidor admite ambos contra el mismo endpoint.
¿Qué modelo de Grok debería usar?
Los ejemplos de MCP de xAI usan grok-4.6, su recomendación por defecto ahora mismo. Sirve cualquier modelo con soporte de herramientas del lado del servidor; el contrato de las herramientas no cambia entre ellos.
¿Se puede generar vídeo con sonido por esta vía?
Sí, con Veo 3.1 con audio o con Gemini Omni Flash, que siempre trae sonido. Cuenta con la confirmación en dos pasos y con un sondeo de un minuto o más. Omni se queda en 720p, así que no es la opción para un clip protagonista a pantalla completa.
¿Qué pasa cuando una generación falla?
El cargo se revierte automáticamente y get_result devuelve el motivo del proveedor más un siguiente paso sugerido. Los rechazos del filtro de contenido merecen un reintento con otra redacción: el mismo prompt puede pasar a la segunda, porque el filtro juzga los píxeles producidos y no solo la petición.