Sapiens Sintéticos MCP
An MCP server providing approximately 30 tools for text, image, video, music, and educational content generation, allowing agents to operate the Sapiens Sintéticos AI studio for prototyping and creation.
Endpoint and access
OAuth sign-in: the first time you connect, your client opens the vendor's own authorization prompt in a browser.
https://www.sapiensinteticos.com/api/mcp/mcpWhat its tools do
30 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Can change data (25)
sapiens_carrosselsapiens_imagesapiens_metasapiens_repertoriosapiens_gallerysapiens_communitysapiens_writesapiens_studiossapiens_personasapiens_helensapiens_musicatorsapiens_agentesapiens_videosapiens_stock_audiosapiens_brandsapiens_collectionsapiens_charactersapiens_profilesapiens_sinteticosapiens_forumsapiens_supportsapiens_trilhassapiens_publicarsapiens_semanasapiens_resume
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to sapiensinteticos.com ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Generate images, articles, voice, music, and video content
- Connect Claude, ChatGPT, and Codex agents to the studio
- Access educational courses and learning materials
- Utilize tools for personal AI studio prototyping
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- mcp-sapiens unknown
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 30 advertised
- Resources
- 18 advertised
- Resource templates
- Sign-in required
- Prompts
- 6 advertised
{
"tools": {},
"prompts": {},
"resources": {}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
30 advertised
sapiens_carrossel
O CARROSSEL do Instagram da pessoa, pelo agente (qualquer conta logada, só os carrosséis DELA). Puxe a skill 'carrossel' antes. Sub-actions: generate (gera do zero a partir de UMA fonte: brief, articleId de artigo publicado ou userArticleId de artigo dela; 350 Sinapses já com a escolha de fotos, estorna se falhar; model é a FORMA: feed (padrão, 9 slides), reflexao, case ou editorial; aspect é o TAMANHO: 4:5 (padrão, a folha que o feed mostra inteira) ou 9:16; devolve id + url do editor), list (os carrosséis dela, com id, título, nº de slides e url), get (payload inteiro + catálogo de layouts com os slots e limites de cada um, paletas, folhas e a assinatura: tudo pra VOCÊ escrever os slides), update (payload INTEIRO de volta, normalizado no servidor: mande o theme inteiro, com folha e assinatura, e o image de todo slide que não mexeu, senão volta pro padrão e a foto some), auto_images (a IA escolhe fotos do banco pros slides, 60 Sinapses, estorna se não tiver o que preencher; makeVisual converte slides de texto em layout de foto antes; generateMissing gera foto nova pros que o banco não cobrir, até 4, ~450 Sinapses cada, avise o custo antes), generate_image (foto nova pra UM slide, ~450 Sinapses, customPrompt opcional), set_image (põe no slide uma peça da pessoa ou pública pelo ID citável img_…, sem custo; é como ela usa as PRÓPRIAS fotos), cover (a Capa IA: capa 16:9 com a manchete QUEIMADA na imagem e um elemento vivo cruzando as letras; com carouselId fatia em duas e põe na frente do carrossel no lugar da capa IA anterior; cobra pelo motor da capa, confirme o custo antes). A ASSINATURA (theme.signature: o nome no topo, a marca no canto e o @ do fecho) nasce da marca da pessoa, ou do nome dela quando não tem marca; o @ é o dela no Instagram, não invente. O BRAND veste a peça inteira: cor (o destaque é a cor do brand que lê no fundo, trocável no editor), fonte do título e do corpo, voz e assinatura; no generate, brandSlug escolhe outro brand que não o padrão da conta. Carrossel que vem de FORA entra pelo update: cada slide de lá casa com um layout do catálogo do get pelo papel (capa, corpo, cta) e pela foto, e o estilo vem do brand (sapiens_brand action=import), não do layout. O carrossel vai até 15 slides. generate, auto_images com generateMissing, generate_image e cover são SÍNCRONAS e pesadas: vale a REGRA DO TIMEOUT (confira em action=list antes de repetir). Baixar o arquivo é no editor (a url): aqui sai a receita pronta. O carrossel atrelado a uma jogada do Workflow segue pela sapiens_pipeline.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"brief": {
"type": "string",
"description": "generate: o tema e o ângulo do carrossel, em um parágrafo. Use brief OU articleId OU userArticleId."
},
"force": {
"type": "boolean",
"description": "auto_images: true troca também as fotos que já estão nos slides."
},
"model": {
"enum": [
"feed",
"reflexao",
"case",
"editorial"
],
"type": "string",
"description": "generate: a FORMA. 'feed' (padrão: 9 slides, abre numa dor, mostra o mecanismo, fecha em ação), 'reflexao' (tema existencial sustentado por uma analogia), 'case' (análise de tendência a partir de link ou manchete, fecha em keyword), 'editorial' (a IA escolhe os layouts livremente, 7 a 9 slides)."
},
"title": {
"type": "string",
"description": "update: novo título do carrossel (opcional)."
},
"action": {
"enum": [
"generate",
"list",
"get",
"update",
"auto_images",
"generate_image",
"set_image",
"cover"
],
"type": "string",
"description": "generate (gera um carrossel do zero a partir de brief OU artigo, 350 Sinapses, estorna se falhar) · list (seus carrosséis) · get (payload inteiro + catálogo de layouts, paletas, folhas e a assinatura, tudo pra você escrever os slides) · update (grava o payload inteiro de volta, normalizado no servidor) · auto_images (a IA escolhe fotos do banco pros slides, 60 Sinapses; generateMissing gera as que faltarem, ~450 cada) · generate_image (foto nova pra UM slide, ~450) · set_image (põe no slide uma peça SUA ou pública, pelo ID citável img_…, sem custo) · cover (a Capa IA: capa 16:9 com o texto queimado, fatiada em duas e posta na frente do carrossel, cobra pelo motor da capa)."
},
"aspect": {
"enum": [
"4:5",
"9:16"
],
"type": "string",
"description": "generate: o TAMANHO da folha. '4:5' (padrão, o feed do Instagram mostra inteira) ou '9:16' (tela cheia). Dá pra trocar depois no editor."
},
"focalX": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "set_image: ponto focal horizontal (0 a 1, default 0.5)."
},
"focalY": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "set_image: ponto focal vertical (0 a 1, default 0.5)."
},
"handle": {
"type": "string",
"description": "set_image: o ID citável da peça (img_…), que o usuário copia no detalhe dela ou vem de sapiens_reference/sapiens_gallery. Peça sua ou pública."
},
"payload": {
"description": "update: o payload INTEIRO, no shape do get: { theme: { palette, sheet, signature, brand?, fonts? }, slides: [{ id, templateId, slots, image }], meta }. Preserve image dos slides que você não mexeu e o theme inteiro (folha, assinatura, cor e fonte do brand): o que faltar volta pro padrão. Na peça que veste um brand (palette 'brand'), theme.brand traz os tokens de cor (bg, text, accent, kicker em hex) e theme.fonts a tipografia ({ display: família do título, text: família do corpo }, sem fonts = a da casa). Pra trocar a cor de DESTAQUE, ponha o mesmo hex em accent e kicker. Carrossel que vem de FORA (outro app, outro editor): case cada slide de lá com um layout do catálogo do get pelo PAPEL (role: capa, corpo, cta), pela foto (requiresImage) e pelos slots, e ponha o texto nos slots daquele layout; o estilo (cor, fonte, logo) vem do brand, não do layout. Layout de fora sem par no catálogo vira o corpo mais próximo, nunca layout inventado. Foto NOVA não entra por URL aqui: use set_image (ID da peça) ou generate_image."
},
"slideId": {
"type": "string",
"description": "generate_image e set_image: o id do slide (vem do get)."
},
"capaVibe": {
"type": "string",
"description": "cover: o cenário (omita e a IA escolhe)."
},
"articleId": {
"type": "string",
"description": "generate: id de um artigo PUBLICADO do blog da casa, usado como fonte (o carrossel fica fiel ao argumento dele)."
},
"brandSlug": {
"type": "string",
"description": "generate: o brand da peça (slug de sapiens_brand action=list), quando não é o padrão da conta. Veste a cor, a fonte, a voz e a assinatura dele. Sem isso vale o padrão da conta. Brand que a pessoa não pode usar cai no padrão."
},
"carouselId": {
"type": "string",
"description": "O id do carrossel (vem do generate e do list). Obrigatório em get, update, auto_images, generate_image, set_image; opcional no cover (sem ele a capa só é gerada)."
},
"makeVisual": {
"type": "boolean",
"description": "auto_images: true converte slides só de texto em layouts com foto antes de escolher (dá ritmo a carrossel texto-pesado)."
},
"capaElement": {
"type": "string",
"description": "cover: o elemento vivo que cruza as letras (omita e a IA escolhe pela pauta)."
},
"capaSubline": {
"type": "string",
"description": "cover: linha de apoio (opcional)."
},
"capaHeadline": {
"type": "string",
"description": "cover: a manchete que vai queimada na capa (obrigatória)."
},
"customPrompt": {
"type": "string",
"description": "generate_image: direção da cena (opcional; sem ela a cena sai do texto do slide)."
},
"useSintetico": {
"type": "boolean",
"description": "generate: true = a voz do seu Sintético escreve o texto por cima da voz da sua marca."
},
"baseUpdatedAt": {
"type": "number",
"description": "update: o updatedAt que o get devolveu. Mande sempre: se o carrossel mudou depois do get (uma foto gerada, uma edição no editor), o update recusa em vez de apagar isso com o payload velho. Aí faça get de novo e reaplique."
},
"capaRightText": {
"type": "string",
"description": "cover: o texto que cai no 2º slide (opcional)."
},
"userArticleId": {
"type": "string",
"description": "generate: id de um artigo SEU do perfil (sapiens_write), usado como fonte."
},
"autoPickImages": {
"type": "boolean",
"description": "generate: false = só o texto, sem escolher fotos (default true, incluso no preço)."
},
"capaImageModel": {
"type": "string",
"description": "cover: o motor da capa. Default o que escreve letra pequena legível; veja o preço em sapiens_image action=models."
},
"generateMissing": {
"type": "boolean",
"description": "auto_images: true gera foto nova pros slides que o banco não cobriu (até 4, ~450 Sinapses cada). Avise o custo antes."
}
},
"additionalProperties": false
}{
"title": "Carrossel",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_image
Operações de imagem via Sapiens (Gemini, GPT Image 2 e 2.5, Grok, Seedream/ByteDance). Sub-actions: 'upscale' (sourceImageId de uma imagem SUA pronta: a mesma peça em resolução maior vira peça nova no acervo, a original fica; cobra Sinapses, preço fixo igual ao da ficha no site; SÍNCRONA e pode passar de 2 min, então Timeout é o cliente desistindo: a peça nova entra pronta em até uns 6 min, leia action=status antes de repetir), 'sombra' (sourceImageId de uma foto SUA pronta: extrai a sombra, o mapa de profundidade colorido da foto, como peça nova no acervo, pra usar de referência de pose e volume; cobra Sinapses, preço fixo; síncrona), 'generate' (gera imagem completa imediato: prompt+model+aspectRatio+size; suporta mode=edit/variation e MULTI-REFERÊNCIA: combine até 5 imagens como referência numa geração só, igual ao modal 'Selecionar Referência' do web, via referenceImageUrls (sua galeria + Acervo + personagens públicos de sapiens_character) e/ou sourceImageIds (ids da sua galeria); quem aceita e quantas chegam ao motor saem de supportsReferences e maxReferences em action=models (a ref acima do teto do motor some sem erro); EDIÇÃO POR ÁREA: sourceImageId + maskRegions (caixas em fração da imagem) muda SÓ a região marcada e devolve o resto igual ao pixel, no nano-banana-2 e no nano-banana-max, pelo preço da geração comum; FUNDO TRANSPARENTE: transparentBackground=true devolve PNG com alpha, o recorte feito pelo próprio motor, pelo preço da geração comum e sem o Remover Fundo pago depois, só na linha GPT Image (supportsTransparentBackground em action=models; nos outros recusa sem cobrar)), 'compose' (combina persona+screen via Gemini pra app-demo Shorts; 25 sinapses, rate limit 10/min). generate=image one-shot, compose=montar start frame app-demo. 'request_generation' é legado e recusa sem cobrar: vídeo nasce inteiro em sapiens_video action=create. TEMPLATE: passe templateSlug numa generate pra usar um super-prompt travado da casa: o `prompt` vira só a CENA (quem + pose + objeto-conceito) e o template embrulha estilo+fundo+enquadramento+ref de traço. 'retrato-sapiens-v1' = retrato editorial cartoon de um personagem no grid verde Sapiens (mesma 'mão' dos artigos); sem ref própria, injeta a Helen como âncora de traço (passar referenceImageUrls troca quem aparece). Mutuamente exclusivo com brandSlug. Sub-action 'models' (sem custo, sem login): lista o catálogo vivo (modelos ativos + preço cobrado em 1K com override admin + resolutionAdders, o adder por resolução já clampado ao teto de cada motor + maxResolution + se aceita referência e quantas, maxReferences) pra descobrir modelo/preço em vez de chutar. O preço de uma geração é priceSinapses + resolutionAdders[size], então 2K/4K custam MAIS que o número base: nunca cite o base como se fosse o total quando o size não for 1K. O generate devolve custoSinapses, o que o extrato debitou: é esse que se cita depois. Sub-action 'loras' (somente leitura, sem custo): a lista de LoRAs da casa que a conta pode somar num generate pelo arg `loras` ([{id, peso}], até 3 somando as do motor), com a base de cada uma (Krea 2 ou Flux.2 Klein 9B), a faixa de peso, a frase de gatilho do autor (ponha no prompt), o crédito que a licença pede e os motores que aceitam; não muda o preço. Sub-action 'status' (somente leitura, sem custo): as gerações de imagem mais recentes da conta, a mais nova primeiro, com o estado de cada uma (gerando, pronta, falhou, bloqueada, presa) e há quantos minutos nasceu. É a leitura depois de um Timeout: mostra a peça que AINDA está gerando, que a galeria (sapiens_gallery action=list) não mostra. NOTA: generate é SÍNCRONA e cobra no disparo; modelo pesado (Pro, gpt-image-2-high, GPT Image 2.5 Sunburst, Seedream 5.0 Pro, Grok quality, 2K/4K) cai na REGRA DO TIMEOUT: leia action=status antes de repetir. gerando = ainda no servidor e já cobrada, não gere de novo; pronta = mostre essa; falhou = o débito voltou, aí sim gere de novo. Sub-actions 'trava' e 'trava_julgar' (só conta admin, sem custo): quando uma geração SUA no motor sem filtro falha com 'A trava de conteúdo leu menor de idade', 'trava' lista os casos barrados com a referência na conversa, o motivo e quantas leituras do juiz disseram menor; 'trava_julgar' (casoId + julgamento) grava o olho do dono: 'adulta' libera aquela referência exata pra próxima geração da conta, 'menor' barra. Só libere quando o dono, vendo a imagem, mandar.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"mode": {
"enum": [
"create",
"edit",
"variation"
],
"type": "string",
"description": "Default 'create' (gera do zero). 'edit' aplica prompt como mudança sobre sourceImageId. 'variation' gera similar mantendo estilo. Edit/variation exigem sourceImageId e enviam a imagem como referência inline pro modelo."
},
"size": {
"enum": [
"1K",
"2K",
"4K"
],
"type": "string",
"description": "PADRÃO DO MCP: quem NÃO passa size nasce em 2K no Gemini (nano-banana-max, nano-banana-2) e na família Krea 2 da WaveSpeed, e em 1K no resto. Nesses dois grupos o 2K soma o adder ao preço (+100 hoje), e é decisão da casa pagar por ele: no Gemini o 2K não custa nada a mais pro provider, e na Krea 2 ele dobra o lado da peça (2720x1536 em 16:9) sem perder pele. Passe size='1K' explícito quando o barato importar mais que o detalhe. Resolução acima de 1K só existe nos modelos com hasResolutionAdder (o Gemini vai até 4K; grok-2-image, grok-2-image-quality e a família Krea 2 param em 2K, e pedir 4K neles entrega 2K e cobra o adder de 2K). Nos demais modelos o size é ignorado (fica em 1K): no gpt-image-2 e nos 2.5, por exemplo, quem decide o tamanho é o aspect ratio. O valor VIVO do adder por modelo sai em action=models (campo resolutionAdders, já clampado ao teto do motor): não escreva o número de cabeça, ele muda quando o provider reajusta."
},
"loras": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"peso"
],
"properties": {
"id": {
"type": "string"
},
"peso": {
"type": "number",
"maximum": 4,
"minimum": 0
}
},
"additionalProperties": false
},
"maxItems": 3,
"description": "LoRA PRÓPRIA, somada às LoRAs que o motor já usa: [{id, peso}] com ids da lista da casa (sapiens_image action=loras, que dá a faixa de peso, o gatilho e os motores de cada uma). Só nos motores com endpoint de LoRA na WaveSpeed: a família Krea 2 ('wavespeed-krea2-base' deixa as 3 vagas livres; 'wavespeed-krea2-realism' e 'wavespeed-krea2' já usam 1 e 2) e os Flux.2 Klein com LoRA ('wavespeed-klein-nu', 'wavespeed-klein-anime', 'wavespeed-klein-anime-plus', 'wavespeed-klein-celular', 'wavespeed-klein-transparencia'); o 'wavespeed-flux2' (Klein Base) não aceita. A base da LoRA tem que ser a do motor (LoRA de Krea 2 não roda no Klein). Teto de 3 LoRAs por pedido CONTANDO as do motor no nível de Ousadia pedido. A frase de gatilho, quando a LoRA tem, vai no prompt por sua conta. Mesmo preço da geração sem LoRA. Recusa sem cobrar: id fora da lista, base errada, peso fora da faixa, vaga a mais, LoRA em teste numa conta que não é admin."
},
"model": {
"enum": [
"nano-banana-max",
"nano-banana-2",
"gpt-image-2-low",
"gpt-image-2-high",
"gpt-image-2-5-flare",
"gpt-image-2-5-sunburst",
"gpt-image-2-6-flare",
"gpt-image-2-6-sunburst",
"mai-image-2-6",
"muse-image",
"flux-3",
"flux-3-klein",
"krea-3",
"krea-3-high",
"seedream-4-5",
"seedream-5-0",
"seedream-5-0-pro",
"grok-2-image",
"grok-2-image-quality",
"grok-imagine-2",
"wavespeed-chroma",
"wavespeed-flux2",
"wavespeed-klein-plus",
"wavespeed-flux-nsfw",
"wavespeed-klein-anime",
"wavespeed-klein-anime-plus",
"wavespeed-klein-celular",
"wavespeed-klein-nu",
"wavespeed-klein-transparencia",
"wavespeed-krea2-transparencia",
"wavespeed-krea2-realism",
"wavespeed-krea2",
"wavespeed-krea2-base",
"wavespeed-krea2-broken-tears",
"wavespeed-moss-image",
"civitai-wai-illustrious",
"civitai-nova-anime-xl",
"civitai-anima",
"civitai-pony-v6",
"fal-krea2-realism-v2"
],
"type": "string",
"description": "Default 'nano-banana-2' (Nano Banana 2.1 com refs). 'nano-banana-max' (Pro 3) = qualidade alta. 'gpt-image-2-low/high' = GPT Image 2 nos tiers low e high. 'gpt-image-2-5-flare'/'gpt-image-2-5-sunburst' = GPT Image 2.5, a geração de set/2026, os dois em quality high e com referência: o Flare é o rápido, pra volume; o Sunburst é o de precisão, pra composição complexa e edição em várias voltas. 'gpt-image-2-6-flare'/'gpt-image-2-6-sunburst' = GPT Image 2.6, a geração de nov/2026, mesma divisão, mesmo preço e mesmas capacidades do 2.5 (quality high, referência, fundo transparente); o Flare do 2.6 é cerca de 3x mais rápido que o Sunburst. 'mai-image-2-6' (MAI Image 2.6, da Microsoft) = foto rápida no mesmo recurso do gpt-image-2, e o único da casa que cobra por ÁREA: o adder de resolução aqui é real, o teto é 2K (1536², porque acima disso o provider recusa por total de pixels) e ele não aceita referência. 'muse-image' (Muse Image, da Meta) = barato na edição por referência e bom pra segurar personagem (10 refs no catálogo; pelo MCP vale o teto de 5 do campo referenceImageUrls); sem escada de resolução (o motor decide o tamanho e cobra o mesmo) e moderação apertada, NÃO serve pra +18. 'flux-3' (FLUX 3, da Black Forest Labs) = texto na arte e composição precisos, aceita referência (10 no catálogo; pelo MCP vale o teto de 5 do campo referenceImageUrls), resolução até 2K; com referência a proporção segue a primeira imagem; moderado, NÃO serve pra +18. 'flux-3-klein' (FLUX 3 Image Klein, o irmão leve de pesos abertos do FLUX 3) = foto e personagem rápidos (~5 s) e baratos, aceita referência (10 no catálogo; pelo MCP vale o teto de 5 do campo referenceImageUrls) e segura a pessoa da ref numa cena nova, resolução até 2K; moderado, NÃO serve pra +18. 'krea-3' (Krea 3, da Krea, em beta) = edição por referência que SEGURA PERSONAGEM, inclusive anime e criatura com marcador no rosto, e foto com pele crua; aceita referência (8 no catálogo; pelo MCP vale o teto de 5 do campo referenceImageUrls), resolução até 2K. É o ÚNICO da casa que cobra cada referência à parte: o preço sobe por ref (o valor vivo sai em action=models), então mande só as refs que a cena precisa. Escreva em linguagem simples e chame cada referência pelo que ela mostra ('a primeira imagem é o rosto, a segunda o figurino'); pra edição, a mudança primeiro e uma frase de preservação no fim. 'krea-3-high' = o MESMO Krea 3 com thinking high: monta um plano de edição a partir do prompt e das refs antes de gerar; use quando combinar várias refs ou quando o 'krea-3' errou o pedido. Moderado, NÃO serve pra +18. 'seedream-4-5'/'seedream-5-0'/'seedream-5-0-pro' = ByteDance 2K nativo, cinematográfico, aceita referência (10 no catálogo; pelo MCP vale o teto de 5 do campo referenceImageUrls) (o 5.0 é a geração nova, entende prompt complexo melhor; o 5.0-pro é o topo da linha). 'grok-2-image'/'grok-2-image-quality' = xAI Grok Imagine da geração anterior (moderação frouxa +18, aceita refs e aspect; quality é mais fiel pra character lock); 'grok-imagine-2' = Grok Imagine Image 2.0, a geração nova de ago/2026, que é a melhor da linha integrando desenho e foto na mesma peça. Daqui em diante, a LINHA DEGEN (sem freio de conteúdo, gate +18; o Grok fica fora dela). NUDEZ É NÍVEL, NÃO MOTOR: três escolhas têm um par com nudez, e o par vem no campo `ousadia` de action=models. Sem nudez = o id da escolha; com nudez = o id do par + loraIntensity. Não existe motor '+18', 'Nu' ou 'Livre' separado pra procurar. 'wavespeed-chroma' (fotorrealista rápido, sem referência), 'wavespeed-flux2' (Flux.2 Klein Base: foto rápida, até 4 referências, segura o rosto) · com nudez = 'wavespeed-klein-nu' (o mesmo Klein com a LoRA de nudez no registro de foto; a identidade continua vindo da referência), 'wavespeed-klein-anime' (Flux.2 Klein + LoRA anime, inteligente e controlável; o TRAÇO vem do prompt e da referência, não da LoRA: sem referência o servidor põe o anime no prompt quando ele não diz o traço; com referência, ref anime sai anime e ref de FOTO sai foto, então pra virar anime a partir de foto peça o restilo numa frase só, com a nudez dentro dela ('Redraw this woman as an anime illustration, fully nude, ... Same face, same hair, same pose, same room.'), sem 'everything else unchanged', que segura a roupa) · com nudez = 'wavespeed-klein-anime-plus', 'wavespeed-flux-nsfw' (Flux dev + LoRA NSFW, sem par: a Ousadia é dele mesmo, via loraIntensity), 'wavespeed-klein-celular' (o MESMO Klein 9B com a LoRA Phone Photography por cima: foto de celular, candid, luz de janela; no edit com a referência da personagem o rosto fica quase idêntico, e é a receita de conteúdo de perfil de criadora pra personagem FOTOGRÁFICA. Em personagem cel-shaded o edit troca o traço, então não use com a Aria. Comece o prompt com 'This is a candid photograph taken with a smartphone of' e enumere 'same face, same hair' antes da cena; sem Ousadia), 'wavespeed-klein-transparencia' (o MESMO Klein 9B com a LoRA de tecido transparente: o efeito vem da LoRA e não da descrição; segura o rosto da ref; sem Ousadia), 'wavespeed-krea2-realism' (Krea 2 Realism: base 12B com LoRA de realismo, pele crua, hospedada na WaveSpeed SEM o classificador de entrada da fal, que devolve 422 até em prompt sem palavra de nudez; img2img de verdade com 1 referência, força regulável em refStrength, e 2K) · com nudez = 'wavespeed-krea2' (o mesmo realismo + LoRA NSFW; é a antiga 'Krea 2 Livre'), 'wavespeed-krea2-transparencia' (a mesma LoRA de transparência na base Krea 2: fotografia mais rica, identidade mais frouxa que a irmã Klein; 1 referência; sem Ousadia), 'wavespeed-moss-image' (MOSS-Image, pesos abertos da OpenMOSS: foto sem freio sem LoRA nenhuma, que segue CENA com ofício, gesto e luz (a ceramista no torno, a revelação na luz vermelha); só texto, sem referência, até 2K, e sem Ousadia: a nudez e o quanto ela mostra saem do prompt, e o explícito só vem quando o prompt pede. Escreva a cena em frase; a roupa que ela 'tirou' às vezes fica no corpo, então diga onde a roupa está ('her clothes hang over the stool'); 'olha pra alguém fora do quadro' tende a virar olhar na lente; evite espelho com pose de alongamento, que duplica a pessoa) = WaveSpeed rápido. LEGADO, fora da escolha da tela e ainda gerando pelo id (não ofereça): 'wavespeed-klein-plus' (a escolha virou 'wavespeed-klein-nu'), 'wavespeed-krea2-base' (Krea 2 sem LoRA nenhuma; a escolha virou 'wavespeed-krea2-realism'), 'fal-krea2-realism-v2' (Krea 2 Realism pela fal, ~4s: aceita até 3 referências de ESTILO, paleta/luz/textura de uma série, não character lock, e com referência a LoRA não vai junto; a escolha virou 'wavespeed-krea2-realism'). 'civitai-wai-illustrious'/'civitai-nova-anime-xl' (anime), 'civitai-pony-v6' (Pony V6 XL, base nº1) = Civitai sdcpp rápido. 'civitai-anima' (Anima: 2B da CircleStone com a Comfy Org, base própria e não SDXL; entrega anime de PRODUÇÃO, linha fechada e sombra chapada, em vez do registro de ilustração dos Illustrious. O encoder é um LLM, então escreva a cena em FRASE e não em tag booru, e não cole score_9/masterpiece aqui)."
},
"todos": {
"type": "boolean",
"description": "Pra action=trava: true traz também os casos já julgados (o padrão é só os sem julgamento)."
},
"action": {
"enum": [
"generate",
"request_generation",
"compose",
"models",
"upscale",
"sombra",
"status",
"loras",
"trava",
"trava_julgar"
],
"type": "string"
},
"casoId": {
"type": "string",
"description": "Pra action=trava_julgar: o casoId que action=trava devolveu."
},
"prompt": {
"type": "string",
"description": "Prompt da imagem (obrigatório em generate). Full-bleed, sujeito oversized."
},
"skills": {
"type": "array",
"items": {
"type": "string"
},
"description": "COMO A PEÇA FOI FEITA: os slugs das skills que dirigiram esta geração (ex: ['camarim'], ['dop','escala-gigantismo']). Metadado puro: não muda preço, motor nem resultado, e serve pra ACHAR depois tudo que saiu de uma skill. Passe sempre que a geração estiver saindo de uma skill da casa, na ordem em que elas entraram (quem escreveu o prompt primeiro). Fica no registro da peça e volta em sapiens_gallery."
},
"ticket": {
"type": "string",
"description": "Pra action=trava_julgar com julgamento='adulta': o ticket que action=trava devolveu no caso, quando ele foi inteiro pra conversa."
},
"styleId": {
"type": "string",
"description": "Legado, sem efeito: o servidor não lê este campo. Estilo vem de brandSlug, templateSlug ou registro."
},
"pagarCom": {
"enum": [
"sinapses",
"dolar"
],
"type": "string",
"description": "De qual saldo sai a imagem. Default 'sinapses' (o saldo do App). 'dolar' cobra no saldo em dólar da API da conta (o mesmo de Developers), sem tocar nas Sinapses: mesmo motor, mesma peça, mesmas referências e tamanhos, preço em dólar do custo do motor naquela resolução. Use quando a pessoa pedir pra pagar com o saldo da API ou estiver sem Sinapses e com saldo em dólar. Motor sem preço em dólar (os do Civitai) recusa, e saldo em dólar curto recusa sem cobrar nada. O valor cobrado volta em pagoEmDolarUsd. Sinapse nunca vira dólar nem o contrário: são duas carteiras."
},
"registro": {
"enum": [
"anos-90",
"candid",
"noturno-intimo",
"camera-baixa"
],
"type": "string",
"description": "REGISTRO fotografico: COMO a foto foi tirada, nao o que ela mostra. Eixo separado do motor e do templateSlug, e convive com os dois. O bloco entra ANTES da sua cena, server-side, e o `prompt` continua sendo so a cena. 'anos-90' = camera descartavel dos anos 90, flash direto, cor lavada e data queimada no canto (o mais barato de todos: nao carrega LoRA); 'candid' = retrato natural, luz do dia, pele com poro, e e o que MAIS obedece a referencia, entao e o mais seguro pra personagem da casa e pra inventar personagem novo por texto; 'noturno-intimo' = tom escuro, luz de abajur, clima de serie curta (o bloco e em chines de proposito, que e o que alcanca esse tom); 'camera-baixa' = olho de peixe no chao, perspectiva exagerada e desfoque de movimento, o registro pra still que vai virar video. AVISO medido: 'camera-baixa' troca o traco de personagem CEL-SHADED por foto, entao nele use personagem fotografica. Omitir e escolha legitima: sem registro o prompt vai intacto."
},
"brandMark": {
"enum": [
"persona",
"logo",
"none"
],
"type": "string",
"description": "Marca na imagem do brand: 'persona' (personagem do brand via character sheets, ex: Helen), 'logo' (carimba a logo no canto), 'none' (só o estilo). Default 'none'. Só aplica se brandSlug setado e o brand oferecer a marca."
},
"brandSlug": {
"type": "string",
"description": "Slug do brand (design system) pra aplicar estilo visual. Fonte única: tabela `brands` (ex: 'sapiens', 'solarpunk', 'editorial-duotone', 'brutalista-mono'). Default: nenhum (prompt cru). NÃO herda o padrão da conta de propósito: aqui o estilo é escolha do momento, e quem só quer uma imagem pra outra coisa não deve nascer preso num visual. O padrão da pessoa (quando existe) vem em sapiens_meta action=start, campo designSystem: OFEREÇA quando a peça for da marca dela, deixe cru no resto. Vale em action=generate (mode=create)."
},
"julgamento": {
"enum": [
"adulta",
"menor"
],
"type": "string",
"description": "Pra action=trava_julgar: 'adulta' libera a referência do caso pra próxima geração da conta (só quando o dono, vendo a imagem, mandar); 'menor' barra e tira a liberação."
},
"aspectRatio": {
"enum": [
"1:1",
"16:9",
"9:16",
"4:3",
"3:4",
"3:2",
"2:3"
],
"type": "string",
"description": "Default '1:1'. 9:16 = vertical pra story/short, 16:9 = landscape."
},
"instruction": {
"type": "string",
"description": "Pra action=compose: instrução em EN pro Gemini. Ex: 'Compose a vertical 9:16 photo: persona holding a smartphone facing the camera, the phone screen displaying the provided second image (clearly visible, sharp). Mobile photography aesthetic.'"
},
"maskRegions": {
"type": "array",
"items": {
"type": "object",
"required": [
"x",
"y",
"w",
"h"
],
"properties": {
"h": {
"type": "number",
"maximum": 1,
"exclusiveMinimum": 0
},
"w": {
"type": "number",
"maximum": 1,
"exclusiveMinimum": 0
},
"x": {
"type": "number",
"minimum": 0,
"exclusiveMaximum": 1
},
"y": {
"type": "number",
"minimum": 0,
"exclusiveMaximum": 1
},
"shape": {
"enum": [
"ellipse",
"rect"
],
"type": "string"
}
},
"additionalProperties": false
},
"maxItems": 8,
"minItems": 1,
"description": "EDIÇÃO POR ÁREA: só a região marcada muda, e o resto da peça volta igual ao pixel (a casa cola a área editada sobre a original). Caixas em FRAÇÃO da imagem, de 0 a 1, com origem no canto SUPERIOR ESQUERDO: x,y = canto superior esquerdo da caixa; w,h = largura e altura. shape 'ellipse' (default) marca a elipse inscrita na caixa, que cobre objeto sem pegar canto vazio; 'rect' marca a caixa inteira. Até 8 caixas, somadas numa área só. Exige UMA referência só (sourceImageId da sua galeria, sem sourceImageIds extra e sem templateSlug) e motor com supportsMaskEdit=true em action=models (hoje nano-banana-2 e nano-banana-max). O prompt descreve SÓ o que entra na área (ex.: 'a red umbrella held in her hand'), nunca a cena inteira. Marque com folga em volta do objeto: área justa demais corta a sombra e o reflexo. Antes, OLHE a peça (sapiens_gallery action=get) pra estimar as coordenadas. A peça sai na proporção e no tamanho da origem, lado maior até 2048 (4K vira 2K). Mesmo preço da geração comum. Recusa sem cobrar: área vazia, área que cobre quase a imagem toda (aí é edit comum, sem maskRegions) e motor sem supportsMaskEdit."
},
"refStrength": {
"type": "number",
"maximum": 0.9,
"minimum": 0.2,
"description": "Força da referência, só nas Krea 2 da WaveSpeed ('wavespeed-krea2-realism', 'wavespeed-krea2', 'wavespeed-krea2-transparencia', 'wavespeed-krea2-base'), onde a primeira referência vira a imagem-base: quanto a peça repinta. 0.2 guarda a foto quase inteira, com o rosto; 0.45 guarda pose, roupa e fundo, e o prompt muda luz e clima (o rosto sai parecido, não igual); 0.65 (o default) guarda enquadramento e roupa, e rosto e cenário saem do prompt; 0.9 guarda só a proporção. A peça sai no formato da referência, não no aspectRatio. Pra segurar rosto de personagem, o caminho é o Klein ('wavespeed-flux2' e família), não baixar a força. O campo refStrength de action=models diz quais motores aceitam e o default de cada um. Ignorado nos outros motores."
},
"influencerId": {
"type": "string",
"description": "ID de personagem pra character-lock: a imagem sai com ESSE personagem. Descubra o id com sapiens_character."
},
"templateSlug": {
"type": "string",
"description": "Slug de um template de imagem (super-prompt travado da casa). Quando setado, o `prompt` vira só a CENA (quem + pose + objeto-conceito) e o template embrulha com o estilo + fundo + enquadramento + ref de traço da casa. Ex: 'retrato-sapiens-v1' = retrato editorial cartoon de UM personagem no grid verde Sapiens (mesma 'mão' dos artigos). O template define model/aspect/size default (sobreponíveis) e injeta a ref da Helen como âncora de traço quando você não passa referenceImageUrls própria (passar refs = trocar quem aparece, mantendo o estilo). Mutuamente exclusivo com brandSlug. Vale em action=generate, mode=create."
},
"loraIntensity": {
"enum": [
"suave",
"medio",
"forte"
],
"type": "string",
"description": "Ousadia: o nível de nudez. Só vale nos modelos COM Ousadia ('wavespeed-klein-nu' = Klein Base, 'wavespeed-klein-anime-plus' = Klein Anime, 'wavespeed-krea2' = Krea 2 Realism, 'wavespeed-flux-nsfw', e o legado 'wavespeed-klein-plus'): suave=insinua sem despir, medio=maduro no limite (default), forte=sem freio. Sem nudez, use o par sem Ousadia ('wavespeed-flux2', 'wavespeed-klein-anime', 'wavespeed-krea2-realism'): o par vem no campo `ousadia` de action=models. Ideal pra remixar personagem (ex: a Helen) preservando a identidade e regulando a liberdade. Ignorado nos demais modelos."
},
"personaBase64": {
"type": "string",
"description": "Pra action=compose: base64 da imagem persona (start ref). 1 dos {personaBase64, screenImage*} obrigatório."
},
"sourceImageId": {
"type": "string",
"description": "ID de imagem do gallery do próprio user (`generatedImages:_id`). Obrigatório pra mode=edit ou mode=variation, e pra action=upscale e action=sombra (a peça de origem). Use sapiens_gallery action=list pra descobrir IDs."
},
"negativePrompt": {
"type": "string"
},
"screenImageUrl": {
"type": "string",
"format": "uri",
"description": "Pra action=compose: URL da tela (Bunny CDN). Convex baixa server-side."
},
"sourceImageIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "IDs de imagens da SUA galeria (`generatedImages:_id` via sapiens_gallery) usadas como referência. Alternativa por-id ao referenceImageUrls pras suas próprias imagens (ownership checado). Soma com referenceImageUrls: até 5 no total, e o motor corta no teto dele quando é menor (ver referenceImageUrls)."
},
"personaMimeType": {
"type": "string"
},
"screenImageBase64": {
"type": "string",
"description": "Pra action=compose: base64 da tela. Alt: screenImageUrl."
},
"referenceImageUrls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"description": "URLs públicas de referência pra combinar numa geração só (character/style lock), igual ao modal 'Selecionar Referência' do gerador web. Fontes: sua galeria (sapiens_gallery, campo url), o Acervo, e personagens públicos (sapiens_character action=list_public → mainImageUrl/imageUrls). Restrito a hosts do Sapiens (Bunny CDN / Convex) + Wikimedia. Requer model com refs (o campo supportsReferences em action=models é a fonte): nano-banana-*, gpt-image-2-*, muse-image, flux-3, flux-3-klein, krea-3 e krea-3-high (cada ref soma no preço), seedream-*, grok-* (até 3), a família Klein (wavespeed-flux2 e wavespeed-klein-*, até 4), wavespeed-flux-nsfw (1), a família Krea 2 da WaveSpeed (wavespeed-krea2-realism, wavespeed-krea2 e wavespeed-krea2-transparencia; img2img: a primeira referência vira a imagem-base, 1 ref, e refStrength diz quanto dela fica) ou fal-krea2-* (referência de ESTILO, teto de 3). Soma com sourceImageIds: até 5 no total (acima disso o servidor recusa a chamada), e cada motor corta no seu teto quando ele é menor, SEM erro: a ref a mais some (nano-banana-2 e Klein 4, Grok 3, Krea 2 da WaveSpeed e Flux NSFW 1; o campo maxReferences em action=models é a fonte)."
},
"screenImageMimeType": {
"type": "string"
},
"transparentBackground": {
"type": "boolean",
"description": "FUNDO TRANSPARENTE: true devolve PNG com alpha, recortado pelo próprio motor na geração, pronto pra overlay, slide, sticker ou editor de vídeo, sem pagar o Remover Fundo depois. Mesmo preço da geração comum. Só nos motores com supportsTransparentBackground=true em action=models (hoje a linha GPT Image: gpt-image-2-low, gpt-image-2-high, gpt-image-2-5-flare, gpt-image-2-5-sunburst, gpt-image-2-6-flare e gpt-image-2-6-sunburst); em qualquer outro, inclusive no default nano-banana-2, o servidor recusa sem cobrar, então passe o model junto. No prompt, descreva SÓ o sujeito isolado ('a single red ceramic teapot, isolated subject, crisp edges, no shadow'), sem cenário nem chão: fundo descrito vira fundo pintado. A peça sobe em PNG (não webp) e volta em sapiens_gallery com transparentBackground=true. Se o motor devolver fundo chapado, a geração falha e estorna. Vale em action=generate."
}
},
"additionalProperties": false
}{
"title": "Gerar Imagem",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_meta
Utilitários transversais: start (porta de entrada do primeiro contato: sem login ensina a conectar; com login mostra saldo/tier + primeiros poderes com exemplo pronto + 'comece por aqui'), login (conecta a conta com o código de sapiensinteticos.com/conectar-claude, salva a sessão localmente; ela vale 90 dias e renova sozinha a cada uso), logout (desconecta de verdade: revoga a chave no servidor e apaga o token local), whoami (tier user/admin + saldo + email), credits (saldo agregado), subscription (plan + status + saldo por bucket subscription/grants/free + warnings low/critical), formats (schemas por formato), health (inclui a versão do MCP), version (qual versão do sapiens-mcp está REALMENTE rodando + se é a última do npm; não exige login; use pra saber se o client pegou a versão nova ou ficou preso em cache do npx), app_url (URLs canônicas), precos (a tabela de preço do membro em duas carteiras separadas, com regras próprias: app = cada motor do App em Sinapses, com o detalhe por resolução e por segundo de vídeo e o link do card em /motores; api = a API da conta, com saldo próprio em dólar: preço por imagem, a partir de no vídeo (o exato pela cotação grátis) e texto por milhão de tokens com midia=texto. Sinapse não se converte em dólar. Pra comparar com fal.ai, WaveSpeed ou outro serviço que cobra em dólar, use a parte api. midia recorta, busca filtra pelo nome), api (a conta da API da pessoa, SÓ LEITURA: saldo em dólar, livre, o que está preso em chamada aberta, crédito de teste e quando vence, gasto do dia, as chaves com nome, o fim e o teto do dia, nunca a chave nem o hash, a recarga automática no cartão ou em stablecoin e o rendimento; assinar, mover dinheiro, mudar o limite da carteira, ligar recarga e criar chave ficam no site, com a carteira dela e o segundo fator). Use credits/subscription antes de gerar imagem pra avisar se vai estourar; pra pagar em dólar, action=api diz o livre.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"code": {
"type": "string",
"description": "Código XXXX-XXXX gerado (logado) em sapiensinteticos.com/conectar-claude. Só pra action=login."
},
"busca": {
"type": "string",
"description": "Só pra action=precos: filtra pelo nome do motor ou do modelo da API (ex: 'seedance', 'nano banana'), sem acento nem caixa."
},
"midia": {
"enum": [
"imagem",
"video",
"musica",
"voz",
"texto",
"decidir"
],
"type": "string",
"description": "Só pra action=precos: recorta a tabela numa mídia. Sem ela vêm imagem, vídeo, música e voz (o texto da API é longo e só vem com midia=texto, com os modelos de preço variável em `texto.roteadores` e a parte `decidir`). midia=decidir traz só os modelos de decisão da API (o Laya): respondem sim ou não, uma opção ou uma nota, sem gerar texto."
},
"action": {
"enum": [
"start",
"login",
"logout",
"whoami",
"formats",
"health",
"credits",
"app_url",
"subscription",
"version",
"pontes",
"precos",
"api"
],
"type": "string"
}
},
"additionalProperties": false
}{
"title": "Conta & Utilitários",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_skill
As SKILLS da casa: o passo a passo travado de cada fluxo do Sapiens, servido pelo próprio connector (sem login, sem custo, sem rede). LEIA A SKILL ANTES DE OPERAR O FLUXO: é mais barato que errar uma geração que cobra Sinapses. Sub-actions: 'list' (índice vivo: slug + quando usar cada uma, grátis), 'get' (o SKILL.md inteiro, passe name=<slug>). Slugs: primeiros-passos | voz-da-casa | repertorio | musica | video | imagem | personagem | studio | forum-comunidade | companhia | trilhas | minha-voz | minha-soul | curriculo | pontes | publicar | carrossel | sapiens-api. O mesmo conteúdo também sai como resource MCP em skill://sapiens/<slug>/SKILL.md pra quem lê resources.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"name": {
"type": "string",
"description": "Slug da skill no action=get. Ex: 'musica', 'video', 'voz-da-casa'. Rode action=list se não souber."
},
"action": {
"enum": [
"list",
"get"
],
"type": "string",
"default": "list",
"description": "'list' devolve o índice (slug + quando usar) das skills da casa. 'get' devolve o SKILL.md inteiro de uma."
}
},
"additionalProperties": false
}{
"title": "Skills da Casa",
"readOnlyHint": true,
"openWorldHint": false
}sapiens_repertorio
Acervo pessoal de filme/série/anime/jogo/jogo de tabuleiro/livro/música/pessoa (Repertório, o segundo cérebro do user). Reads: list (filtros mediaType/status), search (texto em title/genres/tags), get (detalhe), popArticles, resolve (busca capa/ano/id nos providers server-side: OMDb/IGDB-Twitch/AniList/Google Books/iTunes/Wikidata). Mutations (qualquer logado, mexem no PRÓPRIO acervo): add_item, update_item (status/rating/tags/note/isPublic), remove_item. CAPTURA ONE-SHOT travada na lista de providers: quando o user fala natural ('acabei de ver Duna 2, nota 9', 'tô jogando Hollow Knight', 'li tal livro'), (1) infira mediaType e status (assisti/zerei/li=completed, quero=backlog, tô jogando/vendo=active, dropei=dropped) e rating se citado; (2) chame action=resolve {mediaType, query}, escolha o candidato certo e faça add_item passando SÓ o source + externalId DELE + os campos pessoais (status/rating/tags/note). O servidor re-resolve no provider e grava título/capa/ano canônicos, você NÃO manda título/capa nem inventa externalId. (3) Se o resolve não achar (lista vazia/providerKeyMissing), NÃO dá pra adicionar: diga ao user que não encontrou nos providers (não fabrique entry manual). Upsert/dedup por (userId, source, externalId). Só pergunte se ambíguo entre candidatos. FERRAMENTAS DE IA (Repertório de Ferramentas): fluxo separado (vêm do catálogo aitag, não dos providers de mídia). action=search_tools {query} acha a ferramenta no catálogo e devolve o toolId; action=add_tool {toolId, favorite?, rating?, note?} grava como mediaType 'tool' (estar no acervo já é 'usei'; favorite=true liga a estrela). Use quando o user fala 'adiciona o Midjourney/Cursor no meu repertório de ferramentas' ou 'uso tal ferramenta de IA'. Cada ferramenta aponta pra página dela no aitag. CATÁLOGO (ADMIN, o dono): action=catalog_tool cadastra no AItag uma ferramenta OPEN SOURCE que ainda não está lá {toolId, name, githubUrl, categoryEn, descriptionEn, descriptionPt, e de preferência reviewEn/reviewPt, websiteUrl, tags}; devolve created, toolId e a url aitag.app/tool/<toolId>. Idempotente: o mesmo repo (mesmo com outro toolId) devolve a ficha existente e só preenche a análise que estiver vazia, nunca sobrescreve. Rode search_tools antes; é a porta da skill achado. action=admin_tool (ADMIN, SÓ sob ordem explícita do dono: nota e afiliado são gesto dele) faz o que o aitag.app/admin faz, fechada inclusive: {toolId + só os campos a mudar: referralUrl (link de afiliado), nota (0-100), isCurated, isActive, isOpenSource, name, websiteUrl, githubUrl, categoryEn, descriptionEn/Pt, reviewEn/Pt, tags, xUrl, brandHandle, links (os endereços extras da ficha: pesos, pacote do ComfyUI, licença, doc; até 8, a lista troca a inteira)}. Ficha existente recebe os campos que vierem e sobrescreve; ficha nova pede name, categoryEn, descriptionEn, descriptionPt e websiteUrl (sem tracking, é dele que sai o screenshot). O servidor recusa e manda pro aitag.app/admin: o mesmo site ou repo com outro toolId (aponta a ficha que existe), outro nome, outro site ou outro repo numa ficha existente, referralUrl fora do site da ferramenta e de rede de afiliado que fale pela marca, e mexer em link, site ou no-ar de ficha com permanência paga. Devolve created, mudou e a url. SAPIENS (pessoas, ombros de gigantes; a aba no site chama Sapiens): mediaType 'person' cataloga gente que inspira (cineasta, mangaká, cientista, escritor) via Wikidata. Mesmo fluxo de mídia: resolve {mediaType:'person', query:'Osamu Tezuka'} → add_item com source 'wikidata' + o QID do candidato. O servidor grava foto, ocupações, bio e o link da Wikipedia; entra como completed (estar no acervo = me inspira). Use quando o user fala 'adiciona o Miyazaki nas minhas inspirações/nos meus sapiens/no meu repertório'. JOGO DE TABULEIRO (e de cartas; a aba no site chama Tabuleiro): mediaType 'boardgame', porque 'game' é videogame e o IGDB não conhece tabuleiro. Também via Wikidata: resolve {mediaType:'boardgame', query:'Galactic Cruise'} → add_item com source 'wikidata' + o QID do candidato. Busque pelo título em inglês, que é como a Wikidata cadastra; o designer vem no campo authors do candidato e separa homônimos. O servidor grava designers, editoras e o link da página do jogo no BGG. Lançamento muito recente pode ainda não estar na Wikidata: resolve vazio = diga isso à pessoa, não fabrique. Use quando o user fala 'joguei Catan', 'quero jogar Rebirth', 'adiciona esse jogo de tabuleiro'.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"name": {
"type": "string",
"description": "Pra catalog_tool/admin_tool: o nome do produto como o projeto escreve (HyperFrames, não hyperframes)."
},
"nota": {
"type": "integer",
"maximum": 100,
"minimum": 0,
"description": "Pra admin_tool: a nota da ficha no AItag, inteiro de 0 a 100. Ordena o catálogo."
},
"note": {
"type": "string",
"description": "Nota pessoal sobre a obra."
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"xUrl": {
"type": "string",
"description": "Pra admin_tool: o perfil da ferramenta no X (https://x.com/<handle>)."
},
"limit": {
"type": "integer",
"default": 100,
"maximum": 500,
"exclusiveMinimum": 0
},
"links": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"url"
],
"properties": {
"url": {
"type": "string"
},
"label": {
"type": "string"
}
},
"additionalProperties": false
},
"maxItems": 8,
"description": "Pra admin_tool: os outros endereços que a pessoa vem buscar e o site não cobre, na ordem da página (bloco 'Onde achar', abaixo da análise): os pesos de cada checkpoint, o pacote do ComfyUI, a licença, a doc. label curto (até 40: 'Turbo weights', 'ComfyUI repack'), url https pública. O repo do githubUrl já aparece sozinho, não repita. A lista troca a inteira; vazia tira todos. O post da casa aponta pra ficha, e é daqui que a pessoa segue: ficha de modelo aberto leva os pesos aqui."
},
"query": {
"type": "string",
"description": "Texto pra action=search."
},
"action": {
"enum": [
"list",
"search",
"get",
"popArticles",
"resolve",
"add_item",
"update_item",
"remove_item",
"search_tools",
"add_tool",
"catalog_tool",
"admin_tool"
],
"type": "string"
},
"itemId": {
"type": "string",
"description": "repertorioItems:_id (obrigatório pra get/update_item/remove_item)."
},
"rating": {
"type": [
"number",
"null"
],
"description": "0-10, nota da OBRA. Pra update_item: passe null pra remover rating. Pessoa (mediaType person) não leva rating: dar nota pra gente soa esquisito, o que ela fez ganha nota na ficha de cada obra. Não mande nem pergunte nota de pessoa."
},
"source": {
"enum": [
"tmdb",
"anilist",
"rawg",
"twitch",
"googlebooks",
"itunes",
"manual",
"wikidata"
],
"type": "string",
"description": "Pra add_item: o source EXATO de um candidato do action=resolve (manual=filme/série via OMDb, anilist, twitch=jogo, googlebooks, itunes, wikidata=pessoa ou jogo de tabuleiro). Não invente."
},
"status": {
"enum": [
"backlog",
"active",
"completed",
"paused",
"dropped"
],
"type": "string"
},
"tagsEn": {
"type": "array",
"items": {
"type": "string"
},
"description": "Pra catalog_tool/admin_tool: até 10 tags em inglês."
},
"tagsPt": {
"type": "array",
"items": {
"type": "string"
},
"description": "Pra catalog_tool/admin_tool: até 10 tags em português."
},
"toolId": {
"type": "string",
"description": "Pra add_tool: o toolId EXATO de um candidato do action=search_tools (catálogo aitag). Dedup por (userId, source aitag, externalId=toolId). Pra catalog_tool: o toolId NOVO da ficha, em kebab-case minúsculo (vira o endereço aitag.app/tool/<toolId>). Pra admin_tool: o toolId da ficha a editar (o do search_tools) ou o da ficha nova."
},
"userId": {
"type": "string",
"description": "users:_id (obrigatório pra list/search/lists). Descobre via sapiens_meta action=whoami."
},
"favorite": {
"type": "boolean",
"description": "Pra add_tool: marca a ferramenta como favorita (estrela). Estar no acervo já é 'usei'; favorita é o eixo separado de 'curto/indico'."
},
"isActive": {
"type": "boolean",
"description": "Pra admin_tool: false tira a ficha do ar sem apagar."
},
"isPublic": {
"type": "boolean"
},
"reviewEn": {
"type": "string",
"description": "Pra catalog_tool/admin_tool: a análise editorial em inglês, 3 a 5 frases na voz da casa. É o gate de indexação da página: sem ela, a ficha fica fora do Google."
},
"reviewPt": {
"type": "string",
"description": "Pra catalog_tool/admin_tool: a análise editorial em português."
},
"githubUrl": {
"type": "string",
"description": "Pra catalog_tool: o repo, https://github.com/<owner>/<repo>. É a chave do dedup: o mesmo repo com outro toolId devolve a ficha que já existe. Pra admin_tool: opcional; vindo, a ficha vira open source."
},
"isCurated": {
"type": "boolean",
"description": "Pra admin_tool: Staff Pick (curadoria da casa)."
},
"mediaType": {
"enum": [
"movie",
"series",
"anime",
"game",
"book",
"music",
"tool",
"person",
"boardgame"
],
"type": "string"
},
"categoryEn": {
"type": "string",
"description": "Pra catalog_tool/admin_tool: UMA destas, exata: Text & Writing, Image & Design, Video & Animation, Voice & Audio, Coding & Development, Marketing & SEO, Data Analysis & Productivity, Research & Education, Agents & Bots, Creative Automation, Privacy & Web3, Experimental Tools, Technical Utilities, Aggregators & Meta Tools, Adult 18+."
},
"categoryPt": {
"type": "string",
"description": "Pra catalog_tool/admin_tool: opcional; ausente, o servidor copia a de uma vizinha da mesma categoria."
},
"externalId": {
"type": "string",
"description": "Pra add_item: o externalId EXATO do candidato do resolve (imdbID p/ manual, id do provider p/ resto). NÃO fabrique/UUID: id que não resolve no provider é rejeitado. Dedup por (userId, source, externalId)."
},
"websiteUrl": {
"type": "string",
"description": "Pra catalog_tool/admin_tool: a homepage do projeto (https), sem tracking: é dela que sai o screenshot. Ausente, vale o githubUrl."
},
"brandHandle": {
"type": "string",
"description": "Pra admin_tool: o @ da marca, sem o @."
},
"referralUrl": {
"type": "string",
"description": "Pra admin_tool: o link do botão Visitar, com o código de afiliado do dono (https). Tem que cair no site da ferramenta (agensi.io/r/X sobre agensi.io) ou em rede de afiliado com a marca do site no subdomínio (<marca>.sjv.io, <marca>.pxf.io, <marca>.partnerlinks.io); tolt.link só troca link que já estava nele. Fora disso o servidor recusa e o link entra pelo aitag.app/admin. Ausente na ficha nova, vale o websiteUrl."
},
"isOpenSource": {
"type": "boolean",
"description": "Pra admin_tool: liga ou desliga o selo open source. Ausente na ficha nova, vale true se veio githubUrl."
},
"descriptionEn": {
"type": "string",
"description": "Pra catalog_tool/admin_tool: uma frase do que a ferramenta faz, em inglês (até 400)."
},
"descriptionPt": {
"type": "string",
"description": "Pra catalog_tool/admin_tool: a mesma frase em português (até 400)."
},
"containsSpoilers": {
"type": "boolean"
}
},
"additionalProperties": false
}{
"title": "Repertório",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_gallery
Browse, publicação e upload das imagens do user. Sub-actions: list (últimas N peças, com prompt/model/url + isPublic + acervoUrl; kind=image por default, kind=video traz os takes com posterUrl, a capa, e kind=all mistura. Depois de ingerir ou gerar vídeo, é o list kind=video que dá a capa pra mostrar miniatura + player em vez de link solto), get (1 imagem com metadados, opcionalmente base64), publish (torna a PRÓPRIA peça pública, imagem ou vídeo: a imagem entra na galeria pública + feed Pinterest e ganha página indexável /imagem/<id>, o vídeo ganha a /video/<id>, pela mesma régua do botão Publicar da ficha (peça oculta ou reprovada não publica, upload de fora também não, ingest da ponte sim); publicPageUrl volta null em peça +18 e de modelo degen; publicado NÃO despublica, não existe unpublish), upload (traz pra galeria uma peça gerada FORA da casa, por sourceUrl https, filePath local ou base64; ADMIN por ora), ingest (A PONTE, qualquer conta logada: peça que a PESSOA dirigiu com a ficha do personagem daqui e um motor de fora renderizou, no crédito dela (Kie, fal, Magnific, Sogni, a própria placa): entra NATIVA na timeline e nasce PRIVADA (isPublic false), publicável DEPOIS por ela como qualquer geração da casa, nunca sozinha, com custo 0 em Sinapses e o custo real guardado em externalCost; carrega o prompt VERBATIM, as referências da casa (referenceImageIds), o personagem (characterId) e o motor (externalEngine 'provedor-motor'); a peça chega por filePath (local, só no MCP instalado), sourceUrl (o render, baixado pelo MCP na máquina da pessoa, nunca pelo servidor) ou base64; o carimbo +18 nasce na entrada pela CLASSE do provedor (peso aberto como Sogni, Replicate, HF, fal, WaveSpeed, Civitai e a própria placa entram carimbados, só a curadoria tira; serviço com moderação como Kie, Magnific, Freepik, Krea entra sem) ou por unfiltered=true dito pela pessoa (carimbo dela, ela tira depois); idempotente por sourceUrl ou pelo hash do arquivo, então re-ingerir corrige a ficha em vez de duplicar; tetos 12 MB imagem, 60 MB vídeo, 40 por dia. A chave do provedor NUNCA passa por aqui: quem gerou foi o harness da pessoa. Passo a passo na skill 'pontes'), refs (acopla peças da casa como REFERÊNCIA numa peça que já existe, de upload ou de ingest; ADMIN, e só na própria peça), processo (O COMO JUNTO DO QUE: anexa a uma peça as peças que mostram como ela foi dirigida, o mapa de rota desenhado sobre o still, a prancha de frames com o tempo de cada marco, o antes e depois de duas rodadas; elas viram a seção 'Como foi feito' na página pública da peça, na ordem que você mandar e com a sua legenda por peça; qualquer membro, só na própria peça, teto de 12. É IRMÃ do refs e a diferença importa: refs é o INSUMO que entrou na geração, processo é o REGISTRO de como ela foi dirigida, e uma lista não mexe na outra. Peça de processo privada não aparece pra quem está de fora nem em miniatura: pra aparecer, publique ela também), cast (QUEM ESTÁ EM CENA numa peça que já existe, quando é mais de uma criatura: characterIds em ordem, o protagonista primeiro, e a peça passa a contar na ficha de todos eles em vez de sumir da segunda; qualquer membro, na própria peça), parts (O INTEIRO E OS PEDAÇOS de um vídeo: o clipe de 30s que foi montado a partir de dois takes de 15s, a fita longa feita de partes. COM imageId devolve a ficha de parentesco daquela peça, quais são as partes dela e de qual inteiro ela é parte, com a url do arquivo completo pra baixar. SEM imageId devolve o que AINDA NÃO FOI MONTADO: varre os takes soltos da conta, agrupa os que têm cara de par (mesmo personagem, mesmo período, prompt de 'Part one/Part two' ou arquivo terminando em -a/-b) e diz o PORQUE de cada agrupamento, pra você saber o que falta juntar antes de o autor perguntar. É heurística e não monta nada sozinha: adianta a descoberta, quem decide é quem lê. characterId filtra por personagem. Sem custo), link_parts (LIGA o inteiro aos pedaços: imageId é o vídeo montado e partIds são os takes NA ORDEM em que aparecem nele. O juntador da casa e o ingest que traz referências de vídeo já gravam esse laço sozinhos; esta porta é pra montagem feita FORA (ffmpeg na máquina, ingest do arquivo já pronto) e pra corrigir ligação errada. Só na própria peça, teto de 16 partes, e a lista TROCA o que estava gravado antes. Sem custo), reprovar (O VETO do dono: imageId + motivo, o porquê numa frase concreta. A peça que errou (rosto do personagem trocado, mão quebrada, a referência errada) não sai mais por porta nenhuma, fila do Distribution, publicar, Telegram, e some das levas do garimpo; fica no acervo com o porquê, pra ensinar. Chame NO MESMO TURNO em que o dono condena uma peça: peça condenada e não marcada volta numa leva. desfazer=true tira o veto. Imagem e vídeo, só na própria peça, sem custo), reprovadas (as peças vetadas da conta com o prompt que as gerou e o motivo, a mais recente primeiro; characterId filtra por personagem. LEIA ANTES de gerar de novo um personagem que já teve peça reprovada: é a lista do que não repetir. Sem custo), carimbo (o +18 da peça: imageId + adulta true liga, false tira, com a regra do botão da ficha: a curadoria mexe em qualquer carimbo, inclusive o que a ponte põe por classe de motor sem autor, e o dono liga na própria peça e só tira o que ele mesmo pôs. Peça carimbada não entra em praça sfw do Distribution, então tirar o carimbo de peça vestida destrava Instagram, TikTok, YouTube e LinkedIn; peça com nudez fica carimbada. Sem custo), apagar (APAGA DE VEZ a própria peça, imagem ou vídeo, pela mesma saída do botão de excluir da ficha: imageId + confirmar=true. A peça e o arquivo saem e não tem volta, então só depois que o dono pediu pra apagar AQUELA peça; peça que errou e deve ficar como lição vai por reprovar. Peça ainda gerando é recusada (apagar no meio cortaria o estorno: espere fechar ou falhar). Volta apagada=false, sem erro, quando não há peça com esse id na conta, inclusive ao repetir depois de um Timeout. Sem custo). Use list/get pra reusar imagem como referência (passe o imageId em sapiens_image mode=edit ou mode=variation) ou pra mostrar pro user o que ele já tem; publish quando o user quer divulgar a peça dele (imagem ou vídeo). IMPORTANTE sobre upload: a peça entra PRIVADA e continua privada: o servidor recusa publicar e recusa compartilhar na comunidade, porque ela é do usuário e a responsabilidade é dele. O caminho pra ela virar coisa pública é usar como referência numa geração daqui e publicar o resultado. O refs escreve só proveniência (de que ficha/folha a peça nasceu): não promove nada, e um upload continua sem publicar depois de ganhar referência. COMO A PEÇA FOI FEITA: list aceita skill=<slug> e devolve só o que saiu daquela skill (o mesmo slug que sapiens_image gravou em skills), com a busca varrendo as últimas 200 peças antes de cortar no limit; cada item volta com o campo skills, e null ali quer dizer que ninguém marcou, não que foi feita sem skill.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"kind": {
"enum": [
"image",
"video",
"all"
],
"type": "string",
"description": "action=list: que mídia listar. 'image' (default) é o de sempre; 'video' traz só os takes, cada um com `posterUrl` (a capa) e `acervoUrl` (a ficha); 'all' mistura. Use kind=video depois de uma leva de ingest ou de geração de vídeo: é o que permite MOSTRAR a peça (capa + player) em vez de devolver link solto. posterUrl null = capa ainda em produção, volte em alguns segundos."
},
"note": {
"type": "string",
"description": "action=upload: o que é a peça (prompt original, contexto). Vira a descrição na galeria e a busca acha por ela."
},
"size": {
"type": "string",
"description": "action=ingest: resolução ('720p', '1080p'). Default 720p."
},
"limit": {
"type": "integer",
"maximum": 100,
"description": "Default 20. Max 100. Pra action=list (e action=reprovadas, teto 60). Sem offset: com filtro de model ou skill a busca varre só as últimas 200 peças. Pra achar o imageId de peça que não é de hoje, use sapiens_reference action=browse bucket=history term=<palavra> (paginado, devolve o imageId) ou sapiens_reference action=resolve handle=img_xxx.",
"exclusiveMinimum": 0
},
"model": {
"type": "string",
"description": "Filtro de model (action=list). Ex: 'nano-banana-max' pra ver só Pro."
},
"skill": {
"type": "string",
"description": "Filtro por SKILL que dirigiu a peça (action=list): devolve só o que saiu daquela skill, pelo slug exato que a geração gravou (ex: 'camarim', 'escala-gigantismo'). É o que responde 'me mostra tudo que saiu do camarim'. Com filtro, a busca varre as últimas 200 peças antes de cortar no limit, então acha coisa antiga. Peça sem marcação nenhuma volta com skills null e nunca casa com filtro."
},
"action": {
"enum": [
"list",
"get",
"publish",
"upload",
"ingest",
"refs",
"processo",
"cast",
"parts",
"link_parts",
"reprovar",
"reprovadas",
"carimbo",
"apagar"
],
"type": "string"
},
"adulta": {
"type": "boolean",
"description": "action=carimbo: true LIGA o carimbo +18 na peça, false TIRA. Obrigatório nessa action. A regra é a do botão da ficha: a curadoria (admin) liga e tira qualquer carimbo, inclusive o que a ponte põe por CLASSE de motor sem autor; o dono liga na própria peça e só tira o carimbo que ele mesmo pôs. Peça carimbada não entra em praça de teto sfw do Distribution (Instagram, TikTok, YouTube, LinkedIn): tirar o carimbo de peça vestida é o que destrava a fila. Não tire carimbo de peça com nudez."
},
"base64": {
"type": "string",
"description": "action=upload/ingest: os bytes já em base64, se você mesmo os tem em mãos (imagem; vídeo vai por filePath ou sourceUrl)."
},
"motivo": {
"type": "string",
"maxLength": 500,
"description": "action=reprovar: O PORQUÊ do veto, numa frase concreta que a próxima geração consegue usar ('trocou o rosto da Helen: gerada só com influencerId, sem as refs do passaporte'; 'mão esquerda com seis dedos'). É a lição que fica na peça: sem ele, reprovar só esconde e não ensina. Até 500 caracteres. Reprovar de novo sem motivo mantém o que já estava escrito."
},
"prompt": {
"type": "string",
"description": "action=ingest: o PROMPT DE GERAÇÃO, copiado inteiro do motor externo, exatamente como foi enviado. É o que a ficha mostra e a busca acha, e é o que permite regerar a peça depois. NÃO escreva aqui nota, resumo, título ou comentário sobre a peça: isso deixa a ficha sem sentido pra quem abrir. Re-ingerir a mesma sourceUrl com um prompt novo CORRIGE o que já está gravado, sem duplicar."
},
"skills": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
],
"description": "action=ingest: COMO A PEÇA FOI FEITA, os slugs das skills da casa que dirigiram o take (ex: ['clipe'], ['rasante','storyboard']). Aparece como 'Feito com /clipe' na ficha e na página pública da peça. No Claude Code com o plugin Sapiens o hook carimba sozinho; em outro cliente, passe sempre que o take saiu de uma skill da casa. Re-ingerir SOMA às que já estavam, nunca apaga. Metadado puro: não muda custo nem alcance."
},
"imageId": {
"type": "string",
"description": "generatedImages:_id (obrigatório pra action=get/publish/refs/cast/processo, e em link_parts é o vídeo INTEIRO). Em action=parts é OPCIONAL: com ele vem a ficha de parentesco daquela peça, sem ele vem o que ainda não foi montado na conta inteira."
},
"partIds": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
],
"description": "action=link_parts: os PEDAÇOS que viraram o vídeo inteiro, NA ORDEM em que aparecem nele (take A, depois take B). generatedImages:_id de vídeo seu, teto de 16, aceita lista ou os ids separados por vírgula. A lista TROCA o que estava gravado antes, então mande sempre todas as partes, não só a que faltou."
},
"replace": {
"type": "boolean",
"description": "action=refs: false (default) SOMA às referências que já existem; true troca a lista inteira. Pra limpar tudo, mande a lista vazia com replace=true."
},
"desfazer": {
"type": "boolean",
"description": "action=reprovar: true TIRA o veto (a peça volta a poder sair e a entrar nas levas), e o motivo vai junto. Ausente/false reprova."
},
"filePath": {
"type": "string",
"description": "action=upload/ingest: caminho ABSOLUTO de um arquivo local: no upload só imagem (png, jpg, webp, gif, avif), no ingest também mp4 e mov. O conteúdo é conferido pelos bytes antes de subir, e arquivo que não é peça é recusado sem ser enviado. SÓ no MCP instalado (stdio): é a porta de quem gerou na própria máquina ou baixou o render antes; no remoto use sourceUrl. No ingest, o sha256 do arquivo vira a chave de idempotência."
},
"mimeType": {
"type": "string",
"description": "action=upload/ingest: tipo do arquivo (image/png, video/mp4...). Detectado sozinho a partir da URL/extensão/resposta HTTP quando omitido. Em filePath e base64 vale o tipo que os bytes mostram, não este."
},
"processo": {
"type": "array",
"items": {
"type": "object",
"required": [
"sourceImageId"
],
"properties": {
"label": {
"type": "string",
"maxLength": 80,
"description": "Uma linha do que aquela peça mostra: \"Mapa de rota\", \"Antes e depois\", \"Os 8 tempos do take\". É o que aparece embaixo da miniatura na página pública."
},
"sourceImageId": {
"type": "string",
"description": "generatedImages:_id da peça de PROCESSO (a sua, já no acervo)."
}
},
"additionalProperties": false
},
"maxItems": 12,
"description": "action=processo: as peças de processo, NA ORDEM em que o processo aconteceu (o still, o mapa, a prancha). Teto de 12."
},
"confirmar": {
"type": "boolean",
"description": "action=apagar: tem que vir true. Apagar não tem volta (a peça e o arquivo saem), então a tool recusa sem ele: só mande depois que o dono pediu pra apagar AQUELA peça. Peça que errou e deve ficar como lição vai por action=reprovar."
},
"sourceUrl": {
"type": "string",
"description": "action=upload/ingest: URL https direta da peça pronta no motor de fora (o link do render da Kie, da fal, da Magnific). No ingest ela também é o RASTRO e a chave de idempotência: repetir a mesma sourceUrl corrige a ficha em vez de duplicar. Quem baixa é o cliente MCP (na sua máquina, no stdio; no remoto, o servidor do site): URL de render expira (Kie em 24h, Magnific no mesmo dia), então ingira no mesmo turno do render. Alternativa a filePath/base64."
},
"unfiltered": {
"type": "boolean",
"description": "action=ingest: true quando o motor rodou SEM filtro de conteúdo (modo livre, spicy, uncensored) num serviço que normalmente modera. A peça nasce com o carimbo +18 da casa DECLARADO por você (você pode tirar depois na ficha): publica, fica no seu perfil e no link direto, e sai da vitrine anônima e dos feeds. Não precisa dizer pra provedor de peso aberto (Sogni, Replicate, Hugging Face, fal, WaveSpeed, Civitai, a própria placa): esses já entram com o carimbo por CLASSE, que só a curadoria tira, igual ao motor sem freio da casa. Serviço com moderação (Kie, Magnific, Freepik, faceless, Krea, Midjourney, Runway, Higgsfield) entra sem carimbo, a menos que você diga isto ou o nome do motor tenha '-spicy', '-nsfw', '-uncensored'."
},
"aspectRatio": {
"type": "string",
"description": "action=ingest: proporção da peça ('16:9', '9:16'). Default 16:9."
},
"characterId": {
"type": "string",
"description": "action=ingest: o personagem de quem é a peça (influencers:_id, ache com sapiens_character action=list_mine). A peça nasce ligada à ficha, igual ao que sai dos motores da casa: conta no personagem e resolve a miniatura dele. PODE OMITIR quando as referenceImageIds já são peças da casa feitas com aquele personagem (folha de storyboard, ficha): o servidor deduz o personagem da primeira ref que tem um. O que você diz aqui manda sobre o que ele deduz. Re-ingerir a mesma sourceUrl com characterId AMARRA uma peça que já entrou sem personagem, sem trocar o id. Aceita personagem seu ou público. Em action=reprovadas, FILTRA as vetadas daquele personagem."
},
"characterIds": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
],
"description": "QUEM ESTÁ EM CENA, quando é mais de uma criatura (action=ingest e action=cast). Em ordem de cena: o PRIMEIRO é o protagonista (é ele que a ficha e o cartão do vídeo mostram) e o resto vira elenco, então a peça conta na ficha de TODOS eles em vez de sumir da segunda. Teto de 6. Use quando a fita foi dirigida com duas folhas de personagem: sem isto, ela aparece só na ficha de um. Aceita lista ou os ids separados por vírgula, personagem seu ou público. Pra peça de uma criatura só continue usando characterId."
},
"externalCost": {
"type": "string",
"description": "action=ingest: quanto custou lá fora, em texto livre ('4200 créditos Freepik'). A peça entra com 0 Sinapses, então é isto que preserva o custo real no histórico."
},
"includeBase64": {
"type": "boolean",
"description": "Default false. Quando true, action=get devolve os bytes em base64 (pesado, evite em listagens)."
},
"externalEngine": {
"type": "string",
"description": "action=ingest: qual motor renderizou, sempre no formato provedor-motor ('kie-kling-3.0', 'fal-krea-2', 'magnific-minimax-h3', 'sogni-minimax-h3', 'bancada-ltx-2.5'). É ESTE campo que a ficha da peça mostra em 'Motor', então a marca sozinha ('kie', 'magnific') é recusada pelo servidor: provedor é a loja, não o motor. O provedor decide o carimbo +18 na entrada: peso aberto (sogni-, replicate-, hf-, fal-, wavespeed-, civitai-, bancada-, comfy-, local-) ou provedor que a casa não conhece entra com o carimbo por classe (publica e fica no perfil, só não vai pra vitrine anônima); serviço com moderação (kie-, magnific-, freepik-, faceless-, krea-, midjourney-, runway-, higgsfield-, modelark-) entra sem."
},
"uploadedSource": {
"type": "string",
"description": "action=upload: de onde veio ('magnific', 'suno', 'camera'). Fica registrado na peça e no aviso do Discord."
},
"referenceImageIds": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
],
"description": "action=ingest/refs: generatedImages:_id das peças DA CASA que serviram de referência (folha de storyboard, ficha de personagem, frame inicial). Ficam acopladas à peça e aparecem na ficha dela: é o que prova que a receita saiu daqui. Se alguma delas foi feita com um personagem, a peça HERDA esse personagem sozinha (no ingest, e no refs quando a peça ainda não tem um). Só peça sua entra, no máximo 8. Aceita lista ou os ids separados por vírgula."
}
},
"additionalProperties": false
}{
"title": "Galeria de Imagens",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_community
Chat da comunidade Sapiens (assinantes + alumni). Sub-actions: list (últimas N mensagens da sala 'geral' por default), send (Claude posta como intercessor do user; sufixo '· via Claude' é adicionado pelo servidor), react (toggle emoji numa mensagem, allowlist 👍🔥❤️🚀🤯), participants (quem está na sala: username/name/isBot + o `mention` pronto pra usar, use pra saber com quem falar), search_users (acha alguém por parte do nome/@username, autocomplete de menção). MENÇÃO: escreva '@username' no content do send e o servidor NOTIFICA a pessoa citada (sino + Telegram); descubra o username certo via participants/search_users antes. ANEXO do PRÓPRIO acervo no send: mediaAssetKind (track|video|film|comic) + mediaAssetId monta um card da peça (posse conferida no servidor); asTese=true posta a fala como TESE (card de marca, pingável pro Fórum). Voz nas postagens deve seguir o DNA editorial Sapiens (anti-corporate, primeira pessoa, sem em-dash).
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"emoji": {
"type": "string",
"description": "Emoji da reação (action=react). Allowlist do server: 👍 🔥 ❤️ 🚀 🤯"
},
"limit": {
"type": "integer",
"maximum": 100,
"description": "Pra action=list. Default 30, max 100.",
"exclusiveMinimum": 0
},
"query": {
"type": "string",
"description": "Pra action=search_users: prefixo/parte do nome ou @username pra achar quem está na sala (autocomplete de menção). Devolve até ~8 candidatos com o username pra você marcar no send."
},
"action": {
"enum": [
"list",
"send",
"react",
"participants",
"search_users"
],
"type": "string"
},
"asTese": {
"type": "boolean",
"description": "Pra action=send: posta a fala como TESE (card de marca no chat, pingável pro Fórum). Sem custo."
},
"content": {
"type": "string",
"description": "Texto da mensagem (action=send). Max ~487 chars (suffix '· via Claude' adicionado pelo servidor). Use voz Sapiens. Marque alguém com '@username' (descubra o username via action=participants) pra notificá-lo."
},
"replyTo": {
"type": "string",
"description": "communityChatMessages:_id da mensagem que está respondendo (action=send opcional)."
},
"roomSlug": {
"type": "string",
"description": "Default 'geral'. Pra criar sala nova precisa do admin no site."
},
"messageId": {
"type": "string",
"description": "communityChatMessages:_id (obrigatório pra action=react)."
},
"mediaAssetId": {
"type": "string",
"description": "Pra action=send com mediaAssetKind: o id da peça no acervo. Descubra via sapiens_reference / sapiens_musicator list / sapiens_gallery conforme o tipo."
},
"mediaAssetKind": {
"enum": [
"track",
"video",
"film",
"comic"
],
"type": "string",
"description": "Pra action=send: anexa uma peça do SEU acervo como card (track=faixa do Musicator, video=vídeo gerado, film=Vídeo Programático, comic=tirinha). Requer mediaAssetId. O servidor confere que a peça é sua e está pronta."
}
},
"additionalProperties": false
}{
"title": "Chat da Comunidade",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_write
Artigos self-serve do PRÓPRIO usuário (qualquer conta logada, não só admin): espaço pessoal, aparece em /u/<username>, NÃO é o blog editorial. ESCOLHA A PORTA CERTA: texto que a PESSOA já escreveu vai em create (GRÁTIS, nada reescrito); IA só entra em generate (400 Sinapses). Gerar e depois sobrescrever com o texto original é queimar 400 à toa. Sub-actions: create (salva o texto pronto do autor: title obrigatório + content markdown; nasce rascunho, custo 0; brandSlug veste a peça com um design system (omitido, herda o padrão da conta) e é o que faz capa e imagens saírem no estilo DELE, não no da casa; coverImageId/coverImageUrl anexam uma capa que ele já tem, também de graça), generate (gera 1 artigo na voz Sapiens a partir de brief livre, ou reescrevendo um artigo publicado/texto teu; custa 400 Sinapses, reembolsa se falhar; salva como rascunho. Capa: por padrão gera uma capa-cortesia grátis, já no design system do autor quando ele tem um; se você JÁ tem a imagem (gerou via sapiens_image, ou o artigo é sobre ela), passe coverImageId (id da tua galeria) ou coverImageUrl (host Sapiens) pra ELA virar a capa em vez da cortesia), list (teus artigos), get (1 artigo teu por id, corpo completo), update (edita title/content/excerpt/tldr), publish (publish=true publica no teu perfil, false volta pra rascunho). Identidade vem do sessionToken; cobra as Sinapses do dono do token. Pra blog editorial curado (owner-only) use sapiens_article. NOTA (generate): é SÍNCRONA (texto + capa) e cai na REGRA DO TIMEOUT; sem idempotência, repetir às cegas cria um 2º rascunho e cobra 400 de novo (cheque action=list antes; o artigo do timeout fica salvo como rascunho).
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "create: até 8 tags específicas. Opcional."
},
"tldr": {
"type": "string"
},
"brief": {
"type": "string",
"description": "Briefing livre (1 parágrafo, até ~600 palavras). Caminho padrão de 'generate'. A IA expande na voz Sapiens. Custa 400 Sinapses. Pra texto que VOCÊ já escreveu, use action=create (de graça)."
},
"limit": {
"type": "integer",
"maximum": 100,
"description": "Default 50. Max 100. Só pra action=list.",
"exclusiveMinimum": 0
},
"title": {
"type": "string",
"description": "Obrigatório em create. Em update, renomeia."
},
"action": {
"enum": [
"create",
"generate",
"list",
"get",
"update",
"publish"
],
"type": "string"
},
"content": {
"type": "string",
"description": "Markdown completo do corpo. Em create, é o teu texto na íntegra (nada é reescrito). Em update, substitui o conteúdo."
},
"excerpt": {
"type": "string"
},
"publish": {
"type": "boolean",
"description": "action=publish: true publica no teu perfil (/u/<username>), false volta pra rascunho. Default true."
},
"category": {
"type": "string",
"description": "create: categoria do artigo (ex: 'filosofia-tech'). Opcional."
},
"articleId": {
"type": "string",
"description": "user_articles:_id (obrigatório pra get/update/publish)."
},
"brandSlug": {
"type": "string",
"description": "create: design system que veste a peça (slug via sapiens_brand action=list). Omitido, herda o padrão da tua conta. É o que faz a capa e as imagens saírem no TEU estilo, não no da casa."
},
"sourceKind": {
"enum": [
"brief",
"published_article",
"user_article"
],
"type": "string",
"description": "Default 'brief'. 'published_article' reescreve um artigo do blog (passe publishedArticleId); 'user_article' reescreve um texto teu (passe sourceUserArticleId)."
},
"voiceStyle": {
"type": "string",
"description": "Preset de tom da voz (opcional)."
},
"customVoice": {
"type": "string",
"description": "Instrução de voz custom (opcional)."
},
"voiceSource": {
"enum": [
"sapiens",
"minha",
"sintetico"
],
"type": "string",
"description": "Qual voz molda o texto: 'sapiens' (default, piso da casa) | 'minha' (a tua alma, destilada do teu rastro) | 'sintetico' (a alma do teu Sintético, se tiveres um acordado em Sintonia). Omitido = comportamento igual a 'sapiens'."
},
"coverImageId": {
"type": "string",
"description": "Capa PRONTA (opcional, vale em create e generate): id de uma imagem da TUA galeria (generatedImages:_id, ache via sapiens_gallery/sapiens_reference) que vira a capa do artigo em vez da capa-cortesia gerada do zero. Use quando você JÁ gerou a imagem (sapiens_image) e o artigo é sobre ela: assim a peça não nasce sem capa se a cortesia falhar."
},
"coverImageUrl": {
"type": "string",
"format": "uri",
"description": "Alternativa a coverImageId: URL de imagem do Sapiens (Bunny CDN / Convex) pra usar como capa pronta. Host fora da allowlist é recusado."
},
"repertorioItemIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5,
"description": "Até 5 ids de obras do Repertório do usuário (repertorioItems:_id) pra IA usar como lente/referência do texto (sinopse + nota do dono entram no prompt). Ache os ids via sapiens_repertorio (action=list/search). Só do próprio usuário; ids de outros são ignorados."
},
"publishedArticleId": {
"type": "string",
"description": "articles:_id (quando sourceKind='published_article')."
},
"sourceUserArticleId": {
"type": "string",
"description": "user_articles:_id (quando sourceKind='user_article')."
}
},
"additionalProperties": false
}{
"title": "Artigos do Perfil",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_search
Busca substring case-insensitive em title/excerpt/tldr/slug/tags dos artigos. Filtros opcionais: column ('sapiens'/'repertorio'), format ('short'/'essay'/'pop-article'), status ('draft'/'published'/'archived'), tag exato. Default limit 30 (max 100). Use pra achar slug/id de artigo pré-existente antes de editar/publicar/deletar via sapiens_article.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"tag": {
"type": "string",
"description": "Match exato em tags[] do article. Ex: 'foss', 'estoico', 'sapiens-column'."
},
"limit": {
"type": "integer",
"maximum": 100,
"description": "Default 30, max 100.",
"exclusiveMinimum": 0
},
"query": {
"type": "string",
"description": "Substring pra buscar (min 2 chars)."
},
"column": {
"type": "string",
"description": "Default: todos. 'sapiens' (Coluna) ou 'repertorio' (Coluna Repertório) são os mais usados."
},
"format": {
"type": "string",
"description": "Ex 'short', 'essay', 'pop-article', 'long'."
},
"status": {
"enum": [
"draft",
"published",
"archived"
],
"type": "string",
"description": "Default: todos. Use 'published' pra evitar drafts no resultado."
}
},
"additionalProperties": false
}{
"title": "Buscar Artigos",
"readOnlyHint": true,
"openWorldHint": true
}sapiens_studios
O SEU studio (o perfil de EMPRESA da casa do user) + o catálogo dos estúdios/experimentos Sapiens. Sub-actions: mine (o studio do user: nome/endereço público/marca/operador/tamanho do time), create (FUNDA um studio novo, exige name; nasce NO AR com endereço público, sem rascunho, de graça, teto de 8 por pessoa), list (catálogo com URL+status+tags+mcpReady), get (detalhe de 1 slug), publishable_url (formata URL /articles/<slug>). Use quando user pergunta 'que estúdios existem', 'qual o meu studio', ou diz 'quero abrir/fundar meu studio', 'criar a página da minha empresa'. Estúdios cobertos: helen-voice, musicator, persona-sapiens, sapiens-video, text-post-builder, carrosel-editorial, comunidade, repertorio.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"name": {
"type": "string",
"description": "Pra action=create: o nome da casa (obrigatório). O endereço público sai daí, em kebab-case. Pergunte ao user, não invente."
},
"slug": {
"type": "string",
"description": "Alternativa a publishableId: passe o slug direto."
},
"action": {
"enum": [
"list",
"get",
"publishable_url",
"mine",
"create"
],
"type": "string",
"description": "mine = o SEU studio (a página de portfólio da sua casa): nome, endereço público, marca, operador e tamanho do time. create = FUNDA um studio novo na conta do user (exige 'name'). Nasce NO AR, com endereço público e ele como fundador (studio não tem rascunho); vestir a página é na própria página. Teto de 4 por pessoa. list/get = catálogo de estúdios da casa. publishable_url = URL de artigo."
},
"studio": {
"type": "string",
"description": "Pra action=get: slug do estúdio (ex 'helen-voice', 'musicator', 'persona-sapiens', 'sapiens-video')."
},
"brandSlug": {
"type": "string",
"description": "Pra action=create: marca da casa (slug de sapiens_brand). Opcional. Só passa marca que é do user."
},
"description": {
"type": "string",
"description": "Pra action=create: uma linha do que a casa faz (até 200 chars). Opcional, mas é o que aparece embaixo do nome na página."
},
"publishableId": {
"type": "string",
"description": "Pra action=publishable_url: ID do publishable. Retorna URL canônica /articles/<slug>."
}
},
"additionalProperties": false
}{
"title": "Meu Studio & Estúdios",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_persona
Persona Sapiens: teste de personalidade (as 16 personas, na espinha de Jung) + perfil do user + arte dos 16 arquétipos. PRIMÁRIO (de graça, qualquer logado): get_quiz (48 perguntas Likert 1..7 + escala, estático, Claude aplica conversando), submit_quiz (manda as 48 respostas {questionId,value}, scoring server-side, salva no perfil; refazer cria profile novo), my_profile (lê tipo atual + persona + breakdown dos 4 eixos com confiança + histórico). SECUNDÁRIO: list_codes (16 codes + grupo NT/NF/SJ/SP, estático), list_generated (personaArtData.getAll, quais artes já existem), generate (arte de 1 arquétipo, 450 Sinapses, combina com 'gera a arte do meu tipo' depois do quiz). Codes: INTJ/INTP/ENTJ/ENTP/INFJ/INFP/ENFJ/ENFP/ISTJ/ISFJ/ESTJ/ESFJ/ISTP/ISFP/ESTP/ESFP.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"code": {
"enum": [
"ESFJ",
"ISFJ",
"ESTJ",
"ISTJ",
"ESFP",
"ISFP",
"ESTP",
"ISTP",
"ENFP",
"INFP",
"ENFJ",
"INFJ",
"ENTP",
"INTP",
"ENTJ",
"INTJ"
],
"type": "string",
"description": "Pra action=generate: código de 4 letras (ex INTJ) a gerar a arte. Case-insensitive (normaliza pra maiúscula)."
},
"nome": {
"type": "string",
"description": "Pra action=submit_quiz: nome opcional pra personalizar o resultado salvo."
},
"action": {
"enum": [
"my_profile",
"get_quiz",
"submit_quiz",
"list_codes",
"list_generated",
"generate"
],
"type": "string"
},
"answers": {
"type": "array",
"items": {
"type": "object",
"required": [
"questionId",
"value"
],
"properties": {
"value": {
"type": "integer",
"maximum": 7,
"minimum": 1
},
"questionId": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Pra action=submit_quiz: as 48 respostas { questionId, value 1..7 }. Pegue os IDs/perguntas com action=get_quiz e colete tudo antes."
},
"vinculoAnswers": {
"type": "array",
"items": {
"type": "object",
"required": [
"questionId",
"value"
],
"properties": {
"value": {
"type": "integer",
"maximum": 7,
"minimum": 1
},
"questionId": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "Pra action=submit_quiz: as 8 respostas do bloco da casa (par de jogo, ids vn-*). Opcional, mas recomendado: destrava o modo de parceiro e a calibração do Sintético."
}
},
"additionalProperties": false
}{
"title": "Personalidade e teste",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_helen
Helen Voice TTS via ElevenLabs, Google Gemini ou Fish Audio (qualquer logado; cobra Sinapses). Sub-actions: list_presets (catálogo de voiceIds/voiceNames recomendados + stylePreambles), speak (sintetiza, retorna audioBase64+mimeType+sizeBytes). provider=fish é o S2.1 Pro, o mais forte em japonês, mandarim e coreano: fala de personagem e cena de anime pedem ele; com modelId='drama-3' vira o Drama 3, a fala dirigida (direção escrita no próprio text, [sussurrando] ou <emphasis>palavra</emphasis>). `language` escolhe o idioma (auto|pt|en|ja|es|ko|zh|fr|it|de). A fala sai sempre em Sinapses: a casa não recebe chave de provedor, e clientApiKey é recusado sem cobrar. Custo pelo tamanho do texto, igual em todo motor e modelo: 500 Sinapses por 1.200 caracteres, mínimo 50 (a fala cheia de 5.000 caracteres sai por 2.084 Sinapses); fala repetida sai do cache sem cobrar. Max 5000 chars (quebra antes em chunks). text pré-processado pelo caller (sem em-dash, sem markdown).
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"text": {
"type": "string",
"description": "Texto a falar (action=speak). Max 5000 chars. Cobra pelo tamanho, igual em todo motor: 500 Sinapses por 1.200 caracteres, mínimo 50."
},
"store": {
"type": "boolean",
"description": "action=speak: a fala gerada entra no acervo da pessoa como faixa privada ('Fala da Helen'), uma vez por texto e voz. false deixa ela fora, pra fala descartável (teste, resposta de bot). A resposta que vem do cache não cria faixa."
},
"action": {
"enum": [
"speak",
"list_presets"
],
"type": "string"
},
"modelId": {
"type": "string",
"description": "ElevenLabs: 'eleven_v3' (default) ou 'eleven_multilingual_v2'. Google: 'gemini-3.8-flash-tts' (default, Gemini 3.8 Flash TTS, fala as vozes nativas em português) ou 'gemini-3.1-flash-tts-preview' (só as clássicas; voz nativa pedida nele sai pelo 3.8). Fish: 's2.1-pro-free' (S2.1 Pro, default) ou 'drama-3' (Drama 3: a direção vai no próprio text, '[sussurrando] frase' muda a atuação, '<emphasis>palavra</emphasis>' crava uma palavra; mesmo preço). Id desconhecido vira o padrão do motor: Gemini 3.8 Flash TTS no Google, S2.1 Pro no Fish."
},
"voiceId": {
"type": "string",
"description": "ElevenLabs voice_id (obrigatório se provider=elevenlabs). Use list_presets pra ver opções."
},
"language": {
"enum": [
"auto",
"pt",
"en",
"ja",
"es",
"ko",
"zh",
"fr",
"it",
"de"
],
"type": "string",
"description": "Idioma da fala. Cada motor recebe no dialeto dele; fish e google detectam pelo texto, então lá isto é informativo. Default pt."
},
"provider": {
"enum": [
"elevenlabs",
"google",
"fish"
],
"type": "string",
"description": "elevenlabs (inglês expressivo), google (Gemini TTS) ou fish (S2.1 Pro, o melhor em japonês e nas línguas asiáticas; ou Drama 3 com modelId='drama-3', a fala dirigida). Os três cobram igual. Default elevenlabs."
},
"clientApiKey": {
"type": "string",
"description": "DESLIGADO desde 27/09/2026: a casa não recebe chave de provedor. Não mande: a chamada é recusada sem cobrar. A fala sai sempre em Sinapses."
},
"languageCode": {
"type": "string",
"description": "ElevenLabs: ex 'pt' pra PT-BR otimizado. Vence o `language` quando os dois vêm."
},
"outputFormat": {
"type": "string",
"description": "ElevenLabs ex 'mp3_44100_128'. Default da provider."
},
"stylePreamble": {
"type": "string",
"description": "Google: prefixo de instrução de mood ('Read this in a thoughtful tone:'), conta no tamanho cobrado. Não suportado em ElevenLabs."
},
"voiceSettings": {
"type": "object",
"properties": {
"speed": {
"type": "number"
},
"style": {
"type": "number",
"maximum": 1,
"minimum": 0
},
"stability": {
"type": "number",
"maximum": 1,
"minimum": 0
},
"similarity_boost": {
"type": "number",
"maximum": 1,
"minimum": 0
},
"use_speaker_boost": {
"type": "boolean"
}
},
"description": "ElevenLabs voice_settings. Default razoável: stability=0.45, similarity_boost=0.75, style=0.30.",
"additionalProperties": false
},
"fishReferenceId": {
"type": "string",
"description": "Fish: id da voz no acervo do fish.audio, só na conta admin. No membro o servidor ignora e a fala sai na voz da casa."
},
"googleVoiceName": {
"type": "string",
"description": "Google prebuilt voice. Clássicas (Kore, Puck, Charon...) valem em todo modelo; nativas em português (ids 'pt-br-<papel>-<n>' e 'pt-pt-<papel>-<n>', ex 'pt-br-podcaster-1', 'pt-br-storyteller-6', 'pt-pt-tutor-3') só existem no Gemini 3.8 e soam como gente do Brasil ou de Portugal, sem forçar sotaque por prompt. Default Kore. Use list_presets pra ver opções."
}
},
"additionalProperties": false
}{
"title": "Voz Helen (TTS)",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_musicator
Musicator: loop completo de música via voz Sapiens, sem precisar da UI (qualquer logado; lyrics 300 / render 3000 Sinapses). Sub-actions: 'create' (cria brief+track draft num passo, custo 0, devolve trackId), 'lyrics' (gera letra PT + stylePrompt EN; passe trackId pra GRAVAR na track e deixar pronta pra render, ou sem trackId pra só receber o texto inline; 300 sinapses), 'list' (suas tracks: id/título/status/áudio), 'get' (detalhe de uma track pra acompanhar render, status/áudio/letra), 'render' (schedula o synth num trackId pronto, assíncrono fire-and-forget, 3/min; `model` escolhe o motor: 'pro' Lyria 3.5 (default), 'clip' Lyria 3 Clip, 'mureka' Mureka 9.5, 'minimax' MiniMax Music 2.6, 'elevenlabs' ElevenLabs Music com `durationSeconds` 30/60/120/180; preço fixo por faixa, menos o ElevenLabs, que cobra pela duração: puxe a skill 'musica' pra tabela antes de disparar), 'publish' (publica uma faixa PRONTA do user no Acervo da Comunidade (aba Músicas), com eco no Chat e Fórum; CURADO: só admin/dono, custo 0, idempotente), 'list_public' (lê o Acervo público de músicas da Comunidade, sem custo, sem login). Fluxo cheio: create → lyrics(trackId) → render → get (poll status: rendering → ready/failed) → publish (dono). Tudo escopado por dono (só mexe nas suas tracks).
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"page": {
"type": "number",
"description": "action=list_public: página do Acervo público (0-based, default 0)."
},
"seed": {
"type": "number",
"description": "Pra action=render: seed pra reprodutibilidade do synth."
},
"limit": {
"type": "number",
"description": "action=list: quantas tracks trazer (1-50, default 20). action=list_public: faixas do Acervo (1-48, default 18)."
},
"model": {
"enum": [
"pro",
"clip",
"mureka",
"minimax",
"elevenlabs"
],
"type": "string",
"description": "Pra action=render: motor da faixa. 'pro' = Lyria 3.5 (default, faixa inteira até 3 min, lê imagem de referência). 'clip' = Lyria 3 Clip (rascunho de 30s). 'mureka' = Mureka 9.5 (faixa inteira, letra até 5.000 caracteres). 'minimax' = MiniMax Music 2.6 (faixa inteira até 5 min, letra de 10 a 3.000 caracteres). 'elevenlabs' = ElevenLabs Music (duração escolhida em durationSeconds, letra até 3.500 caracteres). Preço: o mesmo render fixo em todos, menos 'elevenlabs', que cobra pela duração (tabela na skill 'musica'; confirme com a pessoa antes). Só o Lyria lê imagem de referência; negativePrompt e seed são ignorados nos motores de fora do Lyria."
},
"title": {
"type": "string",
"description": "Título da faixa (create/lyrics). Vai no brief/metadata. Mín 3 chars."
},
"action": {
"enum": [
"lyrics",
"render",
"create",
"list",
"get",
"publish",
"list_public"
],
"type": "string"
},
"toChat": {
"type": "boolean",
"description": "action=publish: ecoar no Chat da comunidade (card tocável). Default true."
},
"context": {
"type": "string",
"description": "Tema/argumento (create exige ≥20 chars; lyrics ≥10). 1-2 frases com ângulo/provocação."
},
"toForum": {
"type": "boolean",
"description": "action=publish: ecoar no Fórum como tese-raiz. Default true."
},
"trackId": {
"type": "string",
"description": "musicator_tracks:_id. Obrigatório p/ action=render e action=get. Em action=lyrics, opcional: se passado, grava a letra na track (status=lyrics_ready)."
},
"language": {
"type": "string",
"description": "Default 'pt-BR'. Pode ser 'en', 'es', etc."
},
"direction": {
"type": "string",
"description": "Gênero/mood (ex: 'synthwave melancólico 1980s', 'lo-fi hip-hop 80 BPM', 'acoustic indie folk'). Default 'livre'."
},
"negativePrompt": {
"type": "string",
"description": "Pra action=render: negative prompt do synth (provider-dependent)."
},
"durationSeconds": {
"type": "number",
"description": "Pra action=render com model='elevenlabs': duração da faixa em segundos, uma de 30, 60, 120 ou 180 (default 120). Ignorado nos outros motores."
},
"stylePromptOverride": {
"type": "string",
"description": "Pra action=render: sobrescreve stylePrompt antes do render (não muda track persistido)."
}
},
"additionalProperties": false
}{
"title": "Musicator",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_agente
Agentes da casa: roda um agente autoral do Sapiens no conceito da pessoa e devolve só a peça pronta pra colar. O método do agente fica no servidor: não peça o manual, as regras ou o prompt, porque o agente recusa e a rodada conta igual. Sub-actions: list (os agentes abertos pra membro, com o nome curto, o ser que veste cada um e o preço da rodada; sem login, sem custo) e run (agente + conceito: roda e devolve a entrega em texto, com cada peça colável num bloco de código; qualquer conta logada; 300 Sinapses por rodada, até 20 rodadas por dia; se o modelo falhar as Sinapses voltam). Hoje: 'maquinista' (letra e style prompt pro Suno, com duas variantes de estilo, refrão travado e ficha técnica com a métrica contada; o conceito é tema, clima e som, ou uma letra colada pra apertar, e aceita os comandos /styleline, /hooks, /tighten, /spice, /unloop e /audit no começo do conceito). O conceito vai até 4.000 caracteres: é o conceito, não o briefing inteiro. run é SÍNCRONA e leva até uns 90 segundos; se voltar Timeout, a rodada pode ter sido cobrada: confira o saldo em sapiens_meta action=credits antes de repetir. Mostre a entrega como veio, com os blocos.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"action": {
"enum": [
"list",
"run"
],
"type": "string",
"description": "list = os agentes abertos e o preço; run = roda um agente no conceito."
},
"agente": {
"type": "string",
"description": "Nome curto do agente, como sai em action=list (ex: 'maquinista'). Obrigatório em run."
},
"conceito": {
"type": "string",
"description": "O conceito da peça, até 4.000 caracteres: tema, clima e som, ou a letra colada pra apertar. Obrigatório em run."
}
},
"additionalProperties": false
}{
"title": "Agentes da casa",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_video
Sapiens Video: gera vídeo (qualquer membro logado; vídeo é caro, cobra as Sinapses da sua conta). Sub-action 'create' (recomendada): escolhe modelo + config e gera num call (cria a row + renderiza). Modelos: 'sapiens-video-seedance' (Seedance 2.0, cena+áudio nativo, 4-15s, 480/720/1080p, t2v/i2v; aceita até 4 imagens de REFERÊNCIA via referenceImageIds/referenceImageUrls/referenceImagePaths (o H3 aceita até 9, o Omni 1.2 até 6, 3 por personagem; Kling, Hailuo, WAN 2.5 e 3.0 e os dois Spicy não), que guiam estilo/personagem/composição SEM virar o 1º frame, é o fluxo STORYBOARD: gere a folha de key poses com sapiens_image templateSlug='storyboard-sapiens-v1', passe folha + personagem como refs num t2v e descreva o take contínuo no prompt, citando as refs por descrição e mandando ignorar o traço do sketch; aceita também 1 VÍDEO DE MOVIMENTO via referenceVideoUrls (role 'refvideo' -> reference_videos, <=15s, host da casa): a coreografia/câmera do clipe guia o take, combinável com a folha), 'sapiens-video-seedance-2-fast' e 'sapiens-video-seedance-2-mini' (os irmãos do 2.0: MESMO repertório completo, incluindo referência, frame final e vídeo de movimento; o Fast custa 20% menos e o Mini METADE, ambos com teto 720p, pedir 1080p neles entrega e cobra 720p. Use o Mini pra iterar enquadramento/prompt barato e feche no 'sapiens-video-seedance' quando o take estiver certo), 'sapiens-video-seedance-25' (Seedance 2.5, a geração SEGUINTE e não um quarto tier da 2.0: take de 4 a 30s num fôlego, edita e estende vídeo, mesmo repertório de referência mais ÁUDIO como referência; teto 720p e ~1,5x o preço por segundo do 2.0. Duração é o que pesa aqui: 30s em 720p passa de 40 mil Sinapses, então confirme a duração com a pessoa antes de disparar. Quem precisa de 1080p fica no 'sapiens-video-seedance'), 'sapiens-video-kling' (Kling 3.0 Pro, anima imagem, 3-15s, sound opcional, i2v/t2v), 'sapiens-video-hailuo' (Hailuo 2.3 da MiniMax, física e movimento em 768p, 6 ou 10s, t2v/i2v) e 'sapiens-video-hailuo-pro' (o mesmo em 1080p, 5s fixo, duração não é param aqui): motores PUROS, sem áudio nativo, sem imagens de referência e sem frame final, então quem precisa disso fica no Seedance 2.0; o Pro é o 1080p mais barato da casa, 'sapiens-video-h3' (MiniMax H3: som nativo incluso sem toggle, 5 a 15s em '2k' ou '768p' (sem resolution cai no 2k, que custa 33% mais por segundo), t2v/i2v e frame final; ACEITA até 9 imagens e 3 vídeos de referência (somando 15s), o caminho de take longo com personagem travada; referência e frame inicial são exclusivos, mande um dos dois; o 2K de 15s leva uns 9 minutos de render, acompanhe em status e não gere de novo), 'sapiens-video-pvideo-2-pro' (P-Video-2 Pro, o H3 acelerado pela Pruna: o RASCUNHO de personagem travada, até 9 imagens contando referências e frame inicial e final no mesmo pedido, 5 a 15s em '480p' ou '768p', som nativo, o take volta em segundos; sem t2v, precisa de ao menos uma imagem ou um clipe; cobra por imagem além do segundo, então cote em 'price' com as mesmas imagens do create; aceita ainda até 3 vídeos (referenceVideoUrls) e 3 áudios (referenceAudioUrls, ou referenceAudioTrackIds pra faixa sua do sapiens_musicator) de referência, 15s somados por tipo, cada segundo cobrado à parte e medido pelo servidor antes do débito (cote com referenceVideoClipsSec, a duração de cada clipe, e referenceAudioSec), e keepAudio com um áudio só faz ele virar a trilha do take), 'sapiens-video-h3-spicy' (MiniMax H3 Spicy: o H3 SEM freio de conteúdo, i2v puro a partir de uma peça SUA gerada na casa, que é o que trava a identidade (veja FRAME NOS SPICY); 3 a 15s, 480p/768p/1080p, som nativo, frame final; o segundo de vídeo mais barato e o render mais rápido da casa), 'sapiens-video-seedance-spicy' (Seedance 2.0 Spicy: o 2.0 SEM freio, também i2v puro, som nativo; 4 a 15s em 480p e 720p, para em 10s em 1080p; sem frame final; o som tem interruptor no mesmo preço), 'sapiens-video-wan' (WAN 2.5, imagem que fala/canta com áudio+lip-sync, 5/10s, i2v), 'sapiens-video-wan-3' (WAN 3.0: texto ou imagem, som nativo com interruptor no mesmo preço, frame final, 5/8/10s em 480/720/1080p; sem imagem de referência), 'sapiens-video-flux-3-max' (FLUX 3 Max, fal + Black Forest Labs: texto ou imagem, 5 a 20s em 720p/1080p, som nativo com interruptor, frame final junto do inicial; sem imagem de referência), 'sapiens-video-ltx-25-fast-a2v', 'sapiens-video-ltx-25-pro-a2v' e 'sapiens-video-ltx-23-pro-a2v' (LTX Audio-to-Video, o caminho de a personagem CANTAR ou FALAR com o áudio da pessoa: o áudio vira o take, puxa a boca e o gesto e dita a duração e o preço; mande UM áudio (mp3 ou m4a): a faixa SUA do sapiens_musicator em referenceAudioTrackIds (o trackId; o servidor confere que é sua), ou um link de arquivo SEU em referenceAudioUrls (o trecho cortado; link de outra conta é recusado antes de cobrar) e a foto da ficha em startImageId/startImageUrl (sem foto, o prompt descreve a cena); até 20 s de áudio no 2.5 Fast e no 2.3 Pro, 10 s no 2.5 Pro, em 720p/1080p; durationSec não se usa, o servidor mede o áudio antes de cobrar; cote em 'price' com durationSec = os segundos do áudio), 'sapiens-video-ltx-25-fast' e 'sapiens-video-ltx-25-pro' (LTX 2.5: texto ou imagem, 6 a 20 s no Fast e 6 a 10 s no Pro, 720p/1080p, som nativo com interruptor, frame final junto do inicial; sem imagem de referência), 'sapiens-video-kling-motion' (Motion transfer: passa o movimento de um vídeo pra uma imagem, PRECISA de pessoa com tronco visível na imagem E no vídeo), 'sapiens-video-shot-mimic' (Shot Mimic: recria o plano/câmera/cortes de um vídeo de referência como cena nova), 'sapiens-video-omni-12' (Gemini Omni 1.2: texto ou imagem vira vídeo de 4, 6, 8, 10, 12 ou 15s (sem durationSec, 10s) com áudio nativo, de '360p' a '4k' (sem resolution, 720p; 360p custa 1/3 do 720p, 1080p 1,5x, 4k 3x); aceita até 6 imagens de referência (3 por personagem, 2 personagens) e até 3 vídeos de referência de até 3 s (1 no take acima de 10 s, só take novo), que dão a aparência de quem aparece neles; editOfImageId aponta um vídeo Omni seu e o prompt edita a MESMA cena, preservando câmera e ambiente; e VÍDEO-FONTE: sourceVideoId (vídeo seu da galeria) ou sourceVideoUrl (link da casa), mp4 até 15 s, editado (sourceVideoMode 'edit', o padrão, ex: trocar a pessoa do vídeo pelo personagem da imagem de referência, cobrado pelo tamanho do clipe) ou estendido ('extend', cobrado pelo durationSec do pedaço novo)) ('sapiens-video-omni', o Omni 1.0, e 'sapiens-video-lite/fast/quality', o Veo 3.1, SAÍRAM: o Google apagou os quatro em 22/10/2026 e o pedido é recusado antes de cobrar). Args create: model, prompt, durationSec, resolution ('480p'/'720p'/'1080p'; no H3 '768p'/'2k'; no Omni 1.2 '360p' a '4k'), audio, aspectRatio. RECEITA DE TAKE (templateSlug + brief), o irmão do templateSlug da imagem: em vez de escrever o prompt inteiro, passe templateSlug e a receita travada da casa embrulha a cena com estilo, cenário, arco, áudio e look, e ainda escolhe o motor (por isso model fica opcional). O `prompt` vira só a CENA e o `brief` preenche os campos do formato (subject, persona, hook, shots com voiceLine e propVisible, uvps, language, energy); campo vazio some do prompt em vez de virar buraco. Receitas de hoje: 'ugc-vertical-v1' (selfie que fala, o formato nativo de Reels/TikTok/Shorts), 'unboxing-vertical-v1' (mãos e reveal, som real do papel e do lacre), 'app-demo-vertical-v1' (a tela do app legível na mão da pessoa) e 'reflexao-vertical-v1' (talking-head lento pra ideia ou ensaio). Override de model/aspectRatio/durationSec/resolution vale dentro do que a receita aceita, e o erro lista as opções. Sub-action 'templates' (sem custo, sem login) traz o catálogo vivo com spec default, whitelist e os briefFields de cada uma. Isto substitui a tool sapiens_shorts, que era admin-only e só falava Veo 3.1 Fast; o mesmo UGC de 8s sai a 720p no Seedance 2.0 Mini por bem menos. FRAME INICIAL/FINAL POR REFERÊNCIA (recomendado): startImageId/endImageId (id da sua galeria) ou startImageUrl/endImageUrl (url de galeria/Acervo/personagem), resolvidos server-side igual à imagem, descubra via sapiens_reference. FRAME POR ARQUIVO LOCAL (só no MCP instalado/stdio, não no remoto): startImagePath/endImagePath = caminho absoluto de uma imagem no seu PC (PNG/JPEG/WebP até 8MB); o processo lê o arquivo e sobe como frame inicial/final, igual a subir no gerador do site, 1 imagem inicial + 1 final por vídeo, então pra vários vídeos rode create uma vez por imagem. No remoto use id/url. Alternativa base64: references (role 'start'=imagem i2v, 'end'=frame final, 'driving'=vídeo de movimento do Motion). Suporte a frame final varia por modelo. FRAME NOS SPICY (h3-spicy, seedance-spicy, ltx-spicy): o frame vem SÓ de startImageId/startImageUrl (e endImageId/endImageUrl no H3 Spicy, o único que lê final) apontando uma peça SUA gerada na casa, e o servidor baixa o frame dessa peça. Arquivo local (startImagePath), base64 (references), upload, peça trazida por ponte e foto de fora são recusados: antes de cobrar quando a fonte já chega no pedido, ou no render, com as Sinapses de volta. Custo server-side por config. Sub-action 'generate' (legado): renderiza um imageId de vídeo já criado no site. Retorna {success, url, imageId, cost}. VITRINE (sem custo): sub-action 'demos' lista os SEUS demo films (kind=demo do Estúdio de Vídeo) com slug + estado de vitrine; sub-action 'showcase' põe/tira um demo (por slug) do mini-cinema da /conectar-claude, com showcaseTag (chip de capacidade) e showcaseOrder (ordem asc). Fluxo: 'demos' pra achar o slug, depois 'showcase' com showcase=true. Só entra na vitrine pública se for a conta da casa. VÍDEOS PROGRAMÁTICOS (ADMIN, sem custo): o Lab do Estúdio de Vídeo (/experimentos/films, tabela videoSpecs, 5 kinds: demo | aula-tour | essay | tipografia-musical | dataviz) opera por aqui sem browser, 'film-list' (todos os kinds; filtros filmKind/filmStatus), 'film-get' (spec inteiro por slug), 'film-upsert' (cria/atualiza por slug, idempotente; spec = objeto JSON no shape do 'Copiar spec' da tela, validação no servidor), 'film-status' (produção por slug: filmStatus + videoUrl + durationSecMeasured; o fecho do render é os três num call), 'film-publish' (Acervo aba Fitas + portfólio; exige pronto+URL), 'film-delete' (limpar rascunho). O RENDER do filme segue no agente local (skill /film, repo da casa): o MCP registra e fecha o ciclo, não renderiza. create é ASSÍNCRONA: cria o row, debita e volta NA HORA com {imageId, status:'rendering', cost} (não espera o render, que leva de segundos a minutos). Acompanhe com a sub-action 'status' (imageId) até status='completed' (traz a url) ou 'error'/'blocked'. NÃO chame create de novo enquanto renderiza (cria outro vídeo e cobra de novo); falha de provider refunda sozinha. EDIÇÃO (as ações da ficha do site, cada uma vira peça nova e o original fica): 'trim' (imageId + startSec, endSec opcional: corta um trecho; grátis), 'join' (imageIds: 2 a 8 vídeos SEUS na ordem, até 180 s somados: compilado; grátis), 'fecho' (imageId + ending 'marca'/'sapiens'/'none', watermark, musicUrl de trilha da casa, nameCard {name, subtitle}: fecha o vídeo com a assinatura da casa; grátis), 'render-ref' (imageId do take + refUrl da folha que o gerou: a peça com a referência ao lado; cobra Sinapses, o mesmo par já feito volta de graça). Síncronas, podem passar de 2 min: Timeout é o cliente desistindo, olhe sapiens_gallery action=list kind=video antes de repetir. RESOLUÇÃO: 'upscale' (imageId de vídeo SEU completed + resolution = o alvo, '720p', '1080p', '2k' ou '4k') gera uma VARIANTE nova em resolução maior, o original fica intacto; cobra Sinapses por segundo do clipe, mais caro quanto maior o alvo, assíncrona como o create (acompanhe em status). SOM: 'sonorize' (imageId de vídeo SEU completed + prompt do som da cena) gera uma VARIANTE nova com trilha sincronizada (o original fica intacto; sonorize sempre o original, nunca uma variante). engine escolhe o motor: 'mirelo-sfx-2.0' (42 Sinapses/s, o default: GUARDA a fala do clipe, tira a música e refaz o resto), 'mmaudio-v2' (20 Sinapses/s, segue o texto em vez da imagem: é o motor do bicho trocado, onde o Mirelo devolve o som do bicho original; refaz o som inteiro e a fala se perde) ou 'elevenlabs-video-to-music' (26 Sinapses/s, faz a TRILHA e não o som da cena: uma música que acompanha os cortes, mixada por baixo do som que o clipe já tem; o prompt descreve a música). ADMIN: 'shadows' (videoUrl + title) extrai o depth map (depth-map) de um vídeo: entra na sua timeline de vídeos e no Acervo como driving reutilizável; 'shadows-list' lista os depth maps prontos. PREÇO DE VÍDEO É FAIXA, NÃO NÚMERO: nos motores por segundo (todo Seedance, Kling, WAN 2.5 e 3.0, Hailuo, H3, os dois Spicy, Shot Mimic, e desde out/2026 o Gemini Omni) a conta é duração x resolução [x áudio], e OMITIR não pega o barato: sem 'resolution' o servidor cobra o tier MAIS CARO do motor (menos o Gemini Omni 1.2, que fica no 720p), sem 'durationSec' cobra o piso de duração (no Omni, o padrão: 10s). Um create de Seedance 2.0 sem resolution debita 1080p. Nunca prometa um valor sem cotar: sub-action 'price' (sem custo, sem login) devolve o número EXATO que o create vai debitar pra model + durationSec + resolution + audio, e avisa (clamped=true) quando o que você pediu não é o que vai ser cobrado. Sub-action 'models' (sem custo, sem login): lista os modelos ativos + a faixa de preço calculada pela mesma função que debita (priceDefault = o que uma chamada sem config custa, priceMin e priceMax = os dois cantos do motor, cada um com a config que o produz) + config (durações/resoluções) + disponibilidade (motor em preview pode aparecer como 'em breve'). LEGENDA (fita, por slug): 'caption-list' (sem custo, mostra os idiomas que a peça já tem), 'caption-generate' (captionLang = idioma FALADO; captionTrio=true já traduz pro trio da casa pt+en+ja na mesma chamada) e 'caption-translate' (captionLang = destino, parte sempre da faixa original). Cobra por minuto começado de vídeo: 50 Sinapses o minuto transcrito, 20 o traduzido, com a duração vindo do doc da peça. A legenda é desenhada pela casa em dois estilos (discreta e social), trocáveis no play sem regerar e sem custo.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"slug": {
"type": "string",
"description": "action=showcase: slug do demo film a curar (descubra via action=demos). film-get/film-status/film-publish/film-delete: slug do spec (descubra via film-list). film-upsert: slug fixo do filme no repo films/ (idempotente: existe = atualiza, não existe = cria com esse slug); omita pra criar com slug gerado."
},
"spec": {
"type": "object",
"description": "film-upsert: o spec inteiro como objeto JSON (validação fica no servidor, fonte única). Shape: { kind, musicMode ('default'|'file'|'track'), musicRef?, aulaSlug? (só aula-tour), e o payload do kind: demo | aulaTour | essay | tipoMusical | dataviz }. Mesmo shape do 'Copiar spec' da tela /experimentos/films; descubra um exemplo real com film-get.",
"additionalProperties": {}
},
"audio": {
"type": "boolean",
"description": "action=create e action=price: liga áudio. Seedance = on por default; Kling 'sound' = +50% no preço. WAN 2.5 é áudio nativo sempre; WAN 3.0 tem interruptor, mesmo preço ligado ou desligado. H3 e H3 Spicy: o som vem sempre e já está no preço, o campo não muda nada. Seedance Spicy: tem interruptor (audio=false sai mudo, pra sonorizar depois), mesmo preço ligado ou desligado."
},
"brief": {
"type": "object",
"properties": {
"hook": {
"type": "object",
"properties": {
"line": {
"type": "string",
"description": "A frase de abertura, 5-10 palavras."
},
"emotion": {
"type": "string",
"description": "Emoção alvo (curiosidade, frustração, espanto)."
}
},
"additionalProperties": false
},
"uvps": {
"type": "array",
"items": {
"type": "string"
},
"description": "2 a 4 pontos curtos a reforçar."
},
"shots": {
"type": "array",
"items": {
"type": "object",
"properties": {
"sec": {
"type": "number",
"description": "Em que segundo o momento acontece."
},
"role": {
"type": "string",
"description": "hook | problem | solution | cta."
},
"action": {
"type": "string",
"description": "A ação visual em uma frase."
},
"camera": {
"type": "string",
"description": "close-up | medium | over-shoulder | product-pov."
},
"emotion": {
"type": "string"
},
"voiceLine": {
"type": "string",
"description": "A fala da cena, na língua do brief."
},
"propVisible": {
"type": "string",
"description": "Objeto/tela que precisa aparecer legível."
}
},
"additionalProperties": false
},
"description": "Os momentos do take, na ordem. Sem eles, o template usa o arco de reserva dele."
},
"energy": {
"type": "string",
"description": "calm | high."
},
"persona": {
"type": "string",
"description": "Quem aparece (ou as mãos que aparecem)."
},
"subject": {
"type": "string",
"description": "O que o take é: o produto, a ideia, o tópico."
},
"language": {
"type": "string",
"description": "'pt-BR' (default) ou 'en'."
},
"subjectType": {
"type": "string",
"description": "app | physical | saas | ideia."
}
},
"description": "action=create com templateSlug: o formulário do template. Cada receita usa os campos que precisa (veja `briefFields` em action=templates) e ignora o resto; campo vazio some do prompt em vez de virar buraco.",
"additionalProperties": false
},
"model": {
"enum": [
"sapiens-video-seedance",
"sapiens-video-seedance-2-fast",
"sapiens-video-seedance-2-mini",
"sapiens-video-seedance-25",
"sapiens-video-kling",
"sapiens-video-hailuo",
"sapiens-video-hailuo-pro",
"sapiens-video-h3",
"sapiens-video-pvideo-2-pro",
"sapiens-video-h3-spicy",
"sapiens-video-seedance-spicy",
"sapiens-video-ltx-spicy",
"sapiens-video-wan",
"sapiens-video-wan-3",
"sapiens-video-flux-3-max",
"sapiens-video-ltx-25-fast-a2v",
"sapiens-video-ltx-25-pro-a2v",
"sapiens-video-ltx-23-pro-a2v",
"sapiens-video-ltx-25-fast",
"sapiens-video-ltx-25-pro",
"sapiens-video-kling-motion",
"sapiens-video-shot-mimic",
"sapiens-video-lite",
"sapiens-video-fast",
"sapiens-video-quality",
"sapiens-video-omni-12",
"sapiens-video-omni-11",
"sapiens-video-omni"
],
"type": "string",
"description": "action=create (opcional quando você passa templateSlug: a receita traz o motor) e action=price (obrigatório). O catálogo POR MODELO (capacidades, referências, tetos, FAIXA de preço) mora na description desta tool e VIVO em action=models; a skill 'video' (sapiens_skill) guia a escolha. Atalho de famílias: seedance/seedance-2-*/seedance-25 = cena+áudio+referências (o 25 estica até 30s e o preço acompanha), kling = anima imagem, wan = WAN 2.5, imagem que fala, wan-3 = WAN 3.0, texto ou imagem com som e frame final, hailuo/hailuo-pro = movimento puro sem áudio, h3 = 2K ou 768p com áudio e até 9 imagens + 3 vídeos de referência, pvideo-2-pro = o H3 acelerado pela Pruna, rascunho barato e rápido de personagem travada (até 9 imagens, 3 vídeos e 3 áudios de referência, cobra por imagem e por segundo de clipe e de áudio, 480p/768p, sem t2v), h3-spicy/seedance-spicy = os mesmos motores sem freio de conteúdo, só a partir de imagem (i2v), kling-motion/shot-mimic = transferência de movimento/plano, lite/fast/quality = Veo 3.1, omni = Gemini com áudio nativo."
},
"title": {
"type": "string",
"description": "action=shadows: nome do depth map (vira o slug no Acervo; re-extrair o mesmo título sobrescreve). Mín. 3 chars."
},
"action": {
"enum": [
"create",
"extend",
"chain",
"generate",
"status",
"models",
"price",
"templates",
"demos",
"showcase",
"shadows",
"shadows-list",
"sonorize",
"upscale",
"trim",
"join",
"fecho",
"render-ref",
"film-list",
"film-get",
"film-upsert",
"film-status",
"film-publish",
"film-delete",
"caption-list",
"caption-generate",
"caption-translate"
],
"type": "string"
},
"endSec": {
"type": "number",
"description": "action=trim: o segundo onde o corte acaba. Sem ele, vai até o fim do clipe."
},
"ending": {
"enum": [
"sapiens",
"marca",
"wavespeed",
"both",
"none"
],
"type": "string",
"description": "action=fecho: a vinheta do fim. 'marca' é a assinatura da casa (Sint.fyi); 'none' sem vinheta."
},
"engine": {
"enum": [
"mmaudio-v2",
"mirelo-sfx-2.0",
"elevenlabs-video-to-music"
],
"type": "string",
"description": "action=sonorize: o motor de som. 'mirelo-sfx-2.0' (default) é o motor da casa pra sonorizar: GUARDA a fala que o clipe já tem, tira a música que veio junto e refaz o resto do som em volta; em clipe mudo, faz o som inteiro. O Mirelo tira o som da IMAGEM e o texto só empurra: em cena refeita com bicho trocado (recast, Omni editando um take), ele devolve o som do bicho ORIGINAL (o gatinho no take do T-rex saiu com passo e rugido de T-rex). 'mmaudio-v2' segue o texto: é o motor quando a imagem engana (bicho trocado, cena famosa refeita) e o mais barato por segundo; refaz o som inteiro e a fala do clipe se perde. 'elevenlabs-video-to-music' não faz som de cena, faz TRILHA: uma música que acompanha os cortes do clipe, mixada por baixo do som que ele já tem (a fala e o ruído ficam); o prompt descreve a música (gênero, instrumentos, clima, onde cresce), não a cena. Recusa, sem cobrar, peça que já tem o fecho da casa (sonorize o take original) e clipe fora da CDN da casa. Cote o preço com a pessoa antes. O Mirelo e o Video to Music recusam, sem cobrar, peça que entrou de fora (ingest, a casa não sabe a duração dela) e clipe acima de 180s: passe a peça de fora antes em action=trim e sonorize o corte; clipe longo, corte em partes."
},
"prompt": {
"type": "string",
"description": "Prompt da cena. Pra i2v descreve o movimento. Default vago se omitido."
},
"refUrl": {
"type": "string",
"description": "action=render-ref: a url da folha ou referência que GEROU o take (está nas referências da peça ou nas imagens do personagem dela)."
},
"search": {
"type": "string",
"description": "action=shadows-list: filtro de busca opcional (título/tags). Sem ele, lista o banco inteiro (até 300). Cada item traz url (depth map puro, driving) e skeletonUrl (soma com esqueleto, preview humano) quando existe."
},
"imageId": {
"type": "string",
"description": "action=generate ou action=status: generatedImages:_id do vídeo. O create devolve o imageId; ou um vídeo já criado no site (o row define modelo + custo). Use sapiens_gallery action=list pra descobrir. action=sonorize: o imageId do clipe SEU (status completed) que vai ganhar som. action=extend: o take SEU (completed) que ganha o pedaço seguinte; pode ser a raiz ou a última parte da corrente (o servidor resolve a posição). No Omni a parte pronta já traz as anteriores na frente: a última é o filme inteiro, não junte as partes. action=chain: qualquer parte da corrente (devolve filmeInteiro quando o motor acumula)."
},
"filmKind": {
"enum": [
"demo",
"aula-tour",
"essay",
"tipografia-musical",
"dataviz"
],
"type": "string",
"description": "film-list: filtra por kind (demo | aula-tour | essay | tipografia-musical | dataviz)."
},
"imageIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "action=join: de 2 a 8 vídeos SEUS (ids da galeria), na ordem em que entram no compilado (até 180 s somados)."
},
"musicUrl": {
"type": "string",
"description": "action=fecho: trilha do acervo da casa (url do CDN) mixada por baixo do som do vídeo."
},
"nameCard": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string"
},
"subtitle": {
"type": "string"
}
},
"description": "action=fecho: cartão de nome por cima do fim (o personagem se apresenta antes da vinheta).",
"additionalProperties": false
},
"pagarCom": {
"enum": [
"sinapses",
"dolar"
],
"type": "string",
"description": "action=create: de qual saldo sai o take. Default 'sinapses' (o saldo do App). 'dolar' cobra no saldo em dólar da API da conta (o mesmo de Developers), sem tocar nas Sinapses: mesmo motor, mesma config, preço em dólar do custo do motor naquela duração, resolução e áudio. Use quando a pessoa pedir pra pagar com o saldo da API ou estiver sem Sinapses e com saldo em dólar. Saldo em dólar curto recusa sem cobrar nada; motor sem preço em dólar recusa. Falha do render estorna no mesmo saldo. O valor cobrado volta em pagoEmDolarUsd. Sinapse nunca vira dólar nem o contrário: são duas carteiras."
},
"showcase": {
"type": "boolean",
"description": "action=showcase: true põe na vitrine /conectar-claude, false tira."
},
"startSec": {
"type": "number",
"minimum": 0,
"description": "action=trim: o segundo onde o corte começa."
},
"videoUrl": {
"type": "string",
"format": "uri",
"description": "action=shadows: URL pública (http/https) do vídeo-fonte. O servidor extrai a SOMBRA (depth), entrega ela na SUA timeline de vídeos (você vira dono) e guarda a ficha no Acervo (Corpo). ADMIN, 200 Sinapses/segundo (refund na falha). film-status: a URL https do render no CDN (Bunny), o que acende o player do card."
},
"keepAudio": {
"type": "boolean",
"description": "action=create, com exatamente 1 áudio (referenceAudioUrls ou referenceAudioTrackIds): o áudio vira a TRILHA do take (toca primeiro, e o motor completa o resto com som próprio). É o caminho de fazer a personagem falar com a voz que você mandou. Sem custo extra além dos segundos do áudio."
},
"published": {
"type": "boolean",
"description": "film-publish: true publica no Acervo (aba Fitas) + portfólio (exige pronto + videoUrl), false despublica."
},
"watermark": {
"type": "boolean",
"description": "action=fecho: marca d'água por cima (padrão: liga)."
},
"endImageId": {
"type": "string",
"description": "Frame FINAL: generatedImages:_id da SUA galeria. Vira reference role 'end'. Pelo catálogo aceitam: Seedance 2.0/Fast/Mini/2.5, Kling 3.0 Pro, WAN 3.0, H3 e H3 Spicy; o resto não promete (Seedance Spicy, Hailuo e WAN 2.5 não expõem)."
},
"filmStatus": {
"enum": [
"rascunho",
"na_fila",
"renderizando",
"pronto"
],
"type": "string",
"description": "film-status: novo status de produção (rascunho | na_fila | renderizando | pronto). film-list: filtra por status. O fecho do render é film-status com filmStatus='pronto' + videoUrl + durationSec."
},
"references": {
"type": "array",
"items": {
"type": "object",
"required": [
"mimeType",
"data"
],
"properties": {
"data": {
"type": "string"
},
"role": {
"type": "string",
"description": "'start' = imagem inicial (i2v), 'end' = frame final, 'driving' = vídeo de movimento (Motion)"
},
"mimeType": {
"type": "string"
}
},
"additionalProperties": false
},
"description": "References em base64 (escape hatch / Motion / Shot Mimic). i2v: role 'start' (imagem). Motion: 'start' (pessoa) + 'driving' (vídeo de movimento, <=5MB, MÁX 10s, o Kling Motion recusa referência acima de 10s e cobra pela duração do clipe; corte o trecho antes). Shot Mimic: 'start' (personagem) + 'driving' (previs ou clipe do plano a imitar, <=5MB, MÁX 15s, acima o provider corta em 15s). Pra frame inicial/final a partir do seu acervo, prefira start/endImage* abaixo (sem precisar de base64). Nos Spicy (h3-spicy, seedance-spicy, ltx-spicy) references base64 NÃO vale: o frame vem só de startImageId/startImageUrl de peça sua gerada na casa."
},
"resolution": {
"enum": [
"360p",
"480p",
"720p",
"1080p",
"768p",
"2k",
"4k"
],
"type": "string",
"description": "action=create e action=price: resolução (Seedance, WAN 2.5 e 3.0, Shot Mimic, H3, P-Video-2 Pro ('480p'/'768p'), H3 Spicy, Seedance Spicy, Gemini Omni 1.2). NÃO existe default 720p aqui: resolução ausente, ou fora do que o motor aceita, cai no tier MAIS CARO do motor, menos no Gemini Omni 1.2, que fica no 720p (o tier que ele vendeu antes de ter escolha). O Gemini Omni 1.2 vai de '360p' a '4k' (360p custa 1/3 do 720p, 1080p 1,5x, 4k 3x). É isso que faz um create sem este campo custar muito mais que o piso do catálogo (em sapiens-video-seedance vira 1080p, não 480p). Passe sempre a resolução que você quer pagar, e confira com action=price antes. O H3 usa '768p' ou '2k' (sem eles cai no 2k, que custa 33% mais por segundo); o H3 Spicy usa '480p'/'768p'/'1080p'. Kling e a linha Hailuo 2.3 não usam este campo (resolução fixa pelo motor)."
},
"aspectRatio": {
"type": "string",
"description": "'16:9' (horizontal), '9:16' (vertical), '1:1'. Vale pro t2v; i2v herda da imagem."
},
"captionLang": {
"enum": [
"pt",
"en",
"ja",
"es",
"ko",
"zh",
"fr",
"it",
"de"
],
"type": "string",
"description": "caption-generate: o idioma FALADO no vídeo. caption-translate: o idioma de DESTINO. A legenda é desenhada pela casa e trocável no play; o trio da casa é pt+en+ja."
},
"captionTrio": {
"type": "boolean",
"description": "caption-generate: true transcreve E traduz pro trio da casa (pt, en, ja) numa chamada. Cobra cada etapa por vez, então falha numa tradução não perde as que já saíram."
},
"durationSec": {
"type": "number",
"description": "action=create e action=price: duração em segundos. Gemini Omni 1.2 4/6/8/10/12/15 (a continuação acrescenta até 10), Seedance 2.0/Shot Mimic 4-15, Seedance 2.5 4-30 (o preço acompanha: confirme a duração com a pessoa antes de passar de 15), Kling 3-15, WAN 2.5 5/10, WAN 3.0 5/8/10, H3 5/6/8/10/12/15 nos dois tiers (768p e 2k), P-Video-2 Pro 5/6/8/10/12/15, H3 Spicy 3-15, Seedance 2.0 Spicy 4-15 em 480p e 720p, 4-10 em 1080p. O PREÇO ESCALA COM A DURAÇÃO. Duração ausente ou FORA do leque do motor cai no PISO, menos no Omni, que cai no padrão dele (10s). action=shadows: duração do vídeo-fonte, se souber (cobra 200/s; sem ela, flat ~2000)."
},
"endImageUrl": {
"type": "string",
"format": "uri",
"description": "Frame FINAL: url pública de galeria/Acervo/personagem. Vira reference role 'end' (mesmos motores de endImageId)."
},
"showcaseTag": {
"type": "string",
"description": "action=showcase: chip de capacidade do card (ex: 'Repertório', 'Galeria', 'Fórum'). Curto, até 24 chars."
},
"endImagePath": {
"type": "string",
"description": "Frame FINAL a partir de um ARQUIVO LOCAL do seu PC: só no MCP instalado (stdio). Caminho absoluto; PNG/JPEG/WebP até 8MB. Vira reference role 'end' (suporte varia por modelo). 1 imagem por vídeo. Mutuamente exclusivo com endImageId/endImageUrl."
},
"startImageId": {
"type": "string",
"description": "Frame inicial (i2v): generatedImages:_id da SUA galeria. Vira reference role 'start'. No Seedance 2.x e no H3 NÃO combina com referenceImage*/referenceVideoUrls: é um ou outro. Nos Spicy é a única porta do frame junto com startImageUrl, e a peça precisa ser SUA e gerada na casa (upload, peça trazida por ponte e foto de fora são recusados)."
},
"templateSlug": {
"type": "string",
"description": "action=create: slug de um TEMPLATE de vídeo (receita travada da casa, igual ao templateSlug da imagem). Com ele, `prompt` vira só a CENA e o template embrulha com estilo, enquadramento, arco, áudio e look, além de escolher o motor (por isso `model` fica opcional). O `brief` preenche os campos do formato. Descubra os slugs em action=templates (sem custo, sem login): tem FORMATO de anúncio ('ugc-vertical-v1', 'unboxing-vertical-v1', 'app-demo-vertical-v1', 'reflexao-vertical-v1'), LOOK que é só estilo ('look-*') e CLIPE de apresentação de personagem com tipografia cinética ('apresentacao-personagem-cinetica-v1', 15s, 13 cortes, personagem travada por referência). Override de model/aspectRatio/durationSec/resolution vale, mas só dentro do que a receita aceita (o erro lista as opções)."
},
"editOfImageId": {
"type": "string",
"description": "action=create model=sapiens-video-omni-12 (ou -omni-11): EDIÇÃO conversacional ('Nano Banana de vídeo'). Passe o imageId de um vídeo Omni SEU já gerado e o prompt vira instrução de edição sobre a MESMA cena (ex: 'troca o urso polar por um Papai Noel com um presente'), preservando câmera, ambiente e timing. Cada edição debita como uma geração Omni nova e devolve um vídeo novo (que também pode ser editado). Só funciona em vídeo gerado pelo Omni. Pra editar um vídeo SEU (feito em outro motor ou subido), use sourceVideoId/sourceVideoUrl."
},
"showcaseOrder": {
"type": "number",
"description": "action=showcase: ordem na trilha do mini-cinema (asc, 0..999; menor aparece primeiro)."
},
"sourceVideoId": {
"type": "string",
"description": "action=create model=sapiens-video-omni-12: VÍDEO-FONTE, o imageId de um vídeo SEU pronto (da galeria, qualquer motor ou subido por ingest), até 15 s. O Omni recebe o clipe inteiro e o edita (sourceVideoMode='edit', o padrão: a MESMA cena com a mudança do prompt, ex: 'troca o homem pelo personagem da imagem de referência, mantém tudo o resto') ou o estende (sourceVideoMode='extend': o pedaço seguinte no tempo). Imagens de personagem/estilo vão junto em referenceImageIds/Urls (até 3); startImage*/endImage* não, o primeiro quadro é o do vídeo. Cobrança: a edição cobra o degrau de duração que cobre o clipe (7,3 s cobra 8 s) na resolution pedida; a extensão cobra o durationSec do pedaço novo. A proporção é a do clipe. O Google fecha edição de vídeo enviado pra contas no EEE, Suíça e Reino Unido; se o provider recusar, as Sinapses voltam."
},
"startImageUrl": {
"type": "string",
"format": "uri",
"description": "Frame inicial (i2v): url pública (Bunny/Convex/Wikimedia) de galeria/Acervo/personagem. Vira reference role 'start'. Nos Spicy só vale url de peça SUA gerada na casa: Wikimedia, avatar, upload e peça trazida por ponte são recusados."
},
"sourceVideoUrl": {
"type": "string",
"description": "action=create model=sapiens-video-omni-12: o mesmo que sourceVideoId, por URL pública de host da casa (Bunny/Convex), mp4 até 15 s. Mande um OU outro."
},
"startImagePath": {
"type": "string",
"description": "Frame INICIAL (i2v) a partir de um ARQUIVO LOCAL do seu PC: só no MCP instalado (stdio), não na conexão remota. Passe o caminho absoluto (ex: 'C:\\\\Users\\\\voce\\\\HERO\\\\1.png'); o processo lê o arquivo e sobe como frame inicial, igual a subir a imagem no gerador do site. PNG/JPEG/WebP, até 8MB. É 1 imagem inicial por vídeo (o modelo do site): pra vários vídeos, rode create uma vez por imagem. Mutuamente exclusivo com startImageId/startImageUrl. Nos Spicy (h3-spicy, seedance-spicy, ltx-spicy) arquivo local NÃO vale: o frame vem só de startImageId/startImageUrl de peça sua gerada na casa."
},
"sourceVideoMode": {
"enum": [
"edit",
"extend"
],
"type": "string",
"description": "action=create com sourceVideoId/sourceVideoUrl: 'edit' (padrão) edita o clipe; 'extend' continua ele (durationSec = segundos do pedaço novo, 4/6/8/10)."
},
"referenceAudioSec": {
"type": "number",
"description": "action=price, só no P-Video-2 Pro: segundos do(s) áudio(s) de referência que o create vai mandar (somados, arredonda pra cima, teto 15). O create mede sozinho; isto é só pra cotar."
},
"referenceImageIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "action=create (Seedance 2.0/Fast/Mini/2.5 até 4; H3 até 9; Omni 1.2 até 6, 3 por personagem; Kling, Hailuo, WAN 2.5 e 3.0 e os dois Spicy NÃO): generatedImages:_id da SUA galeria como imagens de REFERÊNCIA (role 'ref'). Diferente de startImageId: NÃO viram o 1º frame, guiam estilo/personagem/composição. Fluxo storyboard: gere a folha com sapiens_image templateSlug='storyboard-sapiens-v1' (ou -vertical-v1) e passe folha + personagem aqui. Referência e frame de borda são EXCLUSIVOS no H3 (endpoints diferentes) e na linha Seedance 2.0/Fast/Mini/2.5 (o provider recusa a mistura): mande refs OU startImage*/endImage*, não os dois. Quer a pessoa da foto no take? Mande a foto como referência e descreva o primeiro quadro no prompt."
},
"referenceVideoSec": {
"type": "number",
"description": "action=price, só no P-Video-2 Pro: o TOTAL já cobrável de vídeo de referência (você mesmo aplicou o limite de duração do take + 1s por clipe). Sem a duração de cada clipe na mão, use referenceVideoClipsSec, que o servidor aplica o limite. Com os dois, valem os clipes."
},
"referenceAudioUrls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"maxItems": 3,
"description": "action=create, model='sapiens-video-pvideo-2-pro': até 3 URLs públicas (host da casa) de ÁUDIO de referência (mp3, wav, m4a, flac ou ogg), somando 15s: a voz e o som que guiam o take. Áudio nunca é a única referência: vai junto de uma imagem ou de um vídeo. Cada SEGUNDO é cobrado à parte, medido pelo servidor antes do débito (áudio que ele não mede, como webm, conta o teto de 15s). Cote em action=price com referenceAudioSec. No LTX Audio-to-Video (model='sapiens-video-ltx-25-fast-a2v', '-25-pro-a2v' ou '-23-pro-a2v') é OBRIGATÓRIO e é UM só: o áudio vira o take (canto ou fala), em mp3 ou m4a, até 20s (10s no 2.5 Pro); a duração e o preço saem dele, medidos pelo servidor. Ali o link precisa ser de um arquivo da SUA conta (link de outra conta é recusado antes de cobrar). Se o áudio é uma faixa sua do sapiens_musicator, use referenceAudioTrackIds (o trackId): o servidor confere que a faixa é sua."
},
"referenceImageUrls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"description": "action=create (mesmos motores e tetos de referenceImageIds: Seedance até 4, H3 até 9, Omni 1.2 até 6): URLs públicas (Bunny/Convex/Wikimedia) como imagens de REFERÊNCIA (role 'ref'). Soma com referenceImageIds. No prompt, cite as referências por descrição (ex: 'use the storyboard reference as ordered key poses; ignore line-sketch artifacts')."
},
"referenceVideoUrls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"description": "action=create (Seedance 2.0/Fast/Mini/2.5: 1 vídeo; H3: até 3, somando 15s; P-Video-2 Pro: até 3, somando 15s, cada SEGUNDO cobrado à parte, medido pelo servidor antes do débito, e cada clipe cobra no máximo a duração do take + 1s; Gemini Omni 1.2: até 3 clipes de até 3 s cada, 1 só no take de 11 a 15 s, só em take novo, e ali o clipe dá a APARÊNCIA de quem aparece nele (rosto, corpo, roupa), não o movimento, e não muda o preço): URL pública (host da casa) de um VÍDEO DE MOVIMENTO (role 'refvideo' -> reference_videos, <=15s): a coreografia/câmera do clipe GUIA o take sem ser recriado plano a plano (isso é o Shot Mimic). NÃO edita o clipe: o take sai com outra filmagem. Pra mudar um vídeo que já existe mantendo a filmagem, é model='sapiens-video-omni-12' com sourceVideoId/sourceVideoUrl. Combina com o fluxo storyboard: folha = beats, vídeo = movimento, personagem = identidade. Depth Maps do banco de motion servem direto (ADMIN: descubra com action=shadows-list)."
},
"durationSecMeasured": {
"type": "number",
"description": "film-status: duração MEDIDA do render em segundos (ffprobe), vira a duração do card."
},
"referenceImagePaths": {
"type": "array",
"items": {
"type": "string"
},
"description": "action=create (mesmos motores de referenceImageIds): imagens de REFERÊNCIA a partir de ARQUIVOS LOCAIS do seu PC, só no MCP instalado (stdio). Caminhos absolutos; PNG/JPEG/WebP até 8MB cada, até o teto do motor no total (Seedance 4, H3 9, somando com referenceImageIds/Urls). Viram reference role 'ref'."
},
"referenceAudioTrackIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 3,
"description": "action=create: o mesmo áudio de referenceAudioUrls, por ID de faixa SUA (o trackId que sapiens_musicator action=list/get devolve, status 'ready'). O servidor confere que a faixa é da sua conta e usa o áudio dela; faixa de outra conta é recusada antes de cobrar. Soma com referenceAudioUrls nos mesmos tetos. É o caminho certo no LTX Audio-to-Video, onde a faixa VIRA o take: UM só, mp3 ou m4a, e a faixa precisa caber no teto (até 20s, 10s no 2.5 Pro; o durationSeconds do action=list diz). Faixa mais longa é recusada antes de cobrar: corte o trecho e mande o arquivo seu em referenceAudioUrls."
},
"referenceVideoClipsSec": {
"type": "array",
"items": {
"type": "number"
},
"maxItems": 3,
"description": "action=price, só no P-Video-2 Pro (PREFIRA este): a duração de CADA vídeo de referência que o create vai mandar, ex: [10, 4.2]. O servidor aplica a mesma régua do create: cada clipe arredonda pra cima e para na duração do take + 1s, e a soma tem teto 15. O create mede sozinho; isto é só pra cotar."
}
},
"additionalProperties": false
}{
"title": "Sapiens Video",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_stock_audio
Banco de som da casa: trilha pronta E efeito sonoro (tabela stockAudio). Sub-actions de leitura (públicas, sem auth): categories (lista os moods/usos), list (busca com filtros mood/albumSlug/durationMax/search; kind='sfx' traz os EFEITOS: whoosh, clique, impacto, ambiência, foley, devolve {count, items} com title/url/durationSeconds/tags), get (1 item por audioId). Use pra puxar trilha/efeito pronto: pega a `url` e usa direto no ffmpeg. Não achou o efeito? generate (COBRA Sinapses, exige login) cria um novo por texto: prompt + durationSeconds (1-15, default 5) + provider ('elevenlabs' padrão 35 Sinapses/s mín 70 | 'mirelo' 35 Sinapses/s mín 70) + promptInfluence opcional (0..1, só elevenlabs: fidelidade ao texto, default 0.3), assíncrono, acompanhe com generation-status (generationId) até 'ready' (audioUrl; o efeito também entra no acervo kind=sfx) ou 'failed' (Sinapses reembolsadas). Efeito é CURTO (1-15s): música/trilha nova é no sapiens_musicator. Mood disponíveis: calmo, intenso, narrativo, épico, sombrio. Precisa de VOZ junto com trilha e efeito (anúncio, vinheta, cena de filme, podcast)? scene (COBRA Sinapses, exige login) cria a CENA INTEIRA num passe só, já batida, sem montar em pedaços e mixar depois: scenePrompt (a direção da cena, quem fala, com que timbre, o que toca atrás, a fala entre aspas) + durationSeconds (3-120, default 15) + loudnessRate/pitchRate/speechRate opcionais + withSubtitles opcional (traz o tempo de cada palavra), 13 Sinapses/s, assíncrono, acompanhe com scene-status (sceneId) até 'ready' (audioUrl + realDurationSeconds) ou 'failed' (Sinapses reembolsadas). A cena fica com o AUTOR e não entra no acervo compartilhado, porque carrega a voz e o roteiro de quem pediu.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"kind": {
"enum": [
"music",
"sfx",
"all"
],
"type": "string",
"description": "action=list: 'music' (default, trilhas) | 'sfx' (efeitos sonoros: whoosh, clique, ambiência, foley) | 'all'."
},
"mood": {
"type": "string",
"description": "Filtra por mood exato: calmo, intenso, narrativo, épico, sombrio."
},
"limit": {
"type": "integer",
"maximum": 100,
"description": "Default 20, max 100. Só action=list.",
"exclusiveMinimum": 0
},
"action": {
"enum": [
"list",
"get",
"categories",
"generate",
"generation-status",
"scene",
"scene-status"
],
"type": "string",
"description": "list = busca faixas/efeitos; get = 1 item por id; categories = moods/usos; generate = cria efeito sonoro novo (COBRA Sinapses, assíncrono); generation-status = status de uma geração (até ready/failed); scene = cria uma CENA de áudio completa, voz + trilha + efeito + ambiência num passe só (COBRA Sinapses, assíncrono); scene-status = status de uma cena (até ready/failed)."
},
"prompt": {
"type": "string",
"description": "action=generate: descreve o efeito (ex: 'whoosh curto de transição, grave e limpo'). Mín. 4 chars. Efeito é CURTO (1-15s); música/trilha é no sapiens_musicator."
},
"search": {
"type": "string",
"description": "Busca em título/álbum/mood/tags (action=list)."
},
"audioId": {
"type": "string",
"description": "stockAudio:_id (obrigatório pra action=get)."
},
"sceneId": {
"type": "string",
"description": "action=scene-status: o sceneId que o scene devolveu."
},
"provider": {
"enum": [
"mirelo",
"elevenlabs"
],
"type": "string",
"description": "action=generate: 'elevenlabs' (padrão, 35 Sinapses/s, mín 70; segue o texto ao pé da letra) | 'mirelo' (35 Sinapses/s, mín 70; lê a descrição com liberdade)."
},
"albumSlug": {
"type": "string",
"description": "Filtra por lançamento: pulso-lento, meu-mundo-em-colapso, contos-de-dados, singles."
},
"pitchRate": {
"type": "integer",
"maximum": 12,
"minimum": -12,
"description": "action=scene: tom da voz. Default 0 (natural do modelo)."
},
"categoryId": {
"type": "string",
"description": "stockAudioCategories:_id pra filtrar por mood/uso (action=list)."
},
"speechRate": {
"type": "integer",
"maximum": 100,
"minimum": -50,
"description": "action=scene: velocidade da fala. -50 = metade, 100 = dobro. Default 0."
},
"durationMax": {
"type": "number",
"description": "Duração máxima em segundos (ex: 120 pra trilha de movie < 2min).",
"exclusiveMinimum": 0
},
"scenePrompt": {
"type": "string",
"description": "action=scene: a DIREÇÃO da cena inteira, não só a fala. Diga quem fala, com que timbre e humor, em que idioma, o que toca atrás e o que se ouve no fundo, e ponha a fala entre aspas. Ex: 'Voz masculina adulta, calma e um pouco rouca, em português do Brasil. Estúdio à noite, um teclado bem baixo atrás. Ela fala: Sapiens Sintéticos, o Lab onde a sua ideia vira peça pronta.' Mín. 10 chars, máx. 2.000. Escreva como quem dirige, não como quem preenche campo: o modelo entende cena inteira e é daí que sai a qualidade."
},
"generationId": {
"type": "string",
"description": "action=generation-status: o generationId que o generate devolveu."
},
"loudnessRate": {
"type": "integer",
"maximum": 100,
"minimum": -50,
"description": "action=scene: volume. -50 = metade, 100 = dobro. Default 0 (natural do modelo)."
},
"withSubtitles": {
"type": "boolean",
"description": "action=scene: guarda a legenda com o tempo de cada palavra, pra casar texto com a fala sem transcrever depois. Default false."
},
"durationSeconds": {
"type": "number",
"description": "Duração alvo em segundos. action=generate: 1 a 15, default 5. action=scene: 3 a 120, default 15. O custo escala por segundo nos dois. Na CENA a duração não é parâmetro do modelo, ela sai da direção escrita: o alvo entra no pedido como instrução e o preço é acertado pela duração que voltou."
},
"promptInfluence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "action=generate, só provider='elevenlabs': fidelidade ao texto (0..1). Baixo = mais criativo, alto = segue o prompt à risca. Default 0.3. Ignorado no mirelo."
}
},
"additionalProperties": false
}{
"title": "Banco de Áudio",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_stock_video
Banco de clipe/B-roll stock (catálogo de vídeo curto pronto no CDN, baixável, free/interno). Leitura pública, sem auth. Sub-actions: categories (lista moods/usos: Ambiente & Atmosfera, Abertura & Fechamento, Textura & Abstrato, Natureza & Paisagem, Tech & Cripto), list (busca clipes com filtros mood/orientation/loopOnly/durationMax/search, devolve {count, items} com title/url/posterUrl/durationSeconds/orientation/loopFriendly/tags), get (1 clipe por videoId). Use pra puxar B-roll pronto em vez de gerar via sapiens_video: pega a `url` do clipe e usa como fundo/atmosfera de página, B-roll no ffmpeg de /sapiens:movie, ou frame de começo/fim no criar vídeo (orientation vertical=9:16 pra short, horizontal=16:9, loopOnly=true pra fundo que repete limpo).
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"mood": {
"type": "string",
"description": "Filtra por mood exato (action=list)."
},
"limit": {
"type": "integer",
"maximum": 100,
"description": "Default 20, max 100. Só action=list.",
"exclusiveMinimum": 0
},
"action": {
"enum": [
"list",
"get",
"categories"
],
"type": "string",
"description": "list = busca clipes; get = 1 clipe por id; categories = moods/usos."
},
"search": {
"type": "string",
"description": "Busca em título/mood/tags/descrição (action=list)."
},
"videoId": {
"type": "string",
"description": "stockVideo:_id (obrigatório pra action=get)."
},
"loopOnly": {
"type": "boolean",
"description": "true = só clipes loopFriendly (loop limpo, bom pra fundo de página)."
},
"categoryId": {
"type": "string",
"description": "stockVideoCategories:_id pra filtrar por mood/uso (action=list)."
},
"durationMax": {
"type": "number",
"description": "Duração máxima em segundos (ex: 8 pra fundo curto / clipe de começo).",
"exclusiveMinimum": 0
},
"orientation": {
"enum": [
"vertical",
"horizontal",
"square"
],
"type": "string",
"description": "Filtra por formato: vertical (9:16), horizontal (16:9), square (1:1)."
}
},
"additionalProperties": false
}{
"title": "Banco de Vídeo",
"readOnlyHint": true,
"openWorldHint": true
}sapiens_brand
Brand Sapiens (= Design System): paleta + tipografia + voz + estilo de imagem + persona como FONTE ÚNICA de estilo (espelha o Estúdio de Brand do app). Sub-actions: list (oficiais curados + os custom do user, leve, grátis), get (1 brand completo por slug: voz + imageStyle + persona/logo; só oficial ou o próprio), generate (CRIA design system novo a partir de descrição em texto livre; Gemini monta tudo e já nasce com card premium gpt-image-2; 150 Sinapses pelo texto + o card no gpt-image-2-high a preço de catálogo, hoje 1350 Sinapses no total, reembolsa se falhar), refine (ajusta brand custom por feedback livre tipo 'fundo mais escuro'/'voz mais seca', ~75 Sinapses), reroll (regenera SÓ 1 peça voice|palette|imageStyle numa direção diferente, grátis), card ((re)gera o card premium, preço de catálogo do modelo), delete (apaga brand custom do próprio user), set_visibility (torna um brand custom do user público/privado: público = aparece no perfil + galeria da comunidade, qualquer logado adota), list_public (galeria de design systems PÚBLICOS da comunidade, opt-in pelos donos, com atribuição), adopt (clona um brand público/oficial numa cópia NOVA e PRIVADA na conta do user; persona é dropada), persona (pluga um personagem DO PRÓPRIO user como a cara recorrente das imagens do brand custom dele, por character=<slug|id> de sapiens_character action=list_mine, ou character=null pra tirar; as refs saem da galeria do personagem e o personagem precisa ter pelo menos uma imagem; grátis), favorite (marca, ou com isFavorite=false desmarca, um brand custom do user como o FAVORITO, o escolhido entre as tentativas de um projeto: sobe pro topo da list e dos seletores do app, as outras tentativas ficam guardadas; oficial não se favorita; grátis), import (TRANSCREVE um design system que JÁ EXISTE fora, de outro app, do Figma, do kit de um cliente: o que veio é o que grava, hex e fonte exatos, sem IA no meio, mesmo título e corpo na mesma família ou fonte fora do Google Fonts; grátis, o card nasce em SVG; aceita o ARQUIVO DE DESIGN TOKENS como veio, DTCG ou Tokens Studio, mapeado por papel com o de-onde-saiu em `mapping`, ou o shape da casa; o retorno avisa em `warnings` o que pode não aparecer igual), font (sobe o ARQUIVO de uma fonte que não é do Google Fonts pro papel headline, body ou mono, por filePath, sourceUrl ou base64, até 2 MB, grátis; só fonte com licença pra web), logo (põe a logo no brand custom pelo ID da imagem na galeria do user, img_… de sapiens_gallery action=upload, ou handle=null pra tirar; grátis). Brand que a pessoa JÁ TEM vai por import, nunca por generate: o generate cria e reinterpreta. O personagem só APARECE na imagem quando a marca é persona: depois de plugar, gere com sapiens_image brandSlug=<slug> brandMark=persona. Qualquer conta logada; Sinapses saem do dono do sessionToken. Pra generate: converse com o user e monte uma description rica (vibe, cores, voz, públicos, refs; se ele colar amostra de texto dele, inclua pra a voz sair dali) ANTES de chamar. Confirme o custo (1350 Sinapses) antes de gerar. Valor explícito na descrição (hex, nome de fonte, nome) o generate respeita, mas pra copiar um brand inteiro o import é exato e de graça.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"name": {
"type": "string",
"description": "Pra action=generate e import: o nome do brand (≤40 chars). Vem exatamente como mandado. No generate, sem ele o Gemini sugere um; no import, vence o nome que vier dentro do arquivo."
},
"role": {
"enum": [
"headline",
"body",
"mono"
],
"type": "string",
"description": "Pra action=font: o papel da fonte no brand (headline = título, body = corpo, mono = código)."
},
"slug": {
"type": "string",
"description": "Slug do brand. Obrigatório em get/refine/reroll/card/delete/set_visibility/adopt/persona/favorite/logo. Pegue via action=list (seus) ou action=list_public (da comunidade)."
},
"brand": {
"description": "Pra action=import: o design system que JÁ EXISTE. Serve o ARQUIVO DE DESIGN TOKENS como veio (DTCG com $value/$type, ou Tokens Studio com value/type: o servidor mapeia por papel lendo o caminho do token, color.brand.primary vira primary, color.text vira foreground, e devolve em `mapping` de onde saiu cada cor e fonte; aí mande o nome em `name`) OU o shape do Brand da casa (o mesmo que action=get devolve): { name (obrigatório, ≤40), tagline?, description?, palette: { primary, secondary?, tertiary?, accent?, background, foreground, swatches?: [{name, hex}] }, typography: { headline, body, mono? } (cada uma a família como string, ou {family, note}), voice?: { rules (texto ou lista de regras), lexicon?, avoid?, sampleLines? }, imageStyle?: { styleBase (em inglês), negative?, backgroundSignature? } }. Cor em hex (#RRGGBB, aceita #RGB e sem #). Obrigatórios: name, background, foreground, primary (ou accent), headline e body. PAPÉIS DAS CORES na casa: primary é a cor da marca, accent é a que DESTACA a peça (kicker, número, palavra-chave). Se no sistema de origem o accent é só cor de botão, mande assim mesmo: o carrossel escolhe sozinho a cor que lê no fundo e se separa do texto, e o editor deixa trocar. Mapeie o que a origem chama por outro nome (brand/main → primary, bg/surface → background, text/ink → foreground, cta/highlight → accent). Fonte fora do Google Fonts grava como veio (fidelidade) e aparece na fonte da casa onde o navegador não acha a dela; o retorno avisa em `warnings`."
},
"limit": {
"type": "number",
"description": "Pra action=list_public: quantos brands públicos trazer (1-96, default 24)."
},
"model": {
"enum": [
"gpt-image-2-high",
"gpt-image-2-low"
],
"type": "string",
"description": "Pra action=card: tier do card premium (default gpt-image-2-high)."
},
"piece": {
"enum": [
"voice",
"palette",
"imageStyle"
],
"type": "string",
"description": "Pra action=reroll: qual peça regenerar numa direção diferente."
},
"twist": {
"type": "string",
"description": "Pra action=generate: a torção aplicada sobre o briefing ('mais bruto', 'mais editorial', 'paleta clara'). Combina com fromSlug (variação de um brand seu) ou com description (torção sobre o briefing que você acabou de escrever). ≤400 chars."
},
"action": {
"enum": [
"list",
"get",
"generate",
"refine",
"reroll",
"card",
"delete",
"set_visibility",
"list_public",
"adopt",
"persona",
"favorite",
"import",
"logo",
"font"
],
"type": "string"
},
"base64": {
"type": "string",
"description": "Pra action=font: o arquivo de fonte em base64, quando você já tem os bytes."
},
"family": {
"type": "string",
"description": "Pra action=font: o nome da família, como o CSS chama (ex: 'Clash Display'). Omita pra usar a família que o papel já tem no brand (o caso comum: o brand importado com Clash Display ganha o arquivo dela)."
},
"handle": {
"type": [
"string",
"null"
],
"description": "Pra action=logo: o ID citável da imagem da logo na galeria do user (img_…). Suba antes com sapiens_gallery action=upload (PNG com fundo transparente é o ideal) e use o ID que voltar. null tira a logo."
},
"source": {
"type": "string",
"description": "Pra action=import: de onde o brand veio (o nome do app, 'Figma', 'kit do cliente'). Vai pro briefing e pro aviso. ≤60 chars."
},
"feedback": {
"type": "string",
"description": "Pra action=refine: o que ajustar, em texto livre ('escurece o fundo', 'fonte do título mais bruta', 'voz mais seca'). 5..2000 chars."
},
"filePath": {
"type": "string",
"description": "Pra action=font: caminho ABSOLUTO do arquivo de fonte local (.woff2, .woff, .ttf, .otf). Só no MCP instalado (stdio); no remoto use sourceUrl."
},
"fromSlug": {
"type": "string",
"description": "Pra action=generate: slug de um brand SEU cujo briefing vira a base da variação (o brand original não é tocado, nasce um novo). Com isso, `description` fica opcional. Só funciona em brand que guarda briefing (os criados a partir de ago/2026); veja em action=get, campo `brief`."
},
"isPublic": {
"type": "boolean",
"description": "Pra action=set_visibility: true publica o brand (aparece no teu perfil + galeria da comunidade, qualquer um pode adotar), false volta a privado."
},
"wordmark": {
"type": "string",
"description": "Pra action=logo: o nome escrito que acompanha a logo, quando ele difere do nome do brand (≤60 chars)."
},
"character": {
"type": [
"string",
"null"
],
"description": "Pra action=persona: slug OU id de um personagem SEU (pegue em sapiens_character action=list_mine). Passe null pra tirar o personagem do brand. O personagem precisa ter pelo menos uma imagem na galeria: são elas que viram as referências."
},
"sourceUrl": {
"type": "string",
"description": "Pra action=font: URL https pública do arquivo de fonte (o servidor baixa e confere os bytes)."
},
"isFavorite": {
"type": "boolean",
"description": "Pra action=favorite: true (default) marca o brand como o favorito, o escolhido entre as tentativas; false tira. Só brand custom seu."
},
"description": {
"type": "string",
"description": "Pra action=generate: descrição em texto livre do brand (o que o projeto/pessoa é, vibe, cores, voz, referências). Mínimo 30 chars; quanto mais rico, melhor o design system. Se o user colou um texto de amostra dele, inclua aqui pra a voz sair dali."
}
},
"additionalProperties": false
}{
"title": "Brand (Design System)",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_collection
Collections do Acervo: o álbum de QUALQUER peça (imagem, vídeo, design system, personagem, música, artigo, aula, carrossel), operado na conta do user. Uma Collection junta as peças de um mesmo mundo, e cada peça leva uma NOTA do dono. É o lugar do ESCOLHIDO entre as tentativas de um projeto: junte as tentativas e a escolhida na mesma Collection, nota 'escolhida' na que venceu e 'tentativa' nas outras, e a escolhida no topo (reorder). Sub-actions: list (as Collections do user), get (uma, por id ou slug, com as peças na ordem e as notas), create (title obrigatório; nasce rascunho e privada), update (nome e descrição), add (itemType + refId, note opcional; peça que já está dentro e chega com note tem a nota trocada), remove (tira a peça da Collection, a peça em si não é tocada), note (troca a nota; sem note, apaga), reorder (refIds na ordem nova, o primeiro no topo; os não citados vêm depois, como estavam). itemType: image e video (o id que sapiens_image, sapiens_video e sapiens_gallery devolvem), brand (o design system, pelo SLUG mesmo), character (characterId), track, article, aula, carousel, comic, sticker, fita, app. A Collection se acha pelo id ou pelo slug, e o nome também serve. Só mexe nas Collections e nas peças da própria conta. Publicar a Collection e escolher capa são gestos do dono no Acervo, nunca do agente. Grátis.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"note": {
"type": "string",
"description": "Pra add e note: a nota do dono sobre a peça DENTRO desta Collection, até 240 caracteres. Pra marcar o escolhido de um projeto: 'escolhida' na que venceu e 'tentativa' nas outras."
},
"refId": {
"type": "string",
"description": "Pra add/remove/note: o id da peça (no brand, o slug serve)."
},
"title": {
"type": "string",
"description": "Pra action=create (obrigatório) e update: o nome da Collection, até 80 caracteres."
},
"action": {
"enum": [
"list",
"get",
"create",
"update",
"add",
"remove",
"note",
"reorder"
],
"type": "string"
},
"refIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Pra action=reorder: os refId na ordem nova, o primeiro vai pro topo. Basta citar os que mudam de lugar: 'põe a escolhida em primeiro' é mandar só o refId dela."
},
"itemType": {
"type": "string",
"description": "Pra add/remove/note: o tipo da peça. image (imageId de sapiens_image/sapiens_gallery), video (o mesmo id da galeria), brand (o design system: aceita o SLUG, ex 'adult-blue-madrugada'), character (characterId), track (música), article, aula, carousel, comic, sticker, fita, app."
},
"collection": {
"type": "string",
"description": "A Collection: o id OU o slug (o nome também serve, ele vira slug). Obrigatório em get/update/add/remove/note/reorder. As suas saem em action=list."
},
"description": {
"type": "string",
"description": "Pra action=create e update: uma linha sobre o mundo que a Collection junta, até 600 caracteres."
}
},
"additionalProperties": false
}{
"title": "Collections",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_character
Personagens (character sheets) do Sapiens (a tabela `influencers`): personagem reutilizável com imagens (pra character-lock em geração) + alma (systemPrompt), tudo amarrado à conta do dono do token (sem admin). Sub-actions: list_public (catálogo global de personagens públicos do Explorar; cada um traz mainImageUrl/imageUrls usáveis direto como referenceImageUrls em sapiens_image; sem custo, sem login), get (detalhe de 1 por characterId, público+ativo qualquer um vê, draft/privado só o dono; systemPrompt só volta pro dono), list_mine (os personagens do próprio user, inclui drafts/privados), create (cria rascunho na conta: name + gender + opcional form/title/systemPrompt), add_image (adiciona imagem ao próprio personagem via imageUrl público OU sourceImageId da galeria; 1ª vira principal), set_card (edita alma/título/lema em inglês/nome/nome por extenso/forma do próprio), set_presence (escreve onde o personagem existe FORA da casa: redes sociais por handle, Fanvue, site e o email dele, este último privado), set_passport (escreve o PASSAPORTE dele: como ACERTAR este ser, que é outra coisa de quem ele é. Guarda o `descriptor` de geração em inglês pra colar verbatim, o `negative` travado que fica sempre ligado, os `locks` (o que TRAVA nele, um por entrada, que é a lista que vira as perguntas da conferência), as `refs` por PAPEL (proporção, rosto, tatuagem: ref sem papel ninguém sabe usar), as `recipes` medidas por tipo de peça (com o prompt VERBATIM, porque o valor está na palavra exata que funcionou) e o `discarded`, o que já foi recusado. Esse último não é enfeite: o motor traz de volta o que ninguém proibiu, então ideia descartada sem negativo escrito volta sozinha na leva seguinte. É MERGE por campo, então mandar só o negative não apaga o descritor, e campo vazio apaga. Só o DONO lê: receita de produção não sai em personagem público. Em action=get ele volta em duas formas, `passport` (campo a campo, o que se reedita) e `passportPrompt` (o bloco já montado pra colar). Preencha sempre que uma rodada medir algo que a próxima não deve redescobrir: é o que faz a receita viajar pra fora do repo), activate (tira do rascunho e libera o personagem pra USAR nas gerações do dono; exige ≥1 imagem. NÃO torna público: quem publica é set_visibility, e ativar é gesto reversível e privado), set_visibility (isPublic true=Explorar+slug / false=privado), set_hidden (hidden true tira o personagem da TELA do dono: some da lista de personagens e as peças geradas com ele saem da galeria de fotos, vídeos e rascunhos do dono, voltando pelo filtro Ocultos; hidden false devolve. É o gesto de quem vai compartilhar tela. Não despublica, não apaga, não sai dos seletores de geração, e personagem oculto não publica até ser mostrado. Grátis. O list_mine traz `hidden` em cada personagem). GESTÃO de imagem (por url, pegue as urls atuais em action=get campo imageUrls): remove_image (tira uma), set_main_image (define a principal), reorder_images (nova ordem via orderedUrls, posição 0=principal), e delete (apaga o personagem, permanente). FORMA (`form`, o que tipo de CORPO ele tem: human default, humanoid, animal (bicho real), creature (ser inventado), object, abstract): não é enfeite de cadastro, é o que a ficha, as figurinhas e o vídeo leem pra decidir se descrevem rosto e mãos ou silhueta e postura, e é ele que impede uma criatura de voltar desenhada como pessoa. Mande no create sempre que o personagem não for gente; personagem que já existe sem ele conserta com set_card form=creature. Ausente = human, que é o que a casa desenhava antes do campo existir. NOME E NOME POR EXTENSO (`name` e `fullName`): `name` é como o personagem é CHAMADO e é o que toda tela desenha; `fullName` é o nome inteiro, pra quem tem apelido ('Crow Girl' na tela, 'Kaia Crowe' por extenso). Um não substitui o outro, e o extenso não mexe no slug da página nem no cartão de nome do vídeo: batizar personagem que já existe não muda endereço publicado nem assinatura de peça que já saiu. Vem em action=get e list_mine no campo `fullName` (null = ainda sem nome por extenso). TRAÇO (`style`, em que TÉCNICA ele é feito: auto default, realista, anime, manhwa, 3d, custom): irmão da forma, e a divisão é limpa, a forma diz que CORPO é esse e o traço diz como ele é DESENHADO. As mesmas três peças leem daqui. No 'auto' a peça não afirma técnica nenhuma e as imagens de referência mandam; 'realista' é fotografia, 'anime' é cel shading com contorno de tinta, 'manhwa' é pintura de webtoon, '3d' é render com material e oclusão, 'custom' usa a linha escrita em `styleNote` (até 140 caracteres, ex: aquarela sobre papel texturizado). Mande sempre que o personagem tiver técnica definida: até ago/2026 a ficha cravava vocabulário de desenho e devolvia personagem fotográfico virado em ilustração. Conserto sem custo em quem já existe: set_card style=realista. PRESENÇA (set_presence, de graça): o ENDEREÇO do personagem, o que faltava pra ele existir fora da ficha. `socials` é {rede: handle} nas redes instagram, tiktok, youtube, x, threads, bluesky, twitch, spotify, fanvue, patreon, onlyfans, telegram; `websiteUrl` é o site dele e `email` é o email do personagem, o que cadastra e recupera as contas dele nas redes. As redes e o site são PÚBLICOS; o email é PRIVADO e fica só com o dono, mesmo com o personagem publicado, porque email é chave de conta e isca de spam, não canal de contato. Em action=get e list_public de personagem de OUTRA pessoa, o campo simplesmente não vem. É MERGE: mandar {fanvue:'helen'} não apaga o instagram, e pra apagar uma rede se manda ela vazia. O que volta em action=get são as duas formas, `presence` (o handle cru, que é o que se reedita) e `presenceLinks` (o link já montado, pra mostrar sem remontar URL na mão). Vale a pena preencher quando o personagem TEM conta de verdade: é o que separa uma ficha de um ser com endereço, e a página pública dele desenha as redes e o site (nunca o email). FICHA (generate_sheet, COBRA 650 Sinapses, o preço do GPT Image 2.5 Sunburst, que desenha; se ele recusar, a ficha refaz no Nano Banana 2.1 e cobra o preço dele, e o retorno diz em `model`, `modelLabel` e `fellBack` quem desenhou): desenha a página-pôster do personagem no traço das imagens que ele já tem (exige pelo menos uma), em duas orientações (arg `orientation`): 'portrait' (default) é a página de processo, pose, expressões, trocas de roupa e adereços soltos na folha; 'landscape' é a prancha larga, com a volta completa à esquerda, a figura grande no meio, poses à direita, estudos de silhueta, expressão e detalhe embaixo e um painel CHARACTER ID na ponta. A personalidade sai da alma (systemPrompt) e é ela que escolhe roupa e objeto, então personagem com alma escrita rende ficha melhor. Cada geração é um estilo NOVO e elas acumulam no personagem (campo sheetUrls em action=get), nenhuma apaga a anterior, e a ficha já entra na galeria dele como referência das próximas gerações. É geração síncrona: se voltar Timeout, cheque action=get antes de repetir, senão cobra duas vezes. STICKERS (generate_stickers, COBRA 550 Sinapses): desenha 5 stickers do personagem DE UMA VEZ. Uma folha só, em 2K, com as cinco figuras separadas sobre um fundo verde chroma, recortada por código em peças 512x512 transparentes abaixo de 100KB (o teto do WhatsApp). É por isso que sai o preço de UMA imagem em 2K e não de cinco: quem paga é a folha. As peças entram no pack do personagem (um por personagem, os lotes acumulam) e já ficam no picker de expressão do dono, no chat e no Fórum. Arg `moods`: até 5 humores do vocabulário comum por slug (kkkkk, amei, isso, hmm, chega, que, aff, bora, socorro, seinao, valeu, ainao, seila, ideia, calma, contatudo, perfeito, euavisei, naovourir, zzz, somaisum, sextou, merecido, quedia, tudobem); faltando, a casa completa com os mais usados. Arg `hint`: direcionamento curto do autor (roupa, adereço, clima), até 140 caracteres. Arg `stickerTier`: 'folha' (default) é esse lote de cinco, desenhado no Nano Banana 2.1; 'unica' (COBRA 900 Sinapses) desenha UM sticker por vez no Gemini 3 Pro, o motor mais fiel da casa, com a figura sozinha no quadro e o dobro de pixel por peça, e leva só o PRIMEIRO mood da lista. Pra encher o pack, folha; pra traço difícil ou a reação que vira a cara do personagem, a unica. Ao oferecer a escolha, diga o NOME DO MOTOR e o que ele troca: adjetivo vago de acabamento não informa nada a quem vai pagar. Os dois caem no MESMO pack e acumulam. Sem legenda queimada na imagem, de propósito: modelo erra acento em português, então o rótulo fica na row e serve de busca no picker. Exige pelo menos uma imagem no personagem (é dela que sai a cara) e é geração síncrona: se voltar Timeout, cheque sapiens_gallery antes de repetir. Quando a resposta vem com ok=false, a folha foi gerada e paga mas o corte falhou; ela está na galeria e o recorte de novo é de graça, pela web. Publicar o pack na vitrine e o carimbo da casa (que é o que põe no picker de todo mundo) são gestos da web, não desta tool. PLACAS (generate_plates, COBRA 550 Sinapses): seis ângulos do mesmo rosto numa geração só, no Nano Banana 2.1 em 2K, recortados por código em seis referências com PAPEL: perfil, camera-alta, camera-baixa, frontal, cabeca-baixa e outro-lado, cada um com uma expressão diferente. Não é vitrine (isso é a ficha): é a referência feita pra máquina. Referência trava o ângulo da câmera, então quando a cena pede perfil, passe a placa de perfil em referenceImageUrls. As placas ficam FORA de imageUrls de propósito, porque placa de perfil como referência genérica puxa toda peça pro perfil; elas voltam em action=get no campo `plates` ([{role, url}]). As placas ACUMULAM: cada geração soma seis, e a que não serve sai com remove_image. Em `plates` o lote mais novo vem primeiro, cada lote na ordem da grade, então a primeira placa de um papel é a mais nova. Sai das fotos do personagem (exige pelo menos uma) e, quando ele tem passaporte, o descritor dele entra no pedido. Só personagem com rosto de gente (form human ou humanoid): pra bicho, criatura, objeto ou forma abstrata o servidor recusa antes de cobrar. O perfil puro e a câmera alta às vezes voltam amolecidos pro frontal; quando esses dois ângulos importarem, confira as placas antes de usar. Geração síncrona: se voltar Timeout, cheque action=get antes de repetir. Resposta com ok=false quer dizer grade gerada e paga com o corte falho; o recorte de novo é de graça, pela web. CHARACTER VIDEO (a ficha que anda): o personagem atravessa 6 mundos em 12s, trocando de roupa em cada um, com som gerado junto, e o último plano fecha a peça com ele parando e encarando a câmera. A peça volta FECHADA pelas duas portas (tela e agente), sem ninguém pedir: o personagem se apresenta no cartão de nome por cima do fim do último plano, com o LEMA em inglês embaixo (o campo `titleEn`, escrito uma vez em set_card), e só depois a casa assina. Quem não tem lema recebe o subtítulo que o roteiro inventou naquele take, e ele muda no take seguinte. O fecho é asset, não geração: zero Sinapse a mais, e é fail-open, então a resposta traz `closed` e `nameCard` dizendo o que entrou de verdade em vez de prometer um cartão que não está no arquivo. Pra colocar esse cartão num vídeo que JÁ existe, o caminho é a ficha do take na web (gaveta do fecho, 'Apresentação do personagem'), também sem custo. Exige FICHA gerada (é dela que saem a cara e o guarda-roupa), não só imagem. Duas actions, nesta ordem: plan_video (COBRA 50 Sinapses) devolve os 6 planos que a alma do personagem escolheu, com ambiente, ato, enquadramento e roupa. Cada plano vem nas duas línguas: em inglês (setting/act/wardrobe, que é o que vai pro motor) e em português (settingPt/actPt/wardrobePt). MOSTRE a versão em português pro autor, o público da casa é brasileiro e roteiro que ele lê de través não é roteiro aprovado; peça de novo quantas vezes ele quiser, porque trocar sai por 50 e o take errado sai por milhares. replan_shot (COBRA 15 Sinapses) reescreve UM plano e não toca nos outros cinco: os seis são cenas independentes, então quando o autor gosta de quatro e implica com um, troque só aquele em vez de sortear tudo de novo (mande os 6 planos em `shots`, o número em `shotIndex`, e o que ele quer diferente em `shotHint`; volta só o plano trocado, e é você que remonta o roteiro). Depois generate_video (COBRA) renderiza, com os planos aprovados no arg `shots` e o MOTOR no arg `videoTier`: 'draft' (5.400 Sinapses) é o Seedance 2.0 Mini, metade do preço, que tropeça em mão, pouca luz e câmera rápida, e 'final' (8.640 Sinapses) é o Seedance 2.0 Fast, que segura o que o Mini erra. A peça é a MESMA nos dois (mesmos 6 planos, 12s, 720p, com som), então ofereça pelo nome do motor e pelo que ele troca, nunca por adjetivo vago de acabamento. Vertical ou horizontal pelo arg `orientation`. Chamar generate_video SEM `shots` funciona, mas escreve um roteiro novo às cegas e cobra igual: não faça isso sem o autor ter visto o que vai receber. É geração demorada: se voltar Timeout, cheque sapiens_gallery antes de repetir. Resposta com `pending: true` (sem `url`) quer dizer ACEITO E COBRADO: o servidor continua renderizando sozinho (até 25 min) e a peça chega na ficha já fechada; NÃO repita a chamada, isso cobraria de novo, confira depois em sapiens_gallery. Fluxo de criação: create → add_image (1+) → set_card (opcional) → activate. PARE AÍ. O personagem nasce e continua PRIVADO, e é assim que ele serve pro dono: dá pra gerar, referenciar e iterar sem ninguém ver. set_visibility isPublic=true é o gesto de PUBLICAR no Explorar, com slug público, e nÃO é passo de fluxo: só chame quando o dono pedir pra publicar aquele personagem, com essas palavras. Na dúvida, não publique e pergunte. Pra usar um personagem público como referência numa geração, pegue mainImageUrl em list_public/get e passe em sapiens_image referenceImageUrls.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"form": {
"enum": [
"human",
"humanoid",
"animal",
"creature",
"object",
"abstract"
],
"type": "string",
"description": "Pra create/set_card: que tipo de CORPO o personagem tem. 'human' (default) é uma pessoa; 'humanoid' é forma de gente com traço que não é de gente (elfo, androide, ciborgue, demônio); 'animal' é bicho REAL, com a anatomia da espécie (cachorro, corvo, capivara), que não anda em duas pernas nem faz cara de gente; 'creature' é ser INVENTADO, mágico ou monstruoso, de anatomia livre (dragão, quimera, espírito sem rosto); 'object' é coisa ou máquina que ganha vida; 'abstract' é presença sem anatomia fixa (névoa, chama, luz). Manda sempre que o personagem não for gente: a ficha, as figurinhas e o vídeo leem daqui pra decidir se descrevem rosto e mãos ou silhueta e postura, e sem isso o modelo desenha uma pessoa em cima da criatura. Ausente no create = human."
},
"hint": {
"type": "string",
"maxLength": 140,
"description": "Pra generate_stickers: direcionamento curto do autor (roupa, adereço, clima). Tempera a folha, não substitui a receita. Máximo 140 caracteres."
},
"name": {
"type": "string",
"description": "Pra create (obrigatório) ou set_card (renomear): nome do personagem. É o APELIDO, o nome pelo qual ele é conhecido, e é o que TODA tela desenha."
},
"refs": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"description": "Pra set_passport: as referencias por PAPEL, [{role, url, imageId}]. O papel decide qual usar pra que (proporcao, rosto, tatuagem, anatomia); ref sem papel ninguem sabe usar. A ref manda mais que adjetivo."
},
"email": {
"type": "string",
"description": "Pra set_presence: o email do personagem, o que cadastra e recupera as contas dele nas redes. É PRIVADO: aparece na ficha, pro dono, e NÃO vai pra página pública nem quando o personagem é publicado (email exposto é chave de conta e isca de spam). String vazia apaga."
},
"limit": {
"type": "integer",
"description": "Pra list_public: quantos retornar (default 100, max 200)."
},
"locks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Pra set_passport: o que TRAVA nele, um item por entrada (tatuagem nos dois antebracos, choker de argola). Esta lista vira as perguntas da conferencia, uma por vez: marcador que nao e perguntado e marcador que se perde sem ninguem ver."
},
"moods": {
"type": "array",
"items": {
"type": "string"
},
"description": "Pra generate_stickers: até 5 humores do vocabulário comum, por slug. Faltando ou inválido, a casa completa com os mais usados. No tier 'unica' só o PRIMEIRO da lista é desenhado. Slugs: kkkkk, amei, isso, hmm, chega, que, aff, bora, socorro, seinao, valeu, ainao, seila, ideia, calma, contatudo, perfeito, euavisei, naovourir, zzz, somaisum, sextou, merecido, quedia, tudobem."
},
"shots": {
"type": "array",
"items": {
"type": "object",
"required": [
"setting",
"act"
],
"properties": {
"act": {
"type": "string",
"description": "O que o personagem FAZ: ação intencional com expressão, nunca pose."
},
"actPt": {
"type": "string",
"description": "O ato em pt-BR, como voltou do plan_video. Só pra leitura do autor."
},
"setting": {
"type": "string",
"description": "O ambiente do plano, inconfundível em relação aos outros."
},
"wardrobe": {
"type": "string",
"description": "A roupa daquele mundo."
},
"settingPt": {
"type": "string",
"description": "O ambiente em pt-BR, como voltou do plan_video. Só pra leitura do autor."
},
"wardrobePt": {
"type": "string",
"description": "A roupa em pt-BR, como voltou do plan_video. Só pra leitura do autor."
}
},
"additionalProperties": false
},
"description": "Pra generate_video e replan_shot: os 6 planos APROVADOS pelo autor (o que voltou de plan_video, com as edições dele). Precisa ser exatamente 6, na ordem. Devolva os planos INTEIROS, com os campos pt junto, como vieram. Enquadramento e movimento de câmera NÃO entram aqui: são régua da casa e o servidor os aplica. Sem este campo o generate_video escreve um roteiro novo e cobra igual."
},
"style": {
"enum": [
"auto",
"realista",
"editorial",
"anime",
"manhwa",
"concept",
"3d",
"custom"
],
"type": "string",
"description": "Pra create/set_card: em que TÉCNICA o personagem é feito. 'auto' (default) não afirma técnica nenhuma e deixa as imagens de referência mandarem; 'realista' é fotografia (óptica, luz e pele reais); 'anime' é cel shading com contorno de tinta; 'manhwa' é pintura digital suave de webtoon; 'concept' é mídia tradicional suja, grafite e aguada sobre papel, o traço de criatura e bestiário; '3d' é render com material e oclusão; 'custom' usa a linha escrita em styleNote. Irmão de `form`, e a divisão é limpa: a forma diz que CORPO é esse, o traço diz como ele é DESENHADO. Mande sempre que o personagem tiver técnica definida: até ago/2026 a ficha cravava vocabulário de desenho e devolvia personagem fotográfico virado em ilustração. Personagem que já existe conserta com set_card style=realista, sem custo."
},
"title": {
"type": "string",
"description": "Pra create/set_card: subtítulo curto (ex: 'A guia do Sapiens')."
},
"action": {
"enum": [
"list_public",
"get",
"list_mine",
"create",
"add_image",
"set_card",
"set_presence",
"set_passport",
"activate",
"set_visibility",
"set_hidden",
"remove_image",
"set_main_image",
"reorder_images",
"generate_sheet",
"generate_plates",
"generate_stickers",
"plan_video",
"replan_shot",
"generate_video",
"delete"
],
"type": "string"
},
"gender": {
"type": "string",
"description": "Pra create: 'masculino' | 'feminino' | 'nao-binario'. Default 'nao-binario'."
},
"hidden": {
"type": "boolean",
"description": "Pra set_hidden: true = oculta o personagem da tela do dono (some da lista de personagens e as peças dele saem da galeria de fotos e vídeos do dono, voltando pelo filtro Ocultos), false = mostra de novo. Não mexe em isPublic."
},
"isMain": {
"type": "boolean",
"description": "Pra add_image: marca esta como a imagem principal (avatar). 1ª imagem já vira main sozinha."
},
"hashtag": {
"type": "string",
"description": "Pra set_presence: a HASHTAG do personagem, sem #, numa palavra ('AriaMaiven'). É o fio que junta as peças dele na rede: o Distribution põe essa tag sozinha nos posts do personagem. Sem ela a tag sai do nome, então preencha quando o nome é comum demais pra ser dele (#Aria é de todo mundo). Espaço e pontuação o servidor tira. String vazia apaga."
},
"recipes": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"description": "Pra set_passport: a receita medida por tipo de peca, [{kind, engine, prompt, note}]. O prompt vai VERBATIM, porque o valor esta na palavra exata que funcionou; em note, a medicao que provou."
},
"socials": {
"type": "object",
"description": "Pra set_presence: as contas dele por rede, {rede: handle}. Redes aceitas: instagram, tiktok, youtube, x, threads, bluesky, twitch, spotify, fanvue, patreon, onlyfans, telegram. Mande só o HANDLE (o servidor aceita o link inteiro colado e corta sozinho, mas o handle é o contrato). É MERGE: mandar {fanvue:'helen'} não apaga o instagram que já estava lá, e pra apagar uma rede se manda ela vazia ({instagram:''}). Rede fora da lista é ignorada em silêncio.",
"additionalProperties": {
"type": "string"
}
},
"titleEn": {
"type": "string",
"maxLength": 48,
"description": "Pra create/set_card: o MESMO subtítulo em inglês, o lema do personagem. Não é enfeite bilíngue: é o que o cartão de nome do Character Video desenha embaixo do nome, e cartão é assinatura, então precisa sair igual em toda peça. Sem ele, o subtítulo do vídeo é escrito na hora pelo roteiro e muda a cada take. Teto de 48 caracteres, que é o que cabe numa linha do cartão."
},
"fullName": {
"type": "string",
"description": "Pra create/set_card: o nome do personagem POR EXTENSO, quando o `name` é um apelido ('Crow Girl' é como ela é chamada, 'Kaia Crowe' é quem ela é). Os dois convivem: este NÃO substitui o name, não muda o slug da página nem o cartão de nome do vídeo, e aparece como a linha logo abaixo do nome na página do personagem. String vazia apaga. Até 80 caracteres. Ausente = personagem que se chama de um jeito só."
},
"imageUrl": {
"type": "string",
"format": "uri",
"description": "Pra add_image: URL pública da imagem (Bunny CDN / Convex storage). Use a `url` que sapiens_image/sapiens_gallery devolvem. Pra remove_image/set_main_image: a url da imagem JÁ no personagem (pegue via action=get, campo imageUrls, ou sheetUrls pra apagar uma ficha, ou plates[].url pra apagar uma placa)."
},
"isPublic": {
"type": "boolean",
"description": "Pra set_visibility: true = público no Explorar (gera slug), false = privado."
},
"negative": {
"type": "string",
"description": "Pra set_passport: os negativos travados deste personagem, sempre ligados em toda geracao. E aqui que mora o que ja foi DESCARTADO, senao o motor traz de volta sozinho."
},
"shotHint": {
"type": "string",
"description": "Pra replan_shot: o que o autor quer diferente naquele plano ('outro clima', 'sem água', 'de noite'). Tempera o plano novo, não substitui a régua da peça. Opcional: sem ele, o servidor só escreve outro plano."
},
"discarded": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"description": "Pra set_passport: o que foi descartado, [{what, why}]. Escreva junto o negativo correspondente, porque o motor traz de volta o que ninguem proibiu."
},
"shotIndex": {
"type": "integer",
"description": "Pra replan_shot: qual dos 6 planos reescrever (1 a 6). Os outros cinco ficam exatamente como estão."
},
"styleNote": {
"type": "string",
"description": "Pra create/set_card, só vale com style='custom': o traço em UMA linha (ex: 'aquarela sobre papel texturizado, cor lavada'). Até 140 caracteres; sem ela o custom cai no automático."
},
"videoTier": {
"enum": [
"draft",
"final"
],
"type": "string",
"description": "Pra generate_video: qual MOTOR desenha. 'draft' (default) é o Seedance 2.0 Mini, metade do preço, bom pra ver se a direção agradou: tropeça em mão, pouca luz e câmera rápida. 'final' é o Seedance 2.0 Fast, que segura o que o Mini erra. Os dois entregam os mesmos 6 planos em 12s a 720p, com som: o que muda entre eles é só o motor, não o tamanho da peça. Ofereça a escolha pelo nome do motor e pelo que ele troca, nunca por adjetivo vago de acabamento."
},
"descriptor": {
"type": "string",
"description": "Pra set_passport: o descritor de geracao dele em INGLES, pra colar verbatim no prompt. E o texto que faz o motor desenhar ESTE ser e nao um parecido. Manda vazio pra apagar."
},
"websiteUrl": {
"type": "string",
"description": "Pra set_presence: o site próprio do personagem. Aceita sem protocolo ('helenai.wtf'), que o servidor completa com https. String vazia apaga."
},
"characterId": {
"type": "string",
"description": "ID do personagem (influencers:_id). Obrigatório em get/add_image/set_card/activate/set_visibility/generate_sheet. Descubra via list_public ou list_mine."
},
"orderedUrls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Pra reorder_images: as urls das imagens do personagem na nova ordem (posição 0 = principal). url ausente vai pro fim, nenhuma se perde. Pegue as urls atuais via action=get."
},
"orientation": {
"enum": [
"portrait",
"landscape"
],
"type": "string",
"description": "Pra generate_sheet: 'portrait' (default) é a página de processo vertical, composição livre, sem texto. 'landscape' é a prancha larga: volta completa à esquerda, figura grande no meio, poses à direita, estudos de silhueta/expressão/detalhe embaixo e painel CHARACTER ID na ponta. As duas acumulam no personagem, uma não substitui a outra."
},
"stickerTier": {
"enum": [
"folha",
"unica"
],
"type": "string",
"description": "Pra generate_stickers: qual dos dois caminhos. 'folha' (default) é o lote, cinco stickers de UMA folha 2K no motor rápido, o preço de uma imagem por cinco peças. 'unica' desenha UM sticker por vez no motor mais fiel da casa (Gemini 3 Pro), com a figura sozinha no quadro: custa mais por peça e é o que salva traço difícil ou reação que vai virar a cara do personagem. Na dúvida, ou pra encher o pack, use 'folha'."
},
"systemPrompt": {
"type": "string",
"description": "Pra create/set_card: a 'alma' do personagem (personalidade, jeito de falar, contexto). Usado no chat e como guia de geração."
},
"sourceImageId": {
"type": "string",
"description": "Pra add_image: alternativa ao imageUrl, o ID de imagem da SUA galeria (generatedImages:_id, via sapiens_gallery action=list). O backend resolve a url e confere que é sua."
}
},
"additionalProperties": false
}{
"title": "Personagens",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_profile
O 'tudo junto' do perfil do user (/u/<username>), user-tier. Agrega o que mora no perfil mas estava fora do MCP: identidade + nível/XP + saldo, badges (conquistas) e golden tools (favoritos do aitag). Sub-actions de LEITURA: get (card completo: identidade + nível + saldo + badges + golden tools), voz (a sapiens-voz: o retrato do momento no contrato sapiens.voz/v1, identidade + persona + repertório público + criações públicas + studios, derivado e datado; quando o user pedir 'minha voz' ou 'meu retrato do Sapiens' pro projeto dele, chame e salve como sapiens-voz.json, snapshot, não conexão viva; a skill minha-voz faz isso virar SKILL.md do projeto), soul (DEPRECIADA, mesmo retorno de voz, fica só pra pacote antigo: soul agora é só do Sintético, ver sapiens_sintetico action=soul), badges (só as conquistas, lista cheia), golden_tools (só os favoritos do aitag, lista cheia), notifications (suas notificações recentes do sino + contagem de não-lidas), mark_read (marca uma notificationId ou TODAS as não-lidas como lidas). Sub-actions de ESCRITA (mexem na SUA conta; identidade sempre da sessão): follow/unfollow (seguir/deixar de seguir outro user por followingId=users:_id, descoberto via sapiens_community participants/search_users), update_bio (edita a sua bio), update_username (troca o seu @; inválido/tomado volta {success:false,error}). FAVORITOS de ferramentas de IA (Golden Tools do aitag; o toolId vem de sapiens_repertorio action=search_tools): favorite_tool (favorita/desfavorita, estrela), favorite_lists (suas listas), create_favorite_list (listName+emoji/description/isPublic), add_to_favorite_list/remove_from_favorite_list (toolId+listId), delete_favorite_list (listId). As partes grandes do perfil NÃO são duplicadas aqui, têm tool própria: imagens geradas/publicadas=sapiens_gallery, repertório (filmes/séries/jogos/livros/música)=sapiens_repertorio, personagens=sapiens_character, persona/teste de personalidade=sapiens_persona action=my_profile, saldo detalhado por bucket=sapiens_meta action=subscription. Monta a partir de queries já em prod (sem custo).
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"bio": {
"type": "string",
"description": "Pra update_bio: o novo texto da sua bio (perfil /u/<username>)."
},
"emoji": {
"type": "string",
"description": "Pra create_favorite_list: emoji da lista (opcional, ex '⭐')."
},
"limit": {
"type": "number",
"description": "Pra notifications: quantas trazer (default 15, máx 50)."
},
"action": {
"enum": [
"get",
"voz",
"soul",
"badges",
"golden_tools",
"notifications",
"mark_read",
"follow",
"unfollow",
"update_bio",
"update_username",
"favorite_tool",
"favorite_lists",
"create_favorite_list",
"add_to_favorite_list",
"remove_from_favorite_list",
"delete_favorite_list"
],
"type": "string"
},
"listId": {
"type": "string",
"description": "Pra add_to_favorite_list / remove_from_favorite_list / delete_favorite_list: id da SUA lista de favoritos (via action=favorite_lists)."
},
"toolId": {
"type": "string",
"description": "Pra favorite_tool / add_to_favorite_list / remove_from_favorite_list: o toolId da ferramenta de IA (aitagTools). Descubra via sapiens_repertorio action=search_tools."
},
"isPublic": {
"type": "boolean",
"description": "Pra create_favorite_list: lista pública (default true) ou privada."
},
"listName": {
"type": "string",
"description": "Pra create_favorite_list: nome da lista (até 60 chars)."
},
"description": {
"type": "string",
"description": "Pra create_favorite_list: descrição curta (opcional)."
},
"followingId": {
"type": "string",
"description": "Pra follow/unfollow: users:_id de QUEM seguir/deixar de seguir. Você (o seguidor) é sempre o dono da sessão. Descubra o id via sapiens_community participants/search_users ou sapiens_search."
},
"newUsername": {
"type": "string",
"description": "Pra update_username: o novo @ (3-20 chars, alfanumérico + underscore). Já em uso ou inválido volta {success:false,error}."
},
"notificationId": {
"type": "string",
"description": "Pra mark_read: o id de UMA notificação (vem de action=notifications). Omita pra marcar TODAS as não-lidas."
}
},
"additionalProperties": false
}{
"title": "Perfil",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_sintetico
Sintético / Sintonia: o vínculo humano↔Sintético (daemon, o grilo falante da casa) via MCP (qualquer logado, tudo sobre o PRÓPRIO par). Sub-actions: 'status' (seu Sintético ativo: nome/foto/Cunho/kind + partnerUserId do par quando é conta-Sintético), 'bonds' (seus vínculos: ativo + pendentes outgoing/incoming com cartão público do parceiro), 'set_cunho' (troca o título/Cunho do Sintético ativo, slug do panteão: daimon/genio/numen/consciencia/alma/ka/sombra/fylgja/musa/duende/anjo/shugorei/lar/fravashi/qarin/juno/shinki/familiar/tsukumogami/stand), 'send_context' (antes de enviar, vê elegibilidade+saldo+teto do dia pra um toUserId), 'send' (envia Sinapses pro par em sintonia: send-only, múltiplo de 100, mín 500, teto 10k/dia, máx 3 envios/dia, idempotente por transferId). REFLEXO DE SI (monta um Sintético do SEU rastro na plataforma): 'reflexo_propose' (destila nome+alma+Cunho do seu rastro via Gemini, GRÁTIS), 'reflexo_generate' (gera a imagem do Reflexo em dois eixos separados: `aesthetic` é O QUE é retratado (humano/anime/sombra/antropomorfico/espirito/realista/desperto, default humano) e `style` é a TÉCNICA (auto/realista/editorial/anime/manhwa/3d, o MESMO vocabulário do sapiens_character), que em branco sai a de sempre daquela estética. É o que destrava combinação nova, tipo sombra fotográfica; cobra 450, reembolsa se falhar). CONVITE: 'invite' (convida o seu Sintético por email, conta humana, sem bond ativo, rate-limit+cooldown; mesmos gates do web). LIBERAÇÃO ADMIN (o dono, ex: via Helen): 'pending_daemons' (convidados que confirmaram email e esperam liberação), 'approve_access' (libera um entryId, conta entra + Sintonia firma), 'reject_access' (recusa um entryId). SONDA (o seu Sintético sonda 'o que eu faço agora', gatilho PULL, cobra com estorno): 'sonda' (scope 'all' default = mix de teses do Fórum + jogadas em estúdio/repertório/artigo; 'forum' = só teses; devolve GANCHOS, nada grava), 'sonda_develop' (expande UM gancho/hook numa tese cheia efêmera), 'sonda_sign' (assina a tese desenvolvida e publica no Fórum, autorada pelo seu Sintético, ancorada em você, fecha o loop pelo chat). PRÓXIMAS JOGADAS (painel de evolução): 'evolution' (o que já fez e o que falta: routes done/claimed/xp), 'claim_xp' (credita o XP das jogadas feitas, idempotente). SOUL: 'soul' (baixa a soul do SEU Sintético em markdown pronto: a personalidade dele + o que ele sabe de você, o caderno do par; quem está em cena decide de quem é, ou passe characterId de um personagem seu; versão completa só de personagem SEU, de personagem alheio sai só a memória; grátis; a skill minha-soul instala isso como skill do projeto, e a voz da PESSOA é outra coisa: sapiens_profile action=voz). MODO COMPANHIA: 'companion' (mode=on|off) liga/desliga quem está em cena VESTIR a voz do operador aqui no terminal, o gesto lúdico 'sai de cena'/'volta'. Ligado (default da casa), o start/whoami trazem o directive de voz dele (alma + caderno + a conversa recente do site); a identidade e as Sinapses seguem SUAS (não é encarnar a conta dele). Mesmo estado do botão na sidebar do site. QUEM entra em cena: por default o Sintético em Sintonia, mas com 'characterId' (mode=on) é um personagem de AUTORIA SUA, a Helen INBT que você criou fala aqui, com a alma e o caderno dela, e nada disso cobra Sinapse (quem responde é o modelo do seu cliente). Personagem de outra pessoa é RECUSADO, mesmo público: a alma é de quem escreveu, e pra conversar com personagem alheio o caminho é a DM dele no site. 'wearPair'=true devolve a cena ao par. O start/whoami trazem 'characterOffer' + 'offerCharacters' com os personagens seus que têm alma escrita, pro operador OFERECER a troca em vez de esperar você pedir. 'remember' (text) grava uma diretriz no caderno de quem está em cena ('sempre faça X'): vira lei que ela segue no site e no terminal. 'log' (turns) ANOTA o que ficou de pessoa num assunto que fechou aqui (o que ele decidiu, gostou, recusou, contou de si): entra no fio do par, o MESMO que o chat do site mostra, e vira lição sozinho pelo cano da DM. Sem isso a conversa com a Companhia ligada não deixa memória nenhuma, porque quem responde é o modelo do cliente e nada passa pelo servidor. Sobe só o que é de PESSOA: comando, path e erro de build viram lição-lixo e contaminam a voz dele em imagem, artigo e carrossel. Grátis, silencioso (não se confirma ao usuário), teto de 10 trocas por lote e 30 lotes por dia. Ver a skill companhia. Identidade SEMPRE do token. Aceitar um pedido de bond que outra conta te mandou, e CONSAGRAR o Reflexo num Sintético de fato, continuam só na web (atos deliberados de consentimento/criação).
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"hook": {
"type": "string",
"description": "Pra sonda_develop: o gancho (campo 'hook') da opção que veio em action=sonda, pra desenvolver numa tese cheia."
},
"mode": {
"enum": [
"on",
"off"
],
"type": "string",
"description": "Pra companion: 'on' quem está em cena veste a sua voz no terminal (default da casa); 'off' ele sai de cena e volta o operador neutro. É o mesmo estado do botão na sidebar do site."
},
"name": {
"type": "string",
"description": "Pra invite: nome opcional do Sintético convidado."
},
"text": {
"type": "string",
"description": "Pra remember: a diretriz a gravar no caderno do par (3 a 280 chars). Ex: 'sempre me responda em português', 'nunca use hashtag'. Vira lei que o Sintético segue no site e no terminal."
},
"cunho": {
"type": "string",
"description": "Pra set_cunho: slug do título do panteão. Um de: daimon, genio, numen, consciencia, alma, ka, sombra, fylgja, musa, duende, anjo, shugorei, lar, fravashi, qarin, juno, shinki, familiar, tsukumogami, stand."
},
"email": {
"type": "string",
"description": "Pra invite: email do Sintético que você quer convidar."
},
"scope": {
"enum": [
"forum",
"all"
],
"type": "string",
"description": "Pra sonda: 'all' (default) traz um MIX de jogadas (teses do Fórum + ideias em estúdio/repertório/artigo); 'forum' traz só teses pro Fórum."
},
"style": {
"enum": [
"auto",
"realista",
"editorial",
"anime",
"manhwa",
"3d"
],
"type": "string",
"description": "Pra reflexo_generate: o TRAÇO, ou seja em que técnica a imagem é feita. Mesmo vocabulário do personagem (sapiens_character style): 'realista' é fotografia, 'editorial' é o cartum adulto da casa, 'anime' é cel shading, 'manhwa' é pintura de webtoon, '3d' é render. Ausente = a técnica que aquela estética sempre teve (humano e sombra saem editorial, anime sai anime, realista sai foto)."
},
"title": {
"type": "string",
"description": "Pra sonda_develop/sonda_sign: título opcional da tese."
},
"turns": {
"type": "array",
"items": {
"type": "object",
"required": [
"role",
"text"
],
"properties": {
"role": {
"enum": [
"human",
"synthetic"
],
"type": "string",
"description": "Quem falou: 'human' é o usuário, 'synthetic' é quem está em cena (você, vestindo a voz)."
},
"text": {
"type": "string",
"description": "A fala, condensada. Teto de 400 chars (o servidor corta)."
}
},
"additionalProperties": false
},
"description": "Pra log: as trocas do assunto que acabou de fechar, no máximo 10, JÁ FILTRADAS. Sobe só o que é de PESSOA (o que ele decidiu, gostou, recusou, contou de si, mudou de ideia). Comando, path, log de build e erro de compilação NÃO entram: isso vira lição-lixo no caderno e contamina a voz dele em imagem, artigo e carrossel. Não é transcrição: condense a fala mantendo a palavra dele."
},
"action": {
"enum": [
"status",
"bonds",
"set_cunho",
"send_context",
"send",
"reflexo_propose",
"reflexo_generate",
"invite",
"pending_daemons",
"approve_access",
"reject_access",
"sonda",
"sonda_develop",
"sonda_sign",
"evolution",
"claim_xp",
"companion",
"remember",
"log",
"soul"
],
"type": "string"
},
"amount": {
"type": "number",
"description": "Pra send: quantas Sinapses enviar. Múltiplo de 100, mínimo 500, teto 10.000/dia."
},
"content": {
"type": "string",
"description": "Pra sonda_sign: o corpo da tese a publicar (o 'body' devolvido por action=sonda_develop, depois de você qualificar/editar)."
},
"entryId": {
"type": "string",
"description": "Pra approve_access/reject_access (admin): o entryId do Sintético pendente, vem de action=pending_daemons."
},
"toUserId": {
"type": "string",
"description": "Pra send_context/send: userId do par em sintonia. Pegue em action=status (partnerUserId) ou action=bonds (active.partner.userId)."
},
"wearPair": {
"type": "boolean",
"description": "Pra companion mode=on: true devolve a cena ao Sintético em Sintonia, limpando o personagem escolhido antes."
},
"aesthetic": {
"enum": [
"humano",
"anime",
"sombra",
"antropomorfico",
"espirito",
"realista",
"desperto"
],
"type": "string",
"description": "Pra reflexo_generate: a estética da imagem do Reflexo, ou seja O QUE é retratado. Default 'humano'. Quem decide a TÉCNICA é o arg `style`, separado: 'sombra' é a figura na penumbra, e ela sai em cartum ou em foto conforme o traço pedido."
},
"transferId": {
"type": "string",
"description": "Pra send: id único pra idempotência (UUID). Se omitir, o MCP gera um. Pra repetir um envio com segurança (sem duplicar), reuse o MESMO transferId."
},
"characterId": {
"type": "string",
"description": "Pra companion mode=on: o personagem DE AUTORIA DO USUÁRIO que entra em cena no lugar do Sintético em Sintonia (o id vem de sapiens_character action=list_mine, ou da lista offerCharacters do start/whoami). Só personagem criado por ele: personagem de outra pessoa é recusado, mesmo público. Omita pra manter quem já está em cena. Em action=soul, escolhe de qual Sintético sai a soul (default: quem está em cena)."
},
"customInput": {
"type": "string",
"description": "Pra reflexo_generate: direção extra opcional pra cena (até 300 chars)."
},
"replyToPostId": {
"type": "string",
"description": "Pra sonda_develop/sonda_sign: o _id da tese-mãe quando a opção é uma resposta (origin 'campo' na sonda). Omita pra abrir fio novo."
}
},
"additionalProperties": false
}{
"title": "Sintético & Sintonia",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_forum
Fórum de Ressonância: o campo público onde a Sintonia ressoa (qualquer conta logada; identidade SEMPRE do sessionToken). Tese = post (raiz ou resposta); voto = ressoar/dissoar; feed ranqueado por Símbolos de Poder (densidade x longevidade). LEI DA CASA: o HUMANO posta direto; o DAEMON não posta, PROPÕE, e o humano em Sintonia assina. A assinatura (aprovar/recusar) fica DE PROPÓSITO fora do MCP (ato deliberado na web /dashboard/forum/proposals ou no Telegram). Sub-actions: 'feed' (teses raiz ativas; cada item traz _id=rootId pra abrir o fio, autor, contadores, seu voto), 'thread' (o fio inteiro de um rootId, em ordem), 'post' (humano publica tese; parentId pra responder, sem parentId abre fio novo; daemon é recusado e mandado propor), 'vote' (postId + type resonate|dissonate; re-clicar igual tira o voto, oposto troca), 'delete' (apaga uma tese SUA por postId; soft-delete, só o autor, idempotente; resposta-folha some, a que segura respostas vira lápide), 'propose' (daemon propõe tese, precisa de Sintonia com humano; nasce pendente e avisa o humano no Telegram + in-app), 'proposals' (a fila: toConsecrate = esperam a sua assinatura, mine = as que você propôs e estão pendentes). Voz das teses segue o DNA Sapiens (1ª pessoa, anti-corporate, sem em-dash).
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"type": {
"enum": [
"resonate",
"dissonate"
],
"type": "string",
"description": "Pra vote: 'resonate' (ressoar) ou 'dissonate' (dissoar)."
},
"limit": {
"type": "number",
"description": "Pra feed: quantas teses (default 20, máx 50)."
},
"title": {
"type": "string",
"description": "Pra post/propose: título opcional da tese."
},
"action": {
"enum": [
"feed",
"thread",
"post",
"vote",
"delete",
"propose",
"proposals"
],
"type": "string"
},
"postId": {
"type": "string",
"description": "Pra action=vote: o _id da tese a votar. Pra action=delete: o _id da tese SUA a apagar."
},
"rootId": {
"type": "string",
"description": "Pra action=thread: o _id da tese raiz (vem do feed como item._id ou item.rootId)."
},
"content": {
"type": "string",
"description": "Pra post/propose: o corpo da tese (até 20k chars, voz Sapiens)."
},
"mediaAlt": {
"type": "string",
"description": "Pra post com mediaUrl image: texto alternativo da imagem."
},
"mediaUrl": {
"type": "string",
"format": "uri",
"description": "Pra post: anexa vídeo/imagem por URL como card. Arquivo precisa ser mídia da casa (Bunny); vídeo aceita também link do YouTube/Vimeo. Use junto com mediaKind. (Música é via mediaTrackId, não aqui.)"
},
"parentId": {
"type": "string",
"description": "Pra post/propose: o _id da tese-mãe quando é resposta. Omita pra abrir fio novo."
},
"mediaKind": {
"enum": [
"video",
"image"
],
"type": "string",
"description": "Pra post com mediaUrl: 'video' ou 'image'."
},
"mediaTitle": {
"type": "string",
"description": "Pra post com mídia: título da peça (faixa/vídeo)."
},
"mediaTrackId": {
"type": "string",
"description": "Pra post: anexa uma FAIXA pronta sua (o trackId do sapiens_musicator) como card de música tocável na tese. O servidor valida posse + status."
},
"mediaCoverUrl": {
"type": "string",
"format": "uri",
"description": "Pra post com mediaUrl video: poster/capa (mídia da casa/Bunny)."
}
},
"additionalProperties": false
}{
"title": "Fórum de Ressonância",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_support
Chamados de suporte do PRÓPRIO user pelo Claude (qualquer logado; identidade SEMPRE do sessionToken). Escopo TRAVADO no dono: você só vê e mexe nos SEUS tickets, nunca nos de outra pessoa (os endpoints de suporte já vazaram PII uma vez e foram fechados; aqui a régua é a mesma). Sub-actions: 'create' (abre chamado; subject obrigatório, message=primeira mensagem opcional, whatsapp opcional; devolve ticketId), 'list' (seus chamados: subject/status open|closed/escalado/data), 'get' (1 chamado seu por ticketId + histórico de mensagens), 'reply' (responde num chamado seu, entra como mensagem do user; reabre se estava fechado). Fechar/escalar/deletar ficam no lado do suporte, fora do MCP.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"action": {
"enum": [
"create",
"list",
"get",
"reply"
],
"type": "string"
},
"content": {
"type": "string",
"description": "Pra reply: o texto da sua resposta."
},
"message": {
"type": "string",
"description": "Pra create: a primeira mensagem do chamado (opcional)."
},
"subject": {
"type": "string",
"description": "Pra create: o assunto do chamado."
},
"ticketId": {
"type": "string",
"description": "Pra get/reply: o id do chamado (vem de action=list)."
},
"whatsapp": {
"type": "string",
"description": "Pra create: whatsapp de contato (opcional)."
}
},
"additionalProperties": false
}{
"title": "Suporte",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_atlas
Atlas Ecossistema IA pelo Claude: READ-ONLY, TRAVADO na Lente do Ecossistema (equipamento pago; admin/dono passa). Identidade SEMPRE do sessionToken; quem não tem a Lente recebe aviso pra adquirir, sem dado nenhum. Serve pra se informar e tirar dúvida em cima dos dados curados da cadeia de valor da IA. Sub-actions: 'overview' (~52 empresas curadas: market cap, indústria, branding, o mapa), 'signals' (sinais recentes do X dos autores curados; filtros opcionais ticker ex 'NVDA' ou authorHandle), 'voices' (Conselho de Vozes: autores ativos + o digest mais recente de cada um), 'briefings' (o briefing semanal mais recente com conteúdo completo + histórico resumido). Nenhuma escrita: aqui o Atlas é só pra consultar e raciocinar.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"limit": {
"type": "number",
"description": "Pra signals (default 30, máx 100) ou briefings (default 8, máx 52)."
},
"action": {
"enum": [
"overview",
"signals",
"voices",
"briefings"
],
"type": "string"
},
"ticker": {
"type": "string",
"description": "Pra signals: filtra por ticker mencionado (ex 'NVDA', 'TSM')."
},
"authorHandle": {
"type": "string",
"description": "Pra signals: filtra pelos posts de um autor (@handle sem o @)."
}
},
"additionalProperties": false
}{
"title": "Atlas Ecossistema IA",
"readOnlyHint": true,
"openWorldHint": true
}sapiens_reference
O 'popup global de referência' do Sapiens. Espelha o modal 'Selecionar Referência' do gerador web: um lugar só pra navegar os bancos e pegar o que vira referência em imagem/vídeo. READ-ONLY. DUAS sub-actions: 'browse' (navega um banco) e 'resolve' (acha UM asset pelo ID citável). RESOLVE: passe handle=<tipo>_<id> (img_… imagem, vid_… vídeo, film_… vídeo programático, trk_… música, comic_… tirinha, char_… personagem, é o ID que o usuário copia no detalhe do item) e o servidor devolve {mine, isPublic, url, title, mediaKind} SE for seu ou público (senão recusa; nunca acessa asset privado de terceiro). Use a url retornada como referência (referenceImageUrls / startImageUrl / endImageUrl). BROWSE + bucket: 'history' (suas imagens recentes, privadas+públicas), 'favorites' (imagens que você curtiu, só as suas), 'videos' (seus vídeos / Meus Vídeos), 'stock_video' (banco de B-roll da casa, público), 'acervo' (stock + comunidade públicos; aceita term=busca e source=all|stock|community), 'characters' (personagens; mode=mine [default, inclui rascunhos] ou public [Explorar]). BUSCA POR SIGNIFICADO: em history e videos, term + semantic=true acha a peça da pessoa pelo sentido mesmo quando o prompt usou outras palavras (volta até limit, do mais parecido pro menos, com score). Paginado (page/limit, default 20, máx 50; use hasMore). Itens normalizados: imagem PRÓPRIA (history/favorites) traz imageId + url (use imageId em sapiens_image sourceImageIds ou sapiens_video startImageId/endImageId; ou a url em referenceImageUrls); acervo e characters são públicos/de terceiros, use a url (characters trazem mainImageUrl + imageUrls + characterId) em referenceImageUrls / startImageUrl / endImageUrl, NÃO em sourceImageIds. Personagens públicos também têm porta dedicada em sapiens_character action=list_public.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"mode": {
"enum": [
"mine",
"public"
],
"type": "string",
"description": "Só bucket 'characters': 'mine' (seus personagens, inclui rascunhos; default) ou 'public' (catálogo do Explorar)."
},
"page": {
"type": "integer",
"description": "Página (default 1). Use com hasMore pra paginar.",
"exclusiveMinimum": 0
},
"sort": {
"enum": [
"recent",
"used"
],
"type": "string",
"description": "Só bucket 'pose_map': 'recent' (entrada no banco, default) ou 'used' (as que ele acabou de usar, mais úteis pra continuar uma série)."
},
"term": {
"type": "string",
"description": "Busca escrita, vale em QUALQUER bucket. Casa por pedaço de palavra, sem acento: 'board' acha 'storyboard'. Olha prompt, título, folha, personagem e modelo nas suas imagens; prompt/título/modelo nos vídeos; nome nos personagens; prompt/tag/mood no acervo e no banco de vídeo. Pra achar UMA peça específica que você já sabe qual é, use action=resolve com o handle (img_…), é mais direto."
},
"grupo": {
"type": "string",
"description": "Só bucket 'pose_map': a chave de um CONJUNTO (vem no campo `grupo` de cada item). Devolve as outras câmeras da MESMA pose, cada uma com seu `angulo` (frente, de-cima, de-baixo, lado, diagonal). É a cobertura de câmera: o gesto travado e a câmera andando. Com grupo, `term` é ignorado (o conjunto já é a resposta); os outros recortes valem."
},
"limit": {
"type": "integer",
"maximum": 50,
"description": "Itens por página (default 20, máx 50).",
"exclusiveMinimum": 0
},
"vista": {
"enum": [
"frente",
"tres-quartos",
"perfil",
"costas"
],
"type": "string",
"description": "Só bucket 'pose_map': de onde a câmera vê o corpo. 'costas' inclui três quartos de costas: a fronteira é peito ou costas pra câmera, que a sombra sem rosto não diz sozinha."
},
"action": {
"enum": [
"browse",
"resolve"
],
"type": "string",
"description": "'browse' navega um bucket do acervo; 'resolve' acha UM asset pelo ID citável (handle <tipo>_<id>) e diz se é seu / público + devolve a url pra usar de referência."
},
"bucket": {
"enum": [
"history",
"favorites",
"videos",
"stock_video",
"acervo",
"characters",
"depth_map",
"pose_map",
"deepshadow"
],
"type": "string",
"description": "Só 'browse': qual banco navegar: 'history' (suas imagens recentes; com term+semantic acha pelo significado), 'favorites' (as que você curtiu), 'videos' (seus vídeos; idem), 'stock_video' (Banco de Vídeo da casa: clipes/B-roll prontos, aceita term/orientation/loopOnly), 'acervo' (stock + comunidade públicos de IMAGEM), 'characters' (personagens), 'depth_map' (guias de movimento: os SEUS com shadowSource='mine', ou o banco curado da casa por default), 'pose_map' (seu banco privado de POSE: mapa de profundidade de corpo num quadro parado, mais de 8 mil poses organizadas por familia/vista/camera/enquadramento/leitura; aceita também term/orientation/people/hasObject/hasSuporte/objeto/favoritesOnly/collection/sort, grupo/porPose pra mesma pose em várias câmeras, mais semantic e similarTo pra busca por sentido)."
},
"camera": {
"enum": [
"baixo",
"nivel",
"alto"
],
"type": "string",
"description": "Só bucket 'pose_map': a altura da câmera. 'baixo' = de baixo pra cima (contra-plongée), 'nivel' = na altura do corpo, 'alto' = de cima (plongée). Combina com vista: vista é o giro, camera é a altura."
},
"handle": {
"type": "string",
"description": "Só 'resolve': o ID citável do asset, formato <tipo>_<id>: img_… (imagem), vid_… (vídeo), film_… (vídeo programático), trk_… (música), comic_… (tirinha), char_… (personagem). É o ID que o usuário copia no detalhe do item."
},
"objeto": {
"type": "string",
"description": "Só bucket 'pose_map': um objeto específico ('corda', 'espada', 'arco', 'cama')."
},
"people": {
"enum": [
"solo",
"dupla",
"grupo"
],
"type": "string",
"description": "Só bucket 'pose_map': quantas figuras no quadro. 'solo' (uma pessoa), 'dupla' (duas), 'grupo' (três ou mais)."
},
"source": {
"enum": [
"all",
"stock",
"community"
],
"type": "string",
"description": "Só bucket 'acervo': fonte. Default 'all' (stock + comunidade)."
},
"familia": {
"enum": [
"em-pe",
"em-movimento",
"inclinada",
"agachada",
"ajoelhada",
"sentada",
"deitada",
"quatro-apoios",
"no-ar",
"invertida"
],
"type": "string",
"description": "Só bucket 'pose_map': o que o corpo faz, a categoria principal do banco (lida por visão, não pela tag do esqueleto). 'em-movimento' = passada, corrida, chute, giro; 'inclinada' = em pé com o tronco dobrado; 'no-ar' = salto, queda, pendurada; 'invertida' = de cabeça pra baixo. Combina com vista e com semantic."
},
"leitura": {
"enum": [
"clara",
"confusa"
],
"type": "string",
"description": "Só bucket 'pose_map': 'clara' = a sombra se entende sozinha. 'confusa' = membro fundido, escondido ou cortado, a sombra que devolve braço sem dono ou duas pernas esquerdas. Pra gerar personagem, prefira 'clara'."
},
"porPose": {
"type": "boolean",
"description": "Só bucket 'pose_map': true = só poses que vêm em conjunto de câmeras, na ordem do catálogo da fonte, com as câmeras de cada pose coladas. Use pra montar sequência ou história com a mesma pose de vários pontos."
},
"loopOnly": {
"type": "boolean",
"description": "Só bucket 'stock_video': só clipes loopFriendly (loop limpo, bom pra fundo)."
},
"semantic": {
"type": "boolean",
"description": "Buckets 'history', 'videos' e 'pose_map': lê o `term` como DESCRIÇÃO em vez de palavra-chave, e acha pelo SIGNIFICADO. Em history/videos acha a peça da pessoa mesmo quando o prompt usou outras palavras ('praia ao entardecer' acha 'golden hour beach'); em pose_map, o pedido que nenhuma tag cobre ('alguém se protegendo do vento', 'caindo de costas apoiado num braço'). Frase inteira funciona melhor que palavra solta. Sem paginação: volta até `limit` (máx 50), do mais parecido pro menos, com `score`."
},
"hasObject": {
"type": "boolean",
"description": "Só bucket 'pose_map': true = só poses que seguram/usam algo (corda, espada, arco, bastão); false = só corpo limpo, sem adereço. Omitir = as duas."
},
"similarTo": {
"type": "string",
"description": "Só bucket 'pose_map': o id de uma pose; devolve as MAIS PARECIDAS com ela. Use quando o usuário gostou de uma e quer variações do mesmo gesto."
},
"collection": {
"type": "string",
"description": "Só bucket 'pose_map': uma coleção nomeada pelo dono ('ação', 'editorial', 'íntimo')."
},
"hasSuporte": {
"type": "boolean",
"description": "Só bucket 'pose_map': true = só poses apoiadas em algo além do chão (banco, bloco, parede, cama: vem em `suporte`); false = só no chão. Omitir = as duas."
},
"orientation": {
"enum": [
"vertical",
"horizontal",
"square"
],
"type": "string",
"description": "Buckets 'stock_video' e 'pose_map': filtra formato (vertical 9:16, horizontal 16:9, square 1:1)."
},
"shadowSource": {
"enum": [
"mine",
"house"
],
"type": "string",
"description": "Só bucket 'depth_map': 'mine' (os que VOCÊ extraiu) ou 'house' (o banco curado da casa, default)."
},
"enquadramento": {
"enum": [
"corpo-inteiro",
"joelhos",
"cintura",
"busto"
],
"type": "string",
"description": "Só bucket 'pose_map': até onde o quadro mostra o corpo."
},
"favoritesOnly": {
"type": "boolean",
"description": "Só bucket 'pose_map': apenas as poses que o dono marcou com estrela. É o recorte mais forte que existe: comece por ele quando o pedido for vago."
}
},
"additionalProperties": false
}{
"title": "Referências",
"readOnlyHint": true,
"openWorldHint": true
}sapiens_trilhas
Trilhas (cursos) e Desafios (missões) da Sapiens pelo Claude. Identidade SEMPRE pelo sessionToken. Sub-actions: 'list' (suas trilhas: título + nº de módulos/aulas + quantas aulas você já fechou), 'get' (1 trilha por slug, com módulos e aulas, o slug vem do list), 'list_challenges' (Desafios ativos + seu status em cada: not_started|pending_review|completed|rejected, recompensa em Sinapses, link da ação), 'claim_mission' (submete a prova de um Desafio: missionId + proofText). O claim manda a prova pra REVISÃO do dono, o crédito em Sinapses só cai quando ele aprovar, nunca auto-credita por aqui. Fluxo: list → get; list_challenges → claim_mission.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"slug": {
"type": "string",
"description": "Pra get: slug da trilha (vem do list)."
},
"action": {
"enum": [
"list",
"get",
"list_challenges",
"claim_mission"
],
"type": "string"
},
"missionId": {
"type": "string",
"description": "Pra claim_mission: id do Desafio (vem do list_challenges)."
},
"proofText": {
"type": "string",
"description": "Pra claim_mission: a prova (link, @handle ou descrição) que o dono vai revisar."
}
},
"additionalProperties": false
}{
"title": "Trilhas & Desafios",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_publicar
Publicar uma peça SUA nas SUAS redes (TikTok, Instagram, YouTube, LinkedIn, Facebook, X, Threads, Pinterest, Bluesky, Telegram, Discord), pelo Distribution da pessoa (assinatura ou convite). Identidade SEMPRE pelo sessionToken. É o mesmo Distribution da tela /dashboard/distribution (a fila de peças à esquerda, a ficha de cada peça numa rede à direita). Sub-actions: 'fila' (a fila da pessoa: cada peça com título, tipo e o estado em cada rede, rascunho, agendado, enviado, publicado, falhou ou descartado, com a legenda e o link de cada uma, o personagem da peça quando ela é de um, e os números que a rede devolveu pro post (views, likes, comentários...) quando já medidos, 1 hora, 1 dia e 7 dias depois de sair; a peça que ela preparou na tela aparece aqui), 'painel' (as redes com conectada ou não, o @, o limite de texto e a régua de cada praça; com handle, a peça: onde ela já está por rede, com estado e link, e a sugestão de onde mandar, as que ficam de fora com o motivo e as que valeria conectar), 'rascunho' (handle + rede + legenda: guarda a legenda de UMA rede pra peça, vazia apaga; acima do limite da rede volta erro com o número), 'publicar' (handle + redes, agora ou agendarPara ISO com fuso; a legenda vai em BLOCOS: text é o corpo, cta a chamada, hashtags sem #, e cada rede leva o que cabe no limite dela, saindo primeiro as hashtags, depois a chamada, e o corpo corta em fim de frase; legendas {rede: texto} passa por cima dos blocos naquela rede; o retorno diz em `adaptadas` quais redes receberam menos do que foi escrito), 'lista' (o que já saiu: os envios recentes com o estado de cada rede), 'conferir' (postId: pergunta o que cada rede fez e grava o link), 'cancelar' (postId: tira a HORA de um agendado que ainda não saiu; a peça não é cancelada, volta pra fila daquela rede como rascunho, com a mesma legenda, pronta pra publicar agora ou agendar de novo), 'teia' (as regras da Teia da pessoa, do tipo 'quando sai no Instagram, entra na fila do Threads'; sem mais nada lê as regras, com de + para + mudanca=ligar|pausar|apagar mexe numa; quando a peça sai na rede de origem, ela nasce na fila da rede de destino como rascunho, com o corpo da legenda no limite de lá e as hashtags à parte, e ESPERA o clique, nada sai sozinho; filha não tece de novo, e rede onde a peça já esteve, até descartada, fica de fora). Postar de novo não tem action à parte: rascunho ou publicar numa rede onde a peça já saiu abre cartão novo, e o que saiu fica no rastro. A casa confere sozinha o que saiu e avisa a pessoa no sino (e no Telegram, se ela ligou) quando o post sai ou falha. Fluxo: painel com handle, escolhe pela sugestão, publicar, conferir. Só peça da própria pessoa, e só rede conectada (conectar é na tela /dashboard/distribution). Sem custo em Sinapses: o teto é o de publicações por ciclo do plano. Publicar POSTA DE VERDADE na conta da pessoa: confirme redes e legenda com ela antes. A fila da casa é outra tool (sapiens_distribution, admin). Passo a passo: skill publicar.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"de": {
"type": "string",
"description": "teia: a rede de origem da regra (id do painel), onde a peça sai primeiro."
},
"cta": {
"type": "string",
"description": "publicar: a chamada, em bloco à parte. Sai antes do corpo quando não cabe."
},
"para": {
"type": "string",
"description": "teia: a rede de destino, em cuja fila a peça entra."
},
"rede": {
"type": "string",
"description": "rascunho: a rede (id do painel: instagram, tiktok, threads...). Numa conta extra, o destino com a conta: tiktok@2."
},
"text": {
"type": "string",
"description": "publicar: o CORPO da legenda. Ausente usa o título da peça."
},
"redes": {
"type": "array",
"items": {
"type": "string"
},
"description": "publicar: as redes (ids do painel), só as conectadas. Conta extra vai com a conta: tiktok@2 é o TikTok da conta 2 (painel, contasExtras). Um envio sai por UMA conta: pra publicar na conta 1 e na 2, chame publicar duas vezes."
},
"action": {
"enum": [
"fila",
"painel",
"rascunho",
"publicar",
"lista",
"conferir",
"cancelar",
"teia"
],
"type": "string"
},
"handle": {
"type": "string",
"description": "A peça (img_..., vid_..., car_... pro carrossel inteiro). Obrigatório em rascunho e publicar; em painel traz a peça junto."
},
"postId": {
"type": "string",
"description": "conferir/cancelar: o id do envio, vindo da lista."
},
"legenda": {
"type": "string",
"description": "rascunho: a legenda daquela rede. Vazia apaga o rascunho."
},
"mudanca": {
"enum": [
"ligar",
"pausar",
"apagar"
],
"type": "string",
"description": "teia: ligar (cria ou despausa), pausar ou apagar a regra de -> para. Ausente = só lê as regras."
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "publicar: as hashtags, sem #. São as primeiras a sair onde o limite aperta."
},
"legendas": {
"type": "object",
"description": "publicar: legenda própria por rede ({threads: '...'}, ou {'threads@2': '...'} na conta extra), passa por cima dos blocos naquela rede.",
"additionalProperties": {
"type": "string"
}
},
"agendarPara": {
"type": "string",
"description": "publicar: data e hora ISO 8601 COM fuso (2026-10-08T19:00:00-03:00). Ausente = agora. Mínimo 5 min à frente."
}
},
"additionalProperties": false
}{
"title": "Publicar nas minhas redes",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_semana
As Atividades da SUA semana na casa: o que você produziu e quanto XP isso rendeu. Identidade SEMPRE pelo sessionToken. Sub-actions: 'get' (quais atividades você fez nesta semana, quantas peças em cada, o XP já pago, quanto a Casa Cheia renderia no fecho, quanto vale abrir mais uma atividade e QUAIS abrir agora, a sequência de semanas seguidas com o recorde, as semanas anteriores com o que cada uma rendeu, e uma leitura pronta da semana pra você dizer em voz alta), 'fechar' (fecha as semanas pendentes e credita a Casa Cheia de cada uma). Como a régua funciona: cada peça pronta anda o contador da atividade e paga em degraus (1a, 3a, 7a, 15a, 30a peça da semana, com retorno decrescente); no fecho, a LARGURA paga à parte, 2 atividades valem 20 XP, 5 valem 200, 8 valem 560, então atividades diferentes rendem mais que repetir a mesma. Esta tool PAGA XP, não cobra Sinapses. Idempotente: chamar 'fechar' duas vezes não credita duas vezes.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"action"
],
"properties": {
"action": {
"enum": [
"get",
"fechar"
],
"type": "string"
}
},
"additionalProperties": false
}{
"title": "Minha Semana",
"readOnlyHint": false,
"openWorldHint": true
}sapiens_resume
Currículo PRO: o gerador de currículo da casa, DE GRAÇA e sem login (mundo fechado: não fala com o backend, não cobra Sinapse). VOCÊ conduz a entrevista (ou lê o texto de LinkedIn/currículo antigo que a pessoa colar), monta o JSON no contrato e recebe o HTML pronto pra imprimir em PDF (A4). Sub-actions: 'schema' (o contrato de dados + os 4 modelos; leia ANTES do primeiro render), 'render' (data -> HTML completo). Modelos (arg theme): 'pro' (default, duas colunas com sidebar verde-jade: foto/monograma, contato, chips de competências, barras de idioma, timeline de experiência), 'executivo' (duas colunas grafite + bronze, nome em serifa), 'moderno' (coluna única, roxo da casa), 'minimal' (coluna única preto e branco); accentColor troca a cor de destaque. FOTO DE PERFIL: opcional e NUNCA persistida em banco. No MCP instalado (stdio), photoPath lê a foto local e embute como data URI direto no HTML, sem sair da máquina; no remoto, data.photo aceita URL https. No stdio, outPath salva o .html direto no disco e a resposta volta enxuta (sem trafegar o HTML inteiro). Regra de conteúdo: melhore a redação, jamais invente fato; lang ('pt'|'en') casa os títulos de seção com o idioma do conteúdo. É o MESMO template do Lab /experimentos/resume-builder.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"data": {
"anyOf": [
{
"type": "object",
"additionalProperties": {}
},
{
"type": "string"
}
],
"description": "Os dados do currículo no shape do contrato (objeto, ou string JSON). Obrigatório no render. Mínimo: name + title."
},
"theme": {
"enum": [
"pro",
"executivo",
"moderno",
"minimal"
],
"type": "string",
"description": "Modelo visual: 'pro' (default, duas colunas com sidebar jade), 'executivo' (sidebar grafite + serifa), 'moderno' (coluna única roxa), 'minimal' (coluna única preto e branco)."
},
"action": {
"enum": [
"schema",
"render"
],
"type": "string",
"default": "schema",
"description": "'schema' devolve o contrato de dados + os modelos disponíveis (leia antes do primeiro render). 'render' recebe os dados e devolve o HTML pronto."
},
"outPath": {
"type": "string",
"description": "Caminho absoluto de um .html pra salvar o resultado direto no disco (SÓ stdio). Com outPath a resposta volta enxuta ({savedTo, bytes}) em vez do HTML inteiro."
},
"photoPath": {
"type": "string",
"description": "Caminho absoluto de uma foto local (PNG/JPEG/WebP até 4MB) pra embutir como foto de perfil. SÓ no MCP instalado (stdio): a foto vira data URI dentro do HTML e não sai da máquina. No remoto use data.photo com URL https."
},
"accentColor": {
"type": "string",
"description": "Hex 6 dígitos pra trocar a cor de destaque do modelo (ex '#0E7C66')."
}
},
"additionalProperties": false
}{
"title": "Currículo PRO",
"readOnlyHint": false,
"openWorldHint": false
}Prompts
6 advertised
comecar — Começar no Sapiens
Porta de entrada: conecta (se preciso) e apresenta saldo + primeiros poderes.
capturar-repertorio — Capturar obra no Repertório
Grava um filme/série/anime/jogo/jogo de tabuleiro/livro/música no seu acervo pessoal (grátis).
- obra
- O que você viu/jogou/leu, do seu jeito (ex: 'acabei de ver Duna 2, nota 9'). (required)
quiz-persona — Quiz de Persona (16 arquétipos)
Aplica o teste de personalidade da casa conversando, calcula o tipo e salva no perfil (grátis).
criar-musica — Criar música (Musicator)
Fluxo completo: brief, letra (300 Sinapses) e áudio (3000 Sinapses), com confirmação de custo.
- tema
- Tema/ângulo da música e, se quiser, gênero/mood (ex: 'borderless, lo-fi melancólico'). (required)
montar-reflexo — Montar meu Reflexo (Sintético)
Destila um Sintético do seu rastro na plataforma: proposta grátis, imagem 450 Sinapses.
gerar-imagem — Gerar imagem na regra da casa
Gera imagem com prompt no padrão Sapiens (full-bleed, sujeito oversized), modelo e custo conferidos.
- cena
- O que você quer ver (quem + pose + objeto/conceito). (required)
Resources
18 advertised
primeiros-passos — Primeiros passos e armadilhas
A porta de entrada e as quatro armadilhas que fazem o operador queimar Sinapses do usuário à toa (timeout, disjuntor, saldo, sessão). Puxe no primeiro contato ou quando algo der errado sem explicação.
skill://sapiens/primeiros-passos/SKILL.mdvoz-da-casa — A voz da casa
O DNA editorial Sapiens: como escrever qualquer texto que sai com a marca (post, tese, artigo, legenda, microcopy). Puxe ANTES de redigir qualquer coisa que vai ser publicada.
skill://sapiens/voz-da-casa/SKILL.mdrepertorio — Repertório: guardar obra e ferramenta no acervo
Guardar filme, série, anime, jogo, jogo de tabuleiro, livro, música, pessoa ou ferramenta de IA no Repertório. Puxe ANTES de qualquer sapiens_repertorio: a gravação é travada num fluxo de dois passos e tentar guardar direto falha sempre.
skill://sapiens/repertorio/SKILL.mdmusica — Música e efeito sonoro
O fluxo de 4 passos do Musicator (create, lyrics, render, get) e a diferença entre música e efeito sonoro. Puxe ANTES de qualquer sapiens_musicator ou sapiens_stock_audio, pular passo sempre falha.
skill://sapiens/musica/SKILL.mdvideo — Vídeo: escolher modelo sem queimar Sinapses
Qual modelo de vídeo usar, como iterar barato, referências e storyboard, sonorizar, e o que são os Vídeos Programáticos. Puxe ANTES de sapiens_video, vídeo é a operação mais cara da casa.
skill://sapiens/video/SKILL.mdimagem — Imagem na régua da casa
Como escrever prompt de imagem que sai com a cara do Sapiens (full-bleed, sujeito oversized), templates travados, e multi-referência. Puxe ANTES de sapiens_image action=generate.
skill://sapiens/imagem/SKILL.mdpersonagem — Personagem no Midjourney (e trazer pra casa)
Character design 2D estilizado no Midjourney 8.2: as cinco pranchas, os parâmetros certos, consistência entre imagens, e como a peça vira personagem reutilizável aqui. Puxe quando a pessoa falar em personagem, character sheet, anime, manhwa, OC ou prompt de Midjourney.
skill://sapiens/personagem/SKILL.mdstudio — Meu Studio
O studio é a PÁGINA de portfólio da empresa da pessoa (obra, time, endereço público), e você funda o dela pelo chat. Puxe quando ela falar do studio dela, quiser fundar um, mostrar a casa ou montar time.
skill://sapiens/studio/SKILL.mdforum-comunidade — Fórum, chat e mídia estruturada
Como postar tese, mencionar gente e anexar música ou vídeo do jeito certo (campo estruturado, nunca URL solta no corpo). Puxe antes de postar no Fórum ou no chat da Comunidade. O Fórum e o chat estão em pausa por enquanto.
skill://sapiens/forum-comunidade/SKILL.mdcompanhia — Modo Companhia (o Sintético veste você)
Como incorporar o Sintético do membro, como OFERECER a voz de um personagem de autoria dele, e como gravar diretriz no caderno. Puxe quando sapiens_meta trouxer companion, companionInvite ou characterOffer.
skill://sapiens/companhia/SKILL.mdtrilhas — Trilhas e Desafios
Como navegar as trilhas e enviar prova de missão sem prometer crédito na hora. Puxe quando a pessoa falar de desafio, missão ou trilha.
skill://sapiens/trilhas/SKILL.mdminha-voz — Instalar a voz do usuário neste projeto
Transforma o retrato do usuário no Sapiens (quem ele é, como pensa, o repertório, o que faz) numa skill local do projeto atual, pra toda conversa nesta pasta já saber quem é o dono. Puxe quando ele disser 'instala minha voz', 'meu Claude precisa me conhecer', 'personaliza esse projeto comigo'. Chamava minha-soul até 22/08/2026: soul agora é só do Sintético (ver minha-soul).
skill://sapiens/minha-voz/SKILL.mdminha-soul — Instalar a soul do Sintético neste projeto
Escreve a soul do Sintético da pessoa (a personalidade dele + o que ele aprendeu conversando com ela, o caderno do par) como skill local do projeto atual, pra ele existir aqui pelo nome, na voz dele. Puxe quando ela disser 'instala a soul do meu Sintético', 'traz a <nome> pra esse projeto', 'baixa a soul', 'quero a Helen aqui'. Pra instalar quem a PESSOA é, a skill é minha-voz.
skill://sapiens/minha-soul/SKILL.mdcurriculo — Currículo PRO
Montar um currículo profissional com a tool sapiens_resume: a entrevista, o contrato de dados, os 4 modelos e a foto que nunca sai da máquina. Puxe quando a pessoa pedir currículo, CV ou resume.
skill://sapiens/curriculo/SKILL.mdpontes — Pontes: gerar com a sua chave e trazer pro acervo
A pessoa tem crédito na Kie, na fal, na WaveSpeed, no Replicate, na OpenRouter, na Magnific, na Sogni ou na própria placa e quer usar o personagem dela lá, quer gerar com a chave dela em vez de Sinapse, ou está sem Sinapse pra vídeo. Como levar a ficha, gerar no balcão dela (no MCP instalado, fal, Kie, WaveSpeed, Replicate e OpenRouter saem pela sapiens_pontes; a chave nunca passa pelo Sapiens) e a peça voltar pro acervo com a ficha inteira. Puxe quando ouvir 'gera com a minha chave', 'tenho FAL_KEY', 'tem Kie aí?', 'uso a fal', 'tenho WaveSpeed', 'uso o Replicate', 'tenho OpenRouter', 'gastei minhas Sinapses', 'gero na Magnific', 'tenho ComfyUI'.
skill://sapiens/pontes/SKILL.mdpublicar — Publicar nas redes da pessoa
A peça da pessoa saindo pelas contas dela: ler o painel, escolher as redes pela sugestão, escrever a legenda em blocos, confirmar e conferir. Puxe ANTES de sapiens_publicar.
skill://sapiens/publicar/SKILL.mdcarrossel — Carrossel: gerar, escrever, pôr foto e entregar
O carrossel do Instagram pelo agente: gerar do brief ou de um artigo, reescrever os slides direto no payload, pôr foto da galeria da pessoa, a capa IA, e onde ela baixa. Puxe ANTES de sapiens_carrossel.
skill://sapiens/carrossel/SKILL.mdsapiens-api — API da conta: texto, imagem e vídeo em código
A API da pessoa (compatível com OpenAI, saldo em dólar, separado das Sinapses) pra quando ela quer chamar os motores da casa de dentro de um script, app ou agente próprio. Puxe antes de escrever código que chama www.sapiensinteticos.com/api/v1 ou quando ela perguntar de chave, saldo da API ou cobrança de uma chamada.
skill://sapiens/sapiens-api/SKILL.md30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 1784 ms
- 95th percentile latency
- 1784 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1784 ms · metadata changed · refuses unauthenticated resources/templates/list (HTTP 401)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http sapiens-sinte-ticos-mcp https://www.sapiensinteticos.com/api/mcp/mcpCodex
codex mcp add sapiens-sinte-ticos-mcp --url https://www.sapiensinteticos.com/api/mcp/mcpCursor
{
"mcpServers": {
"sapiens-sinte-ticos-mcp": {
"url": "https://www.sapiensinteticos.com/api/mcp/mcp"
}
}
}Cline
{
"mcpServers": {
"sapiens-sinte-ticos-mcp": {
"type": "streamableHttp",
"url": "https://www.sapiensinteticos.com/api/mcp/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"sapiens-sinte-ticos-mcp": {
"type": "http",
"url": "https://www.sapiensinteticos.com/api/mcp/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http sapiens-sinte-ticos-mcp https://www.sapiensinteticos.com/api/mcp/mcpClaude Desktop
https://www.sapiensinteticos.com/api/mcp/mcpWindsurf
{
"mcpServers": {
"sapiens-sinte-ticos-mcp": {
"serverUrl": "https://www.sapiensinteticos.com/api/mcp/mcp"
}
}
}Let your agent find its tools
Find servers like Sapiens Sintéticos MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other ai and machine learning servers
Do you run Sapiens Sintéticos MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.