ZenMoney MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ZenMoney MCPhow much did I spend on groceries last month?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ZenMoney MCP
MCP-сервер для личных финансов ZenMoney: 28 инструментов (15 для чтения, 13 для изменения данных), локальный stdio и удалённый Streamable HTTP с OAuth. Финансовая логика находится в scripts/zenmoney/, MCP-адаптер — в zenmoney_mcp/.
Этот репозиторий содержит код, а не размещённый сервер. Для ChatGPT Web и Claude Web разверните собственный HTTPS endpoint и OAuth-провайдер. Один экземпляр рассчитан на одного владельца: он использует один токен ZenMoney и допускает один заданный OAuth subject.
Локальный запуск
Нужны Python 3.10+ и действующий API-токен ZenMoney. Передайте токен процессу через переменную окружения ZENMONEY_TOKEN из своего хранилища секретов. Не вводите его в аргументах командной строки и не сохраняйте в Git.
git clone https://github.com/theblackhaired/zenmoney-mcp.git
cd zenmoney-mcp
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python -m zenmoney_mcpНа Windows последняя команда — ..venv\Scripts\python.exe -m zenmoney_mcp. Укажите её и защищённую переменную ZENMONEY_TOKEN в настройках stdio MCP-клиента. Есть также точка входа run_stdio.py.
Необязательная ZENMONEY_STATE_DIR задаёт приватный каталог настроек (по умолчанию каталог данных текущего пользователя). Для period=billing_period добавьте туда config.json с параметром billing_period_start_day — целым числом от 1 до 31. Файл может содержать другие личные настройки и не должен попадать в репозиторий. check_auth_status проверяет токен без финансовой записи.
Related MCP server: Finance MCP Server
Инструменты
Полные схемы необязательных аргументов клиент получает через MCP tools/list. Таблицы показывают обязательные аргументы и назначение. Каждый инструмент изменения данных дополнительно требует confirm_write=true; инструменты чтения этого аргумента не требуют.
Чтение — finance:read
Инструмент | Обязательные аргументы | Результат |
get_accounts | — | Счета и текущие остатки |
get_transactions | Период или диапазон дат | Операции с фильтрами; limit до 500 |
get_categories | — | Дерево категорий |
get_instruments | — | Валюты и текущие курсы |
get_budgets | month (YYYY-MM) | Бюджеты месяца |
get_reminders | — | Напоминания и маркеры; marker_from и marker_to задаются вместе |
analyze_budget_detailed | period=billing_period | «Планы»: план/факт, календарь и прогноз остатка |
get_analytics | report=income, outcome или net; период/даты | Доходы, расходы или чистый результат |
get_category_report | Период или даты | Отчёт по категориям или получателям, сопоставление плана |
get_money_flow | Период или даты | Денежные потоки, доли, остаток и перерасход по валютам |
get_income_outcome_comparison | Период или даты | Сравнение с предыдущими периодами |
get_balance_trend | Период или даты | Восстановленная динамика остатков |
suggest | payee | Предложение категории и получателя |
get_merchants | — | Получатели, поиск и пагинация |
check_auth_status | — | Состояние доступа к ZenMoney |
Изменения — finance:read и finance:write
Инструмент | Обязательные аргументы помимо confirm_write | Действие |
setup_budget_mode | mode=balance_vs_expense или income_vs_expense | Локальное переопределение режима «Планов» |
create_transaction | type, amount, account_id | Расход, доход или перевод |
update_transaction | id | Меняет только переданные поля операции |
delete_transaction | id | Помечает операцию удалённой |
create_account | title, type, currency_id | Создаёт счёт |
create_budget | month, category | Создаёт или обновляет бюджет |
update_budget | month, category | Меняет существующий бюджет |
delete_budget | month, category | Обнуляет значения и снимает блокировки; не удаляет запись физически |
create_reminder | type, amount, account_id, interval | Повторяющееся напоминание с маркерами |
update_reminder | id | Меняет переданные поля напоминания |
delete_reminder | id | Удаляет напоминание и его маркеры |
create_reminder_marker | type, amount, account_id, date | Маркер на дату; при необходимости разовое напоминание |
delete_reminder_marker | id | Удаляет маркер |
Для type=transfer у create_transaction, create_reminder и create_reminder_marker нужен также to_account_id. amount должен быть положительным. В удалённом режиме scope finance:write проверяется сервером отдельно от confirm_write.
Периоды и формат ответа
get_transactions, get_analytics, get_category_report, get_money_flow, get_income_outcome_comparison и get_balance_trend принимают один способ выбора дат:
period=billing_period, week, month или year; period_offset сдвигает такой период;
start_date и end_date вместе, обе даты включаются.
Для week обязателен first_weekday от 0 (понедельник) до 6 (воскресенье). Для billing_period нужен billing_period_start_day в приватном config.json. analyze_budget_detailed принимает только billing_period.
Пример аргументов get_analytics:
{"report":"outcome","period":"month","period_offset":0,"response_mode":"full"}У объёмных инструментов чтения по умолчанию response_mode=compact. Он сокращает ответ для экономии контекста модели. Если данные усечены, ответ содержит _response.truncated=true: это не полный набор данных. Повторите вызов с response_mode=full, чтобы получить все поля и элементы. Ошибки возвращаются полностью.
Особенности расчётов
Вызов, которому нужны данные ZenMoney, получает свежий полный снимок /v8/diff/. Постоянного кэша операций и счетов нет; снимок остаётся в памяти только на время вызова. После записи сервер повторно проверяет результат в ZenMoney. Открытые ключи JWKS могут кратковременно кэшироваться — это не финансовые данные.
Переводы исключены из доходов и расходов get_analytics. Валюты по умолчанию разделены; скалярный итог смешанных валют выдаёт ошибку вместо неявного сложения.
Продвинутые отчёты используют текущие синхронизированные курсы ZenMoney, а не исторический курс на дату операции.
get_balance_trend восстанавливает прошлые остатки из текущих остатков и истории операций; готовых ежедневных снимков ZenMoney здесь нет.
Режим «Планов» и настройки переводов берутся из синхронизированного пользователя, кроме явных локальных переопределений. В режиме balance_vs_expense расчёт разниц использует difference_calculation_mode=NONE.
Фильтры аналитики по счёту, категории и получателю объединяются через AND. Неоднозначное короткое название категории бюджета вызывает ошибку; можно указать ID или полный путь.
report=turnover в get_analytics возвращает UNSUPPORTED_CALCULATION. В сравнении доходов и расходов AVERAGE_VALUES для периода до 31 дня фактически использует WHOLE_PERIOD, для более длинного периода возвращает UNSUPPORTED_CALCULATION.
Удалённый сервер и OAuth
Пример публичного endpoint: https://mcp.example.com/mcp. Приложение слушает 127.0.0.1:8769; HTTPS обеспечивает reverse proxy. В deploy/ есть обезличенные примеры nginx, systemd и необязательного Keycloak с PostgreSQL. Замените example.com, пользователя службы и пути. Compose не создаёт realm, пользователя, scopes, audience или политику регистрации OAuth-клиентов.
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python -m uvicorn zenmoney_mcp.remote:create_app --factory --host 127.0.0.1 --port 8769Переменная | Назначение |
ZENMONEY_TOKEN | API-токен ZenMoney; остаётся только на сервере |
ZENMONEY_STATE_DIR | Приватный каталог настроек |
ZENMONEY_MCP_RESOURCE | Точный публичный URL, например https://mcp.example.com/mcp |
ZENMONEY_OAUTH_ISSUER | HTTPS issuer провайдера |
ZENMONEY_OAUTH_JWKS_URL | HTTPS URL открытых ключей |
ZENMONEY_OAUTH_SUBJECT | Точное sub единственного разрешённого пользователя |
Без четырёх OAuth-переменных удалённый сервер не запустится. Токен ZenMoney и OAuth-токены клиентов — разные учётные данные; клиентам передаются только их OAuth-токены.
Порядок развёртывания на Linux:
Подготовьте DNS и сертификаты для MCP и OAuth-провайдера. Оставьте Uvicorn и Keycloak на loopback; используйте deploy/nginx.https.conf и deploy/nginx.auth.https.conf как шаблоны входящих HTTPS-маршрутов.
Установите зависимости в venv, создайте отдельного системного пользователя и приватный каталог состояния. Скопируйте deploy/server.env.template вне checkout (например, в /etc/zenmoney-mcp/server.env), задайте ZENMONEY_TOKEN и все OAuth-переменные, ограничьте чтение файла владельцем службы. Пример unit — deploy/zenmoney-mcp.service; после подстановки путей проверьте его через systemd-analyze verify.
Поднимите и настройте OAuth-провайдер. Для отдельного Keycloak можно использовать deploy/compose.yaml и предварительно создать приватный env-файл скриптом deploy/generate_env.py. Затем вручную настройте realm, пользователя, scopes, audience и регистрацию клиентов; compose выполняет только запуск служб.
После проверки issuer, JWKS и токена запустите MCP-службу, проверьте metadata и ответ 401 без токена. Только затем подключайте веб-клиенты.
Если нужен таймер Claude DCR, установите deploy/zenmoney-mcp-claude-scopes.service и .timer как user units. Предоставьте этой службе отдельный приватный Keycloak admin env-файл, доступный её пользователю, и проверьте результат первого запуска. Не храните admin-реквизиты в checkout.
Провайдер должен поддерживать Authorization Code + PKCE S256 и discovery. Сервер проверяет подпись RS256/ES256, iss, exp, sub, scope и одиночное строковое aud, точно равное ZENMONEY_MCP_RESOURCE, в каждом запросе. Разрешите клиентам оба scope — finance:read и finance:write: сервер объявляет их при первоначальном OAuth-запросе, поэтому запрет finance:write в DCR может сорвать подключение ещё до вызова записи. При наличии RFC 8707 настройте resource indicator; иначе настройте audience mapper и проверьте итоговое aud. См. руководство Keycloak по MCP.
Для ChatGPT с Keycloak используйте DCR или заранее зарегистрированного клиента: текущая документация Keycloak указывает несовместимость его экспериментального CIMD с документом ChatGPT. Ограничьте redirect URI и Trusted Hosts фактическими клиентами. Для Claude deploy/reconcile_claude_dcr_scopes.py поддерживает необязательный finance:write у строго распознанных DCR-клиентов в уже настроенном realm master; пример таймера есть в deploy/. Скрипт не создаёт пользователя и не выдаёт согласие.
Безопасная проверка маршрута:
curl -i https://mcp.example.com/.well-known/oauth-protected-resource/mcp
curl -i https://mcp.example.com/mcp
curl -i https://auth.example.com/auth/realms/master/.well-known/openid-configurationОжидаются соответственно 200 с resource и authorization_servers, 401 с WWW-Authenticate и discovery провайдера. Ответ 401 без токена подтверждает защиту маршрута, но не права пользователя.
ChatGPT Web
В ChatGPT откройте Settings → Security and login и включите Developer mode, если он доступен аккаунту.
В ChatGPT Plugins добавьте полный HTTPS URL с /mcp и проверьте обнаруженные инструменты.
Начните новый чат, выберите подключение и пройдите OAuth-вход.
Если Keycloak требует redirect URI, скопируйте точное значение из страницы подключения ChatGPT: оно зависит от поддержки issuer identification. Не используйте угаданный wildcard.
Инструкция OpenAI по подключению · Требования OpenAI к OAuth
Claude Web
Откройте Customize → Connectors → Add custom connector и укажите тот же URL с /mcp.
Выберите OAuth. С Keycloak доступны Register automatically (DCR) или заранее созданный OAuth client; CIMD используйте только после проверки совместимости вашей версии Keycloak.
Для hosted Claude зарегистрируйте callback https://claude.ai/api/mcp/auth_callback. После входа проверьте чтение; если нужен scope записи у DCR-клиента, выполните reconciler и проверьте его результат.
Инструкция Claude по коннекторам · OAuth-требования Claude
Проверка и структура
.venv/bin/python -m pip install -r requirements-dev.txt
.venv/bin/python -m pytest -qТесты используют синтетические данные; реальные токены и выгрузки не нужны.
Путь | Назначение |
zenmoney_mcp/ | MCP-инструменты, ответы, stdio/HTTP и OAuth |
scripts/zenmoney/ | Финансовая логика, валидация и ZenMoney API |
deploy/ | Обезличенные примеры сервера, nginx и Keycloak |
tests/ | Регрессионные тесты |
Никогда не добавляйте в Git config.json, .cache.json, .env, токены, реальные суммы, имена счетов и финансовые выгрузки. Перед подключением модели проверьте, какие инструменты записи и scope она получит.
Лицензия
MIT — см. LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
Query your real net worth, spending, transactions, budgets and portfolio from any MCP client.
Headless API-first double-entry accounting & bookkeeping engine. 84 MCP tools over HTTP.
- ManiloOAuthapp.manilo
Log, query, and edit expenses, budgets, and accounts in Manilo from any MCP-compatible AI assistant.
Track expenses, budgets, balances, transfers, and multi-currency reports with OAuth-secured tools.
Related MCP Servers
- AlicenseCqualityAmaintenanceopen-source personal finance app with a first-party MCP server. 91 HTTP tools (OAuth 2.1 + DCR) and 87 stdio tools cover transactions, budgets, accounts, portfolio analytics, FX conversion, loans, subscriptions, goals, importers, and rules. Users self-host with Docker + PostgreSQL or use the managed cloud8920AGPL 3.0
- FlicenseNot gradedqualityDmaintenanceExposes personal-finance tools like accounts, transactions, spending analysis, budgets, bills, reminders, portfolio, and goals via MCP, enabling any MCP client to query financial data.-
- FlicenseNot gradedqualityBmaintenanceMCP server for personal finance management. Enables natural language expense logging, budgeting, recurring charge detection, and statement import with deterministic local calculations.-
- AlicenseNot gradedqualityCmaintenanceProvides tools for managing personal finances via MCP, including accounts, transactions, debts, savings, budgets, and asset tracking, with summaries and reporting capabilities.MIT