ПланФакт через API и MCP: 187 действий, конверт isSuccess вместо HTTP-кодов и почему это не банк
Разбираем API ПланФакта изнутри: операции, счета, статьи, контрагенты, проекты, юрлица, сделки, счета на оплату, товары, бюджеты и отчёты ДДС/ОПиУ вашего аккаунта — почему бизнес-отказ приходит HTTP 200, чем финучёт отличается от банка и как всё это доступно через MCP-сервер Mira без единой строки кода.
Обзор
ПланФакт — не банк и не касса. Это сервис финансового УЧЁТА: он хранит то, что уже случилось (или запланировано) в вашем банке или кассе — счета, контрагентов, статьи, проекты, юрлица и сами операции (поступления, списания, перемещения, начисления), — и строит поверх этого отчёты ДДС и ОПиУ. Через его 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-серверы»
1С через OData: как достать данные учётной базы без единой строки кода на встроенном языке
Разбираем стандартный OData-интерфейс 1С:Предприятие: чем он отличается от API конкретного сервиса, как узнать, что вообще опубликовано на конкретной базе, как проводить и отменять проведение документов и как всё это работает через MCP-сервер Mira без единой строки кода на встроенном языке.
3 сентября 2026 г.CloudPayments через API и MCP: 32 метода, конверт отказа, который не отличает 400 от отклонённой карты, и Public ID, который просят дважды
Разбираем API CloudPayments изнутри: платежи, выплаты, подписки и счета чужого магазина — не биллинг самой Миры, — почему списание по сохранённому токену считается расходом, а обычная оплата картой нет, зачем платёжной ссылке СБП собственный Public ID в теле запроса поверх Basic Auth, и как всё это доступно через MCP-сервер Mira без единой строки кода.
3 сентября 2026 г.Финтабло через API и MCP: 112 методов финучёта, семь путей без объявленных параметров и почему тут нет отчётов
Разбираем API Финтабло изнутри: 112 методов финансового учёта — ДДС, счета, контрагенты, сделки, зарплата, имущество, ОПиУ, — где спецификация поставщика сама не дописывает параметры пути, почему у четырёх PUT-запросов id дублируется в теле и куда делись отчёты. Всё доступно через MCP-сервер Mira без единой строки кода.
3 сентября 2026 г.