sapiens-mcp 1.13.0 → 1.15.0
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 +10 -4
- package/dist/tools/community.js +57 -5
- package/dist/tools/image.js +22 -47
- package/dist/tools/profile.js +101 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -22,6 +22,7 @@ import { write, writeSchema } from "./tools/write.js";
|
|
|
22
22
|
import { stockAudio, stockAudioSchema } from "./tools/stockAudio.js";
|
|
23
23
|
import { brand, brandSchema } from "./tools/brand.js";
|
|
24
24
|
import { character, characterSchema } from "./tools/character.js";
|
|
25
|
+
import { profile, profileSchema } from "./tools/profile.js";
|
|
25
26
|
import { describeConvexError } from "./convexClient.js";
|
|
26
27
|
const TOOLS = {
|
|
27
28
|
sapiens_pipeline: {
|
|
@@ -30,7 +31,7 @@ const TOOLS = {
|
|
|
30
31
|
handler: pipeline,
|
|
31
32
|
},
|
|
32
33
|
sapiens_image: {
|
|
33
|
-
description: "Operações de imagem via Sapiens (Gemini, Azure, Veo). Sub-actions: 'generate' (gera imagem completa imediato —
|
|
34
|
+
description: "Operações de imagem via Sapiens (Gemini, Azure gpt-image-2, Grok, Veo). Sub-actions: 'generate' (gera imagem completa imediato — prompt+model+aspectRatio+size; suporta mode=edit/variation e MULTI-REFERÊNCIA: combine até 4 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); refs valem pros modelos robustos nano-banana-2/gpt-image-2-*/grok-2-image*), 'request_generation' (v1.7, cria APENAS row pendente em generatedImages + debita créditos — pra modelos sapiens-video-* ANTES de sapiens_shorts/sapiens_video; whitelist, rate limit 3/min), 'compose' (v1.8, combina persona+screen via Gemini pra app-demo Shorts; 25 sinapses, rate limit 10/min). generate=image one-shot, request_generation=criar row video, compose=montar start frame app-demo.",
|
|
34
35
|
schema: imageSchema,
|
|
35
36
|
handler: image,
|
|
36
37
|
},
|
|
@@ -50,7 +51,7 @@ const TOOLS = {
|
|
|
50
51
|
handler: gallery,
|
|
51
52
|
},
|
|
52
53
|
sapiens_community: {
|
|
53
|
-
description: "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 👍🔥❤️🚀🤯). Voz nas postagens deve seguir o DNA editorial Sapiens (anti-corporate, primeira pessoa, sem em-dash).",
|
|
54
|
+
description: "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. Voz nas postagens deve seguir o DNA editorial Sapiens (anti-corporate, primeira pessoa, sem em-dash).",
|
|
54
55
|
schema: communitySchema,
|
|
55
56
|
handler: community,
|
|
56
57
|
},
|
|
@@ -119,8 +120,13 @@ const TOOLS = {
|
|
|
119
120
|
schema: characterSchema,
|
|
120
121
|
handler: character,
|
|
121
122
|
},
|
|
123
|
+
sapiens_profile: {
|
|
124
|
+
description: "O 'tudo junto' do perfil do user (/u/<username>), leitura 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: get (card completo: identidade + nível + saldo + badges + golden tools), badges (só as conquistas, lista cheia), golden_tools (só os favoritos do aitag, lista cheia). 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/arquétipo MBTI=sapiens_persona action=my_profile, saldo detalhado por bucket=sapiens_meta action=subscription. Monta a partir de queries já em prod (sem custo).",
|
|
125
|
+
schema: profileSchema,
|
|
126
|
+
handler: profile,
|
|
127
|
+
},
|
|
122
128
|
};
|
|
123
|
-
const server = new Server({ name: "mcp-sapiens", version: "1.
|
|
129
|
+
const server = new Server({ name: "mcp-sapiens", version: "1.15.0" }, { capabilities: { tools: {} } });
|
|
124
130
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
125
131
|
tools: Object.entries(TOOLS).map(([name, t]) => ({
|
|
126
132
|
name,
|
|
@@ -153,4 +159,4 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
|
153
159
|
});
|
|
154
160
|
const transport = new StdioServerTransport();
|
|
155
161
|
await server.connect(transport);
|
|
156
|
-
console.error("mcp-sapiens v1.
|
|
162
|
+
console.error("mcp-sapiens v1.15.0 rodando via stdio (20 tools)");
|
package/dist/tools/community.js
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { convexAction, getSessionToken } from "../convexClient.js";
|
|
2
|
+
import { convexAction, convexQuery, getSessionToken } from "../convexClient.js";
|
|
3
3
|
/**
|
|
4
4
|
* Comunidade Sapiens — chat compartilhado entre assinantes/alumni.
|
|
5
|
-
* Wrapper sobre `desktopMcp.communityList` / `communitySend` / `communityReact
|
|
5
|
+
* Wrapper sobre `desktopMcp.communityList` / `communitySend` / `communityReact`
|
|
6
|
+
* (escrita) + `communityChat.listParticipants` / `searchUsers` (quem está na sala).
|
|
6
7
|
*
|
|
7
8
|
* Claude posta como intercessor do user. Toda mensagem ganha sufixo " · via Claude"
|
|
8
9
|
* pra transparência (regra do servidor, não pode ser removida).
|
|
9
10
|
*
|
|
11
|
+
* @mentions: escreva "@username" no content do send — o servidor resolve o
|
|
12
|
+
* username, NOTIFICA a pessoa citada (sino + Telegram) e ela vê que foi marcada.
|
|
13
|
+
* Use 'participants' (ou 'search_users') pra descobrir o @username certo antes.
|
|
14
|
+
*
|
|
10
15
|
* Gate de acesso: o paywall do servidor valida assinatura/alumni. Se o user
|
|
11
|
-
* não tem acesso, list
|
|
16
|
+
* não tem acesso, list/participants devolvem vazio e send/react retornam erro.
|
|
12
17
|
*/
|
|
13
18
|
export const communitySchema = z.object({
|
|
14
|
-
action: z.enum(["list", "send", "react"]),
|
|
19
|
+
action: z.enum(["list", "send", "react", "participants", "search_users"]),
|
|
15
20
|
roomSlug: z
|
|
16
21
|
.string()
|
|
17
22
|
.optional()
|
|
@@ -26,7 +31,11 @@ export const communitySchema = z.object({
|
|
|
26
31
|
content: z
|
|
27
32
|
.string()
|
|
28
33
|
.optional()
|
|
29
|
-
.describe("Texto da mensagem (action=send). Max ~487 chars (suffix '· via Claude' adicionado pelo servidor). Use voz Sapiens."),
|
|
34
|
+
.describe("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."),
|
|
35
|
+
query: z
|
|
36
|
+
.string()
|
|
37
|
+
.optional()
|
|
38
|
+
.describe("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."),
|
|
30
39
|
replyTo: z
|
|
31
40
|
.string()
|
|
32
41
|
.optional()
|
|
@@ -71,4 +80,47 @@ export async function community(args) {
|
|
|
71
80
|
emoji: args.emoji,
|
|
72
81
|
});
|
|
73
82
|
}
|
|
83
|
+
// -------- participants: quem está na sala (pra saber quem marcar com @) --------
|
|
84
|
+
// Query pública existente (gated por paywall via sessionToken). Não precisa de
|
|
85
|
+
// wrapper desktopMcp nem de deploy novo — é só leitura da lista.
|
|
86
|
+
if (args.action === "participants") {
|
|
87
|
+
const rows = await convexQuery("communityChat:listParticipants", {
|
|
88
|
+
sessionToken,
|
|
89
|
+
});
|
|
90
|
+
const people = (rows || []).map((p) => ({
|
|
91
|
+
username: p.username,
|
|
92
|
+
name: p.name ?? null,
|
|
93
|
+
isBot: p.isBot === true,
|
|
94
|
+
mention: p.username ? `@${p.username}` : null,
|
|
95
|
+
lastActiveAt: p.lastActiveAt ?? null,
|
|
96
|
+
messageCount: p.messageCount ?? 0,
|
|
97
|
+
}));
|
|
98
|
+
return {
|
|
99
|
+
count: people.length,
|
|
100
|
+
participants: people,
|
|
101
|
+
note: "Pra falar direto com alguém, inclua o `mention` (ex: '@joao') no content " +
|
|
102
|
+
"do action=send — o servidor notifica a pessoa citada. isBot=true são personas " +
|
|
103
|
+
"(ex: Helen), que respondem sozinhas quando marcadas.",
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// -------- search_users: autocomplete de menção por nome/username --------
|
|
107
|
+
if (args.action === "search_users") {
|
|
108
|
+
if (!args.query || !args.query.trim()) {
|
|
109
|
+
throw new Error("action=search_users exige query (parte do nome ou @username).");
|
|
110
|
+
}
|
|
111
|
+
const rows = await convexQuery("communityChat:searchUsers", {
|
|
112
|
+
sessionToken,
|
|
113
|
+
query: args.query.trim().replace(/^@/, ""),
|
|
114
|
+
});
|
|
115
|
+
const matches = (rows || []).map((p) => ({
|
|
116
|
+
username: p.username,
|
|
117
|
+
name: p.name ?? null,
|
|
118
|
+
mention: p.username ? `@${p.username}` : null,
|
|
119
|
+
}));
|
|
120
|
+
return {
|
|
121
|
+
count: matches.length,
|
|
122
|
+
matches,
|
|
123
|
+
note: "Use o `mention` no content do action=send pra notificar a pessoa.",
|
|
124
|
+
};
|
|
125
|
+
}
|
|
74
126
|
}
|
package/dist/tools/image.js
CHANGED
|
@@ -44,7 +44,11 @@ export const imageSchema = z.object({
|
|
|
44
44
|
referenceImageUrls: z
|
|
45
45
|
.array(z.string())
|
|
46
46
|
.optional()
|
|
47
|
-
.describe("URLs públicas
|
|
47
|
+
.describe("Até 4 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: nano-banana-2, gpt-image-2-* ou grok-2-image*. Soma com sourceImageIds (teto total de 4)."),
|
|
48
|
+
sourceImageIds: z
|
|
49
|
+
.array(z.string())
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("Até 4 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 (teto total de 4)."),
|
|
48
52
|
brandSlug: z
|
|
49
53
|
.string()
|
|
50
54
|
.optional()
|
|
@@ -127,52 +131,18 @@ export async function image(args) {
|
|
|
127
131
|
// sempre desktopMcp.generateImageOnline a partir da v1 do plugin, porque
|
|
128
132
|
// ele cobre os 3 modos uniformemente e tem a coreografia completa (auth,
|
|
129
133
|
// créditos, upload Bunny, patch row).
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const result = await convexAction("desktopMcp:generateImageOnline", {
|
|
136
|
-
sessionToken,
|
|
137
|
-
prompt: args.prompt,
|
|
138
|
-
aspectRatio: args.aspectRatio,
|
|
139
|
-
size: args.size,
|
|
140
|
-
model: args.model ?? "nano-banana-2",
|
|
141
|
-
negativePrompt: args.negativePrompt,
|
|
142
|
-
mode: args.mode ?? "edit",
|
|
143
|
-
sourceImageId: args.sourceImageId,
|
|
144
|
-
brandSlug: args.brandSlug,
|
|
145
|
-
brandMark: args.brandMark,
|
|
146
|
-
});
|
|
147
|
-
return {
|
|
148
|
-
imageId: result?.imageId,
|
|
149
|
-
url: result?.url,
|
|
150
|
-
mimeType: result?.mimeType,
|
|
151
|
-
// Não incluir base64 no retorno (polui contexto). Quem quiser bytes
|
|
152
|
-
// chama sapiens_gallery action=get com includeBase64=true.
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
// Create COM referências externas (URLs): pipelineMcpImage (aceita URLs).
|
|
156
|
-
// Admin-only por enquanto. O caso comum (sem refs externas) cai no caminho
|
|
157
|
-
// user-tier abaixo; a persona do brand NÃO precisa de refs externas (são
|
|
158
|
-
// buscadas server-side a partir do próprio brand).
|
|
159
|
-
if (args.referenceImageUrls && args.referenceImageUrls.length > 0) {
|
|
160
|
-
return await convexAction("pipelineMcpImage:mcpGenerateImage", {
|
|
161
|
-
sessionToken,
|
|
162
|
-
prompt: args.prompt,
|
|
163
|
-
model: args.model ?? "nano-banana-2",
|
|
164
|
-
aspectRatio: args.aspectRatio,
|
|
165
|
-
size: args.size,
|
|
166
|
-
styleId: args.styleId,
|
|
167
|
-
negativePrompt: args.negativePrompt,
|
|
168
|
-
referenceImageUrls: args.referenceImageUrls,
|
|
169
|
-
brandSlug: args.brandSlug,
|
|
170
|
-
brandMark: args.brandMark,
|
|
171
|
-
});
|
|
134
|
+
const hasRefs = !!args.sourceImageId ||
|
|
135
|
+
(args.sourceImageIds?.length ?? 0) > 0 ||
|
|
136
|
+
(args.referenceImageUrls?.length ?? 0) > 0;
|
|
137
|
+
if ((args.mode === "edit" || args.mode === "variation") && !hasRefs) {
|
|
138
|
+
throw new Error(`mode='${args.mode}' exige referência: sourceImageId, sourceImageIds ou referenceImageUrls. Use sapiens_gallery / sapiens_character pra descobrir.`);
|
|
172
139
|
}
|
|
173
|
-
//
|
|
174
|
-
//
|
|
175
|
-
//
|
|
140
|
+
// Caminho ÚNICO user-tier (desktopMcp.generateImageOnline). Cobre create,
|
|
141
|
+
// edit, variation e multi-ref (galeria por id + URLs públicas do Sapiens),
|
|
142
|
+
// resolvendo as referências server-side e cobrando do dono do token. O brand
|
|
143
|
+
// (estilo + persona via refs server-side + logo) aplica dentro do
|
|
144
|
+
// generateImageAction, igual ao gerador web. Substitui o antigo branch
|
|
145
|
+
// referenceImageUrls→pipelineMcpImage (que era admin-only).
|
|
176
146
|
const result = await convexAction("desktopMcp:generateImageOnline", {
|
|
177
147
|
sessionToken,
|
|
178
148
|
prompt: args.prompt,
|
|
@@ -180,7 +150,10 @@ export async function image(args) {
|
|
|
180
150
|
size: args.size,
|
|
181
151
|
model: args.model ?? "nano-banana-2",
|
|
182
152
|
negativePrompt: args.negativePrompt,
|
|
183
|
-
mode: "create",
|
|
153
|
+
mode: args.mode ?? "create",
|
|
154
|
+
sourceImageId: args.sourceImageId,
|
|
155
|
+
sourceImageIds: args.sourceImageIds,
|
|
156
|
+
referenceImageUrls: args.referenceImageUrls,
|
|
184
157
|
brandSlug: args.brandSlug,
|
|
185
158
|
brandMark: args.brandMark,
|
|
186
159
|
});
|
|
@@ -188,5 +161,7 @@ export async function image(args) {
|
|
|
188
161
|
imageId: result?.imageId,
|
|
189
162
|
url: result?.url,
|
|
190
163
|
mimeType: result?.mimeType,
|
|
164
|
+
// Não incluir base64 no retorno (polui contexto). Quem quiser bytes
|
|
165
|
+
// chama sapiens_gallery action=get com includeBase64=true.
|
|
191
166
|
};
|
|
192
167
|
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { convexQuery, getSessionToken } from "../convexClient.js";
|
|
3
|
+
/**
|
|
4
|
+
* sapiens_profile — o "tudo junto" do perfil do user (/u/<username>), leitura
|
|
5
|
+
* user-tier. Agrega o que mora no perfil mas estava espalhado/fora do MCP:
|
|
6
|
+
* identidade + nível/XP, badges (conquistas) e golden tools (favoritos do aitag).
|
|
7
|
+
*
|
|
8
|
+
* Monta a partir de queries que JÁ existem em prod (sem deploy novo), igual ao
|
|
9
|
+
* roster da comunidade: getDesktopUser resolve o user pelo token, e badges /
|
|
10
|
+
* favoritos são queries públicas por userId.
|
|
11
|
+
*
|
|
12
|
+
* As partes "grandes" do perfil têm tool própria e não são duplicadas aqui:
|
|
13
|
+
* - imagens geradas/publicadas → sapiens_gallery
|
|
14
|
+
* - repertório (filmes/séries/jogos/livros/música) → sapiens_repertorio
|
|
15
|
+
* - personagens → sapiens_character
|
|
16
|
+
* - persona/arquétipo MBTI → sapiens_persona action=my_profile
|
|
17
|
+
* - saldo detalhado por bucket → sapiens_meta action=subscription
|
|
18
|
+
*
|
|
19
|
+
* Sub-actions:
|
|
20
|
+
* - get: card completo (identidade + nível + saldo + badges + golden tools).
|
|
21
|
+
* - badges: só as conquistas (lista cheia).
|
|
22
|
+
* - golden_tools: só os favoritos do aitag (lista cheia).
|
|
23
|
+
*/
|
|
24
|
+
export const profileSchema = z.object({
|
|
25
|
+
action: z.enum(["get", "badges", "golden_tools"]),
|
|
26
|
+
});
|
|
27
|
+
const APP = "https://sapiensinteticos.com";
|
|
28
|
+
async function resolveUser(sessionToken) {
|
|
29
|
+
const user = await convexQuery("desktopAuth:getDesktopUser", { sessionToken });
|
|
30
|
+
if (!user || !user._id) {
|
|
31
|
+
throw new Error("Sessão Sapiens inválida ou expirada. Rode sapiens_meta action=login pra reconectar.");
|
|
32
|
+
}
|
|
33
|
+
return user;
|
|
34
|
+
}
|
|
35
|
+
function mapBadges(rows) {
|
|
36
|
+
return (rows || []).map((b) => ({
|
|
37
|
+
name: b?.badge?.name ?? null,
|
|
38
|
+
description: b?.badge?.description ?? null,
|
|
39
|
+
xpReward: b?.badge?.xpReward ?? null,
|
|
40
|
+
earnedAt: b?.earnedAt ?? b?.awardedAt ?? b?._creationTime ?? null,
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
function mapTools(rows) {
|
|
44
|
+
return (rows || []).filter(Boolean).map((t) => ({
|
|
45
|
+
name: t?.name ?? null,
|
|
46
|
+
slug: t?.slug ?? null,
|
|
47
|
+
category: t?.category ?? t?.categorySlug ?? null,
|
|
48
|
+
url: t?.websiteUrl ?? t?.url ?? null,
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
export async function profile(args) {
|
|
52
|
+
const sessionToken = getSessionToken();
|
|
53
|
+
const user = await resolveUser(sessionToken);
|
|
54
|
+
const userId = user._id;
|
|
55
|
+
if (args.action === "badges") {
|
|
56
|
+
const rows = await convexQuery("gamification:getUserBadges", { userId });
|
|
57
|
+
const badges = mapBadges(rows);
|
|
58
|
+
return { count: badges.length, badges };
|
|
59
|
+
}
|
|
60
|
+
if (args.action === "golden_tools") {
|
|
61
|
+
const rows = await convexQuery("aitag/favorites:listFavoritesByUserId", {
|
|
62
|
+
userId,
|
|
63
|
+
});
|
|
64
|
+
const tools = mapTools(rows);
|
|
65
|
+
return {
|
|
66
|
+
count: tools.length,
|
|
67
|
+
tools,
|
|
68
|
+
note: "Favoritos do aitag (golden tools). Marque/desmarque pelo aitag.app.",
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// get: card completo
|
|
72
|
+
const [badgeRows, toolRows] = await Promise.all([
|
|
73
|
+
convexQuery("gamification:getUserBadges", { userId }),
|
|
74
|
+
convexQuery("aitag/favorites:listFavoritesByUserId", { userId }),
|
|
75
|
+
]);
|
|
76
|
+
const badges = mapBadges(badgeRows);
|
|
77
|
+
const tools = mapTools(toolRows);
|
|
78
|
+
return {
|
|
79
|
+
identity: {
|
|
80
|
+
username: user.username ?? null,
|
|
81
|
+
name: user.name ?? null,
|
|
82
|
+
avatarUrl: user.avatarUrl ?? user.image ?? null,
|
|
83
|
+
level: user.level ?? null,
|
|
84
|
+
xp: user.xp ?? null,
|
|
85
|
+
isPremium: user.isPremium === true,
|
|
86
|
+
profileUrl: user.username ? `${APP}/u/${user.username}` : null,
|
|
87
|
+
},
|
|
88
|
+
credits: typeof user.totalCredits === "number" ? user.totalCredits : null,
|
|
89
|
+
badges: {
|
|
90
|
+
count: badges.length,
|
|
91
|
+
items: badges.slice(0, 30),
|
|
92
|
+
},
|
|
93
|
+
goldenTools: {
|
|
94
|
+
count: tools.length,
|
|
95
|
+
items: tools.slice(0, 30),
|
|
96
|
+
},
|
|
97
|
+
note: "Card do perfil: identidade + nível + saldo + badges + golden tools (favoritos do aitag). " +
|
|
98
|
+
"O resto do perfil tem tool própria: imagens=sapiens_gallery, repertório=sapiens_repertorio, " +
|
|
99
|
+
"personagens=sapiens_character, persona/MBTI=sapiens_persona action=my_profile.",
|
|
100
|
+
};
|
|
101
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sapiens-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.15.0",
|
|
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": {
|