MCP-серверыMCP-серверыPlanFact APIФинансовая аналитика

ПланФакт через API и MCP: 187 действий, конверт isSuccess вместо HTTP-кодов и почему это не банк

Разбираем API ПланФакта изнутри: операции, счета, статьи, контрагенты, проекты, юрлица, сделки, счета на оплату, товары, бюджеты и отчёты ДДС/ОПиУ вашего аккаунта — почему бизнес-отказ приходит HTTP 200, чем финучёт отличается от банка и как всё это доступно через MCP-сервер Mira без единой строки кода.

3 сентября 2026 г.5 мин чтения

Обзор

ПланФакт — не банк и не касса. Это сервис финансового УЧЁТА: он хранит то, что уже случилось (или запланировано) в вашем банке или кассе — счета, контрагентов, статьи, проекты, юрлица и сами операции (поступления, списания, перемещения, начисления), — и строит поверх этого отчёты ДДС и ОПиУ. Через его API нельзя провести настоящий платёж, только записать в учёте то, что провёл банк.

Mira подключает 187 действий из 189 в спецификации поставщика и отдаёт их в Claude через MCP — по ключу API, который выпускается в личном кабинете самим владельцем аккаунта, без похода за отдельным одобрением. Это весь API ПланФакта: не выборка «нужных» разделов, а покрытие целиком — не входят только два метода, у которых в спецификации в принципе нет объявленной JSON-схемы тела (см. «Единственное настоящее исключение» ниже).

Что доступно

Раздел Действий Что даёт
Операции 29 поступление, списание, перемещение, начисление, отгрузка, поставка; исходные поля; слияние/разъединение/смена типа
Сделки 26 закупки и продажи, позиции (товары/услуги) в них, привязка операций
Контрагенты 16 контрагенты и группы, с вычислениями кредиторки/дебиторки
Показатели ПРО 14 остатки, денежный поток, прибыль, рентабельность — платный уровень тарифа
Проекты 11 проекты и группы проектов
Счета на оплату 10 выставление счетов покупателям, их файлы
Быстрые фильтры 10 сохранённые представления фильтров интерфейса
Юрлица 8 компании, их файлы и используемые валюты
Счета 9 счета и группы счетов
Товары 7 товары/услуги и их единицы измерения
Группы товаров 6 группировка товарного каталога
Статьи 6 учётные статьи — категории доходов и расходов
Бюджеты 6 планирование доходов и расходов
Отчёты 4 ДДС и ОПиУ, детализация трендов к ним
Статусы сделок 4 пользовательские статусы сделок/операций
Исторические сводки 5 по счетам, статьям, проектам, контрагентам
Шаблоны счетов 3 нумерация и шаблоны счетов на оплату
Валюты 2 справочник, история курса
Настройки бюджета 2 отображение план/факт
История изменений 2 кто и когда менял сущность
Вложения 2 чтение и удаление (создание — только через веб-интерфейс, см. ниже)
Баланс 1 табличная форма баланса
Дашборд 1 остатки на счетах
Логи импорта 1 список импортов данных
Документы 1 ссылка на прикреплённый документ
Журнал действий 1 кто и когда что делал в аккаунте

Отказ приходит HTTP 200 — и это не опечатка

У большинства коннекторов бизнес-отказ («счёт не найден», «нельзя удалить контрагента с операциями») — это HTTP-код 4xx. У ПланФакта — нет. Сверено по официальной спецификации построчно: у любой из 189 операций объявлено ровно четыре кода — 200, 401, 403, 500. Всё остальное — а поставщик знает больше 150 разных бизнес-кодов ошибок — приходит HTTP 200 с телом:

{"data": null, "isSuccess": false,
 "errorMessage": "Счёт не найден", "errorCode": "AccountAccessDenied"}

Проверка только resp.status_code эту ошибку не поймает вовсе. Разбор ответа обязан читать isSuccess у КАЖДОГО ответа 200 — иначе отказ прошёл бы за успех, а данные из пустого data выдались бы за настоящие.

Единственное настоящее исключение — 2 операции из 189

Сначала коннектор покрывал не весь API, а выборку разделов «по смыслу задачи» — операции, счета, контрагенты, отчёты и так далее, 83 действия из 189. У этого подхода есть цена: сделки, счета на оплату, товары и бюджеты — не экзотика, а обычные данные учёта у части бизнесов, и «не входит в контракт» для них означало бы просто «спросите нас позже». Поэтому периметр расширен до полного API: 187 действий, все разделы спецификации, включая сделки (закупки и продажи), их привязку к операциям, счета на оплату, товарный каталог, бюджеты и даже платный уровень «Показатели ПРО» — он читается, если он есть у аккаунта, а если нет — откажет сам ПланФакт, не коннектор.

Не попали ровно два метода — POST и PUT создания/изменения вложения (EntityAttachments). У обоих в спецификации ПУСТАЯ схема тела: по тексту описания это multipart/form-data (файл плюс два поля), а не JSON, и все 187 вызовов этого коннектора, как и у остальных источников Mira, уходят JSON-ом. Действие, которое не может сработать НИ РАЗУ без переделки самого механизма вызова, хуже своего отсутствия — оно обещает то, чего дать не может. Чтение и удаление вложения работают: файла в их теле нет.

Отдельно решён старый тупик с отгрузкой и поставкой: у обеих dealId в теле обязателен — раньше это значило «нельзя завести, сделки вне периметра», теперь сделки в периметре сами, и dealId — обычное поле уже существующей сделки.

Барьер без «тратит»

У коннекторов реальных платёжных сервисов барьер записи различает «просто меняет» и «ещё и тратит деньги» — возврат или выплата у ЮKassa, например. У ПланФакта такого различия нет и быть не может: это учёт, а не касса. 80 действий (создание, изменение, удаление любой сущности — счёта, сделки, товара, бюджета, быстрого фильтра) стоят под барьером «меняет», а флага «тратит» просто нет — он был бы всегда False и не нёс бы смысла. Поисковые и сводные запросы, даже оформленные как POST (список сделок с фильтром, расчёт периода быстрого фильтра, «Показатели ПРО»), под барьер не попадают — HTTP-метод сам по себе барьер не определяет, определяет смысл действия.

PUT заменяет сущность целиком

Документация ПланФакта отдельно предупреждает: метод PUT не патчит поля, а заменяет сущность целиком — не переданное поле сбрасывается, а не остаётся прежним. Пример из самой документации: если при обновлении проекта не передать projectGroupId, проект молча уедет в «Проекты без группы». Это не наша особенность, а прямая цитата поставщика, и коннектор несёт её текстом в подсказке к каждому такому действию — до похода к API, а не после сюрприза.

Живая проверка

Живых ключей от боевого аккаунта нет — раздел появится, когда владелец аккаунта их даст. Разбор адреса и query-параметров, барьер записи, заголовок X-ApiKey и разбор конверта isSuccess проверены против собственного HTTP-сервера в тестах (перехват на транспорте — тот же приём, что у Авито, Ozon Performance и ЮKassa), а не против api.planfact.io.

Новости в Telegram

Подпишитесь на каналы — новые статьи и обзоры каждый день.

Источники

Ещё по теме «MCP-серверы»

MCP-серверы

1С через OData: как достать данные учётной базы без единой строки кода на встроенном языке

Разбираем стандартный OData-интерфейс 1С:Предприятие: чем он отличается от API конкретного сервиса, как узнать, что вообще опубликовано на конкретной базе, как проводить и отменять проведение документов и как всё это работает через MCP-сервер Mira без единой строки кода на встроенном языке.

3 сентября 2026 г.
MCP-серверы

CloudPayments через API и MCP: 32 метода, конверт отказа, который не отличает 400 от отклонённой карты, и Public ID, который просят дважды

Разбираем API CloudPayments изнутри: платежи, выплаты, подписки и счета чужого магазина — не биллинг самой Миры, — почему списание по сохранённому токену считается расходом, а обычная оплата картой нет, зачем платёжной ссылке СБП собственный Public ID в теле запроса поверх Basic Auth, и как всё это доступно через MCP-сервер Mira без единой строки кода.

3 сентября 2026 г.
MCP-серверы

Финтабло через API и MCP: 112 методов финучёта, семь путей без объявленных параметров и почему тут нет отчётов

Разбираем API Финтабло изнутри: 112 методов финансового учёта — ДДС, счета, контрагенты, сделки, зарплата, имущество, ОПиУ, — где спецификация поставщика сама не дописывает параметры пути, почему у четырёх PUT-запросов id дублируется в теле и куда делись отчёты. Всё доступно через MCP-сервер Mira без единой строки кода.

3 сентября 2026 г.