Любая LLM при работе с таблицами склонна «додумывать» цифры: она не говорит «не знаю», а достраивает правдоподобное продолжение токен за токеном. Прямая передача CSV с просьбой посчитать почти всегда приводит к галлюцинациям. Команда разработчиков решила эту проблему, создав MCP-сервер, который заставляет Claude Desktop использовать внешние инструменты для вычислений, а не полагаться на внутреннее «воображение».

Опрашивая Claude Desktop напрямую, разработчики выяснили, как модель справляется с большими датасетами. Она использует три переносимые техники: во-первых, выполняет арифметику и агрегации через движок DuckDB, а не «в уме»; во-вторых, аналитику, которую нельзя выразить в SQL, выносит в Python в песочнице; в-третьих, описывает схему данных, чтобы не гадать, что внутри колонок. Эти принципы легли в основу собственного MCP-сервера: фронтенд на Next.js (ИИ-sdk), бэкенд на FastMCP, под капотом DuckDB.

Главная защита от галлюцинаций — запрет на вычисления внутри модели. Она пишет SQL, который выполняет DuckDB — встраиваемый OLAP-движок, читающий CSV, Parquet и JSON напрямую. Все запросы проходят через гейт validate_read_only(), который блокирует INSERT, UPDATE, DELETE и другие мутирующие операции, а также опасные функции вроде glob() и sqlite_scan(). Подключение к данным всегда READ_ONLY и in-memory: данные поднимаются в память только на время запроса. Конфигурация DuckDB фиксируется вызовом lock_configuration=true, а загрузка расширений отключена.

Авторы опросили Claude Desktop и выяснили его внутренние правила работы с данными

Даже на честно посчитанных данных модель может ошибиться, если вывод слишком велик. Поэтому сервер усекает результаты до 200 строк и прикрепляет предупреждение: «WARNING: показаны 200 из 5000 строк. Агрегации по этому выводу будут неверны — используйте SQL-агрегацию». Без этой строки модель часто пытается агрегировать фрагмент, выдавая ложные итоги. Разработчики признают, что проблемы остаются, но подход делает их решаемыми.