Documentação · Servidor MCP
MCP do cliente VIU
Como conectar o Claude ao catálogo VIU e usar as 12 ferramentas e os 3 roteiros de trabalho: componentes de UI, estilos web, ícones e fontes.
Visão geral
O MCP do cliente VIU (servidor viu-catalogo, versão 1.0.0) dá ao Claude acesso ao catálogo VIU em quatro acervos: componentes de UI, estilos web, ícones e fontes. Ele oferece 12 ferramentas e 3 roteiros de trabalho (prompts), e está disponível para contas do plano Pro.
| Acervo | O que o Claude recebe | Ferramentas |
|---|---|---|
| Componentes de UI | Nome, descrição, tags, prévia, dependências e o prompt completo com código e exemplos de uso; versão Kotlin / Compose Multiplatform quando existe | catalog_status, search_components, get_component, list_tags |
| Estilos web | Design systems de sites reais: paleta, tipografia, espaçamento e componentes, em DESIGN.md, Tailwind v4, variáveis CSS ou tokens DTCG | search_styles, get_style, list_style_filters |
| Ícones | SVG pronto (currentColor, 1em), licença, autor e componente React | search_icons, get_icon, list_icon_collections |
| Fontes | Pesos, eixos, licença, import CSS, download, pares usados em sites reais | search_fonts, get_font |
O catálogo é atualizado continuamente. Por isso o Claude deve sempre buscar de novo em cada conversa, em vez de reaproveitar ids ou código que lembra.
Conexão e autenticação
O endereço do servidor é https://api.virtues.now/vui/mcp, com transporte Streamable HTTP e respostas JSON. O servidor só aceita POST e não abre stream SSE nem guarda sessão.
| Forma de entrar | Como funciona | Quando usar |
|---|---|---|
| OAuth (login do VIU) | O cliente recebe 401 com resource_metadata, abre o login do VIU e obtém um token de acesso (viuo_…, vale 1 hora) e um de renovação (viur_…, vale 30 dias). Escopo: mcp | Conectores do claude.ai e outros clientes com OAuth |
| Chave no cabeçalho | Authorization: Bearer viu_… ou X-API-Key: viu_…. A chave é gerada no perfil do site | Claude Code, Claude Desktop e clientes que mandam cabeçalho |
| Chave na URL | https://api.virtues.now/vui/k/<chave>/mcp | Clientes que não conseguem mandar cabeçalho |
Exemplo no Claude Code:
claude mcp add --transport http viu https://api.virtues.now/vui/mcp \
--header "Authorization: Bearer viu_SUA_CHAVE"
Regras do protocolo:
- Uma mensagem JSON-RPC por requisição. Lotes (arrays) são recusados com erro
-32600. - Corpo de no máximo 1 MB.
- Métodos suportados:
initialize,ping,tools/list,tools/call,prompts/list,prompts/gete notificações. - A resposta de
initializetraz as instruções de uso do servidor, que o Claude recebe automaticamente. - A conta precisa estar no plano Pro. Outras contas recebem 403.
Regras de uso para o Claude
A regra central: buscar é grátis e abrir um componente gasta cota. O Claude escolhe pela busca e abre só o que vai usar.
- Comece com
catalog_statuspara ver o tamanho do catálogo e a cota restante. - Busque sempre nesta conversa. Não reaproveite ids, nomes ou código de conversas anteriores ou da memória: o catálogo muda o tempo todo.
- Busque em inglês, pelo papel da peça (hero, navbar, pricing, testimonial, footer, cta, feature, form) e pelo estilo (glass, dark, gradient, 3d, minimal). Termos comuns em português são traduzidos automaticamente (rodapé → footer, preços → pricing, depoimentos → testimonial).
- Prefira resultados com
code: true. Usehas_code: truena busca para filtrar. - Compare candidatos pela descrição, pelas tags e pela prévia (
preview). Só então chameget_component. - Use o código de
get_componentcomo base e adapte ao projeto. Não reescreva de memória nem troque a peça por uma "parecida" inventada. - Instale as dependências listadas (npm e shadcn/ui) antes de usar o componente.
- Para "no estilo de X":
search_styles, depoisget_style, e siga o DESIGN.md em tudo (cores, tipografia, espaçamento, componentes). - Para tela de app Android ou iOS:
search_componentscommobile: trueeget_componentcomplatform: "kotlin". - Ícones: uma coleção só por página. Por padrão a busca exclui licenças não comerciais.
- Fontes: todas as retornadas por padrão têm os acentos do português.
Roteiros de trabalho
Para montar uma página ou seção inteira, o Claude pode seguir os roteiros do servidor (prompts MCP).
| Roteiro | Argumentos | O que faz |
|---|---|---|
montar_pagina | pedido (obrigatório), estilo (opcional, ex.: Linear, Stripe) | Briefing → escolha das peças → montagem com o tema do projeto → revisão com nota em 1440, 768 e 390 px, até 3 rodadas |
montar_secao | secao (obrigatório), contexto (opcional) | Uma seção (hero, planos, depoimentos…) num projeto existente, no tema dele |
revisar_pagina | onde (opcional) | Revisão exigente com nota de 0 a 10 por critério e troca de peças pelo catálogo |
No Claude Code os roteiros viram comandos, por exemplo /mcp__viu__montar_pagina. No claude.ai aparecem como prompts do conector.
Referência das ferramentas
Todas as ferramentas devolvem JSON como texto. Listas paginadas trazem total_matches, offset e next_offset (null na última página).
Componentes de UI
catalog_status
Tamanho do catálogo e cota do plano. Sem parâmetros. Não gasta cota de componentes.
Retorno: plan, components (total, with_code, with_mobile_version), styles, icons, fonts e quota (components com limiteDia, limiteMes, usadosDia, usadosMes, restamDia, restamMes; calls, window_seconds, calls_in_window).
search_components
Busca componentes por palavras-chave e filtros. Não gasta cota.
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
query | texto | — | Palavras-chave em inglês, ex.: pricing table dark |
tags | lista de textos | — | Tags obrigatórias (todas precisam bater). Veja list_tags |
has_code | booleano | false | Só componentes com código |
mobile | booleano | false | Só componentes com versão Kotlin / Compose Multiplatform |
exclude_ids | lista de textos | — | Ids para deixar de fora |
limit | inteiro | 10 (máx. 50) | Resultados por página |
offset | inteiro | 0 | Início da página |
Cada resultado: id (código público de 8 caracteres), name, description (até 160 caracteres), tags (até 8), code, mobile e preview (URL da prévia). O retorno também traz query_terms, os termos usados depois da tradução.
Ordenação: nome exato pesa mais, depois nome que começa com o termo, tag e descrição. Componentes com código e com prévia sobem.
{"query": "pricing dark", "has_code": true, "limit": 5}
get_component
O componente pronto para usar. Cada componente diferente aberto no dia conta uma vez na cota; abrir o mesmo de novo no mesmo dia não conta. Componente sem código não gasta cota.
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
id | texto (obrigatório) | — | Id vindo de search_components |
platform | web ou kotlin | web | kotlin inclui a versão Kotlin / Compose Multiplatform, quando existe |
Retorno: os campos da busca com a descrição completa, mais dependencies (npm e shadcn/ui), prompt (código e exemplos de uso, até 100.000 caracteres), quota atualizada e, quando houver, video e mobile_hint. Se o id não existir, volta error com até 5 componentes parecidos em similar.
{"id": "c1a1c9d4", "platform": "web"}
list_tags
Todas as tags com a contagem de componentes (components) e de componentes com código (with_code). Sem parâmetros.
Estilos web
search_styles
Busca design systems de sites reais. Sem query, lista todos, paginado.
| Parâmetro | Tipo | Descrição |
|---|---|---|
query | texto | Palavras-chave em inglês, ex.: dark minimal fintech |
industry | texto | ex.: saas, agency, ecommerce, ai, design |
theme | texto | claro, escuro ou misto (aceita light, dark, mixed) |
family | texto | Família de cor, ex.: neutro, azul |
collection | texto | ex.: monocromatico, gradiente |
density | texto | ex.: compact, comfortable |
font | texto | Parte do nome da fonte, ex.: inter, serif |
limit / offset | inteiro | 10 (máx. 50) / 0 |
Cada resultado: slug, name, site, theme, industry, north_star, fonts, colors (até 6 hex), accent, family, collections, density.
get_style
Um estilo completo.
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
slug | texto (obrigatório) | — | Slug de search_styles ou o nome do estilo |
format | design_md, tailwind, css, tokens, all, meta | design_md | Arquivo devolvido. meta não traz arquivo |
Retorno: o resumo do estilo, description, palette (hex, nome, papel e grupo de cada cor), o arquivo pedido, formats_available e media (URLs de miniatura, tela, capa, vídeo e ícone). Se o slug não existir, volta did_you_mean.
list_style_filters
Valores válidos para os filtros de search_styles, com contagem: industries, themes, families, densities, collections e fonts_top (as 40 fontes mais usadas). Sem parâmetros.
Ícones
search_icons
Busca ícones em coleções open source (Lucide, Tabler, Phosphor, Material, Heroicons, marcas). Aceita português ou inglês.
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
query | texto | — | ex.: shopping cart, seta esquerda, github |
collection | texto | — | Prefixo da coleção, ex.: lucide, tabler, ph, mdi, simple-icons |
include_noncommercial | booleano | false | Inclui licenças não comerciais |
with_svg | booleano | true | Traz o SVG em cada resultado |
limit / offset | inteiro | 20 (máx. 100) / 0 | Paginação |
Cada resultado: id (prefixo:nome), name, collection, license e svg. O SVG usa currentColor e 1em, então herda a cor e o tamanho do texto.
get_icon
Um ícone pelo id.
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
id | texto (obrigatório) | — | prefixo:nome, ex.: lucide:camera |
format | svg, jsx, all | svg | jsx ou all incluem um componente React pronto |
Retorno: svg, license, license_title, license_url, author, author_url e, quando a licença pede cuidado, warning: não comercial, GPL ou atribuição obrigatória (CC-BY).
list_icon_collections
As coleções com prefix, name, icons (quantidade), license e category. Parâmetros: query (filtra por prefixo, nome ou categoria) e limit (padrão 60, máx. 300).
Fontes
search_fonts
Busca fontes do Google Fonts, Fontsource e Fontshare.
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
query | texto | — | Nome ou descrição, ex.: serifada elegante, mono, inter |
category | sans-serif, serif, display, handwriting, monospace | — | Categoria |
source | google, fontsource, fontshare | — | Origem da fonte |
variable_only | booleano | false | Só fontes variáveis |
order | texto | popular | popular, nome ou recente |
include_without_pt_accents | booleano | false | Inclui fontes sem os acentos do português |
limit / offset | inteiro | 12 (máx. 60) / 0 | Paginação |
Cada resultado: id, family, source, category, weights, italic, variable, license, can_host_files, css_import e sample (imagem de amostra). Se nada bater, volta as mais populares da categoria com uma note.
get_font
Uma fonte completa. Parâmetros: id (de search_fonts) ou family (o nome).
Retorno: o resumo da busca, mais designers, axes, description, tags, license_url, page, pt_accents, css (import e font-family prontos), download (zip quando a licença permite hospedar), pairs_in_real_sites (fontes que aparecem junto em sites reais) e seen_on_styles (estilos web do catálogo que a usam).
Fluxos de exemplo
Landing page "no estilo de" um site
Pedido: "Monte a landing de uma fintech no estilo do Stripe."
catalog_status— confere a cota.search_stylescom{"query": "stripe"}eget_styleno melhor resultado. O DESIGN.md define paleta, tipografia e espaçamento.search_fonts/get_fontpara o par de fontes indicado no DESIGN.md.- Para cada seção, duas buscas:
search_componentscom{"query": "hero", "has_code": true}e outra com as palavras do briefing ("fintech gradient hero"). - Monta uma tabela: seção, id, nome, motivo. Só então chama
get_componentem cada id escolhido. search_iconscom{"collection": "lucide"}para manter uma coleção só.- Adapta cada peça ao tema, instala as dependências, roda build e lint, e revisa em 1440, 768 e 390 px.
Uma seção num projeto existente
Pedido: "Adicione uma seção de preços."
- Lê o tema do projeto (cores, fontes, raios).
search_componentscom{"query": "preços", "has_code": true, "limit": 5}. "preços" virapricing.- Compara 3 a 5 candidatos pela descrição e pela prévia e abre só o escolhido com
get_component. - Adapta ao tema e confere em 1440 e 390 px.
Tela de app mobile
Pedido: "Preciso de uma tela de login para o app Android."
search_componentscom{"query": "login", "mobile": true}.get_componentcom{"id": "<id>", "platform": "kotlin"}. O prompt traz a versão web e a seção "Mobile — Kotlin" com o código Compose Multiplatform.- Adapta o pacote e o tema ao app.
Limites do plano Pro
| Limite | Valor | Como conta |
|---|---|---|
| Chamadas | 600 a cada 4 horas | Qualquer ferramenta, janela deslizante |
| Componentes por dia | 150 | Componentes diferentes abertos com get_component; repetir o mesmo no dia não conta |
| Componentes por mês | 1.500 | Mesma regra, somada no mês |
Buscas, listas, estilos, ícones e fontes gastam só chamadas, nunca a cota de componentes.
Identificadores
| Acervo | Formato do id | Exemplo |
|---|---|---|
| Componente | Código público de 8 caracteres | c1a1c9d4 |
| Estilo web | Slug | o slug devolvido por search_styles |
| Ícone | prefixo:nome | lucide:camera |
| Fonte | Id em minúsculas com hífens, ou o nome da família | o id devolvido por search_fonts |
O id de componente só vale se veio de search_components. Ids em outro formato devolvem "id não encontrado" com sugestões parecidas. Prévias ficam em https://api.virtues.now/vui/previews/p/<id>.
Erros
| Situação | Resposta | O que fazer |
|---|---|---|
| Sem credencial | HTTP 401 com desafio OAuth | Entrar pelo login do VIU ou mandar a chave |
| Token OAuth vencido | HTTP 401 invalid_token | O cliente renova com o token de renovação |
| Chave inválida ou revogada | HTTP 401 | Gerar nova chave no perfil do site |
| Conta fora do plano Pro | HTTP 403 | Assinar o Pro |
| Limite de chamadas | HTTP 429 com Retry-After em segundos | Esperar o tempo indicado |
| Cota de componentes | Erro da ferramenta (isError): "Limite de 150 componentes por dia atingido. Volte amanhã." | Continuar só com buscas ou esperar o dia seguinte |
| Lote JSON-RPC | HTTP 400, código -32600 | Mandar uma mensagem por requisição |
| JSON malformado | HTTP 400, código -32700 | Corrigir o corpo |
| Método desconhecido | Código -32601 | Usar um dos métodos suportados |
| GET ou DELETE | HTTP 405 | Usar POST |
| Componente sem código | code: false e note | Escolher outro; não gasta cota |
Erros dentro de uma ferramenta voltam ao Claude como resultado com isError: true e a mensagem, sem derrubar a conexão.