HSE SmartLMS and personal account
HSE University (NIU VShE) SmartLMS and personal account (lk.hse.ru) via browser SSO
Installation
Ajoutez ceci à la configuration MCP de votre client (Claude Desktop : claude_desktop_config.json ; Cursor : .cursor/mcp.json ; VS Code et les autres utilisent la même forme « mcpServers »).
hse-mcpclaude mcp add hse-smartlms-and-personal-account -e 'HSE_EMAIL=<HSE_EMAIL>' -e 'HSE_PASSWORD=<your hse_password>' -e 'HSE_ENABLE_WRITES=<HSE_ENABLE_WRITES>' -- npx -y hse-mcp@0.1.1
{
"mcpServers": {
"hse-smartlms-and-personal-account": {
"command": "npx",
"args": [
"-y",
"hse-mcp@0.1.1"
],
"env": {
"HSE_EMAIL": "<HSE_EMAIL>",
"HSE_PASSWORD": "<your hse_password>",
"HSE_ENABLE_WRITES": "<HSE_ENABLE_WRITES>"
}
}
}
}
Variables d'environnement
HSE_EMAILobligatoire HSE login (login@edu.hse.ru)HSE_PASSWORDsecret HSE password; or store it in the system keychain: npx hse-mcp credentials setHSE_ENABLE_WRITEStrue enables tools that submit data to SmartLMS and ELK (off by default)
Documentation
Tirée du README du projet sur GitHub, actualisée chaque semaine. Les liens ouvrent GitHub.
Sommaire
hse-mcp
Локальный MCP-сервер (stdio) для инфраструктуры НИУ ВШЭ: SmartLMS (edu.hse.ru) и Единый личный
кабинет (lk.hse.ru). Расписание RUZ (ruz.hse.ru) вынесено в отдельный сервер
hse-ruz-mcp (claude mcp add hse-ruz-mcp -- npx -y hse-ruz-mcp).
Дисклеймер
- Неофициальный проект: не связан с НИУ ВШЭ и не одобрен ею.
- Правила ВШЭ об автоматизированном доступе к SmartLMS и ЕЛК не проверялись; за их соблюдение отвечает пользователь.
- Использование на свой риск, без гарантий (см. лицензию).
- Тулы записи отправляют данные от вашего имени и необратимы: сдача может уйти на оценку сразу, заказ
справки отменить нельзя. По умолчанию они выключены (
HSE_ENABLE_WRITES). - Авторы не хранят и не получают ничьих учётных данных: пароль, сессия и журнал остаются на вашей машине
(подробности ниже и в
SECURITY.md).
Установка и запуск
Нужен аккаунт ВШЭ. Каждый пользователь ставит сервер у себя со своими данными.
Claude Desktop — без терминала
- Скачайте
hse-mcp-<версия>.mcpbиз последнего релиза. - Откройте файл двойным щелчком (или перетащите в окно Claude Desktop, или Настройки → Расширения → Дополнительно → Установить расширение…).
- Введите email и пароль ВШЭ и нажмите «Установить». Пароль Claude Desktop хранит в системной связке ключей и передаёт серверу при запуске.
Node.js ставить не нужно: он входит в Claude Desktop для Windows и macOS. Для входа нужен браузер:
сервер берёт Microsoft Edge (есть на любой Windows) или Google Chrome, а если их нет, при первом запросе
сам скачивает Chromium (около 100 МБ, один раз) — тогда первый запрос попросит повторить его через
пару минут. Галочка «Разрешить отправку данных» включает тулы записи (см. «Тулы записи»); по
умолчанию она выключена. Файлы для сдачи заданий кладутся в папку из настроек расширения (по умолчанию
Документы/hse-mcp-outbox, создаётся сама).
Через npx (нужен Node.js 22+)
npx -y hse-mcp credentials set # email и пароль ВШЭ → системное хранилище
claude mcp add hse-mcp -e HSE_EMAIL=login@edu.hse.ru -- npx -y hse-mcp
Для Claude Desktop, Cursor и других клиентов — в их конфигурацию MCP:
{
"mcpServers": {
"hse-mcp": {
"command": "npx",
"args": ["-y", "hse-mcp"],
"env": { "HSE_EMAIL": "login@edu.hse.ru" }
}
}
}
Пароль в этот файл не пишите: он хранится открытым текстом. npx -y hse-mcp install-browser скачивает
Chromium заранее (иначе — как выше: Edge, Chrome или скачивание при первом запросе).
Из исходников (для разработки)
Нужен Node.js 22 или новее.
npm ci
npx playwright install chromium
cp .env.example .env # заполнить HSE_EMAIL
npm run credentials:set # пароль в системное хранилище (рекомендуется)
npm run build
claude mcp add hse-mcp -- node <путь-к-проекту>/dist/index.js
HSE_PASSWORD в .env необязателен: это запасной путь, если системное хранилище недоступно (см.
«Учётные данные»). .env и storage/ в .gitignore — не коммитятся, локальны для установки и никуда
не отправляются, кроме как в сами сервисы ВШЭ при логине.
Каталог данных
Сессия браузера, ключ и журнал записей, снимки hse_changes и папка «исходящих» по умолчанию лежат в
каталоге данных:
- в клоне репозитория (есть
.git) или еслиstorage/уже есть —storage/в корне проекта; - иначе (
.mcpb, npx) —%LOCALAPPDATA%\hse-mcpна Windows,~/Library/Application Support/hse-mcpна macOS,~/.local/share/hse-mcpна Linux: папку установки хост может пересоздать при обновлении; HSE_DATA_DIRзадаёт каталог явно (абсолютный путь или относительно корня проекта).
Необязательные переменные (.env или окружение): HSE_ENABLE_WRITES=true включает тулы записи (по
умолчанию выключены; см. «Тулы записи»), HSE_OUTBOX_DIR задаёт папку «исходящих»,
HSE_BROWSER_CHANNEL — браузер: auto (по умолчанию: скачанный Chromium, затем Edge и Chrome, затем
скачивание), chromium, chrome или msedge. Проверка, что защита записи цела: npm test (ожидается
fail 0; тесты не ходят в сеть и не читают учётные данные).
Учётные данные
Пароль ищется по порядку, берётся первый найденный:
- переменная окружения процесса
HSE_PASSWORD(в том числе заданная клиентом MCP); - системное хранилище: Windows Credential Manager, macOS Keychain, Linux Secret Service (служба
hse-mcp, учётная запись — значениеHSE_EMAIL), через необязательную зависимость@napi-rs/keyring; HSE_PASSWORDв.env— запасной путь.
HSE_EMAIL не секрет и берётся из окружения или .env.
Команды:
npm run credentials:set(илиnpx hse-mcp credentials set) — спрашивает пароль без вывода на экран и пишет в системное хранилище;npm run credentials:status(npx hse-mcp credentials status) — печатает только источник пароля (env,keychain,dotenv,none), без значений и без email;npm run credentials:clear(npx hse-mcp credentials clear) — удаляет запись из хранилища.
В пакете .mcpb пароль приходит из настроек расширения через окружение (HSE_PASSWORD), системное
хранилище hse-mcp там не используется.
Если пароль взят из .env, сервер один раз пишет в stderr предупреждение (без значения); на Linux и macOS
он же предупреждает, если права .env допускают чтение группой или другими (исправление: chmod 600 .env).
На Windows права .env сервер не проверяет; ограничьте их вручную, подставив своё имя пользователя:
icacls .env /inheritance:r /grant:r "$($env:USERNAME):(F)"
Каталог данных (storage/ в клоне) и его writes/ сервер ограничивает владельцем (0o700 на POSIX, icacls с
наследованием на Windows, чтобы новые файлы сразу создавались с ограниченными правами), а файлы
hse-session.json и writes/key — 0o600 / icacls (ошибки при этом не выводятся).
Системное хранилище можно отключить целиком: HSE_DISABLE_KEYCHAIN=true (в окружении или .env) — для CI,
серверов без графической сессии и Linux без Secret Service. npm test задаёт её сам, поэтому тесты не
трогают настоящее хранилище.
Оговорки:
- Если
@napi-rs/keyringне установился (npm ci --omit=optional, нет бинарника под платформу) или хранилище недоступно, проект молча работает дальше с.env, установка не падает. - На Linux нужен запущенный Secret Service (GNOME Keyring, KWallet и т.п.; в сессии без графики часто
его нет). Без него пакет ушёл бы в хранилище ядра
keyutils, которое не переживает перезагрузку, поэтому в таком случае хранилище считается недоступным и остаётся.env. Эта проверка — синхронный вызов при старте; при заблокированной связке ключей или без D-Bus он может надолго задержать запуск, тогда задайтеHSE_DISABLE_KEYCHAIN=true. Таймаута у вызова нет. Работа на Linux не проверялась. - Защита рассчитана на случайную утечку и на чтение файлов другим пользователем системы, но не на вредоносную программу под вашим пользователем.
Если пароль или файлы каталога данных могли утечь: смените пароль ВШЭ (в .mcpb — и в настройках
расширения), удалите hse-session.json и writes/key в каталоге данных (папка outbox/ и журнал
записей — ваши данные), выполните npm run credentials:clear. Подробности и контакт для сообщений об уязвимостях — в SECURITY.md.
Для публичного репозитория включите на GitHub secret scanning и push protection (по желанию — gitleaks
в pre-commit; в зависимости проекта он не входит).
Тулы
21 тул чтения и 3 тула записи (только при HSE_ENABLE_WRITES=true). Что из этого покрыто тестами и
проверено вживую — в docs/status.md.
| Модуль | Тул | Описание |
|---|---|---|
| SmartLMS | lms_list_courses | Список курсов |
| SmartLMS | lms_get_course_materials | Элементы курса (файлы, задания, тесты и т.п.) |
| SmartLMS | lms_list_assignments | Задания курса со сроками |
| SmartLMS | lms_get_grades | Оценки по курсу: строки журнала с названием, путём категорий и оценкой; ошибка, если вёрстка журнала курса не распознана |
| SmartLMS | lms_list_messages | Входящие внутренней почты SmartLMS (переписка с преподавателями в курсах) |
| SmartLMS | lms_get_message | Полный текст письма внутренней почты SmartLMS с вложениями |
| SmartLMS | lms_open_page | Открыть произвольную страницу edu.hse.ru |
| ЕЛК | elk_get_schedule | Расписание через API ЕЛК — работает из любой сети |
| ЕЛК | elk_get_user_info | Данные аккаунта: ФИО, email, роли |
| ЕЛК | elk_get_academic_data | Академическая карточка: рейтинг, GPA, кредиты, программа, группа |
| ЕЛК | elk_search_services | Поиск по каталогу из 254+ сервисов ЕЛК (справки, заявки и т.п.) |
| ЕЛК | elk_list_requests | История поданных заявок (/claim) со статусами |
| ЕЛК | elk_get_notifications | Уведомления (колокольчик в шапке) |
| ЕЛК | elk_get_section | Раздел ЕЛК по имени: profile (страница профиля), login_history (история входов), tasks (задачи), dpo_programs (программы ДПО), antiplagiat, course_evaluation (СОП), thesis (ВКР/КР), portfolio, internships (практики), scholarship_history (повышенная стипендия) |
| ЕЛК | elk_open_page | Открыть произвольную страницу lk.hse.ru |
| Сводки | my_today | Что сегодня: занятия, дедлайны, непрочитанные письма LMS и уведомления ЕЛК, активные заявки |
| Сводки | my_week | План на 7 дней: расписание, дедлайны, экзамены, просроченные несданные работы |
| Сводки | my_deadlines | Что горит: несданные задания и тесты (в т.ч. просроченные), окна ЕЛК, экзамены за days дней |
| Изменения | hse_changes | Что изменилось с прошлого раза: дедлайны, расписание, входящее, заявки (и оценки LMS по явной просьбе); ack подтверждает полученное |
| Изменения | hse_changes_reset | Стереть локальные базы и журнал событий (confirm: true) |
| Служебное | hse_clear_cache | Сбросить кэш в памяти, чтобы следующий вызов взял свежие данные |
| SmartLMS (запись) | lms_submit_assignment | Сдать или поправить ответ на задание файлами из папки «исходящих». Только при HSE_ENABLE_WRITES=true |
| SmartLMS (запись) | lms_delete_submission | Удалить представленный ответ на задание. Только при HSE_ENABLE_WRITES=true |
| ЕЛК (запись) | elk_order_certificate | Заказать справку через форму сервиса ЕЛК (необратимо). Только при HSE_ENABLE_WRITES=true |
Тулы записи — что нужно знать
Три тула записи (lms_submit_assignment, lms_delete_submission, elk_order_certificate) отправляют
данные в SmartLMS и ЕЛК, заказ справки в ЕЛК необратим, поэтому по умолчанию тулов записи у сервера нет вообще. Чтобы
включить, добавьте в .env строку HSE_ENABLE_WRITES=true (в Claude Desktop — галочка «Разрешить
отправку данных» в настройках расширения; значение читается при старте процесса, после правки
перезапустите сервер). Остальные тулы только читают.
lms_submit_assignment—cmid(id модуля задания изlms_get_course_materials),files(имена файлов, не пути),mode:draft(по умолчанию) илиsubmit. Файлы берутся только из папки «исходящих»:outbox/в каталоге данных или папка изHSE_OUTBOX_DIR(абсолютный путь или относительно корня проекта); если папки нет, а её родитель есть, она создаётся. Не больше 10 файлов, только обычные непустые файлы; папка не может быть корнем проекта или каталогом данных (кроме егоoutbox/). Файлы не удаляются и не перемещаются. Одноимённый файл ответа перезаписывается, остальные файлы ответа остаются. Онлайн-текст не поддерживается: параметрtextотклоняется.lms_delete_submission—cmid. Удаляет ответ из системы; файлы в папке «исходящих» остаются.elk_order_certificate—serviceId(числоcomponentsизurlрезультатаelk_search_services, не полеid) иfields(подпись поля формы → точный текст варианта выпадающего списка). Сухой прогон с пустымfieldsоткроет форму и вернёт отказ со списком обязательных полей и вариантов (неподдерживаемые варианты помечены) — так узнают, что выбирать; превью иpreviewTokenвыдаются, когда все обязательные поля заданы. Значения, которые форма подставила сама из личных данных ЕЛК, показываются только в ответе сухого прогона и уйдут в заявку как есть. Заказ необратим: отмены заявки в ЕЛК нет. Заполняются только выпадающие списки; обязательное поле другого типа, которое форма не заполнила сама, и варианты вида «…в дополнительном поле» отклоняются. За раз выполняется один заказ. Исход проверяется по заявкам «Сервиса Студент» со страницы «Заявки» (вelk_list_requestsих нет):confirmed— после заказа появилась ровно одна новая заявка, её номер в ответе; иначеunknown, иnewClaims: 0не означает, что заказ не прошёл. Приunknownсверяйте вручную на странице «Заявки» в lk.hse.ru и не повторяйте заказ без этой проверки. Новый источник проверки вживую с заказом ещё не проверялся.
Как пользоваться:
- Сначала сухой прогон. Вызов без
confirmничего не отправляет: он читает страницу задания (для справки — форму) и показывает, что будет добавлено и заменено, предупреждения иpreviewToken. - Запись — тот же вызов с
confirm: trueиpreviewTokenиз сухого прогона. Токен действует 15 минут, одноразовый и привязан к заданию, режиму, файлам (по содержимому) и состоянию ответа: если что-то изменилось, нужен новый сухой прогон. - Не добавляйте тулы записи в автоматические разрешения клиента (в Claude Desktop — не выбирайте для них «Разрешать всегда»). Защита от случайной отправки держится на запросе разрешения клиента MCP перед каждым вызовом: сервер не может проверить, что человек на месте.
- Исход проверяется чтением и бывает трёх видов:
confirmed(подтверждено),rejected(система отказала, состояние не изменилось),unknown(проверить не удалось). Послеunknownне повторяйте отправку: откройте задание на сайте (для справки — страницу «Заявки» в lk.hse.ru) и посмотрите, что там на самом деле. Повторный вызов с тем жеpreviewTokenничего не отправляет: для заданий он перепроверит результат чтением, а для справки не перепроверяет, а возвращаетunknownс подсказкой сверить вручную. Новая запись по этой цели потребуетacknowledgeUnknown: true. Для заказа справкиrejectedне выносится никогда. - Сохранение может сразу отправить работу на оценку: у заданий без отдельного шага «Отправить на
оценку»
draftэтого не исключает. Шаг «Отправить на оценку» тул сам не выполняет. Просроченные и закрытые задания тул отклоняет.
Журнал записей лежит в writes/journal.json каталога данных (90 дней, не более 200 записей) и содержит только
технические поля: без содержимого, имён файлов, названий и id курсов и заданий.
Как это устроено
- SmartLMS и ЕЛК — общий Playwright-браузер (
src/auth/browser-session.ts), который проходит единый SSO ВШЭ (Keycloak,saml.hse.ru, realmhse) и переиспользует сессию между вызовами (сохраняется вhse-session.jsonкаталога данных). Браузер — скачанный Playwright Chromium, системный Edge или Chrome (src/auth/browser-launch.ts). ЕЛК даёт и JSON API сAuthorization: Bearer <access_token>из localStorage (elk_get_schedule,elk_get_user_info,elk_search_services,elk_list_requests). - istudy.hse.ru (зачётка) не поддерживается: тулы
istudy_*удалены 2026-10-23. Вход проходит без MAX, но данные закрыты двухфакторным подтверждением через MAX (HTTP 412 наGET /api/auth/two-factor/requiredпосле клика по «Зачетная книжка»), а эндпоинты после 2FA неизвестны; обход 2FA не предусмотрен. Оценки по курсам —lms_get_grades. - Сводки (
my_today/my_week/my_deadlines) — агрегируют расписание ЕЛК, календарь Moodle, окна и уведомления ЕЛК в один JSON; статус каждого источника — вsources, отказ одного не роняет сводку. Холодный вызов после запуска сервера занимает ≈ 17 с (логин и открытие страниц), затем 3–4 с, повтор из кэша — мгновенно (замеры на одном аккаунте, 2026-10-14). - Изменения (
hse_changes) — «что изменилось», а не «что есть»: тул снимает дедлайны, расписание на 14 дней, входящее (письма LMS, уведомления ЕЛК) и заявки ЕЛК, сравнивает с прошлым снимком и возвращает только события (новое, изменено, пропало, перенесено, просрочено). Базы по источникам и журнал событий лежат в локальномchanges/state.jsonкаталога данных; сброс —hse_changes_reset(полный сброс удаляет и копииstate.json.corrupt-*). Первый вызов по источнику только создаёт базу, без событий. Курсор двигается не сам, а параметромack: передайтеackSeqиз ответа в следующий вызов, иначе те же события вернутся снова (событие не теряется, даже если ответ не дошёл). Параметры:scopes(по умолчанию без оценок),courses(фильтр курсов для оценок: id или часть названия),fresh(перечитать источники, иначе принимаются данные не старше 60 с),since(журнал за период, например"7d", вместо неподтверждённого;sinceсам курсор не двигает,ackв том же вызове двигает). Оценки (scopes: ["grades"]) берутся только из журнала LMS и дорогие: страница на курс, десятки секунд. Тул только читает системы ВШЭ. Проверено вживую на одном аккаунте (спека §18); событияadded/changed/moved— только имитацией правки базы.
Границы применимости
- Селекторы и тексты Moodle (SmartLMS) и ЕЛК проверены на одном аккаунте и одном семестре; у других факультетов и курсов разметка может отличаться.
- Онлайн-текст в ответе на задание не поддерживается.
- Заданий с отдельным шагом «Отправить на оценку» и с классом статуса
submissiondraftне наблюдалось: в таких случаях тулы записи отказывают, а не угадывают. - Заказ справки проверен на форме одной справки.
- Правила ВШЭ об автоматизированном доступе к SmartLMS и ЕЛК не проверялись, пользователь отвечает за их соблюдение сам.
Известные ограничения
- Расписание в сводках — только из ЕЛК: если ЕЛК не ответил, в
my_*будет ошибка источникаelk_scheduleбез занятий (запасного пути через RUZ больше нет, RUZ — в hse-ruz-mcp и только из сети ВШЭ). - ЕЛК частично разведан вживую (2026-09-15): известны разделы
/task,/claim(теперь структурированно доступен черезelk_list_requests),/service(поиск —elk_search_services),/schedule,/student-services,/faq./student-services?section=documentsсодержит каталог заказа справок (зачётка, подтверждение обучения и т.п.) — форма разведана (Formily-конструктор поверх Element Plus); заказ идёт туломelk_order_certificate(приHSE_ENABLE_WRITES=true).elk_open_pageвозвращает сырой текст + ссылки для остальных случаев. Подробные заметки разведки хранятся у автора локально и в репозиторий не входят. hse_changes: в ответе не более 200 событий (остаток —omitted: подтвердитеackSeqи вызовите снова); журнал хранит не более 500 событий, при переполнении невыданные теряются — счётчикgap.lostEvents. События считаются только в пересечении старого и нового окон (календарь −180…+60 дней, расписание 14 дней); при усечении календаря «пропало» не вычисляется. Виды событий по областям: дедлайны — новое, изменено, пропало, просрочено; расписание — новое, изменено, пропало, перенесено; входящее — только новое; заявки и оценки — новое и изменено (без «пропало»). «Пропало из календаря» не значит «сдано». «Итого за курс» — обычный элемент оценок: смена итога видна рядом с событием самого элемента.- ЕЛК: запись только заказом справки (
elk_order_certificate,HSE_ENABLE_WRITES=true); подача заявок (практика, стипендия, мобильность и т.п.) не реализована, остальные тулы ЕЛК только читают. Заказ справки выполнен вживую один раз на одном аккаунте: заказ дошёл, но исход тула —unknown(newClaims: 0), история заявок этих справок не видит; ручная проверка на странице «Заявки» подтвердила ровно одну новую заявку. Заказ необратим; свободный текст, даты, файлы и варианты «…в дополнительном поле» не поддерживаются (тул отказывает). Поля, которые форма дорисовывает после выбора варианта, сухой прогон не видит. - Запись в SmartLMS (
HSE_ENABLE_WRITES=true): только файлами, онлайн-текст не поддерживается. У заданий без отдельного шага «Отправить на оценку» сохранение сразу отправляет работу на оценку; сам шаг «Отправить на оценку» тул не выполняет. Просроченные и закрытые задания отклоняются, даже если поздняя сдача, возможно, ещё открыта. Задания с нераспознанным классом статуса сдачи отклоняются (статус «черновик» вживую не наблюдался). Существующий файл ответа и отправляемый файл крупнее 64 МиБ не принимаются: результат нельзя проверить. Проверено на одном аккаунте за один семестр. lms_open_pageиelk_open_pageотклоняют URL с параметромsesskeyи страницы/mod/assign/с параметромaction: они читают, но не выполняют действий.
Разработка
npm run buildсобирает проект вdist/,npm run dev— в режиме watch.npm run lintпроверяет код линтером и форматтером Biome,npm run formatисправляет то, что можно исправить автоматически.npm run pack:mcpbсобирает пакет Claude Desktop вbuild/hse-mcp-<версия>.mcpb(CI делает то же и прикрепляет пакет к релизу).npm testсобирает проект и запускает тестыnode:test(test/*.test.mjs): сеть, браузер и учётные данные им не нужны. Среди них архитектурный тест: импорты должны соблюдать слои.
Как устроен код и куда добавлять новое — docs/architecture.md, правила
участия — CONTRIBUTING.md.
Лицензия
Questions fréquentes
Qu'est-ce que HSE SmartLMS and personal account ?
HSE University (NIU VShE) SmartLMS and personal account (lk.hse.ru) via browser SSO
Comment installer HSE SmartLMS and personal account ?
Il s'exécute sur votre machine. Dans Claude Code : claude mcp add hse-smartlms-and-personal-account -e 'HSE_EMAIL=<HSE_EMAIL>' -e 'HSE_PASSWORD=<your hse_password>' -e 'HSE_ENABLE_WRITES=<HSE_ENABLE_WRITES>' -- npx -y hse-mcp@0.1.1. Pour les autres clients, collez la configuration JSON de cette page dans leurs réglages MCP.
Faut-il une clé API pour HSE SmartLMS and personal account ?
Oui. Il attend HSE_EMAIL, HSE_PASSWORD, à renseigner dans sa configuration.
HSE SmartLMS and personal account est-il open source ?
Oui. Son code est sur GitHub sous licence MIT.
Qui maintient HSE SmartLMS and personal account ?
Il est publié par ihavealotofguap. AI.tn le référence sans le maintenir ni le recommander.
Issu du registre MCP officiel. Être listé n'est pas une recommandation : vérifiez le code et les permissions d'un serveur avant de lui donner accès à vos données.