SubTrack
SubTrack — трекер подписок и регулярных платежей (MCP-сервер)
Проблема, которую он решает: почти каждый незаметно теряет деньги на подписках и регулярных платежах, о которых забыл, — пробный период стримингового сервиса, который перешел в платный, абонемент в спортзал, ежегодное продление домена, которое списывается раз в год и забывается на 11 месяцев. SubTrack позволяет LLM (Claude или любому MCP-клиенту) отслеживать все это, сообщать, что скоро будет продлеваться, и показывать общие расходы, приведенные к месячному показателю, — даже если ваши подписки списываются еженедельно, ежемесячно, ежеквартально, ежегодно или по произвольному циклу.
Что он делает
Инструмент | Назначение |
| Добавить подписку/платеж с любым циклом списания |
| Получить одну запись с вычисленной датой следующего продления |
| Список всех (или фильтр по категории), сначала ближайшие продления |
| Обновить любое поле существующей записи |
| Мягкое удаление (помечает неактивной, сохраняет историю) |
| Полное удаление |
| «Что продлевается в ближайшие N дней?» |
| Общие регулярные расходы, приведенные к месячному/годовому значению, по категориям |
Плюс ресурс subtrack://categories (редактируемый список категорий) и шаблон промпта renewal_digest_prompt, который предлагает ассистенту написать дружелюбную сводку о том, что скоро предстоит.
Самая интересная инженерная деталь — next_renewal_date(): она корректно переходит вперед по дневным циклам (еженедельным/раз в две недели/произвольным) с помощью модулярной арифметики, а по календарным циклам (ежемесячным/ежеквартальным/ежегодным) — прибавляя реальные календарные месяцы (поэтому подписка, начавшаяся 31 января, корректно попадает на 28 февраля, а не на «31 день спустя»).
Related MCP server: subscription-tracker-mcp
Почему инструменты — async def
Каждый инструмент здесь — async def, и весь доступ к SQLite идет через aiosqlite вместо стандартного sqlite3. Стоит понять почему, поскольку это частый источник путаницы:
FastMCP по умолчанию запускает обычные
def-инструменты в пуле потоков, так что синхронная версия этого сервера не заморозилась бы буквально при небольшой нагрузке.Но
async defс блокирующим драйвером (sqlite3) внутри — хуже, чем оставаться синхронным: FastMCP не выноситasync def-инструменты в потоки (они выполняются прямо в цикле событий), поэтому блокирующий вызов внутри такого инструмента остановит все остальные параллельные запросы.Итак: либо оставляйте инструменты
defи позволяйте фреймворку выносить их в потоки, либо переходите наasync defи используйте по-настоящему асинхронный драйвер на всех уровнях. Этот сервер делает второе — это более масштабируемый паттерн для удаленного сервера, который может обрабатывать параллельные вызовы инструментов от нескольких клиентов: он не расходует рабочий поток на каждый выполняющийся запрос к БД и чисто компонуется, если позже вы добавите другой ожидаемый ввод-вывод (HTTP-запросы и т.п.).Единственное исключение: чтение крошечного
categories.jsonостается обычным синхронным. Это несколько сотен байт, читаемых один раз за вызов, — делать его «асинхронным» означало бы добавлятьaiofilesбез реальной выгоды для конкурентности.
Структура проекта
subtrack-mcp/
├── server.py # the whole server — module-level `mcp` object
├── pyproject.toml # project metadata + deps (managed by uv)
├── uv.lock # locked, reproducible dependency versions
├── .python-version # pins the Python version uv uses
├── .gitignore
└── README.mdcategories.json и subscriptions.db не коммитятся — server.py создает их автоматически при первом запуске (см. init_categories() / init_db()). Если вы хотите, чтобы ваш собственный фиксированный список категорий переживал повторные деплои, удалите categories.json из .gitignore и закоммитьте отредактированную версию.
Запуск локально (uv)
Ручной шаг с созданием виртуального окружения не нужен — uv run автоматически создает и синхронизирует .venv из uv.lock при первом использовании.
Блок __main__ в server.py запускает сервер по HTTP на 0.0.0.0:8000 по умолчанию (переопределяется переменной окружения PORT) — тот же транспорт, который FastMCP Cloud использует в продакшене, поэтому локальное тестирование соответствует тому, что вы реально задеплоите:
uv run server.py
# Starting MCP server 'SubTrack' with transport 'http' on http://0.0.0.0:8000/mcpПримечание: этот блок выполняется только при прямом запуске файла. FastMCP Cloud полностью игнорирует его — он импортирует объект mcp и обслуживает его сам, поэтому ничто здесь не влияет на развернутый сервер.
Проверьте это с помощью быстрого клиентского скрипта (uv run python client_test.py):
import asyncio
from fastmcp import Client
async def main():
async with Client("http://127.0.0.1:8000/mcp") as client:
result = await client.call_tool("add_subscription", {
"name": "Netflix", "amount": 15.99, "billing_cycle": "monthly",
"start_date": "2026-08-05", "category": "Streaming", "subcategory": "Video"
})
print(result.data)
asyncio.run(main())Если вы хотите протестировать с MCP-клиентом, который ожидает stdio вместо этого (например, подключив это к Claude Desktop для локального использования), запустите его через FastMCP CLI, который переопределяет транспорт независимо от того, что находится в __main__:
uv run fastmcp run server.py:mcp --transport stdioДобавление или обновление зависимостей
Не редактируйте список зависимостей в pyproject.toml вручную — позвольте uv управлять им, чтобы uv.lock оставался синхронизированным:
uv add some-package # add a new dependency
uv add some-package --upgrade # bump one dependency
uv lock --upgrade # re-resolve everything to latest compatible versionsДеплой в FastMCP Cloud
Запушьте эту папку в GitHub-репозиторий — закоммитьте
pyproject.tomlиuv.lock(не коммитьте.venv/, он в.gitignore).Войдите на fastmcp.cloud через GitHub и создайте новый проект из репозитория.
Установите точку входа на:
server.py:mcpРазверните. FastMCP Cloud автоматически определяет зависимости из
pyproject.toml(он также понимает обычныйrequirements.txt, но здесь он вам не нужен). Вы получите URL видаhttps://<project>.fastmcp.app/mcp, который может вызывать любой MCP-клиент — включая Claude, через пользовательский коннектор.
Примечание о хранилище
Этот сервер использует SQLite на локальном диске для простоты — это отлично подходит для обучения и для развертывания с одним экземпляром. Не гарантируется, что он переживет повторный деплой на большинстве управляемых платформ (свежий деплой обычно означает свежую файловую систему). Когда логика инструментов вас устроит, естественный следующий шаг — и хорошее упражнение для дальнейшего изучения удаленных MCP-серверов — заменить sqlite3 на размещенную базу данных (Turso/libSQL, Postgres через asyncpg, Supabase и т.д.), используя переменную окружения для строки подключения, заданную в панели FastMCP Cloud (os.getenv("DATABASE_URL")).
Идеи для расширения
Добавьте
mcp.tool(), который отправляет по электронной почте или пушит дайджест, используя выводrenewal_digest_prompt.Добавьте таблицу
price_historyи инструмент для записи повышений цен с течением времени.Добавьте аутентификацию (FastMCP поддерживает аутентификацию по bearer-токену), когда будете готовы сделать сервер приватным вместо открытого.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables personal finance management through Budgetsco, supporting transaction tracking, budget management, recurring transactions, custom categories, and multi-currency support for comprehensive financial tracking.1814MIT
- AlicenseNot gradedqualityCmaintenanceAn intelligent MCP server that integrates Gmail and MySQL to track subscriptions, detect gaps, and send proactive renewal alerts (3 days in advance) to reduce costs.MIT
- AlicenseNot gradedqualityAmaintenanceTrack SaaS subscriptions, renewal dates, spending, and find duplicate services.7MIT
- FlicenseAqualityCmaintenanceAn MCP-powered AI agent that audits your Gmail for recurring subscriptions, detects silent price increases, and flags unused services.6
Related MCP Connectors
Track, analyze, and act on your streaming and SaaS subscriptions from any AI agent.
Scheduling, availability, clients, billing and CRM for appointment-based services.
Receipt tracker with no friction: receipts arrive by email and file themselves
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/4hmad69/subtrack-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server