Почему MCP - это кал.
MCP - это средство, с помощью которого ai harness может вызывать код, передавая ему параметры и получая от него результаты. e.g. MCP curl, который принимает url и возвращает контент по этому урлу (очень упрощенно, на суть не влияет). Что же с ними не так и почему я хейчу MCP?
1. Срет в контекст описаниями. Ещё прежде чем, как вызвать хоть какой нибудь MCP, llm должна знать какие есть и как их вызывать. Для этого ей в системный промпт добавляют все тулзы, их описания и входные схемы. Для примера, chrome-devtools MCP забирает 5k токенов только на свои описания. Возьмите несколько MCP, токенов будет еще больше.
Можно сказать, что под каждую задачу, можно включать отдельный набор MCP, но это никто не будет делать, llm должна сама разбираться, что ей нужно. Вместо того, чтобы дать возможность gradual discovery - хочешь найти тулзу, сначала найди, какие тебе могут помочь, мы вываливаем всегда весь список. И для основного агента и для сабагентов. Да и в разных агентах настройка доступных тулзов выглядит по разному.
2. Срет в контекст инпутами. Чтобы вызвать MCP, llm должна полность, буква за буквой корректно написать входные параметры, хоть они и представляют собой json, модели часто путаются и не попадают в схему, или в допустимые аргументы, или просто в валидный json, из-за чего им приходится писать весь инпут еще раз. Если вы хотите, чтобы llm проверила ссылки через curl MCP, она не может сделать аля bash-pipeline вида
extract links | xargs curl | jq '{url, code}'
Вместо этого, она будет вытаскивать каждую ссылку по очереди, каждую перепечатывать и передавать в MCP. Другой пример, когда llm приходится перепечатывать старый код, который и так есть в файле и в контексте, но edit MCP требует пару old_text/new_text.
3. Срет в контекст аутпутами. В примере с curl MCP выше, модель получит в контекст весь высер страницы: код, хедеры, страницу, хотя ей нужен только код ответа и ничего более. Учитывая, что аутпут MCP полностью попадет в контекст, его нет возможности ни отфильтровать, ни ограничить, его приходится ограничивать на уровне тулзы: не более 5 результатов, пагинация с макс. размером страницы 10 и т.д. Это мало того, что дает неиспользуемый контекст, так еще и заставляет вызывать MCP несколько раз для каждой страницы. А вывод MCP нельзя направить в файл, чтобы пост процессить всякими тулзами типо sed/awk/tail/etc, только полностью читать от и до и платить за это токенами.
4. Следствие из 2 и 3 - MCP не композируемы. Они берут текст на входе, отдают текст на выходе. НО! Этот текст обязан быть порожден llm и скормлен будет также llm. Знаете UNIX тулзы, которые могут брать текст из файла, из других процессов, сохранять в файлы, передавать в другие процессы? Ничего такого для MCP не предполагается. Из-за чего в качестве "решений" предлагаются context-mode/codemode/etc. По сути пересоздавая экосистему для работы с командами/тулзами, только напарываясь на грабли, которые давным давно уже были решены.
5. Вспоминая про UNIX, программы должны работать над одним универсальным протоколом, чтобы взаимодействовать друг с другом. Этот протокол - текст. Отдельный вопрос, насколько этот формат хорош, но для llm вполне годится. Использовать же MCP с классическими тулзами нельзя. Как и классические тулзы с MCP. Никакой мотивации для этого нет, Bash тула достаточно, чтобы вызывать любую CLI и пайпить их как угодно куда угодно.
Вывода не будет, думайте, подписаться.