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
- Nas configurações de conectores do seu aplicativo, adicione um conector personalizado com o URL acima.
- 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.
- 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
| tipo | enum | O tipo do bloco: veja a tabela abaixo. |
|---|---|---|
| id | string? | 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. |
| size | enum? | "full" ou "half". A maioria dos tipos só permite "full"; padrão por tipo. |
| align | enum? | "left" | "center" | "right", nos tipos que suportam. Útil para um bloco half isolado. |
| style | object? | { bg, text } substituições hex. Descartado em tipos que não podem renderizá-los. |
| shape | enum? | "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. |
| schedule | object? | { 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" }
| tz | string* | Um fuso IANA: "Europe/London", não "GMT+1". |
|---|---|---|
| from | string? | Horário local YYYY-MM-DDTHH:mm: sem segundos, sem offset, sem Z. |
| until | string? | 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
| link | half, full | shape pill|card (padrão pill): title*, url*, imageUrl* (somente card), icon / iconUrl (somente pill) |
|---|---|---|
| card | half, full | shape 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) |
| header | full | text*, showInNav: defina showInNav para criar abas de navegação. variant: "plain" | "eyebrow" | "divider" |
| subheader | full | text*, variant: "plain" | "eyebrow" | "divider" |
| text | full | text* |
| profile-circle | full | name, about, imageUrl |
| profile-square | full | name, about, imageUrl |
| social-icons | full | icons*: [{ id, platform, url }] |
| profile-cta | full | label*, url: singleton |
| nav | full | Sem campos: singleton. As abas vêm dos cabeçalhos com showInNav. |
| spacer | full | Sem campos. |
| form | full | shape pill|card (padrão pill): preset* ("lead" | "feedback" | "form"), title*, fields*, description (mostrado no card), triggerLabel, submitLabel, successMessage, verification |
| booking | half, full | shape card|pill (padrão card): bookingUnitId*, aspect wide|square|tall. Todos os outros campos de exibição são preenchidos pelo servidor |
| product | half, full | shape card|pill (padrão card): productId*, aspect wide|square|tall. Todos os outros campos de exibição são preenchidos pelo servidor |
| map | half, full | shape somente card: embedSrc*, title, address, hours, placeUrl |
| youtube | half, full | shape somente card: videoId*, title, description |
| ticker | full | text* (máx. 300), direction rtl|ltr, speed slow|normal|fast, pauseOnHover |
| menu | half, full | shape pill|card (padrão pill): title*, subtitle, imageUrl, triggerLabel, items[] |
| chat | full | title*, 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.
| type | enum* | short_text, long_text, email, phone, single_select, multi_select, product_interest, social_handles, rating |
|---|---|---|
| options | array? | Obrigatório pelos tipos de select. |
| isIdentifier | bool | Exatamente um campo deve definir isso, e apenas um campo de email ou phone pode. É assim que um envio é atribuído a uma pessoa. |
| verification | object? | 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-sale | price* | Preço em texto livre: "₹2.400", "A partir de $40". Abre o diálogo de detalhes ao tocar. |
| affiliate-link | ctaUrl* | O destino de afiliado, usado para o botão de CTA do card. Abre o diálogo de detalhes ao tocar. |
| promo-code | code* | 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
| roundedness | enum? | "flat" | "soft" | "round". |
|---|---|---|
| brandColor | string? | Hex de 3 ou 6 dígitos. |
| textColor | string? | Hex de 3 ou 6 dígitos. |
| fontPairing | enum? | "editorial" | "bold" | "classic" | "modern" | "soft" | "handwritten" | "minimal": define o par de fontes de exibição/corpo da página. |
| background | object? | { type: "color" | "gradient" | "image" } com color, ou from/to/angle, ou imageUrl + veil/position opcionais. |
| background.veil | enum? | "none" | "light" | "strong": escurece um fundo de imagem para o texto permanecer legível. |
| background.position | enum? | "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: umproductIdoubookingUnitIdnão é seu.409 VERSION_CONFLICT: você enviou umversione 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"}]}]}