Skip to main content
Glama

apply_batch

Destructive

Builds the schema IN BATCHES — the write tool suited to any broad request. ADDITIVE AT THE BLOCK LEVEL: the blocks of the previous batches are kept, a batch deletes none of them. ⚠️ BUT the content of a block DOES get REPLACED: supplying contentBlocks on an EXISTING block overwrites the ENTIRE list of its content blocks — those that do not appear in it are LOST. To add just one, the existing ones (get_cell_details) are sent back alongside the new one, or add_content_block adds a single content block. The content blocks actually removed are returned in removedContentBlocks. Each call creates a few blocks WITH their content (contentBlocks inline); the schema of a batch block carries no x/y, the layout is recomputed on the server. Batches follow one another in DEPENDENCY ORDER: a parent block must be created in a batch earlier than its children. SAME RULE FOR DEPENDENCIES AND ASSIGNMENTS: both ends (fromId/toId, personId/cellId) must ALREADY exist or be created in THIS batch — a reference to a block yet to come is NOT written, it is returned in skippedRefs, to re-emit once the target is created. A batch = a step visible to the user, hence a meaningful batchTitle, in the user's language. The response carries contentBudget ONLY for the cards of the batch that have no margin left (used ≥ 12 entries): field absent = no card of the batch is at the limit, which does not mean "I did not look". The exact margin of a given card is read in contentBudget of get_cell_details.

Input Schema

NameRequiredDescriptionDefault
cellsNoBlocks to create or update, WITH their contentBlocks. Maximum 12 per batch.
peopleNoPeople to create or update. Maximum 20 per batch.
batchTitleYesShort title of the batch, in the user's language, shown to the user (e.g. 'Group entities', 'Team and roles')
assignmentsNoPerson ↔ block assignments. Maximum 40 per batch.
dependenciesNoDependencies between blocks. Maximum 30 per batch.
expectedProjectIdNoUUID of the project targeted by THIS call. ACTUALLY targets this project instead of the session project. Refused without changing anything if access is not granted.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed94 schema fields changed
    • changedInput schema / properties / assignments / description
      Previous value: -"Affectations personne ↔ bloc. Maximum 40 par lot."New value: +"Person ↔ block assignments. Maximum 40 per batch."
    • changedInput schema / properties / assignments / items / properties / shares / description
      Previous value: -"Pourcentage de participation au capital (0-100). Champ omis quand la part n'est pas connue : aucune part n'est alors déclarée, ce qui est différent de 100"New value: +"Percentage of the capital held (0-100). Omitted when the share is not known: no share is then declared, which is different from 100"
    • changedInput schema / properties / batchTitle / description
      Previous value: -"Titre court du lot, en français, affiché à l'utilisateur (ex: 'Entités du groupe', 'Équipe et rôles')"New value: +"Short title of the batch, in the user's language, shown to the user (e.g. 'Group entities', 'Team and roles')"
    • changedInput schema / properties / cells / description
      Previous value: -"Blocs à créer ou mettre à jour, AVEC leurs contentBlocks. Maximum 12 par lot."New value: +"Blocks to create or update, WITH their contentBlocks. Maximum 12 per batch."
    • changedInput schema / properties / cells / items / properties / colorKey / description
      Previous value: -"Couleur du bloc. Omise, le bloc prend la couleur par défaut du type — c’est presque toujours le bon choix."New value: +"Block color. When omitted, the block takes the default color of its type — almost always the right choice."
    • changedInput schema / properties / cells / items / properties / confirmRootPlacement / description
      Previous value: -"⚠️ Requis (true) UNIQUEMENT si le projet a verrouillé son placement racine (Réglages) ET que ce bloc devient racine (parentId absent/null) sans l'être déjà : sans lui, le LOT ENTIER est refusé. Sans objet si le placement racine n'est pas verrouillé."New value: +"⚠️ Required (true) ONLY if the project has locked its root placement (Settings) AND this block becomes a root (parentId absent/null) without already being one: without it, the ENTIRE BATCH is refused. Irrelevant if root placement is not locked."
    • changedInput schema / properties / cells / items / properties / contentBlocks / description
      Previous value: -"Contenu riche du bloc. C'est ICI que va le détail — jamais dans desc. ⚠️ REMPLACE la liste ENTIÈRE des blocs de contenu de la cellule (ce n'est PAS un ajout incrémental, contrairement à kindMetadata qui, lui, fusionne) : sur une cellule qui en porte déjà, tout bloc absent de ce tableau est SUPPRIMÉ. Les blocs existants se lisent avec get_cell_details et se renvoient à côté du nouveau, ou add_content_block en ajoute un seul. Le champ omis ne touche à aucun contenu."New value: +"Rich content of the block. The detail lives HERE, not in desc. ⚠️ REPLACES the ENTIRE list of content blocks of the block (it is NOT an incremental addition, unlike kindMetadata which merges): on a block that already carries some, any content block absent from this array is DELETED. Existing content blocks are read with get_cell_details and sent back alongside the new one, or add_content_block adds just one. The omitted field touches no content."
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / description
      Previous value: -"Pour type='list' | 'actions' | 'links'"New value: +"For type='list' | 'actions' | 'links'"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / assignee / description
      Previous value: -"Personne responsable de l'entrée (nom libre ou ID de personne) — affiché en chip @nom"New value: +"Person responsible for the entry (free-form name or person ID) — shown as an @name chip"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / badge / description
      Previous value: -"Badge affiché (ex: 'Core', 'Roadmap', 'Envisagé')"New value: +"Displayed badge (e.g. 'Core', 'Roadmap', 'Considered')"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / badgeType / description
      Previous value: -"Style du badge: 'pending'=jaune, 'future'=violet, 'ref'=gris, 'active'=vert"New value: +"Badge style: 'pending'=yellow, 'future'=purple, 'ref'=gray, 'active'=green"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / colorKey / description
      Previous value: -"Couleur spécifique de cette entrée"New value: +"Specific color of this entry"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / complexity / description
      Previous value: -"Chip xs…xl d'une entrée. Ordre de grandeur RELATIF en TEMPS HUMAIN : xs = moins d’une heure · s = quelques heures · m = une demi-journée à un jour · l = quelques jours · xl = à DÉCOUPER. Elle s’estime AVANT la prise du travail ; c’est une estimation, jamais une promesse. Sans valeur = non estimée."New value: +"Chip xs…xl of an entry. RELATIVE order of magnitude in HUMAN TIME: xs = under an hour · s = a few hours · m = half a day to a day · l = a few days · xl = to SPLIT. It is estimated ahead of the pick-up of the work; it is an estimate, not a promise. No value = not estimated."
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / createdAt / description
      Previous value: -"Horodatage de création (ISO 8601), posé PAR LE SERVEUR — toute valeur fournie est ignorée et re-dérivée : une entrée dont le texte existe déjà dans le bloc garde sa date d'origine, une entrée nouvelle est datée de maintenant. La renvoyer telle quelle est inoffensif"New value: +"Creation timestamp (ISO 8601), set BY THE SERVER — any supplied value is ignored and re-derived: an entry whose text already exists in the block keeps its original date, a new entry is dated now. Sending it back as is is harmless"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / done / description
      Previous value: -"Pour type='actions': action terminée (case cochée + texte barré)"New value: +"For type='actions': action completed (box checked + struck-through text)"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / due / description
      Previous value: -"Échéance libre ('mi-juillet', '2026-07-15') — affichée en chip 📅"New value: +"Free-form due date ('mid-July', '2026-07-15') — shown as a 📅 chip"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / labels / description
      Previous value: -"Étiquettes libres de l'utilisateur (pastilles colorées). Distinct de `badge`, qui est unique"New value: +"Free-form labels of the user (colored chips). Distinct from `badge`, which is unique"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / priority / description
      Previous value: -"Priorité fixe 4 niveaux (chip ‼/↑/↓, 'normal' = aucun chip)"New value: +"Fixed 4-level priority (chip ‼/↑/↓, 'normal' = no chip)"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / rank / description
      Previous value: -"Clé de tri MANUELLE du backlog (flottant, inséré entre deux voisins). Composée par l'utilisateur — elle se renvoie telle quelle, sans arrondi ni réinvention"New value: +"MANUAL sort key of the backlog (float, inserted between two neighbors). Composed by the user — it is sent back as is, with no rounding or reinvention"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / status / description
      Previous value: -"Pour type='actions': état de l'action (chip coloré: todo=gris, doing=jaune, done=vert, blocked=rouge)"New value: +"For type='actions': state of the action (colored chip: todo=gray, doing=yellow, done=green, blocked=red)"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / text / description
      Previous value: -"Texte de l'entrée"New value: +"Entry text"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / url / description
      Previous value: -"Pour type='links' (ou toute entrée): rend le texte cliquable vers cette URL"New value: +"For type='links' (or any entry): makes the text a clickable link to this URL"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / id / description
      Previous value: -"ID unique du bloc de contenu"New value: +"Unique content block ID"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / note / description
      Previous value: -"Note sous le bloc (italique, atténuée)"New value: +"Note under the block (italic, muted)"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / text / description
      Previous value: -"Pour type='text' (supporte \\n)"New value: +"For type='text' (supports \\n)"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / title / description
      Previous value: -"Titre du bloc (affiché en majuscules)"New value: +"Block title (displayed in capitals)"
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / type / description
      Previous value: -"'list' = liste à puces · 'text' = texte libre · 'actions' = checklist · 'links' = liens cliquables"New value: +"'list' = bulleted list · 'text' = free text · 'actions' = checklist · 'links' = clickable links"
    • changedInput schema / properties / cells / items / properties / desc / description
      Previous value: -"Résumé D'UNE LIGNE. Le détail va dans contentBlocks."New value: +"ONE-LINE summary. The detail goes in contentBlocks."
    • changedInput schema / properties / cells / items / properties / displayMode / description
      Previous value: -"Comment le bloc traite ses enfants. \"container\" : il les ENGLOBE (ils sont dessinés DANS sa carte, en coordonnées RELATIVES). \"hat\" : il reste un chapeau au-dessus d'eux, qui s'affichent à côté en coordonnées absolues. ⚠️ OMIS, le comportement dépend du TYPE : groupe/filiale/sous-filiale/container englobent, tous les autres NON. Sur une transversale, une verticale, un externe, un node ou une infrastructure qui doit contenir ses enfants, ce champ est donc OBLIGATOIRE — sinon la hiérarchie sera juste en base mais fausse à l'écran."New value: +"How the block treats its children. \"container\": it ENCLOSES them (they are drawn INSIDE its card, in RELATIVE coordinates). \"hat\": it stays a hat above them, and they are shown beside it in absolute coordinates. ⚠️ When OMITTED, the behavior depends on the TYPE: groupe/filiale/sous-filiale/container enclose, all the others do NOT. On a transversale, a verticale, an externe, a node or an infrastructure that must contain its children, this field is therefore REQUIRED — otherwise the hierarchy will be right in the database but wrong on screen."
    • changedInput schema / properties / cells / items / properties / id / description
      Previous value: -"ID unique kebab-case (ex: 'data-lab')"New value: +"Unique kebab-case ID (e.g. 'data-lab')"
    • changedInput schema / properties / cells / items / properties / kind / description
      Previous value: -"Type de DIAGRAMME du bloc (défaut: 'org'). Pour un composant d'architecture : 'arch'."New value: +"DIAGRAM kind of the block (default: 'org'). For an architecture component: 'arch'."
    • changedInput schema / properties / cells / items / properties / kindMetadata / description
      Previous value: -"Métadonnées propres au kind du bloc (arch : archType, technology, trustBoundary, cost… · org : jurisdiction, legalForm…). FUSIONNÉES avec celles déjà en place, comme update_kind_metadata : n'envoie QUE les champs qui changent, les autres restent — inutile de relire le bloc ni de tout renvoyer. Validées APRÈS fusion, donc un champ obligatoire déjà stocké n'a pas à être répété ; une valeur invalide REFUSE le lot ENTIER en nommant le bloc et le champ. Un champ se VIDE par update_kind_metadata (clear)."New value: +"Metadata specific to the kind of the block (arch: archType, technology, trustBoundary, cost… · org: jurisdiction, legalForm…). MERGED with those already in place, like update_kind_metadata: send ONLY the fields that change, the others stay — no need to re-read the block nor to resend everything. Validated AFTER the merge, so a required field already stored does not have to be repeated; an invalid value REFUSES the ENTIRE batch, naming the block and the field. A field is CLEARED through update_kind_metadata (clear)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / actor / description
      Previous value: -"Acteur/rôle exécutant cette tâche précise, si différent de l'acteur par défaut de la lane."New value: +"Actor/role performing this specific task, if different from the lane's default actor."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / amountRaised / description
      Previous value: -"Montant total levé lors de ce round."New value: +"Total amount raised in this round."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / archType / description
      Previous value: -"Nature du composant d'architecture — détermine l'icône et la couleur par défaut du nœud. 'service' = appli/API, 'datastore' = DB/storage, 'queue' = message broker, 'gateway' = API gateway/LB, 'external' = dépendance tierce hors du périmètre, 'lambda' = fonction serverless, 'batch' = job/cron, 'network' = VPC/subnet/segment réseau, 'cdn' = edge/CDN, 'cache' = cache mémoire (Redis, Memcached...)."New value: +"Nature of the architecture component — determines the node's default icon and color. 'service' = app/API, 'datastore' = DB/storage, 'queue' = message broker, 'gateway' = API gateway/LB, 'external' = third-party dependency outside the perimeter, 'lambda' = serverless function, 'batch' = job/cron, 'network' = VPC/subnet/network segment, 'cdn' = edge/CDN, 'cache' = in-memory cache (Redis, Memcached...)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / capacity / description
      Previous value: -"Dimensionnement libre (ex: '4 vCPU / 8GB', 'db.r6g.large', 'auto-scale 2-10 pods')."New value: +"Free-form sizing (e.g. '4 vCPU / 8GB', 'db.r6g.large', 'auto-scale 2-10 pods')."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / captableType / description
      Previous value: -"Discriminant fixe — identifie cette cellule comme un actionnaire/détenteur de titres (par opposition à un round)."New value: +"Fixed discriminant — identifies this block as a shareholder/holder of securities (as opposed to a round)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / channel / description
      Previous value: -"Canal principal via lequel cette interaction a lieu."New value: +"Main channel through which this interaction takes place."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / channels / description
      Previous value: -"Canaux multiples si le touchpoint est multi-canal (channel seul suffit pour un canal unique)."New value: +"Multiple channels if the touchpoint is multi-channel (channel alone is enough for a single channel)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / cloudProvider / description
      Previous value: -"Fournisseur cloud hébergeant ce composant."New value: +"Cloud provider hosting this component."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / collapsed / description
      Previous value: -"true pour replier visuellement un subprocess (masque ses enfants sur le canvas)."New value: +"true to visually collapse a subprocess (hides its children on the canvas)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / complianceTags / description
      Previous value: -"Tags réglementaires applicables à cette étape (ex: 'gdpr', 'sox', 'pci', 'hipaa', 'kyc', 'aml', 'iso27001', 'four-eyes')."New value: +"Regulatory tags that apply to this step (e.g. 'gdpr', 'sox', 'pci', 'hipaa', 'kyc', 'aml', 'iso27001', 'four-eyes')."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / cost / description
      Previous value: -"Coût mensuel estimé — affiché sur le nœud si présent."New value: +"Estimated monthly cost — shown on the node when present."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / dataClassification / description
      Previous value: -"Sensibilité des données traitées/stockées par ce composant : 'public' | 'internal' | 'confidential' | 'pii' | 'secret'. Utilisée pour mettre en évidence les composants à surveiller (ex: tout ce qui touche 'pii')."New value: +"Sensitivity of the data processed/stored by this component: 'public' | 'internal' | 'confidential' | 'pii' | 'secret'. Used to highlight the components to watch (e.g. anything that touches 'pii')."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / date / description
      Previous value: -"Date de closing du round (YYYY-MM-DD)."New value: +"Closing date of the round (YYYY-MM-DD)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / duration / description
      Previous value: -"Durée de traitement typique de cette étape."New value: +"Typical processing time of this step."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / emotion / description
      Previous value: -"Score émotionnel du client à cette étape, de -2 (très négatif/frustration) à +2 (très positif/enchantement), 0 = neutre. N'est PAS rendu comme courbe sur le canvas automatiquement (voir compute_emotion_curve pour l'agréger) — un score ≤ -1 signale typiquement un point de friction à documenter via une cellule 'pain' associée."New value: +"Customer emotional score at this step, from -2 (very negative/frustration) to +2 (very positive/delight), 0 = neutral. Is NOT automatically rendered as a curve on the canvas (see compute_emotion_curve to aggregate it) — a score ≤ -1 typically signals a pain point to document via an associated 'pain' block."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / esopRefreshPct / description
      Previous value: -"% de refresh du pool ESOP effectué à l'occasion de ce round."New value: +"% of ESOP pool refresh carried out on the occasion of this round."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / executionPct / description
      Previous value: -"% des instances du process qui passent réellement par cette étape (100 = chemin toujours emprunté)."New value: +"% of the process instances that actually go through this step (100 = path always taken)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / holderType / description
      Previous value: -"Catégorie de détenteur : 'founder' (co-fondateur), 'employee' (salarié avec BSPCE/options), 'investor' (VC/business angel), 'pool' (réserve ESOP non-allouée), 'entity' (personne morale, holding, SPV)."New value: +"Category of holder: 'founder' (co-founder), 'employee' (employee with BSPCE/options), 'investor' (VC/business angel), 'pool' (unallocated ESOP reserve), 'entity' (legal entity, holding, SPV)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / isBottleneck / description
      Previous value: -"true pour marquer visuellement cette étape comme goulot d’étranglement identifié (durée/SLA problématique)."New value: +"true to visually mark this step as an identified bottleneck (problematic duration/SLA)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / isConcentrated / description
      Previous value: -"true pour marquer ce holder comme signal de concentration (utilisé par validate_captable)."New value: +"true to mark this holder as a concentration signal (used by validate_captable)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / isMomentOfTruth / description
      Previous value: -"true pour marquer un instant décisif qui influence fortement la perception globale du client (mis en évidence visuellement)."New value: +"true to mark a decisive moment that strongly influences the customer's overall perception (visually highlighted)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / journeyType / description
      Previous value: -"Rôle de la cellule dans la carte de parcours : 'phase' (grande étape, colonne d'en-tête), 'step' (action concrète de l'utilisateur), 'touchpoint' (point de contact avec un canal/produit), 'pain' (point de friction/irritant), 'opportunity' (piste d'amélioration identifiée), 'headline' (bloc de titre/contexte libre)."New value: +"Role of the block in the journey map: 'phase' (major stage, header column), 'step' (concrete user action), 'touchpoint' (point of contact with a channel/product), 'pain' (pain point/irritant), 'opportunity' (identified improvement lead), 'headline' (free title/context block)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / laneId / description
      Previous value: -"ID de la lane parente (cellule processType='lane') à laquelle rattacher cette task/event — kebab-case, comme retourné par add_swimlane (ex: 'lane-sales')."New value: +"ID of the parent lane (block with processType='lane') to attach this task/event to — kebab-case, as returned by add_swimlane (e.g. 'lane-sales')."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / liquidationPreference / description
      Previous value: -"Préférence de liquidation applicable (typique pour preferred)."New value: +"Liquidation preference that applies (typical for preferred)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / metrics / description
      Previous value: -"Indicateurs chiffrés rattachés à cette étape (NPS, taux, durée...)."New value: +"Figures attached to this step (NPS, rates, duration...)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / name / description
      Previous value: -"Nom du round (ex: 'Seed', 'Series A', 'Bridge')."New value: +"Name of the round (e.g. 'Seed', 'Series A', 'Bridge')."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / orderInPhase / description
      Previous value: -"Ordre horizontal au sein de la phase (0 = en premier). Absent = append à droite."New value: +"Horizontal order within the phase (0 = first). Absent = appended on the right."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / phaseId / description
      Previous value: -"ID de la phase parente (cellule journeyType='phase', créée via add_journey_phase) — positionne la cellule dans la bonne colonne."New value: +"ID of the parent phase (block with journeyType='phase', created via add_journey_phase) — places the block in the right column."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / preMoneyValuation / description
      Previous value: -"Valorisation pré-money du round, en monnaie du projet."New value: +"Pre-money valuation of the round, in the project currency."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / pricePerShare / description
      Previous value: -"Prix payé par action lors de l'émission — absent pour un SAFE non converti."New value: +"Price paid per share at issuance — absent for an unconverted SAFE."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / processType / description
      Previous value: -"Rôle BPMN-lite de la cellule — détermine sa forme sur le canvas : 'task' (rectangle), 'event-start'/'event-end' (cercle début/fin), 'event-intermediate-timer'/'event-intermediate-error' (cercle intermédiaire), 'gateway-xor'/'gateway-and'/'gateway-or' (losange de décision), 'subprocess' (rectangle double-bordure), 'lane' (couloir — normalement créé via add_swimlane, pas via add_kind_node directement)."New value: +"BPMN-lite role of the block — determines its shape on the canvas: 'task' (rectangle), 'event-start'/'event-end' (start/end circle), 'event-intermediate-timer'/'event-intermediate-error' (intermediate circle), 'gateway-xor'/'gateway-and'/'gateway-or' (decision diamond), 'subprocess' (double-bordered rectangle), 'lane' (swimlane — normally created via add_swimlane, not directly via add_kind_node)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / providerLogo / description
      Previous value: -"Logo de service tiers à afficher sur le nœud (ex: 'aws', 'stripe', 'supabase') — purement visuel, indépendant de cloudProvider."New value: +"Third-party service logo to show on the node (e.g. 'aws', 'stripe', 'supabase') — purely visual, independent of cloudProvider."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / publicAccess / description
      Previous value: -"true si le composant est exposé publiquement sur internet (pas seulement en interne)."New value: +"true if the component is publicly exposed on the internet (not just internally)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / quote / description
      Previous value: -"Verbatim client illustrant ce point du parcours."New value: +"Customer verbatim illustrating this point of the journey."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / region / description
      Previous value: -"Région d'hébergement (ex: 'eu-west-3', 'cdg1')."New value: +"Hosting region (e.g. 'eu-west-3', 'cdg1')."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / riskTags / description
      Previous value: -"Signaux de risque associés à ce round : 'down-round', 'concentration', 'underwater-options', 'anti-dilution'."New value: +"Risk signals associated with this round: 'down-round', 'concentration', 'underwater-options', 'anti-dilution'."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / safeTerms / description
      Previous value: -"Termes du SAFE — requis si securityType='safe', ignoré sinon."New value: +"Terms of the SAFE — required if securityType='safe', ignored otherwise."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / securityRound / description
      Previous value: -"ID du round (cellule captableType='round') dans lequel ce titre a été émis — absent = émission fondatrice (t=0). UUID ou kebab-case, comme le reste des ids de cellule."New value: +"ID of the round (block with captableType='round') in which this security was issued — absent = founding issuance (t=0). UUID or kebab-case, like the rest of the block ids."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / securityType / description
      Previous value: -"Type de titre détenu : 'common' (actions ordinaires, typiquement fondateurs), 'preferred' (actions de préférence, typiquement investisseurs priced round), 'safe' (SAFE non converti — voir safeTerms), 'convertible' (obligation convertible), 'option' (stock-options/BSPCE non exercées)."New value: +"Type of security held: 'common' (common stock, typically founders), 'preferred' (preferred stock, typically priced-round investors), 'safe' (unconverted SAFE — see safeTerms), 'convertible' (convertible note), 'option' (unexercised stock options/BSPCE)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / severity / description
      Previous value: -"Gravité d'un pain point ou priorité d'une opportunity."New value: +"Severity of a pain point or priority of an opportunity."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / shares / description
      Previous value: -"Nombre de parts/actions détenues (entier ou décimal selon la granularité du cap table)."New value: +"Number of shares held (integer or decimal depending on the granularity of the cap table)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / sla / description
      Previous value: -"Délai maximum contractuel/cible pour cette étape (comparé à duration pour détecter les dépassements)."New value: +"Maximum contractual/target delay for this step (compared with duration to detect overruns)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / slo / description
      Previous value: -"Objectifs de niveau de service (latence, disponibilité)."New value: +"Service-level objectives (latency, availability)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / swimlane / description
      Previous value: -"Couloir horizontal (modèle service blueprint) : 'customer' (actions visibles du client), 'frontstage' (interactions client-visibles côté entreprise), 'backstage' (opérations internes invisibles du client), 'support' (systèmes/process support)."New value: +"Horizontal lane (service blueprint model): 'customer' (actions visible to the customer), 'frontstage' (customer-visible interactions on the company side), 'backstage' (internal operations invisible to the customer), 'support' (support systems/processes)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / swimlaneOrder / description
      Previous value: -"Ordre vertical au sein de la lane (rarement utilisé — à défaut, l’ordre des lanes suit `order`, puis l’id)."New value: +"Vertical order within the lane (rarely used — otherwise the order of the lanes follows `order`, then the id)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / taskType / description
      Previous value: -"Type d'exécutant pour une task : 'user' (humain via UI), 'service' (système/API), 'manual' (humain hors-système, ex: papier), 'script' (automatisation batch)."New value: +"Type of performer for a task: 'user' (human via the UI), 'service' (system/API), 'manual' (human outside the system, e.g. paper), 'script' (batch automation)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / technology / description
      Previous value: -"Techno/framework concret (ex: 'Node.js 22', 'Amazon Aurora PostgreSQL 15.4 Serverless v2')."New value: +"Concrete technology/framework (e.g. 'Node.js 22', 'Amazon Aurora PostgreSQL 15.4 Serverless v2')."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / termSheetNote / description
      Previous value: -"Note libre sur les conditions négociées (clauses particulières, board seat, pro-rata rights...)."New value: +"Free-form note on the negotiated terms (special clauses, board seat, pro-rata rights...)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / trustBoundary / description
      Previous value: -"Nom de la zone de confiance/périmètre de sécurité (ex: 'DMZ', 'VPC privé', 'zone PCI') — les composants partageant le même trustBoundary sont visuellement groupables."New value: +"Name of the trust zone/security perimeter (e.g. 'DMZ', 'private VPC', 'PCI zone') — components sharing the same trustBoundary can be grouped visually."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / vestingSchedule / description
      Previous value: -"Calendrier de vesting applicable à ces parts (typique pour founder/employee)."New value: +"Vesting schedule that applies to these shares (typical for founder/employee)."
    • changedInput schema / properties / cells / items / properties / layoutHint / description
      Previous value: -"Indice de placement, OPTIONNEL — DÉRIVÉ du type à la création (verticale/transversale/groupe/externe/infrastructure ont déjà un défaut, comme colorKey). 'column-side' force la colonne latérale, 'bottom-center' force la bande du bas. Omis, le défaut du type s'applique ; la valeur ne sert qu'à forcer un placement différent."New value: +"Placement hint, OPTIONAL — DERIVED from the type at creation (verticale/transversale/groupe/externe/infrastructure already have a default, like colorKey). 'column-side' forces the side column, 'bottom-center' forces the bottom band. When omitted, the default of the type applies; the value only serves to force a different placement."
    • changedInput schema / properties / cells / items / properties / name / description
      Previous value: -"Nom affiché du bloc. REQUIS pour CRÉER un bloc (id absent du projet) — sinon le LOT ENTIER est refusé. Omis sur un bloc EXISTANT, le nom reste inchangé."New value: +"Displayed name of the block. REQUIRED to CREATE a block (id absent from the project) — otherwise the ENTIRE BATCH is refused. Omitted on an EXISTING block, the name stays unchanged."
    • changedInput schema / properties / cells / items / properties / note / description
      Previous value: -"Note interne (panneau, non affichée sur la carte)"New value: +"Internal note (panel, not shown on the card)"
    • changedInput schema / properties / cells / items / properties / parentId / description
      Previous value: -"ID du bloc parent. Le parent doit exister ou naître dans un lot ANTÉRIEUR. ⚠️ Déclarer un parent ne suffit PAS à ce que les enfants soient DESSINÉS DEDANS : seuls les types groupe/filiale/sous-filiale/container englobent par défaut. Sur tout autre type (transversale, verticale, externe, node, infrastructure), les enfants s'affichent À CÔTÉ de la carte parente, reliés par une flèche ; displayMode:\"container\" sur le parent les fait dessiner DEDANS."New value: +"ID of the parent block. The parent must exist or be born in an EARLIER batch. ⚠️ Declaring a parent is NOT enough for the children to be DRAWN INSIDE it: only the types groupe/filiale/sous-filiale/container enclose by default. On any other type (transversale, verticale, externe, node, infrastructure), the children are shown NEXT TO the parent card, linked by an arrow; displayMode:\"container\" on the parent makes them draw INSIDE."
    • changedInput schema / properties / cells / items / properties / type / description
      Previous value: -"Type de cellule. REQUIS pour CRÉER un bloc (id absent du projet) — sinon le LOT ENTIER est refusé. Omis sur un bloc EXISTANT, le type reste inchangé. ⚠️ Faire passer un bloc EXISTANT typé (filiale, externe…) en 'container' (« pôle ») lui FAIT PERDRE ses parts de capital — les personnes restent affectées (le lot le signale dans warning) : pour qu'il contienne ses enfants, displayMode:'container' sur son type d'origine suffit."New value: +"Block type. REQUIRED to CREATE a block (id absent from the project) — otherwise the ENTIRE BATCH is refused. Omitted on an EXISTING block, the type stays unchanged. ⚠️ Changing an EXISTING typed block (filiale, externe…) to 'container' (a division) MAKES IT LOSE its capital shares — the people stay assigned (the batch flags it in warning): for it to contain its children, displayMode:'container' on its original type is enough."
    • changedInput schema / properties / dependencies / description
      Previous value: -"Liens entre blocs. Maximum 30 par lot."New value: +"Dependencies between blocks. Maximum 30 per batch."
    • changedInput schema / properties / dependencies / items / properties / id / description
      Previous value: -"ID unique (ex: 'dep-a-b')"New value: +"Unique ID (e.g. 'dep-a-b')"
    • changedInput schema / properties / expectedProjectId / description
      Previous value: -"UUID du projet visé par CET appel. Cible RÉELLEMENT ce projet au lieu du projet de session. Refusé sans rien modifier si l'accès n'est pas accordé."New value: +"UUID of the project targeted by THIS call. ACTUALLY targets this project instead of the session project. Refused without changing anything if access is not granted."
    • changedInput schema / properties / people / description
      Previous value: -"Personnes à créer ou mettre à jour. Maximum 20 par lot."New value: +"People to create or update. Maximum 20 per batch."
    • changedInput schema / properties / people / items / properties / id / description
      Previous value: -"ID unique kebab-case"New value: +"Unique kebab-case ID"
    • changedInput schema / properties / people / items / properties / initials / description
      Previous value: -"2 lettres majuscules. Champ omis : elles sont dérivées du nom (première lettre du premier mot + du dernier), comme partout ailleurs dans le produit."New value: +"2 capital letters. When omitted: derived from the name (first letter of the first word + of the last), as everywhere else in the product."
    • changedInput schema / properties / people / items / properties / tags / description
      Previous value: -"Étiquettes de la personne. REMPLACE la liste entière (pas un ajout) — un tag absent de ce tableau est retiré. Champ omis : les étiquettes ne changent pas."New value: +"Labels of the person. REPLACES the entire list (not an addition) — a tag absent from this array is removed. When omitted: the labels do not change."
  2. Changed14 schema fields changed
    • changedInput schema / properties / assignments / items / properties / shares / description
      Previous value: -"Pourcentage de participation au capital (0-100). OMETS ce champ si la part n'est pas connue — aucune part n'est alors déclarée, ce qui est différent de 100"New value: +"Pourcentage de participation au capital (0-100). Champ omis quand la part n'est pas connue : aucune part n'est alors déclarée, ce qui est différent de 100"
    • changedInput schema / properties / cells / items / properties / colorKey / description
      Previous value: -"Couleur du bloc. OMETS ce champ pour prendre la couleur par défaut du type — c’est presque toujours le bon choix."New value: +"Couleur du bloc. Omise, le bloc prend la couleur par défaut du type — c’est presque toujours le bon choix."
    • changedInput schema / properties / cells / items / properties / contentBlocks / description
      Previous value: -"Contenu riche du bloc. C'est ICI que va le détail — jamais dans desc. ⚠️ REMPLACE la liste ENTIÈRE des blocs de contenu de la cellule (ce n'est PAS un ajout incrémental, contrairement à kindMetadata qui, lui, fusionne) : sur une cellule qui en porte déjà, tout bloc que tu ne remets pas dans ce tableau est SUPPRIMÉ. Relis-les avec get_cell_details et renvoie-les à côté du nouveau, ou utilise add_content_block pour n'en ajouter qu'un. Omets le champ pour ne toucher à aucun contenu."New value: +"Contenu riche du bloc. C'est ICI que va le détail — jamais dans desc. ⚠️ REMPLACE la liste ENTIÈRE des blocs de contenu de la cellule (ce n'est PAS un ajout incrémental, contrairement à kindMetadata qui, lui, fusionne) : sur une cellule qui en porte déjà, tout bloc absent de ce tableau est SUPPRIMÉ. Les blocs existants se lisent avec get_cell_details et se renvoient à côté du nouveau, ou add_content_block en ajoute un seul. Le champ omis ne touche à aucun contenu."
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / complexity / description
      Previous value: -"Chip xs…xl d'une entrée. Ordre de grandeur RELATIF en TEMPS HUMAIN : xs = moins d’une heure · s = quelques heures · m = une demi-journée à un jour · l = quelques jours · xl = à DÉCOUPER. Pose-la AVANT la prise du travail ; c’est une estimation, jamais une promesse. Sans valeur = non estimée."New value: +"Chip xs…xl d'une entrée. Ordre de grandeur RELATIF en TEMPS HUMAIN : xs = moins d’une heure · s = quelques heures · m = une demi-journée à un jour · l = quelques jours · xl = à DÉCOUPER. Elle s’estime AVANT la prise du travail ; c’est une estimation, jamais une promesse. Sans valeur = non estimée."
    • changedInput schema / properties / cells / items / properties / contentBlocks / items / properties / entries / items / properties / rank / description
      Previous value: -"Clé de tri MANUELLE du backlog (flottant, inséré entre deux voisins). Composée par l'utilisateur — la renvoyer telle quelle, ne jamais l'arrondir ni la réinventer"New value: +"Clé de tri MANUELLE du backlog (flottant, inséré entre deux voisins). Composée par l'utilisateur — elle se renvoie telle quelle, sans arrondi ni réinvention"
    • changedInput schema / properties / cells / items / properties / kindMetadata / description
      Previous value: -"Métadonnées propres au kind du bloc (arch : archType, technology, trustBoundary, cost… · org : jurisdiction, legalForm…). FUSIONNÉES avec celles déjà en place, comme update_kind_metadata : n'envoie QUE les champs qui changent, les autres restent — inutile de relire le bloc ni de tout renvoyer. Validées APRÈS fusion, donc un champ obligatoire déjà stocké n'a pas à être répété ; une valeur invalide REFUSE le lot ENTIER en nommant le bloc et le champ. Pour VIDER un champ, passe par update_kind_metadata (clear)."New value: +"Métadonnées propres au kind du bloc (arch : archType, technology, trustBoundary, cost… · org : jurisdiction, legalForm…). FUSIONNÉES avec celles déjà en place, comme update_kind_metadata : n'envoie QUE les champs qui changent, les autres restent — inutile de relire le bloc ni de tout renvoyer. Validées APRÈS fusion, donc un champ obligatoire déjà stocké n'a pas à être répété ; une valeur invalide REFUSE le lot ENTIER en nommant le bloc et le champ. Un champ se VIDE par update_kind_metadata (clear)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / channels / description
      Previous value: -"Canaux multiples si le touchpoint est multi-canal (préférer channel seul si un canal unique suffit)."New value: +"Canaux multiples si le touchpoint est multi-canal (channel seul suffit pour un canal unique)."
    • changedInput schema / properties / cells / items / properties / kindMetadata / properties / swimlaneOrder / description
      Previous value: -"Ordre vertical au sein de la lane (rarement utilisé — préférer order via auto_layout_process)."New value: +"Ordre vertical au sein de la lane (rarement utilisé — à défaut, l’ordre des lanes suit `order`, puis l’id)."
    • changedInput schema / properties / cells / items / properties / layoutHint / description
      Previous value: -"Indice de placement, OPTIONNEL — DÉRIVÉ du type à la création (verticale/transversale/groupe/externe/infrastructure ont déjà un défaut, comme colorKey). 'column-side' force la colonne latérale, 'bottom-center' force la bande du bas. Omets-le sauf besoin explicite de forcer un placement différent du défaut du type."New value: +"Indice de placement, OPTIONNEL — DÉRIVÉ du type à la création (verticale/transversale/groupe/externe/infrastructure ont déjà un défaut, comme colorKey). 'column-side' force la colonne latérale, 'bottom-center' force la bande du bas. Omis, le défaut du type s'applique ; la valeur ne sert qu'à forcer un placement différent."
    • changedInput schema / properties / cells / items / properties / name / description
      Previous value: -"Nom affiché du bloc. REQUIS pour CRÉER un bloc (id absent du projet) — sinon le LOT ENTIER est refusé. OMETS-le pour mettre à jour un bloc EXISTANT sans toucher son nom."New value: +"Nom affiché du bloc. REQUIS pour CRÉER un bloc (id absent du projet) — sinon le LOT ENTIER est refusé. Omis sur un bloc EXISTANT, le nom reste inchangé."
    • changedInput schema / properties / cells / items / properties / parentId / description
      Previous value: -"ID du bloc parent. Le parent doit exister ou naître dans un lot ANTÉRIEUR. ⚠️ Déclarer un parent ne suffit PAS à ce que les enfants soient DESSINÉS DEDANS : seuls les types groupe/filiale/sous-filiale/container englobent par défaut. Sur tout autre type (transversale, verticale, externe, node, infrastructure), les enfants s'affichent À CÔTÉ de la carte parente, reliés par une flèche — pose displayMode:\"container\" sur le parent si tu veux qu'il les contienne."New value: +"ID du bloc parent. Le parent doit exister ou naître dans un lot ANTÉRIEUR. ⚠️ Déclarer un parent ne suffit PAS à ce que les enfants soient DESSINÉS DEDANS : seuls les types groupe/filiale/sous-filiale/container englobent par défaut. Sur tout autre type (transversale, verticale, externe, node, infrastructure), les enfants s'affichent À CÔTÉ de la carte parente, reliés par une flèche ; displayMode:\"container\" sur le parent les fait dessiner DEDANS."
    • changedInput schema / properties / cells / items / properties / type / description
      Previous value: -"Type de cellule. REQUIS pour CRÉER un bloc (id absent du projet) — sinon le LOT ENTIER est refusé. OMETS-le pour mettre à jour un bloc EXISTANT sans changer son type. ⚠️ Faire passer un bloc EXISTANT typé (filiale, externe…) en 'container' (« pôle ») lui FAIT PERDRE ses parts de capital — les personnes restent affectées (le lot le signale dans warning) : pour qu'il contienne ses enfants, GARDE son type et pose displayMode:'container'."New value: +"Type de cellule. REQUIS pour CRÉER un bloc (id absent du projet) — sinon le LOT ENTIER est refusé. Omis sur un bloc EXISTANT, le type reste inchangé. ⚠️ Faire passer un bloc EXISTANT typé (filiale, externe…) en 'container' (« pôle ») lui FAIT PERDRE ses parts de capital — les personnes restent affectées (le lot le signale dans warning) : pour qu'il contienne ses enfants, displayMode:'container' sur son type d'origine suffit."
    • changedInput schema / properties / people / items / properties / initials / description
      Previous value: -"2 lettres majuscules. OMETS ce champ : elles sont dérivées du nom (première lettre du premier mot + du dernier), comme partout ailleurs dans le produit."New value: +"2 lettres majuscules. Champ omis : elles sont dérivées du nom (première lettre du premier mot + du dernier), comme partout ailleurs dans le produit."
    • changedInput schema / properties / people / items / properties / tags / description
      Previous value: -"Étiquettes de la personne. REMPLACE la liste entière (pas un ajout) — un tag absent de ce tableau est retiré. Omets le champ pour ne pas y toucher."New value: +"Étiquettes de la personne. REMPLACE la liste entière (pas un ajout) — un tag absent de ce tableau est retiré. Champ omis : les étiquettes ne changent pas."
  3. First observed

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag destructiveHint=true; the description explains exactly what is destroyed (supplying contentBlocks replaces the entire list, absent blocks are LOST), what is preserved (blocks from prior batches, kindMetadata merges), and what is returned to compensate (removedContentBlocks, skippedRefs). It also documents whole-batch refusal conditions and the contentBudget absence-is-not-'did not look' caveat — none of which the annotations carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The replacement warning is correctly front-loaded, and nearly every sentence carries operational content. However it is a dense wall of ALL-CAPS emphasis and emoji warnings that is hard to scan, and the closing contentBudget paragraph duplicates what get_cell_details already exposes, making it the least essential part.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, multi-entity batch write with no output schema, the description covers sequencing, partial-failure behavior, overwrite semantics, and the shape of the response. An agent has enough to plan a correct multi-call sequence without trial and error.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics the schema cannot express: ordering of parent blocks across batches, the requirement that fromId/toId and personId/cellId already exist or be born in this batch, and that layout coordinates are server-recomputed. It omits the cardinality ceilings (12 cells / 20 people / 30 dependencies / 40 assignments), which the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — builds the schema in batches — and positions itself as 'the write tool suited to any broad request', which distinguishes it from the single-block siblings (add_cell, update_cell, add_content_block) listed in the same breath. An agent can tell what it does and what class of operation it replaces without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: broad requests go here, while adding a single content block goes to add_content_block or a read-modify-send via get_cell_details. It also spells out the dependency-ordering rule and what to do with skippedRefs. It stops short of an explicit 'do NOT use this for a single block' sentence, but the routing is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.