sapiens-mcp 1.13.0 → 1.14.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 +3 -3
- package/dist/tools/community.js +57 -5
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -50,7 +50,7 @@ const TOOLS = {
|
|
|
50
50
|
handler: gallery,
|
|
51
51
|
},
|
|
52
52
|
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).",
|
|
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 👍🔥❤️🚀🤯), 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
54
|
schema: communitySchema,
|
|
55
55
|
handler: community,
|
|
56
56
|
},
|
|
@@ -120,7 +120,7 @@ const TOOLS = {
|
|
|
120
120
|
handler: character,
|
|
121
121
|
},
|
|
122
122
|
};
|
|
123
|
-
const server = new Server({ name: "mcp-sapiens", version: "1.
|
|
123
|
+
const server = new Server({ name: "mcp-sapiens", version: "1.14.0" }, { capabilities: { tools: {} } });
|
|
124
124
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
125
125
|
tools: Object.entries(TOOLS).map(([name, t]) => ({
|
|
126
126
|
name,
|
|
@@ -153,4 +153,4 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
|
153
153
|
});
|
|
154
154
|
const transport = new StdioServerTransport();
|
|
155
155
|
await server.connect(transport);
|
|
156
|
-
console.error("mcp-sapiens v1.
|
|
156
|
+
console.error("mcp-sapiens v1.14.0 rodando via stdio (19 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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sapiens-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.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": {
|