{"serverId":"mcp-registry/co.subtraq/subtraq","tools":[{"name":"create_link","fixed":{"name":"create_link","description":"Crée un lien court. Sans `parentId`, c'est un lien parent et `destination` est obligatoire. Avec `parentId`, c'est un placement : il hérite de la destination du parent et porte ses propres UTM. Renvoie `shortUrl`, prêt à publier.","inputSchema":{"type":"object","required":["space"],"properties":{"slug":{"type":"string","description":"Raccourci souhaité. Tiré au sort s'il est omis."},"label":{"type":"string","description":"Nom du placement, par exemple « Pub Meta — mars »."},"space":{"type":"string","description":"Raccourci de l'espace client."},"domain":{"type":"string","description":"Adresse qui porte le lien (« liens.votresite.fr »). Omise = le même choix que l'écran de création : le domaine de marque réservé à l'espace, sinon l'unique domaine de marque du compte, sinon l'adresse offerte de l'espace (« client.sbtq.link ») ; pour un placement, le domaine de son parent. Pour le domaine partagé, le nommer : « sbtq.link » (la valeur `domain` d'un lien partagé). Un domaine de marque doit être vérifié dans le compte, et libre pour cet espace."},"utmTerm":{"type":"string","description":"utm_term du placement."},"parentId":{"type":"string","description":"Identifiant du lien parent, pour créer un placement."},"utmMedium":{"type":"string","description":"utm_medium du placement."},"utmSource":{"type":"string","description":"utm_source du placement."},"utmContent":{"type":"string","description":"utm_content du placement."},"destination":{"type":"string","description":"URL d'arrivée. Obligatoire pour un parent, interdite pour un placement."},"utmCampaign":{"type":"string","description":"utm_campaign du placement."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":465,"tokensAfter":465},{"name":"create_space","fixed":{"name":"create_space","description":"Crée un espace client. Refusé avec le code `space_limit_reached` si la formule est pleine.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Nom affiché, par exemple « Maison Lartigue »."},"slug":{"type":"string","description":"Raccourci dans les URL. Déduit du nom s'il est omis."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":105,"tokensAfter":105},{"name":"get_analytics","fixed":{"name":"get_analytics","description":"Les chiffres d'un espace : clics, prospects, ventes, revenu ATTRIBUÉ et revenu NON attribué, plus le détail placement par placement. Montants en CENTIMES. Subtraq ne convertit pas les devises : si `mixedCurrencies` est vrai, les totaux ne concernent que `currency`. `model` choisit la lecture de l'attribution ; la réponse rappelle toujours lequel a servi.","inputSchema":{"type":"object","required":["space"],"properties":{"model":{"type":"string","description":"Modèle d'attribution : `first` (premier clic, défaut et référence du produit), `last` (dernier clic avant la conversion) ou `linear` (partage entre tous les placements cliqués, revenu réparti au centime près). Dans les trois cas, attribué + non attribué = revenu total."},"space":{"type":"string","description":"Raccourci de l'espace client."},"period":{"type":"string","description":"7d, 30d (défaut), 90d ou all."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":257,"tokensAfter":257},{"name":"get_link","fixed":{"name":"get_link","description":"Détaille un lien : sa destination FINALE (UTM comprises, telle que la reçoit le site d'arrivée) et ses clics sur 30 jours.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"Identifiant du lien."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":79,"tokensAfter":79},{"name":"list_links","fixed":{"name":"list_links","description":"Liste les liens. Un lien PARENT porte la destination ; un PLACEMENT (sublink) porte les UTM d'une publication précise et hérite du reste.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","description":"1 à 100."},"space":{"type":"string","description":"Raccourci de l'espace. Omis = tous les espaces du compte."},"cursor":{"type":"string","description":"Curseur de la page suivante."},"status":{"type":"string","description":"active (défaut), archived, ou all."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":146,"tokensAfter":146},{"name":"list_spaces","fixed":{"name":"list_spaces","description":"Liste les espaces du compte. Un espace = un client, une marque ou un projet ; tout le reste (liens, clics, ventes) vit dedans.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","description":"1 à 100, 50 par défaut."},"cursor":{"type":"string","description":"Curseur renvoyé par l'appel précédent (`nextCursor`)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":105,"tokensAfter":105},{"name":"update_link","fixed":{"name":"update_link","description":"Modifie la destination, le libellé ou l'ADRESSE d'un lien (`domain` et/ou `slug`), ou l'archive. Changer d'adresse ne casse rien : l'ancienne adresse continue de rediriger vers le même endroit et ses clics comptent sur ce lien (`previousShortUrls`) ; les placements qui partageaient son domaine le suivent. Un lien n'est JAMAIS supprimé : archivé, il cesse de rediriger (anciennes adresses comprises) mais son historique reste.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"Identifiant du lien."},"slug":{"type":"string","description":"Nouveau raccourci. Pris sur le domaine visé : erreur `slug_taken`, avec un raccourci libre proposé dans `details.suggestion`."},"label":{"type":"string","description":"Nouveau libellé."},"domain":{"type":"string","description":"Nouveau domaine de l'adresse (« liens.votresite.fr »), vérifié dans le compte et libre pour l'espace du lien ; « sbtq.link » pour revenir au domaine partagé. L'ancienne adresse continue de marcher."},"archived":{"type":"boolean","description":"true pour archiver, false pour réactiver."},"destination":{"type":"string","description":"Nouvelle URL d'arrivée (liens parents seulement)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":346,"tokensAfter":346}],"toolsChanged":7,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}