Observed since 20 Oct, 18:26 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
1c-odata-mcp
MCP server for 1C (1С:Предприятие) via the standard OData interface. High-level tools for executives and accountants: read by default, with opt-in (gated) write.
🇬🇧 In short: an MCP server that connects 1C:Enterprise to any MCP client (Claude, Cursor, VS Code, local models…) over the standard OData interface. Ask your accounting database in plain language (debtors, sales, taxes, cash flow, account turnover, document postings) and get the number back; opt-in, preview-gated write. Read-only by default. Run with
npx -y 1c-odata-mcp. Works with any 1C where OData is published — cloud, SQL or local file base.
MCP-сервер (Model Context Protocol) для 1С:Предприятие через стандартный интерфейс OData. Позволяет работать с данными 1С на естественном языке из любого MCP-клиента — Claude, Cursor, VS Code, JetBrains, локальные модели (Ollama, LM Studio): спрашивать про контрагентов, документы, остатки, дебиторку, продажи, движение денег, ОСВ и проводки — а при явном включении ещё и создавать/изменять справочники и документы, проводить, регистрировать оплаты.
Если вы искали, как подключить 1С к нейросети / ИИ, готовый коннектор 1С OData или интеграцию 1С с Claude без программирования на стороне 1С — это оно.
npx -y 1c-odata-mcp📘 Установка, публикация OData и подключение к Claude — пошагово в docs/CONNECTING.md. Здесь — про сам проект, возможности и ограничения.
Коннектор общается с 1С только через OData. Если он включён — всё работает одинаково, как бы ни была развёрнута ваша база:
| Ваша 1С | Что нужно, чтобы заработало | Сложность |
|---|---|---|
| Облако / хостинг (Scloud, 1cFresh, аренда 1С) | OData включает провайдер — галочкой в кабинете или по заявке | 🟢 низкая |
| Сервер с SQL (PostgreSQL / MS SQL) | опубликовать базу на Apache/IIS + включить OData | 🟡 средняя |
Локальная файловая база (.1CD) | то же + выдать веб-серверу права на папку базы | 🟡 средняя |
| Нет веб-сервера / доступа к конфигуратору | OData недоступен → нужен другой транспорт | 🔴 |
Тип хранилища (файловая или SQL) сам по себе сложность не меняет — важно лишь, поднята ли веб-публикация OData. Без включённого OData коннектор работать не может (он не использует COM и не лезет в SQL напрямую).
➡️ Пошаговая инструкция под каждый вариант — в docs/ODATA-SETUP.md. Адрес базы, учётка и подключение к Claude — в docs/CONNECTING.md.
Сырой OData 1С — это сотни технических EntitySet с кириллическими именами (Catalog_Контрагенты, Document_РеализацияТоваровУслуг, AccumulationRegister_ТоварыНаСкладах) и GUID-ключами. Работать с этим из чата невозможно, а писать свой код под каждый отчёт долго.
Сервер прячет всю технику за понятными инструментами. Вы спрашиваете обычным языком — ИИ сам выбирает нужный инструмент, ходит в OData вашей базы и возвращает готовый ответ. Для руководителя — быстрый срез по бизнесу, для бухгалтера — рутина создания документов под контролем.
Аналитика и чтение (по умолчанию):
Действия (при включённой записи, всегда с предпросмотром и подтверждением):
Читать можно документ любого типа (не только из списка выше) — «покажи возвраты за май», «найди перемещения» и т.п.
Полный перечень — в разделе Инструменты.
Ниже — Claude Desktop, но диалог выглядит так же в любом MCP-клиенте.
Вы: Кто из покупателей должен больше всего и на сколько?
Claude: (вызывает read.analytics.get_debtors) Топ дебиторов на сегодня:
1. ООО «Ромашка» — 1 240 500 ₽
2. ИП Иванов — 318 000 ₽
3. ООО «Берёзка» — 94 050 ₽
Всего по счёту 62: 1 800 000 ₽.
Вы: Заведи нового покупателя ООО «Восход», ИНН 7701234567, и выстави счёт на 10 шт по 2500.
Claude: (dry-run) Будут созданы:
• Контрагент «ООО Восход» (ИНН 7701234567)
• Счёт покупателю на 25 000 ₽ (10 × 2500)
Подтвердить создание?
Вы: Да
Claude: Готово: контрагент 00-000123, счёт № … (черновик, непроведён).
Впервые слышите про MCP? Это открытый протокол (Model Context Protocol), по которому ИИ-ассистент подключается к внешним инструментам. Здесь инструмент — ваша 1С: ассистент сам вызывает нужные функции и возвращает ответ. Ничего программировать не нужно — три шага ниже.
Опубликуйте OData в 1С и добавьте нужные объекты в «Состав» (подробно — docs/CONNECTING.md; если OData ещё не включён — docs/ODATA-SETUP.md).
Пропишите сервер в Claude Desktop (claude_desktop_config.json), подставив адрес и учётные данные:
{
"mcpServers": {
"1c-odata": {
"command": "npx",
"args": ["-y", "1c-odata-mcp"],
"env": {
"ODATA_BASE_URL": "https://<сервер>/<база>/odata/standard.odata/",
"ODATA_USERNAME": "...",
"ODATA_PASSWORD": "..."
}
}
}
}
Перезапустите Claude Desktop (полностью) и спросите: «проверь соединение с 1С».
Полная настройка (адрес OData по площадкам, авторизация, запуск из исходников, Claude Code, диагностика ошибок) — в docs/CONNECTING.md.
60 инструментов (24 чтение/аналитика + 36 записей). У всех есть необязательный параметр database (какая база 1С — см. read.system.list_databases); у аналитических — ещё и organization (фильтр по юрлицу — см. read.system.list_organizations).
Чтение и аналитика:
| Инструмент | Что делает |
|---|---|
read.system.list_databases / read.system.list_organizations | Список баз / организаций (для параметров database / organization) |
read.organization.get_organization_card | Карточка организации: ИНН/КПП/ОГРН, ОКВЭД, налоговый орган, адреса, банковский счёт, директор и главный бухгалтер |
read.schema.list_entities / read.schema.describe_entity | Карта объектов базы и поля конкретного объекта (из $metadata) |
read.counterparty.find_counterparty / read.counterparty.get_counterparty | Поиск контрагента (по названию/ИНН) и его карточка |
read.document.search_documents / read.document.get_document | Поиск документов и документ с табличной частью |
read.analytics.get_debtors / read.analytics.get_inventory | Дебиторка (сч. 62) / остатки товаров (сч. 41/10/43), можно на дату в прошлом (asOf) |
read.accounting.get_account_turnover | ОСВ по счёту за период (51, 60, 90.01…): сальдо на начало/конец и обороты Дт/Кт, итогом и по субсчетам |
read.accounting.get_document_postings | Проводки одного документа (любого Document_*) из регистра Хозрасчетный: Дт/Кт с кодами счетов и субконто, суммы, итоги и свод по корреспонденциям. Пример: {"documentEntity": "Document_РегламентнаяОперация", "documentRef": "919a75d1-7f6a-11f1-86c3-74563c4bf0d1"} |
read.audit.get_document_history | Хронология документа для аудита: учётная дата (documentDate) отдельно от метки генерации Ref_Key из UUIDv1 (refCreatedAt, derived), ответственный, DataVersion как есть, наличие движений в Хозрасчетном, evidence и limitations. Фактическое время выполнения/изменения через стандартный OData недоступно — не возвращается |
read.analytics.get_sales / read.analytics.get_cashflow | Продажи за период / движение денег (банк + касса) |
read.analytics.get_sales_breakdown / read.analytics.get_purchases_breakdown | Продажи/закупки с разбивкой по контрагенту, месяцу, договору, категории (ИП/ЮрЛицо/…) |
read.analytics.get_payments_breakdown | Приход/расход по виду операции, месяцу, контрагенту, статье ДДС — «сколько заплатили ИП за год», «проценты по депозиту» |
read.analytics.get_taxes_paid | Уплаченные налоги и взносы за период, с разбивкой по виду налога |
read.analytics.get_deal_history | Хронология движений по сделке (код в назначении платежа) или договору |
read.counterparty.get_customer_history / read.counterparty.get_supplier_history | История взаиморасчётов с покупателем / поставщиком |
read.system.health_check | Проверка соединения и авторизации |
Запись (✍️ требует включения, работает через dry-run → confirm=true):
| Инструмент | Что делает |
|---|---|
write.counterparty.create_counterparty | Контрагент (+ телефон/email/адрес/ОГРН) |
write.counterparty.create_bank_account / write.counterparty.create_contact_person | Расчётный счёт (банк по БИК) / контактное лицо (директор) |
write.catalog.create_nomenclature | Номенклатура (папка, артикул, признак услуги) |
write.catalog.create_contract | Договор (вид, номер, валюта, тип цен, руководитель контрагента) |
write.sales.create_invoice / write.purchase.create_supplier_invoice | Счёт покупателю / счёт на оплату поставщика (непроведёнными) |
write.purchase.create_purchase / write.sales.create_shipment | Поступление от поставщика / реализация покупателю |
write.warehouse.create_return_from_customer / write.warehouse.create_return_to_supplier | Возврат товаров от покупателя / поставщику |
write.warehouse.create_transfer | Перемещение товаров между складами |
write.warehouse.create_surplus / write.warehouse.create_writeoff | Оприходование / списание товаров |
write.warehouse.create_inventory | Инвентаризация товаров на складе |
write.sales.create_act | Реализация услуг (акт) |
write.sales.create_services_act | Акт об оказании услуг (доходы/расходы по номенклатурной группе) |
write.money.create_payment / write.money.create_payout_order | Оплата от покупателя (поступление на р/с) / платёжное поручение |
write.money.create_bank_writeoff | Списание с расчётного счёта (исходящий платёж, вид операции обязателен) |
write.money.create_cash_receipt / write.money.create_cash_payment | Приходный / расходный кассовый ордер (ПКО / РКО) |
write.sales.create_issued_invoice / write.purchase.create_received_invoice | Счёт-фактура выданный / полученный (на основании реализации / поступления) |
write.entity.create_folder / write.entity.move_to_folder | Папка (группа) справочника / перемещение в папку |
write.counterparty.update_counterparty / write.catalog.update_nomenclature / write.entity.update_entity | Изменение реквизитов (PATCH) |
write.document.copy_document | Документ по образцу существующего — со всеми реквизитами |
write.document.update_document_lines / write.document.add_document_line / write.document.remove_document_line | Редактирование строк документа |
write.document.post_document | Провести / отменить проведение (1С формирует проводки) |
write.operation.status | Статус операции записи по operationId; после таймаута сверяет с 1С (созданный объект — по назначенному Ref_Key, правку строк — по числу строк) и снимает блокировку повтора |
write.entity.mark_for_deletion | Пометить на удаление / снять пометку (мягкое удаление) |
Все инструменты проверены на живой базе 1С:Бухгалтерия предприятия 3.0.
Строки документов продажи и закупки принимают:
content — реквизит «Содержание». Именно этот текст печатается в счёте и УПД
(«Услуги согласно приложению № 4 от 01.10.2025 г. к договору № 87 … за июль 2026 г.»).
Сама 1С его не заполняет, так что для услуг задавайте явно.
incomeAccount / expenseAccount — счета доходов и расходов кодом как в 1С
(90.01.2, 90.02.2) или через Ref_Key. Их же можно задать на весь документ.
Приоритет: строка → документ → регистр «Счета учёта номенклатуры» → 90.01.1 / 90.02.1.
Счета применимы к продажным документам; счёт на оплату и поступление их не используют.
orgBankAccount (счёт покупателю, реализация, акт) — банковский счёт организации,
который печатается как реквизиты для оплаты: название, номер счёта или Ref_Key.
Без указания берётся основной счёт организации.
write.document.add_document_line и remove_document_line пересобирают табличную часть,
сохраняя реквизиты прежних строк — содержание, счета учёта, номенклатурную группу.
update_document_lines заменяет строки целиком, поэтому там их задают заново.
Строки пишутся в ту табличную часть, которая у документа заполнена: у акта услуг это
«Услуги», у товарного документа — «Товары».
Ежемесячно повторяющиеся документы проще выставлять через
write.document.copy_document: он берёт прошлый документ за образец и переносит все
реквизиты, включая те, которых нет в схемах create_* — банковский счёт, ответственного,
адрес доставки, доп. условия счёта. Меняются датой (date), реквизитами шапки (fields)
и правками строк по номеру (lines). Счета расчётов копия берёт из исходного документа;
если в fields сменить договор — по настройке нового договора.
Счета расчётов с контрагентом (62, 60, 76…) сервер берёт из настройки в 1С — регистра «Счета учёта расчётов с контрагентами»: сначала настройка договора, затем контрагента, организации и общая, с учётом валюты договора. Предпросмотр пишет, откуда взят счёт. Если регистр не опубликован в OData — стандартные 62.01/62.02 и 60.01/60.02.
Другой план счетов или виды операций. ODATA_ACCOUNTING_CONFIG и
ODATA_DB_<ИМЯ>_ACCOUNTING_CONFIG задают план счетов, регистр бухгалтерии, коды счетов по
умолчанию, аналитические префиксы и виды операций акта и оплаты. Без настройки сохраняются
прежние значения БП РФ. Параметры, приоритеты и синтетический пример для Беларуси —
Настройка учёта.
По умолчанию сервер работает только на чтение. Запись включается осознанно, через два независимых предохранителя:
READ_ONLY=false.ODATA_DB_<ИМЯ>_WRITABLE=true — базы без него остаются read-only даже при снятом глобальном. Так можно открыть запись в одну базу (напр. ИП) и защитить другие (напр. ООО).Дополнительно при записи:
operationId; для записи передайте этот же id и те же аргументы вместе с confirm=true. При сетевой ошибке повторяйте подтверждение с тем же id, не запускайте новый предпросмотр;write.operation.status: создаваемому объекту MCP сам назначает Ref_Key (UUIDv1, назначается при предпросмотре), поэтому повтор с той же ссылкой 1С отвергает на уровне уникального индекса, а после таймаута объект находится простым GET — и для документов, и для справочников. Правка строк документа сверяется по числу строк. По желанию в «Комментарий» документов можно дописывать видимую метку [op:<operationId>] (ODATA_WRITE_OPERATION_MARKER=true);contractRef не указан, а у контрагента ровно один подходящий договор (вид «с покупателем»/«с поставщиком», та же организация), он подставляется, как в форме 1С; иначе предпросмотр предупреждает: без договора 1С документ не проведёт;write.entity.mark_for_deletion ставит пометку (как в 1С); жёсткого DELETE нет;Приватность данных. Сервер — локальный процесс на вашей машине: он ходит только в вашу базу 1С (по Basic-аутентификации) и отдаёт данные вашему MCP-клиенту. Никаких сторонних серверов проекта в цепочке нет. Если использовать локальную модель (Ollama, LM Studio), данные 1С вообще не покидают вашу сеть. Секреты — только из .env (или блока env конфига); пароль и заголовок авторизации в логи не попадают.
Журнал защиты от повторной записи хранится локально в ~/.1c-odata-mcp/write-journal (путь можно изменить через ODATA_WRITE_JOURNAL_DIR). В нём нет полного payload: сохраняются hash запроса, статус операции и ограниченная сводка результата (Ref_Key, Code, Number). Успешные, отклонённые и неподтверждённые предпросмотры удаляются через 90 дней; операции с неизвестным результатом хранятся год (раньше удалять нельзя: это разрешило бы опасный повтор). Раз в час чистятся и служебные файлы: зависшие .tmp и «осиротевшие» .lock. В Docker смонтируйте каталог журнала на том (ODATA_WRITE_JOURNAL_DIR), иначе защита теряется вместе с контейнером.
Как именно включить запись — docs/CONNECTING.md → Включение записи.
Это разные случаи:
database. Настройка в .env — см. docs/CONNECTING.md. Пример запроса: «сравни выручку buh и torg за май».organization. Пример: «остатки по организации Ромашка».Стоит знать заранее:
$metadata; план счетов, коды счетов по умолчанию и виды операций акта и оплаты для другой конфигурации (например, белорусской) задаются настройкой — см. Настройка учёта. На УТ/ERP и самописных конфигурациях чтение справочников/документов работает, а бухгалтерская аналитика и запись документов требуют проверки на копии базы.write.document.post_document или вручную) — сервер не «рисует» проводки напрямую.read.document.search_documents/read.document.get_document) можно.create_payment, create_bank_writeoff, ПКО/РКО). Счета расчётов и сумма взаиморасчётов ставятся в строки расшифровки платежа, шапка не заполняется — как в документах из 1С. Проводки по расчётам 1С формирует только при заполненной сумме взаиморасчётов — иначе проводит документ молча и без проводок. Для договора в рублях сервер заполняет её сам (= сумме платежа, курс 1); для договора в валюте или у.е. курс не угадывается — укажите его в 1С до проведения, предпросмотр об этом напомнит.ODATA_PAGE_SIZE / ODATA_MAX_ROWS); большие выборки усекаются с пометкой.Локальный процесс на Node.js, общается с клиентом по протоколу MCP через stdio, а с 1С — по HTTP к OData (Basic-аутентификация). Стек: Node.js 20+, TypeScript (strict), официальный @modelcontextprotocol/sdk, нативный fetch, zod (валидация), pino (логи в stderr), fast-xml-parser (разбор $metadata).
Карта объектов строится автоматически из $metadata базы и кешируется; запросы собираются типобезопасным билдером. Несколько баз — у каждой свой клиент и свой кеш метаданных.
src/
index.ts точка входа
context.ts реестр баз: Connection (клиент + кеш $metadata) + ServerContext
mcp/server.ts инициализация MCP SDK, регистрация инструментов, stdio
odata/ клиент, билдер запросов, пагинация, разбор $metadata, аналитика,
справочные резолверы, обработка ошибок, проверка публикации
tools/ инструменты: meta, counterparties, documents, registers, cashflow,
sales, organization, write
config/ конфигурация (.env, мультибаза) и маппинг имён/счетов
types/ типы OData и доменные типы
+ vs %20 в OData 1С. 1С не декодирует + в пробел внутри $filter (отвечает 400), поэтому query-string собирается через encodeURIComponent (пробел → %20), а не URLSearchParams.stdout занят JSON-RPC, поэтому логи идут в stderr — но только в терминале. Под MCP-клиентом (когда stdin — pipe) логи пишутся в файл <tmpdir>/1c-odata-mcp/server.log, чтобы не сломать клиентов, трактующих любой вывод в stderr как фатальную ошибку. Вернуть логи в stderr: MCP_LOG_STDERR=1.outputSchema — клиенты, поддерживающие structuredContent (не только текстовый JSON), могут типизировать ответ, не парсить текст.dot-notation: <read|write>.<категория>.<имя> (напр. read.analytics.get_debtors, write.sales.create_shipment) — группирует инструменты по категории и сразу видно, чтение это или запись.MCP-клиент «висит» / запрос отваливается по таймауту.
Если зависают даже мелкие вызовы (read.system.health_check, read.system.list_databases) — это почти всегда залипший процесс MCP (в Claude Desktop лечится полным перезапуском приложения, Cmd+Q и заново), а не база. Здоровый read.system.health_check отвечает за секунду.
Указываю другую базу, а она «недоступна» / отвечает только одна.
Параметр database — это имя из read.system.list_databases (поле name, напр. ooo), а не «человеческое» название (label, напр. «ООО Ромашка»). Обращайтесь по имени.
Ответ пустой / «объектов 0». Не настроен Состав OData — добавьте нужные объекты в 1С (см. docs/ODATA-SETUP.md и docs/CONNECTING.md).
Работает медленно. Это латентность вашей 1С / хостинга, не Claude: годовые выборки на «шумных» базах бывают 10–30 секунд. Спрашивайте более узким периодом (квартал/месяц) — ответ приходит за секунды.
Нужен ли доступ к SQL базы или COM? Нет. Сервер использует только OData — ничего не ставится внутри 1С, в SQL напрямую он не лезет.
Безопасно ли пускать ИИ к боевой базе? По умолчанию — только чтение. Запись включается двумя независимыми флагами и работает через предпросмотр (dry-run) с подтверждением. Физического удаления нет (только пометка). См. Безопасность.
Какая 1С подойдёт? Любая, где включён OData — облако (Scloud/1cFresh), сервер с SQL или локальная файловая база. Пошагово под каждый случай — docs/ODATA-SETUP.md.
copy_document, «Содержание» в строках, явные счета доходов/расходов, выбор
банковского счёта организации, отдельный класс ошибок ввода. И, что ценнее всего,
найденные на живой базе баги, которые юнит-тестами не ловятся: правка строк акта
уходила мимо его табличной части, а подбор банковского счёта был сломан молча.operationId, issue #29, PR #30), а также правка
числа инструментов в описании пакета (PR #28); настраиваемый план счетов и виды операций
документов для конфигураций, отличных от БП РФ (PR #41).get_account_turnover), проводки документа (get_document_postings) и
хронология документа для аудита (get_document_history, PR #31).Нашли ошибку или не хватает документа — issue и PR приветствуются. Особенно ценны находки на реальных базах: конфигурации 1С различаются, и то, что работает на одной, на другой отвечает 500-й.
MIT. Проект открытый — пользуйтесь, форкайте, присылайте issue и PR: https://github.com/evilbruce666/1c-odata-mcp.
⭐ Если коннектор оказался полезен — поставьте звезду на GitHub и расскажите в Discussions, какие вопросы задаёте своей 1С. Это лучшая мотивация развивать проект.
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
zodEnvironment{
"local_name": "zod",
"alias": false,
"peer_metadata": null
} | ^3.24.0 | runtime |
pinoEnvironment{
"local_name": "pino",
"alias": false,
"peer_metadata": null
} | ^10.3.1 | runtime |
fast-xml-parserEnvironment{
"local_name": "fast-xml-parser",
"alias": false,
"peer_metadata": null
} | ^5.9.0 | runtime |
@modelcontextprotocol/sdkEnvironment{
"local_name": "@modelcontextprotocol/sdk",
"alias": false,
"peer_metadata": null
} | ^1.12.0 | runtime |
eslintEnvironment{
"local_name": "eslint",
"alias": false,
"peer_metadata": null
} | ^10.5.0 | development |
vitestEnvironment{
"local_name": "vitest",
"alias": false,
"peer_metadata": null
} | ^4.1.9 | development |
prettierEnvironment{
"local_name": "prettier",
"alias": false,
"peer_metadata": null
} | ^3.8.4 | development |
@eslint/jsEnvironment{
"local_name": "@eslint/js",
"alias": false,
"peer_metadata": null
} | ^10.0.1 | development |
typescriptEnvironment{
"local_name": "typescript",
"alias": false,
"peer_metadata": null
} | ^6.0.3 | development |
@types/nodeEnvironment{
"local_name": "@types/node",
"alias": false,
"peer_metadata": null
} | ^25.9.3 | development |
typescript-eslintEnvironment{
"local_name": "typescript-eslint",
"alias": false,
"peer_metadata": null
} | ^8.61.1 | development |
eslint-config-prettierEnvironment{
"local_name": "eslint-config-prettier",
"alias": false,
"peer_metadata": null
} | ^10.1.8 | development |
Source distribution
{
"shasum": "0be5b665d424d019b76f3ac013657fa84bff1059",
"tarball": "https://registry.npmjs.org/1c-odata-mcp/-/1c-odata-mcp-0.1.4.tgz",
"fileCount": 74,
"integrity": "sha512-wpNg3TdQK4WmZG8m0BLCcVNDUQhFbclYR8WpwP5d7Ee27KNNA1qoce5EL/cUECGFBIqVMFe+9rwrCHcbTsyI1w==",
"signatures": [
{
"sig": "MEUCIQCYltNmUtiw8ZFaKTNazKKNt7Ey3pPVQaxAcqYtecE5PQIgWETEIVGmmKuK7mZEluqA0gbzXkFUUCoJFHNksA9ujAQ=",
"keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"
}
],
"attestations": {
"url": "https://registry.npmjs.org/-/npm/v1/attestations/1c-odata-mcp@0.1.4",
"provenance": {
"predicateType": "https://slsa.dev/provenance/v1"
}
},
"unpackedSize": 316382
}Observed since 20 Oct, 18:26 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:9ecb1b7452c9d601d03bbfb5fef3868daa9db1e0ec13badf2e2cc272abb9ac5a