Blog • AI / Agent

Pourquoi Claude Code ressemble-t-il de plus en plus à un vrai agent IA ? Tool Use, MCP, session, permission et workflow JSON

Claude Code ressemble à un agent parce qu'une session lie trois documents JSON : une conversation reprenable, le contrôle de permission à chaque tool use, et la config MCP lue au démarrage. On reprend avec --resume, les permissions sont dans settings.json, les outils viennent de .mcp.json. S'il en manque un, la reprise n'est pas le même travail.

La boucle d'outils est déjà dans Comment travaillent les coding agents. Les différences de harness sont dans la course des harness. Cet article ne découpe que Claude Code : ce qu'une session restaure, quand le mode change, quand MCP est relu, et quel JSON de workflow vous devez garder.

Cet article couvre :

À retenir d'abord : reprendre une session ne restaure pas les options de lancement. La conversation et certains modes reviennent. --mcp-config non. Ensuite : session, permission, MCP, votre JSON de workflow.

Ce qu'une session restaure, et ce qu'elle ne restaure pas

Une session est une conversation liée à un répertoire de projet. Voir Gérer les sessions. La transcription est écrite en local pendant le travail, donc vous pouvez revenir après avoir quitté.

Entrée Ce qui revient Mode de permission
claude --continue La dernière conversation interactive de ce répertoire, appels d'outils et résultats compris Dans un terminal sans -p, le tableau officiel s'applique. bypassPermissions et plan ne reviennent pas inchangés
claude --resume <name> Reprendre cette session directement par son nom Un nom unique l'ouvre. Un doublon ouvre le sélecteur, qui ne restaure pas le mode stocké
claude -p --resume Reprise non interactive, pour les scripts Le mode est celui d'un nouveau claude -p. Plan ne revient que si la session s'est terminée en plan et que les quatre conditions officielles tiennent

La reprise ramène aussi le modèle d'alors, un objectif encore actif et les tâches planifiées non expirées. Le Bash en arrière-plan ne revient pas.

La transcription est du JSONL par défaut, sous ~/.claude/projects/, dans un dossier dérivé du répertoire de travail. La doc dit que le format change. N'en faites pas votre contrat stable. Gardez les champs stables dans un autre JSON.

Le mode de permission suit la session

Le mode n'est pas une phrase du prompt. Pendant la session, Shift+Tab fait défiler default, acceptEdits et plan. Au démarrage, --permission-mode. La valeur durable est modes de permission, champ permissions.defaultMode. Demander au modèle dans le chat de changer de mode ne change pas la barrière.

Mode par défaut et règles d'une session. Deny avant ask, ask avant allow.
{
  "permissions": {
    "defaultMode": "default",
    "allow": ["Bash(npm test *)"],
    "ask": ["Bash(git push *)"],
    "deny": ["Read(./.env)", "Read(./.env.*)"]
  }
}

L'ordre des règles est dans les permissions Claude Code. Un allow plus précis n'annule pas un deny déjà correspondant.

Comment vous reprenez Mode de permission
--continue dans le terminal, ou --resume d'un nom unique, sans -p Restaure le mode de fin, sauf bypassPermissions et plan, qui démarrent comme une nouvelle session. auto ne revient que si le compte est encore éligible.
Le sélecteur au lancement, ou un nom qui correspond à plusieurs sessions Ne restaure pas le mode stocké. Démarre dans le mode qu'une nouvelle session utiliserait pour ce lancement.
/resume Ne restaure pas le mode stocké de la session cible. Continue dans le mode de la session déjà ouverte.

Comment les règles deviennent une file et un renvoi de refus est dans brancher le contrôle des permissions. Ici, le mode est seulement un état de session. Le fichier de règles est relu à la reprise.

MCP est lu au démarrage de la session

Un serveur de projet vit dans .mcp.json à la racine du dépôt et est lu au démarrage. Après une modification, quittez et rouvrez. Voir Connecter MCP. La première fois, Claude Code demande d'approuver le serveur de projet. Un dépôt cloné ne peut pas lancer un processus sur votre machine sans cet accord.

MCP de projet. Le nom du serveur devient le préfixe du nom d'outil.
{
  "mcpServers": {
    "docs": {
      "type": "http",
      "url": "https://code.claude.com/docs/mcp"
    }
  }
}

Le nom complet de l'outil utilise un préfixe comme mcp__docs__. Les règles de permission correspondent à ce nom complet. N'écrivez pas seulement le nom court du serveur.

Le JSON de workflow que vous gardez

La transcription JSONL n'est pas un contrat stable. Le document ci-dessous est le vôtre. Il note quoi passer à la prochaine reprise. Ce n'est pas un corps de requête Claude Code, et la CLI ne le lit pas.

Un enregistrement de workflow reprenable. Le tableau resume contient les options à repasser.
{
  "name": "auth-refactor",
  "cwd": "/repo/app",
  "permission_mode": "default",
  "settings": ".claude/settings.json",
  "mcp_config": ".mcp.json",
  "resume": ["--resume", "auth-refactor"],
  "last_tool": {
    "name": "mcp__docs__search",
    "decision": "allow"
  }
}

name est le nom fixé avec claude -n ou /rename, pour que --resume le trouve. cwd doit être le répertoire de projet d'alors. Les sessions sont stockées par répertoire.

  1. 1
    D'abord faire correspondre la session

    name est ce que vous passez à --resume. cwd décide dans quel répertoire de projet se trouve la transcription. Mauvais répertoire : le même nom n'est pas trouvé.

  2. 2
    Puis aligner le mode

    Copiez permission_mode dans --permission-mode de la commande de reprise. Le sélecteur et /resume ne restaurent pas l'ancien mode.

  3. 3
    Enfin rattacher MCP

    Si mcp_config pointe un fichier du dépôt, le démarrage le relit. Si le lancement d'origine dépendait d'un fichier en ligne de commande, mettez ce chemin dans --mcp-config.

Comment un tool use met à jour les trois documents

Un tour n'est pas un paragraphe de prompt de plus. L'ordre est fixe.

  1. 1
    Charger

    La session charge la conversation et relit settings.json et .mcp.json. Le MCP en ligne de commande n'est là que si vous l'avez passé cette fois.

  2. 2
    Proposer l'appel

    Le modèle émet un tool_use : nom complet de l'outil et input. Un outil MCP porte le préfixe du serveur.

  3. 3
    Passer les permissions

    Évaluer deny, puis ask, puis allow. Deny n'exécute pas. Ask attend une personne. Allow est ce qui appelle l'outil.

  4. 4
    Renvoyer

    Le résultat est ajouté à la transcription. Votre JSON de workflow ne met à jour que last_tool. N'y copiez pas toute la transcription.

À la reprise suivante, vous savez sur quel outil vous vous êtes arrêté, quel mode était en vigueur et quel fichier fournissait MCP. Claude Code garde la transcription.

Différence avec les deux autres articles

Comment travaillent les coding agents La course des harness Cet article
Question Comment une boucle d'outils tourne en général En quoi les enveloppes diffèrent Ce que fait chacun des trois JSON quand une session Claude Code reprend
Ne pas chercher ici Un autre panorama du tool calling Un autre tableau de comparaison de produits Parser la transcription JSONL comme une API stable

Vérifier le JSON de workflow dans JSONNote

  1. 1
    Formater

    Ouvrez settings.json et l'enregistrement dans Formater le JSON. Un commentaire ou une virgule finale provoque une Settings Error au prochain démarrage.

  2. 2
    Valider l'enregistrement de workflow

    Collez le schéma ci-dessous dans JSON Schema. Un name ou un cwd manquant, ou un permission_mode hors enum, se corrige avant la reprise.

  3. 3
    Comparer les règles de permission

    Avant et après un changement deny / allow, utilisez JSON Diff pour voir si une règle deny est passée dans allow. Ce changement compte plus que le nom de session.

JSON Schema de l'enregistrement de workflow. permission_mode utilise les noms officiels.
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "additionalProperties": false,
  "required": ["name", "cwd", "permission_mode", "settings", "mcp_config"],
  "properties": {
    "name": { "type": "string", "minLength": 1 },
    "cwd": { "type": "string", "minLength": 1 },
    "permission_mode": {
      "enum": ["default", "acceptEdits", "plan", "auto", "dontAsk", "bypassPermissions"]
    },
    "settings": { "type": "string", "minLength": 1 },
    "mcp_config": { "type": "string", "minLength": 1 },
    "resume": { "type": "array", "items": { "type": "string" } },
    "last_tool": {
      "type": "object",
      "required": ["name", "decision"],
      "properties": {
        "name": { "type": "string" },
        "decision": { "enum": ["allow", "deny", "ask"] }
      }
    }
  }
}

Questions fréquentes

Les serveurs MCP sont-ils encore là après resume ?

Ceux de .mcp.json ou ~/.claude.json sont relus au démarrage. Un serveur passé seulement par --mcp-config ne revient pas. Repassez-le à la reprise.

Le mode de permission revient-il avec la conversation ?

Pas toujours. Un --continue dans le terminal, ou un --resume d'un nom unique, sans -p, suit le tableau officiel. bypassPermissions et plan ne reviennent pas tels quels. Le sélecteur et /resume utilisent le mode de ce lancement.

Peut-on parser le JSONL de ~/.claude/projects comme workflow ?

Non. La doc traite le format comme un fichier interne qui change. Les champs stables vont dans le JSON de cet article : nom, répertoire, mode, chemins et dernière décision d'outil.

Demander au modèle dans le chat de changer de mode fonctionne-t-il ?

Non. Le mode vient de Shift+Tab, de --permission-mode ou de defaultMode dans les settings. Un prompt ne change pas la barrière.

Est-ce la même chose que la file d'approbation ?

Non. permission_mode ici est la barrière de cette session. La file, le renvoi du refus et tool_use_id sont dans l'article sur le contrôle des permissions. Il faut les deux : le mode décide s'il faut demander, la file décide comment la réponse est stockée.

Conclusion

Claude Code ressemble à un agent parce qu'une session lie conversation, mode et outils MCP en un travail reprenable. Restaurer la conversation n'est pas restaurer les options de lancement. Laissez le JSONL à la CLI. Gardez votre propre JSON de workflow.

Conclusion directe : situez la session par le nom et le répertoire. Repassez le mode pour le sélecteur et /resume. Repassez --mcp-config à chaque reprise.

Ensuite : validez l'enregistrement, puis ouvrez la session avec les arguments resume qu'il contient.

Retour au blog