sapiens-mcp 1.37.0 → 1.38.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/registry.js +2 -2
- package/dist/tools/article.js +12 -0
- package/dist/tools/community.js +20 -1
- package/dist/tools/profile.js +83 -0
- package/package.json +1 -1
package/dist/registry.js
CHANGED
|
@@ -63,7 +63,7 @@ export const TOOLS = {
|
|
|
63
63
|
handler: gallery,
|
|
64
64
|
},
|
|
65
65
|
sapiens_community: {
|
|
66
|
-
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).",
|
|
66
|
+
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. ANEXO do PRÓPRIO acervo no send: mediaAssetKind (track|video|film|comic) + mediaAssetId monta um card da peça (posse conferida no servidor); asTese=true posta a fala como TESE (card de marca, pingável pro Fórum). Voz nas postagens deve seguir o DNA editorial Sapiens (anti-corporate, primeira pessoa, sem em-dash).",
|
|
67
67
|
schema: communitySchema,
|
|
68
68
|
handler: community,
|
|
69
69
|
},
|
|
@@ -138,7 +138,7 @@ export const TOOLS = {
|
|
|
138
138
|
handler: character,
|
|
139
139
|
},
|
|
140
140
|
sapiens_profile: {
|
|
141
|
-
description: "O 'tudo junto' do perfil do user (/u/<username>), 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 de LEITURA: 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), notifications (suas notificações recentes do sino + contagem de não-lidas), mark_read (marca uma notificationId ou TODAS as não-lidas como lidas). Sub-actions de ESCRITA (mexem na SUA conta; identidade sempre da sessão): follow/unfollow (seguir/deixar de seguir outro user por followingId=users:_id, descoberto via sapiens_community participants/search_users), update_bio (edita a sua bio), update_username (troca o seu @; inválido/tomado volta {success:false,error}). 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).",
|
|
141
|
+
description: "O 'tudo junto' do perfil do user (/u/<username>), 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 de LEITURA: 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), notifications (suas notificações recentes do sino + contagem de não-lidas), mark_read (marca uma notificationId ou TODAS as não-lidas como lidas). Sub-actions de ESCRITA (mexem na SUA conta; identidade sempre da sessão): follow/unfollow (seguir/deixar de seguir outro user por followingId=users:_id, descoberto via sapiens_community participants/search_users), update_bio (edita a sua bio), update_username (troca o seu @; inválido/tomado volta {success:false,error}). FAVORITOS de ferramentas de IA (Golden Tools do aitag; o toolId vem de sapiens_repertorio action=search_tools): favorite_tool (favorita/desfavorita, estrela), favorite_lists (suas listas), create_favorite_list (listName+emoji/description/isPublic), add_to_favorite_list/remove_from_favorite_list (toolId+listId), delete_favorite_list (listId). 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).",
|
|
142
142
|
schema: profileSchema,
|
|
143
143
|
handler: profile,
|
|
144
144
|
},
|
package/dist/tools/article.js
CHANGED
|
@@ -38,6 +38,13 @@ export const articleSchema = z.object({
|
|
|
38
38
|
excerpt: z.string().optional(),
|
|
39
39
|
tldr: z.string().optional(),
|
|
40
40
|
content: z.string().optional(),
|
|
41
|
+
// Versão EN do artigo (espinha /en). titleEn+contentEn publicados fazem o
|
|
42
|
+
// artigo aparecer em /en/articles/<slug>, no sitemap e no llms.txt.
|
|
43
|
+
titleEn: z.string().optional().describe("update: título em inglês. Com contentEn, publica a versão EN em /en/articles/<slug>."),
|
|
44
|
+
excerptEn: z.string().optional(),
|
|
45
|
+
tldrEn: z.string().optional(),
|
|
46
|
+
contentEn: z.string().optional().describe("update: corpo em inglês (markdown, mesmo formato do content). Transcreation na voz da casa, não tradução literal."),
|
|
47
|
+
seoDescriptionEn: z.string().optional(),
|
|
41
48
|
tags: z.array(z.string()).optional(),
|
|
42
49
|
thumbnailUrl: httpUrl().optional(),
|
|
43
50
|
ogImageUrl: httpUrl()
|
|
@@ -128,6 +135,11 @@ export async function article(args) {
|
|
|
128
135
|
excerpt: args.excerpt,
|
|
129
136
|
tldr: args.tldr,
|
|
130
137
|
content: args.content,
|
|
138
|
+
titleEn: args.titleEn,
|
|
139
|
+
excerptEn: args.excerptEn,
|
|
140
|
+
tldrEn: args.tldrEn,
|
|
141
|
+
contentEn: args.contentEn,
|
|
142
|
+
seoDescriptionEn: args.seoDescriptionEn,
|
|
131
143
|
tags: args.tags,
|
|
132
144
|
thumbnailUrl: args.thumbnailUrl,
|
|
133
145
|
ogImageUrl: args.ogImageUrl,
|
package/dist/tools/community.js
CHANGED
|
@@ -40,6 +40,18 @@ export const communitySchema = z.object({
|
|
|
40
40
|
.string()
|
|
41
41
|
.optional()
|
|
42
42
|
.describe("communityChatMessages:_id da mensagem que está respondendo (action=send opcional)."),
|
|
43
|
+
mediaAssetKind: z
|
|
44
|
+
.enum(["track", "video", "film", "comic"])
|
|
45
|
+
.optional()
|
|
46
|
+
.describe("Pra action=send: anexa uma peça do SEU acervo como card (track=faixa do Musicator, video=vídeo gerado, film=Vídeo Programático, comic=tirinha). Requer mediaAssetId. O servidor confere que a peça é sua e está pronta."),
|
|
47
|
+
mediaAssetId: z
|
|
48
|
+
.string()
|
|
49
|
+
.optional()
|
|
50
|
+
.describe("Pra action=send com mediaAssetKind: o id da peça no acervo. Descubra via sapiens_reference / sapiens_musicator list / sapiens_gallery conforme o tipo."),
|
|
51
|
+
asTese: z
|
|
52
|
+
.boolean()
|
|
53
|
+
.optional()
|
|
54
|
+
.describe("Pra action=send: posta a fala como TESE (card de marca no chat, pingável pro Fórum). Sem custo."),
|
|
43
55
|
messageId: z
|
|
44
56
|
.string()
|
|
45
57
|
.optional()
|
|
@@ -60,13 +72,20 @@ export async function community(args) {
|
|
|
60
72
|
}
|
|
61
73
|
if (args.action === "send") {
|
|
62
74
|
if (!args.content || !args.content.trim()) {
|
|
63
|
-
throw new Error("action=send exige content (texto não-vazio).");
|
|
75
|
+
throw new Error("action=send exige content (texto não-vazio, mesmo com anexo).");
|
|
76
|
+
}
|
|
77
|
+
if (args.mediaAssetKind && !args.mediaAssetId?.trim()) {
|
|
78
|
+
throw new Error("mediaAssetKind exige mediaAssetId (o id da peça no seu acervo).");
|
|
64
79
|
}
|
|
65
80
|
return await convexAction("desktopMcp:communitySend", {
|
|
66
81
|
sessionToken,
|
|
67
82
|
content: args.content,
|
|
68
83
|
roomSlug: args.roomSlug,
|
|
69
84
|
replyTo: args.replyTo,
|
|
85
|
+
...(args.mediaAssetKind && args.mediaAssetId?.trim()
|
|
86
|
+
? { assetRef: { kind: args.mediaAssetKind, id: args.mediaAssetId.trim() } }
|
|
87
|
+
: {}),
|
|
88
|
+
...(args.asTese ? { asTese: true } : {}),
|
|
70
89
|
});
|
|
71
90
|
}
|
|
72
91
|
if (args.action === "react") {
|
package/dist/tools/profile.js
CHANGED
|
@@ -25,6 +25,10 @@ import { convexQuery, convexMutation, getSessionToken } from "../convexClient.js
|
|
|
25
25
|
* - follow/unfollow: segue/deixa de seguir outro usuário (followingId).
|
|
26
26
|
* - update_bio: edita a SUA bio.
|
|
27
27
|
* - update_username: troca o SEU @username.
|
|
28
|
+
* - favorite_tool: favorita/desfavorita uma ferramenta de IA (estrela do aitag).
|
|
29
|
+
* - favorite_lists: lista as SUAS listas de favoritos (Golden Tools).
|
|
30
|
+
* - create_favorite_list / delete_favorite_list: cria/apaga lista de favoritos.
|
|
31
|
+
* - add_to_favorite_list / remove_from_favorite_list: gere tools numa lista.
|
|
28
32
|
*/
|
|
29
33
|
export const profileSchema = z.object({
|
|
30
34
|
action: z.enum([
|
|
@@ -37,6 +41,12 @@ export const profileSchema = z.object({
|
|
|
37
41
|
"unfollow",
|
|
38
42
|
"update_bio",
|
|
39
43
|
"update_username",
|
|
44
|
+
"favorite_tool",
|
|
45
|
+
"favorite_lists",
|
|
46
|
+
"create_favorite_list",
|
|
47
|
+
"add_to_favorite_list",
|
|
48
|
+
"remove_from_favorite_list",
|
|
49
|
+
"delete_favorite_list",
|
|
40
50
|
]),
|
|
41
51
|
limit: z
|
|
42
52
|
.number()
|
|
@@ -58,6 +68,30 @@ export const profileSchema = z.object({
|
|
|
58
68
|
.string()
|
|
59
69
|
.optional()
|
|
60
70
|
.describe("Pra update_username: o novo @ (3-20 chars, alfanumérico + underscore). Já em uso ou inválido volta {success:false,error}."),
|
|
71
|
+
toolId: z
|
|
72
|
+
.string()
|
|
73
|
+
.optional()
|
|
74
|
+
.describe("Pra favorite_tool / add_to_favorite_list / remove_from_favorite_list: o toolId da ferramenta de IA (aitagTools). Descubra via sapiens_repertorio action=search_tools."),
|
|
75
|
+
listId: z
|
|
76
|
+
.string()
|
|
77
|
+
.optional()
|
|
78
|
+
.describe("Pra add_to_favorite_list / remove_from_favorite_list / delete_favorite_list: id da SUA lista de favoritos (via action=favorite_lists)."),
|
|
79
|
+
listName: z
|
|
80
|
+
.string()
|
|
81
|
+
.optional()
|
|
82
|
+
.describe("Pra create_favorite_list: nome da lista (até 60 chars)."),
|
|
83
|
+
emoji: z
|
|
84
|
+
.string()
|
|
85
|
+
.optional()
|
|
86
|
+
.describe("Pra create_favorite_list: emoji da lista (opcional, ex '⭐')."),
|
|
87
|
+
description: z
|
|
88
|
+
.string()
|
|
89
|
+
.optional()
|
|
90
|
+
.describe("Pra create_favorite_list: descrição curta (opcional)."),
|
|
91
|
+
isPublic: z
|
|
92
|
+
.boolean()
|
|
93
|
+
.optional()
|
|
94
|
+
.describe("Pra create_favorite_list: lista pública (default true) ou privada."),
|
|
61
95
|
});
|
|
62
96
|
const APP = "https://sapiensinteticos.com";
|
|
63
97
|
async function resolveUser(sessionToken) {
|
|
@@ -145,6 +179,55 @@ export async function profile(args) {
|
|
|
145
179
|
// doUpdateUsername devolve {success:false,error} quando inválido/tomado.
|
|
146
180
|
return res;
|
|
147
181
|
}
|
|
182
|
+
// Favoritos de ferramentas de IA (Golden Tools do aitag). Autenticam pelo
|
|
183
|
+
// sessionToken (requireMcpUser no Convex). O toolId vem de
|
|
184
|
+
// sapiens_repertorio action=search_tools.
|
|
185
|
+
if (args.action === "favorite_lists") {
|
|
186
|
+
return await convexQuery("aitag/favorites:mcpListFavoriteLists", { sessionToken });
|
|
187
|
+
}
|
|
188
|
+
if (args.action === "favorite_tool") {
|
|
189
|
+
if (!args.toolId?.trim()) {
|
|
190
|
+
throw new Error("action=favorite_tool exige toolId (via sapiens_repertorio action=search_tools).");
|
|
191
|
+
}
|
|
192
|
+
return await convexMutation("aitag/favorites:mcpToggleFavorite", {
|
|
193
|
+
sessionToken,
|
|
194
|
+
toolId: args.toolId.trim(),
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
if (args.action === "create_favorite_list") {
|
|
198
|
+
if (!args.listName?.trim()) {
|
|
199
|
+
throw new Error("action=create_favorite_list exige listName.");
|
|
200
|
+
}
|
|
201
|
+
return await convexMutation("aitag/favorites:mcpCreateFavoriteList", {
|
|
202
|
+
sessionToken,
|
|
203
|
+
name: args.listName.trim(),
|
|
204
|
+
emoji: args.emoji,
|
|
205
|
+
description: args.description,
|
|
206
|
+
isPublic: args.isPublic,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
if (args.action === "add_to_favorite_list" || args.action === "remove_from_favorite_list") {
|
|
210
|
+
if (!args.toolId?.trim() || !args.listId?.trim()) {
|
|
211
|
+
throw new Error(`action=${args.action} exige toolId e listId (listId via action=favorite_lists).`);
|
|
212
|
+
}
|
|
213
|
+
const fn = args.action === "add_to_favorite_list"
|
|
214
|
+
? "aitag/favorites:mcpAddToFavoriteList"
|
|
215
|
+
: "aitag/favorites:mcpRemoveFromFavoriteList";
|
|
216
|
+
return await convexMutation(fn, {
|
|
217
|
+
sessionToken,
|
|
218
|
+
toolId: args.toolId.trim(),
|
|
219
|
+
listId: args.listId.trim(),
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
if (args.action === "delete_favorite_list") {
|
|
223
|
+
if (!args.listId?.trim()) {
|
|
224
|
+
throw new Error("action=delete_favorite_list exige listId (via action=favorite_lists).");
|
|
225
|
+
}
|
|
226
|
+
return await convexMutation("aitag/favorites:mcpDeleteFavoriteList", {
|
|
227
|
+
sessionToken,
|
|
228
|
+
listId: args.listId.trim(),
|
|
229
|
+
});
|
|
230
|
+
}
|
|
148
231
|
const user = await resolveUser(sessionToken);
|
|
149
232
|
const userId = user._id;
|
|
150
233
|
if (args.action === "badges") {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sapiens-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.38.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": {
|