Para agentes de IA
Conecta tu agente en un paso. Él gestiona tus canales sociales.
Markaestro está hecho para que lo opere el software. Un cliente MCP como Claude Code inicia sesión en el navegador y recibe una clave ligada a una marca; cualquier otro agente obtiene esa misma clave desde Ajustes. En ambos casos el agente puede descubrir en qué cuentas puede publicar, subir contenido, redactar y programar publicaciones, publicarlas e informar de lo que realmente salió, en Facebook, Instagram, TikTok, LinkedIn, Threads y Pinterest.
Sin SDK que instalar ni credenciales de plataforma que vigilar. Tu equipo conecta las cuentas una vez en el panel; a partir de ahí el agente habla con una única API de token bearer.
Diseñado para la autonomía, limitado a propósito
Por qué una clave de API es toda la integración
Lo difícil de dejar que un agente toque las redes sociales no es el HTTP. Es asegurarse de que un modelo confundido no pueda publicar en la marca equivocada, publicar duplicado en un reintento, o enviar algo que nadie revisó. Esas garantías están en la propia superficie de la API, no en tu prompt.
Clientes MCP
Inicia sesión desde el cliente. Nada que pegar.
Claude Code, Claude, Cursor, ChatGPT, Grok, Grok Bot, OpenClaw, Hermes y cualquier otro cliente que hable el Model Context Protocol pueden conectarse al servidor MCP alojado de Markaestro sin credenciales configuradas. La primera llamada a una herramienta abre tu navegador: inicia sesión, elige el espacio de trabajo y la marca sobre la que puede actuar el agente, revisa los permisos y pulsa Permitir. El cliente recibe una clave ligada a esa marca y la renueva por sí mismo.
Es OAuth 2.1 estándar con PKCE y registro dinámico de clientes, el mismo mecanismo que usan otros servidores MCP alojados, así que funciona sin ningún plugin específico de Markaestro. El servidor vive en https://markaestro.com/api/public/v1/mcp y expone treinta y una herramientas sobre la API pública: descubrimiento de marcas y destinos, subida de contenido, borradores y publicaciones programadas, publicación con seguimiento de ejecuciones, operaciones en lote, webhooks y las reglas por canal.
Conecta tu agente
Elige tu agente. Tres pasos y ya puede publicar.
Todos los clientes de abajo llegan al mismo servidor MCP alojado. La mayoría inicia sesión por el navegador: la primera llamada a una herramienta abre una página de consentimiento donde eliges el espacio de trabajo y la marca sobre la que puede actuar el agente, y el cliente recibe una clave ligada a esa marca. Los clientes que no pueden abrir un navegador usan una clave de API del espacio de trabajo. Mismo servidor, mismos permisos, misma lista en Ajustes.
Claude Code
El plugin instala la skill y el servidor alojado a la vez. Nada que configurar, nada que pegar.
Antes de empezar
- Eres propietario o administrador del espacio de trabajo con correo verificado, en un espacio con plan activo y al menos una marca.
- Claude Code está instalado y con sesión iniciada en tu cuenta de Anthropic.
Iniciar sesión
- Pregunta a Claude cualquier cosa sobre Markaestro, o ejecuta /mcp y elige markaestro.
- Tu navegador abre la página de consentimiento. Elige espacio de trabajo y marca, revisa los permisos y pulsa Permitir.
- Para cambiar de marca más tarde, ejecuta /mcp de nuevo, cierra sesión e inicia sesión con la otra marca.
Verificar
- Pide al agente que llame a list_products. Debe responder con la única marca que autorizaste y sus canales conectados.
- La conexión aparece en Ajustes, API con la insignia Agente conectado, su último uso y su volumen de solicitudes. Puedes revocarla ahí en cualquier momento.
Añadir el servidor
- Ejecuta los dos comandos del plugin en cualquier terminal, o añade solo el servidor con el tercer comando.
# The plugin bundles the skill and the hosted server.
claude plugin marketplace add D3vBaba/Markaestro
claude plugin install markaestro@markaestro
# Or add just the server. No key, no header: the first call opens the browser.
claude mcp add --transport http markaestro https://markaestro.com/api/public/v1/mcpClaude
claude.ai y Claude Desktop toman la URL del servidor como conector personalizado e inician sesión por la misma página de consentimiento.
Antes de empezar
- Eres propietario o administrador del espacio de trabajo con correo verificado, en un espacio con plan activo y al menos una marca.
- Los conectores personalizados están disponibles en los planes de pago de Claude. En Team y Enterprise puede que un propietario deba activarlos.
Iniciar sesión
- Pulsa Conectar junto a Markaestro. La página de consentimiento se abre en una pestaña nueva.
- Elige espacio de trabajo y marca, revisa los permisos y pulsa Permitir. La pestaña se cierra y el conector aparece como conectado.
- En un chat, activa Markaestro desde el menú de herramientas cuando quieras que el agente lo use.
Verificar
- Pide al agente que llame a list_products. Debe responder con la única marca que autorizaste y sus canales conectados.
- La conexión aparece en Ajustes, API con la insignia Agente conectado, su último uso y su volumen de solicitudes. Puedes revocarla ahí en cualquier momento.
Añadir el servidor
- Abre Ajustes, Conectores y luego Añadir conector personalizado.
- Pega la URL del servidor de abajo, deja vacíos los campos de cliente OAuth y pulsa Añadir.
https://markaestro.com/api/public/v1/mcpCursor
Un clic añade el servidor a Cursor. La primera llamada a una herramienta abre el inicio de sesión en el navegador; Cursor guarda el token en el llavero del sistema.
Antes de empezar
- Eres propietario o administrador del espacio de trabajo con correo verificado, en un espacio con plan activo y al menos una marca.
- Cursor con MCP activado. Los servidores MCP remotos funcionan en todos los planes de Cursor.
Iniciar sesión
- Abre Cursor Settings, Tools & MCP. Markaestro muestra Needs login; púlsalo.
- Tu navegador abre la página de consentimiento. Elige espacio de trabajo y marca y pulsa Permitir. Cursor recoge el token y lista las herramientas.
- Grok Bot dentro de Cursor usa esta misma entrada de servidor.
Verificar
- Pide al agente que llame a list_products. Debe responder con la única marca que autorizaste y sus canales conectados.
- La conexión aparece en Ajustes, API con la insignia Agente conectado, su último uso y su volumen de solicitudes. Puedes revocarla ahí en cualquier momento.
Añadir el servidor
- Pulsa Añadir a Cursor y confirma la instalación en Cursor.
- O pega el JSON en .cursor/mcp.json dentro de un proyecto (compartido con tu equipo por git) o en ~/.cursor/mcp.json (solo tú).
// .cursor/mcp.json (project) or ~/.cursor/mcp.json (global)
{
"mcpServers": {
"markaestro": {
"url": "https://markaestro.com/api/public/v1/mcp"
}
}
}Para una máquina de build compartida o CI, una clave de API del espacio de trabajo en las cabeceras sustituye al inicio de sesión.
// Without a browser: pass a workspace API key instead.
{
"mcpServers": {
"markaestro": {
"url": "https://markaestro.com/api/public/v1/mcp",
"headers": { "Authorization": "Bearer mk_live_..." }
}
}
}ChatGPT
ChatGPT se conecta a Markaestro como app personalizada en modo desarrollador e inicia sesión por la página de consentimiento.
Antes de empezar
- Eres propietario o administrador del espacio de trabajo con correo verificado, en un espacio con plan activo y al menos una marca.
- El modo desarrollador requiere ChatGPT Pro, Business, Enterprise o Edu. Pro expone solo herramientas de lectura; Business, Enterprise y Edu exponen todas.
- En Business, Enterprise y Edu puede que un administrador deba permitir apps personalizadas en el espacio de trabajo.
Iniciar sesión
- La página de consentimiento se abre mientras ChatGPT escanea las herramientas. Elige espacio de trabajo y marca, pulsa Permitir y luego Crear.
- En un chat, pulsa el botón más, Más y luego Markaestro para tener disponibles las herramientas.
- ChatGPT se registra en Markaestro una vez por conexión. Reconectar crea una conexión nueva que puedes revocar por separado.
Verificar
- Pide al agente que llame a list_products. Debe responder con la única marca que autorizaste y sus canales conectados.
- La conexión aparece en Ajustes, API con la insignia Agente conectado, su último uso y su volumen de solicitudes. Puedes revocarla ahí en cualquier momento.
Añadir el servidor
- Abre Ajustes, Apps y conectores, Ajustes avanzados y activa el modo desarrollador.
- De vuelta en Apps y conectores, pulsa Crear. Llámala Markaestro, pega la URL del servidor, elige OAuth como autenticación y pulsa Escanear herramientas.
https://markaestro.com/api/public/v1/mcpGrok
Grok llega a Markaestro de tres formas: como conector personalizado en grok.com, desde el terminal Grok Build y como herramienta MCP remota en la API de xAI.
Antes de empezar
- Eres propietario o administrador del espacio de trabajo con correo verificado, en un espacio con plan activo y al menos una marca.
- Los conectores de grok.com funcionan en planes personales. Grok Business y Enterprise necesitan que un administrador del equipo aprovisione el conector.
- La vía de la API de xAI se ejecuta en el servidor, así que siempre usa una clave de API del espacio de trabajo.
Iniciar sesión
- grok.com y Grok Build abren la página de consentimiento en la primera llamada a una herramienta. Elige espacio de trabajo y marca y pulsa Permitir.
- Para la API de xAI, crea una clave de API del espacio de trabajo y pásala en el campo authorization.
Verificar
- Pide al agente que llame a list_products. Debe responder con la única marca que autorizaste y sus canales conectados.
- La conexión aparece en Ajustes, API con la insignia Agente conectado, su último uso y su volumen de solicitudes. Puedes revocarla ahí en cualquier momento.
Añadir el servidor
- grok.com: abre grok.com/connectors, pulsa New Connector, elige Custom y pega la URL del servidor. Si el diálogo pide un id de cliente, usa los valores de abajo.
- Grok Build: ejecuta los dos comandos en un terminal. Grok Build también toma una entrada de Markaestro del .mcp.json de Claude Code o del mcp.json de Cursor.
- API de xAI: añade el bloque de herramienta al array tools de una solicitud a la Responses API.
Conector personalizado de grok.com
Server URL: https://markaestro.com/api/public/v1/mcp
grok.com's Custom Connector asks only for a name and this URL. It registers
itself and opens the browser sign-in, no client id or secret to enter.
(If a future dialog does ask, use client id markaestro-grok-web with a blank secret.)Terminal Grok Build
# Grok Build (terminal). The first tool call opens the browser.
grok mcp add --transport http markaestro https://markaestro.com/api/public/v1/mcp
grok mcp doctor markaestro
# Headless: pass a workspace API key instead.
grok mcp add --transport http markaestro https://markaestro.com/api/public/v1/mcp \
--header "Authorization: Bearer ${MARKAESTRO_API_KEY}"Bloque de herramienta de la xAI Responses API
// xAI Responses API: one entry in the request's "tools" array.
// Server-side, so it always uses a workspace API key.
{
"type": "mcp",
"server_url": "https://markaestro.com/api/public/v1/mcp",
"server_label": "markaestro",
"authorization": "Bearer mk_live_...",
"allowed_tools": ["list_products", "list_destinations", "upload_media",
"create_post", "publish_post", "get_job_run"]
}Grok Bot
Grok Bot se ejecuta en un ordenador en la nube y acepta servidores MCP personalizados con una clave estática. La beta aún no tiene inicio de sesión por navegador para servidores personalizados.
Antes de empezar
- Eres propietario o administrador del espacio de trabajo con correo verificado, en un espacio con plan activo y al menos una marca.
- Grok Bot está en beta temprana en los planes SuperGrok y dentro de Cursor Pro. El acceso Enterprise es por lista de espera.
- Tienes una clave de API del espacio de trabajo con los permisos de agente. Crea una con el botón de abajo.
Usar una clave de API
Verificar
- Pide al agente que llame a list_products. Debe responder con la única marca que autorizaste y sus canales conectados.
- La conexión aparece en Ajustes, API con la insignia Agente conectado, su último uso y su volumen de solicitudes. Puedes revocarla ahí en cualquier momento.
Añadir el servidor
- Abre los ajustes de conectores de tu Bot y añade un servidor MCP personalizado.
- Pega la URL del servidor y añade la clave como cabecera con los valores de abajo.
Valores de cabecera para el diálogo del conector
Server URL: https://markaestro.com/api/public/v1/mcp
Header name: Authorization (or x-api-key if that is the only field)
Header value: Bearer mk_live_... (with x-api-key: just mk_live_...)OpenClaw
OpenClaw añade servidores MCP remotos desde su CLI y completa el inicio de sesión en un puerto loopback, así que funciona en la máquina que ejecuta tu gateway.
Antes de empezar
- Eres propietario o administrador del espacio de trabajo con correo verificado, en un espacio con plan activo y al menos una marca.
- OpenClaw está instalado y el gateway en ejecución.
- Un servidor sin navegador puede terminar el inicio de sesión con la alternativa --code.
Iniciar sesión
- openclaw mcp login markaestro imprime la URL de inicio de sesión y espera en un puerto loopback.
- Abre la URL, elige espacio de trabajo y marca y pulsa Permitir. OpenClaw guarda las credenciales fuera del archivo de configuración.
- Ejecuta openclaw mcp reload para que los agentes en ejecución recojan las herramientas.
Verificar
- Pide al agente que llame a list_products. Debe responder con la única marca que autorizaste y sus canales conectados.
- La conexión aparece en Ajustes, API con la insignia Agente conectado, su último uso y su volumen de solicitudes. Puedes revocarla ahí en cualquier momento.
Añadir el servidor
- Ejecuta los tres comandos, o añade el bloque del servidor a ~/.openclaw/openclaw.json.
- Cuando la skill de Markaestro esté en ClawHub, openclaw skills install markaestro añade también las instrucciones del agente.
openclaw mcp add markaestro \
--url https://markaestro.com/api/public/v1/mcp \
--transport streamable-http \
--auth oauth
openclaw mcp login markaestro # prints the sign-in URL; add --code <code> when headless
openclaw mcp reloadEntrada de configuración equivalente
// ~/.openclaw/openclaw.json
{
"mcp": {
"servers": {
"markaestro": {
"url": "https://markaestro.com/api/public/v1/mcp",
"transport": "streamable-http",
"auth": "oauth"
}
}
}
}Sin navegador
# Without a browser: a workspace API key from the environment.
openclaw mcp add markaestro \
--url https://markaestro.com/api/public/v1/mcp \
--transport streamable-http \
--header "Authorization: Bearer ${MARKAESTRO_API_KEY}"Hermes
Hermes Agent registra servidores MCP HTTP desde config.yaml y ejecuta el inicio de sesión por sí mismo, guardando el token en ~/.hermes/mcp-tokens.
Antes de empezar
- Eres propietario o administrador del espacio de trabajo con correo verificado, en un espacio con plan activo y al menos una marca.
- Hermes Agent está instalado. Los secretos van en ~/.hermes/.env y se referencian como ${VAR} en la configuración.
Iniciar sesión
- En la primera llamada a una herramienta, Hermes abre la página de consentimiento. Elige espacio de trabajo y marca y pulsa Permitir.
- Hermes renueva el token por sí mismo. Revócalo desde Ajustes, API cuando termines.
Verificar
- Pide al agente que llame a list_products. Debe responder con la única marca que autorizaste y sus canales conectados.
- La conexión aparece en Ajustes, API con la insignia Agente conectado, su último uso y su volumen de solicitudes. Puedes revocarla ahí en cualquier momento.
Añadir el servidor
- Añade el bloque mcp_servers a ~/.hermes/config.yaml.
- En una sesión en curso, envía /reload-mcp. Las herramientas aparecen como mcp_markaestro_<tool>.
# ~/.hermes/config.yaml
mcp_servers:
markaestro:
url: "https://markaestro.com/api/public/v1/mcp"
auth: oauthSin navegador
# Without a browser: a workspace API key, kept in ~/.hermes/.env
mcp_servers:
markaestro:
url: "https://markaestro.com/api/public/v1/mcp"
headers:
Authorization: "Bearer ${MARKAESTRO_API_KEY}"Otro cliente MCP
Cualquier cliente que hable Streamable HTTP y OAuth 2.1 con registro dinámico de clientes se conecta solo con la URL del servidor.
Antes de empezar
- Eres propietario o administrador del espacio de trabajo con correo verificado, en un espacio con plan activo y al menos una marca.
- El cliente admite servidores MCP remotos por Streamable HTTP y puede abrir un navegador para OAuth. Si no puede, usa la pestaña Clave de API.
Iniciar sesión
- La primera llamada a una herramienta se responde con un desafío de inicio de sesión y el cliente abre la página de consentimiento.
- Elige espacio de trabajo y marca y pulsa Permitir. El cliente cambia el código por una clave ligada a la marca y la renueva cada 30 días.
Verificar
- Pide al agente que llame a list_products. Debe responder con la única marca que autorizaste y sus canales conectados.
- La conexión aparece en Ajustes, API con la insignia Agente conectado, su último uso y su volumen de solicitudes. Puedes revocarla ahí en cualquier momento.
Añadir el servidor
- Añade la URL del servidor en la configuración MCP del cliente. El JSON de abajo es la forma habitual de mcpServers.
- No configures id de cliente ni secreto. El cliente se registra solo en el primer uso.
{
"mcpServers": {
"markaestro": {
"type": "http",
"url": "https://markaestro.com/api/public/v1/mcp"
}
}
}Clave de API
Para trabajos de CI, workers cron y clientes que no pueden abrir un navegador: una clave de API del espacio de trabajo en la cabecera Authorization llega al mismo servidor con los mismos permisos.
Antes de empezar
- Eres propietario o administrador del espacio de trabajo con correo verificado, en un espacio con plan activo y al menos una marca.
- Puedes crear claves: propietario o administrador del espacio de trabajo con correo verificado.
Usar una clave de API
Verificar
- Pide al agente que llame a list_products. Debe responder con la única marca que autorizaste y sus canales conectados.
- La conexión aparece en Ajustes, API con la insignia Agente conectado, su último uso y su volumen de solicitudes. Puedes revocarla ahí en cualquier momento.
Añadir el servidor
- Crea una clave ligada a una marca con solo los permisos que necesita el agente y una caducidad.
- Pásala como cabecera bearer al servidor alojado, o como MARKAESTRO_API_KEY al servidor stdio local, que además puede subir archivos desde el disco.
# CI, cron, or any client without a browser: pass a key instead.
claude mcp add --transport http markaestro https://markaestro.com/api/public/v1/mcp \
--header "Authorization: Bearer mk_live_..."
# Local stdio server (can also upload files from disk)
claude mcp add markaestro -e MARKAESTRO_API_KEY=mk_live_... -- npx -y @markaestro/mcp{
"mcpServers": {
"markaestro": {
"type": "http",
"url": "https://markaestro.com/api/public/v1/mcp",
"headers": { "Authorization": "Bearer mk_live_..." }
}
}
}Qué ocurre cuando el cliente se conecta
Cinco pasos, todos a cargo del cliente y del navegador. Tú solo ves la página de consentimiento.
POST /api/public/v1/mcp → 401 + WWW-AuthenticateEl cliente llama al endpoint MCP sin credencial. Markaestro responde 401 con una cabecera WWW-Authenticate que nombra el documento de metadatos del recurso protegido. Esa cabecera es la que indica al cliente que hay un inicio de sesión disponible.
GET /.well-known/oauth-protected-resource · /.well-known/oauth-authorization-serverEl cliente lee dos documentos públicos: qué servidor de autorización protege el endpoint y dónde están sus endpoints de registro, autorización y token. Ambos se sirven en markaestro.com y se pueden cachear.
POST /api/public/v1/oauth/registerEl cliente se registra con un nombre y su dirección de retorno. Se aceptan direcciones loopback, retornos https y esquemas de apps nativas; se rechaza http plano hacia un host real. No hace falta un id de cliente precompartido.
GET /oauth/authorize (browser)Tu navegador abre la página de consentimiento. Un propietario o administrador del espacio de trabajo con correo verificado elige el espacio y la marca, ajusta los permisos y pulsa Permitir. Markaestro devuelve el navegador al cliente con un código de un solo uso.
POST /api/public/v1/oauth/tokenEl cliente intercambia el código más su verificador PKCE por un token de acceso y un token de refresco. El token de acceso es una clave de API normal del espacio de trabajo, ligada a la marca elegida. Caduca a los 30 días; un refresco rota su secreto y lo extiende otros 30.
El token es una clave de API real
Scopes, vínculo a la marca, límites de tasa, comprobaciones de suscripción, idempotencia y revocación siguen el mismo código que una clave creada a mano. No hay un segundo modelo de permisos que entender.
Visible y revocable en Ajustes
Un agente conectado aparece en Ajustes, API con la insignia Agente conectado, su último uso y su volumen de peticiones. Revócalo ahí y la siguiente llamada del cliente falla; el cliente también puede revocar su propio token al desconectarlo.
Una conexión, una marca
Cada conexión está ligada a exactamente una marca, elegida en el consentimiento. Para que un agente trabaje con una segunda marca, conéctalo de nuevo y elige esa marca. Un cliente nunca puede llegar a una marca que no se le concedió.
Códigos y tokens de refresco de un solo uso
Los códigos de autorización viven diez minutos y se consumen de forma atómica, así que un código repetido falla. Los tokens de refresco rotan en cada uso y se guardan con hash. Los registros de cliente inactivos caducan a los 180 días.
Puntos de conexión
Para quien construya un cliente MCP o audite el flujo. Todo se descubre desde los dos documentos well-known; nada de esto hay que configurarlo a mano.
# Discovery (public, cacheable)
GET /.well-known/oauth-protected-resource RFC 9728
GET /.well-known/oauth-authorization-server RFC 8414
# Authorization server
POST /api/public/v1/oauth/register RFC 7591, public clients (PKCE) or client_secret
GET /oauth/authorize?response_type=code&client_id=…&redirect_uri=…
&code_challenge=…&code_challenge_method=S256&state=…
POST /api/public/v1/oauth/token grant_type=authorization_code | refresh_token
POST /api/public/v1/oauth/revoke RFC 7009
# Token response
{ "access_token": "mk_live_<ws>.<client>.<secret>", "token_type": "Bearer",
"expires_in": 2592000, "refresh_token": "…", "scope": "products.read posts.write …" }El ciclo del agente
Cinco llamadas, de principio a fin
Cada automatización de Markaestro es una variación de este ciclo. Los pasos uno a tres son la API Connect, la superficie plana que la mayoría de agentes deberían usar. Los pasos cuatro y cinco acceden a la API completa /api/public/v1 para publicación explícita y seguimiento de ejecuciones.
GET /api/connect/v1/social-accountsDevuelve cada cuenta conectada y publicable para la marca de la clave, cada una con plataforma, nombre de usuario e id opaco. Llámalo al inicio de cada ejecución, las conexiones cambian.
POST /api/connect/v1/media/create-upload-url → PUTGenera una URL firmada de un solo uso y corta duración, luego envía los bytes en bruto mediante PUT. Recibes un id de contenido. Imágenes hasta 10 MB; la API completa también admite vídeo hasta 250 MB.
POST /api/connect/v1/postsEnvía el texto, los ids de contenido y los ids de cuenta tal cual. Déjalo como borrador para revisión, o envía is_draft false con scheduled_at para ponerlo en el calendario.
POST /api/public/v1/posts/:id/publishEncola una ejecución asíncrona. LinkedIn, Threads y Pinterest se publican mediante la API oficial. Facebook, Instagram y TikTok llegan a la cola «Por publicar» del espacio de trabajo para que una persona los publique de forma nativa.
GET /api/public/v1/job-runs/:id · webhooksConsulta el id de la ejecución, o registra un endpoint de webhook y deja que Markaestro te envíe post.published, post.action_required y post.failed. Nunca asumas que una publicación terminó de forma síncrona.
Guía rápida
Una integración funcional en cuatro comandos
Primero, genera la clave: abre Configuración → API, elige la marca a la que tendrá acceso, marca los permisos que necesita y, opcionalmente, dale una fecha de vencimiento. La clave se muestra una sola vez, guárdala directamente en el almacén de secretos de tu agente. Crear claves requiere un administrador o propietario con correo verificado.
# The API is served from the marketing apex and the app subdomain alike.
export MARKAESTRO_URL="https://markaestro.com"
export MARKAESTRO_API_KEY="mk_live_<workspaceId>.<clientId>.<secret>"
# 1. What can this key post to?
curl -s "$MARKAESTRO_URL/api/connect/v1/social-accounts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"{
"data": [
{
"id": "prod_123#instagram:instagram:ig_123",
"product_id": "prod_123",
"product": "Northwind Coffee",
"platform": "instagram",
"username": "northwindcoffee"
}
]
}# 2. Mint a signed upload url, then PUT the bytes.
RESP=$(curl -s -X POST "$MARKAESTRO_URL/api/connect/v1/media/create-upload-url" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "mime_type": "image/png", "size_bytes": 184320, "name": "cold-brew.png" }')
# → { "media_id": "ast_777", "upload_url": "https://.../media/upload?token=..." }
curl -X PUT "<upload_url>" \
-H "Content-Type: image/png" \
--data-binary @cold-brew.pngis_draft: false junto con una marca de tiempo scheduled_at para ponerlo en el calendario en su lugar.# 3. Put it on the calendar. Pass the account id back verbatim.
curl -X POST "$MARKAESTRO_URL/api/connect/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"caption": "Cold brew season starts Friday.",
"media": ["ast_777"],
"social_accounts": ["prod_123#instagram:instagram:ig_123"],
"is_draft": false,
"scheduled_at": "2026-08-14T15:00:00.000Z"
}'
# 4. Check where everything stands.
curl -s "$MARKAESTRO_URL/api/connect/v1/posts?limit=20" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"Listo para usar
Definiciones de herramientas y un resumen para el agente
Dos cosas para copiar. La primera es un conjunto de esquemas de herramientas que cubren todo el ciclo de publicación, escritos en JSON Schema, así que funcionan como definiciones de herramientas de Claude, funciones de OpenAI, o la forma de entrada para un servidor MCP que alojes tú. La segunda es el resumen operativo que evita que un modelo haga algo inesperado con ellas.
[
{
"name": "markaestro_list_accounts",
"description": "List the social accounts this Markaestro key can publish to. Call this first in every run. Never hardcode account ids. Returns id, platform, and username.",
"input_schema": { "type": "object", "properties": {}, "required": [] }
},
{
"name": "markaestro_upload_media",
"description": "Upload one image or video to Markaestro and return a media asset id. Images: png, jpeg, webp, gif up to 10 MB. Video: mp4, mov, webm up to 250 MB.",
"input_schema": {
"type": "object",
"properties": {
"file_path": { "type": "string", "description": "Local path to the file to upload." },
"mime_type": { "type": "string", "description": "MIME type of the file." }
},
"required": ["file_path", "mime_type"]
}
},
{
"name": "markaestro_create_post",
"description": "Create a post for one channel. Facebook, Instagram, and TikTok are manual-first: a human posts them natively from the To Post queue. Omit delivery_mode unless the user explicitly asked for unattended publishing.",
"input_schema": {
"type": "object",
"properties": {
"channel": {
"type": "string",
"enum": ["facebook", "instagram", "tiktok", "linkedin", "threads", "pinterest", "x"]
},
"caption": { "type": "string", "description": "Caption text, max 4000 characters." },
"media_asset_ids": {
"type": "array",
"items": { "type": "string" },
"description": "Ids from markaestro_upload_media. Instagram and TikTok require at least one."
},
"destination_id": {
"type": "string",
"description": "From markaestro_list_accounts. Required only when the brand has more than one destination on that channel."
},
"delivery_mode": {
"type": "string",
"enum": ["manual_reminder", "direct_publish", "platform_inbox"],
"description": "Omit for the channel default."
}
},
"required": ["channel", "caption"]
}
},
{
"name": "markaestro_publish_post",
"description": "Queue an async publish run for an existing post. Returns a run id. Poll it, do not assume the post is live.",
"input_schema": {
"type": "object",
"properties": { "post_id": { "type": "string" } },
"required": ["post_id"]
}
},
{
"name": "markaestro_list_posts",
"description": "List posts for this brand, newest first. Filter by status: draft, scheduled, publishing, published, platform_action_required, failed, partial_failed.",
"input_schema": {
"type": "object",
"properties": {
"status": { "type": "string" },
"limit": { "type": "integer", "minimum": 1, "maximum": 100 }
},
"required": []
}
},
{
"name": "markaestro_delete_post",
"description": "Remove a post from Markaestro. Use it to cancel something scheduled. Deleting an already-published post does NOT retract the live copy on the platform.",
"input_schema": {
"type": "object",
"properties": { "post_id": { "type": "string" } },
"required": ["post_id"]
}
}
]You have a Markaestro API key for exactly one brand. Markaestro is the
publishing layer: you supply the caption and the media, it handles the
platform rules, the calendar, and delivery.
Base URL: https://markaestro.com
Auth: Authorization: Bearer $MARKAESTRO_API_KEY
Rules:
- Call GET /api/connect/v1/social-accounts before posting. Pass the returned
account ids back verbatim. Never invent or cache an id across runs.
- Upload media before creating a post; posts reference media ids, not files.
- Facebook, Instagram, and TikTok are manual-first. Creating and publishing
them queues a reminder for a human. That is the intended behavior. Only
send deliveryMode "direct_publish" if the operator explicitly asked for it.
- Send a unique Idempotency-Key on every POST. Reuse the SAME key when
retrying the SAME request; never reuse it for a different one.
- On 429, wait the number of seconds in Retry-After, then retry. On 4xx other
than 429, do not retry. Report the error code and requestId and stop.
- Publishing is async. POST /publish returns a run id; poll
GET /api/public/v1/job-runs/<id> until succeeded or failed.
- To cancel, list with ?status=scheduled and DELETE the post id. Deleting a
published post does not remove it from the platform.
- Never claim a post is live until a run reports succeeded or a post reports
published.Tu agente también puede obtener esto directamente: curl https://markaestro.com/llms.txt devuelve un resumen en texto plano de toda la API, endpoints, reglas y gestión de errores, lo bastante compacto para caber en el contexto.
Recetas
Los cuatro flujos de trabajo que realmente usan los agentes
# Full control: draft → publish → poll. No productId needed:
# the key is already bound to one brand.
POST_ID=$(curl -s -X POST "$MARKAESTRO_URL/api/public/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: post-2026-08-14-linkedin" \
-d '{
"channel": "linkedin",
"caption": "We shipped agent-driven publishing.",
"mediaAssetIds": ["ast_777"]
}' | jq -r .post.id)
RUN_ID=$(curl -s -X POST "$MARKAESTRO_URL/api/public/v1/posts/$POST_ID/publish" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Idempotency-Key: publish-$POST_ID" | jq -r .run.id)
# queued → running → succeeded | failed
curl -s "$MARKAESTRO_URL/api/public/v1/job-runs/$RUN_ID" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"# Review the queue, then cancel what the operator rejected.
curl -s "$MARKAESTRO_URL/api/public/v1/posts?status=scheduled&limit=100" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"
curl -X DELETE "$MARKAESTRO_URL/api/public/v1/posts/pst_123" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"
# → { "deleted": true, "id": "pst_123" }# One call, up to 25 posts. Per-item results: one bad item
# does not fail the batch.
curl -X POST "$MARKAESTRO_URL/api/public/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: week-33-drop" \
-d '{
"posts": [
{ "channel": "instagram", "caption": "Monday", "mediaAssetIds": ["ast_1"] },
{ "channel": "facebook", "caption": "Tuesday", "mediaAssetIds": ["ast_2"] },
{ "channel": "linkedin", "caption": "Thursday" }
]
}'
# → { "results": [...], "created": 3, "total": 3 }# Let Markaestro call you instead of polling.
curl -X POST "$MARKAESTRO_URL/api/public/v1/webhook-endpoints" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-agent.example.com/hooks/markaestro",
"events": ["post.published", "post.action_required", "post.failed"]
}'
# Each delivery carries:
# X-Markaestro-Event post.action_required
# X-Markaestro-Timestamp 2026-08-14T15:00:04.000Z
# X-Markaestro-Signature HMAC of the body with your webhook secret
# The secret is shown once at creation and stored hashed. Verify before acting.Límites de seguridad
Qué puede y qué no puede hacer el agente
La autonomía solo sirve si el radio de impacto es pequeño. Los valores por defecto de Markaestro asumen que quien llama es software que podría estar equivocado.
Facebook, Instagram y TikTok son de publicación manual
Las publicaciones que tu agente crea para esos canales usan por defecto manual_reminder: Markaestro nunca llama a la API de la plataforma para ellas. Publicar mueve la publicación a la cola «Por publicar» del espacio de trabajo, donde una persona descarga el contenido, lo publica de forma nativa y lo confirma, así la publicación se ve exactamente como si se hubiera hecho a mano, y una persona ve cada una antes de que exista públicamente. Un agente puede activar la publicación vía API oficial para una publicación concreta con deliveryMode: "direct_publish", y en TikTok eso significa el traspaso a la bandeja de entrada del creador, nunca una publicación pública sin supervisión. LinkedIn, Threads y Pinterest publican de forma programática en cuanto tu agente lo solicita explícitamente.
Limita el alcance de la clave
Elige solo los permisos que el agente necesita: products.read, media.write, posts.read, posts.write, posts.publish, job_runs.read, webhooks.manage. Un agente de investigación que solo lee el calendario recibe posts.read y nada más.
Dale una fecha de vencimiento
Las claves pueden crearse con vencimiento. Una clave vencida se comporta exactamente como una revocada, así que una clave que se filtre del entorno de un agente deja de funcionar por sí sola.
Rota y revoca
Rota una clave manteniendo el mismo id o revócala directamente desde Configuración → API. Cada clave muestra su última hora de uso y volumen de solicitudes, así que un agente que se queda en silencio, o que se descontrola, es visible.
Los límites de velocidad se aplican
60 solicitudes por minuto por endpoint y 240 por minuto por clave. Cada respuesta incluye X-RateLimit-Limit, -Remaining y -Reset; un 429 incluye Retry-After. Respétalo en lugar de insistir.
Markaestro nunca escribe por ti
No hay ningún paso de generación. El texto viene de tu agente, el contenido viene de tu biblioteca o de la canalización de tu agente. Markaestro son las manos, no la voz.
Las eliminaciones son del lado de Markaestro
Eliminar una publicación programada la cancela antes de que salga. Eliminar una publicación ya publicada solo hace que Markaestro deje de rastrearla, la publicación activa permanece hasta que alguien la elimine en la plataforma.
Gestión de fallos
Enséñale qué errores merece la pena reintentar
Cada respuesta de error es JSON con un código error estable y un requestId. Haz que tu agente cite el requestId cuando reporte un fallo, es lo que soporte necesita para rastrear la llamada.
| Estado | Código | Qué debería hacer el agente |
|---|---|---|
| 401 | UNAUTHENTICATED | La clave falta, fue revocada o venció. Detente y pide una nueva a una persona, reintentar no servirá de nada. |
| 403 | FORBIDDEN | La clave no tiene el permiso necesario para esta llamada. Reporta qué llamada falló; los permisos se cambian en Configuración → API. |
| 403 | API_KEY_NOT_BOUND_TO_PRODUCT | Una clave creada antes de la vinculación a marca. Pide una clave de reemplazo. |
| 400 | VALIDATION_* | El payload rompió una regla del canal (falta contenido, modo de entrega inválido, scheduled_at incorrecto). Corrige la solicitud; no reintentes sin cambios. |
| 400 | VALIDATION_IDEMPOTENCY_KEY_REUSED | Se envió la misma Idempotency-Key con un cuerpo diferente. Genera una nueva clave por cada solicitud distinta. |
| 400 | VALIDATION_POST_IS_PUBLISHING | Se intentó eliminar una publicación mientras una ejecución de publicación estaba en curso. Espera a que se resuelva y luego elimínala. |
| 409 | VALIDATION_POST_ALREADY_PUBLISHING | Ya hay una ejecución de publicación encolada para esta publicación. No la publiques de nuevo, consulta la ejecución existente. |
| 402 | SUBSCRIPTION_REQUIRED | No hay un plan activo asociado a este espacio de trabajo. Pide a un propietario que revise la facturación en Configuración. |
| 402 | QUOTA_EXCEEDED_MEDIA_UPLOADS | El espacio de trabajo alcanzó su cuota mensual de subidas. Deja de subir contenido y notifícalo, el contenido existente sigue publicándose. |
| 404 | NOT_FOUND | El id está fuera de la marca de esta clave. Se responde como 404 en lugar de 403 para que las claves no puedan sondear ids que no poseen. |
| 429 | RATE_LIMITED | Espera los segundos indicados en Retry-After y reintenta la misma solicitud con la misma Idempotency-Key. |
Usa tu propia pila tecnológica
Si puede hacer una solicitud HTTPS, puede publicar
No hay ninguna librería cliente de Markaestro que instalar ni ningún framework al que adaptarse. Token de portador, JSON de entrada, JSON de salida.
Claude y el Claude Agent SDK
Añade las definiciones de herramientas de arriba a tu lista de herramientas. Los esquemas JSON Schema ya están en el formato de uso de herramientas de Claude.
Llamadas a funciones de OpenAI
Los mismos esquemas se corresponden uno a uno con las definiciones de funciones, solo hay que renombrar input_schema a parameters.
Clientes MCP
Claude Code, Claude, Cursor, ChatGPT, Grok, Grok Bot, OpenClaw, Hermes: añade la URL del servidor alojado e inicia sesión en el navegador. Para clientes solo stdio, npx -y @markaestro/mcp ejecuta las mismas treinta y una herramientas en local.
n8n, Make, Zapier
Cada endpoint es una simple solicitud HTTP con un token de portador. Sin SDK, sin ceremonia de firmas, sin baile de OAuth para el agente.
LangChain y LlamaIndex
Herramientas REST estándar. La subida de contenido en dos pasos es el único flujo con varias llamadas, y son solo dos líneas.
Un cron job y curl
No todo agente necesita un framework. La guía rápida de arriba es una integración completa y funcional en cuatro comandos.