HSE SmartLMS and personal account について
HSE University の学生向けに、SmartLMS と個人アカウントへブラウザー SSO でアクセスするローカル stdio MCP サーバーです。授業・アカウント情報、予定、締切、変更の要約を扱い、書き込み操作は初期状態で無効です。
主な機能
- 01SmartLMS の講義、教材、課題、成績の確認
- 02個人アカウント情報、予定、通知の取得
- 03日次・週次・締切の要約
- 04締切、予定、申請の変更追跡
- 05課題提出と証明書申請の任意実行
活用シーン
- 01講義資料、課題、成績の確認
- 02予定とアカウント通知の確認
- 03今後の締切と未提出課題の把握
- 04書き込みを有効にして課題提出や証明書申請
MCP 対応
MCP クライアントに、SmartLMS と個人アカウントの読み取りツール、要約、任意の書き込みツールを提供します。stdio 経由でローカル実行し、ブラウザー SSO を使用します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y hse-mcpHSE_EMAILHSE login ([email protected])HSE_PASSWORDシークレット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)ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
21掲載時のツール一覧 · 今日に更新
このツールにパラメーターはありません。
詳細
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 [email protected] -- npx -y hse-mcp
Для Claude Desktop, Cursor и других клиентов — в их конфигурацию MCP:
{
"mcpServers": {
"hse-mcp": {
"command": "npx",
"args": ["-y", "hse-mcp"],
"env": { "HSE_EMAIL": "[email protected]" }
}
}
}
Пароль в этот файл не пишите: он хранится открытым текстом. 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を使用します。 .envのHSE_PASSWORD(フォールバック)。
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)のみを表示し、値やメールアドレスは表示しません。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/ は、サーバーによって所有者のみに制限されます
(POSIX では 0o700、Windows では icacls と継承を使用し、新しいファイルもすぐに制限されたアクセス権で作成されます)。
また、ファイル hse-session.json と writes/key は 0o600 / icacls で制限されます(エラーは出力されません)。
システムの認証情報ストアは、完全に無効化できます。HSE_DISABLE_KEYCHAIN=true(環境または .env)を設定してください。
CI、グラフィカルセッションのないサーバー、Secret Service のない Linux に適しています。npm test はこの設定を自動で行うため、
テストで実際の認証情報ストアが使用されることはありません。
注意事項:
@napi-rs/keyringをインストールできなかった場合(npm ci --omit=optional、プラットフォーム用のバイナリがないなど)や 認証情報ストアを利用できない場合、プロジェクトは何も通知せず.envを使って動作を続けます。インストールは失敗しません。- Linux では Secret Service が起動している必要があります(GNOME Keyring、KWallet など。グラフィカル環境のないセッションでは
利用できないことがよくあります)。Secret Service がない場合、パッケージは再起動後も保持されないカーネルの
keyutils認証情報ストアを使うことになります。そのため、この場合は認証情報ストアを利用できないものとみなし、.envを使います。この確認は起動時に同期的に呼び出されます。キーリングがロックされている場合や D-Bus がない場合は、 起動が大幅に遅れることがあります。その場合はHSE_DISABLE_KEYCHAIN=trueを設定してください。この呼び出しにタイムアウトはありません。 Linux での動作は検証されていません。 - この保護は、偶発的な漏えいや、システム上の別のユーザーによるファイルの読み取りを想定したものであり、 自分のユーザー権限で動作する悪意あるプログラムへの対策ではありません。
パスワードまたはデータディレクトリ内のファイルが漏えいした可能性がある場合は、ВШЭ のパスワードを変更し
(.mcpb の場合は拡張機能の設定も変更してください)、データディレクトリ内の hse-session.json と writes/key を削除して、
npm run credentials:clear を実行してください(outbox/ フォルダーと書き込みログはお客様のデータです)。
詳細と脆弱性報告の連絡先については、SECURITY.md を参照してください。
公開リポジトリでは、GitHub の secret scanning と push protection を有効にしてください(任意で、pre-commit に gitleaks を追加できます。
プロジェクトの依存関係には含まれていません)。
Тулы
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.
Лицензия
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。