tabtree-mcp 1.2.0 → 1.2.1

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.
Files changed (2) hide show
  1. package/package.json +2 -2
  2. package/tabtree-mcp.mjs +19 -2
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "tabtree-mcp",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "mcpName": "app.tabtree/tabtree",
5
- "description": "Let Claude read your TabTree library and turn conversations into mind maps and whiteboards. Local files, no account, nothing uploaded.",
5
+ "description": "Let Claude read your TabTree library and turn conversations into mind maps and whiteboards — in your TabTree account, or from local files.",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/ai4xedu/tabtree-mcp.git"
package/tabtree-mcp.mjs CHANGED
@@ -29,10 +29,27 @@ const DIR = process.env.TABTREE_DIR || process.env.YGMIND_DIR || "";
29
29
  // outils ne changent pas d'un mot de contrat, seule la tuyauterie de lecture/écriture change.
30
30
  // `TABTREE_API_URL` n'est là que pour une préversion — la valeur par défaut est la production.
31
31
  // ---------------------------------------------------------------------------
32
- const API_KEY = String(process.env.TABTREE_API_KEY || "").trim();
32
+ let API_KEY = String(process.env.TABTREE_API_KEY || "").trim();
33
+ // ⚠️ UN CHAMP NON RENSEIGNÉ N'EST PAS UNE CLÉ FAUSSE (2026-09-09). Claude Desktop passe le
34
+ // gabarit `${user_config.api_key}` TEL QUEL quand le champ est vide — mesuré le jour où la
35
+ // réinstallation du .mcpb a vidé la configuration (la clé est `sensitive`, donc rangée dans le
36
+ // Trousseau et liée à l'installation précédente). `CLOUD = !!API_KEY` prenait ce littéral pour
37
+ // une clé, l'envoyait, et le serveur répondait « Unknown or revoked connector key » : un
38
+ // message FAUX, qui envoie chercher une clé révoquée là où il n'y a simplement rien de saisi.
39
+ if(/^\$\{.*\}$/.test(API_KEY)) API_KEY = "";
33
40
  const API_URL = String(process.env.TABTREE_API_URL || "https://aynmiptyvisxoslzkzxn.supabase.co/functions/v1/mcp").trim();
34
41
  const CLOUD = !!API_KEY;
42
+ // La FORME d'une clé se vérifie ici, avant tout aller-retour : l'app en fabrique une en
43
+ // `tt_live_` + 43 caractères base64url (`connKeyMaterial`). Une valeur qui n'y ressemble pas est
44
+ // une faute de copie ou un champ mal rempli — le dire tout de suite nomme la bonne cause, et
45
+ // évite d'aller faire dire au serveur quelque chose qu'il ne sait pas.
46
+ const API_KEY_OK = /^tt_live_[A-Za-z0-9_-]{20,}$/.test(API_KEY);
35
47
  async function cloudCall(action, body){
48
+ if(!API_KEY_OK) throw new Error(
49
+ "TABTREE_API_KEY does not look like a connector key — it must start with \"tt_live_\". "
50
+ + "If you just reinstalled the connector, its settings were reset: open TabTree → \u2699\ufe0f Settings "
51
+ + "\u2192 Account \u2192 Claude connector, create a key, paste it into the connector's settings, "
52
+ + "then restart the connector.");
36
53
  let r;
37
54
  try{
38
55
  r = await fetch(API_URL, { method:"POST",
@@ -930,7 +947,7 @@ function handle(msg){
930
947
  // déjà dérivé (1.0.0 ici, 1.1.0 dans le manifeste) sans que rien ne le
931
948
  // signale : un client affiche l'une, le registre publie l'autre. Un
932
949
  // autotest les compare désormais toutes les quatre.
933
- serverInfo: { name: "tabtree", version: "1.2.0" }
950
+ serverInfo: { name: "tabtree", version: "1.2.1" }
934
951
  });
935
952
  } else if(method === "notifications/initialized" || (method||"").startsWith("notifications/")){
936
953
  // notification : pas de réponse