elba-mcp
MCP-сервер для Контур.Эльбы: ИИ-ассистент (Claude Code, Claude Desktop, Cursor и другие MCP-клиенты) находит или заводит клиента, выставляет счёт, акт или УПД, получает публичную ссылку на документ и следит за оплатами через публичный API Эльбы.
Неофициальный проект, с СКБ Контур не связан.
Установка
Нужен uv. Ключ API: Эльба → «Настройки и оплата» → «Настройки сервиса» → «API» → «Выпустить ключ».
Claude Code:
claude mcp add --scope user elba -e ELBA_API_KEY=ваш-ключ -- uvx elba-mcp
Claude Desktop и другие клиенты с JSON-настройкой:
{
"mcpServers": {
"elba": {
"command": "uvx",
"args": ["elba-mcp"],
"env": { "ELBA_API_KEY": "ваш-ключ" }
}
}
}
Из исходников — uv run --script elba_mcp.py (зависимости uv ставит сам по метаданным скрипта); ключ
тогда можно положить строкой ELBA_API_KEY=… в .env рядом с elba_mcp.py.
Работает на macOS, Linux и Windows; тесты в CI идут на всех трёх.
Настройки
| Переменная | Что задаёт |
|---|---|
ELBA_API_KEY |
ключ API, обязателен |
ELBA_ORG_ID |
организация, если по ключу их несколько; иначе берётся единственная |
ELBA_STATE_DIR |
каталог журнала счетов, по умолчанию ~/.local/state/elba-mcp |
Инструменты
| Инструмент | Что делает |
|---|---|
elba_organizations |
организации и банковские счета |
elba_templates |
шаблоны документов — template_id для счёта и акта |
elba_find_contractor |
поиск клиента по ИНН или названию |
elba_lookup_inn |
реквизиты организации или ИП по ИНН из ЕГРЮЛ/ЕГРИП ФНС (без ключа) |
elba_get_contractor, elba_create_contractor |
карточка клиента, новый клиент |
elba_create_bill |
счёт: позиции {name, price, quantity?, unit?}, без НДС по умолчанию; project — метка в журнале |
elba_repeat_bill |
новый счёт по образцу прошлого (ежемесячная поддержка) |
elba_get_bill |
счёт с суммой total и статусом оплаты |
elba_track_bill |
добавить в журнал счёт, выставленный не через сервер |
elba_unpaid |
неоплаченные счета из журнала со свежими статусами и общий долг |
elba_payment_news |
оплаты с прошлой проверки |
elba_report |
сводка: выставлено, оплачено, закрыто актами — всего, по проектам, за период |
elba_act_from_bill |
акт по счёту: позиции и клиент из счёта, основание «Счёт № от» |
elba_create_act |
акт с произвольными позициями |
elba_upd_from_bill |
УПД по счёту; счёт с НДС → со счётом-фактурой (статус 1), без НДС → статус 2 |
elba_create_upd |
УПД с произвольными позициями; при with_nds ставка nds_rate обязательна |
elba_document_link |
публичная ссылка с печатью, подписью и QR-оплатой — её отправляют клиенту |
elba_link_publish |
снять ссылку с публикации (отменённый счёт) или вернуть |
Банковский счёт подставляется сам, если открыт один; при нескольких открытых bank_account_id обязателен.
PDF через API Эльбы не скачать — клиент скачивает его по ссылке. Перед первым счётом сверьте текст
шаблона: шаблон-оферта может описывать не тот договор, что ваши услуги.
Журнал счетов
API Эльбы не отдаёт список счетов, только счёт по id, поэтому сервер ведёт журнал сам: каждый счёт из
elba_create_bill записывается туда с клиентом, суммой, проектом, ссылкой, актом и УПД. У каждой
организации свой файл journal-<id организации>.json. В журнале данные клиентов — храните его как
бухгалтерские документы.
- Защита от дублей: тому же клиенту на ту же сумму в пределах недели счёт не создаётся без
allow_duplicate=true; второй акт или УПД по одному счёту — тоже. Проверка и создание идут под общей блокировкой, так что параллельные сессии ассистента дубль не создадут. - Оплаты приходят из ленты новостей Эльбы. Первый вызов
elba_payment_newsтолько ставит отметку в конец ленты (у новостей нет дат, история не выводится), дальше — оплаты с прошлого вызова. elba_unpaidберёт оплаченную часть из всей ленты, статус — из Эльбы. Оплаченные и отменённые перечитываются, если лента с ними расходится; счёт, восстановленный из отменённых, —recheck_all=true. Долгnull, если какую-то сумму узнать не удалось.- Счета, выставленные в Эльбе вручную, в журнал не попадают сами —
elba_track_bill.
Сценарии
Готовые сценарии — MCP-промпты: в Claude Code они вызываются как /mcp__elba__<имя>, в других клиентах —
из меню промптов. Каждый ведёт ассистента по шагам с проверками и ничего не отправляет клиенту сам:
письма — только черновиками.
| Промпт | Что делает |
|---|---|
elba_invoice (клиент, работы, сумма) |
найти или завести клиента, показать счёт на подтверждение, выставить, ссылка, черновик письма |
elba_close_work (счёт, документ) |
акт или УПД по счёту, ссылка, черновик письма |
elba_remind_debtors (дней) |
что оплачено, кто должен дольше N дней, черновики напоминаний |
Без промптов — обычной фразой:
- «Выстави ООО Ромашка счёт на 40 000 за доработку сайта, проект romashka.ru, и подготовь письмо».
- «Что оплатили? Кто мне должен?» —
elba_payment_news,elba_unpaid. - «Счёт 114 оплачен — сделай акт и пришли ссылку» —
elba_act_from_bill,elba_document_link. - «Повтори счёт за поддержку на ноябрь» —
elba_repeat_billс новым названием позиции. - «Сколько выставлено и оплачено по romashka.ru в этом году?» —
elba_report. - «Счёт 120 отменили — сними ссылку» —
elba_link_publish.
Удобнее всего работать из проекта клиента: ассистент там знает, какие работы сделаны, и точнее пишет позиции счёта и письмо.
Без MCP, из шелла
uvx elba-mcp call elba_find_contractor args.json
args.json — аргументы инструмента, например {"inn": "<ИНН клиента>"}. Пригодится, когда сессия
ассистента запущена до подключения сервера.
Разработка
Тесты — на моке API, без сети и без ключа, журнал во временном каталоге:
uv run pytest -q
Релиз: поднять __version__ в elba_mcp.py, закоммитить и отправить тег vX.Y.Z — GitHub Actions
прогонит тесты и опубликует пакет на PyPI через Trusted Publishing.
Спецификация API: https://elba-api.kontur.ru/swagger/v1/swagger.json
Лицензия
MIT, см. LICENSE.
Metadata
Release files for elba-mcp 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| elba_mcp-0.1.1.tar.gz | 26.7 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| elba_mcp-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 46.7 kB
Release files / elba_mcp-0.1.1.tar.gz
| Download URL | elba_mcp-0.1.1.tar.gz |
|---|---|
| Size | 26.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c5cc974a470f60da7294c8ecfa94643e1a2b37f45d2219becdda5a672a98459c
|
|
BLAKE2b-256 checksum How to use checksums |
5de72ab5c3d2f2aa668516cfaf2f4f3d08406068e063c1a99e1caf753753139e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / elba_mcp-0.1.1-py3-none-any.whl
| Download URL | elba_mcp-0.1.1-py3-none-any.whl |
|---|---|
| Size | 20.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b2ca9ff0435487183d3a7023fb260ab60fa9eab95b1e1f06f44a4ad7dbb3e510
|
|
BLAKE2b-256 checksum How to use checksums |
77c77e369cb153c1727c75ad2f330df35e5165736dd29751d61d688985b132d2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for elba-mcp 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.