sapiens-mcp 1.23.1 → 1.23.3

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
@@ -67,7 +67,7 @@ const TOOLS = {
67
67
  handler: article,
68
68
  },
69
69
  sapiens_write: {
70
- description: "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. Sub-actions: 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), 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.",
70
+ description: "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. Sub-actions: 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; 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.",
71
71
  schema: writeSchema,
72
72
  handler: write,
73
73
  },
@@ -82,7 +82,7 @@ const TOOLS = {
82
82
  handler: search,
83
83
  },
84
84
  sapiens_studios: {
85
- description: "Catálogo dos estúdios/experimentos Sapiens (v1.3, atualizado v1.4). Sub-actions: list (todos com URL+status+tags+mcpReady), get (detalhe de 1 slug), publishable_url (formata URL /articles/<slug>). Use quando user pergunta 'que estúdios existem'. Estúdios cobertos: helen-voice (v1.4 mcpReady), musicator (v1.4 mcpReady), persona-sapiens (teste de autoconhecimento + arte, mcpReady), personagem-atlas (dossiê de personagem, UI-only), sapiens-shorts, sapiens-video, cena-visual, text-post-builder, comic-builder (tirinha/quadrinho, mcpReady via pipeline format=tirinha + sapiens_image), tirinha-seinen (+18, UI-only), carrosel-editorial, comunidade, repertorio.",
85
+ description: "Catálogo dos estúdios/experimentos Sapiens (v1.3, atualizado v1.4). Sub-actions: list (todos com URL+status+tags+mcpReady), get (detalhe de 1 slug), publishable_url (formata URL /articles/<slug>). Use quando user pergunta 'que estúdios existem'. Estúdios cobertos: helen-voice (v1.4 mcpReady), musicator (v1.4 mcpReady), persona-sapiens (teste de autoconhecimento + arte, mcpReady), personagem-atlas (dossiê de personagem, UI-only), sapiens-shorts, sapiens-video, cena-visual, text-post-builder, comic-builder (tirinha/quadrinho, mcpReady via pipeline format=tirinha + sapiens_image), carrosel-editorial, comunidade, repertorio.",
86
86
  schema: studiosSchema,
87
87
  handler: studios,
88
88
  },
@@ -190,10 +190,17 @@ Vídeo (sapiens_video) action=create EXIGE 'model': sapiens-video-seedance | kli
190
190
 
191
191
  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.
192
192
 
193
+ Tirinha / Comic (sapiens_pipeline format=tirinha + sapiens_image): fluxo de 2 FASES, decida o MODO antes de gerar pixel.
194
+ FASE 1 (roteiro): monte 3-6 painéis, cada um com a CENA visual e a FALA/legenda SEPARADAS. Salve em sapiens_pipeline create_production format=tirinha. O texto dos balões mora no payload (campos dialogue/caption), NUNCA dentro da imagem.
195
+ FASE 2 (imagem), escolha UM dos dois modos (pergunte ao user, ou decida pelo caso):
196
+ MODO A, tira inteira numa imagem só: UMA chamada sapiens_image com prompt em grade (descreva "Painel 1 (cima-esq): ...; Painel 2 (cima-dir): ...", peça grade NxM com calhas brancas finas, MESMO personagem/estilo/luz em todos os quadros). Mais barato, estilo mais travado, menos controle quadro a quadro.
197
+ MODO B, painel a painel (N imagens): UMA sapiens_image por painel, com character-lock passando o painel anterior + a ref da Helen em referenceImageUrls. Mais controle e consistência de enquadramento, custa N gerações.
198
+ REGRA DE OURO da tirinha: a imagem sai SEM texto (o estilo da casa é no-text e modelo de imagem erra letra). A fala vai SEPARADA como legenda: manda a imagem com a fala embaixo (ex no Telegram "Painel 1 · Helen: '...'"); os balões editáveis e a diagramação final ficam no comic-builder do dashboard (/experimentos/comic-builder). NÃO tente assar a fala dentro do prompt.
199
+
193
200
  Mídia no Fórum (PADRÃO, faça sempre assim): a peça vai EMBEDADA num card estruturado, nunca como "vai ouvir/ver noutro lugar". Música publicada (sapiens_musicator action=publish) já cria a tese no Fórum com a faixa tocável, não escreva "tá no Acervo, ouça lá". Pra anexar mídia a uma tese sua: sapiens_forum action=post com mediaTrackId (faixa pronta sua → card de música) OU mediaUrl + mediaKind (video|image; arquivo da casa, ou link YouTube/Vimeo pra vídeo). NÃO cole a URL da mídia no corpo da tese, use o campo: o corpo é só texto.
194
201
 
195
202
  Voz da casa: 1ª pessoa, direto, anti-corporate, sem travessão. Pra bom entendedor, meia palavra basta.`;
196
- const server = new Server({ name: "mcp-sapiens", version: "1.23.1" }, { capabilities: { tools: {} }, instructions: SAPIENS_INSTRUCTIONS });
203
+ const server = new Server({ name: "mcp-sapiens", version: "1.23.3" }, { capabilities: { tools: {} }, instructions: SAPIENS_INSTRUCTIONS });
197
204
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
198
205
  tools: Object.entries(TOOLS).map(([name, t]) => ({
199
206
  name,
@@ -226,4 +233,4 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
226
233
  });
227
234
  const transport = new StdioServerTransport();
228
235
  await server.connect(transport);
229
- console.error("mcp-sapiens v1.23.1 rodando via stdio (26 tools)");
236
+ console.error("mcp-sapiens v1.23.3 rodando via stdio (26 tools)");
@@ -65,15 +65,18 @@ const FORMAT_GUIDE = {
65
65
  },
66
66
  },
67
67
  tirinha: {
68
- description: "Tirinha em painéis (3-6) com diálogo curto.",
68
+ description: "Tirinha/quadrinho em painéis (3-6). DOIS modos de imagem: 'strip' (tira inteira numa imagem só, 1 sapiens_image em grade) ou 'panels' (painel a painel, N sapiens_image com character-lock). A imagem SEMPRE sai sem texto; a fala/legenda vive no payload (dialogue/caption) e os balões finalizam no comic-builder do dashboard.",
69
69
  payloadHint: {
70
70
  title: "string",
71
+ mode: "'strip' (tudo numa imagem) | 'panels' (uma imagem por painel)",
72
+ layout: "string opcional pro modo strip: '2x2' | 'tira' (horizontal) | 'vertical'",
71
73
  panels: [
72
74
  {
73
- description: "string narrativo",
74
- dialogue: "string opcional",
75
- imagePrompt: "string",
76
- imageUrl: "string opcional",
75
+ description: "string narrativo: a CENA visual do painel (vai pro prompt da imagem, SEM texto)",
76
+ dialogue: "string opcional: a fala do balão (NÃO entra na imagem, é legenda)",
77
+ caption: "string opcional: legenda de narração",
78
+ imagePrompt: "string: prompt final do painel (full-bleed, no-text)",
79
+ imageUrl: "string opcional (preenchido depois de gerar)",
77
80
  },
78
81
  ],
79
82
  },
@@ -114,17 +114,7 @@ const STUDIOS = {
114
114
  tags: ["tirinha", "tirinhas", "comic", "quadrinhos", "hq", "painel", "roteiro", "narrativa"],
115
115
  convex: "comicStrips",
116
116
  mcpReady: true,
117
- mcpNote: "Coberto via sapiens_pipeline format=tirinha (roteiro + texto dos balões) + sapiens_image (painéis, character-lock por referência). A workstation visual (diagramação, balões editáveis, histórico) fica no dashboard. É o estúdio canônico de tirinha do Sapiens: não precisa freestyle de prompt.",
118
- },
119
- "tirinha-seinen": {
120
- name: "Tirinha Seinen (+18)",
121
- description: "Tirinhas estilo mangá adulto (Berserk / Vagabond / Akira / Gantz) com tom seinen, nudez parcial e palavrões. Roda no Grok da xAI (moderação mais frouxa). Sem reference image: consistência por descrição textual rica.",
122
- url: `${APP}/experimentos/tirinha-seinen`,
123
- status: "experimental",
124
- tags: ["tirinha", "comic", "manga", "seinen", "+18", "adulto", "grok", "xai"],
125
- convex: "seinenComics",
126
- mcpReady: false,
127
- mcpNote: "UI-only. Provider Grok via rota dedicada, conteúdo +18, sem caminho MCP. Pra tirinha de qualquer público use comic-builder.",
117
+ mcpNote: "Coberto via sapiens_pipeline format=tirinha (roteiro: cena + fala dos balões) + sapiens_image pra render. DOIS modos: MODO A tira inteira numa imagem só (1 sapiens_image em grade) ou MODO B painel a painel (N sapiens_image com character-lock por referência). Decida o modo antes de gerar. A imagem sai SEM texto (no-text da casa, modelo erra letra); a fala vai como legenda separada e os balões editáveis + diagramação + histórico finalizam no dashboard. Estúdio canônico de tirinha: não precisa freestyle de prompt.",
128
118
  },
129
119
  "carrosel-editorial": {
130
120
  name: "Carrossel Editorial",
@@ -48,6 +48,14 @@ export const writeSchema = z.object({
48
48
  .max(5)
49
49
  .optional()
50
50
  .describe("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."),
51
+ coverImageId: z
52
+ .string()
53
+ .optional()
54
+ .describe("Capa PRONTA (opcional, só 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."),
55
+ coverImageUrl: z
56
+ .string()
57
+ .optional()
58
+ .describe("Alternativa a coverImageId: URL de imagem do Sapiens (Bunny CDN / Convex) pra usar como capa pronta. Host fora da allowlist é recusado."),
51
59
  // --- list ---
52
60
  limit: z
53
61
  .number()
@@ -98,6 +106,8 @@ export async function write(args) {
98
106
  voiceStyle: args.voiceStyle,
99
107
  customVoice: args.customVoice,
100
108
  repertorioItemIds: args.repertorioItemIds,
109
+ coverImageId: args.coverImageId,
110
+ coverImageUrl: args.coverImageUrl,
101
111
  });
102
112
  }
103
113
  if (args.action === "list") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sapiens-mcp",
3
- "version": "1.23.1",
3
+ "version": "1.23.3",
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": {