Keepp

Crie um site para pequenas empresas ou uma página de link-in-bio com loja, reservas e chat ao vivo.

Servidor MCP hospedado

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

Instala no Claude Code, Codex, Cursor e outros

Documentação

Servidor MCP Keepp e API de Agente

Keepp é um criador de sites e link-in-bio para criadores e pequenas empresas, com loja, agendamentos, formulários e chat em uma única página em keepp.link/seudnome. Crie e altere essa página pelo Claude, ChatGPT ou qualquer aplicativo MCP, ou pelo seu próprio código com a API HTTP.

Conecte o Keepp ao Claude, ChatGPT ou qualquer aplicativo MCP

O Keepp executa um servidor MCP remoto. Adicione-o a um aplicativo que suporte conectores MCP, faça login com sua conta Keepp e peça o que quiser no chat.

https://api.keepp.link/mcp

Ele está listado no Registro MCP oficial como link.keepp/keepp, então um aplicativo que navegue pelo registro o encontra por esse nome.

Como conectar

  1. Nas configurações de conectores do seu aplicativo, adicione um conector personalizado com o URL acima.
  2. Faça login no Keepp na janela que abrir, com um código de e-mail ou Google. Se você for novo, sua conta é criada ao fazer login.
  3. Revise o que o aplicativo está pedindo para fazer e aprove.

Coisas que você pode pedir

  • "Crie uma página para meu estúdio de cerâmica"
  • "Adicione meu curso online por 49 CAD e coloque-o perto do topo"
  • "Troque a foto do meu agendamento de consultoria por esta"
  • "Conecte o Stripe para eu receber pagamentos"
  • "Adicione um chat que responda perguntas sobre minhas aulas"
  • "Deixe a página mais escura e use uma fonte serifada nos títulos"

Bom saber

  • Criar ou alterar sua página por um aplicativo exige o Pro. Se você estiver no Free, o aplicativo pode fornecer um link para fazer upgrade.
  • O Keepp pede que o aplicativo verifique com você antes de criar uma página ou alterar um produto, preço ou agendamento. Seu identificador não pode ser alterado depois de criado.
  • Conectar Stripe, Google Agenda ou Zoom abre a própria página de login deles. Essas senhas nunca passam pelo chat.
  • As imagens que você pedir são copiadas para o Keepp, então sua página nunca depende de outro site.
  • Para desconectar, remova o conector no seu aplicativo.

API HTTP

Para seu próprio código. Disponível no Pro. Gere uma chave no seu painel em Agente de IA.

O que esta API gerencia

Sua página inteira: links, cartões, perfil, redes sociais, cabeçalhos, textos, formulários, mapas, vídeos do YouTube, menus, tickers, agendamento e o tema. Produtos e unidades reserváveis são somente leitura. A API pode posicioná-los na sua página e organizá-los, mas não pode criar um nem alterar um preço. Isso permanece no seu painel.

Autenticação

Envie sua chave como um token bearer. URL base https://api.keepp.link.

Authorization: Bearer keepp_live_…

Endpoints

GET /api/v1/page

Leia sua página inteira: versão, url, publishedAt, blocos, tema.

PUT /api/v1/page

Substitua sua página inteira. Qualquer bloco que você omitir é removido.

GET /api/v1/catalog

Liste os produtos e unidades reserváveis que seus blocos podem referenciar.

GET /api/v1/capabilities

Cada tipo de bloco, seus campos e o que cada um precisa para publicar — além de orientações para compor uma página. Público: nenhuma chave necessária.

PUT substitui: leia primeiro

PUT não é um patch. Sempre GET a página, modifique o array que você recebeu e envie tudo de volta. Se você receber 25 blocos e adicionar um, envie 26. A resposta retorna blockCount antes e depois para você confirmar que nada foi descartado.

Uma página é uma lista de blocos

Os blocos ficam em uma grade de duas colunas. Um bloco full ocupa uma linha; dois blocos half ficam lado a lado. A ordem do array é a ordem na 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" }
  ]
}

Envelope do bloco

tipoenumO tipo do bloco: veja a tabela abaixo.
idstring?UUID. Mantenha os ids que você recebeu; omita em um bloco novo e um será gerado. Os ids sustentam seus links de compartilhamento por bloco.
sizeenum?"full" ou "half". A maioria dos tipos só permite "full"; padrão por tipo.
alignenum?"left" | "center" | "right", nos tipos que suportam. Útil para um bloco half isolado.
styleobject?{ bg, text } substituições hex. Descartado em tipos que não podem renderizá-los.
shapeenum?"pill" | "card", nos tipos que suportam. Diferente de style, uma shape que um tipo não pode renderizar é rejeitada, não descartada, então deixe-a totalmente de fora nos demais.
scheduleobject?{ from, until, tz }: mostre o bloco apenas dentro de uma janela. Aceito em todos os tipos.

Agendamento

Qualquer bloco pode receber uma janela, e ele só aparece dentro dela:

"schedule": { "from": "2026-08-01T09:00", "until": "2026-08-14T23:59", "tz": "Asia/Kolkata" }
tzstring*Um fuso IANA: "Europe/London", não "GMT+1".
fromstring?Horário local YYYY-MM-DDTHH:mm: sem segundos, sem offset, sem Z.
untilstring?Mesmo formato, e deve ser depois de from.

Pelo menos um de from / until é obrigatório. Os horários são deliberadamente locais em vez de UTC, então 9h de sexta continua 9h em uma mudança de horário de verão. A janela é avaliada no servidor quando a página é lida, então um bloco que ainda não começou não está no HTML de forma alguma, portanto não pode ser encontrado no view-source. Blocos agendados ainda contam para o limite de 100 blocos.

Tipos de bloco

linkhalf, fullshape pill|card (padrão pill): title*, url*, imageUrl* (somente card), icon / iconUrl (somente pill)
cardhalf, fullshape card|pill (padrão card): kind*, title* (opcional apenas para showcase), mediaUrls, description, additionalInfo, ctaLabel, aspect wide|square|tall, icon: mais um campo por kind (abaixo)
headerfulltext*, showInNav: defina showInNav para criar abas de navegação. 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
navfullSem campos: singleton. As abas vêm dos cabeçalhos com showInNav.
spacerfullSem campos.
formfullshape pill|card (padrão pill): preset* ("lead" | "feedback" | "form"), title*, fields*, description (mostrado no card), triggerLabel, submitLabel, successMessage, verification
bookinghalf, fullshape card|pill (padrão card): bookingUnitId*, aspect wide|square|tall. Todos os outros campos de exibição são preenchidos pelo servidor
producthalf, fullshape card|pill (padrão card): productId*, aspect wide|square|tall. Todos os outros campos de exibição são preenchidos pelo servidor
maphalf, fullshape somente card: embedSrc*, title, address, hours, placeUrl
youtubehalf, fullshape somente card: videoId*, title, description
tickerfulltext* (máx. 300), direction rtl|ltr, speed slow|normal|fast, pauseOnHover
menuhalf, fullshape pill|card (padrão pill): title*, subtitle, imageUrl, triggerLabel, items[]
chatfulltitle*, greeting, icon message-circle|mail|headphones|sparkles|heart|users: singleton, Influencer. Um botão de chat redondo na página; quem responde é definido nas configurações de Chat

Um item de menu é { name, description, price, tags[] }. Mantenha as descrições em até 50 palavras, até 100 itens, e no máximo 10 tags distintas por menu.

* obrigatório. profile-cta e nav são singletons, um de cada por página.

Campos de formulário

Um form recebe um array fields de { id, label, type, required }, onde id é um UUID que você gera. Os envios chegam no seu painel.

typeenum*short_text, long_text, email, phone, single_select, multi_select, product_interest, social_handles, rating
optionsarray?Obrigatório pelos tipos de select.
isIdentifierboolExatamente um campo deve definir isso, e apenas um campo de email ou phone pode. É assim que um envio é atribuído a uma pessoa.
verificationobject?No bloco: { email: true } faz o remetente confirmar o endereço antes de o envio contar.

Enviar nenhum identificador, ou dois, rejeita o PUT inteiro. É o motivo mais comum de um bloco form construído manualmente falhar.

Kinds de card

showcase—Mostra algo. É o único kind em que title não é obrigatório. Abre o diálogo de detalhes ao tocar; ctaUrl opcional adiciona um botão de CTA na face do card.
for-saleprice*Preço em texto livre: "₹2.400", "A partir de $40". Abre o diálogo de detalhes ao tocar.
affiliate-linkctaUrl*O destino de afiliado, usado para o botão de CTA do card. Abre o diálogo de detalhes ao tocar.
promo-codecode*O chip do código o copia diretamente ao tocar; tocar no resto do card abre o diálogo de detalhes, onde o código também está disponível.

Use um card para algo vendido em outro lugar. Para algo comprado na sua página pelo Stripe, use um bloco product.

Produtos e agendamentos

Chame GET /api/v1/catalog e envie apenas a referência: { "type": "product", "productId": "…" }. O servidor preenche title, price, imagens e comprabilidade a partir do registro, então qualquer valor que você enviar para esses campos é sobrescrito. Isso é deliberado: uma chave nunca pode publicar um preço que o vendedor não definiu.

Imagens

Coloque um URL público de imagem https em mediaUrls, imageUrl ou iconUrl e ela será buscada e armazenada para você. Caminhos que já começam com /uploads/ já são seus, então envie-os de volta sem alteração.

Tema

roundednessenum?"flat" | "soft" | "round".
brandColorstring?Hex de 3 ou 6 dígitos.
textColorstring?Hex de 3 ou 6 dígitos.
fontPairingenum?"editorial" | "bold" | "classic" | "modern" | "soft" | "handwritten" | "minimal": define o par de fontes de exibição/corpo da página.
backgroundobject?{ type: "color" | "gradient" | "image" } com color, ou from/to/angle, ou imageUrl + veil/position opcionais.
background.veilenum?"none" | "light" | "strong": escurece um fundo de imagem para o texto permanecer legível.
background.positionenum?"left top" … "right bottom": as nove posições de palavras-chave CSS.

Chaves de tema não reconhecidas e valores inválidos são silenciosamente descartados, não rejeitados, então um erro de digitação em fontPairing deixa suas fontes inalteradas sem erro. Releia a página se precisar confirmar que uma alteração de tema foi aplicada.

Limites

  • Até 100 blocos por página.
  • Imagens de até 10 MB cada (JPEG/PNG/WebP/GIF), de um URL público direto https.
  • 60 solicitações por minuto por chave.
  • Gravações publicam na sua página ao vivo imediatamente. Não há estado de rascunho.
  • Uma página completa tem cerca de 6 mil tokens. Se você estiver gerando uma com um LLM, aumente o limite de saída, porque um corpo truncado falha como JSON malformado.

Erros

  • 401 NO_API_TOKEN / INVALID_API_TOKEN: chave ausente ou revogada.
  • 403 PLAN_REQUIRED: o negócio da chave não está no Pro.
  • 400 INVALID_INPUT: um bloco está malformado, ou a página quebrou uma regra.
  • 422 INVALID_IMAGE: um URL de imagem não pôde ser buscado, era do tipo/tamanho errado, redirecionou ou resolveu para um endereço não público.
  • 404 NOT_FOUND: um productId ou bookingUnitId não é seu.
  • 409 VERSION_CONFLICT: você enviou um version e a página mudou. Releia e reaplique.
  • 429 RATE_LIMITED: mais de 60 solicitações em um minuto.

Erros causados por um bloco incluem blockIndex, sua posição no array que você enviou. Uma gravação rejeitada não altera nada, então sua página fica exatamente como estava.

Usando um LLM? Entregue a ele a habilidade Keepp ou o índice llms.txt. Ambos ensinam como estruturar uma boa página, não apenas chamar a 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"}]}]}