Connect

Publicar en X

Publica el contenido aprobado en la única cuenta o página de X de esta conexión.

Tool IDx.publicacion.publicar
Nombre MCPx__publicacion__publicar
Conectorx
Planoaction
Scope (permiso)x:publish
Authconnection_credentials
Versión1
Sensiblesí
Deprecadono
ComportamientoreadOnly=false, destructive=true, idempotent=true, openWorld=true

Requiere conexión. Indica cuál en cada llamada: header X-Connect-Connection en REST y campo connectionId en el execute_write de MCP. No hay resolución implícita, ni siquiera con una sola conexión activa: la conexión es la empresa. El id sale de conexiones.estado.consultar.

Qué hace

Beta privada: requiere permiso explícito y una Idempotency-Key UUID v4 estable. La persona debe aprobar contenido y destino antes de ejecutar. Un resultado pendiente o desconocido exige revisión, nunca otra clave ni otro envío. No programa, borra ni modifica publicaciones. Formatos: texto (280 caracteres ponderados), 1 a 4 imágenes JPG/PNG/GIF/WEBP de hasta 5 MB con texto alternativo, o un único video MP4 de hasta 100 MiB (subida por partes; X valida su duración al publicar). Requiere permiso de subida de medios. Si el canal no termina de procesar un video dentro del tiempo de la corrida, no se publica nada y se informa no_publicado.

Entrada

CampoTipoRequeridoDescripción
textostringno · default ""Texto aprobado por la persona para este destino; puede estar vacío si hay imágenes aprobadas. El proveedor valida su límite y formato antes del envío.
medioslista de objetono · default []Archivos aprobados: hasta 20 imágenes, o exactamente un video. Las capacidades de cada canal se comprueban antes de producir un efecto externo.
medios[].urlstringsíURL HTTPS pública del archivo que el proveedor puede descargar. Sin credenciales ni parámetros secretos.
medios[].tipo"imagen" · "video"síTipo del archivo. Un video va solo (sin otras imágenes ni videos). Un formato no admitido por el canal se rechaza antes de publicar.
medios[].descripcionstringno · default ""Texto alternativo de la imagen (X, LinkedIn e Instagram imagen/carrusel). En videos no se envía: ningún canal de la beta lo admite por esta vía.
JSON Schema de entrada
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "texto": {
      "default": "",
      "description": "Texto aprobado por la persona para este destino; puede estar vacío si hay imágenes aprobadas. El proveedor valida su límite y formato antes del envío.",
      "type": "string",
      "maxLength": 10000
    },
    "medios": {
      "default": [],
      "description": "Archivos aprobados: hasta 20 imágenes, o exactamente un video. Las capacidades de cada canal se comprueban antes de producir un efecto externo.",
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "maxLength": 2048,
            "format": "uri",
            "description": "URL HTTPS pública del archivo que el proveedor puede descargar. Sin credenciales ni parámetros secretos."
          },
          "tipo": {
            "type": "string",
            "enum": [
              "imagen",
              "video"
            ],
            "description": "Tipo del archivo. Un video va solo (sin otras imágenes ni videos). Un formato no admitido por el canal se rechaza antes de publicar."
          },
          "descripcion": {
            "default": "",
            "description": "Texto alternativo de la imagen (X, LinkedIn e Instagram imagen/carrusel). En videos no se envía: ningún canal de la beta lo admite por esta vía.",
            "type": "string",
            "maxLength": 1000
          }
        },
        "required": [
          "url",
          "tipo"
        ],
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}

Ejemplo

curl
curl -X POST https://connect.emisso.ai/api/v1/tools/x.publicacion.publicar/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Idempotency-Key: 9d1f4c2a-7b30-4e58-9c11-2f6a8de5b743" \
  -H "Content-Type: application/json" \
  -d '{"input":{"texto":"Compartimos una mejora aprobada por nuestro equipo.","medios":[]}}'
MCP · meta-tool execute_write
{
  "tool": "x.publicacion.publicar",
  "params": {
    "texto": "Compartimos una mejora aprobada por nuestro equipo.",
    "medios": []
  },
  "connectionId": "conn_9tKfR2mQx4Vb",
  "idempotencyKey": "9d1f4c2a-7b30-4e58-9c11-2f6a8de5b743"
}

Clave de idempotencia obligatoria. Sin ella la llamada responde idempotency_key_missing. Genera un UUID v4 nuevo por operación y envíalo en Idempotency-Key (REST) o en idempotencyKey (MCP). Repite la misma clave solo al reintentar esa operación.

Salida esperada (200):

{
  "data": {
    "estado": "pendiente",
    "publicacionId": "123456789",
    "url": null,
    "operacionId": "req_ejemplo",
    "puedeReintentar": false
  },
  "meta": {
    "request_id": "req_…",
    "tool_id": "x.publicacion.publicar",
    "plane": "action",
    "latency_ms": 7410,
    "audit_status": "recorded"
  }
}

Salida

CampoTipoRequeridoDescripción
estado"publicado" · "pendiente" · "resultado_desconocido" · "no_publicado"sípublicado exige una lectura independiente de la misma cuenta; pendiente conserva un identificador aceptado; resultado_desconocido requiere revisión; no_publicado indica rechazo confirmado.
publicacionIdstringnullsí
urlstringnullsí
operacionIdstringsíIdentificador inmutable de la primera solicitud con esta Idempotency-Key.
puedeReintentarbooleanosíNo crees otra clave para repetir el efecto. Una repetición de transporte conserva la misma clave.
JSON Schema de salida
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "estado": {
      "type": "string",
      "enum": [
        "publicado",
        "pendiente",
        "resultado_desconocido",
        "no_publicado"
      ],
      "description": "publicado exige una lectura independiente de la misma cuenta; pendiente conserva un identificador aceptado; resultado_desconocido requiere revisión; no_publicado indica rechazo confirmado."
    },
    "publicacionId": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 240
        },
        {
          "type": "null"
        }
      ],
      "description": "Identificador confirmado por el proveedor; null cuando no se conoce. Tener un ID no acredita publicación visible."
    },
    "url": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 2048,
          "format": "uri"
        },
        {
          "type": "null"
        }
      ],
      "description": "Enlace público de la publicación confirmada, o null."
    },
    "operacionId": {
      "type": "string",
      "description": "Identificador inmutable de la primera solicitud con esta Idempotency-Key."
    },
    "puedeReintentar": {
      "type": "boolean",
      "const": false,
      "description": "No crees otra clave para repetir el efecto. Una repetición de transporte conserva la misma clave."
    }
  },
  "required": [
    "estado",
    "publicacionId",
    "url",
    "operacionId",
    "puedeReintentar"
  ],
  "additionalProperties": false
}

Errores de esta tool

CódigoHTTPReintentableQué hacer
connection_disabled403noReactívala en /connections o usa otra conexión del mismo sistema.
connection_not_found404noUsa uno de los connectionId que lista el error, o revisa la conexión en /connections. No hace falta reactivar nada.
connection_credential_required428noCrea un enlace con conexiones.enlace.crear (modo reconectar si la conexión ya existe) y pide a la persona que entregue la credencial de nuevo. No reintentes con la credencial anterior.
connection_busy409síEspera unos segundos y reintenta. Es una espera transitoria: no necesitas volver a conectar ni ingresar la credencial otra vez.
upstream_error502síReintenta más tarde. Si persiste, el problema está en el sistema externo, no en tu integración.
timeout504síReintenta. Para sincronizaciones largas usa la vía asíncrona y consulta el estado del trabajo.
connector_onboarding_required428noLee el mensaje: dice qué falta. Se completa en el portal de ese sistema, no en Connect, y después la llamada funciona sin cambios.
connection_scope_not_enabled403noPide a un owner/admin que habilite el scope en /connections para esa conexión, o usa otra que ya lo tenga activo. Cambiar la credencial del actor no resuelve este error.
rate_limited429síEspera y reintenta con backoff exponencial.
upstream_unexpected_response502noNo reintentes: la respuesta es determinista. Repórtalo con el request_id para que actualicemos el conector.
idempotency_key_missing400noGenera un UUID v4, envíalo como Idempotency-Key y reutilízalo solo para reintentos de esta misma operación.
idempotency_in_progress409síEspera unos segundos y reintenta con la MISMA clave. Generar una nueva para la misma operación es lo que duplica el efecto.
idempotency_conflict409noGenera una clave nueva para una operación nueva; reutiliza la clave solo para reintentar la misma.

Toda llamada puede devolver además los códigos transversales (validation_error, unauthorized, scope_not_granted, rate_limited, entre otros): el detalle vive en el catálogo de errores.

En esta página