sapiens-mcp 1.26.0 → 1.26.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -64,7 +64,7 @@ const TOOLS = {
64
64
  handler: community,
65
65
  },
66
66
  sapiens_article: {
67
- description: "CRUD direto de artigos do blog Sapiens (v1.1). Sub-actions: get (by slug, retorna doc completo pra edit local), update (patch em title/excerpt/tldr/content/tags/etc, NÃO toca status/column/format), publish (status='published', set publishedAt), unpublish (volta pra draft), delete (irreversível). Pra criar artigo novo use sapiens_quote_pop (quote ou pop) ou sapiens_pipeline action=create_draft_article_and_source (cru, vira source).",
67
+ description: "CRUD direto de artigos do blog Sapiens (v1.2). Sub-actions: get (by slug, retorna doc completo pra edit local), update (patch em title/excerpt/tldr/content/tags/etc + VISUAIS: thumbnailUrl capa webp, ogImageUrl JPEG do preview social, bodyImages array das ilustrações inline, conceptMap mapa visual — pra recapear um artigo num novo estilo; NÃO toca status/column/format), publish (status='published', set publishedAt), unpublish (volta pra draft), delete (irreversível). Pra criar artigo novo use sapiens_quote_pop (quote ou pop) ou sapiens_pipeline action=create_draft_article_and_source (cru, vira source).",
68
68
  schema: articleSchema,
69
69
  handler: article,
70
70
  },
@@ -198,7 +198,7 @@ Música (sapiens_musicator) é fluxo de 4 passos, EM ORDEM:
198
198
  4. get passe o trackId e fique polando o status até 'ready' (ou 'failed').
199
199
  Pular pro lyrics/render sem create, ou sem os campos, sempre falha.
200
200
 
201
- Vídeo (sapiens_video) action=create EXIGE 'model': sapiens-video-seedance | kling | wan | kling-motion | lite | fast | quality | omni. Sem model, falha de cara. O 'omni' (Gemini Omni) é SÓ text-to-video: texto vira clipe de 10s 720p com áudio nativo, ignora imagem/duração/resolução. Vídeo é o mais caro: confirme com o usuário antes. Vitrine dos demos (sem custo): sapiens_video action=demos lista seus demo films com slug; action=showcase (slug + showcase=true/false + showcaseTag + showcaseOrder) cura o mini-cinema da /conectar-claude.
201
+ Vídeo (sapiens_video) action=create EXIGE 'model': sapiens-video-seedance | kling | wan | kling-motion | lite | fast | quality | omni. Sem model, falha de cara. O 'omni' (Gemini Omni) é SÓ text-to-video: texto vira clipe de 10s 720p com áudio nativo, ignora imagem/duração/resolução. Vídeo é o mais caro: confirme com o usuário antes. Vitrine dos demos (sem custo): sapiens_video action=demos lista seus demo films com slug; action=showcase (slug + showcase=true/false + showcaseTag + showcaseOrder) cura o mini-cinema da /conectar-claude. FILMES DA CASA (Estúdio de Vídeo, tela /experimentos/films): são OUTRA coisa, três kinds na tabela videoSpecs: demo (UI clonada + câmera), aula-tour (telas reais + narração) e essay (fita-ensaio abstrata: partícula/tinta vira símbolo, com a logo explodindo no fim). Eles NÃO são gerados por este MCP: o user monta o spec na tela e um agente local (Claude Code, skill /film) produz o mp4 no repo da casa. Se o user pedir 'fita-ensaio' ou 'demo film' aqui, aponte pra tela e pro agente local.
202
202
 
203
203
  Imagem (sapiens_image) action=generate: prompt + model + aspectRatio. Referência via referenceImageUrls (galeria/Acervo/personagens) e/ou sourceImageIds. templateSlug aplica um super-prompt travado da casa.
204
204
 
@@ -220,7 +220,7 @@ Mídia no Fórum (PADRÃO, faça sempre assim): a peça vai EMBEDADA num card es
220
220
  Trilhas e Ritos de Fogo (sapiens_trilhas): 'list'/'get' pra navegar as trilhas; 'list_challenges' mostra os Ritos ativos + seu status; 'claim_mission' (missionId + proofText) envia a prova pra revisão do dono — o crédito em Sinapses sai na aprovação dele, não na hora. Não prometa Sinapse na hora do claim.
221
221
 
222
222
  Voz da casa: 1ª pessoa, direto, anti-corporate, sem travessão. Pra bom entendedor, meia palavra basta.`;
223
- const server = new Server({ name: "mcp-sapiens", version: "1.26.0" }, { capabilities: { tools: {} }, instructions: SAPIENS_INSTRUCTIONS });
223
+ const server = new Server({ name: "mcp-sapiens", version: "1.26.2" }, { capabilities: { tools: {} }, instructions: SAPIENS_INSTRUCTIONS });
224
224
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
225
225
  tools: Object.entries(TOOLS).map(([name, t]) => ({
226
226
  name,
@@ -253,4 +253,4 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
253
253
  });
254
254
  const transport = new StdioServerTransport();
255
255
  await server.connect(transport);
256
- console.error("mcp-sapiens v1.26.0 rodando via stdio (27 tools)");
256
+ console.error("mcp-sapiens v1.26.2 rodando via stdio (27 tools)");
@@ -39,6 +39,34 @@ export const articleSchema = z.object({
39
39
  content: z.string().optional(),
40
40
  tags: z.array(z.string()).optional(),
41
41
  thumbnailUrl: z.string().optional(),
42
+ ogImageUrl: z
43
+ .string()
44
+ .optional()
45
+ .describe("update: JPEG scraper-safe pro preview social (og:image/twitter:image). Ao recapear um artigo, troque junto com thumbnailUrl (webp), senão o card de compartilhamento do WhatsApp/LinkedIn fica com a imagem antiga."),
46
+ bodyImages: z
47
+ .array(z.object({
48
+ url: z.string(),
49
+ alt: z.string(),
50
+ caption: z.string().optional(),
51
+ prompt: z.string().optional(),
52
+ model: z.string().optional(),
53
+ imageId: z.string().optional(),
54
+ generatedAt: z.number().optional(),
55
+ }))
56
+ .optional()
57
+ .describe("update: SUBSTITUI as ilustrações inline do corpo (tabela article_visuals). Passe o array COMPLETO (não faz merge) — todas as imagens que o artigo deve ter, na ordem. O conjunto antigo vai pro histórico (manual_replace). Use pra recapear artigo num novo estilo. url tem que ser host Sapiens (Bunny/Convex)."),
58
+ conceptMap: z
59
+ .object({
60
+ url: z.string(),
61
+ alt: z.string(),
62
+ caption: z.string().optional(),
63
+ prompt: z.string().optional(),
64
+ model: z.string().optional(),
65
+ imageId: z.string().optional(),
66
+ generatedAt: z.number().optional(),
67
+ })
68
+ .optional()
69
+ .describe("update: substitui o mapa visual (conceptMap) do artigo."),
42
70
  seoDescription: z.string().optional(),
43
71
  readingTimeMinutes: z.number().optional(),
44
72
  category: z.string().optional(),
@@ -108,6 +136,9 @@ export async function article(args) {
108
136
  content: args.content,
109
137
  tags: args.tags,
110
138
  thumbnailUrl: args.thumbnailUrl,
139
+ ogImageUrl: args.ogImageUrl,
140
+ bodyImages: args.bodyImages,
141
+ conceptMap: args.conceptMap,
111
142
  seoDescription: args.seoDescription,
112
143
  readingTimeMinutes: args.readingTimeMinutes,
113
144
  category: args.category,
@@ -22,6 +22,10 @@ const MODELS = [
22
22
  "civitai-wai-illustrious", // anime Illustrious · 400
23
23
  "civitai-nova-anime-xl", // anime Illustrious · 400
24
24
  "civitai-pony-v6", // Pony Diffusion V6 XL, a base nº1 do Civitai · 400
25
+ // fal.ai (Krea-2 Turbo 12B + LoRA de realismo, ~4s). Grupo Degen (+18, checker
26
+ // off). SEM referência: o endpoint krea-2/turbo/lora é text-to-image puro.
27
+ "fal-krea2-realism", // Krea-2 + LoRA realismo (gokaygokay) · 600 · txt2img
28
+ "fal-krea2-realism-v2", // Krea-2 + LoRA realismo alt (RudySen), pro A/B · 600 · txt2img
25
29
  ];
26
30
  export const imageSchema = z.object({
27
31
  action: z.enum(["generate", "request_generation", "compose"]),
@@ -29,7 +33,7 @@ export const imageSchema = z.object({
29
33
  model: z
30
34
  .enum(MODELS)
31
35
  .optional()
32
- .describe("Default 'nano-banana-2' (Flash 3.1 com refs). 'nano-banana-max' (Pro 3) = qualidade alta. 'gpt-image-2-low/high' = Azure. 'grok-2-image'/'grok-2-image-quality' = xAI Grok Imagine (moderação frouxa +18, aceita refs e aspect; quality é mais fiel pra character lock). DEGEN (uncensored, gate +18): 'wavespeed-chroma' (fotorrealista rápido), 'wavespeed-flux2' (Flux.2 Klein), 'wavespeed-flux-nsfw' (flux+LoRA NSFW, Ousadia regulável via loraIntensity), 'wavespeed-klein-anime' (Flux.2 Klein + LoRA anime, inteligente+controlável), 'wavespeed-klein-anime-plus' (Klein anime +18, Ousadia regulável) = WaveSpeed rápido; 'civitai-wai-illustrious'/'civitai-nova-anime-xl' (anime), 'civitai-pony-v6' (Pony V6 XL, base nº1) = Civitai sdcpp rápido."),
36
+ .describe("Default 'nano-banana-2' (Flash 3.1 com refs). 'nano-banana-max' (Pro 3) = qualidade alta. 'gpt-image-2-low/high' = Azure. 'grok-2-image'/'grok-2-image-quality' = xAI Grok Imagine (moderação frouxa +18, aceita refs e aspect; quality é mais fiel pra character lock). DEGEN (uncensored, gate +18): 'wavespeed-chroma' (fotorrealista rápido), 'wavespeed-flux2' (Flux.2 Klein), 'wavespeed-flux-nsfw' (flux+LoRA NSFW, Ousadia regulável via loraIntensity), 'wavespeed-klein-anime' (Flux.2 Klein + LoRA anime, inteligente+controlável), 'wavespeed-klein-anime-plus' (Klein anime +18, Ousadia regulável) = WaveSpeed rápido; 'civitai-wai-illustrious'/'civitai-nova-anime-xl' (anime), 'civitai-pony-v6' (Pony V6 XL, base nº1) = Civitai sdcpp rápido. 'fal-krea2-realism'/'fal-krea2-realism-v2' (Krea-2 Turbo 12B + LoRA de realismo, fal.ai, ~4s, fotorrealismo forte) = SÓ txt2img (não aceita referência)."),
33
37
  aspectRatio: z
34
38
  .enum(["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"])
35
39
  .optional()
@@ -17,7 +17,7 @@ export const studiosSchema = z.object({
17
17
  .enum(["list", "get", "publishable_url", "mine", "emancipar", "module"])
18
18
  .describe("mine = o SEU studio ('Meu Studio', singular): nível, marca, operador e ferramentas, pra você gerar com useStudio. list/get = catálogo de estúdios da casa. publishable_url = URL de artigo. " +
19
19
  "emancipar = INICIA a Emancipação (Nível 3 do Studio): puxa o blueprint-mestre pra VOCÊ (Claude) construir a casa PRÓPRIA do membro, na infra DELE (Vercel + Convex + domínio dele), FORA do Sapiens. Devolve a identidade do studio dele já hidratada + o índice de módulos + o guia da Fundação. " +
20
- "module = puxa o guia de UM módulo de infra pra continuar a construção (ex: fundacao, sapiens-connect, telegram, email, auth)."),
20
+ "module = puxa o guia de UM módulo de infra pra continuar a construção (ex: fundacao, sapiens-connect, midia, telegram, email, auth)."),
21
21
  studio: z
22
22
  .string()
23
23
  .optional()
@@ -25,7 +25,7 @@ export const studiosSchema = z.object({
25
25
  module: z
26
26
  .string()
27
27
  .optional()
28
- .describe("Pra action=module: slug do módulo de infra da emancipação. Prontos (com guia): fundacao, sapiens-connect, telegram, email, auth. Chegando (no índice, sem guia ainda): pagamentos, analytics."),
28
+ .describe("Pra action=module: slug do módulo de infra da emancipação. Prontos (com guia): fundacao, sapiens-connect, midia, telegram, email, auth. Chegando (no índice, sem guia ainda): pagamentos, analytics."),
29
29
  publishableId: z
30
30
  .string()
31
31
  .optional()
@@ -20,6 +20,8 @@ import { convexAction, convexQuery, convexMutation, getSessionToken } from "../c
20
20
  * - sapiens-video-wan WAN 2.5 — imagem que fala/canta (áudio+lip-sync nativo), 5/10s (i2v)
21
21
  * - sapiens-video-kling-motion Kling Motion — transfere o movimento de um vídeo pra uma imagem
22
22
  * (PRECISA de pessoa com tronco visível na imagem E no vídeo)
23
+ * - sapiens-video-shot-mimic Shot Mimic — recria o plano do vídeo de referência (câmera,
24
+ * cortes, blocking) como cena nova; personagem via role 'start'
23
25
  * - sapiens-video-lite/fast/quality Veo 3.1 (2000/5000/25000 sinapses)
24
26
  * - sapiens-video-omni Gemini Omni — texto -> vídeo 10s 720p com áudio nativo embutido.
25
27
  * SÓ text-to-video (não anima imagem: ignora references/durationSec/resolution).
@@ -35,6 +37,7 @@ const VIDEO_MODELS = [
35
37
  "sapiens-video-kling",
36
38
  "sapiens-video-wan",
37
39
  "sapiens-video-kling-motion",
40
+ "sapiens-video-shot-mimic",
38
41
  "sapiens-video-lite",
39
42
  "sapiens-video-fast",
40
43
  "sapiens-video-quality",
@@ -66,17 +69,18 @@ export const videoSchema = z.object({
66
69
  .describe("action=create: modelo de vídeo. 'sapiens-video-seedance' (cinematográfico+áudio, t2v/i2v), " +
67
70
  "'sapiens-video-kling' (anima imagem, i2v/t2v), 'sapiens-video-wan' (imagem que fala, i2v), " +
68
71
  "'sapiens-video-kling-motion' (motion transfer, precisa pessoa na imagem E no vídeo de movimento), " +
72
+ "'sapiens-video-shot-mimic' (recria o plano do vídeo de referência com seu personagem: mesma câmera, mesmos cortes; 'driving' = previs/clipe do plano, 'start' = personagem), " +
69
73
  "'sapiens-video-lite/fast/quality' (Veo 3.1), " +
70
74
  "'sapiens-video-omni' (Gemini Omni: texto -> vídeo 10s 720p com áudio nativo; SÓ t2v, ignora imagem/duração/resolução)."),
71
75
  durationSec: z
72
76
  .number()
73
77
  .optional()
74
- .describe("action=create (modelos WaveSpeed): duração em segundos. Seedance 4-15, Kling 3-15, WAN 5/10. " +
78
+ .describe("action=create (modelos WaveSpeed): duração em segundos. Seedance/Shot Mimic 4-15, Kling 3-15, WAN 5/10. " +
75
79
  "Sem isso usa a config mais barata. O preço escala com a duração."),
76
80
  resolution: z
77
81
  .enum(["480p", "720p", "1080p"])
78
82
  .optional()
79
- .describe("action=create: resolução (Seedance/WAN). Default 720p. Kling não usa (1080p nativo)."),
83
+ .describe("action=create: resolução (Seedance/WAN/Shot Mimic). Default 720p. Kling não usa (1080p nativo)."),
80
84
  audio: z
81
85
  .boolean()
82
86
  .optional()
@@ -106,7 +110,7 @@ export const videoSchema = z.object({
106
110
  .describe("'start' = imagem inicial (i2v), 'end' = frame final, 'driving' = vídeo de movimento (Motion)"),
107
111
  }))
108
112
  .optional()
109
- .describe("References em base64 (escape hatch / Motion). i2v: role 'start' (imagem). Motion: 'start' (pessoa) + 'driving' (vídeo de movimento, <=5MB). Pra frame inicial/final a partir do seu acervo, prefira start/endImage* abaixo (sem precisar de base64)."),
113
+ .describe("References em base64 (escape hatch / Motion / Shot Mimic). i2v: role 'start' (imagem). Motion: 'start' (pessoa) + 'driving' (vídeo de movimento, <=5MB). Shot Mimic: 'start' (personagem) + 'driving' (previs ou clipe do plano a imitar, <=5MB). Pra frame inicial/final a partir do seu acervo, prefira start/endImage* abaixo (sem precisar de base64)."),
110
114
  // Frame inicial/final por REFERÊNCIA (resolvido server-side, igual à imagem):
111
115
  // id da própria galeria OU url allowlist (galeria/Acervo/personagens). Mais
112
116
  // simples que mandar base64. Descubra via sapiens_reference / sapiens_gallery.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sapiens-mcp",
3
- "version": "1.26.0",
3
+ "version": "1.26.2",
4
4
  "description": "MCP server pra operar o Sapiens Sintéticos (sapiensinteticos.com) pelo Claude Code: gerar imagem, escrever artigo, voz, música e mais, na sua conta. Login pelo código de sapiensinteticos.com/conectar-claude.",
5
5
  "type": "module",
6
6
  "bin": {