vklass-mcp
vklass-mcp
Многопользовательский сервер Model Context Protocol только для чтения для опекунов Vklass. Каждый пользователь аутентифицирует собственную учётную запись Vklass с помощью BankID в рамках стандартного потока OAuth MCP. Каждый субъект OAuth напрямую сопоставляется с одним идентификатором пользователя Vklass; общего входа, глобального токена MCP или пароля администратора не существует.
Поверхность протокола MCP спроектирована как собственный удалённый MCP-сервер. Интеграция с Vklass по необходимости неофициальна, поскольку Vklass не публикует API для опекунов; его веб-эндпоинты могут меняться.
MCP и модель идентификации
Одна конечная точка Streamable HTTP:
/mcp.Поток авторизации OAuth 2.1 с S256 PKCE.
Метаданные сервера авторизации OAuth и метаданные защищённого ресурса RFC 9728.
Динамическая регистрация клиентов для совместимых MCP-клиентов.
Ротация access и refresh токенов, отзыв, области и индикаторы ресурсов RFC 8707.
Страница авторизации OAuth запускает поток BankID QR Göteborg Vklass.
После входа
appData.userIdиз Vklass преобразуется в стабильный локальный псевдонимный субъект OAuth с помощью ключа состояния; исходный идентификатор пользователя Vklass не хранится в грантах OAuth.Каждый субъект получает собственную сессию Vklass, кэш SQLite, задачи синхронизации и зашифрованный каталог состояния. Запросы данных никогда не могут выбрать базу данных другого субъекта.
Необработанные значения OAuth access/refresh/code хэшируются SHA-256 в SQLite. Метаданные зарегистрированных клиентов, включая секреты клиентов, шифруются ключом состояния сервера.
Когда сессия Vklass истекает, все гранты для этого субъекта Vklass отзываются, чтобы MCP-клиенты получали стандартный 401 и перезапускали поток авторизации BankID.
MCP-клиенты подключаются только к:
https://vklass.example.com/mcpСовместимый клиент обнаруживает OAuth, открывает браузер, просит пользователя одобрить BankID и сохраняет собственные токены. Разные пользователи и клиенты используют один и тот же URL, но получают разные субъекты OAuth.
Сервер использует одну область с минимальными привилегиями, vklass.read, как для кэшированных, так и для живых запросов Vklass только для чтения.
Related MCP server: jisr-mcp
Безопасность
Доступ к Vklass только для чтения. Отчёты об отсутствии, отпуска, сообщения и другие изменения не раскрываются.
Одобрение BankID всегда выполняется владельцем учётной записи в браузере.
Файлы cookie Vklass и секреты OAuth никогда не возвращаются через MCP или журналы.
Хосты форм/редиректов Göteborg SAML и BankID строго внесены в белый список.
Содержимое Vklass рассматривается как ненадёжные данные, а не как инструкции.
Контейнер работает без root или capabilities и использует read-only корневую файловую систему.
Для продакшн-режима OAuth требуется публичный HTTPS-источник. Порт контейнера привязан к loopback для TLS-обратного прокси и не должен публиковаться напрямую.
Если этот сервис предлагается другим родителям, оператор несёт ответственность за персональные данные. Предоставьте чёткие условия хранения/удаления, защищённые резервные копии, обработку инцидентов и контакт оператора. Пользователи также должны понимать, что их MCP-клиент может отправлять результаты инструментов своему провайдеру модели.
Реализованное покрытие Vklass
Функция | Поддержка |
Göteborg опекун BankID QR | Пользовательский интерфейс авторизации OAuth |
Восстановление, ротация и поддержание сессии на пользователя | Реализовано |
Дети/подопечные | Нормализовано |
Новости учителей и veckobrev | Нормализовано/доступно для поиска |
Календарь, уроки, домашние задания, тесты и задания | Нормализовано для каждого ребёнка |
Omsorgsschema, включая запланированное и фактическое время посещения | Нормализовано для каждого ребёнка |
Автоматические еженедельные отчёты | Нормализовано отдельно от учительских veckobrev |
Питание и количество уведомлений | Нормализовано |
Учебные курсы, оценки и отметки | Нормализовано для каждого ребёнка |
Обзор учёбы и отсутствий | Текстовые снимки |
Список класса | Отключено, чтобы избежать чужих детей |
Вложения новостей | Только метаданные |
Сообщения, документы, развивающие беседы | Сопоставление эндпоинтов ожидается |
Все операции записи | Отключено |
MCP-инструменты
vklass_capabilities,vklass_status,vklass_sync_nowvklass_list_childrenvklass_list_weekly_letters,vklass_get_weekly_lettervklass_list_news,vklass_get_news_articlevklass_list_calendar,vklass_list_assignments,vklass_list_care_schedulevklass_list_automatic_weekly_reportsvklass_get_meals,vklass_get_notificationsvklass_list_study_courses,vklass_get_feature_snapshot,vklass_search
Локальная разработка
Требуется Python 3.12+ и uv.
cp .env.example .env
# For localhost only:
sed -i 's#https://vklass.example.com#http://127.0.0.1:8000#' .env
sed -i 's#VKLASS_STATE_KEY_FILE=.*#VKLASS_STATE_KEY=development-state-key-change-me#' .env
uv sync --all-groups
uv run pytest
uv run vklass-mcpПодключите клиент разработки MCP к http://127.0.0.1:8000/mcp. Не используйте HTTP в локальной сети или интернете.
Podman и systemd
make build
make install-quadlet
$EDITOR ~/.config/vklass-mcp/server.env
systemctl --user start vklass-mcp.service
journalctl --user -u vklass-mcp.service -fУстановщик создаёт только один секрет Podman: vklass-mcp-state-key. Клиенты и пользователи OAuth создают свои собственные учётные данные через протокол. Версия 0.2 намеренно отказывается запускаться, если в корне данных остаются устаревшие однопользовательские файлы vklass.db* или session.json.fernet; перенесите их или безопасно удалите весь устаревший набор перед развёртыванием.
Расположение во время выполнения:
~/.config/vklass-mcp/server.env
~/.local/share/vklass-mcp/oauth.db
~/.local/share/vklass-mcp/users/<sha256-of-vklass-user-id>/
~/.config/containers/systemd/vklass-mcp.containerQuadlet привязывается к 127.0.0.1:8787. Поместите Caddy или другой TLS-обратный прокси перед ним:
vklass.example.com {
reverse_proxy 127.0.0.1:8787
}Установите оба значения VKLASS_PUBLIC_BASE_URL=https://vklass.example.com и VKLASS_ALLOWED_HOSTS=vklass.example.com,localhost:*,127.0.0.1:*. Публичный URL является издателем OAuth и не может быть изменён без повторной авторизации клиентов.
Чтобы пользовательский сервис пережил выход из системы:
loginctl enable-linger "$USER"Публичное развёртывание через edge Folksaga
deploy/folksaga/ нацелен на существующую учётную запись rootless Podman folksaga на perd.local. Он передаёт локально собранный образ, устанавливает усиленный Quadlet в частной сети folksaga, создаёт резервную копию ключа состояния и запускает сервис без публикации дополнительного порта хоста:
make build
./deploy/folksaga/deploy.shОтслеживаемая конфигурация Caddy Folksaga проксирует https://vklass.perapp.dev напрямую на vklass-mcp:8000 и получает публичный сертификат через существующие порты 80/443. DNS уже разрешает этот хост через perapp.dev. Сделайте резервные копии как /srv/folksaga/data/vklass-mcp/, так и /srv/folksaga/secrets/vklass-mcp-state-key; потеря ключа отключает всех пользователей и делает зашифрованные сессии и регистрации OAuth-клиентов нечитаемыми.
Операции
Здоровье:
GET /healthzМетаданные OAuth:
GET /.well-known/oauth-authorization-serverМетаданные защищённого ресурса:
GET /.well-known/oauth-protected-resource/mcpОтзыв OAuth:
POST /revokeSQLite и зашифрованные сессии должны резервироваться вместе с ключом состояния.
Гранты OAuth можно отозвать через
/revoke; локальное удаление данных в настоящее время является действием, поддерживаемым оператором, поэтому токен чтения MCP не может запускать деструктивное управление учётной записью.Транзакции авторизации BankID намеренно локальны для процесса; запускайте один рабочий процесс приложения.
Встроенные ограничения скорости на одноранговый узел, глобальные ограничения авторизации, одновременные слоты BankID и ограничение резидентного сервиса обеспечивают защиту. Применяйте более строгие распределённые ограничения на TLS-границе для публичного использования.
Держите ключ состояния стабильным и резервированным. Ротация требует плановой миграции зашифрованных метаданных клиентов, пользовательских сессий и псевдонимных субъектов OAuth; его прямая замена отключает пользователей.
Атрибуция
Поток Göteborg BankID адаптирован из Kaptensanders/vklass под лицензией MIT. См. THIRD_PARTY_NOTICES.md.
This server cannot be deployed
Maintenance
Related MCP Connectors
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
MCP adapter for the Paxaver school community platform. Streamable HTTP, OAuth 2.1, capability auth.
Authenticated MCP for a user's care circle: read CareEvents, list loved ones, inspect workspace.
Read-only access to InfluSense influencer discovery, ratings, watchlists, and reports via MCP.
Related MCP Servers
- FlicenseAqualityCmaintenanceEnables read-only interaction with CMU Student Information Online data, including student context, schedules, grades, enrollment, account activity, and campus life through MCP tools.8-
- AlicenseAqualityAmaintenanceEnables MCP clients to securely access Jisr's documented HR Open API read-only operations, including employees, attendance, leave, payroll, finance, and discovery tools, with role-based field policies and dual protocol support.11MIT
- FlicenseAqualityBmaintenanceProvides read-only access to Librus parent account data for multiple children, enabling retrieval of grades, attendance, timetable, calendar, homework, announcements, messages, and attachments via MCP.111-
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to securely access a guardian's SchoolSoft data—such as schedules, lunch menus, assignments, news, and subjects—using a BankID-authenticated session without exposing credentials.1MIT