Mellow Hub
Publicación social a través de MCP y REST, con delegación limitada, programación y resultados por canal.
Documentación
whoami
Qué puede hacer esta credencial: su modo (autopilot publica; review solo prepara), sus alcances, los canales a los que puede llegar, cuántas publicaciones le quedan hoy y si la suscripción de la cuenta permite publicar en absoluto. Llama a esto antes que cualquier otra cosa: responde las preguntas que de otro modo descubrirías al ser rechazado.
list_platforms
Cada red a la que Mellow publica y las reglas que impone: límites de subtítulos, cantidades y tipos de medios, campos obligatorios, ubicaciones disponibles. Lee esto en lugar de adivinar un límite.
list_channels
Las cuentas conectadas del propietario, con los IDs de canal que nombras en una publicación. Pasa refresh: true después de que una persona acabe de conectar algo, para volver a leer desde el proveedor en lugar de la copia local.
connect_channel
Devuelve un enlace que una PERSONA debe abrir para conectar una red. No puedes completar esto tú mismo: cada red pide a un humano que inicie sesión, y Bluesky pide un handle y una contraseña de aplicación. Da el enlace y la instrucción a la persona, luego llama a list_channels con refresh cuando digan que han terminado.
register_media
Comprueba que una URL https pública se puede obtener e informa qué es. No se copia nada: la red obtiene la URL cuando publica. Si tienes bytes en lugar de una URL, llama a request_upload_url en su lugar.
request_upload_url
Una URL firmada para hacer PUT de bytes de archivo, más la URL de medios para usar en una publicación después. Usa esto para cualquier cosa que tengas como bytes, y para cualquier video: el archivo va directamente al almacenamiento y nunca pasa por Mellow.
validate_post
Comprueba una publicación contra cada canal que nombra y NO publica NADA. Devuelve todos los problemas a la vez, cada uno nombrando el canal y el campo. Llama a esto antes de create_post cada vez: no cuesta nada y es la diferencia entre arreglar una publicación una vez y aprender las reglas publicando mal.
preview_post
Renderiza cómo se verá la publicación en cada red, sin publicar. Úsalo cuando la pregunta sea cómo se leerá algo en lugar de si está permitido; validate_post responde lo segundo.
create_post
Publica en cada canal nombrado, o lo programa con scheduledAt. ESTO ES PÚBLICO Y NO SE PUEDE DESHACER una vez que una red ha publicado. idempotencyKey es obligatorio: derívalo del contenido o la tarea, no al azar, para que un tiempo de espera que reintentes devuelva la publicación original en lugar de publicar una segunda. Bajo una credencial en modo review, esto prepara la publicación y se detiene para que una persona la apruebe.
get_post
La publicación y su resultado por canal, con el enlace público donde una red publicó. Lee targets, no solo status: partial significa que algunos canales tuvieron éxito y republicar todo los duplicaría.
list_posts
Publicaciones recientes, más nuevas primero, opcionalmente filtradas por estado. Úsalo para encontrar una publicación después de un tiempo de espera.
cancel_post
Retira una publicación que aún no ha salido. Una publicación que una red ya ha publicado no se puede cancelar a través de ninguna API — eso debe hacerse en la propia red, por una persona.
Recursos mellow://guide/* — límites, errores y ejemplos trabajados. Conecta un agente
Mellow Hub
Publica una publicación en cada red a la que estés conectado — Instagram, TikTok, YouTube, X, LinkedIn, Threads, Bluesky, Pinterest y Facebook — a través de una sola llamada a la API, con las reglas de cada red verificadas antes de que salga cualquier cosa.
URL base: https://www.mellow.world/api/hub/v1 Endpoint MCP: https://www.mellow.world/mcp
La forma del trabajo
whoami— qué puede hacer esta credencial, qué canales puede alcanzar y cuántas publicaciones quedan hoy. Llama primero; todo lo demás depende de la respuesta.list_channels— las cuentas conectadas. Cada una tiene unidque comienza conspc_; eso es lo que nombras enchannels.register_media— si la publicación tiene medios. Cualquier URL https pública funciona y no se copia nada: la red la obtiene cuando publica. Para bytes que tengas, pide una URL de subida y envía el archivo directamente allí.validate_post— gratis, no publica nada y devuelve todos los problemas a la vez. Haz esto antes decreate_postcada vez. Es la diferencia entre arreglar una publicación una vez y descubrir las reglas rompiéndolas públicamente.create_post— publica ahora, o programa para más tarde.get_post— el resultado por canal, con el enlace público.
Conectando un canal
No puedes hacer esto. Cada red hace que una persona inicie sesión, y Bluesky pide un handle y una contraseña de aplicación escritos en Mellow. connect_channel devuelve una URL y una frase que explica quién tiene que abrirla — pasa ambos y espera. Cuando la persona termine, list_channels muestra el nuevo canal.
Escribiendo una publicación para muchas redes
Una publicación tiene un subtítulo, una lista de medios y una lista de canales. Donde una red realmente difiera, dilo en options, claveado por plataforma:
{
"caption": "The same thought, everywhere.",
"media": ["https://cdn.example.com/clip.mp4"],
"channels": ["spc_instagram", "spc_youtube", "spc_bluesky"],
"options": {
"instagram": { "placement": "reels" },
"youtube": { "title": "The same thought", "privacyStatus": "public" }
},
"perChannel": {
"spc_bluesky": { "caption": "The same thought, in 300 characters." }
}
}
options se aplica a cada canal de esa red. perChannel se aplica a un canal y gana sobre options — es cómo le das a Bluesky un subtítulo más corto sin acortar la publicación en todas partes.
Publicar dos veces es el fallo a evitar
create_post requiere una clave de idempotencia, y no es decoración. Si tu solicitud agota el tiempo de espera, no sabes si publicó; reintentar con la misma clave devuelve la publicación original en lugar de hacer una segunda. Usa una clave derivada del contenido o la tarea, no un valor aleatorio por intento. Reutilizar una clave para contenido *diferente* es rechazado, porque eso es un error que vale la pena ver.
Programación
Da a scheduledAt una marca de tiempo ISO 8601 para publicar más tarde; omítela para publicar ahora. La cancelación funciona mientras una publicación aún está programada. Una vez que una red ha publicado, no hay forma de despublicarla a través de ninguna API — Mellow lo dirá en lugar de fingir.
Lo que devuelve
Cada canal tiene éxito o falla por su cuenta. Una publicación a cinco redes donde YouTube rechaza el título y las otras cuatro publican devuelve partial, con el fallo nombrado en el canal de YouTube y enlaces públicos en el resto. Lee targets, no solo status.
Autoridad y límites
Una clave es una delegación con bordes: los canales que puede tocar, si publica por sí misma (autopilot) o solo prepara una publicación para que una persona la apruebe (review), y cuántas publicaciones puede hacer en un día. whoami informa todos ellos. Todo lo hecho con la clave se registra en un diario que el propietario lee, y revocar una clave tiene efecto inmediato.
Los límites de canal se aplican también a verificaciones de entrada, vistas previas y publicaciones almacenadas. Leer, reintentar, mover o cancelar una publicación almacenada requiere que cada destino en esa publicación esté dentro de la concesión. Las listas restringidas omiten publicaciones que abarcan otros canales; el propietario aún puede verlas en Hub.
Lectura adicional
mellow://guide/platforms— los límites y campos obligatorios de cada red.mellow://guide/errors— qué significa cada rechazo y qué hacer al respecto.mellow://guide/recipes— ejemplos trabajados para los trabajos comunes.
Cada red, y lo que pide
Estas son las reglas que Mellow verifica antes de enviar cualquier cosa. Una publicación que pasa validate_post ya ha satisfecho todo en esta página; lo que queda es el propio juicio de la red sobre el archivo en sí — resolución, duración, relación de aspecto — que ninguna API puede responder de antemano.
Instagram (instagram)
Conexión. Una cuenta de Instagram profesional (Business o Creator). Una cuenta personal no puede publicar a través de ninguna API.
Necesario para iniciar la conexión:
connection_type— El inicio de sesión de Instagram es la ruta directa y la predeterminada. El inicio de sesión de Facebook es para cuentas alcanzadas a través de una Página. Uno de:instagram,facebook.
Subtítulo. Hasta 2200 caracteres.
Medios. Al menos 1, como máximo 10; imagen o video. Las historias toman exactamente un elemento. Los Reels toman un video.
Ubicación. timeline, reels, stories.
Soporta. programación, carrusel, miniatura, colaboradores, mediaTags, métricas.
TikTok (tiktok)
Conexión. Una cuenta personal o de creador de TikTok.
Subtítulo. Hasta 2200 caracteres.
Título. Opcional, hasta 90 caracteres. Se usa como titular en publicaciones de fotos.
Medios. Al menos 1, como máximo 35; imagen o video. Un video, o hasta 35 imágenes como publicación de fotos. Los videos y las imágenes no se pueden mezclar.
Soporta. programación, borrador, carrusel, métricas.
TikTok Business (tiktok_business)
Conexión. Una cuenta de TikTok Business. Úsala cuando necesites análisis de negocio; de lo contrario, la conexión ordinaria de TikTok es más simple.
Subtítulo. Hasta 2200 caracteres.
Título. Opcional, hasta 90 caracteres.
Medios. Al menos 1, como máximo 35; imagen o video. Un video, o hasta 35 imágenes como publicación de fotos.
Soporta. programación, borrador, carrusel, miniatura, métricas.
YouTube (youtube)
Conexión. Una cuenta de Google con un canal de YouTube. Las subidas cuentan contra la cuota diaria de API del canal.
Subtítulo. Hasta 5000 caracteres. Se convierte en la descripción del video cuando no se da una descripción explícita.
Título. Obligatorio, hasta 100 caracteres. YouTube rechaza una subida sin título.
Medios. Al menos 1, como máximo 1; video. Exactamente un video. Un video vertical de menos de tres minutos se publica como Short por el propio YouTube — no hay un endpoint separado de Shorts para llamar.
Opciones obligatorias. title.
Soporta. programación, miniatura, métricas.
X (x)
Conexión. Publicar a través de la API de X depende del nivel de acceso de la aplicación con la que se hace la conexión.
Necesario para iniciar la conexión:
connection_type— OAuth 2.0 es el predeterminado. OAuth 1.0a existe para aplicaciones que aún usan las credenciales más antiguas. Uno de:oauth2,oauth1.
Subtítulo. Hasta 280 caracteres. 280 es el límite para una cuenta estándar. Una cuenta premium puede escribir mucho más, pero Mellow no puede ver el nivel de la cuenta, así que cualquier cosa más larga se informa en lugar de enviarse silenciosamente.
Medios. Opcional, como máximo 4; imagen o video. Hasta cuatro imágenes, o un video. Texto solo está bien.
Soporta. programación, carrusel, encuesta, métricas.
LinkedIn (linkedin)
Conexión. Necesitas derechos de administrador en la página de empresa a la que quieres publicar.
Necesario para iniciar la conexión:
connection_type— Una página de empresa es la ruta disponible en las credenciales compartidas del proveedor. Un perfil personal necesita la aplicación de LinkedIn aprobada por Mellow. Uno de:organization,personal.
Subtítulo. Hasta 3000 caracteres, y obligatorio. LinkedIn no publica nada sin comentario.
Medios. Opcional, como máximo 20; imagen o video. Hasta veinte imágenes, o un video.
Soporta. programación, carrusel, métricas.
Threads (threads)
Conexión. La cuenta de Threads vinculada a tu inicio de sesión de Instagram.
Subtítulo. Hasta 500 caracteres.
Medios. Opcional, como máximo 20; imagen o video. Texto solo está bien. Hasta veinte elementos en un carrusel.
Ubicación. timeline, reels.
Soporta. programación, carrusel, métricas.
Bluesky (bluesky)
Conexión. Bluesky no tiene pantalla de consentimiento OAuth: la conexión se hace con un handle y una contraseña de aplicación, así que un agente no puede completar este paso solo.
Necesario para iniciar la conexión:
handle— Tu handle completo de Bluesky, por ejemplo name.bsky.social.app_password— Crea uno en Bluesky bajo Configuración → Contraseñas de aplicación. Nunca tu contraseña de cuenta — una contraseña de aplicación se puede revocar por sí sola.
Subtítulo. Hasta 300 caracteres, y obligatorio. Bluesky cuenta grafemas, así que los emoji y caracteres combinados pueden costar más de lo que parecen.
Medios. Opcional, como máximo 4; imagen o video. Hasta cuatro imágenes, o un video.
Soporta. programación, carrusel, métricas.
Pinterest (pinterest)
Conexión. Una cuenta de negocio de Pinterest con al menos un tablero para fijar.
Subtítulo. Hasta 500 caracteres. Se convierte en la descripción del pin.
Título. Opcional, hasta 100 caracteres.
Medios. Al menos 1, como máximo 1; imagen o video. Una imagen o un video por pin.
Soporta. programación, métricas.
Facebook (facebook)
Conexión. Una Página de Facebook que administres. Las líneas de tiempo personales no se pueden publicar a través de la API.
Subtítulo. Hasta 63206 caracteres.
Medios. Opcional, como máximo 10; imagen o video. Las historias toman exactamente un elemento. Los Reels toman un video.
Ubicación. timeline, reels, stories.
Soporta. programación, carrusel, miniatura, colaboradores, etiquetas de medios, métricas.
Qué significa un rechazo
Cada error lleva un code, una frase y retryable. Confía en retryable: si es falso, la misma solicitud fallará de la misma manera para siempre, y lo que hay que cambiar es la solicitud.
Una publicación rechazada también lleva issues, uno por problema, cada uno nombrando el canal y el campo. Arréglelos juntos e intente una vez, en lugar de uno a la vez.
Antes de que se envíe algo
| Código | Significado | Qué hacer |
|---|---|---|
authentication_required | Sin credencial, o una que Mellow no reconoce. | Presente la clave o el token. |
insufficient_scope | La credencial carece de un permiso que esta llamada necesita. | El propietario lo otorga cuando crea la clave. |
channel_not_connected | Ese ID de canal no es uno de los de este propietario. | Llame a list_channels; los ID son estables pero las conexiones van y vienen. |
channel_out_of_scope | La credencial no cubre todos los canales solicitados. | Use los canales que se le dieron. Una publicación almacenada que abarca otros canales necesita una concesión que cubra toda la publicación. |
caption_too_long | El subtítulo excede el límite de esa red. | Dé al canal un subtítulo más corto con perChannel. |
title_required | YouTube no aceptará una carga sin un título. | Establezca options.youtube.title. |
option_required | Algo que la red insiste falta. | El mensaje lo nombra. |
media_kinds_mixed | Imágenes y video en una publicación. | Divida la publicación, o dé al canal sus propios medios. |
media_required | La red no publica nada sin medios. | Agregue medios, o elimine ese canal. |
schedule_in_past | scheduledAt ya ha pasado. | Omítalo para publicar ahora. |
daily_limit_reached | Esta clave ha usado sus publicaciones del día. | Espere, o el propietario aumenta el límite. |
idempotency_key_reused | Esa clave ya publicó otra cosa. | Use una clave nueva. Esto es un error del llamador. |
Después de que se envió
| Código | Significado | Qué hacer |
|---|---|---|
provider_error | El proveedor de publicación rechazó o falló. | Lea retryable. |
provider_result_failed | La red misma rechazó la publicación de este canal. | El errorMessage del canal lleva lo que dijo la red. |
result_never_confirmed | La red nunca informó un resultado. | Verifique la cuenta directamente antes de volver a publicar — puede que se haya enviado. |
already_published | Cancelar algo ya público. | Nada aquí puede despublicarlo; elimínelo en la red. |
Dos fallos que merecen nombrarse
Una publicación parcial no es una publicación fallida. status: "partial" significa que algunos canales publicaron. Volver a publicar todo duplica esos. Vuelva a publicar solo los canales cuyo objetivo dice failed.
Un tiempo de espera agotado no es un rechazo. Si create_post agota el tiempo, la publicación puede existir. Reintente con la misma clave de idempotencia — eso es exactamente para lo que sirve — o llame a list_posts y mire.
Ejemplos trabajados
Publicar un video vertical en todos los lugares donde corresponde
{
"caption": "Three minutes on why we rebuilt the editor.",
"media": ["https://cdn.example.com/editor.mp4"],
"channels": ["spc_ig", "spc_tiktok", "spc_youtube", "spc_threads"],
"options": {
"instagram": { "placement": "reels", "shareToFeed": true },
"youtube": { "title": "Why we rebuilt the editor", "privacyStatus": "public" },
"tiktok": { "privacyStatus": "public", "allowComment": true }
}
}
Un video vertical de menos de tres minutos se convierte en un Short en YouTube por sí solo. No hay configuración de Shorts que enviar.
Un pensamiento, diferentes longitudes
Bluesky permite 300 caracteres y X permite 280; LinkedIn permite 3000 y recompensa usarlos. Escriba la versión larga una vez y anule las cortas:
{
"caption": "The long version, written for LinkedIn…",
"channels": ["spc_li", "spc_bsky", "spc_x"],
"perChannel": {
"spc_bsky": { "caption": "The short version." },
"spc_x": { "caption": "The short version." }
}
}
Programar una semana
Haga un create_post por ranura con scheduledAt, y dé a cada uno una clave de idempotencia estable — week-32-tue-morning en lugar de un valor aleatorio — para que volver a ejecutar el plan no publique dos veces.
Preparar algo para que una persona lo apruebe
Bajo una clave review, create_post prepara la publicación y se detiene. Dígale a la persona que está esperando; ellos lo aprueban en Mellow. whoami dice en qué modo está la clave, así que verifique antes de prometer publicar.
Recuperarse de un fallo parcial
get_post → status "partial"
→ targets[2].status "failed", errorMessage "…"
Arregle lo que el mensaje nombra, luego create_post de nuevo con solo el canal fallido y una clave de idempotencia nueva. No reenvíe los canales que publicaron.