Блог • AI / Agent

Почему Claude Code всё больше похож на настоящего AI-агента? Tool Use, MCP, сессия, права и JSON-процесс

Claude Code похож на агента, потому что сессия связывает три JSON: возобновляемый разговор, проверку прав на каждый Tool Use и MCP, который читается при старте. Возобновление — --resume, права — в settings.json, инструменты — из .mcp.json. Если нет одного из них, продолжение — уже не та же работа.

Цикл инструментов уже описан в Как работают coding-агенты. Различия harness — в гонке harness. Здесь только Claude Code: что восстанавливает сессия, когда меняется режим, когда MCP читается снова и какой JSON процесса хранить самому.

В этой статье:

Сначала запомните: возобновить сессию — не то же самое, что вернуть флаги запуска. Разговор и часть режимов возвращаются. --mcp-config — нет. Дальше: сессия, права, MCP и ваш JSON процесса.

Что сессия восстанавливает и чего не восстанавливает

Сессия — это разговор, привязанный к каталогу проекта. См. Управление сессиями. Транскрипт пишется локально по ходу работы, поэтому после выхода можно вернуться.

Вход Что возвращается Режим прав
claude --continue Последний интерактивный разговор в этом каталоге, включая вызовы инструментов и результаты В терминале без -p действует официальная таблица. bypassPermissions и plan не возвращаются без изменений
claude --resume <name> Возобновить эту сессию сразу по имени Уникальное имя открывает её. Повтор открывает выбор, и он не восстанавливает сохранённый режим
claude -p --resume Неинтерактивное возобновление, для скриптов Режим такой же, как у нового claude -p. Plan возвращается, только если сессия закончилась в plan и выполнены четыре официальных условия

Возвращаются также тогдашняя модель, активная цель и непросроченные запланированные задачи. Фоновый Bash не возвращается.

Транскрипт по умолчанию — JSONL в ~/.claude/projects/, в папке из рабочего каталога. Документация говорит, что формат меняется. Не считайте его стабильным контрактом. Стабильные поля держите в отдельном JSON.

Режим прав идёт вместе с сессией

Режим — не фраза в подсказке. В сессии Shift+Tab переключает default, acceptEdits и plan. При старте — --permission-mode. Долгое значение по умолчанию — режимы прав, поле permissions.defaultMode. Просьба к модели в чате сменить режим затвор не меняет.

Режим по умолчанию и правила одной сессии. Сначала deny, затем ask, затем allow.
{
  "permissions": {
    "defaultMode": "default",
    "allow": ["Bash(npm test *)"],
    "ask": ["Bash(git push *)"],
    "deny": ["Read(./.env)", "Read(./.env.*)"]
  }
}

Порядок правил — в правах Claude Code. Более конкретный allow не отменяет уже совпавший deny.

Как возобновляете Режим прав
Терминальные --continue или --resume уникального имени, без -p Восстанавливает режим на момент конца, кроме bypassPermissions и plan: они стартуют как новая сессия. auto возвращается, только если аккаунт всё ещё подходит.
Выбор при запуске или имя, которое совпало с несколькими сессиями Сохранённый режим не восстанавливает. Стартует в режиме новой сессии для этого запуска.
/resume Сохранённый режим целевой сессии не восстанавливает. Продолжает в режиме уже открытой сессии.

Как правила становятся очередью и возвратом отказа, написано в как подключить контроль прав. Здесь режим — только состояние сессии. Файл правил перечитывается при возобновлении.

MCP читается при старте сессии

Сервер проекта лежит в .mcp.json в корне репозитория и читается при старте. После правки выйдите и откройте снова. См. Подключение MCP. В первый раз Claude Code просит одобрить сервер проекта. Клонированный репозиторий не может без согласия запустить процесс на вашей машине.

Проектный MCP. Имя сервера становится префиксом имени инструмента.
{
  "mcpServers": {
    "docs": {
      "type": "http",
      "url": "https://code.claude.com/docs/mcp"
    }
  }
}

Полное имя инструмента использует префикс вроде mcp__docs__. Правила прав совпадают с этим полным именем. Не пишите только короткое имя с сервера.

JSON процесса, который храните вы

JSONL-транскрипт — не стабильный контракт. Документ ниже ваш. Он помнит, что передать при следующем возобновлении. Это не тело запроса Claude Code, и CLI его не читает.

Одна возобновляемая запись процесса. Массив resume — флаги, которые нужно передать снова.
{
  "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 — имя из claude -n или /rename, чтобы --resume нашёл его. cwd должен быть тогдашним каталогом проекта. Сессии хранятся по каталогам.

  1. 1
    Сначала совпадите с сессией

    name передаётся в --resume. cwd решает, в каком каталоге проекта лежит транскрипт. Неверный каталог — то же имя не находится.

  2. 2
    Затем выровняйте режим

    Скопируйте permission_mode в --permission-mode команды возобновления. Выбор и /resume старый режим за вас не вернут.

  3. 3
    В конце подключите MCP

    Если mcp_config указывает на файл в репозитории, старт читает его снова. Если исходный запуск зависел от файла командной строки, положите путь в --mcp-config.

Как один Tool Use меняет три документа

Ход — это не ещё один абзац подсказки. Порядок фиксирован.

  1. 1
    Загрузка

    Сессия загружает разговор и перечитывает settings.json и .mcp.json. MCP из командной строки есть, только если вы передали его в этот раз.

  2. 2
    Предложить вызов

    Модель выдаёт tool_use: полное имя инструмента и input. У инструмента MCP есть префикс сервера.

  3. 3
    Пройти права

    Сначала deny, затем ask, затем allow. Deny не выполняет. Ask ждёт человека. Allow — это то, что вызывает инструмент.

  4. 4
    Записать обратно

    Результат дописывается в транскрипт сессии. Ваш JSON процесса обновляет только last_tool. Весь транскрипт туда не копируйте.

При следующем возобновлении вы знаете, на каком инструменте остановились, какой был режим и из какого файла читался MCP. Транскрипт по-прежнему хранит Claude Code.

Чем это отличается от двух других статей

Как работают coding-агенты Гонка harness Эта статья
Вопрос Как вообще крутится цикл инструментов Чем отличаются оболочки Что делает каждый из трёх JSON, когда сессия Claude Code возобновляется
Не ищите здесь Ещё один обзор вызова инструментов Ещё одну таблицу сравнения продуктов Разбор JSONL-транскрипта как стабильного API

Проверить JSON процесса в JSONNote

  1. 1
    Форматировать

    Откройте settings.json и запись процесса в форматировании JSON. Комментарий или висячая запятая дадут Settings Error при следующем запуске.

  2. 2
    Проверить запись процесса

    Вставьте схему ниже в JSON Schema. Нет name или cwd, либо permission_mode вне перечисления — исправьте до возобновления.

  3. 3
    Сравнить правила прав

    До и после правки deny / allow через JSON Diff посмотрите, не ушло ли правило deny в allow. Это важнее имени сессии.

JSON Schema записи процесса. permission_mode использует официальные имена режимов.
{
  "$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"] }
      }
    }
  }
}

Вопросы

Серверы MCP остаются после resume?

Серверы из .mcp.json или ~/.claude.json читаются снова при запуске. Переданный только через --mcp-config сам не возвращается. При возобновлении передайте его снова.

Режим прав возвращается вместе с разговором?

Не всегда. Терминальные --continue или --resume уникального имени без -p следуют официальной таблице. bypassPermissions и plan не возвращаются как были. Выбор и /resume используют режим этого запуска.

Можно ли разбирать JSONL в ~/.claude/projects как процесс?

Нет. Документация считает формат внутренним файлом, который меняется. Стабильные поля — в JSON этой статьи: имя, каталог, режим, пути и последнее решение по инструменту.

Поможет ли попросить модель в чате сменить режим прав?

Нет. Режим задают Shift+Tab, --permission-mode или defaultMode в настройках. Подсказка затвор не меняет.

Это то же самое, что очередь согласования?

Нет. permission_mode здесь — затвор этой сессии. Очередь, возврат отказа и tool_use_id — в статье про контроль прав. Нужны оба слоя: режим решает, спрашивать ли, очередь — как сохранить ответ.

Итог

Claude Code похож на агента, потому что сессия связывает разговор, режим прав и инструменты MCP в одну возобновляемую работу. Вернуть разговор — не то же самое, что вернуть флаги запуска. JSONL оставьте CLI. Свой JSON процесса храните сами.

Прямой вывод: сессию ищите по имени и каталогу. Для выбора и /resume режим передайте снова. --mcp-config передавайте при каждом resume.

Дальше: проверьте запись процесса, затем откройте сессию с аргументами resume из неё.

Назад в блог