{"serverId":"mcp-registry/com.mathieuberthet/mb-mastering","tools":[{"name":"fetch","fixed":{"name":"fetch","description":"Récupère le contenu complet d'un document MB Mastering à partir de son id (obtenu via search). / Fetches the full content of a document by id (from search results).","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"Identifiant du document renvoyé par search."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":104,"tokensAfter":104},{"name":"get_faq","fixed":{"name":"get_faq","description":"Réponses aux questions fréquentes sur le mastering chez MB Mastering : prix, délais, révisions, travail à distance, gravure vinyle, localisation.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":72,"tokensAfter":72},{"name":"get_pricing","fixed":{"name":"get_pricing","description":"Donne les tarifs de mastering de MB Mastering, ainsi que les délais, la politique de révisions et les modalités de paiement.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":67,"tokensAfter":67},{"name":"get_services","fixed":{"name":"get_services","description":"Liste les services de mastering de MB Mastering (mastering stéréo, stems, à distance, gravure vinyle, numérisation, formation) avec leurs tarifs et descriptions.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":78,"tokensAfter":78},{"name":"get_studio_info","fixed":{"name":"get_studio_info","description":"Informations sur le studio MB Mastering : fondateur, expérience, adresse à Paris, équipement analogique, liens et réseaux.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":68,"tokensAfter":68},{"name":"imap_get_mail","fixed":{"name":"imap_get_mail","description":"RÉSERVÉ AU STUDIO (token). Récupère le corps + liens (WeTransfer, Drive, SwissTransfer, etc.) + pièces jointes d'un mail INBOX par UID. UID est fourni par imap_list_inbox. Décode automatiquement quoted-printable/base64 + UTF-8.","inputSchema":{"type":"object","required":["uid"],"properties":{"uid":{"type":"integer","description":"UID du mail (obtenu via imap_list_inbox)."},"auth_token":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":133,"tokensAfter":133},{"name":"imap_list_inbox","fixed":{"name":"imap_list_inbox","description":"RÉSERVÉ AU STUDIO (token). Liste les N derniers mails de INBOX (contact@mathieuberthet.com) via IMAP direct sur OVH. Retourne UID (à passer à imap_get_mail), date, expéditeur, objet, flags. Bypass Chrome/Roundcube — beaucoup plus rapide et fiable.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","description":"Nombre de mails à retourner (défaut 20, max 50)."},"auth_token":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":136,"tokensAfter":136},{"name":"list_quote_requests","fixed":{"name":"list_quote_requests","description":"RÉSERVÉ AU STUDIO (token). Journal des demandes de devis reçues via le tool public send_quote_request : envoyées par mail ET filtrées comme robots/spam (avec la raison). Permet de vérifier qu'aucune vraie demande n'a été filtrée.","inputSchema":{"type":"object","properties":{"days":{"type":"integer","description":"Fenêtre en jours (défaut 7, max 90)."},"verdict":{"type":"string","description":"Filtre : 'envoyé', 'filtré', 'plafond'. Vide = tout."},"auth_token":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":156,"tokensAfter":156},{"name":"qonto_create_invoice","fixed":{"name":"qonto_create_invoice","description":"RÉSERVÉ AU STUDIO (token). Crée une facture client Qonto (brouillon/proforma par défaut, ou 'unpaid' = officielle) et renvoie numéro, total, lien de paiement Mollie. Client cherché par id, email puis nom ; création possible avec create_client_if_missing=true + adresse. Anti-doublon : refuse un document identique le même jour (sauf force=true) ; request_id rend l'appel rejouable sans doublon. Aucun PDF dans la réponse : utiliser prepare_quote_email (qonto_type/qonto_number) pour l'envoyer, qonto_","inputSchema":{"type":"object","required":["items"],"properties":{"city":{"type":"string","description":"Ville — obligatoire pour créer un client."},"force":{"type":"boolean","description":"Créer même si un document identique (même client, même total, même jour) existe déjà. Défaut false."},"items":{"type":"array","items":{"type":"object","required":["title","unit_price"],"properties":{"title":{"type":"string","description":"Intitulé de la prestation, ex. 'Mastering stéréo — Track X'."},"quantity":{"type":["string","number"],"description":"Quantité (défaut 1)."},"unit_price":{"type":"number","description":"Prix unitaire HT en €."}}},"description":"Lignes (au moins 1)."},"status":{"enum":["draft","unpaid"],"type":"string","description":"draft (proforma, à finaliser plus tard) ou unpaid (facture officielle). Défaut : draft."},"due_days":{"type":"integer","description":"Jours avant échéance (défaut 30)."},"zip_code":{"type":"string","description":"Code postal — obligatoire pour créer un client, sauf address_unknown."},"client_id":{"type":"string","description":"Id Qonto du client (prioritaire sur email/nom)."},"auth_token":{"type":"string","description":"Token d'administration (si le client MCP ne permet pas le header Authorization)."},"request_id":{"type":"string","description":"Identifiant unique de CET appel (ex. 'mate027-devis-2026-09-22'). Si le même request_id est rejoué (timeout, relance), le serveur renvoie la réponse d'origine sans rien recréer."},"tin_number":{"type":"string","description":"SIREN/SIRET (ou n° fiscal étranger) du client : rend le type company possible. Optionnel."},"vat_number":{"type":"string","description":"N° TVA intracom du client créé (optionnel)."},"client_kind":{"enum":["company","individual"],"type":"string","description":"Type du client créé. Défaut individual (le nom du label/artiste est conservé tel quel comme nom affiché) ; company UNIQUEMENT avec tin_number (SIREN/SIRET) — sinon Qonto refuse le devis."},"client_name":{"type":"string","description":"Nom du client (label, studio, artiste ou 'Prénom Nom'). Recherche exacte insensible à la casse."},"client_email":{"type":"string","description":"Email du client (recherche par email d'abord)."},"contact_name":{"type":"string","description":"Prénom Nom de la personne de contact (ex. 'Rafa Santos') quand client_name est un label — sert de prénom/nom Qonto. Optionnel."},"client_country":{"type":"string","description":"Code pays ISO2 du client créé (défaut FR)."},"street_address":{"type":"string","description":"Adresse de facturation (rue) — obligatoire pour créer un client, sauf address_unknown."},"address_unknown":{"type":"boolean","description":"Le client n'a PAS communiqué son adresse : rue/code postal remplacés par « — » (ville + pays requis). JAMAIS inventer une adresse — la demander au client."},"create_client_if_missing":{"type":"boolean","description":"Si le client n'existe pas : le créer (sinon erreur explicite). Exige alors l'adresse ci-dessous."}},"additionalProperties":false},"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":991,"tokensAfter":991},{"name":"qonto_create_quote","fixed":{"name":"qonto_create_quote","description":"RÉSERVÉ AU STUDIO (token). Crée un devis client Qonto (D-2026-XXX) et renvoie numéro, total, lien client, id. Client cherché par id, email puis nom ; création possible avec create_client_if_missing=true + adresse (jamais inventée : address_unknown=true pose des tirets). Anti-doublon : refuse un devis identique le même jour (sauf force=true) ; request_id rend l'appel rejouable sans doublon. Aucun PDF dans la réponse : prepare_quote_email (qonto_type=quote, qonto_number=D-…) l'envoie, qonto_get do","inputSchema":{"type":"object","required":["items"],"properties":{"city":{"type":"string","description":"Ville — obligatoire pour créer un client."},"force":{"type":"boolean","description":"Créer même si un document identique (même client, même total, même jour) existe déjà. Défaut false."},"items":{"type":"array","items":{"type":"object","required":["title","unit_price"],"properties":{"title":{"type":"string","description":"Intitulé de la prestation, ex. 'Mastering stéréo — Track X'."},"quantity":{"type":["string","number"],"description":"Quantité (défaut 1)."},"unit_price":{"type":"number","description":"Prix unitaire HT en €."}}},"description":"Lignes (au moins 1)."},"zip_code":{"type":"string","description":"Code postal — obligatoire pour créer un client, sauf address_unknown."},"client_id":{"type":"string","description":"Id Qonto du client (prioritaire sur email/nom)."},"auth_token":{"type":"string"},"request_id":{"type":"string","description":"Identifiant unique de CET appel (ex. 'mate027-devis-2026-09-22'). Si le même request_id est rejoué (timeout, relance), le serveur renvoie la réponse d'origine sans rien recréer."},"tin_number":{"type":"string","description":"SIREN/SIRET (ou n° fiscal étranger) du client : rend le type company possible. Optionnel."},"vat_number":{"type":"string","description":"N° TVA intracom du client créé (optionnel)."},"client_kind":{"enum":["company","individual"],"type":"string","description":"Type du client créé. Défaut individual (le nom du label/artiste est conservé tel quel comme nom affiché) ; company UNIQUEMENT avec tin_number (SIREN/SIRET) — sinon Qonto refuse le devis."},"client_name":{"type":"string","description":"Nom du client (label, studio, artiste ou 'Prénom Nom'). Recherche exacte insensible à la casse."},"client_email":{"type":"string","description":"Email du client (recherche par email d'abord)."},"contact_name":{"type":"string","description":"Prénom Nom de la personne de contact (ex. 'Rafa Santos') quand client_name est un label — sert de prénom/nom Qonto. Optionnel."},"validity_days":{"type":"integer","description":"Jours de validité du devis (défaut 30)."},"client_country":{"type":"string","description":"Code pays ISO2 du client créé (défaut FR)."},"street_address":{"type":"string","description":"Adresse de facturation (rue) — obligatoire pour créer un client, sauf address_unknown."},"address_unknown":{"type":"boolean","description":"Le client n'a PAS communiqué son adresse : rue/code postal remplacés par « — » (ville + pays requis). JAMAIS inventer une adresse — la demander au client."},"create_client_if_missing":{"type":"boolean","description":"Si le client n'existe pas : le créer (sinon erreur explicite). Exige alors l'adresse ci-dessous."}},"additionalProperties":false},"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":923,"tokensAfter":923},{"name":"qonto_delete","fixed":{"name":"qonto_delete","description":"RÉSERVÉ AU STUDIO (token). Supprime un devis en attente (pending_approval) ou une facture brouillon (draft) — ex. doublon créé par erreur. Refuse tout document envoyé/approuvé/finalisé. Exige confirm=true (le premier appel sans confirm renvoie un récapitulatif).","inputSchema":{"type":"object","properties":{"id":{"type":"string"},"type":{"enum":["quote","invoice"],"type":"string","description":"Défaut : quote."},"number":{"type":"string","description":"Numéro du document (ou id Qonto)."},"confirm":{"type":"boolean","description":"true pour supprimer réellement."},"auth_token":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":187,"tokensAfter":187},{"name":"qonto_get","fixed":{"name":"qonto_get","description":"RÉSERVÉ AU STUDIO (token). Détail d'un devis ou d'une facture Qonto par numéro (D-2026-003, F-2026-001) ou id : lignes, client + adresse, statut, lien client/paiement, URL PDF signée (temporaire). Jamais de base64.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Id Qonto (alternative à number)."},"type":{"enum":["quote","invoice"],"type":"string","description":"Défaut : quote."},"number":{"type":"string","description":"Numéro du document (ou id Qonto)."},"auth_token":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":165,"tokensAfter":165},{"name":"qonto_list","fixed":{"name":"qonto_list","description":"RÉSERVÉ AU STUDIO (token). Liste compacte des devis, factures ou clients Qonto (numéro, statut, total, date, client, id). À appeler AVANT de relancer une création si un appel précédent a semblé échouer.","inputSchema":{"type":"object","properties":{"type":{"enum":["quotes","invoices","clients"],"type":"string","description":"Défaut : quotes."},"limit":{"type":"integer","description":"Max lignes (défaut 30, max 100)."},"status":{"type":"string","description":"Filtre statut : devis pending_approval|approved|canceled ; factures draft|unpaid|paid|canceled."},"auth_token":{"type":"string"},"client_email":{"type":"string","description":"Filtre par email client."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":204,"tokensAfter":204},{"name":"qonto_update_client","fixed":{"name":"qonto_update_client","description":"RÉSERVÉ AU STUDIO (token d'administration requis). Met à jour l'adresse de facturation d'un client Qonto existant. Identifier par client_id (préféré) OU client_email/client_name.","inputSchema":{"type":"object","required":["street_address","city","zip_code"],"properties":{"city":{"type":"string","description":"Ville."},"zip_code":{"type":"string","description":"Code postal."},"client_id":{"type":"string","description":"ID Qonto du client (préféré)."},"auth_token":{"type":"string","description":"Token d'administration."},"client_name":{"type":"string","description":"Fallback : recherche par nom."},"client_email":{"type":"string","description":"Fallback : recherche par email."},"country_code":{"type":"string","description":"Code pays ISO2 (défaut FR)."},"street_address":{"type":"string","description":"Rue et numéro."}},"additionalProperties":false},"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":252,"tokensAfter":252},{"name":"search","fixed":{"name":"search","description":"Recherche dans les contenus de MB Mastering (services de mastering, tarifs, studio, FAQ) et renvoie une liste de résultats avec id, titre, extrait et URL. / Searches MB Mastering content (mastering services, rates, studio info, FAQ) and returns matching results.","inputSchema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"Termes de recherche / search query."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":131,"tokensAfter":131},{"name":"send_quote_request","fixed":{"name":"send_quote_request","description":"Envoie une demande de devis de mastering à MB Mastering par email. À utiliser quand l'utilisateur souhaite être recontacté. Requiert au minimum le nombre de titres et l'email du demandeur.","inputSchema":{"type":"object","required":["requester_email","titles"],"properties":{"genre":{"type":"string","description":"Genre musical."},"notes":{"type":"string","description":"Précisions libres sur le projet."},"format":{"type":"string","description":"Support final visé (streaming, vinyle, CD…)."},"titles":{"type":"integer","minimum":1,"description":"Nombre de titres à masteriser."},"service":{"type":"string","description":"Service souhaité (mastering stéréo, stems, à distance, gravure vinyle…)."},"deadline":{"type":"string","description":"Échéance éventuelle."},"requester_name":{"type":"string","description":"Nom du demandeur ou du projet/artiste."},"requester_email":{"type":"string","description":"Email du demandeur (pour la réponse)."}},"additionalProperties":false},"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":284,"tokensAfter":284},{"name":"upload_master","fixed":{"name":"upload_master","description":"RÉSERVÉ AU STUDIO (token d'administration requis). Dépose un zip de master client dans ~/www/masters/ sur le serveur OVH. Nom conservé tel quel (contrôle total côté studio). Upload chunké (chunk_index=0 pour le premier, is_last=true pour le dernier — le tool renvoie alors l'URL client). Écriture UNIQUEMENT dans ~/www/masters/ (chemin hardcodé, sanitize strict, pas d'échappement possible).","inputSchema":{"type":"object","required":["filename","chunk_data"],"properties":{"is_last":{"type":"boolean","description":"true pour le dernier chunk → renvoie l'URL client finalisée."},"filename":{"type":"string","description":"Nom du fichier .zip (autorisé : lettres/chiffres/._- et espaces ; extension .zip obligatoire ; max 200 chars). Sanitize strict côté serveur."},"auth_token":{"type":"string","description":"Token d'administration (si le client MCP ne permet pas le header Authorization)."},"chunk_data":{"type":"string","description":"Contenu du chunk encodé en base64. Max ~8 Mo par chunk pour rester sous les limites HTTP OVH."},"chunk_index":{"type":"integer","description":"Index du chunk (0-based). 0 = truncate le fichier destination ; >0 = append."}},"additionalProperties":false},"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":343,"tokensAfter":343}],"toolsChanged":17,"tokensSaved":0,"todo":[{"tool":"imap_get_mail","params":["auth_token"]},{"tool":"imap_list_inbox","params":["auth_token"]},{"tool":"list_quote_requests","params":["auth_token"]},{"tool":"qonto_append_invoice_line","params":["quantity","client_id","auth_token","unit_price","client_name","client_email"]},{"tool":"qonto_create_quote","params":["auth_token"]},{"tool":"qonto_delete","params":["id","auth_token"]},{"tool":"qonto_finalize_invoice","params":["client_id","auth_token","invoice_id","client_name","client_email"]},{"tool":"qonto_get","params":["auth_token"]},{"tool":"qonto_list","params":["auth_token"]}],"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."}