Skip to content

Référence des outils MCP

VMark expose sept outils MCP composites aux assistants IA : session, workspace, document, workflow, selection, browser et coherence. Ensemble, ils couvrent la colonne vertébrale de l'éditeur, le cycle de vie fichier/fenêtre, les modifications de workflow sûres au CST, les modifications ciblées sur la sélection, la navigation web bornée et une vue en lecture seule de la couche de cohérence de l'espace de travail.

La précédente surface de 12 outils / 76 actions a été élaguée parce que les outils de mise en forme intra-document (gras, titres, tableaux, etc.) dupliquent un travail que les agents IA effectuent déjà trivialement via un aller-retour Markdown. Voir le plan d'élagage MCP pour la justification complète.

Flux de travail recommandé

  1. Appelez session.get_state une fois pour voir les fenêtres ouvertes, les onglets et {filePath, dirty, revision, kind} par onglet.
  2. Pour Markdown : document.read → raisonner → document.write (en passant expected_revision pour une concurrence sûre).
  3. Pour YAML GitHub Actions (kind: "yaml-workflow") : workflow.apply_patch pour des modifications sûres au CST qui préservent les commentaires et les ancres ; workflow.validate pour les diagnostics actionlint.
  4. Les opérations sur fichiers (ouvrir, enregistrer, fermer, basculer d'onglet) résident sur workspace.

Diagrammes Mermaid

Lors de l'utilisation de l'IA pour générer du Mermaid via MCP, envisagez d'installer le serveur MCP mermaid-validator — il détecte les erreurs de syntaxe en utilisant les mêmes parseurs Mermaid v11 avant que les diagrammes n'atteignent votre document.


session

Orientation en un coup. Découvrez chaque fenêtre, chaque onglet et les capacités du serveur en un seul appel.

get_state

Aucun argument.

Retourne {windows, capabilities} :

json
{
  "windows": [
    {
      "label": "main",
      "focused": true,
      "tabs": [
        {
          "id": "tab-1",
          "filePath": "/path/to/notes.md",
          "title": "notes",
          "dirty": false,
          "revision": "rev-x7Q3aB1F",
          "kind": "markdown"
        },
        {
          "id": "tab-2",
          "filePath": "/repo/.github/workflows/ci.yml",
          "title": "ci",
          "dirty": true,
          "revision": "rev-x7Q3aB1F",
          "kind": "yaml-workflow"
        }
      ]
    }
  ],
  "capabilities": {
    "version": "<vmark-mcp-server version>",
    "supportedKinds": ["markdown", "yaml-workflow"],
    "mcpProtocol": "0.2.0"
  }
}

Le discriminant kind vous indique s'il faut utiliser document.write (pour markdown) ou workflow.apply_patch (pour yaml-workflow) sur cet onglet.


workspace

Cycle de vie des fichiers et fenêtres. Rien dans le document.

new

Créer un nouvel onglet sans titre.

ParamètreTypeRequisDescription
kindstringNon"markdown" (par défaut) ou "yaml-workflow"
windowLabelstringNonFenêtre cible ; par défaut, la fenêtre focalisée

Retourne {tabId}.

open

Ouvrir un fichier depuis le disque.

ParamètreTypeRequis
filePathstringOui
windowLabelstringNon

Retourne {tabId}.

save

Enregistrer un onglet vers son chemin existant.

ParamètreTypeRequis
tabIdstringNon (par défaut, focalisé)

Retourne {filePath, revision}.

save_as

Enregistrer un onglet vers un nouveau chemin.

ParamètreTypeRequis
tabIdstringNon
filePathstringOui

Retourne {revision}.

close

Fermer un onglet. Refuse de jeter du travail non enregistré sans force.

ParamètreTypeRequis
tabIdstringOui
forcebooleanNon

Retourne {closed: true} en cas de succès, {closed: false, reason: "DIRTY"} si l'onglet est modifié et force n'a pas été fourni.

switch_tab

Activer un onglet.

ParamètreTypeRequis
tabIdstringOui

focus_window

Mettre au point une fenêtre.

ParamètreTypeRequis
windowLabelstringOui

document

Lire, écrire, transformer. La colonne vertébrale de la surface.

read

ParamètreTypeRequis
tabIdstringNon (par défaut, focalisé)

Retourne {content, revision, filePath, kind, dirty}. Toujours lire avant d'écrire — le jeton revision doit accompagner le prochain write.

write

Remplacer le contenu complet du document.

ParamètreTypeRequisDescription
tabIdstringNonOnglet cible (par défaut, focalisé)
contentstringOuiNouveau contenu complet
expected_revisionstringNonJeton de révision de la lecture la plus récente

Si expected_revision est fourni et que le document a changé depuis cette lecture, la réponse est une enveloppe d'erreur structurée STALE avec la révision actuelle ; relire et réessayer.

json
// succès
{ "revision": "rev-newAfterWrite" }

// obsolète
{ "error": "STALE", "message": "Document has changed since the last read", "current_revision": "rev-currentNow" }

transform

Appliquer une réécriture déterministe. Prend actuellement en charge les transformations spécifiques au CJK (conversion ponctuation pleine largeur ↔ ASCII, espacement CJK ↔ Latin).

ParamètreTypeRequisDescription
tabIdstringNonOnglet cible
kindstringOui"cjk-format", "cjk-spacing" ou "cjk-punctuation"
expected_revisionstringNonJeton de concurrence

cjk-format applique de bout en bout les paramètres de mise en forme CJK de l'utilisateur. cjk-spacing insère des espaces simples entre les caractères CJK et les caractères latins/chiffres adjacents. cjk-punctuation convertit la ponctuation ASCII qui se trouve à côté des caractères CJK vers sa forme pleine largeur.

Retourne {revision}.


workflow

Validation actionlint et modifications chirurgicales sûres au CST pour le YAML de workflow GitHub Actions. Disponible uniquement pour les onglets dont le kind est "yaml-workflow".

document.read / document.write fonctionnent sur tous les onglets — y compris le YAML de workflow

L'outil workflow n'est pas un substitut à la colonne vertébrale lecture/écriture. Pour un onglet de workflow, vous pouvez :

  • document.read pour obtenir le texte YAML brut (avec tous les commentaires)
  • document.write pour le remplacer en gros (la chaîne que vous envoyez est stockée verbatim — commentaires préservés si vous les incluez)
  • workflow.apply_patch lorsque vous voulez que le serveur lui-même garantisse que les commentaires, ancres et ordre des clés survivent à une modification partielle

Utilisez apply_patch lors du changement d'un champ en laissant tout le reste intact (le serveur ne peut pas supprimer les commentaires qu'il ne change pas). Utilisez document.write quand vous réécrivez en gros ou générez un nouveau workflow à partir de zéro.

apply_patch

Appliquer un tableau d'objets IRPatch. Les patches sont distribués via les mutateurs sensibles au CST de VMark, qui préservent les commentaires, ancres et ordre des clés. Un document.write brut sur un fichier YAML les perdrait.

ParamètreTypeRequis
tabIdstringNon
patchesIRPatch[]Oui
expected_revisionstringNon

IRPatch est une union discriminée (champ kind). Types pris en charge :

kindEffet
workflow.setDéfinir des champs de premier niveau ({path, value}) — name, env.X, etc.
job.setDéfinir un champ sur un job ({jobId, path, value})
step.setDéfinir un champ sur une étape ({jobId, stepIndex, path, value})
with.setDéfinir une clé dans le bloc with: d'une étape ({jobId, stepIndex, key, value})
with.removeSupprimer une clé du bloc with: d'une étape
needs.add / needs.removeAjouter ou supprimer un ID de job de needs:
trigger.setFiltersRemplacer un tableau de filtres de déclencheur — branches, paths, types, etc. ({event, filter, value: string[]})

Retourne {revision} en cas de succès ou une enveloppe d'erreur structurée STALE / INVALID_PATCH / NOT_WORKFLOW.

validate

Exécuter actionlint sur le YAML du workflow.

ParamètreTypeRequis
tabIdstringNon

Retourne {ok, diagnostics, binaryAvailable}. Chaque diagnostic porte {line, col, message, severity}. binaryAvailable: false signifie qu'actionlint n'est pas installé localement ; installez via Homebrew ou les versions amont.


coherence

Une vue en lecture seule de la couche de cohérence de l'espace de travail — quels documents dérivés sont obsolètes par rapport aux amonts dont ils ont été générés. Aucune des deux actions ne modifie les documents, le registre ni aucun état de l'éditeur ; les deux sont entièrement traitées par le backend Rust à partir du noyau propre à chaque espace de travail, elles fonctionnent donc même quand aucune fenêtre d'éditeur n'est au premier plan.

Deux actions supplémentaires en lecture seule exposent la couche sémantique :

  • claims — les affirmations canoniques actuelles : {claim, entryId, statement, maturity, invalidAt, visible}. Seules les affirmations established contraignent les vérifications sémantiques ; visible reflète le contexte default.
  • contexts — l'ensemble des contextes (le default implicite est toujours présent) : {id, name, parent, enforcement, visibleClaims, errors}.

Une action de modification, encadrée par délégation :

  • resolve — résoudre une arête obsolète active en tant qu'agent explicitement délégué : {workspace_root, txf, input, resolution: "accept-newer" | "waive", reason? (required for waive)}. L'autorisation est fail-closed : le propriétaire de l'espace de travail doit avoir accordé à votre identité de pont authentifiée une délégation active et non expirée couvrant le type de résolution (accordée dans l'app, depuis le Détail), et l'arête doit être active. Chaque résolution déléguée est journalisée au titre de la délégation. La mutation des affirmations et des contextes n'est jamais exposée — le canon reste sous contrôle humain.

Toutes les actions exigent workspace_root : le chemin absolu de l'espace de travail à interroger. Obtenez-le via session.get_state (le filePath des onglets ouverts) ou l'outil workspace. Un chemin manquant, non absolu ou qui n'est pas un répertoire est refusé avec une erreur en chaîne simple.

status

Compteurs d'état du noyau pour un espace de travail.

ParamètreTypeRequisDescription
workspace_rootstringOuiChemin absolu de l'espace de travail à interroger

Retourne :

json
{
  "initialized": true,
  "objects": 12,
  "open_items": 2,
  "quarantined": 0,
  "writer": "0198c0de-0000-7000-8000-000000000001"
}
ChampSignification
initializedfalse quand l'espace de travail n'a pas encore de registre de cohérence (pas de répertoire .vmark/). Tous les compteurs sauf objects valent alors 0.
objectsObjets suivis (fichiers dotés d'une identité de cohérence).
open_itemsArêtes vivantes non à jour — la taille actuelle du détail.
quarantinedLignes de registre malformées mises en quarantaine lors de la dernière lecture.
writerL'identifiant writer (UUID) de cette installation.

edges

Le détail : chaque arête de dépendance vivante dont l'amont a bougé. Exécute d'abord une analyse-rapprochement, la réponse reflète donc les fichiers sur disque au moment de l'appel.

ParamètreTypeRequisDescription
workspace_rootstringOuiChemin absolu de l'espace de travail à interroger

Retourne un tableau — vide quand tout est cohérent :

json
[
  {
    "txf": "0198c0de-0000-7000-8000-00000000000a",
    "input": 0,
    "upstream": "0198c0de-0000-7000-8000-00000000000b",
    "upstream_path": "characters/elena.md",
    "pinned": "rev-a1b2c3",
    "downstream": "0198c0de-0000-7000-8000-00000000000c",
    "downstream_path": "scenes/chapter-3.md",
    "downstream_rev": "rev-d4e5f6",
    "state": "version-stale"
  }
]
ChampSignification
txf / inputL'entrée de transformation et l'emplacement d'entrée qui identifient cette arête (à passer aux actions de résolution dans l'application).
upstream / upstream_pathL'objet dont dépend l'aval, et son dernier chemin connu.
pinnedLa révision amont dont l'aval a été généré.
downstream / downstream_path / downstream_revL'objet dérivé, son chemin et sa révision actuelle.
state"version-stale", "stale-valid", "stale-contradicted", "stale-unknown", "waived", "diverged", "diverged-multi-head" ou "unpinnable".

Résoudre une arête (accepter la plus récente / exempter) est une action humaine effectuée dans la vue Détail de VMark — elle n'est délibérément pas exposée via MCP.


Erreurs

Deux formes d'erreurs apparaissent :

Erreurs de domaine — définissent success: false et retournent une enveloppe encodée en JSON dans error :

json
{ "error": "STALE", "message": "...", "current_revision": "rev-..." }

Erreurs de forme d'argument — pour les arguments requis manquants/invalides (par ex. document.write sans champ content), error est une simple chaîne décrivant le problème. L'enveloppe structurée est réservée aux conditions au niveau du domaine.

CodeApparaît commeSignification
STALEenveloppeexpected_revision ne correspondait pas ; relire et réessayer
INVALID_PATCHenveloppeworkflow.apply_patch a reçu un tableau patches malformé
INVALID_TABenveloppetabId n'a pas pu être résolu
INVALID_PATHenveloppeworkspace.open a reçu un filePath qui n'a pas pu être lu
NOT_WORKFLOWenveloppeworkflow.* a été appelé sur un onglet non-YAML-workflow
READ_ONLYenveloppeUne mutation a été tentée sur un document en lecture seule
INTERNALenveloppeErreur de gestionnaire inattendue
(chaîne simple)chaîneArgument requis manquant ou type incorrect