sapiens-mcp 1.21.0 → 1.23.1
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 +6 -4
- package/dist/tools/meta.js +100 -0
- package/dist/tools/studios.js +20 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -42,7 +42,7 @@ const TOOLS = {
|
|
|
42
42
|
handler: image,
|
|
43
43
|
},
|
|
44
44
|
sapiens_meta: {
|
|
45
|
-
description: "Utilitários transversais: login (conecta a conta com o código de sapiensinteticos.com/conectar-claude, salva sessão de 30 dias localmente), logout, whoami (tier user/admin + saldo + email), credits (saldo agregado), subscription (v1.2 — 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). Use credits/subscription antes de gerar imagem pra avisar se vai estourar.",
|
|
45
|
+
description: "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 sessão de 30 dias localmente), logout, whoami (tier user/admin + saldo + email), credits (saldo agregado), subscription (v1.2 — 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). Use credits/subscription antes de gerar imagem pra avisar se vai estourar.",
|
|
46
46
|
schema: metaSchema,
|
|
47
47
|
handler: meta,
|
|
48
48
|
},
|
|
@@ -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, 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), tirinha-seinen (+18, UI-only), carrosel-editorial, comunidade, repertorio.",
|
|
86
86
|
schema: studiosSchema,
|
|
87
87
|
handler: studios,
|
|
88
88
|
},
|
|
@@ -170,6 +170,8 @@ const TOOLS = {
|
|
|
170
170
|
const SAPIENS_INSTRUCTIONS = `Você opera o Sapiens Sintéticos (sapiensinteticos.com) NA CONTA de um usuário logado. Cada tool age de verdade na conta dele e muitas COBRAM Sinapses (o crédito da casa). Aja como operador, não no chute.
|
|
171
171
|
|
|
172
172
|
REGRA DE OURO:
|
|
173
|
+
- PRIMEIRO CONTATO ou "o que você faz?"/"como começo?"/"o que dá pra fazer?": chame sapiens_meta action=start e MOSTRE o resultado na sua voz. Sem login, ele ensina a conectar; logado, traz saldo + primeiros poderes com exemplos. É a porta de entrada: não despeje a lista dos 26 tools, deixe o start guiar.
|
|
174
|
+
- LOGO APÓS UM LOGIN BEM-SUCEDIDO (action=login retornou ok): chame action=start na sequência e mostre a porta de entrada. O recém-chegado não sabe o que pedir; não o deixe na tela em branco, guie a primeira jogada sem ele precisar perguntar.
|
|
173
175
|
- Se um tool voltar erro de validação ("exige X", "falta Y"), LEIA o erro e refaça a chamada COM o que falta. NUNCA repita igual a chamada que falhou: 3 falhas seguidas no mesmo tool fazem o cliente marcar o servidor como "unreachable" por ~56s (disjuntor anti-loop). Aí parece que "o MCP caiu", quando foi só argumento faltando.
|
|
174
176
|
- Antes de gerar algo caro (imagem/música/vídeo), cheque saldo: sapiens_meta action=credits (ou subscription). Saldo baixo, avise o usuário antes.
|
|
175
177
|
- "sessionToken expirado" = refaça login: sapiens_meta action=login com o código de sapiensinteticos.com/conectar-claude.
|
|
@@ -191,7 +193,7 @@ Imagem (sapiens_image) action=generate: prompt + model + aspectRatio. Referênci
|
|
|
191
193
|
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.
|
|
192
194
|
|
|
193
195
|
Voz da casa: 1ª pessoa, direto, anti-corporate, sem travessão. Pra bom entendedor, meia palavra basta.`;
|
|
194
|
-
const server = new Server({ name: "mcp-sapiens", version: "1.
|
|
196
|
+
const server = new Server({ name: "mcp-sapiens", version: "1.23.1" }, { capabilities: { tools: {} }, instructions: SAPIENS_INSTRUCTIONS });
|
|
195
197
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
196
198
|
tools: Object.entries(TOOLS).map(([name, t]) => ({
|
|
197
199
|
name,
|
|
@@ -224,4 +226,4 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
|
224
226
|
});
|
|
225
227
|
const transport = new StdioServerTransport();
|
|
226
228
|
await server.connect(transport);
|
|
227
|
-
console.error("mcp-sapiens v1.
|
|
229
|
+
console.error("mcp-sapiens v1.23.1 rodando via stdio (26 tools)");
|
package/dist/tools/meta.js
CHANGED
|
@@ -22,6 +22,7 @@ function readMcpVersion() {
|
|
|
22
22
|
}
|
|
23
23
|
export const metaSchema = z.object({
|
|
24
24
|
action: z.enum([
|
|
25
|
+
"start",
|
|
25
26
|
"login",
|
|
26
27
|
"logout",
|
|
27
28
|
"whoami",
|
|
@@ -126,7 +127,106 @@ const FORMAT_GUIDE = {
|
|
|
126
127
|
},
|
|
127
128
|
},
|
|
128
129
|
};
|
|
130
|
+
// Curadoria do action=start: a PORTA DE ENTRADA, não os 26 tools (despejar tudo
|
|
131
|
+
// afoga cliente fraco). 6 primeiros poderes, cada um com 1 frase pronta pra
|
|
132
|
+
// colar. Voz da casa, espelhando a vitrine /conectar-claude (mantido à mão aqui
|
|
133
|
+
// porque o MCP é pacote separado e não importa o examples.ts do app Next).
|
|
134
|
+
// NÃO menciona slash command (/sapiens:login etc.): isso só existe no Claude
|
|
135
|
+
// Code; Helen/Gemini/Cursor falam só MCP em linguagem natural.
|
|
136
|
+
const FIRST_POWERS = [
|
|
137
|
+
{
|
|
138
|
+
icon: "📚",
|
|
139
|
+
title: "Repertório (seu segundo cérebro)",
|
|
140
|
+
cost: "grátis",
|
|
141
|
+
try: "Acabei de ver Duna 2, adiciona no meu repertório, nota 9.",
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
icon: "🖼",
|
|
145
|
+
title: "Gerar imagem",
|
|
146
|
+
cost: "~400-500 Sinapses",
|
|
147
|
+
try: "Faz um retrato Sapiens de uma trader degen segurando uma moeda.",
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
icon: "✍️",
|
|
151
|
+
title: "Escrever artigo",
|
|
152
|
+
cost: "400 Sinapses",
|
|
153
|
+
try: "Escreve um ensaio sobre solidão usando meus jogos 9+ como lente.",
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
icon: "🧬",
|
|
157
|
+
title: "Persona (quiz dos 16 arquétipos)",
|
|
158
|
+
cost: "grátis",
|
|
159
|
+
try: "Quero fazer o quiz de persona aqui no chat.",
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
icon: "🪞",
|
|
163
|
+
title: "Reflexo (monta o seu Sintético)",
|
|
164
|
+
cost: "propor de graça · imagem 450",
|
|
165
|
+
try: "Monta o meu Reflexo a partir do meu rastro na plataforma.",
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
icon: "🎵",
|
|
169
|
+
title: "Música (Musicator)",
|
|
170
|
+
cost: "letra 300 · áudio 3000 Sinapses",
|
|
171
|
+
try: "Cria uma música sobre borderless na voz Sapiens e já renderiza.",
|
|
172
|
+
},
|
|
173
|
+
];
|
|
129
174
|
export async function meta(args) {
|
|
175
|
+
// start: porta de entrada do primeiro contato. NÃO exige login (esse é o
|
|
176
|
+
// ponto). Sem sessão, ensina a conectar; com sessão, personaliza com
|
|
177
|
+
// nome/tier/saldo e curadoria de primeiros poderes + um "comece por aqui".
|
|
178
|
+
if (args.action === "start") {
|
|
179
|
+
const token = getSessionToken();
|
|
180
|
+
if (!token) {
|
|
181
|
+
return {
|
|
182
|
+
connected: false,
|
|
183
|
+
message: "Bem-vindo ao Sapiens Sintéticos. Sua conta ainda não tá conectada aqui no cliente.",
|
|
184
|
+
howToConnect: [
|
|
185
|
+
"1. Entra logado em sapiensinteticos.com/conectar-claude e gera um código XXXX-XXXX (expira em 5 min, uso único).",
|
|
186
|
+
"2. Me passa esse código que eu conecto a sua conta (rodo sapiens_meta action=login).",
|
|
187
|
+
],
|
|
188
|
+
note: "Sem API key e sem cartão: você opera com as Sinapses que já tem na conta. Conectado, me peça 'o que você faz?' que eu te mostro os primeiros poderes.",
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
// best-effort: sem o whoami ainda dá pra entregar um onboarding útil.
|
|
192
|
+
let who = null;
|
|
193
|
+
try {
|
|
194
|
+
who = await convexQuery("mcpExtras:mcpGetMySubscription", {
|
|
195
|
+
sessionToken: token,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// segue sem personalizar
|
|
200
|
+
}
|
|
201
|
+
const isAdmin = !!who?.user?.isAdmin;
|
|
202
|
+
const name = who?.user?.name || who?.user?.email || null;
|
|
203
|
+
const balance = who?.balance?.total ?? null;
|
|
204
|
+
const lowBalance = typeof balance === "number" && balance < 500;
|
|
205
|
+
const startHere = lowBalance
|
|
206
|
+
? "Com saldo curto pra geração paga, começa pelo que é de graça: marca umas obras no Repertório e faz o quiz de Persona. Eles alimentam todo o resto."
|
|
207
|
+
: "Começa pelo Repertório: marca uma obra que te pegou (filme, jogo, livro, anime). É grátis e vira a matéria-prima que eu puxo depois pra escrever, comparar e criar.";
|
|
208
|
+
return {
|
|
209
|
+
connected: true,
|
|
210
|
+
greeting: name
|
|
211
|
+
? `E aí, ${name}. Conectado${isAdmin ? " (tier admin)" : ""}${typeof balance === "number" ? `, ${balance} Sinapses na conta` : ""}.`
|
|
212
|
+
: "Conta conectada.",
|
|
213
|
+
tier: isAdmin ? "admin" : "user",
|
|
214
|
+
balance,
|
|
215
|
+
...(lowBalance
|
|
216
|
+
? {
|
|
217
|
+
balanceWarning: "Saldo abaixo de 500 Sinapses: o que é grátis roda tranquilo, mas pra imagem/música/vídeo talvez precise recarregar.",
|
|
218
|
+
}
|
|
219
|
+
: {}),
|
|
220
|
+
firstPowers: FIRST_POWERS,
|
|
221
|
+
startHere,
|
|
222
|
+
moreOnDemand: "Isso é só a porta de entrada. Tem também personagens (character-lock), voz (Helen TTS), vídeo, brand/design system, comunidade, fórum e suporte. Peça 'o que mais você faz?' que eu listo, ou já manda o que você quer fazer.",
|
|
223
|
+
...(isAdmin
|
|
224
|
+
? {
|
|
225
|
+
adminNote: "Tier admin (dono): pipeline editorial, Coluna Sapiens, blog e shorts/vídeo liberados, além de tudo do tier user.",
|
|
226
|
+
}
|
|
227
|
+
: {}),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
130
230
|
if (args.action === "formats") {
|
|
131
231
|
return {
|
|
132
232
|
formats: FORMAT_GUIDE,
|
package/dist/tools/studios.js
CHANGED
|
@@ -106,6 +106,26 @@ const STUDIOS = {
|
|
|
106
106
|
mcpReady: true,
|
|
107
107
|
mcpNote: "Parcialmente coberto via sapiens_pipeline format=post_social (texto Claude-side) + sapiens_image.",
|
|
108
108
|
},
|
|
109
|
+
"comic-builder": {
|
|
110
|
+
name: "Comic Builder (Tirinhas)",
|
|
111
|
+
description: "Estúdio oficial de tirinhas/quadrinhos. A IA roteiriza e gera os painéis de dois jeitos: painel a painel (controle fino) ou a tira inteira numa imagem só (estilo e lógica mais travados). Traço dos artigos como estilo base, Helen opcional, diagramação (2×2, tira, vertical) e histórico das tirinhas.",
|
|
112
|
+
url: `${APP}/experimentos/comic-builder`,
|
|
113
|
+
status: "stable",
|
|
114
|
+
tags: ["tirinha", "tirinhas", "comic", "quadrinhos", "hq", "painel", "roteiro", "narrativa"],
|
|
115
|
+
convex: "comicStrips",
|
|
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.",
|
|
128
|
+
},
|
|
109
129
|
"carrosel-editorial": {
|
|
110
130
|
name: "Carrossel Editorial",
|
|
111
131
|
description: "Gerador de carrossel Instagram com templates fixos (role × variant A/B/C), 9 slides Sapiens. Render via Playwright.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sapiens-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.23.1",
|
|
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": {
|