sapiens-mcp 1.7.0 → 1.8.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
@@ -36,7 +36,7 @@ const TOOLS = {
36
36
  handler: meta,
37
37
  },
38
38
  sapiens_repertorio: {
39
- description: "Acervo pessoal de filme/série/anime/jogo/livro/música (Repertório, o segundo cérebro do user). Reads: list (filtros mediaType/status), search (texto em title/genres/tags), get (detalhe), lists (listas curadas), popArticles (publicados na coluna). Mutations (qualquer logado, mexem no PRÓPRIO acervo): add_item, update_item (status/rating/tags/note/isPublic), remove_item. CAPTURA ONE-SHOT: quando o user fala natural ('acabei de ver Duna 2, nota 9', 'tô jogando Hollow Knight', 'li tal livro'), faça add_item SEM questionário: infira mediaType e status (assisti/zerei/li=completed, quero=backlog, tô jogando/vendo=active, dropei=dropped), preencha title/year/genres/overview que você conhece, pegue rating se citado. Caso geral usa source='manual' + UUID em externalId (TMDB/RAWG precisam de chave server-side; a capa entra depois pelo site); livro/álbum pra resolver capa keyless via Google Books/iTunes (source='googlebooks'/'itunes'). Upsert/dedup por (userId, source, externalId). Só pergunte se o título for ambíguo.",
39
+ description: "Acervo pessoal de filme/série/anime/jogo/livro/música (Repertório, o segundo cérebro do user). Reads: list (filtros mediaType/status), search (texto em title/genres/tags), get (detalhe), lists (listas curadas), popArticles, resolve (busca capa/ano/id nos providers server-side: OMDb/IGDB-Twitch/AniList/Google Books/iTunes). Mutations (qualquer logado, mexem no PRÓPRIO acervo): add_item, update_item (status/rating/tags/note/isPublic), remove_item. CAPTURA ONE-SHOT: quando o user fala natural ('acabei de ver Duna 2, nota 9', 'tô jogando Hollow Knight', 'li tal livro'), faça add_item SEM questionário: infira mediaType e status (assisti/zerei/li=completed, quero=backlog, tô jogando/vendo=active, dropei=dropped), pegue rating se citado; (2) chame action=resolve {mediaType, query} pra pegar capa+ano+externalId e grave add_item com o source do candidato (twitch/anilist/googlebooks/itunes, ou manual+imdbID pra filme/série do OMDb) + posterUrl; (3) se resolve vier providerKeyMissing ou vazio, grave source='manual' + UUID em externalId com title/year/genres/overview que você conhece. Upsert/dedup por (userId, source, externalId). Só pergunte se o título for ambíguo.",
40
40
  schema: repertorioSchema,
41
41
  handler: repertorio,
42
42
  },
@@ -101,7 +101,7 @@ const TOOLS = {
101
101
  handler: video,
102
102
  },
103
103
  };
104
- const server = new Server({ name: "mcp-sapiens", version: "1.7.0" }, { capabilities: { tools: {} } });
104
+ const server = new Server({ name: "mcp-sapiens", version: "1.8.0" }, { capabilities: { tools: {} } });
105
105
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
106
106
  tools: Object.entries(TOOLS).map(([name, t]) => ({
107
107
  name,
@@ -134,4 +134,4 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
134
134
  });
135
135
  const transport = new StdioServerTransport();
136
136
  await server.connect(transport);
137
- console.error("mcp-sapiens v1.7.0 rodando via stdio (16 tools)");
137
+ console.error("mcp-sapiens v1.8.0 rodando via stdio (16 tools)");
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { convexMutation, convexQuery, getSessionToken, } from "../convexClient.js";
2
+ import { convexAction, convexMutation, convexQuery, getSessionToken, } from "../convexClient.js";
3
3
  /**
4
4
  * Acesso ao Repertório do Sapiens (acervo pessoal de filme/série/anime/jogo/livro/música).
5
5
  *
@@ -29,6 +29,7 @@ export const repertorioSchema = z.object({
29
29
  "get",
30
30
  "lists",
31
31
  "popArticles",
32
+ "resolve",
32
33
  "add_item",
33
34
  "update_item",
34
35
  "remove_item",
@@ -106,6 +107,20 @@ export async function repertorio(args) {
106
107
  })),
107
108
  };
108
109
  }
110
+ // resolve: busca metadado (capa/ano/id) nos providers server-side, com as
111
+ // keys que vivem no env do Convex. Faz a captura por conversa de filme/série/
112
+ // jogo entrar COM capa (anime/livro/música já vêm keyless). Devolve
113
+ // { candidates: [...], providerKeyMissing } pro Claude escolher e gravar via
114
+ // add_item; se providerKeyMissing, cai em manual.
115
+ if (args.action === "resolve") {
116
+ const sessionToken = getSessionToken();
117
+ return await convexAction("repertorioResolve:resolveMedia", {
118
+ sessionToken,
119
+ mediaType: need(args.mediaType, "mediaType"),
120
+ query: need(args.query, "query"),
121
+ limit: 8,
122
+ });
123
+ }
109
124
  // Mutations: sempre exigem sessionToken
110
125
  if (args.action === "add_item" ||
111
126
  args.action === "update_item" ||
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sapiens-mcp",
3
- "version": "1.7.0",
3
+ "version": "1.8.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": {