Блог • 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 процесса хранить самому.
В этой статье:
- Что возобновление возвращает и чего не возвращает
- Режим прав — состояние сессии. Правила живут в settings
- MCP читается при старте сессии. Конфигурация из командной строки сама не возвращается
- Свой JSON процесса, чтобы следующий resume шёл с теми же аргументами
- В каком порядке один Tool Use меняет эти три документа
Сначала запомните: возобновить сессию — не то же самое, что вернуть флаги запуска. Разговор и часть режимов возвращаются. --mcp-config — нет. Дальше: сессия, права, MCP и ваш JSON процесса.
Что сессия восстанавливает и чего не восстанавливает
Сессия — это разговор, привязанный к каталогу проекта. См. Управление сессиями. Транскрипт пишется локально по ходу работы, поэтому после выхода можно вернуться.
| Вход | Что возвращается | Режим прав |
|---|---|---|
claude --continue |
Последний интерактивный разговор в этом каталоге, включая вызовы инструментов и результаты | В терминале без -p действует официальная таблица. bypassPermissions и plan не возвращаются без изменений |
claude --resume <name> |
Возобновить эту сессию сразу по имени | Уникальное имя открывает её. Повтор открывает выбор, и он не восстанавливает сохранённый режим |
claude -p --resume |
Неинтерактивное возобновление, для скриптов | Режим такой же, как у нового claude -p. Plan возвращается, только если сессия закончилась в plan и выполнены четыре официальных условия |
Возвращаются также тогдашняя модель, активная цель и непросроченные запланированные задачи. Фоновый Bash не возвращается.
- Возвращается: история, модель (если её не сняли и не закрыл availableModels) и агент, запущенный с --agent. Если его нет в обоих каталогах, сессия откатывается к инструментам по умолчанию и показывает предупреждение.
- Само не возвращается:
--mcp-config,--settings,--add-dirи каталоги, добавленные в середине сессии через /add-dir. Передайте их снова в команде возобновления. - Настройки в
settings.jsonи settings.local.json перечитываются при запуске. Повторять их не нужно.
Транскрипт по умолчанию — JSONL в ~/.claude/projects/, в папке из рабочего каталога. Документация говорит, что формат меняется. Не считайте его стабильным контрактом. Стабильные поля держите в отдельном JSON.
Режим прав идёт вместе с сессией
Режим — не фраза в подсказке. В сессии Shift+Tab переключает default, acceptEdits и plan. При старте — --permission-mode. Долгое значение по умолчанию — режимы прав, поле permissions.defaultMode. Просьба к модели в чате сменить режим затвор не меняет.
{
"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 просит одобрить сервер проекта. Клонированный репозиторий не может без согласия запустить процесс на вашей машине.
{
"mcpServers": {
"docs": {
"type": "http",
"url": "https://code.claude.com/docs/mcp"
}
}
}
- Область проекта:
.mcp.json, общая для всех, кто клонирует репозиторий. Сначала одобрите. - Локальная область:
~/.claude.json. local — только вы и только этот проект. user — только вы и все проекты. - Флаг
--mcp-configдействует только на этот запуск. Resume его не возвращает. Передайте снова.
Полное имя инструмента использует префикс вроде mcp__docs__. Правила прав совпадают с этим полным именем. Не пишите только короткое имя с сервера.
JSON процесса, который храните вы
JSONL-транскрипт — не стабильный контракт. Документ ниже ваш. Он помнит, что передать при следующем возобновлении. Это не тело запроса Claude Code, и CLI его не читает.
{
"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
Сначала совпадите с сессией
nameпередаётся в --resume.cwdрешает, в каком каталоге проекта лежит транскрипт. Неверный каталог — то же имя не находится. -
2
Затем выровняйте режим
Скопируйте
permission_modeв--permission-modeкоманды возобновления. Выбор и /resume старый режим за вас не вернут. -
3
В конце подключите MCP
Если
mcp_configуказывает на файл в репозитории, старт читает его снова. Если исходный запуск зависел от файла командной строки, положите путь в--mcp-config.
Как один Tool Use меняет три документа
Ход — это не ещё один абзац подсказки. Порядок фиксирован.
-
1
Загрузка
Сессия загружает разговор и перечитывает settings.json и .mcp.json. MCP из командной строки есть, только если вы передали его в этот раз.
-
2
Предложить вызов
Модель выдаёт tool_use: полное имя инструмента и input. У инструмента MCP есть префикс сервера.
-
3
Пройти права
Сначала deny, затем ask, затем allow. Deny не выполняет. Ask ждёт человека. Allow — это то, что вызывает инструмент.
-
4
Записать обратно
Результат дописывается в транскрипт сессии. Ваш JSON процесса обновляет только
last_tool. Весь транскрипт туда не копируйте.
При следующем возобновлении вы знаете, на каком инструменте остановились, какой был режим и из какого файла читался MCP. Транскрипт по-прежнему хранит Claude Code.
Чем это отличается от двух других статей
| Как работают coding-агенты | Гонка harness | Эта статья | |
|---|---|---|---|
| Вопрос | Как вообще крутится цикл инструментов | Чем отличаются оболочки | Что делает каждый из трёх JSON, когда сессия Claude Code возобновляется |
| Не ищите здесь | Ещё один обзор вызова инструментов | Ещё одну таблицу сравнения продуктов | Разбор JSONL-транскрипта как стабильного API |
Проверить JSON процесса в JSONNote
-
1
Форматировать
Откройте settings.json и запись процесса в форматировании JSON. Комментарий или висячая запятая дадут Settings Error при следующем запуске.
-
2
Проверить запись процесса
Вставьте схему ниже в JSON Schema. Нет name или cwd, либо permission_mode вне перечисления — исправьте до возобновления.
-
3
Сравнить правила прав
До и после правки deny / allow через JSON Diff посмотрите, не ушло ли правило
denyвallow. Это важнее имени сессии.
{
"$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 из неё.