Skip to main content
Glama

replace_schema

Destructive

Generates a complete schema from a textual description. REPLACES all the current data. Reserved for the case where the user wants to recreate everything from scratch. The layout is recomputed automatically on the server (positions/sizes optional in the payload); the payload carries the structure, the contentBlocks (notes/actions/links) and the people/assignments. dryRun:true PREVIEWS the diff (added/modified/deleted) of a full replacement — nothing is written.

Input Schema

NameRequiredDescriptionDefault
dataYesComplete SchemaData object: { meta, cells, people, assignments, dependencies }. EACH cell can carry cells[].contentBlocks[] — the rich content is the heart of the product, NOT an optional decoration: the detail goes HERE, and not in desc (truncated to 2 lines). Shape of a contentBlock: { id, type: 'list'|'text'|'actions'|'links', title, colorKey?, entries?, text?, note? }. Entry (entries[]): { text, badge?, badgeType?: 'active'|'pending'|'future'|'ref', done?, status?: 'todo'|'doing'|'done'|'blocked', priority?: 'urgent'|'high'|'normal'|'low', assignee?, due?, url? }. cells[].scopeId / cells[].embedKind: REFUSED. A payload that carries any is rejected ahead of any write, naming the offending blocks. This mechanism (a nested level inside the SAME project) has been abandoned since 2026-08-13 and the column no longer exists. A sub-view under a block is started with create_nested_project. No x/y coordinates: the layout is computed on the server side. Canonical shapes + examples: `get_playbook(kind, 'contenu')`.
labelYesDescription of the change for versioning
dryRunNo`true` PREVIEWS what this replacement would change — a diff (added/modified/deleted) between the current schema and `data`, computed on the SAME normalized data as the real write. NOTHING IS WRITTEN: neither schema nor version. Useful before a full replacement, the most destructive operation of the registry.
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. Changed4 schema fields changed
    • changedInput schema / properties / data / description
      Previous value: -"Objet SchemaData complet : { meta, cells, people, assignments, dependencies }. CHAQUE cell peut porter cells[].contentBlocks[] — le contenu riche, c'est le cœur du produit, PAS une décoration optionnelle : le détail va ICI, jamais dans desc (tronquée à 2 lignes). Forme d'un contentBlock : { id, type: 'list'|'text'|'actions'|'links', title, colorKey?, entries?, text?, note? }. Entrée (entries[]) : { text, badge?, badgeType?: 'active'|'pending'|'future'|'ref', done?, status?: 'todo'|'doing'|'done'|'blocked', priority?: 'urgent'|'high'|'normal'|'low', assignee?, due?, url? }. cells[].scopeId / cells[].embedKind : REFUSÉS. Un payload qui en porte est rejeté AVANT toute écriture, en nommant les blocs fautifs. Ce mécanisme (sous-scène dans le MÊME projet) est abandonné depuis le 2026-08-13 et la colonne n'existe plus. Un sous-schéma sous un bloc se démarre avec create_nested_project. Aucune coordonnée x/y : le layout est calculé côté serveur. Formes canoniques + exemples : get_playbook(kind, 'contenu')."New value: +"Complete SchemaData object: { meta, cells, people, assignments, dependencies }. EACH cell can carry cells[].contentBlocks[] — the rich content is the heart of the product, NOT an optional decoration: the detail goes HERE, and not in desc (truncated to 2 lines). Shape of a contentBlock: { id, type: 'list'|'text'|'actions'|'links', title, colorKey?, entries?, text?, note? }. Entry (entries[]): { text, badge?, badgeType?: 'active'|'pending'|'future'|'ref', done?, status?: 'todo'|'doing'|'done'|'blocked', priority?: 'urgent'|'high'|'normal'|'low', assignee?, due?, url? }. cells[].scopeId / cells[].embedKind: REFUSED. A payload that carries any is rejected ahead of any write, naming the offending blocks. This mechanism (a nested level inside the SAME project) has been abandoned since 2026-08-13 and the column no longer exists. A sub-view under a block is started with create_nested_project. No x/y coordinates: the layout is computed on the server side. Canonical shapes + examples: `get_playbook(kind, 'contenu')`."
    • changedInput schema / properties / dryRun / description
      Previous value: -"`true` PRÉVISUALISE ce que ce remplacement changerait — un diff (ajoutés/modifiés/supprimés) entre le schéma actuel et `data`, calculé sur les MÊMES données normalisées que l'écriture réelle. RIEN N'EST ÉCRIT : ni schéma, ni version. Utile avant un remplacement complet, l'opération la plus destructrice du registre."New value: +"`true` PREVIEWS what this replacement would change — a diff (added/modified/deleted) between the current schema and `data`, computed on the SAME normalized data as the real write. NOTHING IS WRITTEN: neither schema nor version. Useful before a full replacement, the most destructive operation of the registry."
    • 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 / label / description
      Previous value: -"Description du changement pour le versioning"New value: +"Description of the change for versioning"
  2. Changed2 schema fields changed
    • changedInput schema / properties / data / description
      Previous value: -"Objet SchemaData complet : { meta, cells, people, assignments, dependencies }. CHAQUE cell peut porter cells[].contentBlocks[] — le contenu riche, c'est le cœur du produit, PAS une décoration optionnelle : le détail va ICI, jamais dans desc (tronquée à 2 lignes). Forme d'un contentBlock : { id, type: 'list'|'text'|'actions'|'links', title, colorKey?, entries?, text?, note? }. Entrée (entries[]) : { text, badge?, badgeType?: 'active'|'pending'|'future'|'ref', done?, status?: 'todo'|'doing'|'done'|'blocked', priority?: 'urgent'|'high'|'normal'|'low', assignee?, due?, url? }. cells[].scopeId / cells[].embedKind : REFUSÉS. Un payload qui en porte est rejeté AVANT toute écriture, en nommant les blocs fautifs. Ce mécanisme (sous-scène dans le MÊME projet) est abandonné depuis le 2026-08-13 et la colonne n'existe plus. Pour démarrer un sous-schéma sous un bloc, appelle create_nested_project. Aucune coordonnée x/y : le layout est calculé côté serveur. Formes canoniques + exemples : get_playbook(kind, 'contenu')."New value: +"Objet SchemaData complet : { meta, cells, people, assignments, dependencies }. CHAQUE cell peut porter cells[].contentBlocks[] — le contenu riche, c'est le cœur du produit, PAS une décoration optionnelle : le détail va ICI, jamais dans desc (tronquée à 2 lignes). Forme d'un contentBlock : { id, type: 'list'|'text'|'actions'|'links', title, colorKey?, entries?, text?, note? }. Entrée (entries[]) : { text, badge?, badgeType?: 'active'|'pending'|'future'|'ref', done?, status?: 'todo'|'doing'|'done'|'blocked', priority?: 'urgent'|'high'|'normal'|'low', assignee?, due?, url? }. cells[].scopeId / cells[].embedKind : REFUSÉS. Un payload qui en porte est rejeté AVANT toute écriture, en nommant les blocs fautifs. Ce mécanisme (sous-scène dans le MÊME projet) est abandonné depuis le 2026-08-13 et la colonne n'existe plus. Un sous-schéma sous un bloc se démarre avec create_nested_project. Aucune coordonnée x/y : le layout est calculé côté serveur. Formes canoniques + exemples : get_playbook(kind, 'contenu')."
    • changedInput schema / properties / dryRun / description
      Previous value: -"Passe dryRun:true pour PRÉVISUALISER ce que ce remplacement changerait — un diff (ajoutés/modifiés/supprimés) entre le schéma actuel et `data`, calculé sur les MÊMES données normalisées que l'écriture réelle. RIEN N'EST ÉCRIT : ni schéma, ni version. Utile avant un remplacement complet, l'opération la plus destructrice du registre."New value: +"`true` PRÉVISUALISE ce que ce remplacement changerait — un diff (ajoutés/modifiés/supprimés) entre le schéma actuel et `data`, calculé sur les MÊMES données normalisées que l'écriture réelle. RIEN N'EST ÉCRIT : ni schéma, ni version. Utile avant un remplacement complet, l'opération la plus destructrice du registre."
  3. First observed

TDQS

A4.2/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds substantial context beyond them: what exactly is destroyed ('REPLACES all the current data'), that layout is recomputed server-side, that dryRun previews an added/modified/deleted diff with nothing written, and that scopeId/embedKind payloads are refused before any write, routing to create_nested_project instead.

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

Conciseness4/5

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

Front-loaded with the purpose and the destructive REPLACES warning before the operational detail. The four sentences are dense but each earns its place; the heaviest content is appropriately pushed into the param-level schema descriptions rather than bloating the top-level text.

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

Completeness4/5

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

For a destructive, no-output-schema mutation this is well covered: destruction scope, dryRun preview semantics, server-side layout, refusal behavior, and the nested-project alternative are all present. Only the shape of a successful (non-dryRun) response is left unstated, which is a minor gap given no output schema exists.

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 schema already documents all four params (baseline 3), but the description adds real meaning: contentBlocks are the 'heart of the product' not decoration, desc is truncated to 2 lines, no x/y coordinates are accepted, and expectedProjectId actually retargets the call. This is more than restating the schema.

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

Purpose4/5

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

States a specific verb+resource ('Generates a complete schema', 'REPLACES all the current data') and scopes it clearly as a full-replacement, recreate-from-scratch operation. It distinguishes itself from the many incremental add_*/update_* siblings by emphasizing wholesale replacement, though it does not name a specific alternative tool.

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 explicit context: 'Reserved for the case where the user wants to recreate everything from scratch,' which implies it is NOT for partial/incremental edits, and it flags dryRun as the pre-flight check. It stops short of naming the sibling tools to use for non-full-replacement cases (e.g. update_meta, apply_batch).

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.