Media Library 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., "@Media Library MCPAdd the film 'Inception' to my library"
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.
Media Library MCP
MCP-сервер и Telegram-бот для ведения личной медиатеки: фильмов, сериалов, анимации, книг и игр.
О проекте
Media Library MCP хранит записи медиатеки в SQLite и предоставляет их через Model Context Protocol. Telegram-бот принимает запрос на естественном языке, передаёт модели только актуальные схемы MCP-инструментов и возвращает её ответ пользователю.
MCP-сервер отделён от интерфейса: к одной медиатеке могут подключаться Telegram-бот и другие совместимые клиенты.
Данные хранятся в локальном SQLite-файле; Docker Compose сохраняет его в именованном volume.
Вызовы инструментов описаны строгими JSON-схемами и валидируются до работы с базой.
Логи выводятся в stdout строками JSON и не содержат текста сообщений, ключей и иных секретов.
Проверки не обращаются к Telegram или OpenAI: модель заменяется фейком, а интеграционный тест поднимает MCP-сервер только на локальном loopback-порту.
Related MCP server: Letterboxd MCP Server
Возможности
Добавление фильмов, сериалов, анимации, книг и игр.
Поиск по названию, автору/создателю и жанру с частичным совпадением.
Фильтрация по типу, статусу, жанру, году выпуска и личной оценке.
Сопоставление распространённых русских и английских названий жанров, например «фантастика» /
science fiction/sci-fi.Редактирование и удаление записей, включая очистку дублей.
Подтверждение перед добавлением записи с похожим названием.
Статистика коллекции.
Диалог с Telegram-ботом на естественном языке через OpenAI Responses API и MCP-инструменты.
Набор из 100 демо-записей для первого запуска.
Стек
Задача | Технология |
MCP-сервер | MCP Python SDK, Streamable HTTP |
Telegram-интерфейс | aiogram |
Модель и tool calling | OpenAI Responses API |
Хранилище | SQLite, SQLAlchemy async, aiosqlite |
Конфигурация | pydantic-settings |
Контейнеры | Docker, Docker Compose |
Проверки | pytest, Ruff, mypy |
Архитектура
.
├── mcp_server/
│ ├── server.py # запуск Streamable HTTP MCP-сервера
│ ├── tools.py # MCP-инструменты и их схемы
│ ├── db.py # async-репозиторий SQLite
│ ├── models.py # ORM-модель и перечисления предметной области
│ ├── schemas.py # входные и выходные Pydantic-схемы
│ ├── seed.py # 100 детерминированных демо-записей
├── telegram_bot/
│ ├── bot.py # запуск long polling
│ ├── handlers.py # Telegram-команды и текстовый диалог
│ ├── agent.py # цикл OpenAI Responses API ↔ MCP-инструменты
│ ├── mcp_client.py # Streamable HTTP MCP-клиент
│ └── config.py # конфигурация Telegram-бота
├── shared/logging.py # JSON-логирование stdout
├── tests/ # unit- и локальные HTTP-интеграционные тесты
├── docs/
│ └── manual-test-scenarios.md # сценарии ручной проверки демо-базы
├── Dockerfile.mcp # образ MCP-сервера
├── Dockerfile.bot # образ Telegram-бота
└── docker-compose.yml # совместный локальный запускБот не обращается к базе напрямую: он получает список инструментов у MCP-сервера, модель выбирает нужный из них, а клиент выполняет вызов через Streamable HTTP. Это оставляет работу с данными в одном слое и позволяет использовать MCP-сервер независимо от Telegram.
Быстрый старт
Нужны Python 3.12+, uv и Docker Desktop для варианта с контейнерами.
Скопируйте шаблон настроек:
Copy-Item .env.example .envЗаполните в .env как минимум:
TELEGRAM_BOT_TOKEN=токен_из_BotFather
ALLOWED_USER_IDS=ваш_telegram_user_id
OPENAI_API_KEY=ваш_ключ_OpenAIOPENAI_MODEL задаёт модель, а MAX_TOOL_CALLS ограничивает число MCP-вызовов для одного сообщения. Не добавляйте .env в репозиторий.
Локальный запуск без Docker
uv sync --all-extras
uv run media-mcp-serverВо втором терминале:
uv run media-library-botПо умолчанию сервер доступен по http://127.0.0.1:8000/mcp, поэтому для запуска без Docker установите в .env:
MCP_SERVER_URL=http://127.0.0.1:8000/mcpDocker Compose
docker compose up --buildCompose передаёт боту внутренний адрес http://mcp-server:8000/mcp автоматически. База медиатеки остаётся в именованном volume media_data после пересоздания контейнеров. Чтобы остановить сервисы, используйте docker compose down; эта команда не удаляет volume.
MCP-сервер публикует порт только на loopback-интерфейсе. Его endpoint готовности
http://127.0.0.1:8000/health используется Docker healthcheck; Telegram-бот
запускается только после успешной проверки MCP-сервера.
Использование Telegram-бота
После /start можно писать обычные запросы, например:
Добавь фильм «Прибытие» в планы, режиссёр Дени Вильнёв, жанр фантастика.Какие работы типа animation со статусом completed я оценил на 9 или 10?Покажи статистику моей медиатеки.Покажи завершённые фильмы жанра фантастика после 2000 года с оценкой от 8.Если при добавлении найдётся похожее название, бот покажет существующие записи.
/confirm добавит новую запись намеренно, /cancel отменит операцию. Похожесть
определяется по нормализованному названию, поэтому окончательное решение всегда
остаётся за пользователем.
Команды:
/tools— показать доступные MCP-инструменты;/reset— очистить короткую историю текущего диалога;/confirm— подтвердить добавление похожей записи;/cancel— отменить ожидающее добавление;/help— показать подсказку.
Использование MCP-сервера
Streamable HTTP endpoint: http://<host>:8000/mcp.
Ниже пример минимального клиента на Python, который выводит статистику:
import asyncio
from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client
async def main() -> None:
async with streamable_http_client("http://127.0.0.1:8000/mcp") as streams:
read_stream, write_stream, _ = streams
async with ClientSession(read_stream, write_stream) as session:
await session.initialize()
result = await session.call_tool("get_media_stats", {})
print(result.structuredContent)
asyncio.run(main())Сервер предоставляет инструменты list_media, search_media, get_media,
add_media, find_similar_media, update_media, delete_media,
update_media_status, rate_media и get_media_stats. Их актуальные входные
JSON-схемы возвращаются стандартным запросом MCP tools/list.
Для ручной проверки Telegram-бота, фильтров, защиты от дублей и healthcheck используйте сценарии тестирования.
Тестирование
uv run ruff format .
uv run ruff check . --fix
uv run mypy mcp_server telegram_bot shared
uv run pytestТесты проверяют создание и повторный seed базы, поиск с Unicode и частичным совпадением, фильтры, изменение и удаление записей, обнаружение дублей, регистрацию MCP-инструментов, отказ транспорта, лимит tool calls и цикл «модель → инструмент → итоговый ответ». Отдельный интеграционный тест поднимает локальный Streamable HTTP MCP-сервер, вызывает его настоящим MCP-клиентом и проверяет healthcheck и отказ невалидных аргументов.
GitHub Actions запускает эти проверки и собирает Docker Compose при каждом push и pull request.
Возможные улучшения
Поддержка обложек, вложений и ссылок на внешние сервисы.
Импорт и экспорт коллекции в JSON или CSV.
Полнотекстовый поиск и персональные рекомендации.
Авторизация нескольких пользователей и изоляция их коллекций.
Кэширование схем MCP-инструментов и пул долгоживущих соединений.
Наблюдаемость: метрики, трассировка и централизованное хранение логов.
Лицензия
Автор
This server cannot be deployed
Maintenance
Related MCP Connectors
Trakt MCP — TV/movie metadata + watch tracking signals
TheGamesDB MCP — wraps TheGamesDB API (thegamesdb.net), a community
OMDb MCP — IMDB-derived movie / TV / episode data (BYO key)
The media memory layer for AI agents and their humans. Your AI client gets 29 tools to search your collection, add items, update ratings, preview music, and find patterns across everything you've read, watched, and listened to.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables users to manage and control their Plex media library through natural language commands in MCP-compatible AI clients. It supports searching content, managing playlists, tracking library statistics, and monitoring live viewing sessions.MIT
- FlicenseNot gradedqualityCmaintenanceA comprehensive MCP server that enables users to interact with Letterboxd for searching films, viewing member data, and performing actions like rating or reviewing movies. It supports private data access and automated browser actions for managing watchlists, diaries, and custom lists.1-
- FlicenseAqualityDmaintenanceAn MCP server that wraps The Movie Database (TMDB) API, enabling search for movies and TV shows, retrieval of movie details, recommendations, similar movies, trending content, streaming providers, and movie discovery.8-
- AlicenseBqualityBmaintenanceEnables control and management of a self-hosted media stack (Radarr, Sonarr, Prowlarr, SABnzbd, qBittorrent) through natural language via MCP.15GPL 3.0