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 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.13.0" }, { capabilities: { tools: {} } });
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.13.0 rodando via stdio (19 tools)");
156
+ console.error("mcp-sapiens v1.14.0 rodando via stdio (19 tools)");
@@ -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 devolve vazio e send/react retornam erro claro.
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.13.0",
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": {