sprkly.app-mcp

sprkly.app permite a los usuarios publicar su contenido de formato corto en tiktok, facebook, instagram, youtube, threads mediante lenguaje natural.

Documentación

Inicio rápido

Dos formas de autenticarse. Elige según lo que admita tu cliente.

Recomendado

Conectar con OAuth

Para Claude Cowork, claude.ai, Claude Desktop, Claude Code y ChatGPT. Añade el endpoint como conector personalizado e inicia sesión. No hay nada que copiar, y la conexión está vinculada a tu inicio de sesión de sprkly en lugar de a un secreto de larga duración.

  1. 1. Añade https://sprkly.app/api/mcp como conector personalizado.
  2. 2. Haz clic en Conectar y aprueba los permisos.
  3. 3. Pregunta a tu agente qué tienes programado. Configuración por cliente, justo debajo →

Scripts, CI, agentes autoalojados

Enviar una clave de API

Crea una clave en Configuración → Claves de API y envíala como token de portador. No hay paso de intercambio ni token de corta duración que renovar.

curl -s https://sprkly.app/api/mcp \
  -H "Authorization: Bearer sk_live_…" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

MCP está en Creator y Power, y en la prueba gratuita. Una clave funciona para MCP y la API REST. En Free, las llamadas MCP devuelven 403 con plan_required; la API REST sigue funcionando. Demasiadas llamadas devuelven 429: espera el número de segundos en Retry-After.

Configuración del cliente

Cada cliente, clic a clic. Los agentes alojados inician sesión con OAuth; cualquier cosa que se ejecute localmente puede usar una clave de API de Configuración → Claves de API en su lugar.

Claude Cowork

Inicia sesión con OAuth

Dale a Cowork tu cola de publicaciones para que pueda planificar y programar junto con el resto de tu trabajo.

  1. 1.En Cowork, abre Configuración (tu avatar, abajo a la izquierda) y haz clic en Conectores.
  2. 2.Haz clic en Añadir conector personalizado.
  3. 3.En el diálogo, pega la URL del servidor de abajo en el campo URL. El nombre puede ser cualquiera. "sprkly" se lee mejor.
  4. 4.Haz clic en Añadir. sprkly aparece en la lista de conectores. Haz clic en Conectar junto a él.
  5. 5.Se abre una pestaña de inicio de sesión de sprkly. Inicia sesión y haz clic en Aprobar en la pantalla de consentimiento.

El formulario, campo por campo

Nombre

sprkly

URL

https://sprkly.app/api/mcp

Listo cuando: La tarjeta del conector cambia a Conectado, y preguntar a Cowork "¿qué tengo en cola esta semana?" responde desde tu calendario real.

Cowork se conecta desde la nube de Anthropic, no desde tu portátil. Nada que instalar. "No se pudo alcanzar el servidor MCP" casi siempre significa una URL mal escrita. Cópiala, no la reescribas.

Los límites son reales, no orientativos

  • No hay herramienta de publicar ahora. Todo pasa por la misma cola, límites de plan y ruta de aprobación que tus propias publicaciones.
  • Eliminar es un borrado suave que puedes deshacer durante 30 días; un agente no puede tocar una publicación que ya se ha publicado.
  • Un agente solo ve tus propias cuentas, y una clave de API puede limitarse a un subconjunto de ellas.
  • Cada llamada de herramienta se registra. Desconéctate en cualquier momento desde Configuración.

Preguntas

¿Qué agentes de IA pueden conectarse a sprkly?

Cualquier cliente que hable el Protocolo de Contexto de Modelo. Eso incluye Claude Cowork, claude.ai, Claude Desktop, Claude Code, ChatGPT en modo desarrollador, Codex, Cursor, VS Code y herramientas de automatización como n8n. Cualquier otra cosa puede llamar al endpoint por HTTP simple con una clave de API.

¿Necesito instalar algo?

No. sprkly ejecuta un servidor MCP alojado, así que pegas una URL en tu agente e inicias sesión. No hay nada que ejecutar en tu máquina ni nada que mantener actualizado.

¿Puede un agente de IA publicar sin preguntarme?

Solo puede programar en cuentas que ya hayas conectado, y solo si se lo pides. También puedes requerir aprobación humana, para que cualquier cosa que un agente ponga en cola espere tu visto bueno antes de publicarse. Las publicaciones que ya se han publicado no pueden ser eliminadas por un agente en absoluto.

¿Cuánto cuesta?

Nada extra en Creator y Power, y está en la prueba gratuita. Las cuentas Free conservan la API REST, pero no MCP. Las solicitudes cuentan para un total mensual con la API REST: 7,500 en Creator, 15,000 en Power.

¿Puedo limitar qué cuentas ve un agente?

Sí. Limita una clave de API a cuentas específicas en Configuración y el agente solo puede leer y publicar en esas. Los alcances también controlan si puede escribir en absoluto o solo leer.

Ejemplo práctico

Inicializa, lista las herramientas y luego programa una publicación. Sustituye tu propia credencial.

TOKEN="sk_live_…"
MCP="https://sprkly.app/api/mcp"

# 1. Initialize (no credentials needed)
curl -s "$MCP" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize",
       "params":{"protocolVersion":"2025-11-25",
                 "capabilities":{},
                 "clientInfo":{"name":"curl","version":"1.0"}}}'

# 2. Which accounts can I post to?
curl -s "$MCP" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
       "params":{"name":"sprkly_list_profiles","arguments":{}}}'

# 3. Check the caption before committing to it
curl -s "$MCP" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call",
       "params":{"name":"sprkly_validate_post_policy",
                 "arguments":{"caption":"Launch day.",
                              "platforms":["instagram"],
                              "mediaUrlsCount":1}}}'

# 4. Queue it
curl -s "$MCP" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":4,"method":"tools/call",
       "params":{"name":"sprkly_schedule_post",
                 "arguments":{"caption":"Launch day.",
                              "profile_ids":["profile_…"],
                              "media_urls":["https://example.com/launch.jpg"],
                              "scheduled_time":"2026-08-04T18:00:00.000Z"}}}'

Lo que toda publicación necesita

Cuatro cosas son siempre obligatorias: un título, al menos una plataforma, una hora y medios para las plataformas que lo exigen. Dos plataformas quieren más, y sprkly_schedule_post rechaza la llamada en lugar de adivinar.

CampoObligatorio paraNotas
captioncada publicaciónSe verifica contra el límite de longitud de cada plataforma antes de poner nada en cola.
titleTikTok, YouTubeAmbas plataformas muestran el título, no el caption. YouTube lo limita a 100 caracteres.
platform_meta.tiktok.privacyLevelTikTokTikTok rechaza una publicación sin uno. Envía el nivel que el usuario pidió; si no es uno que este creador permita, el error nombra los niveles que sí lo son. O léelos primero con sprkly_get_tiktok_posting_options.
media_urls / media_idsInstagram, TikTokNinguna acepta una publicación solo de texto. Pasa un enlace directamente y sprkly lo lleva a su almacenamiento por sí mismo.

El orden del array es el orden de las diapositivas. Para un carrusel o un conjunto de fotos, la secuencia que envías en media_urls o media_ids es la secuencia que se publica. La diapositiva 1 tiene más peso: Instagram recorta todas las demás diapositivas para que coincidan con su forma, y Threads y Facebook publican solo esa.

Una lista de archivos no es una lista ordenada. Google Drive, Dropbox y la mayoría de los nodos de automatización devuelven archivos en orden de carga, que rara vez coincide con la intención. Ordena por nombre de archivo antes de construir el array, y nombra los archivos para que el orden funcione: 01.jpg, 02.jpg, 03.jpg. Rellena el cero, porque como texto 10 se ordena antes que 2. Cuando el orden se infirió en lugar de darse, dilo en la respuesta en lugar de presentarlo como seguro.

Herramientas

19 herramientas. Los argumentos a continuación son exactamente lo que devuelve tools/list.

sprkly_add_media_from_url WriteIdempotent

Descarga una imagen o video desde un enlace público a sprkly y obtén un media_id de vuelta, para reutilizarlo en varias publicaciones. Normalmente NO necesitas esto: sprkly_schedule_post acepta un enlace directamente en media_urls y lo lleva a su almacenamiento por sí mismo cuando la plataforma objetivo lo requiere. Recurre a esta herramienta solo cuando el usuario quiera un media_id para adjuntar a más de una publicación. Los enlaces compartidos de Google Drive y Dropbox se convierten automáticamente; el archivo debe compartirse públicamente. Límite de 50 MB.

ArgumentoTipoDescripción
urlrequeridostringEnlace https directo al archivo de imagen o video. Debe ser accesible públicamente.

Tú dices "Usa este clip para las tres publicaciones de esta semana: https://cdn.example.com/clips/launch.mp4”

El agente llama

sprkly_add_media_from_url({
  "url": "https://cdn.example.com/clips/launch.mp4"
})

Devuelve un mediaId que puedes adjuntar a varias publicaciones. Para una SOLA publicación no llames a esto en absoluto: pon el enlace directamente en media_urls en sprkly_schedule_post y se lleva al almacenamiento allí.

sprkly_delete_scheduled_post WriteDestructiveIdempotent

Elimina una publicación de la cola. Esto es un borrado suave. El usuario puede restaurarla desde la pestaña Eliminadas durante 30 días. Las publicaciones que ya se han publicado no se pueden eliminar de esta manera. Siempre confirma con el usuario antes de llamar.

ArgumentoTipoDescripción
post_idrequeridostringEl id de la publicación programada a eliminar.

Tú dices "Cancela la publicación del martes, ya está desactualizada."

El agente llama

sprkly_delete_scheduled_post({
  "post_id": "post_abc123"
})

Borrado suave: restaurable desde la pestaña Eliminadas durante 30 días. Los agentes confirman con el usuario antes de llamar.

sprkly_draft_post Write

Compone un caption a partir de una sugerencia de contenido y lo guarda como borrador en sprkly, ajustado al límite de caption más estricto entre las plataformas objetivo. Devuelve un id de borrador; el borrador aparece en /drafts para que el usuario lo revise.

ArgumentoTipoDescripción
content_hintrequeridostringDe qué debería tratar la publicación: un tema, frase o mensaje clave.
platformsstring[]Plataformas previstas, usadas para elegir el techo de longitud del caption.
tonestringVoz para el borrador. casual · profesional · promocional
namestringEtiqueta opcional para el borrador.
profile_idsstring[]Cuentas opcionales para preseleccionar en el borrador. De sprkly_list_profiles.

Tú dices "Redacta algo cálido sobre el nuevo espacio de estudio para Instagram."

El agente llama

sprkly_draft_post({
  "content_hint": "first look at the new studio space",
  "platforms": [
    "instagram"
  ],
  "tone": "casual"
})

sprkly_export_automation_template Solo lectura

Descarga una respuesta automática de Instagram como plantilla compartible. El archivo contiene el disparador, la palabra clave y el mensaje, y nunca un id de publicación, un id de perfil ni detalles de cuenta, por lo que es seguro enviarlo a otra persona. Una respuesta automática que aún es un borrador no tiene nada publicado para exportar. (próximamente, pendiente de revisión de Meta)

ArgumentoTipoDescripción
automation_idrequeridostringEl id de automatización a exportar.

Tú dices "Envíame mi respuesta automática GUIDE para reutilizarla en otra cuenta."

El agente llama

sprkly_export_automation_template({
  "automation_id": "flow_abc123"
})

sprkly_get_account_summary Solo lectura

Nivel de plan, estado de prueba, número de cuentas conectadas, recuentos de publicaciones programadas por estado y las próximas tres publicaciones. Nunca devuelve tokens ni secretos.

Sin argumentos.

Tú dices "¿Cómo está mi cuenta de sprkly?"

El agente llama

sprkly_get_account_summary({})

sprkly_get_analytics Solo lectura

Cómo rindieron realmente las publicaciones publicadas del usuario: vistas totales y participación, cambio semana a semana / mes a mes / año a año, su mejor hora de publicación, día de la semana y categoría de contenido, y las mejores publicaciones detrás de esos números. Cada recomendación lleva un recuento de samples\ — di lo delgada que es la evidencia en lugar de presentar un patrón de una publicación como un hallazgo. Cada porcentaje período a período lleva los recuentos de publicaciones y totales brutos de los que proviene: cítalos, porque un gran porcentaje sobre una base diminuta no es un gran cambio. topPosts\ está agrupado por plataforma y clasificado solo dentro de cada grupo; relativeToPlatformBest\ compara una publicación con otras en SU PROPIA plataforma y nunca entre plataformas, así que usa el value\ absoluto y su etiqueta metric\ para sopesar una plataforma contra otra. Instagram contribuye alcance, guardados, compartidos y vistas solo para cuentas conectadas o reconectadas con el permiso de información; y me gusta y comentarios solo para el resto. Threads y Facebook no producen métricas en absoluto. Lee coverage\ antes de comparar plataformas, y nunca clasifiques plataformas en una métrica que a una de ellas le falta.

ArgumentoTipoDescripción
daysentero (1 a 730)Cuántos días atrás analizar. Predeterminado 30. Los planes gratuitos leen como máximo 30 días; los planes de pago leen hasta 730.
profile_idsstring[]Limitar a estas cuentas. Omite para cada cuenta que esta conexión pueda ver.

Tú dices "¿Cómo me fue con mis publicaciones el mes pasado, y cuándo debería publicar?"

El agente llama

sprkly_get_analytics({
  "days": 30
})

Devuelve los números y la evidencia detrás de ellos. El consejo es tuyo para dar: verifica samples\ y coverage\ antes de llamar a algo un patrón.

Tú dices "¿Cuál de mis publicaciones de TikTok funcionó mejor esta semana?"

El agente llama

sprkly_get_analytics({
  "days": 7,
  "profile_ids": [
    "prof_tiktok_main"
  ]
})

sprkly_get_billing_summary Solo lectura

Estado de suscripción, plan actual, fin de período, identificadores comprados y los últimos eventos de facturación. Sin detalles de método de pago; el id de cliente de Stripe está truncado.

Sin argumentos.

Tú dices "¿En qué plan estoy y cuándo se renueva?"

El agente llama

sprkly_get_billing_summary({})

sprkly_get_post_approval_status Solo lectura

Si una publicación está esperando la aprobación del propietario, aprobada o rechazada, con las notas del revisor, quién preguntó y marcas de tiempo. Una publicación rechazada vuelve a ser un borrador: corrígela y luego solicita aprobación de nuevo.

ArgumentoTipoDescripción
post_idrequeridostringEl id de la publicación programada.

Tú dices "¿Ya se aprobó la publicación de lanzamiento?"

El agente llama

sprkly_get_post_approval_status({
  "post_id": "post_abc123"
})

sprkly_get_post_status Solo lectura

Detalle completo de una publicación: estado, objetivos, horas programadas y publicadas, enlace permanente y el motivo del fallo si no se publicó. Los medios vuelven como mediaIds en orden de diapositivas, no como enlaces. Los ids y los ids de perfil son detalles técnicos: habla con el usuario sobre cuentas por identificador y sobre publicaciones por su caption, y no leas ids en voz alta a menos que pidan uno.

ArgumentoTipoDescripción
post_idrequeridostringEl id de la publicación programada.

Tú dices "¿El reel de anoche realmente salió?"

El agente llama

sprkly_get_post_status({
  "post_id": "post_abc123"
})

sprkly_get_tiktok_posting_options Solo lectura

Los niveles de privacidad de TikTok permitidos y los ajustes de interacción de este creador, obtenidos en vivo desde TikTok. Normalmente NO lo necesitas antes de programar: sprkly_schedule_post comprueba privacyLevel contra esta misma lista y, si es incorrecto, devuelve los niveles que funcionarían. Llama a esto solo cuando el usuario pregunte cuáles son sus opciones, o quieras ofrecerle una elección.

ArgumentoTipoDescripción
profile_idobligatoriostringEl id de perfil de TikTok a consultar, de sprkly_list_profiles.

Tú dices "¿Qué opciones de privacidad tengo en TikTok?"

El agente llama a

sprkly_get_tiktok_posting_options({
  "profile_id": "prof_tt_studio"
})

Para mostrar al usuario sus opciones. NO lo ejecutes antes de sprkly_schedule_post por norma general: esa llamada valida privacyLevel por sí misma y nombra los niveles permitidos cuando uno es incorrecto.

sprkly_import_automation_template Escritura

Lee una plantilla de respuesta automática y, opcionalmente, la configura. Sin profile_id NO se escribe nada: la plantilla se comprueba y se devuelve, que es la primera llamada segura. Con profile_id se crea la automatización, y se activa cuando el disparador puede cumplirse. Un disparador que vigila una publicación (una palabra clave en una publicación, o cada comentario en una publicación) necesita también post_id. Sin él, se guarda como borrador que no envía nada hasta que se elija una publicación. Una palabra clave en cualquier publicación y un DM de Perfil no necesitan post_id. Una plantilla que envía DM a cada comentarista de toda la cuenta se desactiva y se rechaza. (próximamente, pendiente de revisión de Meta)

ArgumentoTipoDescripción
plantillaobligatorioobjectLa plantilla, como objeto o como texto de archivo.
profile_idstringLa cuenta de Instagram en la que configurarla. Déjalo fuera para solo comprobar la plantilla.
post_idstringLa publicación publicada a vigilar. Solo para un disparador que vigila una publicación. Déjalo fuera para una palabra clave en cualquier publicación o un DM de Perfil.

Tú dices "Comprueba esta plantilla que alguien me envió."

El agente llama a

sprkly_import_automation_template({
  "template": {
    "sprklyTemplate": 1,
    "name": "GUIDE reply"
  }
})

Sin profile_id, así que no se crea nada. Léela primero, luego impórtala de verdad.

sprkly_list_connected_social_accounts Solo lectura

Cada cuenta social ACTIVA vinculada a esta cuenta de sprkly: plataforma, nombre de usuario, número de seguidores y si necesita reconexión. Las cuentas desconectadas/inactivas nunca se listan, así que cualquier profileId devuelto aquí es un objetivo de publicación válido. Nunca devuelve tokens de acceso.

Sin argumentos.

Tú dices "¿Qué cuentas sociales tengo conectadas?"

El agente llama a

sprkly_list_connected_social_accounts({})

sprkly_list_profiles Solo lectura

Los ids de perfil necesarios para dirigir una publicación, con la plataforma y el nombre de usuario de cada uno. Llama a esto antes de sprkly_schedule_post.

Sin argumentos.

Tú dices "¿Dónde puedes publicar por mí?"

El agente llama a

sprkly_list_profiles({})

Los agentes llaman a esto primero: los ids de perfil que devuelve son a los que sprkly_schedule_post se dirige.

sprkly_list_scheduled_posts Solo lectura

La cola de publicaciones, de más reciente a más antigua, con una vista previa del pie de foto, objetivos, estado y motivo de fallo. Admite un filtro por estado y paginación con cursor.

ArgumentoTipoDescripción
statusstringFiltrar por estado. draft · pending_approval · scheduled · posted · failed
limitinteger (1 a 50)Máximo de publicaciones a devolver.
cursorstringCursor de paginación. Pasa el valor nextCursor de una respuesta anterior.

Tú dices "¿Qué tengo en cola esta semana?"

El agente llama a

sprkly_list_scheduled_posts({
  "status": "scheduled",
  "limit": 20
})

sprkly_request_post_approval Escritura

Retener un borrador o una publicación programada para la aprobación del propietario. La mueve a pending_approval, donde nunca se publica por sí sola, envía al propietario un correo con un enlace de Aprobar y devuelve un id de aprobación para consultar con sprkly_get_post_approval_status. Preguntar de nuevo por una publicación que ya está en espera devuelve la misma solicitud. Las publicaciones aprobadas vuelven a scheduled (una publicación pasada de tiempo sale en unos 2 minutos); las rechazadas se convierten en borradores con las notas del propietario. Para retener una publicación NUEVA, pasa requires_approval a sprkly_schedule_post en su lugar. Solo plan Power: otros planes reciben upgrade_required.

ArgumentoTipoDescripción
post_idobligatoriostringEl id de la publicación en borrador o programada a retener para aprobación.
notestringNota opcional para el propietario, mostrada en el correo de aprobación.

Tú dices "Programa la semana, pero déjame dar el visto bueno antes de que salga nada."

El agente llama a

sprkly_request_post_approval({
  "post_id": "post_abc123",
  "note": "Captions drafted from the Tuesday shoot. Check the TikTok hook."
})

sprkly_schedule_post Escritura

Programa una publicación, en UNA llamada. Adjunta medios pasando el enlace del usuario directamente a media_urls: sprkly lo descarga a su almacenamiento por las plataformas que lo necesitan, así que no hay que ejecutar ninguna herramienta de subida antes. Ejecuta las mismas comprobaciones de cuota, contenido duplicado y pre-vuelo de plataforma que la app de sprkly. Instagram y TikTok requieren medios en el momento de la presentación; YouTube y TikTok requieren un título, y TikTok también requiere platform_meta.tiktok.privacyLevel — solo envía el nivel que el usuario pidió y esta herramienta nombra los valores permitidos si no es uno de ellos. Lee los bytes reales de los medios y la respuesta dice qué se publicará realmente en cada plataforma (un Reel, un carrusel de 3 diapositivas, un conjunto de fotos, un video de feed de Página) además de cualquier cosa que valga la pena transmitir: comunícalo al usuario. Confirma la fecha, la hora y las cuentas objetivo con el usuario primero. Si una plataforma objetivo tiene más de una cuenta conectada y no se da profile_ids, la herramienta devuelve needsAccountChoice con las opciones en lugar de programar — presenta esa elección al usuario y luego vuelve a llamar.

ArgumentoTipoDescripción
captionstringPie de foto de la publicación, máximo 2200 caracteres.
platformsstring[]Plataformas en las que publicar. Una plataforma con exactamente una cuenta conectada se dirige directamente; una con varias hace que la herramienta responda needsAccountChoice para que el usuario elija.
profile_idsstring[]Cuentas específicas en las que publicar, de sprkly_list_profiles. Cuando se da, esta lista ES el conjunto objetivo — las plataformas no se expanden.
all_accountsbooleanPublicar explícitamente en TODA cuenta conectada en cada plataforma listada, omitiendo la pregunta needsAccountChoice. Solo pasa true cuando el usuario ha dicho que quiere todas las cuentas.
requires_approvalbooleanRetener la publicación hasta que el propietario la apruebe. Se guarda como pending_approval y nunca se publica por sí sola; el propietario recibe un correo con un enlace de Aprobar y también puede aprobar o rechazar en el calendario de sprkly. Consulta sprkly_get_post_approval_status para la respuesta. Solo plan Power: otros planes reciben upgrade_required.
approval_notestringNota opcional para el propietario, mostrada en el correo de aprobación. Solo se usa con requires_approval.
scheduled_timestringMarca de tiempo ISO 8601 para publicar. Debe estar en el futuro. Si se omite, la publicación sale en la siguiente ejecución del publicador, en aproximadamente un minuto — no hay selección inteligente de horario, así que pasa una hora explícita a menos que el usuario quiera publicarla inmediatamente. sprkly_get_analytics puede sugerir una.
media_urlsstring[]URLs de imágenes o videos accesibles públicamente para adjuntar, en orden de diapositiva. Pasa los enlaces para CUALQUIER plataforma. Instagram y Threads los obtienen directamente; para TikTok, YouTube y Facebook sprkly descarga el archivo a su propio almacenamiento mientras programa, así que un enlace también funciona allí y cualquier problema con él se informa ahora, en esta llamada. Los enlaces compartidos de Google Drive y Dropbox se convierten automáticamente. Solo JPEG, PNG, WebP, GIF, MP4, MOV y WebM: AVIF y HEIC (el predeterminado de la cámara de iPhone) se rechazan con instrucciones de reexportación, porque sprkly no puede convertirlos. Cada archivo debe ser accesible públicamente y tener menos de 50 MB.
media_idstringId de un solo archivo de medios ya subido a sprkly. Abreviatura para un media_ids de un elemento.
media_idsstring[]Ids de archivos de medios ya subidos a sprkly, en orden de diapositiva. El orden del array es el orden publicado. Úsalos cuando el usuario ya tenga medios en sprkly, o cuando un archivo vaya en varias publicaciones; para un enlace que el usuario acaba de darte, media_urls son menos pasos. Cada foto de un conjunto debe tener la MISMA forma o la llamada se rechaza: expórtalas todas a 1080x1920 (9:16), 1080x1440 (3:4), 1080x1350 (4:5) o 1080x1080 (1:1). Instagram acepta como máximo 10 diapositivas; los conjuntos de fotos de TikTok aceptan hasta 35.
titlestringTítulo de la publicación. Obligatorio para YouTube (máximo 100 caracteres) y TikTok (máximo 150 caracteres).
categorystringCategoría de contenido opcional, p. ej. "fitness".
platform_metaobjectOpciones de publicación específicas de plataforma, claveadas por plataforma.

Tú dices "Programa esto en Instagram y TikTok el jueves a las 6pm."

El agente llama a

sprkly_schedule_post({
  "caption": "Behind the scenes of the studio setup",
  "platforms": [
    "instagram",
    "tiktok"
  ],
  "scheduled_time": "2026-08-13T18:00:00+08:00",
  "media_id": "media_abc123",
  "title": "Behind the scenes of the studio setup",
  "platform_meta": {
    "tiktok": {
      "privacyLevel": "PUBLIC_TO_EVERYONE"
    }
  }
})

Con dos cuentas de Instagram conectadas, esto devuelve needsAccountChoice y el agente pregunta: "Tienes 2 cuentas de Instagram, ¿cuál?" Luego vuelve a llamar con profile_ids. Las publicaciones de TikTok necesitan un título y un privacyLevel de sprkly_get_tiktok_posting_options.

Tú dices "Sí, la cuenta del estudio. Igual para TikTok."

El agente llama a

sprkly_schedule_post({
  "caption": "Behind the scenes of the studio setup",
  "platforms": [
    "instagram",
    "tiktok"
  ],
  "profile_ids": [
    "prof_ig_studio",
    "prof_tt_studio"
  ],
  "scheduled_time": "2026-08-13T18:00:00+08:00",
  "media_id": "media_abc123",
  "title": "Behind the scenes of the studio setup",
  "platform_meta": {
    "tiktok": {
      "privacyLevel": "PUBLIC_TO_EVERYONE"
    }
  }
})

Tú dices "Publica estas cinco tarjetas como carrusel en Instagram y TikTok."

El agente llama a

sprkly_schedule_post({
  "caption": "Five things nobody tells you about scheduling",
  "platforms": [
    "instagram",
    "tiktok"
  ],
  "scheduled_time": "2026-08-14T09:00:00+08:00",
  "media_ids": [
    "media_c1",
    "media_c2",
    "media_c3",
    "media_c4",
    "media_c5"
  ],
  "title": "Five things nobody tells you about scheduling",
  "platform_meta": {
    "tiktok": {
      "privacyLevel": "PUBLIC_TO_EVERYONE"
    }
  }
})

El orden de media_ids es el orden de diapositiva, y los ids vienen de medios ya en sprkly. Si el usuario hubiera pegado cinco enlaces en su lugar, media_urls los toma en el mismo orden y sprkly los descarga cada uno mientras programa.

Tú dices "Publica esto en TikTok mañana a las 9am, solo para mí por ahora: https://drive.google.com/file/d/1AbCdEf/view?usp=sharing”

El agente llama a

sprkly_schedule_post({
  "caption": "Testing the new scheduler",
  "platforms": [
    "tiktok"
  ],
  "scheduled_time": "2026-08-16T09:00:00+08:00",
  "media_urls": [
    "https://drive.google.com/file/d/1AbCdEf/view?usp=sharing"
  ],
  "title": "Testing the new scheduler",
  "platform_meta": {
    "tiktok": {
      "privacyLevel": "SELF_ONLY"
    }
  }
})

Una llamada. El enlace compartido de Drive se convierte a su forma de descarga y se introduce en el almacenamiento de sprkly durante esta llamada, así que un enlace roto o privado se informa aquí en lugar de fallar silenciosamente en el momento de publicar. No llames a una herramienta de subida primero, y no busques el nivel de privacidad primero.

sprkly_update_scheduled_post EscrituraIdempotente

Cambia el pie de foto, la hora de publicación, las cuentas objetivo o los medios adjuntos en una publicación que aún no se ha publicado. Las publicaciones con estado "scheduled", "pending_approval" o "draft" se pueden editar, y el estado nunca cambia aquí: editar una publicación que espera aprobación no la aprueba, y una publicación rechazada sigue siendo un borrador hasta que solicites aprobación de nuevo. Una publicación que espera aprobación solo puede dirigirse a una cuenta.

ArgumentoTipoDescripción
post_idobligatoriostringEl id de la publicación programada.
captionstringPie de foto de reemplazo, máximo 2200 caracteres.
scheduled_timestringNueva hora de publicación ISO 8601. Debe estar en el futuro.
profile_idsstring[]Cuentas objetivo de reemplazo. Las plataformas se derivan de nuevo de ellas.
media_idstringId de archivo de medios de sprkly de reemplazo. Abreviatura para un media_ids de un elemento.
media_idsstring[]Medios de reemplazo, en orden de diapositiva. Reemplaza todo el conjunto, no añade — pasa cada diapositiva que quieras que la publicación conserve.

Tú dices "Mueve la publicación del viernes a la mañana del sábado en su lugar."

El agente llama a

sprkly_update_scheduled_post({
  "post_id": "post_abc123",
  "scheduled_time": "2026-08-15T09:00:00+08:00"
})

sprkly_upload_media EscrituraIdempotente

Sube archivos que el usuario tiene en su máquina (diapositivas, fotos, un video corto) a sprkly y obtén un media_id para cada uno. EL MODO ENLACE es la forma de enviar un archivo desde el disco. Envía archivos, una entrada por archivo con su nombre de archivo, sha256 y size_bytes. Recibes una uploadUrl por archivo. Haz PUT de los bytes: curl -sS -X PUT --data-binary @01.jpg "<uploadUrl>". Cada PUT responde JSON con mediaId. Los enlaces duran 15 minutos. Hasta 50 MB por archivo y 35 archivos por llamada. Los bytes nunca pasan por ti, así que un carrusel completo cuesta unos pocos cientos de tokens. EL MODO EN LÍNEA es solo para archivos diminutos (unos pocos KB): data_base64 más filename, 25 MB como máximo. base64 cuesta aproximadamente un token por carácter, así que nunca pongas una diapositiva real en línea. Cuando se envía files, data_base64 y filename se ignoran. Para un enlace público usa media_urls en sprkly_schedule_post en su lugar. Los mismos bytes enviados dos veces devuelven el mismo media_id.

ArgumentoTipoDescripción
filesobject[]MODO ENLACE. Una entrada por archivo, en orden de diapositiva. Obtén los valores en Bash: sha256sum 01.jpg (primeros 64 caracteres) y stat -c %s 01.jpg. De 1 a 35 entradas.
data_base64stringMODO EN LÍNEA, solo archivos diminutos. El contenido del archivo, codificado en base64. Alfabeto estándar o seguro para URL, con o sin prefijo data:. Se ignora cuando se envía files.
filenamestringMODO EN LÍNEA. El nombre del archivo, por ejemplo 01.jpg. Se usa en la respuesta y en los mensajes de error. Los bytes deciden el tipo real. Se ignora cuando se envía files.
content_typestringMODO EN LÍNEA. Sugerencia MIME opcional como image/jpeg. sprkly detecta los bytes y eso prevalece.

Dices "Publica las 5 diapositivas en ./carousel a Instagram mañana a las 9am"

El agente llama

sprkly_upload_media({
  "files": [
    {
      "filename": "01.jpg",
      "sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
      "size_bytes": 183422
    },
    {
      "filename": "02.jpg",
      "sha256": "60303ae22b998861bce3b28f33eec1be758a213c86c93c076dbe9f558c11c752",
      "size_bytes": 176050
    }
  ]
})

Una llamada para todas las diapositivas (se muestran dos). Primero, en la carpeta: for f in *.jpg; do printf '%s %s %s\n' "$f" "$(sha256sum "$f" | cut -c1-64)" "$(stat -c %s "$f")"; done. Luego haz curl a cada archivo en su uploadUrl y recopila los mediaIds en orden de nombre de archivo. Después UNA sprkly_schedule_post con media_ids establecido en esos ids en ese orden. Nunca codifiques una diapositiva en base64, y no recurras a media_urls para un archivo en disco: no hay enlace que dar.

Dices "Sube este ícono diminuto"

El agente llama

sprkly_upload_media({
  "data_base64": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
  "filename": "dot.png"
})

Modo en línea, solo porque el archivo tiene unos pocos bytes. Cualquier cosa del tamaño de una foto real pasa por files.

sprkly_validate_post_policy Solo lectura

Verifica un título o descripción contra las reglas de publicación de cada plataforma objetivo antes de programar: longitud del título o descripción, requisitos de medios, límites de hashtags, si los enlaces son clicables, títulos requeridos de YouTube y advertencias de PII o contenido prohibido. Análisis puro. No escribe nada.

ArgumentoTipoDescripción
captionrequiredstringEl título o descripción a verificar.
platformsrequiredstring[]Plataformas objetivo contra las que verificar.
mediaUrlsCountinteger (0 a -)Cuántas imágenes o videos se adjuntarán. Instagram y TikTok requieren al menos uno.
hashtagsstring[]Hashtags publicados junto con el título o descripción, si aún no están en él.
titlestringTítulo de la publicación. Requerido para YouTube, máximo 100 caracteres.
platformMetaobjectOpciones de publicación específicas de la plataforma, claveadas por plataforma.

Dices "Verifica este título o descripción contra las reglas de TikTok primero."

El agente llama

sprkly_validate_post_policy({
  "caption": "Three edits that doubled watch time. Full breakdown in the comments.",
  "platforms": [
    "tiktok"
  ],
  "mediaUrlsCount": 1
})

Ejecuta esto antes de programar: detecta un título o descripción demasiado largo, medios faltantes o un título de YouTube faltante mientras aún son baratos de corregir.

Transporte

HTTP fluido, sin estado. Los mensajes JSON-RPC 2.0 se envían por POST a un único endpoint y se responden con application/json. No se emite un id de sesión, por lo que no hay nada que rastrear entre llamadas.

MétodoComportamiento
POSTLleva cada mensaje MCP. Incluye Accept: application/json, text/event-stream.
GET405. Este servidor no ofrece flujo SSE iniciado por el servidor.
DELETE405. Sin estado, por lo que no hay sesión que terminar.

Versiones de protocolo

Negociadas en initialize: el servidor repite tu revisión cuando la soporta, de lo contrario responde con la más reciente. Soportadas: 2025-11-25 2025-06-18 2025-03-26. Envía el valor negociado como MCP-Protocol-Version en solicitudes posteriores. Un valor no soportado es un 400.

Métodos

initialize, ping, tools/list, tools/call, resources/list y prompts/list (ambos vacíos). Las notificaciones se reconocen con 202 y sin cuerpo.

Autenticación

initialize, ping y tools/list funcionan sin credenciales, por lo que un cliente puede mostrar lo que sprkly ofrece antes de que alguien inicie sesión. El primer tools/call es desafiado.

El desafío 401

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer error="invalid_token",
  error_description="Missing bearer credentials",
  resource_metadata="https://sprkly.app/.well-known/oauth-protected-resource/api/mcp",
  scope="profile mcp:read mcp:write"

Sigue resource_metadata para aprender qué servidor de autorización usar. Ese documento nombra este origen, cuyos metadatos viven en https://sprkly.app/.well-known/oauth-authorization-server.

OAuth 2.1

  • Registro dinámico de clientes (RFC 7591) y documentos de metadatos de ID de cliente son ambos soportados. PKCE con S256 es requerido.
  • Ámbitos: profile mcp:read mcp:write. Agrega offline_access para un token de actualización.
  • mcp:read cubre cada herramienta de solo lectura; mcp:write agrega borradores, programación y eliminación.

Ámbitos de clave API

Una clave puede tener *, sprkly:*, o cualquiera de post:read, post:write, post:draft, account:read, approval:request. Una clave con ámbito a cuentas específicas solo ve y toca esas.

Nunca pongas una clave API o token en la URL del conector como parámetro de consulta. Las URLs se registran en registros, proxies e historial del navegador, y la especificación MCP lo prohíbe. Usa el encabezado Authorization o OAuth.

Obsoleto

Estos aún funcionan. Nada nuevo los necesita.

  • https://mcp.sprkly.app/mcp. Hace proxy al endpoint anterior. Apunta nuevas integraciones a https://sprkly.app/api/mcp en su lugar.
  • POST /auth y POST /api/auth/mcp-token. El intercambio de clave API a JWT. La clave API ahora se acepta directamente como token portador, por lo que el intercambio y su bucle de actualización de 24 horas son innecesarios.

¿Necesitas ayuda?

El acceso MCP sigue la misma elegibilidad que la API REST. Si un conector no se conecta, la señal más rápida es si un tools/call no autenticado devuelve un 401 con un encabezado WWW-Authenticate.