Keepp

Crea un sitio web para pequeñas empresas o una página de link-in-bio con tienda, reservas y chat en vivo.

Servidor MCP alojado

npx add-mcp 'https://api.keepp.link/mcp'

Se instala en Claude Code, Codex, Cursor y más

Documentación

Servidor MCP de Keepp y API de Agente

Keepp es un creador de sitios web y enlaces de bio para creadores y pequeños negocios, con tienda, reservas, formularios y chat en una sola página en keepp.link/tunombre. Construye y modifica esa página desde Claude, ChatGPT o cualquier aplicación MCP, o desde tu propio código con la API HTTP.

Conecta Keepp a Claude, ChatGPT o cualquier aplicación MCP

Keepp ejecuta un servidor MCP remoto. Añádelo a una aplicación que admita conectores MCP, inicia sesión con tu cuenta de Keepp y pide lo que quieras en el chat.

https://api.keepp.link/mcp

Está listado en el Registro MCP oficial como link.keepp/keepp, por lo que una aplicación que navegue por el registro lo encuentra por ese nombre.

Conexión

  1. En la configuración de conectores de tu aplicación, añade un conector personalizado con la URL anterior.
  2. Inicia sesión en Keepp en la ventana que se abre, con un código de correo electrónico o con Google. Si eres nuevo, tu cuenta se crea al iniciar sesión.
  3. Revisa lo que la aplicación pide hacer y aprueba.

Cosas que puedes pedir

  • "Hazme una página para mi estudio de cerámica"
  • "Añade mi curso en línea por 49 CAD y colócalo cerca de la parte superior"
  • "Cambia la foto de mi reserva de consulta por esta"
  • "Conecta Stripe para poder recibir pagos"
  • "Añade un chat que responda preguntas sobre mis clases"
  • "Haz la página más oscura y usa una fuente serif para los encabezados"

Bueno saber

  • Construir o cambiar tu página desde una aplicación requiere Pro. Si estás en Free, la aplicación puede darte un enlace para actualizar.
  • Keepp pide a la aplicación que consulte contigo antes de crear una página o cambiar un producto, precio o reserva. Tu identificador no se puede cambiar una vez creado.
  • Conectar Stripe, Google Calendar o Zoom abre su propia página de inicio de sesión. Esas contraseñas nunca pasan por el chat.
  • Las imágenes que pides se copian en Keepp, por lo que tu página nunca depende de otro sitio.
  • Para desconectar, elimina el conector en tu aplicación.

API HTTP

Para tu propio código. Disponible en Pro. Genera una clave desde tu panel de control en Agente de IA.

Qué gestiona esta API

Toda tu página: enlaces, tarjetas, perfil, redes sociales, encabezados, texto, formularios, mapas, videos de YouTube, menús, tickers, programación y el tema. Los productos y unidades reservables son de solo lectura. La API puede colocarlos en tu página y organizarlos, pero no puede crear uno ni cambiar un precio. Eso permanece en tu panel de control.

Autenticación

Envía tu clave como token de portador. URL base https://api.keepp.link.

Authorization: Bearer keepp_live_…

Endpoints

GET /api/v1/page

Lee toda tu página: versión, url, publishedAt, bloques, tema.

PUT /api/v1/page

Reemplaza toda tu página. Cualquier bloque que omitas se elimina.

GET /api/v1/catalog

Lista los productos y unidades reservables a los que tus bloques pueden hacer referencia.

GET /api/v1/capabilities

Cada tipo de bloque, sus campos y lo que cada uno necesita para publicarse, además de orientación para componer una página. Público: no se requiere clave.

PUT reemplaza: lee primero

PUT no es un parche. Siempre GET la página, modifica el array que recibiste y envía todo de vuelta. Si recibes 25 bloques y añades uno, envía 26. La respuesta devuelve blockCount antes y después para que puedas confirmar que nada se perdió.

Una página es una lista de bloques

Los bloques se sitúan en una cuadrícula de dos columnas. Un bloque full ocupa una fila; dos bloques half se emparejan lado a lado. El orden del array es el orden en la página.

PUT https://api.keepp.link/api/v1/page
{
  "version": 12,
  "theme": { "roundedness": "soft", "brandColor": "#C2185B" },
  "blocks": [
    { "id": "2f9c…", "type": "profile-circle", "size": "full",
      "name": "Studio Marlow", "about": "Hand-thrown ceramics." },
    { "id": "7a41…", "type": "header", "size": "full", "text": "Shop", "showInNav": true },
    { "type": "product", "size": "half", "productId": "8f2c…" },
    { "type": "card", "size": "half", "kind": "promo-code",
      "title": "20% off your first order", "code": "FIRST20" }
  ]
}

Envoltura de bloque

typeenumEl tipo de bloque: consulta la tabla siguiente.
idstring?UUID. Conserva los ids que recibiste; omítelo en un bloque nuevo y se genera uno. Los ids respaldan tus enlaces de compartir por bloque.
sizeenum?"full" o "half". La mayoría de los tipos solo permiten "full"; valores predeterminados por tipo.
alignenum?"left" | "center" | "right", en los tipos que lo admiten. Útil para un bloque half solitario.
styleobject?{ bg, text } anulaciones hexadecimales. Se descartan en tipos que no pueden renderizarlos.
shapeenum?"pill" | "card", en los tipos que lo admiten. A diferencia de style, una forma que un tipo no puede renderizar se rechaza, no se descarta, así que déjala fuera por completo en los demás.
scheduleobject?{ from, until, tz }: muestra el bloque solo dentro de una ventana. Se acepta en todos los tipos.

Programación

A cualquier bloque se le puede dar una ventana, y solo aparece dentro de ella:

"schedule": { "from": "2026-08-01T09:00", "until": "2026-08-14T23:59", "tz": "Asia/Kolkata" }
tzstring*Una zona IANA: "Europe/London", no "GMT+1".
fromstring?Hora local de pared YYYY-MM-DDTHH:mm: sin segundos, sin desplazamiento, sin Z.
untilstring?Mismo formato, y debe ser posterior a from.

Al menos uno de from / until es obligatorio. Las horas son deliberadamente locales en lugar de UTC, por lo que las 9 a. m. del viernes siguen siendo las 9 a. m. a través de un cambio de horario de verano. La ventana se evalúa en el servidor cuando se lee la página, por lo que un bloque que no ha comenzado no está en el HTML en absoluto, por lo que no se puede encontrar en view-source. Los bloques programados aún cuentan para el límite de 100 bloques.

Tipos de bloque

linkhalf, fullshape pill|card (predeterminado pill): title*, url*, imageUrl* (solo card), icon / iconUrl (solo pill)
cardhalf, fullshape card|pill (predeterminado card): kind*, title* (opcional solo para showcase), mediaUrls, description, additionalInfo, ctaLabel, aspect wide|square|tall, icon: más un campo por tipo (abajo)
headerfulltext*, showInNav: establece showInNav para crear pestañas de navegación. variant: "plain" | "eyebrow" | "divider"
subheaderfulltext*, variant: "plain" | "eyebrow" | "divider"
textfulltext*
profile-circlefullname, about, imageUrl
profile-squarefullname, about, imageUrl
social-iconsfullicons*: [{ id, platform, url }]
profile-ctafulllabel*, url: singleton
navfullSin campos: singleton. Las pestañas provienen de los encabezados con showInNav.
spacerfullSin campos.
formfullshape pill|card (predeterminado pill): preset* ("lead" | "feedback" | "form"), title*, fields*, description (se muestra en la tarjeta), triggerLabel, submitLabel, successMessage, verification
bookinghalf, fullshape card|pill (predeterminado card): bookingUnitId*, aspect wide|square|tall. Todos los demás campos de visualización se completan desde el servidor
producthalf, fullshape card|pill (predeterminado card): productId*, aspect wide|square|tall. Todos los demás campos de visualización se completan desde el servidor
maphalf, fullshape solo card: embedSrc*, title, address, hours, placeUrl
youtubehalf, fullshape solo card: videoId*, title, description
tickerfulltext* (máx. 300), direction rtl|ltr, speed slow|normal|fast, pauseOnHover
menuhalf, fullshape pill|card (predeterminado pill): title*, subtitle, imageUrl, triggerLabel, items[]
chatfulltitle*, greeting, icon message-circle|mail|headphones|sparkles|heart|users: singleton, Influencer. Un botón de chat redondo en la página; quién responde se establece en la configuración de Chat

Un elemento menu es { name, description, price, tags[] }. Mantén las descripciones en 50 palabras, hasta 100 elementos y no más de 10 etiquetas distintas por menú.

* obligatorio. profile-cta y nav son singletons, uno de cada uno por página.

Campos de formulario

Un form toma un array fields de { id, label, type, required }, donde id es un UUID que generas. Los envíos llegan a tu panel de control.

typeenum*short_text, long_text, email, phone, single_select, multi_select, product_interest, social_handles, rating
optionsarray?Obligatorio para los tipos de selección.
isIdentifierboolExactamente un campo debe establecer esto, y solo un campo de email o phone puede hacerlo. Así se atribuye un envío a una persona.
verificationobject?En el bloque: { email: true } hace que el remitente confirme su dirección antes de que el envío cuente.

Enviar ningún identificador, o dos, rechaza todo el PUT. Es la razón más común por la que un bloque form construido a mano falla.

Tipos de tarjeta

showcase—Muestra algo. Es el único tipo donde title no es obligatorio. Abre el diálogo de detalle al tocar; ctaUrl opcional añade un botón de CTA en la cara de la tarjeta.
for-saleprice*Precio en texto libre: "₹2,400", "Desde $40". Abre el diálogo de detalle al tocar.
affiliate-linkctaUrl*El destino de afiliado, usado para el botón de CTA de la tarjeta. Abre el diálogo de detalle al tocar.
promo-codecode*El chip del código lo copia directamente al tocarlo; tocar el resto de la tarjeta abre el diálogo de detalle, donde el código también está disponible.

Usa un card para algo vendido en otro lugar. Para algo comprado en tu página a través de Stripe, usa un bloque product.

Productos y reservas

Llama a GET /api/v1/catalog y envía solo la referencia: { "type": "product", "productId": "…" }. El servidor completa título, precio, imágenes y capacidad de compra desde el registro, por lo que cualquier valor que envíes para esos campos se sobrescribe. Esto es deliberado: una clave nunca puede publicar un precio que el vendedor no estableció.

Imágenes

Coloca una URL de imagen pública https en mediaUrls, imageUrl o iconUrl y se obtiene y almacena por ti. Las rutas que ya comienzan con /uploads/ ya son tuyas, así que envíalas de vuelta sin cambios.

Tema

roundednessenum?"flat" | "soft" | "round".
brandColorstring?Hex de 3 o 6 dígitos.
textColorstring?Hex de 3 o 6 dígitos.
fontPairingenum?"editorial" | "bold" | "classic" | "modern" | "soft" | "handwritten" | "minimal": establece el par de fuentes de visualización/cuerpo de la página.
backgroundobject?{ type: "color" | "gradient" | "image" } con color, o from/to/angle, o imageUrl + veil/position opcional.
background.veilenum?"none" | "light" | "strong": oscurece un fondo de imagen para que el texto siga siendo legible.
background.positionenum?"left top" … "right bottom": las nueve posiciones de palabras clave CSS.

Las claves de tema no reconocidas y los valores no válidos se descartan silenciosamente, no se rechazan, por lo que un error tipográfico en fontPairing deja tus fuentes sin cambios y sin error. Vuelve a leer la página si necesitas confirmar que un cambio de tema se aplicó.

Límites

  • Hasta 100 bloques por página.
  • Imágenes de hasta 10 MB cada una (JPEG/PNG/WebP/GIF), desde una URL pública directa https.
  • 60 solicitudes por minuto por clave.
  • Las escrituras se publican en tu página en vivo inmediatamente. No hay estado de borrador.
  • Una página completa es aproximadamente 6k tokens. Si estás generando una con un LLM, aumenta su límite de salida, porque un cuerpo truncado falla como JSON malformado.

Errores

  • 401 NO_API_TOKEN / INVALID_API_TOKEN: clave faltante o revocada.
  • 403 PLAN_REQUIRED: el negocio de la clave no está en Pro.
  • 400 INVALID_INPUT: un bloque está malformado, o la página rompió una regla.
  • 422 INVALID_IMAGE: una URL de imagen no se pudo obtener, era del tipo/tamaño incorrecto, redirigió o resolvió a una dirección no pública.
  • 404 NOT_FOUND: un productId o bookingUnitId no es tuyo.
  • 409 VERSION_CONFLICT: enviaste un version y la página se movió. Vuelve a leer y reaplica.
  • 429 RATE_LIMITED: más de 60 solicitudes en un minuto.

Los errores causados por un bloque incluyen blockIndex, su posición en el array que enviaste. Una escritura rechazada no cambia nada, por lo que tu página está exactamente como estaba.

¿Usas un LLM? Entrégale la habilidad de Keepp o el índice llms.txt. Ambos le enseñan cómo estructurar una buena página, no solo llamar a la API.

{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://keepp.link/#org","name":"Keepp","url":"https://keepp.link/","logo":"https://keepp.link/keepp-logo.png","sameAs":["https://instagram.com/keepp.link","https://x.com/keepplink","https://www.youtube.com/channel/UC3UfdnHcW3cBzvq5nUlil9w","https://www.linkedin.com/company/keepp-link"]},{"@type":"SoftwareApplication","@id":"https://keepp.link/#app","name":"Keepp","url":"https://keepp.link/","applicationCategory":"BusinessApplication","operatingSystem":"Web","description":"Keepp is a website and link-in-bio builder for creators and small businesses. One page at keepp.link/yourname holds your links, socials and gallery, an online store with Stripe checkout for products and digital downloads, affiliate cards and promo codes, a booking calendar for appointments or nightly stays, lead capture and feedback forms, a live chat that an AI or the owner answers, a map with opening hours, and your own analytics.","publisher":{"@id":"https://keepp.link/#org"},"offers":[{"@type":"Offer","name":"Free","price":"0","priceCurrency":"USD","description":"Your keepp.link page, unlimited links, a fully customizable page, basic analytics, and Stripe checkout at 5% commission."},{"@type":"Offer","name":"Pro","price":"9.99","priceCurrency":"USD","description":"Everything in Free, plus 3% commission, customizable forms, 2,000 actions a month, scheduled blocks, custom fonts, a custom domain, and full analytics."},{"@type":"Offer","name":"Influencer","price":"24.99","priceCurrency":"USD","description":"Everything in Pro, plus live chat on your page, answered by AI or by you from Telegram, 0% commission on Stripe sales and 10,000 actions a month."}]},{"@type":"WebPage","@id":"https://keepp.link/developers#webpage","url":"https://keepp.link/developers","name":"Keepp MCP Server and Agent API | Developer Docs","description":"Keepp's MCP server lets Claude, ChatGPT or any MCP app build your website or link-in-bio page, with a store, bookings, forms and chat. Listed as link.keepp/keepp.","publisher":{"@id":"https://keepp.link/#org"},"about":{"@id":"https://keepp.link/#app"},"breadcrumb":{"@id":"https://keepp.link/developers#breadcrumb"}},{"@type":"BreadcrumbList","@id":"https://keepp.link/developers#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Keepp","item":"https://keepp.link/"},{"@type":"ListItem","position":2,"name":"Keepp MCP server and Agent API","item":"https://keepp.link/developers"}]}]}