3,583 papers
arXiv:2610.34298 71 25 окт. 2026 г. FREE

MCP против CLI и DART: одни и те же возможности агента, но разная упаковка меняет его поведение, а при сбое вызова чинить нужно запись, а не решение

КЛЮЧЕВАЯ СУТЬ
Одни и те же возможности агента, а результат разный: Qwen3-14B в ALFWorld набрала 20 баллов с MCP (именованные инструменты со схемой) и 57 с CLI (команды с флагами). Метод DART позволяет не терять правильное решение агента, когда вызов инструмента упал из-за мелкой ошибки формата. Фишка: после ошибки агент часто передумывает всё решение целиком, хотя ошибся только в синтаксисе. DART делит вызов на два шага: сначала выбор действия, потом его запись. Если запись упала, агент получает одну поправку: то же действие, исправь только запись. В статье метод улучшил результат во всех шести проверенных связках «тестовый набор × интерфейс».
Адаптировать под запрос
⚡

TL;DR

Исследование показывает, что упаковка инструмента сама меняет поведение агента. Одни и те же действия можно показать модели как именованные инструменты со схемой (MCP) или как команды с флагами (CLI). От этого меняются выбор действий, число сбоев, расход токенов и итоговый результат. В статье же предложен приём DART: выбор действия и его запись в формате инструмента разделены на два шага. Если вызов упал, а решение было верным, чинится только запись, а новое решение не выбирается.

Универсального победителя нет. У Qwen3-14B в ALFWorld MCP сильно проиграл CLI: 20 баллов против 57. В WebShop у той же модели MCP выиграл: 64 против 60. Токены шли так же вразнобой. Поэтому «MCP лучше» или «CLI лучше» — плохое общее правило. Всё зависит от модели и задачи. Расхождения возникают рано: почти в 94% парных прогонов траектории разошлись, обычно в начале. После первого расхождения история и состояние уже разные, и всё дальше идёт по другой дороге. Самым чувствительным местом оказалась запись вызова: формат, флаги, аргументы.

DART работает в два шага. Сначала модель выбирает операцию и аргументы в нейтральном виде, и это решение фиксируется. Потом она записывает его в нужный формат. Если запись упала с ошибкой, модель получает одну поправку: «то же действие, исправь только запись». Без такого разделения агент часто после ошибки передумывает всё решение целиком. В статье DART улучшил результат во всех шести проверенных связках «бенчмарк × интерфейс», а в MCP ещё и снизил расход токенов.

🔬

Схема метода

Диагностика (MICA)

ШАГ 1: Один набор возможностей → в двух упаковках (MCP и CLI)
ШАГ 2: Одинаковые модель, задача, бюджет, исполнение → сравнить результат и токены
ШАГ 3: Найти первый шаг, где траектории разошлись → что именно разошлось: выбор действия или его запись

Починка (DART)

ШАГ 1 (выбор):    модель называет операцию + аргументы без привязки к формату → «обязательство»
ШАГ 2 (запись):   модель записывает это обязательство в формате MCP или CLI
ШАГ 3 (ремонт):   запись упала, а обязательство валидно → ОДНА поправка: меняется только запись
ШАГ 4 (выход):    поправка не прошла → обычная повторная попытка

В статье шаги выполняет контроллер в коде. Одна и та же модель получает разные инструкции для каждой фазы.

🚀

Пример применения

Задача: Вы делаете агента для отдела продаж в Claude Code. Он заводит сделки в amoCRM через CLI-утилиту. Типичная беда: агент ошибся в формате даты в одном флаге. Получив ошибку, он вместо исправления даты начинает искать другого клиента, создаёт другую сделку или меняет весь план.

Промпт (фрагмент в CLAUDE.md или системный промпт агента):

Работа с командами CRM делится на два шага. Не смешивай их.

ШАГ 1. РЕШЕНИЕ.
Сначала сформулируй действие без синтаксиса:
- операция: создать_сделку
- аргументы: клиент = «ООО Ромашка», сумма = 350 000 ₽, дедлайн = 15 ноября
Проверь по задаче: это действительно нужное действие? Если да — решение зафиксировано.

ШАГ 2. ЗАПИСЬ.
Запиши зафиксированное решение командой CLI (флаги, формат дат, кавычки).

ЕСЛИ КОМАНДА УПАЛА С ОШИБКОЙ ФОРМАТА:
- Решение из шага 1 НЕ пересматривай.
- Не меняй операцию и значения аргументов.
- Исправь только запись: флаги, порядок, формат даты, экранирование.
- Сделай ровно одну такую поправку.
- Если и она не сработала — остановись и покажи мне: решение, команду, ошибку.
- Если ошибка говорит о бизнес-проблеме (клиент не найден, нет прав) — это не ошибка записи.
  Тогда реши заново и объясни почему.

Результат: Агент перед вызовом коротко проговорит решение: операция и аргументы. Потом выдаст команду. При сбое формата он повторит то же действие с исправленным синтаксисом, а не начнёт новый план. Если поправка не помогла, он остановится и покажет три вещи: решение, команду и ошибку.

🧠

Почему это работает

Слабость. Интерфейс для модели — не нейтральная обёртка, а часть контекста, из которого она выбирает следующий шаг. Названия, схемы и формат ошибок подталкивают к разным действиям. В WebShop у Qwen3-14B из-за MCP сдвинулись доли действий: примерно на 6 пунктов больше click и на 6 меньше search. Первое расхождение запускает цепочку. История и состояние меняются, и дальше агент идёт другим путём.

Сильная сторона. Модель обычно правильно понимает, что надо сделать. Она спотыкается на том, как это записать. В статье запись дала самые большие локальные сдвиги: до 84 пунктов по частоте сбоев записи у отдельных связок. Сдвиг по сбоям записи не означает, что решение было плохим.

Как метод это использует. DART отделяет «что делать» от «как записать». Проверенное решение превращается в обязательство, и ошибка формата не заставляет агента его пересматривать. Без разделения ошибка записи легко превращается в смену стратегии. Так мелкая проблема синтаксиса портит всю траекторию.

Рычаги управления: - Число поправок (в статье одна) → увеличь до 2, если синтаксис сложный. Но тогда растёт риск зацикливания. - Что считается «ошибкой записи» → пропиши список явно (флаги, даты, кавычки). Всё остальное по умолчанию означает «решай заново». - Условие остановки → «покажи мне» подходит для критичных действий. Для рутины можно заменить на «пропусти и запиши в лог». - Фиксация решения → чем конкретнее поля (операция, аргументы), тем жёстче «обязательство».

📋

Шаблон промпта

Работай с инструментом {название_инструмента} в два шага.

ШАГ 1. РЕШЕНИЕ (без синтаксиса)
Опиши действие так:
- операция: {одна из: список_операций}
- аргументы: {имя = значение, …}
Проверь по цели «{цель_задачи}»: действие правильное? Если да — оно зафиксировано как РЕШЕНИЕ.

ШАГ 2. ЗАПИСЬ
Запиши РЕШЕНИЕ в формате {MCP-вызов | CLI-команда}.
Формат: {пример_корректной_записи}

ЕСЛИ ВЫЗОВ УПАЛ:
1. Определи: это ошибка ЗАПИСИ ({типы_ошибок_записи}) или ошибка РЕШЕНИЯ ({типы_ошибок_решения})?
2. Если ЗАПИСИ: операцию и значения аргументов НЕ меняй. Исправь только форму.
   Сделай ровно одну поправку.
3. Если поправка не помогла — {действие_при_неудаче}.
4. Если РЕШЕНИЯ: пересмотри решение и объясни, что изменилось.

Что подставлять: - {название_инструмента} — ваша CRM, трекер, облачная CLI. - {типы_ошибок_записи} — неверный флаг, формат даты, кавычки, порядок аргументов. - {типы_ошибок_решения} — объект не найден, нет прав, конфликт состояния. - {действие_при_неудаче} — остановиться и показать, записать в лог, спросить человека.

🚀 Быстрый старт — вставь в чат:

Вот шаблон двухшагового вызова инструмента (решение → запись → ремонт только записи).
Адаптируй под мою задачу: [опиши инструмент, как агент им пользуется, какие ошибки случаются].
Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

LLM спросит, какие операции доступны, как выглядит корректный вызов и какие ошибки бывают. Это нужно, чтобы разделить ошибки записи и ошибки решения. Это граница метода: чинить можно только первые.

⚠️

Ограничения

⚠️ Это не готовый промпт, а перенос. В статье DART — контроллер в коде с отдельными промптами для каждой фазы. Они в приложениях, которых в тексте нет. Шаблон выше — текстовая версия принципа. В одном промпте модель может смешать шаги. Эффект такой версии авторы не проверяли.

⚠️ Игровые среды. Проверяли на симуляторах: домашние задачи (ALFWorld), покупки (WebShop), научные опыты (ScienceWorld). Это не рабочие CRM, код или документы.

⚠️ Модели. Большинство моделей малые (Qwen3 от 4B до 32B), плюс DeepSeek-v4-Flash и Gemini-2.5-Flash. На флагманских моделях картина может быть другой. Это видно и по таблице: у DeepSeek в ALFWorld разрыв между интерфейсами малый.

⚠️ DART проверен на одной модели. Только на Gemini-2.5-Flash, на шести связках. В доступной части текста величина эффекта не видна, виден только факт улучшения.

⚠️ Нет рецепта выбора. Статья не говорит, что выбрать: MCP или CLI. Она говорит, что это нужно проверять на своей модели и задаче.

🔍

Как исследовали

Главная проблема прежних сравнений MCP и CLI в том, что вместе с интерфейсом менялось всё остальное: набор инструментов, промпты, проверки. Победу нельзя было приписать упаковке. Авторы построили оба интерфейса из одного контракта действий. Модель, стартовое состояние, бюджет и исполнение были одинаковыми, менялось только то, как это показано модели. Тестировали шесть моделей на трёх средах.

Результат вышел разнонаправленным. У Qwen3-14B в ALFWorld MCP отстал от CLI на 36,6 балла (20,1 против 56,7) и потратил на 54,9 тыс. токенов больше. В WebShop тот же MCP выиграл по баллам и сэкономил 35 тыс. токенов. После ошибки у Qwen3-4B в WebShop повторная попытка принималась в 50% случаев при CLI и в 77% при MCP. Успех задачи после этого: 18% и 34%.

Затем авторы разложили интерфейс на три части: как показаны возможности, как записывается ответ и как приходит обратная связь. Части меняли по одной и в сочетаниях (схема 2×2×2). Самый большой эффект дала запись ответа. Части влияют не по отдельности: в одной связке тройное взаимодействие сдвинуло приём вызовов на 37,8 пункта. Из 2 004 парных прогонов 1 889 (94,3%) разошлись, чаще всего из-за разных выбранных действий, а на втором месте были различия в записи. Этот второй источник авторы и взяли в DART.

💡

Адаптации и экстраполяции

💡 Адаптация для файла инструкций (AGENTS.md / CLAUDE.md). Статья этого не проверяла, это перенос принципа «чини запись, не решение»:

## Правило сбоев вызова
Если команда или вызов инструмента упали из-за формата (флаг, дата, кавычки, JSON):
повтори то же действие с исправленной записью. Не меняй цель и не выбирай другое действие.
Если ошибка по существу (нет объекта, нет прав) — остановись и спроси.

🔧 Техника: свой мини-тест интерфейсов. Идея из MICA, упрощённая, вывод в статье не проверялся. Возьмите 10 типовых задач, прогоните агента с MCP-описанием и CLI-описанием. Сравните первые шаги: выбрал ли он то же действие? Первое расхождение, как показала статья, определяет всю траекторию. Если расходятся в основном выбор действий, нужно править описания инструментов. Если расходится только запись, помогает правило из шаблона выше.

🔗

Ресурсы

  • Работа: Matched Capabilities, Different Behaviors: A Controlled Study of MCP and CLI Interfaces for Language Agents (MICA + DART)
  • Авторы: Zhenning Shi, Liang Pang, Yongqi Li. Hong Kong Polytechnic University; Institute of Computing Technology, Chinese Academy of Sciences
  • Среды: ALFWorld, WebShop, ScienceWorld
  • Связанное: Model Context Protocol; InterCode, Terminal-Bench; работы об агент-компьютерных интерфейсах (SWE-agent)

📋 Дайджест исследования

Ключевая суть

Одни и те же возможности агента, а результат разный: Qwen3-14B в ALFWorld набрала 20 баллов с MCP (именованные инструменты со схемой) и 57 с CLI (команды с флагами). Метод DART позволяет не терять правильное решение агента, когда вызов инструмента упал из-за мелкой ошибки формата. Фишка: после ошибки агент часто передумывает всё решение целиком, хотя ошибся только в синтаксисе. DART делит вызов на два шага: сначала выбор действия, потом его запись. Если запись упала, агент получает одну поправку: то же действие, исправь только запись. В статье метод улучшил результат во всех шести проверенных связках «тестовый набор × интерфейс».

Принцип работы

Процесс из четырёх шагов. 1. Выбор. Модель называет операцию и аргументы без привязки к формату. Это решение фиксируется как обязательство. 2. Запись. Модель переводит обязательство в MCP-вызов или CLI-команду. 3. Ремонт. Запись упала, а решение верное. Агент делает одну поправку, и меняется только запись. 4. Выход. Поправка не помогла. Тогда обычная повторная попытка. Решение заморожено, чинится только упаковка. Это как курьер, который перепутал номер подъезда. Он не меняет адресата и не выбирает другой дом. Он просто исправляет номер подъезда. В статье шаги ведёт обвязка в коде. Для каждой фазы модель получает свою инструкцию.

Почему работает

Интерфейс для модели не нейтральная обёртка. Названия инструментов, схемы и тексты ошибок входят в контекст, из которого она выбирает следующий шаг. В WebShop у Qwen3-14B из-за MCP доля click выросла примерно на 6 пунктов, а доля search упала на столько же. Дальше работает цепочка. Траектории разошлись почти в 94% парных прогонов, обычно в самом начале. История и состояние уже разные, и агент идёт другой дорогой. Самое чувствительное место — запись вызова: формат, флаги, аргументы. По сбоям записи у отдельных связок сдвиг доходил до 84 пунктов. Модель обычно понимает, что делать. Она спотыкается на том, как это записать. Без разделения мелкая ошибка синтаксиса превращается в смену стратегии, и портится вся траектория. С разделением решение не пересматривается из-за запятой или формата даты. В MCP DART ещё и снизил расход токенов.

Когда применять

Агенты с вызовами инструментов (CRM, трекеры, облачные CLI) → особенно когда после ошибки формата агент начинает новый план, ищет другой объект или создаёт дубли. Также полезно, если вы выбираете между MCP и CLI. Универсального победителя нет: в ALFWorld выиграл CLI (57 против 20), в WebShop у той же модели выиграл MCP (64 против 60). Проверяйте на своей модели и задаче. НЕ подходит, когда ошибка настоящая: клиент не найден, нет прав, конфликт состояния. Тогда решение нужно пересматривать. Ещё одна оговорка: в статье это обвязка в коде, а промпт ниже только перенос принципа, и его эффект авторы не проверяли.

Мини-рецепт

1. Раздели ошибки: выпиши, что считается ошибкой записи (флаги, формат даты, кавычки, порядок аргументов), а что ошибкой решения (объект не найден, нет прав).
2. Заставь назвать решение: перед вызовом агент пишет операцию и аргументы без синтаксиса. Например: <операция>создать_сделку.
3. Пусть сверит с целью: одна строка проверки, нужное ли это действие. Если да, решение заморожено.
4. Запрети передумывать: при ошибке записи операцию и значения аргументов менять нельзя.
5. Дай одну поправку: ровно одну. Две можно разрешить, если синтаксис сложный, но вырастет риск зацикливания.
6. Определи стоп: для критичных действий «остановись и покажи решение, команду и ошибку». Для рутины «пропусти и запиши в лог».
7. Проверь на своих логах: возьми 10-20 реальных сбоев и посмотри, где агент раньше передумывал.

Примеры

[ПЛОХО] : Заведи сделку для ООО Ромашка на 350 000 ₽ через CLI. Если что-то не так, разберись сам. Дата в неправильном формате, команда упала. Агент не чинит дату, а ищет другого клиента или меняет весь план.
[ХОРОШО] : Работай в два шага. ШАГ 1: опиши действие без синтаксиса: операция создать_сделку, аргументы клиент = ООО Ромашка, сумма = 350 000 ₽, дедлайн = 15 ноября. Проверь по задаче, что действие нужное. ШАГ 2: запиши его командой CLI. Если команда упала из-за формата, флагов или кавычек, операцию и значения не меняй. Сделай одну поправку только записи. Не помогло — остановись и покажи мне решение, команду и ошибку. Если ошибка про бизнес (клиент не найден, нет прав), реши заново и объясни почему. Агент сначала проговорит решение. При сбое формата он повторит то же действие с исправленной датой.
Источник: Matched Capabilities, Different Behaviors: A Controlled Study of MCP and CLI Interfaces for Language Agents
ArXiv ID: 2610.34298 | Сгенерировано: 2026-10-29 06:50

Проблемы LLM

ПроблемаСутьКак обойти
После сбоя вызова инструмента модель меняет само решение, хотя решение было вернымАгент выбрал правильное действие. Записал вызов с мелкой ошибкой: формат даты, флаг, кавычки. Инструмент вернул ошибку. Вместо правки записи модель передумывает всё. Берёт другой объект, другую операцию, строит новый план. Мелкая ошибка синтаксиса портит весь дальнейший путь. Модель обычно понимает, что делать. Спотыкается она на том, как это записатьРаздели «что делать» и «как записать». Сначала пусть модель назовёт действие без синтаксиса. Потом запишет его в формате инструмента. При ошибке записи разреши исправить только форму. Подробности в методе ниже

Методы

МетодСуть
Решение отдельно, запись отдельно — ошибка формата не ломает планЧто делать. Сделай в промпте два шага. Шаг 1: модель описывает действие без синтаксиса: операция: …, аргументы: имя = значение. Проверяет его по цели задачи. После проверки решение считается зафиксированным. Шаг 2: модель записывает решение командой или вызовом. При ошибке: сначала определи тип. Ошибка записи: флаг, формат даты, кавычки, порядок. Тогда операцию и значения не трогай. Сделай ровно одну поправку формы. Если не помогло, остановись и покажи: решение, команду, ошибку. Ошибка решения: объект не найден, нет прав, конфликт состояния. Тогда пересмотри решение и объясни, что изменилось. Почему работает: зафиксированное решение становится обязательством. Модель не воспринимает ошибку формата как повод передумать. Одна поправка не даёт зациклиться. Настройка: в промпте явно перечисли, что считается ошибкой записи. Всё остальное по умолчанию значит «реши заново». Для критичных действий при неудаче проси показать человеку. Для рутины пиши в лог. Если синтаксис сложный, можно разрешить 2 поправки, но риск зацикливания растёт. Когда да: много вызовов инструментов, ошибки формата частые, цена лишнего действия высока (CRM, деньги, файлы). Когда нет: вызовы простые и редко падают. Тогда два шага только добавят слов. Важно: в исходной работе это делает контроллер в коде, с отдельными инструкциями на каждую фазу. Версия в одном промпте не проверялась, и модель может смешать шаги. Для надёжности разнеси шаги по разным запросам
📖 Простыми словами

Matched Capabilities, Different Behaviors: A Controlled Study of MCP and CLI Interfaces forLanguageAgents

arXiv: 2610.34298

Модель видит интерфейс не как нейтральную панель управления, а как сырой текст в контексте, который напрямую корёжит вероятности следующих токенов. Оберни одну и ту же функцию как схему MCP или как команду CLI, и нейросеть начнёт буквально думать по-другому. Это не безобидный синтаксис: в тестах WebShop модель Qwen3-14B на MCP выдала на 6% больше кликов и на 6% меньше поиска. Одно микро-отличие в обёртке запускает лавину, и агент уходит по совершенно другому пути.

Это как дать водителю навигатор с двумя разными кнопками: на одной написано «Объезд», а на другой — «Маршрут через просёлочную дорогу». Действие одно, но во втором случае он испугается грязи и развернётся. С агентами ещё смешнее: ошибся в формате даты во флаге консоли, получил технический сбой, запаниковал и вместо исправления опечатки решил вообще бросить клиента и пойти заводить новую сделку. Сломался формат вызова — снесло крышу всему плану.

Чтобы прекратить этот цирк, придумали метод DART. Логика железобетонная: нужно разделить выбор действия и его запись на два независимых шага. Сначала агент решает, что он хочет сделать по сути, а вторым шагом формирует саму команду. Если терминал плюнул ошибкой из-за опечатки, DART чинит только синтаксис, наглухо запрещая агенту пересматривать саму стратегию. А диагностический фреймворк MICA заранее вскрывает, где именно формат инструмента сбивает модель с толку.

Тестировали на базовых бенчмарках и CRM, но принцип универсален для любого AI-агента. Пишешь ты авто-разраба в Claude Code, крутишь интеграцию с базами или настраиваешь сложный тулчейн — выбор между CLI, MCP и голым API решит, справится агент или сольёт бюджет на токены. Запомни: формат инструмента — это скрытый системный промпт, который ты добавил, даже не заметив этого.

Короче: хватит надеяться, что умная модель сама разберётся с кривым ответом консоли. Внедряй двухшаговое разделение логики и синтаксиса, если не хочешь наблюдать, как из-за кривого дефиса перечёркивается вся работа. Кто не контролирует подачу инструментов агенту — получает полный провал сценария на ровном месте. Твой интерфейс либо держит агента в фокусе, либо активно помогает ему тупить.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с