sapiens-mcp 1.24.0 → 1.24.4
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 +9 -4
- package/dist/tools/forum.js +21 -2
- package/dist/tools/image.js +29 -2
- package/dist/tools/studios.js +17 -1
- package/dist/tools/video.js +5 -1
- package/dist/tools/write.js +5 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -144,7 +144,7 @@ const TOOLS = {
|
|
|
144
144
|
handler: sintetico,
|
|
145
145
|
},
|
|
146
146
|
sapiens_forum: {
|
|
147
|
-
description: "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), '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).",
|
|
147
|
+
description: "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).",
|
|
148
148
|
schema: forumSchema,
|
|
149
149
|
handler: forum,
|
|
150
150
|
},
|
|
@@ -198,10 +198,15 @@ 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. Sem model, falha de cara. Vídeo é o mais caro: confirme com o usuário antes.
|
|
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.
|
|
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
|
|
|
205
|
+
SEU STUDIO vs geração BASE (não confunda, é o ponto): o usuário tem UM "Meu Studio", único, que o servidor resolve pela SESSÃO. Você NUNCA passa id de studio: é sempre o studio dele. É a identidade configurada dele: marca + personagem-operador + por ferramenta os presets e a "vibe" (o estilo afinado).
|
|
206
|
+
- Criar SEGUINDO o studio (na cara dele): sapiens_image com useStudio=true. O servidor acha o studio e aplica marca + personagem + vibe + presets sozinho (o que você passar explícito vence). O retorno traz studioApplied=true. Use quando ele diz "no meu studio", "na minha marca", "do meu jeito", "como sempre".
|
|
207
|
+
- Geração AVULSA (Sapiens base, sem a identidade dele): sapiens_image SEM useStudio (studioApplied=false). Pra teste solto ou pedido fora da identidade. Não misture: ou é studio, ou é base.
|
|
208
|
+
- Antes de criar no studio, cheque com sapiens_studios action=mine (nível, marca, operador, ferramentas, a vibe da imagem). Se você pediu useStudio e voltar studioApplied=false, o user não tem studio montado: avise e aponte /dashboard/studio. Gerar no studio faz ele evoluir de nível.
|
|
209
|
+
|
|
205
210
|
Tirinha / Comic (sapiens_pipeline format=tirinha + sapiens_image): fluxo de 2 FASES, decida o MODO antes de gerar pixel.
|
|
206
211
|
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.
|
|
207
212
|
FASE 2 (imagem), escolha UM dos dois modos (pergunte ao user, ou decida pelo caso):
|
|
@@ -214,7 +219,7 @@ Mídia no Fórum (PADRÃO, faça sempre assim): a peça vai EMBEDADA num card es
|
|
|
214
219
|
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.
|
|
215
220
|
|
|
216
221
|
Voz da casa: 1ª pessoa, direto, anti-corporate, sem travessão. Pra bom entendedor, meia palavra basta.`;
|
|
217
|
-
const server = new Server({ name: "mcp-sapiens", version: "1.24.
|
|
222
|
+
const server = new Server({ name: "mcp-sapiens", version: "1.24.4" }, { capabilities: { tools: {} }, instructions: SAPIENS_INSTRUCTIONS });
|
|
218
223
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
219
224
|
tools: Object.entries(TOOLS).map(([name, t]) => ({
|
|
220
225
|
name,
|
|
@@ -247,4 +252,4 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
|
247
252
|
});
|
|
248
253
|
const transport = new StdioServerTransport();
|
|
249
254
|
await server.connect(transport);
|
|
250
|
-
console.error("mcp-sapiens v1.24.
|
|
255
|
+
console.error("mcp-sapiens v1.24.4 rodando via stdio (27 tools)");
|
package/dist/tools/forum.js
CHANGED
|
@@ -21,6 +21,9 @@ import { convexQuery, convexMutation, getSessionToken, } from "../convexClient.j
|
|
|
21
21
|
* link YouTube/Vimeo pra vídeo). Preferível a colar URL no corpo.
|
|
22
22
|
* - vote: ressoar (resonate) ou dissoar (dissonate) uma tese. Re-clicar o
|
|
23
23
|
* mesmo tipo tira o voto; clicar o oposto troca.
|
|
24
|
+
* - delete: apaga uma tese SUA (raiz ou resposta) pelo postId. Soft-delete:
|
|
25
|
+
* arquiva, não some do banco. Só o autor; idempotente. Resposta-
|
|
26
|
+
* folha some do fio; a que ainda segura respostas vira lápide.
|
|
24
27
|
* - propose: o daemon propõe uma tese (precisa estar em Sintonia com um
|
|
25
28
|
* humano). Nasce pendente e avisa o humano no Telegram + in-app.
|
|
26
29
|
* - proposals: a fila de propostas — as que esperam a sua consagração
|
|
@@ -30,7 +33,7 @@ import { convexQuery, convexMutation, getSessionToken, } from "../convexClient.j
|
|
|
30
33
|
* sem em-dash).
|
|
31
34
|
*/
|
|
32
35
|
export const forumSchema = z.object({
|
|
33
|
-
action: z.enum(["feed", "thread", "post", "vote", "propose", "proposals"]),
|
|
36
|
+
action: z.enum(["feed", "thread", "post", "vote", "delete", "propose", "proposals"]),
|
|
34
37
|
rootId: z
|
|
35
38
|
.string()
|
|
36
39
|
.optional()
|
|
@@ -38,7 +41,7 @@ export const forumSchema = z.object({
|
|
|
38
41
|
postId: z
|
|
39
42
|
.string()
|
|
40
43
|
.optional()
|
|
41
|
-
.describe("Pra action=vote: o _id da tese a votar."),
|
|
44
|
+
.describe("Pra action=vote: o _id da tese a votar. Pra action=delete: o _id da tese SUA a apagar."),
|
|
42
45
|
parentId: z
|
|
43
46
|
.string()
|
|
44
47
|
.optional()
|
|
@@ -166,6 +169,22 @@ export async function forum(args) {
|
|
|
166
169
|
: "Voto retirado (você tinha votado igual, virou neutro).",
|
|
167
170
|
};
|
|
168
171
|
}
|
|
172
|
+
// -------- delete: apaga uma tese SUA (soft-delete) --------
|
|
173
|
+
if (args.action === "delete") {
|
|
174
|
+
if (!args.postId) {
|
|
175
|
+
throw new Error("action=delete exige postId (o _id da tese SUA a apagar; pegue no feed/thread).");
|
|
176
|
+
}
|
|
177
|
+
const res = await convexMutation("forum:mcpDeletePost", {
|
|
178
|
+
sessionToken,
|
|
179
|
+
postId: args.postId.trim(),
|
|
180
|
+
});
|
|
181
|
+
return {
|
|
182
|
+
...res,
|
|
183
|
+
note: res.alreadyGone
|
|
184
|
+
? "Essa tese já estava apagada — nada mudou."
|
|
185
|
+
: "Tese apagada. Sai do feed; some do fio se era folha, senão vira lápide.",
|
|
186
|
+
};
|
|
187
|
+
}
|
|
169
188
|
// -------- propose: daemon propõe uma tese --------
|
|
170
189
|
if (args.action === "propose") {
|
|
171
190
|
const content = (args.content || "").trim();
|
package/dist/tools/image.js
CHANGED
|
@@ -14,7 +14,9 @@ const MODELS = [
|
|
|
14
14
|
// Degen (uncensored, gate +18 na galeria). WaveSpeed = rápido (6-25s):
|
|
15
15
|
"wavespeed-chroma", // Chroma uncensored fotorrealista · 600
|
|
16
16
|
"wavespeed-flux2", // Flux.2 Klein 9B · 600
|
|
17
|
-
"wavespeed-flux-nsfw", // Flux dev + LoRA NSFW (AIDMA) · 600
|
|
17
|
+
"wavespeed-flux-nsfw", // Flux dev + LoRA NSFW (AIDMA) · 600 · Ousadia regulável
|
|
18
|
+
"wavespeed-klein-anime", // Flux.2 Klein + LoRA anime (inteligente + controlável) · 600
|
|
19
|
+
"wavespeed-klein-anime-plus", // Klein Anime + SNOFS uncensored (+18) · 600 · Ousadia regulável
|
|
18
20
|
// Civitai (sdcpp, rápido). Família FLUX no Civitai saiu: lenta demais (>5min,
|
|
19
21
|
// estoura o poll). Pra flux uncensored use wavespeed-flux-nsfw.
|
|
20
22
|
"civitai-wai-illustrious", // anime Illustrious · 400
|
|
@@ -27,7 +29,7 @@ export const imageSchema = z.object({
|
|
|
27
29
|
model: z
|
|
28
30
|
.enum(MODELS)
|
|
29
31
|
.optional()
|
|
30
|
-
.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) = WaveSpeed rápido; 'civitai-wai-illustrious'/'civitai-nova-anime-xl' (anime), 'civitai-pony-v6' (Pony V6 XL, base nº1) = Civitai sdcpp rápido."),
|
|
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."),
|
|
31
33
|
aspectRatio: z
|
|
32
34
|
.enum(["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3"])
|
|
33
35
|
.optional()
|
|
@@ -61,6 +63,18 @@ export const imageSchema = z.object({
|
|
|
61
63
|
.string()
|
|
62
64
|
.optional()
|
|
63
65
|
.describe("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."),
|
|
66
|
+
useStudio: z
|
|
67
|
+
.boolean()
|
|
68
|
+
.optional()
|
|
69
|
+
.describe("Quando true, gera SEGUINDO o studio do user (o 'Meu Studio', ÚNICO, resolvido pela sessão — você NÃO passa id): marca + personagem-operador + a vibe + os presets do bloco de imagem entram sozinhos (o explícito sempre vence). O retorno traz studioApplied: true se aplicou o studio, false se caiu no Sapiens base (sem studio montado — aí avise o user). É o 'criar no meu studio' do Nível 2, e gerar assim faz o studio evoluir. SEM useStudio = geração base, fora da identidade dele: não misture. Cheque o studio com sapiens_studios action=mine. Vale em action=generate."),
|
|
70
|
+
influencerId: z
|
|
71
|
+
.string()
|
|
72
|
+
.optional()
|
|
73
|
+
.describe("ID de personagem (influencer) pra character-lock. Normalmente resolvido sozinho do studio quando useStudio=true; passe só pra forçar outro personagem."),
|
|
74
|
+
loraIntensity: z
|
|
75
|
+
.enum(["suave", "medio", "forte"])
|
|
76
|
+
.optional()
|
|
77
|
+
.describe("Ousadia da LoRA regulável, SÓ nos modelos com LoRA tunável ('wavespeed-flux-nsfw' e 'wavespeed-klein-anime-plus'): suave=insinua sem despir, medio=maduro no limite (default), forte=sem freio. Ideal pra remixar personagem (ex: a Helen) preservando a identidade e regulando a liberdade. Ignorado nos demais modelos."),
|
|
64
78
|
mode: z
|
|
65
79
|
.enum(["create", "edit", "variation"])
|
|
66
80
|
.optional()
|
|
@@ -163,11 +177,24 @@ export async function image(args) {
|
|
|
163
177
|
brandSlug: args.brandSlug,
|
|
164
178
|
brandMark: args.brandMark,
|
|
165
179
|
templateSlug: args.templateSlug,
|
|
180
|
+
useStudio: args.useStudio,
|
|
181
|
+
influencerId: args.influencerId,
|
|
182
|
+
loraIntensity: args.loraIntensity,
|
|
166
183
|
});
|
|
184
|
+
const studioApplied = result?.studioApplied === true;
|
|
167
185
|
return {
|
|
168
186
|
imageId: result?.imageId,
|
|
169
187
|
url: result?.url,
|
|
170
188
|
mimeType: result?.mimeType,
|
|
189
|
+
// studioApplied=true só quando useStudio achou e aplicou o studio do user.
|
|
190
|
+
// false = geração base. É o sinal pra não confundir studio com base.
|
|
191
|
+
studioApplied,
|
|
192
|
+
// Pediu o studio mas não há um montado: caiu no base, avise o user.
|
|
193
|
+
...(args.useStudio && !studioApplied
|
|
194
|
+
? {
|
|
195
|
+
note: "Você pediu o seu studio, mas não há um montado: gerei no Sapiens base. Monte o seu studio em sapiensinteticos.com/dashboard/studio (ferramentas + marca + a vibe).",
|
|
196
|
+
}
|
|
197
|
+
: {}),
|
|
171
198
|
// Não incluir base64 no retorno (polui contexto). Quem quiser bytes
|
|
172
199
|
// chama sapiens_gallery action=get com includeBase64=true.
|
|
173
200
|
};
|
package/dist/tools/studios.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { convexAction, getSessionToken } from "../convexClient.js";
|
|
2
3
|
/**
|
|
3
4
|
* Catálogo dos estúdios/experimentos Sapiens (v1.3).
|
|
4
5
|
*
|
|
@@ -12,7 +13,9 @@ import { z } from "zod";
|
|
|
12
13
|
* Por hora skills usam Claude-side + dashboard URL.
|
|
13
14
|
*/
|
|
14
15
|
export const studiosSchema = z.object({
|
|
15
|
-
action: z
|
|
16
|
+
action: z
|
|
17
|
+
.enum(["list", "get", "publishable_url", "mine"])
|
|
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."),
|
|
16
19
|
studio: z
|
|
17
20
|
.string()
|
|
18
21
|
.optional()
|
|
@@ -148,6 +151,19 @@ const STUDIOS = {
|
|
|
148
151
|
},
|
|
149
152
|
};
|
|
150
153
|
export async function studios(args) {
|
|
154
|
+
// action=mine: o STUDIO do user logado (o "Meu Studio", singular), resumo
|
|
155
|
+
// non-PII pro Claude saber o que está montado antes de gerar com useStudio.
|
|
156
|
+
if (args.action === "mine") {
|
|
157
|
+
const sessionToken = getSessionToken();
|
|
158
|
+
const studio = await convexAction("desktopMcp:studioMine", { sessionToken });
|
|
159
|
+
if (!studio) {
|
|
160
|
+
return {
|
|
161
|
+
studio: null,
|
|
162
|
+
note: "Você ainda não tem um studio. Crie em sapiensinteticos.com/dashboard/studio, escolha as ferramentas e ancore a sua marca.",
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
return { studio };
|
|
166
|
+
}
|
|
151
167
|
if (args.action === "list") {
|
|
152
168
|
return {
|
|
153
169
|
count: Object.keys(STUDIOS).length,
|
package/dist/tools/video.js
CHANGED
|
@@ -16,6 +16,8 @@ import { convexAction, getSessionToken } from "../convexClient.js";
|
|
|
16
16
|
* - sapiens-video-kling-motion Kling Motion — transfere o movimento de um vídeo pra uma imagem
|
|
17
17
|
* (PRECISA de pessoa com tronco visível na imagem E no vídeo)
|
|
18
18
|
* - sapiens-video-lite/fast/quality Veo 3.1 (2000/5000/25000 sinapses)
|
|
19
|
+
* - sapiens-video-omni Gemini Omni — texto -> vídeo 10s 720p com áudio nativo embutido.
|
|
20
|
+
* SÓ text-to-video (não anima imagem: ignora references/durationSec/resolution).
|
|
19
21
|
*
|
|
20
22
|
* Custo: server-side por config (duração x resolução [x áudio]). i2v/motion usam
|
|
21
23
|
* `references` em base64 (role 'start' = imagem inicial, 'end' = frame final,
|
|
@@ -31,6 +33,7 @@ const VIDEO_MODELS = [
|
|
|
31
33
|
"sapiens-video-lite",
|
|
32
34
|
"sapiens-video-fast",
|
|
33
35
|
"sapiens-video-quality",
|
|
36
|
+
"sapiens-video-omni",
|
|
34
37
|
];
|
|
35
38
|
export const videoSchema = z.object({
|
|
36
39
|
action: z.enum(["create", "generate"]),
|
|
@@ -41,7 +44,8 @@ export const videoSchema = z.object({
|
|
|
41
44
|
.describe("action=create: modelo de vídeo. 'sapiens-video-seedance' (cinematográfico+áudio, t2v/i2v), " +
|
|
42
45
|
"'sapiens-video-kling' (anima imagem, i2v/t2v), 'sapiens-video-wan' (imagem que fala, i2v), " +
|
|
43
46
|
"'sapiens-video-kling-motion' (motion transfer, precisa pessoa na imagem E no vídeo de movimento), " +
|
|
44
|
-
"'sapiens-video-lite/fast/quality' (Veo 3.1)
|
|
47
|
+
"'sapiens-video-lite/fast/quality' (Veo 3.1), " +
|
|
48
|
+
"'sapiens-video-omni' (Gemini Omni: texto -> vídeo 10s 720p com áudio nativo; SÓ t2v, ignora imagem/duração/resolução)."),
|
|
45
49
|
durationSec: z
|
|
46
50
|
.number()
|
|
47
51
|
.optional()
|
package/dist/tools/write.js
CHANGED
|
@@ -43,6 +43,10 @@ export const writeSchema = z.object({
|
|
|
43
43
|
.string()
|
|
44
44
|
.optional()
|
|
45
45
|
.describe("Instrução de voz custom (opcional)."),
|
|
46
|
+
voiceSource: z
|
|
47
|
+
.enum(["sapiens", "minha", "sintetico"])
|
|
48
|
+
.optional()
|
|
49
|
+
.describe("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'."),
|
|
46
50
|
repertorioItemIds: z
|
|
47
51
|
.array(z.string())
|
|
48
52
|
.max(5)
|
|
@@ -105,6 +109,7 @@ export async function write(args) {
|
|
|
105
109
|
sourceUserArticleId: args.sourceUserArticleId,
|
|
106
110
|
voiceStyle: args.voiceStyle,
|
|
107
111
|
customVoice: args.customVoice,
|
|
112
|
+
voiceSource: args.voiceSource,
|
|
108
113
|
repertorioItemIds: args.repertorioItemIds,
|
|
109
114
|
coverImageId: args.coverImageId,
|
|
110
115
|
coverImageUrl: args.coverImageUrl,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sapiens-mcp",
|
|
3
|
-
"version": "1.24.
|
|
3
|
+
"version": "1.24.4",
|
|
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": {
|